GetObject 関数

ActiveX コンポーネントから提供されたオブジェクトの参照を返します。

構文

GetObject([ pathname ], [ class ])

GetObject 関数の構文に使用される名前付き引数は次のとおりです。

指定項目 説明
pathname 省略可能。Variant (String)。 取得するオブジェクトを含むファイルの完全パスと名前。 pathname を省略する場合は、class を指定する必要があります。
class 省略可能。Variant (String)。 オブジェクトの クラスを表す文字列。

クラス引数は、構文 appname を使用します。objecttype と には、次の部分があります。

指定項目 説明
appname 必須。Variant (String)。 オブジェクトを提供するアプリケーションの名前。
objecttype 必須。Variant (String)。 作成するオブジェクトの型またはクラス。

解説

GetObject 関数は、ファイルから ActiveX オブジェクトにアクセスして、そのオブジェクトをオブジェクト変数に割り当てるために使用されます。 GetObject で返されたオブジェクトをオブジェクト変数に割り当てるには、Set ステートメントを使用します。 次に例を示します。

Dim CADObject As Object
Set CADObject = GetObject("C:\CAD\SCHEMA.CAD")

このコードを実行すると、指定した pathname に関連付けられたアプリケーションが起動され、指定したファイル内のオブジェクトがアクティブ化されます。

pathname が長さ 0 の文字列 ("") である場合、GetObject は、指定した型の新しいオブジェクト インスタンスを戻します。 pathname 引数を省略した場合、GetObject は、指定した型の現在アクティブなオブジェクトを返します。 指定した型のオブジェクトが存在しない場合は、エラーが発生します。

一部のアプリケーションでは、ファイルの一部をアクティブ化することができます。 ファイル名の末尾に感嘆符 (!) を付け、アクティブ化するファイルの部分を識別する文字列を続けます。 この文字列の作成方法については、オブジェクトを作成したアプリケーションのドキュメントを参照してください。

たとえば、描画アプリケーションでは、図面の複数のレイヤーがファイルに保存されている場合があります。 次のコードを使用して、SCHEMA.CAD という図面内のレイヤーをアクティブ化することができます。

Set LayerObject = GetObject("C:\CAD\SCHEMA.CAD!Layer3")

オブジェクトの class を指定しない場合、起動するアプリケーションとアクティブ化するオブジェクトは、指定したファイル名に基づいて自動的に決定されます。 ただし、一部のファイルは複数のクラスのオブジェクトをサポートしている場合があります。 たとえば、1 つの図面が 3 つの異なる型のオブジェクト (Application オブジェクト、Drawing オブジェクト、Toolbar オブジェクト) をサポートし、すべてが同じファイルに含まれている場合があります。 ファイル内のアクティブ化するオブジェクトを指定するには、省略可能な class 引数を使用します。 次に例を示します。

Dim MyObject As Object
Set MyObject = GetObject("C:\DRAWINGS\SAMPLE.DRW", "FIGMENT.DRAWING")

この例で、FIGMENT は描画アプリケーションの名前で、DRAWING は、サポートされるオブジェクトの型のいずれかです。 オブジェクトがアクティブ化されたら、定義したオブジェクト変数を使用して、コード内でオブジェクトを参照します。 前の例では、オブジェクト変数 MyObject を使用して、新しいオブジェクトのプロパティメソッドにアクセスします。 例:

MyObject.Line 9, 90
MyObject.InsertText 9, 100, "Hello, world."
MyObject.SaveAs "C:\DRAWINGS\SAMPLE.DRW"

注:

GetObject 関数は、オブジェクトの現在のインスタンスがある場合、または既にファイルが読み込まれた状態でオブジェクトを作成する場合に使用します。 現在のインスタンスがなく、ファイルが読み込まれた状態でオブジェクトを起動しない場合は、CreateObject 関数を使用します。

