CreateObject
は、VBA(Visual Basic for Applications)で外部のCOM(Component Object Model)オブジェクトのインスタンスを生成するための関数です。
ExcelやWordのようなMicrosoft Office製品だけでなく、Windowsのシステムコンポーネントやサードパーティ製のCOMライブラリなど、さまざまなオブジェクトをプログラム内で利用する際に使います。
COMオブジェクトとVBAの関係
まず理解しておきたいのは、VBAはCOM技術を利用して他のアプリケーションや機能を操作する仕組みを持っているという点です。
- COM(Component Object Model)とは、Windows環境で動作するソフト同士が相互に操作可能になるための技術仕様です。
- COMオブジェクトは「プログラムの部品」や「機能単位」であり、VBAからこれらを生成し操作することで、多彩な処理が可能になります。
CreateObjectの基本的な構文
Set オブジェクト変数 = CreateObject("プロバイダー.オブジェクト名")
- 戻り値はオブジェクト型(
Object
)。 - 「プロバイダー.オブジェクト名」はCOMオブジェクトの識別名(ProgID)と呼ばれ、Windowsのレジストリに登録されている文字列です。
具体例で理解するCreateObject
Excelのアプリケーションオブジェクトを生成
Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
xlApp.Workbooks.Add
"Excel.Application"
はExcelアプリのCOMオブジェクトを表します。xlApp
がExcelアプリケーションの「インスタンス」になります。
Wordのアプリケーションオブジェクトを生成
Dim wdApp As Object
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True
wdApp.Documents.Add
ファイルやフォルダを操作するFileSystemObjectを生成
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists("C:\test.txt") Then
MsgBox "ファイルが存在します。"
End If
CreateObjectとNewの違い
VBAでオブジェクトを生成する方法は主に2つあります。
方法 | 使い方 | 特徴 |
---|---|---|
早期バインディング:New キーワード | Dim obj As Excel.Application Set obj = New Excel.Application | コンパイル時に型チェックでき、コード補完あり。 参照設定が必要。 |
遅延バインディング:CreateObject | Dim obj As Object Set obj = CreateObject("Excel.Application") | 実行時にオブジェクト生成。 参照設定不要で配布時の互換性が高い。 コード補完なし。 |
早期バインディングの利点
- 実行速度が速い
- コードの補完機能(IntelliSense)が使えるので開発しやすい
- コンパイル時にエラーを検出しやすい
遅延バインディングの利点
- 参照設定が不要なのでコードの移植性が高い
- バージョン違いのCOMオブジェクトに対して柔軟に対応できる
CreateObjectの動作の流れ
- ProgIDを指定してCOMサーバーを起動(または既存インスタンスを探す)
- COMオブジェクトのインスタンスをメモリ上に生成
- そのオブジェクトへの参照をVBAの変数に格納
- 生成されたオブジェクトのメソッドやプロパティを操作可能になる
ProgIDとは?
ProgIDはCOMオブジェクトを識別する文字列です。
例:
"Excel.Application"
"Word.Application"
"Scripting.FileSystemObject"
"WScript.Shell"
"InternetExplorer.Application"
これらはWindowsのレジストリに登録されており、CreateObject
はこの文字列から該当のCOMサーバーを起動します。
実際の使用例と解説
Internet Explorerを自動操作する例
Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "https://www.example.com"
Do While ie.Busy Or ie.ReadyState <> 4
DoEvents
Loop
MsgBox ie.Document.Title
ie.Quit
Set ie = Nothing
- Internet Explorerを起動し、指定URLを開き、ページタイトルを取得して表示する処理。
- IEを終了後、オブジェクトを解放している。
Outlookでメールを送る例
Dim olApp As Object
Dim olMail As Object
Set olApp = CreateObject("Outlook.Application")
Set olMail = olApp.CreateItem(0) ' 0 = olMailItem
With olMail
.To = "test@example.com"
.Subject = "テストメール"
.Body = "これはVBAから送信したテストメールです。"
.Send
End With
- Outlookを起動し、新しいメールを作成して送信する例。
CreateObjectの注意点
- エラー処理は必須
指定したProgIDのCOMオブジェクトが存在しなかったり、アプリケーションがインストールされていないと実行時エラーになります。On Error Resume Next Set obj = CreateObject("存在しない.オブジェクト") If obj Is Nothing Then MsgBox "オブジェクト生成に失敗しました。" Exit Sub End If On Error GoTo 0
- メモリ管理
作成したCOMオブジェクトは、使い終わったら明示的にSet obj = Nothing
で解放するとメモリリークを防げます。 - 遅延バインディングゆえの不便さ
コード補完(IntelliSense)が使えないため、メソッドやプロパティの名前は正確に記述する必要があります。 - バージョン互換性問題
例えばOfficeのバージョン違いにより、同じProgIDでも一部仕様が変わっている場合があります。遅延バインディングはこの点で柔軟に対応できます。
CreateObjectとGetObjectの違い
関数 | 動作内容 | 用途例 |
---|---|---|
CreateObject | 指定したCOMオブジェクトの新規インスタンスを生成 | 新しくExcelやWordアプリを起動する場合など |
GetObject | 既に起動しているCOMオブジェクトに接続(取得) | すでに起動済みのExcelブックに接続する場合など |
CreateObjectで使うオブジェクトの種類
オブジェクト名 | 用途例 |
---|---|
Excel.Application | Excelの操作 |
Word.Application | Wordの操作 |
Scripting.FileSystemObject | ファイル・フォルダ操作 |
WScript.Shell | システムコマンドや環境変数操作 |
InternetExplorer.Application | Internet Explorerの自動操作 |
Outlook.Application | Outlookのメール作成・送信 |
ADODB.Connection | データベース接続 |
Shell.Application | Windowsシェルの操作 |
まとめ
- CreateObjectはVBAから外部のCOMオブジェクトを生成し、操作するための重要な関数。
- 遅延バインディングで動的にオブジェクトを扱うため、配布や環境差異に強いコードが書ける。
- しかしエラー処理やメモリ解放を自分で管理する必要があり、コード補完が効かない点に注意。
- 代表的な使い方はExcel、Word、Outlookの自動操作やファイル操作、Webブラウザの制御など多岐にわたる。