Excel VBAの「CreateObject 関数」について解説します。
CreateObject 関数とは
Excel VBA の CreateObject 関数は、ActiveXオブジェクトへの参照を作成して返します。
CreateObject 関数は、外部アプリケーションとの連携、ActiveXコンポーネントの操作やレイトバインディング(プログラムの実行時にオブジェクトの型を決定する方法)による柔軟なオブジェクト生成などの重要な役割を果たします。例えば、Excelのオブジェクトを操作したり、外部のアプリケーションを起動したりできます。
CreateObject 関数の構文や実際の使い方について具体的に解説していきたいと思います。
CreateObject 関数(Visual Basic for Applications リファレンス)
CreateObject 関数を使ったサンプルがある過去記事の一覧を別タブに表示してみる。
構文(引数と戻り値)
Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。
構文
CreareObject(class[, servername])
引数
指定項目 | 説明 |
---|---|
class | 【必須】Variant (String)型 作成するオブジェクトのアプリケーション名とクラスを (“appname.objecttype”) の形式で指定します |
servername | 【省略可能】Variant (String)型 オブジェクトを作成するネットワークサーバー名を指定します ※ 省略時はローカルコンピューターです |
戻り値とインスタンスの生成
ActiveXオブジェクトへの参照を作成して返します。
作成したオブジェクトへの参照は、以下の方法でインスタンス化して利用します。
Set ステートメントを使う(基本構文)
Setステートメントを使ってオブジェクト型変数に代入した際にインスタンスが生成されます。
Dim obj as Object
Set obj = CreateObject("appname.objecttype")
' ~~~ 処理 ~~~
obj.プロパティ = 値
obj.メソッド
' ~~~~~~~~~~~~
Set obj = Nothing ' Nothingを代入してオブジェクト開放
使用後は Set obj = Nothing で明示的に解放します。
With ステートメントを使う
With内で最初にオブジェクトのメソッドやプロパティを操作する際にインスタンスが生成されます。
一時的なオブジェクトに対しての操作を簡潔に記述したい場合に使われます。
With CreateObject("appname.objecttype")
' ~~~ 処理 ~~~
.プロパティ = 値
.メソッド
' ~~~~~~~~~~~~
End With
End With で参照が失われるため、結果的にオブジェクトも解放されます。ただし、明示的な解放ではない点に注意が必要です。
解説(使用例)
CreateObject 関数の使い方について、サンプルコードを使って解説します。
CreateObject 関数の主な使用例
CreateObject 関数の使用例を紹介します。
ファイル処理(Scripting.FileSystemObject)
Scripting.FileSystemObject を利用したファイル処理の例です。
Set fso = CreateObject(“Scripting.FileSystemObject”)
'■CreateObject関数(ファイル処理_Set使用例)
Sub CreateObject_FSO_Set()
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
'生成したFileSystemObjectのインスタンスを使った処理
Dim otf As Object
'OpenTextFileメソッドでテキストファイルを読み込む
Set otf = fso.OpenTextFile("C:\VBA_test\test.txt", 1)
MsgBox otf.ReadAll 'MsgBoxにテキストファイルの内容を表示
otf.Close 'ファイルを閉じる
Set otf = Nothing 'オブジェクト解放
Set fso = Nothing 'FSOインスタンス解放
End Sub
CreateObject 関数で作成したオブジェクトへの参照は、参照終了後はオブジェクト型変数にNothingを代入して明示的に解放します。
With CreateObject(“Scripting.FileSystemObject”)
'■CreateObject関数(ファイル処理_With使用例)
Sub CreateObject_FSO_With()
With CreateObject("Scripting.FileSystemObject")
'OpenTextFileメソッドでテキストファイルを読み込む
With .OpenTextFile("C:\VBA_test\test.txt", 1)
MsgBox .ReadAll 'MsgBoxに内容を表示
.Close 'ファイルを閉じる
End With
End With
End Sub
With ステートメントを使ってCreateObject 関数で作成したオブジェクトは、ReadAllメソッド実行時にインスタンスが生成されます。そして、ステートメントが終了する End With でオブジェクトへの参照が失われ、結果的にオブジェクトが解放されます。
明示的に Set ステートメントを使って変数宣言したり、Nothing で開放する処理をしない分簡潔な記述になります。一時的な処理を簡潔に記述したい場面で役立つと思います。
CreateObject 関数を使ったサンプルがある過去記事の一覧を別タブに表示する。
Excel操作(Excel.Application)
Excelをインスタンスで起動して、セルA1に文字列(日付)を入力する操作を行う例です。
Set xlApp = CreateObject(“Excel.Application”)
'■CreateObject関数(Excel操作_Set使用例)
Sub CreateObject_Excel_Set()
Dim xlApp As Object
Dim wb As Object
Set xlApp = CreateObject("Excel.Application")
With xlApp
.Visible = True
.Workbooks.Add
.ActiveSheet.Cells(1, 1).Value = Date
.ActiveWorkbook.SaveAs _
fileName:="C:\VBA_test\test.xlsx"
.Quit
End With
Set xlApp = Nothing 'Nothing代入でオブジェクト解放
End Sub
With CreateObject(“Excel.Application”)
'■CreateObject関数(Excel操作_With使用例)
Sub CreateObject_Excel_With()
With CreateObject("Excel.Application")
.Visible = True
.Workbooks.Add
.ActiveSheet.Cells(1, 1).Value = Date
.ActiveWorkbook.SaveAs _
fileName:="C:\VBA_test\test.xlsx"
.Quit
End With
End Sub
過去記事にもたくさんサンプルコードがありますのでよろしければご参照ください。以下は一例です。
CreateObject 関数を使ったサンプルがある過去記事の一覧を別タブに表示する。
注意点:ActiveXコントロール無効化とその影響
2025年4月より Office 2024 / Microsoft 365(Word、Excel、PowerPoint、Visio)では、セキュリティ強化の一環としてActiveXコントロールが既定で無効化されました。これにより、一部のOCXファイルやフォーム上の ActiveX UI部品が機能しなくなっています。
ActiveXオブジェクトを含むドキュメントを開くと、「このファイル内のActiveXコンテンツはブロックされています」という黄色いメッセージバーが表示された場合は ActiveXコントロールが無効になっています。その場合、新しい ActiveXオブジェクトを作成したり、既存のオブジェクトを操作したりすることはできません。
メールに添付されてきたofficeファイル文書にActiveXオブジェクトが含まれていた場合、それはすべてシステムを乗っ取るためのマルウェアだと判断してよいでしょう。メッセージでActiveX関連の設定を変更するように案内されても、安易に従ってはいけません。Microsoft は、絶対に必要な場合を除き、ActiveXコントロールを無効にしておくことを強く推奨しています。
どうしてもActiveXを有効化する必要がある場合は下記リンクを必ず参照してください。[https://support.microsoft.com/en-us/office/activex-controls-are-disabled-by-default-in-microsoft-365-and-office-2024-9cae60f8-478c-42c6-978c-eca072525d64]
ActiveXコントロールの無効化は、VBAのUI部品(フォーム上のActiveXコントロール)や一部のCOMコンポーネントの利用に影響しますが、CreateObject関数そのものは引き続き使用可能です。ただし、呼び出す対象によっては制限やエラーが発生する可能性があります。
CreateObject 関数はCOMオブジェクトのインスタンスを生成する関数です。ActiveXコントロール以外の多くのCOMライブラリ(Excel、Word、FileSystemObject など)は引き続き利用可能です。
おわりに
VBAの関数一覧はこちらからご参照ください。
VBAサンプルファイルダウンロードページのご案内
このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。
ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!
VBA の CreateObject 関数は、VBAにおける最強の外部連携手段として使える関数です。
しかし、前項の「注意点:ActiveXコントロール無効化とその影響」に記述したようにActiveX制限の到来によって「安全性」と「保守性」のバランスがより重要になっています。
VBAを活用した自動化を止めないようにするためには、代替の対処法も考えていく必要があります。ActiveX UI部品が使えなくなったのなら、制限を受けないVBAの標準フォームコントロール(ボタン、リストボックス、コンボボックスなど)に変更するなどが良いのではないでしょうか。
以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;