Excel VBAでコードを書いていると、
突然次のエラーが表示されることがあります。
コンパイル エラー
ユーザー定義型は定義されていません。
このエラーは、
- コード自体は正しそうに見える
- エラー文から原因が直感的に分からない
- 環境が変わると突然出る
といった特徴があり、
VBA初心者〜中級者が最もつまずきやすいコンパイルエラーの1つです。
特に厄介なのは、
- 原因が1つではない
- 「ユーザー定義型」という言葉が誤解を招く
- 修正方法がケースによってまったく異なる
という点です。
この記事では、
「ユーザー定義型は定義されていません。」エラーを3つの代表パターンに分解し、
- それぞれの発生原因
- なぜこのエラーになるのか
- 正しい対処方法
- 実務で再発させないための考え方
を、コード例を交えながら体系的に解説します。
目次
- ✅ 「ユーザー定義型は定義されていません。」とは何のエラーか
- ・これは「実行時エラー」ではなく「コンパイルエラー」
- ・VBAは「型」を非常に厳密にチェックしている
- ✅ 「ユーザー定義型」という言葉に騙されない
- ・Type文で定義した型だけを指しているわけではない
- ✅ パターン①:参照設定(ライブラリ)が不足・壊れている
- ・典型例:Dictionary や Recordset が使えない
- ・なぜ参照設定が必要なのか
- ・対処法:参照設定を確認する
- ・注意:MISSING があると他も壊れる
- ・実務での再発防止ポイント
- ✅ パターン②:Type / Enum / クラスのスコープ・定義位置の問題
- ・Type が Private になっている
- ・なぜこのエラーになるのか
- ・対処法:Public にする
- ・Enum / クラスモジュールでも同じ
- ・クラス名は「(Name) プロパティ」を見る
- ✅ パターン③:型名と変数名・予約語の衝突
- ・型名と同じ変数名を使っている
- ・なぜこんなことが起きるのか
- ・対処法:予約語・型名を変数名に使わない
- ✅ 3パターンを見分けるためのチェック手順
- ・おすすめ確認順
- ✅ 実務で再発させないための設計ポイント
- ・型定義は専用モジュールにまとめる
- ・外部ライブラリ依存を減らす
- ✅ RPA(UiPath)連携時の注意点
- ✅ よくある勘違い
- ・「コードの書き方が悪い」
- ・「Type文を直せばいい」
- ✅ まとめ:3パターンで整理すると一気に分かる
✅ 「ユーザー定義型は定義されていません。」とは何のエラーか
※ここを誤解すると、対処が迷走します。
・これは「実行時エラー」ではなく「コンパイルエラー」
まず大前提として、
このエラーは コンパイルエラー です。
- マクロを実行する前に出る
- F5を押した瞬間に止まる
- 構文チェック段階で発生する
つまり、
VBAが「この型は存在しない」と判断した時点で出るエラーです。
・VBAは「型」を非常に厳密にチェックしている
VBAでは、次のような宣言が行われた瞬間に、
Dim ws As Worksheet
- Worksheet という型が
- 現在の環境・設定で
- 正しく定義されているか
をチェックします。
このチェックに失敗すると、
即座に
「ユーザー定義型は定義されていません。」
というエラーになります。
✅ 「ユーザー定義型」という言葉に騙されない
※ここが最大の勘違いポイントです。
・Type文で定義した型だけを指しているわけではない
多くの人が、
ユーザー定義型 = Type ~ End Type
だと思いがちですが、
それは一部でしかありません。
このエラーが指す「型」には、次が含まれます。
- Type 文で定義した型
- クラスモジュール
- Enum
- Excel / Office オブジェクト型
- 外部ライブラリの型
つまり、
VBAが「型として認識できないもの」すべて が対象です。
✅ パターン①:参照設定(ライブラリ)が不足・壊れている
※発生率No.1の原因です。
・典型例:Dictionary や Recordset が使えない
次のようなコードを書いた瞬間に、
エラーが出たことはないでしょうか。
Dim dic As Dictionary
Dim rs As ADODB.Recordset
コード自体は正しくても、
参照設定がされていない環境では型が存在しない ため、
このエラーが発生します。
・なぜ参照設定が必要なのか
Dictionary や Recordset は、
- VBA標準の型ではない
- 外部ライブラリで定義されている
ため、
VBAに「この型を使う」と教えてあげる必要があります。
・対処法:参照設定を確認する
VBEで次を確認します。
- メニュー「ツール」
- 「参照設定」
- 該当ライブラリにチェックが入っているか
例:
- Microsoft Scripting Runtime
- Microsoft ActiveX Data Objects
・注意:MISSING があると他も壊れる
参照設定一覧に
MISSING: ○○
がある場合、
- そのライブラリだけでなく
- 他の型解決にも影響
し、
一見無関係な型で
「ユーザー定義型は定義されていません。」
が出ることがあります。
・実務での再発防止ポイント
- 外部ライブラリ依存は最小限に
- 使用しているライブラリはコメントで明記
- 環境差が出やすいことを前提に設計
✅ パターン②:Type / Enum / クラスのスコープ・定義位置の問題
※中級者がよく引っかかる原因です。
・Type が Private になっている
Private Type UserData
Name As String
Age As Long
End Type
この Type を、
別モジュールで使おうとすると、
Dim u As UserData
→ ユーザー定義型は定義されていません。
・なぜこのエラーになるのか
Private な Type は、
- 定義されたモジュール内でのみ有効
- 他のモジュールからは「存在しない」
と判断されます。
・対処法:Public にする
Public Type UserData
Name As String
Age As Long
End Type
使う範囲=Public / Private の範囲
これを一致させることが重要です。
・Enum / クラスモジュールでも同じ
Public Enum StatusType
Active
Inactive
End Enum
Dim st As StatusType
- Enum が Public でない
- クラスモジュールが存在しない
- クラス名(Nameプロパティ)が違う
場合も、
同じエラーが発生します。
・クラス名は「(Name) プロパティ」を見る
クラスモジュールでは、
- ファイル名
- 表示名
ではなく、
(Name) プロパティの値 が型名になります。
参考:【VBA】スコープとは?変数の有効範囲を実務で理解する完全ガイド
参考:【VBA】Option Explicitは必須?宣言を強制すべき理由と実務での落とし穴
✅ パターン③:型名と変数名・予約語の衝突
※地味だが意外と多い原因です。
・型名と同じ変数名を使っている
Dim Worksheet As String
このようなコードがあると、
Worksheet 型が上書きされ、
他の場所で次の宣言がエラーになります。
Dim ws As Worksheet
→ ユーザー定義型は定義されていません。
・なぜこんなことが起きるのか
VBAでは、
- 型名
- 変数名
が同じ名前空間に存在するため、
後から宣言されたものが優先 されます。
結果として、
本来の型が見えなくなります。
・対処法:予約語・型名を変数名に使わない
特に注意すべき名前:
- Worksheet
- Workbook
- Range
- Dictionary
- Application
型っぽい名前は変数名に使わない
これだけで防げるケースは非常に多いです。
✅ 3パターンを見分けるためのチェック手順
※闇雲に直さないために重要です。
・おすすめ確認順
- 参照設定(MISSING 含む)
- 外部ライブラリ型かどうか
- Public / Private の範囲
- クラス・Type・Enum の存在
- 名前の衝突
この順で確認すると、
ほぼ確実に原因にたどり着けます。
✅ 実務で再発させないための設計ポイント
※「直す」より「防ぐ」が重要です。
・型定義は専用モジュールにまとめる
- Type / Enum / クラスは集約
- どこに定義されているか明確に
・外部ライブラリ依存を減らす
- Dictionary → Collection で代替できないか
- ADO → CSV / 配列処理で代替できないか
環境差を減らす設計 が、
結果的にトラブルを減らします。
✅ RPA(UiPath)連携時の注意点
※このエラーが突然出やすい環境です。
- 実行PCが変わる
- Office構成が違う
- 参照設定が引き継がれない
そのため、
- 参照設定に依存しすぎない
- 型の使用範囲を明確にする
ことが非常に重要になります。
✅ よくある勘違い
※遠回りの原因です。
・「コードの書き方が悪い」
→ 設定・定義・名前の問題であることが多いです。
・「Type文を直せばいい」
→ Type文が原因とは限りません。
✅ まとめ:3パターンで整理すると一気に分かる
- このエラーはコンパイルエラー
- 「ユーザー定義型」は非常に広い意味
- 原因は大きく3パターン
- 参照設定の問題
- 定義範囲・スコープの問題
- 名前の衝突
- 闇雲に直さず、型の正体を確認する
「ユーザー定義型は定義されていません。」は、
VBAが 「型の設計を理解しているか」 を試してくるエラーです。
このエラーを冷静に切り分けられるようになると、
VBAコードは
環境に強く、再利用しやすい設計 に一段階レベルアップします。
ぜひ、
エラー文に振り回されず、
型・定義・依存関係を意識したVBA設計 を身につけてください。