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起動時に指定されたコマンドラインの引数を返します。
CreateObjectActiveXオブジェクトへの参照を作成して返します。
DoEventsVBAからWindowsにイベントの処理を依頼します。
EnvironOSの環境変数に割り当てられた名前を返します。
Environ$指定した数番目の環境変数を返します。
GetAllSettingsアプリケーションの項目からすべてのキー設定に対応する値リストを返します。
GetObjectファイルから取得したActiveXオブジェクトへの参照を返します。
GetSettingアプリケーションの項目からキー設定値を返します。
IMEStatusMS-IME(日本語入力システム)の現在の状態を返します。
QBColor指定した番号に対応するRGBコードを返します。
RGBRGBの値を色で指定します。
Shell指定したプログラムを実行します。
ExcelのVBAについてのQ&A掲示板

↑ExcelのVBA全般について分からない事があればこちらの掲示板よりご質問ください^^

VBAのInternetExplorer操作入門

↑ExcelのVBAをマスターできたら、エクセルVBAのIE(InternetExplorer)操作にも挑戦してみてください^^

VBAのIE制御入門RSS

RSSフィードを登録すると最新記事を受け取ることができます。

VBAIE操作のスカイプレッスン

エクセルVBAのステートメント

こちらでは、エクセルVBAの事例で利用したステートメントをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのオブジェクト

こちらでは、エクセルVBAの事例で利用したオブジェクトをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのプロパティ

こちらでは、エクセルVBAの事例で利用したオブジェクトのプロパティをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのメソッド

こちらでは、エクセルVBAの事例で利用したオブジェクトのメソッドをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。

エクセルVBAのイベント

こちらでは、エクセルVBAの事例で利用したオブジェクトのイベントをまとめたものです。ExcelのVBAには様々な機能が用意されていますので一度ご確認ください。