はじめに
「変数が定義されていません。」というエラーは、変数の宣言が適切に宣言されていないために発生するエラーです。
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(変数の宣言を強制する)を設定する事で、早い段階でミスに気付く事ができますので、設定しておくことをお勧めします。