Excel VBAでマクロを実行・編集していると、
突然 「ユーザー定義型が定義されていません。」 というエラーに遭遇することがあります。
このエラーは、
コードは一見正しそう
昨日まで動いていた
他人のVBAコードを貼り付けた直後に出た
といった状況で発生することが多く、
初心者だけでなく中級者でも原因が分かりづらい エラーの代表例です。
さらに厄介なのは、
エラー文から原因が想像しづらい
修正方法が1つではない
環境差・設定差で発生する
という点です。
この記事では、
VBAのコンパイルエラー
「ユーザー定義型が定義されていません。」 について、
エラーの正体
なぜ発生するのか
原因別の具体的な対処法
実務で再発させない設計の考え方
まで、コード例を交えて体系的に解説します。
目次
- ✅ 「ユーザー定義型が定義されていません。」とは何のエラーか
- ・これは「実行時エラー」ではなく「コンパイルエラー」
- ・エラーが出る典型的な表示例
- ✅ 「ユーザー定義型」とは何を指しているのか
- ・「ユーザー定義型 = Type文」だけではない
- ・VBAは「型が存在するか」を非常に厳密に見る
- ✅ 最も多い原因①:参照設定(ライブラリ)の不足
- ・他人のコードを貼り付けた直後に出るケース
- ・なぜ参照設定が必要なのか
- ・対処法:参照設定を確認・追加する
- ✅ 原因②:参照設定の「MISSING」
- ・MISSINGがあると他の型まで壊れる
- ・対処法:MISSINGを外す
- ✅ 原因③:Type文・Enum・クラスの定義位置
- ・Type定義がPublicでない
- ・対処法:Publicにする
- ✅ 原因④:クラスモジュールの存在・名前の問題
- ・クラスが存在しない/名前が違う
- ・対処法:クラスモジュール名を確認する
- ✅ 原因⑤:VBAのバージョン差・環境差
- ・64bit / 32bit の違い
- ・Officeの参照ライブラリ差
- ✅ 原因⑥:変数名と型名の衝突
- ・同名の変数を宣言している
- ・対処法:予約語・型名を変数名に使わない
- ✅ デバッグの基本手順(実務向け)
- ・チェック順のおすすめ
- ✅ 実務で再発させないための設計ポイント
- ・外部ライブラリ依存を明確にする
- ・型定義は専用モジュールに集約
- ✅ RPA(UiPath)連携時の注意点
- ✅ よくある勘違い
- ・「ユーザー定義型=Type文だけ」
- ・「コードが間違っている」
- ✅ まとめ:「ユーザー定義型が定義されていません。」の本質
✅ 「ユーザー定義型が定義されていません。」とは何のエラーか
※ここを誤解すると、延々と修正できなくなります。
・これは「実行時エラー」ではなく「コンパイルエラー」
まず重要なのは、このエラーは
コンパイルエラー だという点です。
実行してから出るのではない
コードのチェック段階で止まる
つまり、
VBAが「この型は存在しない」と判断した瞬間に出るエラーです。
・エラーが出る典型的な表示例
コンパイル エラー:
ユーザー定義型が定義されていません。
このエラーは、
特定の1行がハイライトされる
F5を押す前に出る
という特徴があります。
✅ 「ユーザー定義型」とは何を指しているのか
※名前に引っ張られると理解を誤ります。
・「ユーザー定義型 = Type文」だけではない
多くの人が勘違いしますが、
このエラーで言う 「ユーザー定義型」 とは、
Type ~ End Type で定義した型
だけを指しているわけではありません。
実際には、以下も含まれます。
Excel / VBA / Office のオブジェクト型
外部ライブラリの型
Enum
クラスモジュール
つまり、
VBAが「型として認識できないもの」すべて が対象です。
・VBAは「型が存在するか」を非常に厳密に見る
VBAでは、次のようなコードは許されません。
Dim ws As Worksheet
このとき、
VBAは Worksheet という型が定義されているか を
必ずチェックしています。
もし認識できなければ、
即このエラーが出ます。
✅ 最も多い原因①:参照設定(ライブラリ)の不足
※発生率が最も高い原因です。
・他人のコードを貼り付けた直後に出るケース
たとえば、次のような宣言があります。
Dim dic As Dictionary
このコードは、
Microsoft Scripting Runtime が参照設定されていないと
エラーになります。
・なぜ参照設定が必要なのか
Dictionary は、
VBA標準の型ではない
外部ライブラリに定義されている
ため、
参照設定がない環境では型として存在しない 扱いになります。
・対処法:参照設定を確認・追加する
VBEで以下を確認します。
「ツール」
「参照設定」
チェックが外れていないか確認
該当ライブラリにチェックを入れることで、
型が認識され、エラーは解消されます。
✅ 原因②:参照設定の「MISSING」
※見落としやすいが非常に重要です。
・MISSINGがあると他の型まで壊れる
参照設定一覧に
MISSING: ○○
と表示されている場合、
そのライブラリだけでなく
他の参照設定の解決にも影響
を及ぼすことがあります。
結果として、
Dim rs As ADODB.Recordset
のようなコードで
「ユーザー定義型が定義されていません。」 が出ます。
・対処法:MISSINGを外す
不要な MISSING はチェックを外す
必要なものは正しいライブラリを再指定
これだけで、
原因不明だったエラーが一気に解消することもあります。
✅ 原因③:Type文・Enum・クラスの定義位置
※中級者以上がよく引っかかるポイントです。
・Type定義がPublicでない
Private Type UserData
Name As String
Age As Long
End Type
このTypeを、
別モジュールで使おうとするとエラーになります。
Dim u As UserData ' ← エラー
・対処法:Publicにする
Public Type UserData
Name As String
Age As Long
End Type
型を使う範囲に応じて Public / Private を使い分ける
これが重要です。
参考:【VBA】Public constを使用してシート名・セルの値を定数に設定する方法とは
✅ 原因④:クラスモジュールの存在・名前の問題
※クラスを使っている場合は要注意です。
・クラスが存在しない/名前が違う
Dim emp As Employee
この場合、
クラスモジュール「Employee」が存在しない
名前を変更している
と、エラーになります。
・対処法:クラスモジュール名を確認する
クラス名は「オブジェクト名」ではなく
「(Name) プロパティ」
で判断されます。
✅ 原因⑤:VBAのバージョン差・環境差
※実務では避けられない問題です。
・64bit / 32bit の違い
API宣言などで、
PtrSafe がない
Long / LongPtr の違い
があると、
環境によって型エラーが出ることがあります。
・Officeの参照ライブラリ差
Excelのバージョン
Officeのインストール構成
によって、
使える型が微妙に異なる ことがあります。
✅ 原因⑥:変数名と型名の衝突
※地味ですが意外と多い原因です。
・同名の変数を宣言している
Dim Worksheet As String
このようなコードがあると、Worksheet 型が上書きされ、
他の場所でエラーになります。
・対処法:予約語・型名を変数名に使わない
Worksheet
Range
Dictionary
などは、
変数名として使わない のが安全です。
参考:【VBA】変数名の付け方|キャメルケース・スネークケースなど命名規則を徹底解説
✅ デバッグの基本手順(実務向け)
※闇雲に直さないことが重要です。
・チェック順のおすすめ
参照設定(MISSING含む)
型が標準か外部か
Public / Private
クラス・Typeの存在
名前の衝突
この順で確認すると、
ほぼ確実に原因にたどり着けます。
✅ 実務で再発させないための設計ポイント
※「直す」より「防ぐ」が重要です。
・外部ライブラリ依存を明確にする
コメントで明示
使用箇所を限定
・型定義は専用モジュールに集約
Type / Enum / クラスは、
どこに定義されているか分かる状態 にします。
✅ RPA(UiPath)連携時の注意点
※自動実行環境では特に重要です。
参照設定が引き継がれない
Office構成が違う
という理由で、
このエラーが突然出ることがあります。
環境依存の型を極力減らす設計 が重要です。
✅ よくある勘違い
※遠回りする人が非常に多いポイントです。
・「ユーザー定義型=Type文だけ」
→ 誤りです。
・「コードが間違っている」
→ 設定や環境が原因のことが多いです。
✅ まとめ:「ユーザー定義型が定義されていません。」の本質
これはコンパイルエラー
「型が認識できない」ことが原因
参照設定が最重要チェックポイント
Public / Private、名前衝突にも注意
環境差を意識した設計が再発防止につながる
このエラーを正しく理解できるようになると、
VBAは 「コピペで動かすもの」から「設計して書くもの」 に変わります。
原因を1つずつ切り分け、
落ち着いて対処できる知識 を、ぜひ身につけてください。