VBA CreateObject 関数:オブジェクトをインスタンス化する

はじめに

Excel VBA マクロの CreateObject 関数からオブジェクトをインスタンス化する方法を紹介します。

CreateObject 関数とは、参照設定して使用できる ActiveX オブジェクトを、参照設定しないでインスタンス化します。

CreateObject("Scripting.FileSystemObject") のようにして、FileSystemObject のインスタンスを返します。

参照設定しないでオブジェクトを使用したいときに使用します。

参照設定については「参照設定する」をご覧ください。
  • 目次
    • CreateObject 関数
    • 解説
    • 使用例

CreateObject 関数

CreateObject(オブジェクト)
オブジェクトのインスタンスを作成します。

引数「オブジェクト」「アプリケーション名.クラス名」の形式で名前を指定します。
戻り値の型Object 型

解説

参照設定」していない状態でもオブジェクトをインスタンス化できます。

Dim o As Object
Set o = CreateObject("Scripting.FileSystemObject") ' インスタンス化

' オブジェクトを使った処理

Set o = Nothing ' 後始末として必ず Nothing を設定してオブジェクトを解放する
インスタンス化したオブジェクトを使い終わったら、後始末として必ず Nothing を設定します。これを忘れるとオブジェクトが解放されなくなりメモリに残り続けることになります。

引数「オブジェクト」には アプリケーション名.クラス名 の形式で名前を入力します。具体的な名前は、そのオブジェクトの名前を Web で検索すれば見つけられます。

例えば「FileSystemObject オブジェクト」のページに CreateObject("Scripting.FileSystemObject") のように記載されています。

引数「オブジェクト」に不明な名前を指定すると「エラー 429 ActiveX コンポーネントはオブジェクトを作成できません。」が発生します。

参照設定との違い

参照設定した方がパフォーマンスが良くなります。可能なら参照設定します。

CreateObject したときはオブジェクトの型が表示されないため、インテリセンスが表示されず入力ミスに注意が必要です。

CreateObject 関数を使用するメリットは、その ActiveX のバージョンの違いを考慮しなくてよくなります。その ActiveX が存在するのかチェックできます。参照設定する方法では、開発環境と実行環境でバージョンが違うとエラーになります。

使用例

オブジェクトをインスタンス化する。

Dim fso As Object
' FileSystemObject をインスタンス化する
Set fso = CreateObject("Scripting.FileSystemObject")

' FileSystemObject を使った処理
Dim b As Boolean
b = fso.FileExists("D:\test.txt")
Debug.Print(b)

Set fso = Nothing ' Nothing を代入してオブジェクトを解放

後始末

エラーをキャッチして正常なときでもエラーの時でも、Finally の処理で後始末できるようにします。

Sub 実行()
On Error GoTo Catch
    Dim o As Object
    Set o = CreateObject("Scripting.FileSystemObject")

    ' オブジェクトを使った処理

Finally:
    ' 正常なときでもエラーのときでもこの処理が実行される
    Set o = Nothing ' Nothing を代入してオブジェクトを解放
    Exit Sub

Catch:
    ' エラー処理
    GoTo Finally
End Sub

ActiveX や DLL がインストールされているか

通常は Excel をインストールすれば、必要な ActiveX もインストールされます。それ以外のオブジェクトをインスタンス化するとき、エラーが発生するかどうかで、その DLL がインストールされてるかどうかを判定できます。

Sub 実行()
    Dim o As Object
    Set o = TryCreateObject("Hoge.Hoge")

    If o Is Nothing Then
        Debug.Print("CreateObject できない")
    Else
        Debug.Print("使用できる")
    End If

    Set o = Nothing
End Sub

' CreateObject できるならそのインスタンスを、できないなら Nothing を返す
Function TryCreateObject(ByVal name As String) As Object
On Error Resume Next

    Dim o As Object
    Set o = CreateObject(name) ' CreateObject できないときは Nothing になる
    TryCreateObject = o
    
End Function