コンパイルエラー 「変数が定義されていません。」

中級VBA

はじめに

 「変数が定義されていません。」というエラーは、変数の宣言が適切に宣言されていないために発生するエラーです。
 VBAでは、変数を宣言しなくても、いきなり変数を利用できますが、変数の宣言を強制する設定Option Explicit)を付けている場合で、変数の宣言をし忘れたり、変数名を間違えた場合などに発生します。
 
 ただ、変数の宣言をしない事でエラーが発生せず間違った処理が行われる場合を考えると、このエラーは好意的に受け取った方が良いでしょう。

【ケース1】変数のスペルミス

 変数名の間違いでエラーが発生するケースです。最後の変数名を書き間違えているためにエラーとなっています。
 (最後に s が付いています。)

 このケースの場合、Option Explicit(変数の宣言を強制する設定)が付いていない場合は、エラーを出さずに、メッセージボックスには空白が表示されます。
 間違えた変数名もあるものとして認識されるためです。この場合、変数の宣言を強制していたためにエラーに早く気付く事ができたと考えるべきでしょう。

【ケース2】変数宣言ミス

 以下のケースでは、Option Explicit(変数の宣言を強制する設定)が付いているにも関わらず、変数 i を宣言していないためにエラーとなっています。

以下のように変数を宣言すれば問題ありません。

Sub test1()
    Dim i As Long
    
    For i = 1 To 5
        Debug.Print i
    Next i
End Sub

【ケース3】グローバル変数の宣言ミス

 次のケースでは、グローバル変数の宣言が適切でないためにエラーが発生しています。

 グローバル変数の宣言はモジュールの先頭(最初のプロシーシャより前)に書かなければいけません。
 以下のように変更すれば問題ありません。

Private gbStr As String

Sub test1()
    Dim i As Long
    
    For i = 1 To 5
        Debug.Print i
    Next i
End Sub

Sub test2()
    gbStr = "こんにちは。"
    MsgBox gbStr
End Sub

 グローバル変数の使い方については以下を参照してください。
グローバル変数の使い方

【ケース4】広域グローバル変数の宣言ミス

 広域のグローバル変数を利用する際に Public を使用しますが、ThisWorkbookモジュールで Public でグローバル変数を宣言しても標準モジュールからは見えないため同様のエラーが発生します。
  Public でグローバル変数を宣言する場合は、標準モジュールの先頭で宣言します。ThisWorkbookモジュールで Public で変数を宣言してもエラーとはなりませんが、参照できるのは ThisWorkbookモジュール内だけです。

 上記の gbBookStr という変数はThisWorkbookモジュールで Public で宣言された変数です。標準モジュールでは参照できないためエラーとなっています。
 エラーを回避するためには、いずれかの標準モジュールの先頭で
Public gbBookStr As String と宣言する必要があります。

まとめ

 「変数が定義されていません。」というエラーはミスに気付きやすいエラーと言えるかもしれませんが、グローバル変数を使用している場合は、使い方に誤りがないか確認してください。

 グローバル変数の使い方については以下を参照してください。
グローバル変数の使い方

 また、Option Explicit(変数の宣言を強制する)を設定する事で、早い段階でミスに気付く事ができますので、設定しておくことをお勧めします。

タイトルとURLをコピーしました