VBAテクニック集 VBA一覧 その他の知識 プロパティ・メソッド解説

【VBA】Excel VBAでのProgID活用法:CreateObjectとGetObject

Excel VBAで業務を自動化していくと、必ずと言っていいほど登場するのが
CreateObjectGetObject といったオブジェクト生成・取得の処理です。
Outlook、Word、FileSystemObject、WScript.Shell など、Excel以外の機能と連携する場面では、これらの構文を避けて通ることはできません。

一方で、

  • ProgIDとは何なのかがよく分からない
  • CreateObjectとGetObjectの違いが曖昧
  • 「とりあえず動くコード」をコピペで使っている
  • 実務でどちらを選べばよいか判断できない

といった悩みを抱えている方も多いのではないでしょうか。

CreateObjectやGetObjectは、単なるVBA構文ではありません。
WindowsのCOM(Component Object Model)という仕組みを前提とした「オブジェクト生成・参照の思想」があり、それを理解しているかどうかで、VBAコードの安定性・拡張性・保守性は大きく変わります。

この記事では、Excel VBAにおける ProgIDの考え方 を軸に、
CreateObjectとGetObjectの違い、使い分け、実務での設計判断までを体系的に解説します。
単なる構文解説に留まらず、「なぜそう使うのか」「どう設計すると事故が起きにくいのか」を理解できる内容を目指します。

✅ ProgIDとは何かを正しく理解する

ProgID(Programmatic Identifier)とは、
COMオブジェクトを識別するための文字列IDです。

VBAから外部オブジェクトを扱う際、Windowsは
「どのプログラムの、どのオブジェクトを生成・参照するのか」
を識別する必要があります。そのときに使われるのが ProgID です。

代表的なProgIDの例には、次のようなものがあります。

  • Excel.Application
  • Word.Application
  • Outlook.Application
  • Scripting.FileSystemObject
  • WScript.Shell

これらはすべて、Windowsに登録されたCOMオブジェクトを指しています。

重要なのは、ProgIDは
VBA独自のものではなく、Windows全体で共通の仕組み
だという点です。


✅ COMオブジェクトとVBAの関係

COM(Component Object Model)は、
異なるアプリケーション同士がオブジェクトを通じて連携するための仕組みです。

Excel VBAは、このCOMの仕組みを利用して、

  • 他のOfficeアプリケーションを操作する
  • OS機能にアクセスする
  • 外部プログラムと連携する

といった処理を実現しています。

CreateObjectやGetObjectは、
COMオブジェクトをVBAから扱うための入口
だと考えると理解しやすくなります。


✅ CreateObjectとは何か

CreateObjectは、
指定したProgIDのオブジェクトを新しく生成する
ための関数です。

・基本構文

Set obj = CreateObject("ProgID")

この1行で、VBAはWindowsに対して
「このProgIDのオブジェクトを新しく作ってください」
と要求します。

・Excel以外のアプリを起動する例

Dim appWord As Object
Set appWord = CreateObject("Word.Application")
appWord.Visible = True

このコードでは、Wordが新しく起動され、VBAから操作できる状態になります。


✅ GetObjectとは何か

GetObjectは、
すでに存在しているオブジェクトを取得(参照)する
ための関数です。

・基本構文

Set obj = GetObject(, "ProgID")

GetObjectは「新規作成」ではなく、
既存のインスタンスを探して接続する
という点が最大の特徴です。

・起動済みのアプリに接続する例

Dim appExcel As Object
Set appExcel = GetObject(, "Excel.Application")

この場合、すでに起動しているExcelアプリケーションを取得します。


✅ CreateObjectとGetObjectの本質的な違い

ここが最も重要なポイントです。

観点CreateObjectGetObject
オブジェクト生成新しく作る既存を取得
アプリ起動起動する起動しない
実行結果の安定性高い状況依存
実務向き△(用途限定)

CreateObjectは「常に同じ状態から始められる」のに対し、
GetObjectは「すでに動いているものに依存する」ため、挙動が不安定になりやすいという特徴があります。


✅ ProgIDを使った代表的な実務例

