Excel VBAで業務を自動化していくと、必ずと言っていいほど登場するのが
CreateObject や GetObject といったオブジェクト生成・取得の処理です。
Outlook、Word、FileSystemObject、WScript.Shell など、Excel以外の機能と連携する場面では、これらの構文を避けて通ることはできません。
一方で、
- ProgIDとは何なのかがよく分からない
- CreateObjectとGetObjectの違いが曖昧
- 「とりあえず動くコード」をコピペで使っている
- 実務でどちらを選べばよいか判断できない
といった悩みを抱えている方も多いのではないでしょうか。
CreateObjectやGetObjectは、単なるVBA構文ではありません。
WindowsのCOM(Component Object Model)という仕組みを前提とした「オブジェクト生成・参照の思想」があり、それを理解しているかどうかで、VBAコードの安定性・拡張性・保守性は大きく変わります。
この記事では、Excel VBAにおける ProgIDの考え方 を軸に、
CreateObjectとGetObjectの違い、使い分け、実務での設計判断までを体系的に解説します。
単なる構文解説に留まらず、「なぜそう使うのか」「どう設計すると事故が起きにくいのか」を理解できる内容を目指します。
目次
- ✅ ProgIDとは何かを正しく理解する
- ✅ COMオブジェクトとVBAの関係
- ✅ CreateObjectとは何か
- ・基本構文
- ・Excel以外のアプリを起動する例
- ✅ GetObjectとは何か
- ・基本構文
- ・起動済みのアプリに接続する例
- ✅ CreateObjectとGetObjectの本質的な違い
- ✅ ProgIDを使った代表的な実務例
- ・FileSystemObjectを使ったファイル操作
- ・WScript.Shellを使った外部プログラム実行
- ✅ なぜCreateObjectが実務で多用されるのか
- ✅ GetObjectが向いているケース
- ✅ CreateObjectとGetObjectを組み合わせる設計
- ✅ ProgID指定時によくあるミス
- ・ProgIDの綴り間違い
- ・環境依存のProgIDを使う
- ✅ Early Bindingとの違い(補足)
- ・Late Bindingの特徴
- ✅ セキュリティとProgIDの関係
- ✅ 設計レベルで考えるCreateObject / GetObject
- ✅ RPA・業務自動化との相性
- ✅ よくある質問と誤解
- ・GetObjectは使うべきではない?
- ・CreateObjectは遅い?
- ✅ まとめ:ProgID理解がVBA外部連携の質を決める
✅ ProgIDとは何かを正しく理解する
ProgID(Programmatic Identifier)とは、
COMオブジェクトを識別するための文字列IDです。
VBAから外部オブジェクトを扱う際、Windowsは
「どのプログラムの、どのオブジェクトを生成・参照するのか」
を識別する必要があります。そのときに使われるのが ProgID です。
代表的なProgIDの例には、次のようなものがあります。
Excel.ApplicationWord.ApplicationOutlook.ApplicationScripting.FileSystemObjectWScript.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の本質的な違い
ここが最も重要なポイントです。
| 観点 | CreateObject | GetObject |
|---|---|---|
| オブジェクト生成 | 新しく作る | 既存を取得 |
| アプリ起動 | 起動する | 起動しない |
| 実行結果の安定性 | 高い | 状況依存 |
| 実務向き | ◎ | △(用途限定) |
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
この設計では、
- 起動済みのOutlookがあればそれを使う
- なければ新しく起動する
という柔軟な処理が可能になります。
✅ 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コードが書けるようになります。