コンパイルエラー「Sub または Function が定義されていません」「変数が定義されていません」の原因と直し方
マクロの実行前に表示される2つのコンパイルエラーについて、スペルミス、ワークシート関数の呼び方、別ブックのマクロの呼び出し、参照設定の不足などの原因と直し方を解説します。
コンパイルエラーとは
コンパイルエラーは、マクロが1行も実行される前に、VBA がコード全体をチェックした段階で見つかる誤りです。実行時エラーと違って、データの内容に関係なく必ず起きるため、原因を直さない限りマクロは動きません。
エラーが表示されると、原因となった名前が青く反転表示されます。この記事では、その中でも特に多い「Sub または Function が定義されていません」と「変数が定義されていません」の2つを取り上げます。
「Sub または Function が定義されていません」の原因
呼び出そうとしたプロシージャや関数が、VBA から見つからないときに表示されます。主な原因は次のとおりです。
- 呼び出すマクロ名や関数名のスペルミス(MsgBox を MsgBx と書くなど、組み込みの関数名の書き間違いも含む)
- Excel のワークシート関数(SUMIFS や VLOOKUP など)を VBA の関数のように直接書いている
- 別のブック(個人用マクロブックなど)にあるマクロを、名前だけで呼び出している
- 呼び出し先が別モジュールの Private プロシージャになっている
- 参照設定に「参照不可」のライブラリがある(「プロジェクトまたはライブラリが見つかりません」と表示され、Left や Format などの関数で止まることもある)
直し方の例
ワークシート関数は WorksheetFunction を通して呼び出します。別のブックにあるマクロは、ブック名とマクロ名を指定して Application.Run で実行します。同じブックの別モジュールにある Public プロシージャは、名前だけで呼び出せます。
Sub CallSamples()
Dim total As Double, ws As Worksheet
Set ws = ThisWorkbook.Worksheets("売上")
' 誤り:total = SumIfs(...) → Sub または Function が定義されていません
total = WorksheetFunction.SumIfs(ws.Range("C:C"), ws.Range("A:A"), "東京")
Debug.Print total
' 個人用マクロブックのマクロを引数付きで呼び出す
Application.Run "'PERSONAL.XLSB'!FormatHeader", ws.Name
End Sub「変数が定義されていません」の原因
このエラーは、モジュールの先頭に Option Explicit がある場合に、Dim で宣言していない名前を使うと表示されます。エラー自体は「宣言してください」という意味なので、多くは変数名のスペルミスか、Dim の書き忘れです。宣言した変数名と使っている変数名を見比べてください。
見落としやすいのが、ほかのアプリケーションの定数です。Word や Outlook を CreateObject で操作する場合、参照設定をしていないので wdReplaceAll や olMailItem といった定数は VBA から見えず、「変数が定義されていません」になります。この場合は、定数の代わりに数値(olMailItem なら 0)を書くか、同じ名前の定数を自分で Const で宣言します。ユーザーフォームのコントロール名を変更したのに、コードで古い名前を使っている場合にも表示されます。
このエラーが出るからといって Option Explicit を消すのはおすすめしません。消すとスペルミスが空の変数として素通りし、実行時エラー424や、誤った計算結果という見つけにくい不具合に変わってしまいます。
参照設定を確認する
以前は動いていたマクロが、別の PC で開いたとたんに Left や Date などの基本的な関数で止まる場合は、参照設定を確認します。VBE の「ツール」→「参照設定」を開き、先頭に「参照不可」と付いた項目があれば、そのライブラリがその PC にないことが原因です。チェックを外すか、同じライブラリの別バージョンにチェックを付け直します。
直したあとは、VBE の「デバッグ」→「VBAProject のコンパイル」を実行すると、ほかのモジュールに残っているコンパイルエラーもまとめて確認できます。配布する前に一度実行しておくと安心です。
※Application.Run で別ブックのマクロを呼ぶ場合、そのブックが開いている必要があります。個人用マクロブックは通常 Excel の起動時に自動で開かれます。