『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】Option Explicitで変数宣言を強制する

この記事では VBA の Option Explicit ステートメントを使って、変数宣言を強制する方法について解説します。宣言するといっても、大きな声で「これが変数です!」と叫ぶわけじゃありません。コードの中に書くという意味です。
 
え? そんなことわかってる?
つまらんボケとかいらない?
はいはい。それでは講座を始めます。
 
まず最初に「どうして変数を宣言する必要があるのか」について簡単に説明しておきます。そもそも VBA では宣言しなくても変数を使えてしまう仕様になっています。宣言なんて面倒だからさぼろうと思って、

'[VBA] 変数宣言を省略したプロシージャ(1)
Sub Declaration_1()
  mydata = 1 + 1
  Debug.Print mydata
End Sub

'Declaration_1()の実行結果:
'2

みたいなコードを書いておけば、ちゃんと変数 mydata には 2 という数字が入って結果も表示されます。このように宣言なんてしなくても、ユーザーが勝手に書いたキーワードは変数とみなされて処理されます。これで何も問題なさそうに見えますけど、

'[VBA] 変数宣言を省略したプロシージャ(2)
Sub Declaration_2()
  mydata = 1 + 1
  Debug.Print mydta
End Sub

のようなマクロを書いてしまったとします。よく見てください。Debug.Print のあとのキーワードがスペルミスで mydta となっています。このマクロを実行してもエラーになりません。このマクロでは mydata と mydta という2つの変数が用いられていることになり、mydta には何も入っていないので、実行しても何も表示されないだけです。これは簡単なマクロなので「あれ? 何も表示されないよ?」とすぐに気づきますが、もっと複雑なマクロになってくると、ちょっとした綴り間違いによって「エラーは出ないのに動作がおかしい」という事態に陥ってしまう可能性が大いにあるのです。そしてミスを取り除くために、何百行もあるコードの中から綴り間違いを探し出すという悪夢のような作業が待ち受けています。

【VBA】Option Explicit

そのような事態を防ぐために、モジュールの一番上に Option Explicit というステートメントを書いておきます。

'[VBA] Option Explicit で変数宣言を強制(1)
Option Explicit

Sub Declaration_3()
  mydata = 1 + 1
  Debug.Print mydata
End Sub

Declaration_3() を実行しようとしても「コンパイルエラー:変数が定義されていません」という警告文が表示されます。Option Explicit によって、宣言されていない変数 mydata を使うことを禁じられるようになったのです。ちなみに、”Explicit” とは「明示的な」という意味があります。つまり、Option Explicit は直訳すると「明示的に変数を宣言する」ステートメントです。
 
モジュールの先頭に Option Explicit がある場合、Declaration_3() は、

'[VBA] Option Explicit で変数宣言を強制(2)
Option Explicit

Sub Declaration_4()
  Dim mydata As Integer
  mydata = 1 + 1
  Debug.Print mydata
End Sub
'Declaration_4()の実行結果:
'2

のように修正すると問題なく実行できるようになります。

Dim mydata As Integer

の “As Integer” の部分は「この変数は整数型にします」という宣言です。ここは省略してもかまいませんけど、その場合はどんな型のデータでも入れることのできる Variant 型変数となります。できることなら用途に応じて型を定めておくほうが誤作動を防ぎやすいのですが、変数の型の種類については別の記事で説明します。

ちなみに、VBE (Visual Basic Editor) には自動で Option Explicit ステートメントを挿入する機能があります。[ツール] 、[オプション] の順に選択すると次のような画面が現れるはずです。

Option Explicitで変数の宣言を強制
[コードの設定] の中にある [変数の宣言を強制する] にチェックを入れておくと、新しいモジュールを作成したときに、自動で Option Explicit を記述してくれます。

Option Explicit の熱い議論

VBA の Option Explicit について、二人の IT 社員が熱く議論する脚本を ChatGPT に書いてもらいました。議論の中で重要なポイントには黄色のアンダーラインを引いておきましたので、ぜひ参考にしてください。
 
【登場人物】
 田中:経験豊富なVBA開発者。コードの品質と保守性を重視している。
 高橋:新米のVBA開発者。柔軟性と開発効率を重視している。

田中さん: (コードを見ながら) よく見てください、この VBA コードの先頭には Option Explicit があります。これはコードを書く上で非常に重要な一文なんですよ。
 
高橋さん: (首をかしげながら) えっ、Option Explicitって何ですか?使わなくても問題ないんじゃないですか?
 
田中さん: そんなことはありません。Option Explicit は、変数の宣言を強制するための文です。これがないと、未定義の変数を使用してしまったり、スペルミスがあったりした場合にエラーが発生しません

高橋さん: でも、自動的に変数が宣言されるんじゃないんですか? なんでわざわざ書かなきゃいけないんですか?
 
田中さん: それは確かに VBA の特徴ですが、Option Explicit を使用することで、コードの読みやすさと保守性が向上します。宣言されていない変数は、後でどこで使われているのか分かりにくくなりますしスペルミスがあってもエラーが出ず、バグの原因となります
 
高橋さん: でも、Option Explicitを使うとコーディングの速度が遅くなりませんか? 変数を宣言する手間が増えるでしょう?
 
田中さん: その手間は、むしろ開発初期の段階で予防的にバグを防ぐためにかかる時間と捉えるべきです。コーディングの速度よりも、品質と保守性を重視するべきですよ。

高橋さん: でも、私たちは大規模なプロジェクトに取り組んでいるんです。時間に追われていて、コードのメンテナンスなんて後回しにされてしまうこともあるんですよ。
 
田中さん: それは理解できますが、将来的にコードの修正や変更が必要になる場合、Option Explicit がないと、エラーの発見や修正が非常に困難になります。エラーの特定と修正にかかる時間を考えれば、初めから Option Explicit を使う方が効率的です
 
高橋さん: うーん、確かにその点は考えないといけないかもしれませんね。でも、少なくとも開発初期には Option Explicit を無効にして、柔軟にコーディングできるようにしたいです。

田中さん: もちろん、開発スピードも大切です。ただ、Option Explicit はコードの品質を向上させるために有用なツールです。最終的にはチーム全体での方針を決める必要がありますね。
 
高橋さん: そうですね、チームの方針とプロジェクトの要件に応じて使い分けることが大切なんですね。しっかり考えてみます。

コメント