エラーが発生する状況
VBAエディター(Alt+F11)を開き、F5キーを押してマクロを実行しようとすると、エディターが即座に特定の行をハイライトし、次のエラーを表示します。
Compile error: Method or data member not found
マクロは一切実行されません。VBAは実行前にオブジェクトのタイプライブラリに対してすべてのメソッド名とプロパティ名を検証します。不正な名前が1つでも見つかると、そこで処理が止まります。
根本原因の分析
このエラーはほぼ必ず、次の3つのいずれかに起因します。
- メソッド名またはプロパティ名のタイポ —
.Valueの代わりに.Vlaue、.ClearContentsの代わりに.ClearContenetなどのミスです。 - 変数の型の宣言ミス —
Worksheetとして宣言した変数に対してWorkbookのメソッドを呼び出したり、Worksheet変数に対してRangeのメソッドを呼び出したりするケースです。 - ライブラリ参照の欠落 — コードが外部ライブラリ(Scripting Runtime、ADO、Outlookなど)のオブジェクトを使用しているにもかかわらず、ツール → 参照設定で有効化されていない場合です。
VBAはこのエラーを実行時ではなくコンパイル時に検出します。ハイライトされた行が必ず問題の箇所です。推測する必要はありません。
手順ごとの修正方法
手順1:ハイライトされた行のタイポを確認する
エラーダイアログを閉じます。カーソルは問題のある行に留まります。プロパティ名またはメソッド名を1文字ずつ確認してください。
' 誤り — プロパティ名のタイポ
ws.Cells(1, 1).Vlaue = "Hello"
' 正しい
ws.Cells(1, 1).Value = "Hello"
' 誤り
rng.ClearContenet
' 正しい
rng.ClearContents
文字が1つ入れ替わるだけでこのエラーは発生します。手順2で説明するオブジェクトブラウザーからメソッド名を直接コピーすれば、タイポは二度と起きません。
手順2:オブジェクトブラウザーで正確なメンバー名を確認する
VBAエディター内で F2 キーを押してオブジェクトブラウザーを開きます。目的のオブジェクト型(Worksheet、Range、Workbook など)を検索すると、有効なプロパティとメソッドの一覧が表示されます。そこから正確なスペルをコードにコピーしてください。
インラインでもIntelliSenseが使用できます。変数名を入力してドットを付け、Ctrl+Space を押します。ドロップダウンが空表示になる場合、または期待していたメソッドが表示されない場合は、型のミスマッチまたは参照の欠落が原因である可能性が高いです。
手順3:変数の型のミスマッチを修正する
あるオブジェクト型を別の型として宣言した変数に代入するのは、意外と起こりやすいミスです。
' 問題: WorkbookオブジェクトをWorksheet変数に代入している
Dim ws As Worksheet
Set ws = ThisWorkbook ' Workbook ≠ Worksheet
ws.Worksheets(1).Activate ' Compile error: WorksheetにはWorksheets メンバーがない
' 修正: 宣言する型を代入するオブジェクトに合わせる
Dim wb As Workbook
Set wb = ThisWorkbook
wb.Worksheets(1).Activate
' 問題: Worksheet変数に対してRangeのメソッドを呼び出している
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Address ' Compile error: WorksheetにはAddress がない
' .AddressはRangeに属するプロパティであり、Worksheetではない
Dim rng As Range
Set rng = ActiveSheet.Range("A1")
Debug.Print rng.Address ' 正常動作: "$A$1"
手順4:ライブラリ参照の欠落を修正する
外部ライブラリ(Scripting.FileSystemObject、ADODB.Connection、Outlook.Application など)は、明示的に有効化しない限りVBAからは見えません。ツール → 参照設定を開き、コードが依存しているライブラリにチェックを入れてください。
参照を追加するには: ツール → 参照設定 → 「Microsoft Scripting Runtime」にチェックを入れる(コードが必要とするライブラリを選択してください)。
' ツール → 参照設定で "Microsoft Scripting Runtime" にチェックが必要
Dim fso As Scripting.FileSystemObject
Set fso = New Scripting.FileSystemObject
fso.CreateFolder "C:\Temp\Output"
参照を追加できない場合もあります。共有ブック、バージョンの不一致、企業の制限された環境などが一般的な原因です。その場合は遅延バインディングに切り替えてください。参照設定は不要になりますが、IntelliSenseは使用できなくなります。
' 遅延バインディング — ライブラリ参照なしで動作する
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateFolder "C:\Temp\Output"
手順5:Excelのバージョン互換性を確認する
すべてのメソッドがすべてのExcelバージョンで使用できるわけではありません。Excel 2019またはMicrosoft 365で追加された Worksheet のメンバーは、Excel 2016が動作しているマシンではこのエラーを引き起こします。不明な場合は、Microsoftの公式ドキュメントで該当メンバーの「バージョン情報」セクションを確認してください。
恒久的な対策:Option Explicit と明示的な型宣言
すべてのモジュールの先頭に Option Explicit を追加してください。実際の型がわかっている場合は、As Object や As Variant を使わず、必ず具体的なオブジェクト型で変数を宣言してください。
Option Explicit
Sub ProcessData()
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range
Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1")
Set rng = ws.Range("A1:A10")
rng.ClearContents
ws.Cells(1, 1).Value = "Done"
End Sub
具体的な型を宣言することで、IntelliSenseは各変数に対して有効なメンバーのみを表示します。タイポは即座に未定義の名前として検出されます。型のミスマッチは代入の行で発覚するため、ロジックの深いところまで追う必要がなくなります。
新しいモジュールすべてに自動適用するには: ツール → オプション → エディタータブ → 「変数の宣言を強制する」にチェックを入れる。
確認手順
エラーが実際に解消されたかを素早く確認する方法:
- VBAエディターを開きます(Alt+F11)。
- デバッグ → VBAProjectのコンパイルを実行します。
- ダイアログが表示されなければ、コンパイルエラーは解決されています。
- F5 キーを押してマクロを実行し、正常に完了することを確認します。
コンパイルは通ったが実行時エラーが発生する場合、それは別の問題です。ここで行ったコンパイルエラーの修正自体は正しかったといえます。

