変数宣言を強制しないといけないのか。

マクロを自動記録から覚えている方に多い例です。
自動記録では「変数」というもの自体が登場しません。 自動記録はただの操作記録なので中間で変数を使う必要性がなく、プロパティやメソッド操作が羅列するだけです。 初心者の方がこの自動記録で得られたコードを元に判断や繰り返しの記述を加える場合に、宣言をせずにそのまま記述してしまうようです。
宣言しない時に何が問題になるのかを順に説明していますので参考にして下さい。



誤記のキーワードが「変数」に見なされてしまう。
簡単なことですが、値をセットする変数名と、その値を参照する変数名が1文字でも違うと、全く別個な変数として扱われてしまうので正しく動作しないことになります。

'Option Explicit  ←コメントです。

' 誤記のキーワードが「変数」に見なされてしまう。
Sub TEST1()
    変数1 = "あいうえお"
    MsgBox 変数2
End Sub
このコードを標準モジュールに貼り付けて実行しても、メッセージに「あいうえお」は表示されません。エラーにもなりません。
このような単純なコードなら「誤記」はすぐに見つかるでしょうが、マクロの動作自体はエラーになるわけではありません。 モジュールの先頭にOption Explicitを書いて必要な変数を宣言するようにすれば、「誤記」のキーワード(変数)はコンパイル(未宣言)エラーになるので、このレベルのミスは実行前に発見できます。

データ型が不定なための誤動作をまねく。
セルをオブジェクトとして変数に取得する場合に、経験者でも「Setステートメント」を忘れることはあるものです。

'Option Explicit  ←コメントです。

' データ型が不定なための誤動作をまねく。
Sub TEST2_1()
    Set 変数 = Range("A1")
    MsgBox 変数.Value
End Sub

Sub TEST2_2()
    変数 = Range("A1")
    MsgBox 変数.Value
End Sub
この2つのサンプルでは、「TEST2_2」はエラーとなります。 この場合でもデータ型を明示して変数を宣言しておけば、実際にマクロを実行する前に誤記を発見できます。

モジュール変数での問題。
これは、宣言している場合でも「変数の宣言場所と有効期間」を理解していないと間違えることの1つです。「TEST3_1」でセットした値を「TEST3_2」で参照しようとするものです。

'Option Explicit  ←コメントです。

' モジュール変数での問題。
Sub TEST3()
    Call TEST3_1
    Call TEST3_2
End Sub

Private Sub TEST3_1()
    変数3 = "あいうえお"
End Sub

Private Sub TEST3_2()
    MsgBox 変数3
End Sub
このコードを標準モジュールに貼り付けて実行しても、メッセージに「あいうえお」は表示されません。
変数を宣言しないで用いる方法ではプロシージャレベルと見なされモジュール変数としては使えないのです。ここでモジュールレベルに「変数3」を宣言するとメッセージに「あいうえお」が表示されるので判ると思います。

宣言をしたくない理由は?
正直に言って、宣言をした場合のデメリットは見いだせません。単に安直なエラー回避にしか見えません。ろくにテストもせずに「On Error Resume Next」を書いてエラー逃れするのと同じに見えます。 「なぜ変数宣言を強制しないといけないのか。」という疑問を持つ方に逆に聞きたいのが「なぜ宣言をしたくないのか。」なのです。
明確な理由があって宣言しないことを選択するなら構わないことでしょうが、私には上記の通りにしか見えません。VBEの初期値だといっても新しいモジュールを開く時に「Option Explicit」を付けるかどうかだけのことで、 この設定をどう変更しても既存のモジュールには何も影響しません。
※ではなぜ変数を宣言しなくても動作できるようになっているのかというと、私見ですが、旧バージョン資産の継承であったり、VBAに対する門戸を広く開く(手軽さを強調する)ためだろうと思います。 新規にマクロを作る方がこれに従う(変数の宣言をしない)かどうかは、その利害をよく見極めて決めて下さい。

宣言を必須とすることの利点。
モジュールの先頭にOption Explicitを書いて変数の宣言を強制するようにします。 これにより間違えたキーワードはコンパイルエラーとなるのでマクロの実行前に間違いが見つかります。このことは変数の誤記だけではなく関数に対する誤記も含まれます。 一方、変数の宣言を強制しない場合は、誤記のキーワードは自動的に変数として見なされるのでエラーにならずに動いてしまいコード間違いの発見が遅れてしまいます。 気づかずにバグを持ったままのプログラムを配布してしまうことにもなりかねません。
プログラム開発プロジェクトなどで書き方に規約を定めている場合、「変数の宣言を強制」をその規約に挙げていることがほとんどだと思います。