Excel VBAである程度のマクロを書けるようになると、
次に必ず目にするのが 「CreateObject」 という関数です。
Set obj = CreateObject("Scripting.Dictionary")
コード自体は短いにもかかわらず、
- 何をしているのか分からない
- Set が必要な理由が分からない
- New との違いが説明できない
- なぜエラーになることがあるのか分からない
といった理由で、なんとなく避けられがちな存在でもあります。
しかし実務では、CreateObject を理解しているかどうかで
VBAでできることの幅が大きく変わります。
- Dictionary を使った高速集計
- FileSystemObject を使ったファイル操作
- Outlook / Word / Internet Explorer などの外部アプリ操作
- RPAや自動化処理との連携
これらはすべて、CreateObject の理解が前提です。
この記事では、Excel VBA初心者〜中級者の方に向けて、
- CreateObject関数とは何か
- なぜ使う必要があるのか
- 基本構文と考え方
- New との違い
- よく使われる代表的なオブジェクト
- 実務で壊れない書き方・注意点
までを、入門ガイドとして体系的に解説します。
目次
- ✅ CreateObject関数とは何か
- ・CreateObjectの基本構文
- ✅ なぜCreateObjectを使う必要があるのか
- ・Excel標準オブジェクトだけでは限界がある
- ・CreateObjectは「外部の力」を借りる仕組み
- ✅ CreateObjectとSetの関係を正しく理解する
- ・なぜSetが必要なのか
- ・Setを使わないとどうなるか
- ✅ CreateObjectとNewの違い【超重要】
- ・Newを使った例
- ・CreateObjectを使った例
- ・Newの特徴
- ・CreateObjectの特徴
- ✅ CreateObjectでよく使われる代表的なオブジェクト
- ・Scripting.Dictionary(最重要)
- ・FileSystemObject(ファイル操作)
- ・Outlook.Application(メール操作)
- ・WScript.Shell(環境操作)
- ✅ CreateObjectを使った基本的な実務サンプル
- ・Dictionaryを使った重複チェック例
- ✅ CreateObject使用時のよくあるエラーと原因
- ・エラー① ActiveX コンポーネントを作成できません
- ・エラー② オブジェクト変数または With ブロック変数が設定されていません
- ✅ CreateObjectを安全に使うための実務テクニック
- ・Nothingチェックを入れる
- ・エラーハンドリングを組み合わせる
- ✅ CreateObjectはRPA・自動化と相性が良い理由
- ✅ よくある誤解と注意点
- ・CreateObjectは「難しい機能」ではない
- ・必ず Set を使う
- ・オブジェクト名は文字列
- ✅ まとめ:CreateObjectを理解するとVBAの世界が一気に広がる
✅ CreateObject関数とは何か
CreateObject関数を一言で表すと、
**「外部オブジェクトを動的に生成する関数」**です。
難しく聞こえますが、
考え方をシンプルにすると次のようになります。
Excel VBAから、Excel以外の機能や仕組みを借りてくるための入口
これが CreateObject の本質です。
・CreateObjectの基本構文
Set 変数 = CreateObject("オブジェクト名")
ここで重要なのは、
Setを使う- 文字列でオブジェクト名を指定する
という2点です。
✅ なぜCreateObjectを使う必要があるのか
VBAには、最初から使えるオブジェクト(Range、Worksheet など)があります。
それなのに、なぜ CreateObject を使う必要があるのでしょうか。
・Excel標準オブジェクトだけでは限界がある
Excel VBAだけでできることには限界があります。
- 高速なキー管理
- ファイル・フォルダの詳細操作
- メール送信
- 他Officeアプリの操作
これらは、Excel標準のオブジェクトだけでは不十分です。
・CreateObjectは「外部の力」を借りる仕組み
CreateObjectを使うことで、
- Windowsが持っている機能
- 他のアプリケーションの機能
を VBAから直接操作できるようになります。
✅ CreateObjectとSetの関係を正しく理解する
CreateObjectを使う際、必ずセットで出てくるのが Set です。
・なぜSetが必要なのか
Dim obj As Object
Set obj = CreateObject("Scripting.Dictionary")
ここで obj に代入しているのは、
- 数値
- 文字列
ではなく、オブジェクトそのものです。
VBAでは、オブジェクトを変数に代入する場合、
必ず Set を使うルールになっています。
・Setを使わないとどうなるか
obj = CreateObject("Scripting.Dictionary")
→ コンパイルエラーになります。
これは構文ミスではなく、
オブジェクト代入のルール違反です。
参考:【VBA】Setとは?オブジェクト変数の基本と参照の仕組み|初心者が必ず押さえるべき基礎文法
✅ CreateObjectとNewの違い【超重要】
CreateObjectを理解するうえで、
避けて通れないのが New との違いです。
・Newを使った例
Dim dic As New Dictionary
・CreateObjectを使った例
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
一見すると同じことをしているように見えますが、
内部の仕組みと使いどころが異なります。
・Newの特徴
- 参照設定が必要
- コンパイル時に型が決まる
- 補完が効く
向いているケース
- 小規模マクロ
- 自分専用ツール
- 環境が固定されている場合
・CreateObjectの特徴
- 参照設定が不要
- 実行時にオブジェクトを生成
- 環境差異に強い
向いているケース
- 配布用マクロ
- 複数PCで使うツール
- RPA・自動化との連携
実務では CreateObject の方が使われる場面が圧倒的に多いです。
✅ CreateObjectでよく使われる代表的なオブジェクト
ここからは、実務で使用頻度の高いオブジェクトを紹介します。
・Scripting.Dictionary(最重要)
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
できること
- キーと値をセットで管理
- 重複チェック
- 高速な集計
実務用途
- 重複データの排除
- ユニーク一覧作成
- 件数カウント
・FileSystemObject(ファイル操作)
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
できること
- ファイル存在チェック
- フォルダ操作
- ファイル名取得
実務用途
- CSV一括処理
- ログファイル操作
- 自動保存処理
参考:【VBA】Dir関数の活用法|ファイル操作を自動化する実務向け完全ガイド
・Outlook.Application(メール操作)
Dim olApp As Object
Set olApp = CreateObject("Outlook.Application")
できること
- メール作成
- 添付ファイル操作
- 自動送信
・WScript.Shell(環境操作)
Dim sh As Object
Set sh = CreateObject("WScript.Shell")
できること
- 外部プログラム実行
- 環境変数取得
参考:Excel VBAで外部プログラムを実行する:WScript.ShellのRunメソッド基本ガイド
✅ CreateObjectを使った基本的な実務サンプル
・Dictionaryを使った重複チェック例
Sub CheckDuplicate()
Dim dic As Object
Dim arr As Variant
Dim i As Long
Set dic = CreateObject("Scripting.Dictionary")
arr = Range("A2:A100").Value
For i = LBound(arr, 1) To UBound(arr, 1)
If Not dic.Exists(arr(i, 1)) Then
dic.Add arr(i, 1), 1
End If
Next i
MsgBox dic.Count
End Sub
このコードのポイント
- CreateObjectでDictionary生成
- 配列+ループで高速処理
- 参照設定不要
参考:【VBA】値だけを基準に重複削除する方法|RemoveDuplicatesとDictionary
✅ CreateObject使用時のよくあるエラーと原因
CreateObjectは便利ですが、
エラーが出たときに原因が分かりにくいという特徴もあります。
・エラー① ActiveX コンポーネントを作成できません
主な原因
- オブジェクト名のスペルミス
- 対象オブジェクトがPCに存在しない
CreateObject("Scripting.Dictionry") ' スペルミス
・エラー② オブジェクト変数または With ブロック変数が設定されていません
原因
- Set を忘れている
- CreateObjectが失敗している
✅ CreateObjectを安全に使うための実務テクニック
・Nothingチェックを入れる
If dic Is Nothing Then
MsgBox "オブジェクト生成に失敗しました"
Exit Sub
End If
・エラーハンドリングを組み合わせる
On Error Resume Next
Set dic = CreateObject("Scripting.Dictionary")
On Error GoTo 0
✅ CreateObjectはRPA・自動化と相性が良い理由
近年の実務では、
- Excel VBA
- UiPath / Power Automate
といった RPA連携 が増えています。
CreateObjectを使えば、
- 参照設定不要
- 環境依存が少ない
- 配布しやすい
という特性から、
自動化フローの部品として非常に扱いやすいです。
✅ よくある誤解と注意点
・CreateObjectは「難しい機能」ではない
→ 単なる入口であり、怖がる必要はありません
・必ず Set を使う
→ これを忘れるとすべてが崩れます
・オブジェクト名は文字列
→ 補完が効かないためスペル注意
✅ まとめ:CreateObjectを理解するとVBAの世界が一気に広がる
- CreateObjectは外部オブジェクトを生成する関数
- Setとセットで使う
- Newとの違いを理解することが重要
- Dictionary・FSOは実務必須
- 参照設定不要で配布向き
- RPA・自動化と非常に相性が良い
CreateObjectを正しく理解すると、
Excel VBAは 単なるマクロ作成ツールから、業務自動化ツールへ進化します。
最初は難しく感じるかもしれませんが、
一度仕組みが分かれば、
「なぜ今まで使っていなかったのか」と感じるはずです。
ぜひこの記事をきっかけに、
CreateObjectを使った実務マクロへ一歩踏み出してみてください。