・FileSystemObjectを使ったファイル操作

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

このProgIDは、
ファイル・フォルダ操作を行うための定番オブジェクトです。

・WScript.Shellを使った外部プログラム実行

Dim sh As Object
Set sh = CreateObject("WScript.Shell")

このオブジェクトを通じて、batファイルやexeを実行できます。


✅ なぜCreateObjectが実務で多用されるのか

CreateObjectが実務で好まれる理由は明確です。

  • 必ず新しいインスタンスを生成できる
  • 状態に依存しない
  • 再現性が高い

業務自動化では、
「昨日は動いたが今日は動かない」
という状況を極力避ける必要があります。

その点で、CreateObjectは
安全側に倒した選択肢
と言えます。


✅ GetObjectが向いているケース

一方で、GetObjectが適している場面もあります。

  • 既存のExcelブックを操作したい
  • ユーザーが開いているアプリに対して処理を行いたい
  • 二重起動を避けたい

たとえば、Outlookの起動状態を前提に処理を行う場合などです。

ただし、その場合も
「存在しなかった場合の処理」
を必ず考慮する必要があります。


✅ CreateObjectとGetObjectを組み合わせる設計

実務では、次のようなパターンがよく使われます。

Dim appOutlook As Object

On Error Resume Next
Set appOutlook = GetObject(, "Outlook.Application")
On Error GoTo 0

If appOutlook Is Nothing Then
    Set appOutlook = CreateObject("Outlook.Application")
End If

この設計では、

  1. 起動済みのOutlookがあればそれを使う
  2. なければ新しく起動する

という柔軟な処理が可能になります。


✅ ProgID指定時によくあるミス

・ProgIDの綴り間違い

ProgIDは文字列指定のため、
1文字でも違うとエラーになります。

・環境依存のProgIDを使う

Officeのバージョン差や、
32bit / 64bit 環境による違いには注意が必要です。


✅ Early Bindingとの違い(補足)

CreateObjectやGetObjectは Late Binding と呼ばれる手法です。
これに対して、参照設定を行って変数宣言する方法を Early Binding と言います。

・Late Bindingの特徴

  • 参照設定が不要
  • 配布しやすい
  • 補完が効かない

実務では、
配布前提ならLate Binding(CreateObject)
が選ばれることが多いです。


✅ セキュリティとProgIDの関係

ProgIDを使った外部連携は、
セキュリティリスクも伴います。

  • 意図しないプログラム実行
  • 権限不足によるエラー

そのため、

  • 実行対象を固定する
  • ユーザー入力を直接ProgIDに使わない

といった配慮が必要です。


✅ 設計レベルで考えるCreateObject / GetObject

CreateObjectとGetObjectの選択は、
「好み」ではなく「設計判断」です。

  • 再現性を重視するなら CreateObject
  • 状態を引き継ぐなら GetObject

この判断軸を持つだけで、
VBAコードの品質は一段上がります。

参考:【VBA】Excel VBAのCreateObject関数についての入門ガイド


✅ RPA・業務自動化との相性

CreateObjectを使った設計は、

  • RPA
  • バッチ処理
  • スケジュール実行

との相性が非常に良いです。

「必ず同じ状態から始められる」
という特性は、自動化では大きな武器になります。


✅ よくある質問と誤解

・GetObjectは使うべきではない?

いいえ。用途を限定すれば有効です。

・CreateObjectは遅い?

通常の業務レベルでは問題になりません。


 

✅ まとめ:ProgID理解がVBA外部連携の質を決める

  • ProgIDはCOMオブジェクトの識別子
  • CreateObjectは新規生成
  • GetObjectは既存参照
  • 実務ではCreateObjectが基本
  • GetObjectは用途限定で使う

Excel VBAで外部連携を行ううえで、
ProgIDとオブジェクト生成の考え方を理解することは必須です。

構文だけを覚えるのではなく、
「なぜその書き方を選ぶのか」を理解すれば、
より安全で拡張性の高いVBAコードが書けるようになります。

    -VBAテクニック集, VBA一覧, その他の知識, プロパティ・メソッド解説