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

【VBA】「ユーザー定義型が定義されていません。」と表示されたときの対処法【エラー解説】

Excel VBAでマクロを実行・編集していると、
突然 「ユーザー定義型が定義されていません。」 というエラーに遭遇することがあります。

このエラーは、

  • コードは一見正しそう

  • 昨日まで動いていた

  • 他人のVBAコードを貼り付けた直後に出た

といった状況で発生することが多く、
初心者だけでなく中級者でも原因が分かりづらい エラーの代表例です。

さらに厄介なのは、

  • エラー文から原因が想像しづらい

  • 修正方法が1つではない

  • 環境差・設定差で発生する

という点です。

この記事では、
VBAのコンパイルエラー
「ユーザー定義型が定義されていません。」 について、

  • エラーの正体

  • なぜ発生するのか

  • 原因別の具体的な対処法

  • 実務で再発させない設計の考え方

まで、コード例を交えて体系的に解説します。

目次

✅ 「ユーザー定義型が定義されていません。」とは何のエラーか

※ここを誤解すると、延々と修正できなくなります。

・これは「実行時エラー」ではなく「コンパイルエラー」

まず重要なのは、このエラーは
コンパイルエラー だという点です。

  • 実行してから出るのではない

  • コードのチェック段階で止まる

つまり、
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で以下を確認します。

  1. 「ツール」

  2. 「参照設定」

  3. チェックが外れていないか確認

該当ライブラリにチェックを入れることで、
型が認識され、エラーは解消されます。


✅ 原因②:参照設定の「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】変数名の付け方|キャメルケース・スネークケースなど命名規則を徹底解説


✅ デバッグの基本手順(実務向け)

※闇雲に直さないことが重要です。

・チェック順のおすすめ

  1. 参照設定(MISSING含む)

  2. 型が標準か外部か

  3. Public / Private

  4. クラス・Typeの存在

  5. 名前の衝突

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


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

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

・外部ライブラリ依存を明確にする

  • コメントで明示

  • 使用箇所を限定

・型定義は専用モジュールに集約

Type / Enum / クラスは、
どこに定義されているか分かる状態 にします。


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

※自動実行環境では特に重要です。

  • 参照設定が引き継がれない

  • Office構成が違う

という理由で、
このエラーが突然出ることがあります。

環境依存の型を極力減らす設計 が重要です。


✅ よくある勘違い

※遠回りする人が非常に多いポイントです。

・「ユーザー定義型=Type文だけ」

→ 誤りです。

・「コードが間違っている」

→ 設定や環境が原因のことが多いです。


✅ まとめ:「ユーザー定義型が定義されていません。」の本質

  • これはコンパイルエラー

  • 「型が認識できない」ことが原因

  • 参照設定が最重要チェックポイント

  • Public / Private、名前衝突にも注意

  • 環境差を意識した設計が再発防止につながる

このエラーを正しく理解できるようになると、
VBAは 「コピペで動かすもの」から「設計して書くもの」 に変わります。

原因を1つずつ切り分け、
落ち着いて対処できる知識 を、ぜひ身につけてください。

参考:【VBA】Option Explicitは必須?宣言を強制すべき理由と実務での落とし穴

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