変数の宣言を強制しない時のデメリット

『変数の宣言を強制する』項目には,必ずチェックを入れておいて欲しいのですが,
もし居れてなかったら,どんなことが起こりうるか,説明していきます。

1.変数名の打ち間違いで,結果がおかしくなる。

 次のマクロは,国語と算数の合計点を表示させるマクロです。
 本来は,80と表示されるはずなのですが,結果が「0」と表示されてしまいました。
 その原因がわかりますか? 

Sub goukei()

  kokugo = 50
  sansuu = 30

  MsgBox kokogo + sansu 

End Sub 
 

 実は,変数名が微妙に違っていたのです。
 わかりやすいように,色を変えてみましょう。 

Sub goukei()

  kokugo = 50 ←@
  sansuu = 30 ←A

  MsgBox kokogo + sansu ←B 

End Sub


@kokgo という変数が作られ,50が代入されます。
Asansuu という変数が作られ,30が代入されます。

Bここでは,kokgo となっているため,新しい変数が作られました。
 さらに,sans となっているため,また新しい変数が作られました。

新しい変数の初期値は0なので,合計しても0が表示されました。
 

 【原因】 変数名の打ち間違い。

 これを見て探すのは,非常に困難です。
 さらに,怖いのは,このマクロはエラーにもならず,正常に動作する点です。
 表示した結果から,「何かおかしい。」と気付けばいいのですが,そうじゃないとこのまま使っていくでしょう。
 そして,あとになって大きなトラブルを引き起こすのです。
 一番怖いパターンですね。

 変数の宣言を強制して,きちんと宣言すれば,エラーを表示して教えてくれます。

2.変なエラーが起きる。

 次の例を見てみましょう。
 たった1行のマクロです。
 a という変数に,123を代入するだけのマクロですが,エラーになってしまいました。
 表記の仕方には,間違いがありません。



 【原因】 変数名a が,プロシージャ名a とかぶっている。

 「こんなことでエラーになるのか。」と思えるようなエラーですね。
 このプロシージャ名は,他のプロシージャが使っていても,エラーになります。
 きちんと書くと,下のようになります。

Option Explicit

Sub a()

  Dim a As Long

  a = 123

End Sub

3.期待する結果と違う結果が返ってくる。

 下のマクロは,数値を2つ入力して,その合計を表示するものです。
 しかし,結果が思っていたのとは,違いました。
 最初の入力画面では「1」を,2つ目の入力画面では「2」を入力したので,
 「3」が戻ってきて欲しいのですが,結果は「12」となってしまいました。

Sub b()

  c = InputBox("c=?") 
  d = InputBox("d=?") 

  MsgBox c + d

End Sub
 
 

 【原因】 変数cと変数dが,文字列型の扱いになったため,c+dの計算が文字の結合になった。

 InputBoxは,戻り値が文字列なので,それに合わせて,変数cや変数dも,文字列型として扱われました。
 +の演算子は,対象が文字列だと,結合の処理をします。つまり,1と2をくっつけて,12としたわけです。
 これも,マクロとしては正常に動作しているので,非常に怖いパターンですね。
 きちんと書くと,下のようになります。

Option Explicit

Sub b()

  Dim c As Long
  Dim d As Long

  c = InputBox("c=?") 
  d = InputBox("d=?") 

  MsgBox c + d

End Sub
 
 


まとめ

 初心者にとって,変数の宣言は,難しく思えるかもしれませんが,以下の2つで,大抵の場合大丈夫です。
 ○整数を扱うのなら,  Dim 変数名 As Long
 ○文字を扱うのなら,  Dim 変数名 As String
 プロシージャの最初の方で宣言して,わかりやすくまとめておきましょう。

 また,どこからからコピー&ペーストしたマクロが動かないからと言って,安易に行頭の「Option Explicit」を削除するのはやめましょう。
 それで動くようになったとしても,結果が正しいかどうかが危ぶまれます。

 変数の宣言は,そのプロシージャで,どんな変数を使っているのか,自分自身に意識づけをする意味でも重要なことです。
 私が,変数の宣言をするときは,先に必要な計算式を書いてしまってから,あとでその計算式で使っている変数の宣言を,前の方に戻って追加して書き込むことが多いです。
 マクロを書いている時に,どんな変数がいるか,最初から見通すのはなかなか難しいので,気が付いた時に宣言を書き足していくのが,現実的だと思います。