VBA で変数の型を宣言しなければいけない理由2021

もうかれこれ VBA で変数の型を宣言しなければいけないのは何故かという話を記事にするのは3回目くらいになっているのですが、また新しく宣言しなければいけない概念を見つけたのでそれを書きます。

私見ですが、初心者にもわかるように説明したいと思います。でも今回はオブジェクトという話が出てくるので少しレベル高いです。

私はかねてから言っている通り、VBAで型宣言しない方の人間でした。理由は、しなくても動くというのと、面倒くさいというのと、VBAを使おうという人が型宣言をしなければいけないことを意識できるのかどうかということがあり、一方的に型宣言しなければいけないというのはアンフェアな感じがしたので型宣言をしなくてもいいというタイプだったのですが、VBAの超すごい人たちの話を聞いているうちに、型宣言をする理由があると漠然と思い始めて、実際に型宣言をしてみたところ、とてもVBAが楽しくなったという実感の上で型宣言をしたほうがいいというところまでが、今までのあらすじです。

さて、今回発見したことというのは今まで分かっていたことの繰り返しや延長線のお話なのですが、どうやら型宣言すべきオブジェクトの形というのは割といい加減で、そのいい加減なまま使うとパソコンはVBAをきちんと理解してくれないということがわかり始めました。

たとえばSelectionというオブジェクトを指定する方法があります。これは、セル、グラフ、図形、その他あらゆるオブジェクトを選択しているものとして認識します。

しかし、どれを我々が欲しがっているのかはVBA上で明記しない限りExcelやWordはわかってくれないのです。

また、セルを表すRangeやCellsも、Msgbox Range(“A1”)のように書けば、セルA1の内容をメッセージボックスで返してくれますが、それって欲しかったのは値だけではなくセルの色や書式などのセルそのものが欲しかったのではないでしょうか。Msgboxには文字を出力することしかできないので中に書いてある文字を出しているに過ぎません。

もうひとつ、シートを指定するのにSheets(“売上”)あるいはSheets(1)と指定します。Sheetsはそもそもブックの中のシートすべての集合体のことで、その中の「売上」という名前または1つ目のシートと指定しているから1枚のシートを指定できますが、もともとは何枚あるかわからないシートの集合体を指しているのです。

それがよくわかるのが、VBEにSheets(1)と入力した後ピリオドを打ってみると、その後の入力候補がインテリセンスで表示されません。

しかし、変数shにワークシート型の型宣言をしてSheets(1)を格納し、shの後にピリオドを打つと入力候補が表示されます。

同じものがセットされているはずなのですが、明確に型宣言をしたshの方が1枚のシートを扱っていると認識されるのです。

これはSelectionと入力してインテリセンスが利かないのですが、SelectionをRange型の変数に代入するとインテリセンスが利くようになるということと、SelectionではなくActiveCellとして選択セルを指定すれば選ぶのはセルだということが確実に分かるのでインテリセンスが利くということにも繋がります(ActiveSheetでインテリセンスが利かないのには何か別の理由があると考えます)。

そのようにExcelやWordで扱うものはVBA上ではわりといい加減に指定されてしまうものなのです。なにかわからない揺らぎがある確定していないものの中で、ループや分岐を行った時、私たちの想定していない動きをするときにエラーになる可能性が高くなるということです。

また、動作チェックはVBAを作成する工数の中で一番多いコストなので、出来るだけ一発で動くようにするというのが私のポリシーなのですが、そういった意味でも、変数を宣言しないとなぜ動作しないのかという原因がつかみにくくなります。例外なら例外でエラーになってほしいし、それをはっきりさせることも必要なのです。

ExcelのVBAでは、実に多くのオブジェクトを扱うことができるので明確に引数を指定しなければならないケースが多く、人間が何をしたいかパソコンに教え、パソコンと適切なコミュニケーションがとれるようにするためにも変数宣言は必要と考えます。

コメント

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