VBAテクニック集 VBA一覧 コンパイルエラー・構文エラー デバッグ・エラー処理

【VBA】「コンパイルエラー: ユーザー定義型は定義されていません。」|型エラーを完全整理

Excel VBAでコードを書いていると、
突然次のエラーが表示されることがあります。

コンパイル エラー
ユーザー定義型は定義されていません。

このエラーは、

  • コード自体は正しそうに見える
  • エラー文から原因が直感的に分からない
  • 環境が変わると突然出る

といった特徴があり、
VBA初心者〜中級者が最もつまずきやすいコンパイルエラーの1つです。

特に厄介なのは、

  • 原因が1つではない
  • 「ユーザー定義型」という言葉が誤解を招く
  • 修正方法がケースによってまったく異なる

という点です。

この記事では、
「ユーザー定義型は定義されていません。」エラーを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

コード自体は正しくても、
参照設定がされていない環境では型が存在しない ため、
このエラーが発生します。


・なぜ参照設定が必要なのか

DictionaryRecordset は、

  • VBA標準の型ではない
  • 外部ライブラリで定義されている

ため、
VBAに「この型を使う」と教えてあげる必要があります。


・対処法:参照設定を確認する

VBEで次を確認します。

  1. メニュー「ツール」
  2. 「参照設定」
  3. 該当ライブラリにチェックが入っているか

例:

  • 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パターンを見分けるためのチェック手順

※闇雲に直さないために重要です。

・おすすめ確認順

  1. 参照設定(MISSING 含む)
  2. 外部ライブラリ型かどうか
  3. Public / Private の範囲
  4. クラス・Type・Enum の存在
  5. 名前の衝突

この順で確認すると、
ほぼ確実に原因にたどり着けます。


✅ 実務で再発させないための設計ポイント

※「直す」より「防ぐ」が重要です。

・型定義は専用モジュールにまとめる

  • Type / Enum / クラスは集約
  • どこに定義されているか明確に

・外部ライブラリ依存を減らす

  • Dictionary → Collection で代替できないか
  • ADO → CSV / 配列処理で代替できないか

環境差を減らす設計 が、
結果的にトラブルを減らします。


✅ RPA(UiPath)連携時の注意点

※このエラーが突然出やすい環境です。

  • 実行PCが変わる
  • Office構成が違う
  • 参照設定が引き継がれない

そのため、

  • 参照設定に依存しすぎない
  • 型の使用範囲を明確にする

ことが非常に重要になります。


✅ よくある勘違い

※遠回りの原因です。

・「コードの書き方が悪い」

→ 設定・定義・名前の問題であることが多いです。

・「Type文を直せばいい」

→ Type文が原因とは限りません。


✅ まとめ:3パターンで整理すると一気に分かる

  • このエラーはコンパイルエラー
  • 「ユーザー定義型」は非常に広い意味
  • 原因は大きく3パターン
    1. 参照設定の問題
    2. 定義範囲・スコープの問題
    3. 名前の衝突
  • 闇雲に直さず、型の正体を確認する

「ユーザー定義型は定義されていません。」は、
VBAが 「型の設計を理解しているか」 を試してくるエラーです。

このエラーを冷静に切り分けられるようになると、
VBAコードは
環境に強く、再利用しやすい設計 に一段階レベルアップします。

ぜひ、
エラー文に振り回されず、
型・定義・依存関係を意識したVBA設計 を身につけてください。

参考:【VBA】変数の宣言はなぜ必要?書かないと何が起こるのかを徹底解説

    -VBAテクニック集, VBA一覧, コンパイルエラー・構文エラー, デバッグ・エラー処理