VBAコンパイルエラー「ユーザー定義型は定義されていません」の全原因と解決法
Webサイトや参考書から便利なVBAのコードをコピーしてきて、いざマクロを実行しようとした瞬間に、「コンパイルエラー: ユーザー定義型は定義されていません」というダイアログが表示されて処理が止まってしまった経験はないでしょうか。
VBAの学習中や、他の人が作成したマクロを自分のパソコンで動かそうとした際に、必ずと言っていいほど直面する非常に有名なエラーです。
このエラーメッセージは、初心者にとっては「何が定義されていないのか分からない」と混乱を招きがちですが、原因の大半は「外部の便利な機能(ライブラリ)を使うための『参照設定』という準備がパソコン側でできていないこと」にあります。
本記事では、このエラーが発生する根本的な原因から、VBE(Visual Basic Editor)での「参照設定」の正しい直し方、どの機能を使う時にどのライブラリにチェックを入れるべきかの早見表、さらには参照設定を不要にするプロのテクニック「遅延バインディング(Late Binding)」へのコード書き換え方法まで、4000文字以上のボリュームで体系的に徹底解説します。この記事を読めば、今後このエラーで手が止まることは一切なくなります。
目次
- 1. 「ユーザー定義型は定義されていません」とは何か?
- 2. 原因1:外部ライブラリの「参照設定」が抜けている(発生率90%)
- 3. 【保存版】よく使う機能と必要な参照設定ライブラリ早見表
- 4. 参照設定の正しい追加手順(直し方)
- 5. 原因2:参照設定が「参照不可(MISSING)」になっている
- 6. 【究極の解決策】参照設定を不要にする「遅延バインディング」への書き換え
- 7. 原因3:自作クラスやType(構造体)のコピー漏れ・スペルミス
- 8. よくある質問(FAQ)
- 9. まとめと解決チェックリスト
1. 「ユーザー定義型は定義されていません」とは何か?
このエラーは、マクロを実行する直前の「コンパイル(コードの解析・翻訳)」の段階で発生します。VBAがコードを上から下へと読み込んでいく際、変数の宣言部分(Dim ○○ As ×× の「××」の部分)を見て、「指定された『型(××)』がVBAの辞書に載っていないため、どのようなデータとして扱えばいいか分からない」と悲鳴を上げている状態です。
例えば、文字列を扱う String や、数値を扱う Long、あるいはExcelのシートを扱う Worksheet といった型は、Excel VBAが最初から知っている標準の型なのでエラーになりません。
しかし、以下のような外部機能を利用する型を宣言した時に、VBAは「そんな型は知らない」と判断し、エラーを出します。
Option Explicit
Sub TestMacro()
' ここで「ユーザー定義型は定義されていません」というエラーになる
Dim fso As FileSystemObject
Dim dic As Dictionary
Dim olApp As Outlook.Application
' ...処理...
End Sub
エラーが発生した際、ダイアログの「OK」を押すと、VBEの画面で原因となっている変数の宣言部分(上記の FileSystemObject など)が青くハイライトされます。ここが「VBAが理解できなかった未知の型」です。
2. 原因1:外部ライブラリの「参照設定」が抜けている(発生率90%)
このエラーの最も多く、かつ代表的な原因が「参照設定のチェック漏れ」です。
Excel VBAは、起動を早くしてメモリを節約するために、最初からすべての機能を読み込んでいるわけではありません。ファイル操作を高度に行う機能、Outlookでメールを送る機能、データベース(SQL)と通信する機能などは、「外部のオブジェクトライブラリ(辞書のようなもの)」として切り離されています。
これらの外部機能を使うには、VBAに対して「今からこの辞書を使うから準備しておいてね」と指示を出す必要があります。この準備作業が「参照設定」です。
Webサイトで「便利なマクロのコード」を見つけてコピーした場合、コード自体は完璧でも、あなたのパソコン(のExcel)側でそのコードを解読するための「辞書(参照設定)」がセットされていないため、「ユーザー定義型は定義されていません」というエラーになってしまうのです。
3. 【保存版】よく使う機能と必要な参照設定ライブラリ早見表
青くハイライトされた未知の型(キーワード)ごとに、追加すべき参照設定(ライブラリ名)は決まっています。実務で頻出するものを一覧表にまとめました。
| ハイライトされる型(変数定義) | 使う機能の目的 | 追加すべき「参照設定」の名称 |
|---|---|---|
FileSystemObjectTextStreamDictionary | 高度なファイル・フォルダ操作、テキストの読み書き、連想配列 | Microsoft Scripting Runtime |
Outlook.ApplicationMailItem | Outlookを操作してメールを自動送信・取得する | Microsoft Outlook XX.X Object Library ※XX.Xはバージョン番号 |
Word.ApplicationDocument | Wordを操作して文書を自動作成する | Microsoft Word XX.X Object Library |
ADODB.ConnectionADODB.Recordset | SQL ServerやAccessなどのデータベースと通信する | Microsoft ActiveX Data Objects X.X Library ※最新の6.1などを選択 |
RegExpMatchCollection | 正規表現を使って複雑な文字列の検索や抽出を行う | Microsoft VBScript Regular Expressions 5.5 |
XMLHTTP60DOMDocument | WebAPIと通信する、スクレイピングを行う | Microsoft XML, v6.0 |
4. 参照設定の正しい追加手順(直し方)
必要なライブラリが分かったら、実際にVBEの画面で参照設定を追加してエラーを解消しましょう。手順は以下の通りです。
- エラーダイアログが出ている場合は、まず「OK」を押します。
- VBEの画面上部にある「■(リセット)」ボタン(四角い停止マーク)をクリックして、マクロの実行状態を完全にリセット(停止)します。
※マクロが実行中・デバッグ中の状態だと、次のステップの「参照設定」メニューがグレーアウトして押せません。 - VBEのメニューバーから「ツール(T)」をクリックし、「参照設定(R)…」を選択します。
- 「参照設定 – VBAProject」というダイアログボックスが開きます。「参照可能なライブラリ ファイル」という一覧がアルファベット順(最初はチェックが入っているものが上部に集まっています)で並んでいます。
- リストを下へスクロールし、先ほどの早見表で見つけたライブラリ(例:
Microsoft Scripting Runtime)を探します。 - 見つけたら、ライブラリ名の左側にある「チェックボックス(四角)」をクリックしてチェックマーク(レ)を入れます。
※名前の文字の上をクリックして青く反転させただけでは追加されません。必ず四角のチェックボックスをクリックしてください。 - ダイアログ右上の「OK」をクリックして閉じます。
これで辞書が読み込まれました。再度マクロを実行してみてください。「ユーザー定義型は定義されていません」というエラーが消え、正常に動作するはずです。
5. 原因2:参照設定が「参照不可(MISSING)」になっている
自分で作ったマクロが、ある日突然エラーになったり、社内の他の人から受け取ったファイルでだけエラーになったりする場合、「参照不可(MISSING)」という現象が起きています。
これは、作成者のパソコンと、実行しようとしているパソコンの間で「Officeのバージョンが違う(Excel 2016で作ったものをExcel 2021で開いた等)」、あるいは「OSの環境(32bitと64bit)が違う」ことによって、VBAが「以前使っていたバージョンの辞書が見つからない」と迷子になっている状態です。
「参照不可」の直し方
- VBEのメニューから「ツール」>「参照設定」を開きます。
- リストの一番上に「参照不可: Microsoft Outlook 16.0 Object Library」(または MISSING: ~)のように、先頭に「参照不可」と書かれた項目があり、チェックが入っているはずです。
- この「参照不可」になっている項目のチェックを外します。
- リストを下へスクロールし、現在のパソコン環境にインストールされている同系統のライブラリ(例:Microsoft Outlook 16.0 の代わりに、自分のPCに入っている Microsoft Outlook 15.0 など)を探し、チェックを入れ直します。
- 「OK」をクリックして設定を保存します。
6. 【究極の解決策】参照設定を不要にする「遅延バインディング」への書き換え
前述の「参照不可(バージョン違い)」のエラーは、社内に様々なバージョンのExcelが混在している環境では致命的な問題になります。誰かにマクロを配布するたびに「ツールから参照設定を開いて直してね」とお願いするのは非現実的です。
そこで、プロのVBA開発者は外部ライブラリを使用する際、あえて参照設定のチェックボックスを使わずに、「遅延バインディング(Late Binding)」という書き方を採用します。
事前バインディング(参照設定あり)と遅延バインディング(参照設定なし)の違い
これまでの「参照設定を行う方法」は事前バインディング(Early Binding)と呼ばれます。型を明確に宣言するため、入力中にコードの自動補完(インテリセンス)が効くという開発時の大きなメリットがあります。
一方、遅延バインディングは、変数の型をすべて「Object」として宣言し、実行時に CreateObject 関数を使ってシステムから無理やり辞書を呼び出す手法です。この書き方に変更すれば、ユーザー側のパソコンで「参照設定」にチェックを入れる作業が一切不要になり、バージョン違いのエラーも防ぐことができます。
書き換えの具体例(FileSystemObjectの場合)
【変更前:参照設定が必要なコード】
Sub TestEarlyBinding()
' ※Microsoft Scripting Runtimeの参照設定が必要
Dim fso As FileSystemObject
Set fso = New FileSystemObject
MsgBox fso.FileExists("C:\Data\test.txt")
Set fso = Nothing
End Sub
【変更後:参照設定が不要なコード(遅延バインディング)】
Sub TestLateBinding()
' ※参照設定は一切不要
Dim fso As Object ' 型を「Object」に変更する
Set fso = CreateObject("Scripting.FileSystemObject") ' CreateObjectで生成する
MsgBox fso.FileExists("C:\Data\test.txt")
Set fso = Nothing
End Sub
書き換えの具体例(Dictionaryの場合)
Sub DictionaryLateBinding()
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
dic.Add "Apple", 100
MsgBox dic.Item("Apple")
Set dic = Nothing
End Sub
開発時のベストプラクティス:
遅延バインディングの唯一のデメリットは「コード入力中の自動補完(プロパティやメソッドの候補表示)が出なくなること」です。そのため、プログラミング(開発中)は参照設定を入れて事前バインディングでサクサクとコードを書き、完成して他の人に配布する直前に、型をObjectにしてCreateObjectに書き換え、参照設定のチェックを外すという手法が最も効率的です。
7. 原因3:自作クラスやType(構造体)のコピー漏れ・スペルミス
エラーの原因が外部ライブラリではないケースもあります。それが「自作のクラスモジュール」や「ユーザー定義型(Type)」の指定ミスです。
① 別モジュールのコードをコピーし忘れている
Webサイトで公開されている高度なマクロは、「標準モジュール」のコードだけでなく、「クラスモジュール」という別の部品を組み合わせて作られていることがあります。標準モジュールのコードだけをコピーして実行しようとすると、存在しないクラス名を宣言したことになり「ユーザー定義型は定義されていません」となります。
【対処法】 参考にしたWebサイトをもう一度よく読み、「クラスモジュールを挿入して以下のコードを貼り付けてください」といった指示を見落としていないか確認してください。
② Type(構造体)のスコープ(適用範囲)の問題
VBAでは、複数の変数をまとめる Type ステートメントを使うことができます。しかし、別のモジュールで宣言されたTypeを使用しようとしてエラーになるケースがあります。
' === Module1 ===
' Privateで宣言されていると、他のモジュールからは見えない
Private Type Employee
Name As String
Age As Long
End Type
' === Module2 ===
Sub TestType()
' ここで「ユーザー定義型は定義されていません」エラーになる
Dim emp As Employee
End Sub
【対処法】 他のモジュールからも利用したいType宣言は、Private Type ではなく Public Type に変更してください。
8. よくある質問(FAQ)
Q1. 参照設定の画面を開こうとすると「システムレジストリの読み込みに失敗しました」というエラーが出ます。
このエラーは、Windowsのレジストリが破損しているか、複数バージョンのOfficeを無理に共存させている、あるいはユーザーアカウント制御(UAC)や権限の問題で発生することがあります。Excelを「管理者として実行」して開いてみるか、Windowsの設定から「Microsoft 365(Office)のオンライン修復」を実行してシステムファイルを修復してください。
Q2. Mac版のExcelでも参照設定は同じように行えますか?
Mac版のExcel VBAでも「ツール」>「参照設定」のメニューは存在しますが、Windows版で使える強力なライブラリ(FileSystemObjectやOutlook Object Library、ActiveX Data Objectsなど)の多くはWindowsのOS(DLLファイル)に依存しているため、Mac版のリストには存在せず使用できません。Mac環境向けにはMac専用の関数(AppleScriptTaskなど)で書き換える必要があります。
Q3. コピーしたコードのどのライブラリが必要なのか分かりません。
エラーで青くハイライトされたキーワード(例:XMLHTTP や RegExp)をGoogle等でそのまま検索してください。「VBA XMLHTTP 参照設定」と検索すれば、すぐに「Microsoft XML, v6.0」が必要であるという情報が得られます。本記事の早見表もご活用ください。
9. まとめと解決チェックリスト
「コンパイルエラー: ユーザー定義型は定義されていません」は、VBAが「未知のキーワード(型)に遭遇して解読を放棄した状態」です。パニックになる必要はなく、原因の9割は設定のチェック漏れにすぎません。
エラーに遭遇した際は、以下のチェックリストを順番に確認してください。
- エラーダイアログの「OK」を押し、青くハイライトされた単語(型)を確認する。
- VBEの「■リセット」ボタンを押し、マクロの実行を完全に停止する。
- 「ツール」>「参照設定」を開き、ハイライトされた型に対応するライブラリ(Microsoft Scripting Runtimeなど)のチェックボックスにチェックを入れる。
- もし「参照不可(MISSING)」と表示されている項目があれば、そのチェックを外し、自分の環境に合った同名のライブラリにチェックを入れ直す。
- 複数の人にファイルを配布する場合は、参照設定のトラブルを防ぐために、型を
ObjectにしCreateObjectを用いる「遅延バインディング」へのコード書き換えを検討する。 - 自作クラスやTypeを使用している場合は、スペルミスやモジュール間の
Public / Privateの適用範囲を確認する。
このエラーは、初心者から中級者へステップアップする際に誰もが通る道です。参照設定の仕組みと遅延バインディングの使い分けを理解すれば、高度な外部ライブラリを自在に操り、VBAでできる業務自動化の幅が劇的に広がります。ぜひ本記事を参考に、エラーを克服して快適なマクロ開発を進めてください。