GetObject関数
GetObject関数は、VBA関数の中でWindows・その他の関数に分類される関数です。
目次
GetObject関数とは
GetObject関数は、ファイルから取得した ActiveX オブジェクトへの参照を返します。
構文 | GetObject([pathname] [, class]) | |
---|---|---|
引数 | 省略 | 説明 |
pathname | ● | バリアント型 (内部処理形式 String の Variant) の値を指定します。取得するオブジェクトが含まれているファイルの絶対パスとファイル名を指定します。pathname を省略する場合は、class を必ず指定する必要があります。 |
class | ● | バリアント型 (内部処理形式 String の Variant) の値を指定します。オブジェクトのクラスを表す文字列を指定します。 |
引数objecttype
定数 | 省略 | 説明 |
---|---|---|
appname | × | バリアント型 (内部処理形式 String の Variant) の値を指定します。オブジェクトを提供するアプリケーションの名前を指定します。 |
objecttype | × | × |
ファイルから取得した ActiveX オブジェクトにアクセスし、取得したオブジェクトへの参照をオブジェクト変数に代入するには、GetObject 関数を使います。GetObject 関数で取得したオブジェクトをオブジェクト変数に代入するには、Set ステートメントを使います。次に例を示します。
Dim CADObject As Object
Set CADObject = GetObject("C:\CAD\SCHEMA.CAD")
このコードを実行すると、引数 pathname に指定したファイルに関連付けられているアプリケーションが起動されて、指定したファイル内のオブジェクトがアクティブになります。
引数 pathname に長さ 0 の文字列 ("") を指定すると、GetObject 関数は、指定した種類の新しいオブジェクト インスタンスを返します。引数 pathname を省略すると、GetObject 関数は、指定した種類で現在アクティブになっているオブジェクトを返します。指定した種類のオブジェクトが存在しない場合は、エラーが発生します。
ファイルの一部をアクティブにできるアプリケーションもあります。ファイルの一部をアクティブにするには、ファイル名の後に感嘆符 (!) を付け、アクティブにする部分を表す文字列をその後に指定します。この文字列の指定方法に関する詳細については、そのオブジェクトを作成するアプリケーションのマニュアルを参照してください。
たとえば、描画アプリケーションでは、1 つのファイルに格納されている描画が、複数の階層に分かれていることがあります。その場合、次のように記述すると、SCHEMA.CAD という描画ファイル内の 1 つの階層をアクティブにできます。
Set LayerObject = GetObject("C:\CAD\SCHEMA.CAD!Layer3")
引数 class でオブジェクトのクラスを指定しない場合、オートメーションが、指定したファイル名に基づいて、起動するアプリケーションおよびアクティブにするオブジェクトを決めます。ただし、ファイルによっては、複数のオブジェクトのクラスがサポートされています。たとえば、ある描画アプリケーションでは、3 つの異なる種類のオブジェクト、Application オブジェクト、Drawing オブジェクト、および Toolbar オブジェクトがサポートされていて、どのオブジェクトも同じファイル内にあるものと仮定します。このような場合、ファイル内でアクティブにするオブジェクトを指定するには、省略可能な引数 class を使います。次に例を示します。
Dim MyObject As Object
Set MyObject = GetObject("C:\DRAWINGS\SAMPLE.DRW", "FIGMENT.DRAWING")
この例では、FIGMENT は描画アプリケーションの名前で、DRAWING は FIGMENT がサポートしているオブジェクトの種類の 1 つです。
オブジェクトがアクティブになれば、定義したオブジェクト変数を使って、そのオブジェクトを参照できます。上の例の場合、オブジェクト変数 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関数のサンプルコード
次の例では、GetObject 関数を使って、Microsoft Excel の特定の Worksheet オブジェクト (MyXL) への参照を取得した後、そのワークシートの Application プロパティを使って、Microsoft Excel の表示や終了などを行います。Sub プロシージャ DetectExcel では、2 つの API 呼び出しを使って Microsoft Excel を調べます。Microsoft Excel が起動中の場合は、それを起動中オブジェクト テーブルに登録します。Microsoft Excel が起動されていないと、最初の GetObject 関数の呼び出しでエラーが発生します。エラーが発生した場合、この例では、ExcelWasNotRunning フラグに真 (True) を設定します。2 回目の GetObject 関数の呼び出しでは、開くファイルを指定しています。この GetObject 関数の呼び出しでは、Microsoft Excel が起動されていない場合は起動して、指定したファイル (mytest.xls) が示すワークシートへの参照が返されます。指定したファイルは、指定した場合に存在していなければなりません。指定した場合にない場合は、Visual Basic の オートメーション エラーが発生します。次に、Microsoft Excel と指定したワークシートが含まれるウィンドウが表示されます。最後に、このコードを実行する前に Microsoft Excel が起動されていなかった場合は、Application オブジェクトの Quit メソッドで Microsoft Excel を終了させます。既に Microsoft Excel が起動されていた場合は、終了させません。参照自体は、Nothing を代入することにより解放します。
' 必要な API ルーチンを宣言します。
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
' Microsoft Excel への参照を格納する変数を宣言します。
Dim ExcelWasNotRunning As Boolean
' Microsoft Excel が起動されていたかどうかを示すフラグを宣言します。
' Microsoft Excel が既に起動されているかどうかを調べます。
On Error Resume Next ' エラーのトラップを留保します。
' 第 1 引数を指定せずに GetObject 関数を呼び出すと、
' アプリケーションのインスタンスへの参照が返されます。
' アプリケーションが起動されていないと、エラーが発生します。
Set MyXL = Getobject(, "Excel.Application")
If Err.Number <> 0 Then ExcelWasNotRunning = True
Err.Clear ' エラーが発生した場合は Err オブジェクトをクリアします。
' Excel の起動を調べます。
' Excel が起動中の場合は、起動中オブジェクト テーブルに登録します。
DetectExcel
' 表示対象のファイルへの参照をオブジェクト変数に代入します。
Set MyXL = Getobject("c:\vb4\MYTEST.XLS")
' Application プロパティを使って、Microsoft Excel を表示します。
' さらに、オブジェクト変数 MyXL の Windows コレクションを使って、
' 指定したワークシートが含まれる実際のウィンドウを表示します。
MyXL.Application.Visible = True
MyXL.Parent.Windows(1).Visible = True
' ワークシートに対して行う処理を以下に記述します。
' ...
' 現在起動中の Microsoft Excel が、このコードの実行開始前には
' 起動されていなかった場合は、Application プロパティの
' Quit メソッドを使って、Microsoft Excel を終了します。
' Microsoft Excel を終了しようとすると、Microsoft Excel の
' タイトル バーが点滅して、開かれているファイルを保存するかどうかを
' 確認するメッセージが表示されます。
If ExcelWasNotRunning = True Then
MyXL.Application.Quit
End IF
' Microsoft Excel およびスプレッドシートへの参照を解放します。
Set MyXL = Nothing
End Sub
Sub DetectExcel()
' プロシージャが起動中の Excel を見つけると、それを登録します。
Const WM_USER = 1024
Dim hWnd As Long
' Excel が起動中の場合、この API 呼び出しからはハンドルが返ります。
hWnd = FindWindow("XLMAIN", 0)
If hWnd = 0 Then ' 0 は、Excel が起動していないことを示します。
Exit Sub
Else
' Excel は起動中なので、API の SendMessage 関数を使って、
' 起動中オブジェクト テーブルに登録します。
SendMessage hWnd, WM_USER + 18, 0, 0
End If
End Sub
実行結果
解説
Windows・その他の関数一覧
関数名 | 内容 |
---|---|
Command | 起動時に指定されたコマンドラインの引数を返します。 |
CreateObject | ActiveXオブジェクトへの参照を作成して返します。 |
DoEvents | VBAからWindowsにイベントの処理を依頼します。 |
Environ | OSの環境変数に割り当てられた名前を返します。 |
Environ$ | 指定した数番目の環境変数を返します。 |
GetAllSettings | アプリケーションの項目からすべてのキー設定に対応する値リストを返します。 |
GetObject | ファイルから取得したActiveXオブジェクトへの参照を返します。 |
GetSetting | アプリケーションの項目からキー設定値を返します。 |
IMEStatus | MS-IME(日本語入力システム)の現在の状態を返します。 |
QBColor | 指定した番号に対応するRGBコードを返します。 |
RGB | RGBの値を色で指定します。 |
Shell | 指定したプログラムを実行します。 |