VBA CreateObject関数

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
コンパイル時に型チェックでき、コード補完あり。
参照設定が必要。
遅延バインディング:CreateObjectDim obj As Object
Set obj = CreateObject("Excel.Application")
実行時にオブジェクト生成。
参照設定不要で配布時の互換性が高い。
コード補完なし。

早期バインディングの利点

  • 実行速度が速い
  • コードの補完機能(IntelliSense)が使えるので開発しやすい
  • コンパイル時にエラーを検出しやすい

遅延バインディングの利点

  • 参照設定が不要なのでコードの移植性が高い
  • バージョン違いのCOMオブジェクトに対して柔軟に対応できる

CreateObjectの動作の流れ

  1. ProgIDを指定してCOMサーバーを起動(または既存インスタンスを探す)
  2. COMオブジェクトのインスタンスをメモリ上に生成
  3. そのオブジェクトへの参照をVBAの変数に格納
  4. 生成されたオブジェクトのメソッドやプロパティを操作可能になる

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の注意点

  1. エラー処理は必須
    指定したProgIDのCOMオブジェクトが存在しなかったり、アプリケーションがインストールされていないと実行時エラーになります。 On Error Resume Next Set obj = CreateObject("存在しない.オブジェクト") If obj Is Nothing Then MsgBox "オブジェクト生成に失敗しました。" Exit Sub End If On Error GoTo 0
  2. メモリ管理
    作成したCOMオブジェクトは、使い終わったら明示的にSet obj = Nothingで解放するとメモリリークを防げます。
  3. 遅延バインディングゆえの不便さ
    コード補完(IntelliSense)が使えないため、メソッドやプロパティの名前は正確に記述する必要があります。
  4. バージョン互換性問題
    例えばOfficeのバージョン違いにより、同じProgIDでも一部仕様が変わっている場合があります。遅延バインディングはこの点で柔軟に対応できます。

CreateObjectとGetObjectの違い

関数動作内容用途例
CreateObject指定したCOMオブジェクトの新規インスタンスを生成新しくExcelやWordアプリを起動する場合など
GetObject既に起動しているCOMオブジェクトに接続(取得)すでに起動済みのExcelブックに接続する場合など

CreateObjectで使うオブジェクトの種類

オブジェクト名用途例
Excel.ApplicationExcelの操作
Word.ApplicationWordの操作
Scripting.FileSystemObjectファイル・フォルダ操作
WScript.Shellシステムコマンドや環境変数操作
InternetExplorer.ApplicationInternet Explorerの自動操作
Outlook.ApplicationOutlookのメール作成・送信
ADODB.Connectionデータベース接続
Shell.ApplicationWindowsシェルの操作

まとめ

  • CreateObjectはVBAから外部のCOMオブジェクトを生成し、操作するための重要な関数。
  • 遅延バインディングで動的にオブジェクトを扱うため、配布や環境差異に強いコードが書ける。
  • しかしエラー処理やメモリ解放を自分で管理する必要があり、コード補完が効かない点に注意。
  • 代表的な使い方はExcel、Word、Outlookの自動操作やファイル操作、Webブラウザの制御など多岐にわたる。
タイトルとURLをコピーしました