更新日:、 作成日:
VBA CreateObject 関数:オブジェクトをインスタンス化する
はじめに
Excel VBA マクロの CreateObject 関数からオブジェクトをインスタンス化する方法を紹介します。
CreateObject 関数とは、参照設定して使用できる ActiveX オブジェクトを、参照設定しないでインスタンス化します。
CreateObject("Scripting.FileSystemObject") のようにして、FileSystemObject のインスタンスを返します。
参照設定しないでオブジェクトを使用したいときに使用します。
CreateObject 関数の引数と戻り値
CreateObject(オブジェクト)
オブジェクトのインスタンスを作成します。
引数「オブジェクト」 | 「アプリケーション名.クラス名」の形式で名前を指定します。 |
戻り値の型 | Object 型 |
解説
「参照設定」していない状態でもオブジェクトをインスタンス化できます。
Dim o As Object
Set o = CreateObject("Scripting.FileSystemObject") ' インスタンス化
' オブジェクトを使った処理
Set o = Nothing ' 後始末として必ず Nothing を設定してオブジェクトを解放する
引数「オブジェクト」には アプリケーション名.クラス名 の形式で名前を入力します。具体的な名前は、そのオブジェクトの名前を Web で検索すれば見つけられます。
例えば「FileSystemObject オブジェクト」のページに CreateObject("Scripting.FileSystemObject") のように記載されています。
引数「オブジェクト」に不明な名前を指定すると「エラー 429 ActiveX コンポーネントはオブジェクトを作成できません。」が発生します。
参照設定との違い
参照設定した方がパフォーマンスが良くなります。可能なら参照設定します。
CreateObject したときはオブジェクトの型が表示されないため、インテリセンスが表示されず入力ミスに注意が必要です。
CreateObject 関数を使用するメリットは、その ActiveX のバージョンの違いを考慮しなくてよくなります。その ActiveX が存在するのかチェックできます。参照設定する方法では、開発環境と実行環境でバージョンが違うとエラーになります。
スポンサーリンク
使用例
CreateObject 関数の使用例を紹介します。
オブジェクトをインスタンス化する
オブジェクトをインスタンス化します。
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