『変数の宣言を強制する』項目には,必ずチェックを入れておいて欲しいのですが,
もし居れてなかったら,どんなことが起こりうるか,説明していきます。
次のマクロは,国語と算数の合計点を表示させるマクロです。
本来は,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 |
@kokugo という変数が作られ,50が代入されます。 Asansuu という変数が作られ,30が代入されます。 Bここでは,kokogo となっているため,新しい変数が作られました。 さらに,sansu となっているため,また新しい変数が作られました。 新しい変数の初期値は0なので,合計しても0が表示されました。 |
【原因】 変数名の打ち間違い。
これを見て探すのは,非常に困難です。
さらに,怖いのは,このマクロはエラーにもならず,正常に動作する点です。
表示した結果から,「何かおかしい。」と気付けばいいのですが,そうじゃないとこのまま使っていくでしょう。
そして,あとになって大きなトラブルを引き起こすのです。
一番怖いパターンですね。
変数の宣言を強制して,きちんと宣言すれば,エラーを表示して教えてくれます。
次の例を見てみましょう。
たった1行のマクロです。
a という変数に,123を代入するだけのマクロですが,エラーになってしまいました。
表記の仕方には,間違いがありません。
【原因】 変数名a が,プロシージャ名a とかぶっている。
「こんなことでエラーになるのか。」と思えるようなエラーですね。
このプロシージャ名は,他のプロシージャが使っていても,エラーになります。
きちんと書くと,下のようになります。
Option Explicit Sub a() Dim a As Long a = 123 End Sub |
下のマクロは,数値を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」を削除するのはやめましょう。
それで動くようになったとしても,結果が正しいかどうかが危ぶまれます。
変数の宣言は,そのプロシージャで,どんな変数を使っているのか,自分自身に意識づけをする意味でも重要なことです。
私が,変数の宣言をするときは,先に必要な計算式を書いてしまってから,あとでその計算式で使っている変数の宣言を,前の方に戻って追加して書き込むことが多いです。
マクロを書いている時に,どんな変数がいるか,最初から見通すのはなかなか難しいので,気が付いた時に宣言を書き足していくのが,現実的だと思います。