オブジェクトが単一インスタンスのオブジェクトとして登録されている場合は、CreateObject を何回実行しても、そのオブジェクトのインスタンスは 1 つしか作成されません。 単一インスタンスのオブジェクトの場合、長さ 0 の文字列 ("") 構文で呼び出されると、GetObject は常に同じインスタンスを返します。また、pathname 引数が省略された場合、エラーが発生します。 GetObject を使用して、Visual Basic で作成されたクラスに対する参照を取得することはできません。

次の例では、GetObject 関数を使用して特定の Microsoft Excel ワークシート (MyXL) に対する参照を取得します。 ワークシートの Application プロパティを使用して、Excel の表示や終了などの操作を行います。

2 つの API 呼び出しをDetectExcel使用して、Sub プロシージャは Microsoft Excel を検索し、実行中の場合は、実行中のオブジェクト テーブルに入力します。

Microsoft Excel がまだ実行されていない場合、GetObject の 1 回目の呼び出しによってエラーが発生します。 この例では、このエラーによって ExcelWasNotRunning フラグが True に設定されます。

GetObject の 2 回目の呼び出しでは、開くファイルを指定します。 Microsoft Excel がまだ実行されていない場合は、2 回目の呼び出しで起動され、指定したファイル (mytest.xls) が示すワークシートに対する参照を返します。 ファイルは指定した場所に存在する必要があります。存在しない場合、Visual Basic エラーの Automation error が生成されます。

このコード例では、次に、指定したワークシートを含む Microsoft Excel とウィンドウの両方が表示されるようになります。 最後に、以前のバージョンの Microsoft Excel が実行中ではない場合、このコードでは Application オブジェクトの Quit メソッドを使用して Microsoft Excel を終了します。 アプリケーションが既に実行中の場合、アプリケーションを閉じる処理は試行されません。 参照自体は、Nothing に設定することで解放されます。

' Declare necessary API routines:
Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName as String, _
                    ByVal lpWindowName As Long) As Long

Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hWnd as Long,ByVal wMsg as Long, _
                    ByVal wParam as Long, _
                    ByVal lParam As Long) As Long

Sub GetExcel()
    Dim MyXL As Object    ' Variable to hold reference
                                ' to Microsoft Excel.
    Dim ExcelWasNotRunning As Boolean    ' Flag for final release.

' Test to see if there is a copy of Microsoft Excel already running.
    On Error Resume Next    ' Defer error trapping.
' Getobject function called without the first argument returns a 
' reference to an instance of the application. If the application isn't
' running, an error occurs.
    Set MyXL = Getobject(, "Excel.Application")
    If Err.Number <> 0 Then ExcelWasNotRunning = True
    Err.Clear    ' Clear Err object in case error occurred.

' Check for Microsoft Excel. If Microsoft Excel is running,
' enter it into the Running Object table.
    DetectExcel

' Set the object variable to reference the file you want to see.
    Set MyXL = Getobject("c:\vb4\MYTEST.XLS")

' Show Microsoft Excel through its Application property. Then
' show the actual window containing the file using the Windows
' collection of the MyXL object reference.
    MyXL.Application.Visible = True
    MyXL.Parent.Windows(1).Visible = True
     Do manipulations of your  file here.
    ' ...
' If this copy of Microsoft Excel was not running when you
' started, close it using the Application property's Quit method.
' Note that when you try to quit Microsoft Excel, the
' title bar blinks and a message is displayed asking if you
' want to save any loaded files.
    If ExcelWasNotRunning = True Then 
        MyXL.Application.Quit
    End IF

    Set MyXL = Nothing    ' Release reference to the
                                ' application and spreadsheet.
End Sub

Sub DetectExcel()
' Procedure dectects a running Excel and registers it.
    Const WM_USER = 1024
    Dim hWnd As Long
' If Excel is running this API call returns its handle.
    hWnd = FindWindow("XLMAIN", 0)
    If hWnd = 0 Then    ' 0 means Excel not running.
        Exit Sub
    Else                
    ' Excel is running so use the SendMessage API 
    ' function to enter it in the Running Object Table.
        SendMessage hWnd, WM_USER + 18, 0, 0
    End If
End Sub

関連項目

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。