VBAのプログラムを作成する現場だと「Option Explicit」は必ず付与するというコーディング規約が存在する場合が多いです。
Option Explicitとは、変数の宣言を強制するためのオプションです。各モジュールの先頭に記載します。
Option Explicitがオンになっている場合は、以下のようにDimで宣言をせずに変数を使用するとエラーになります。
Option Explicit
Sub test()
s = "テストだぞ"
MsgBox s
End Sub
上記コードを実行すると「コンパイルエラー:変数が定義されていません。」が発生します。
私は「とりあえずOption Explicitはつけておくべき」というのが当然になっていて疑問に思っていませんでした。
しかし、先日Option Explicitはつけるべきではないと主張されているブログ記事を発見いたしました。
https://blog.goo.ne.jp/santaro2006/e/85f40634bde727619e5b7fa31436c6b0
他のブログに一方的に反論するのはマナー違反だと思うのですが、議論のために引用させていただきました。
上記ブログの主張をまとめると以下のようになるかと思います。
- セルはデフォルトで型の定義を持たない(日付でも数値でも文字列でも入れられる)→Excel自体が型定義をしない思想
- 誤字のチェックは機械に頼らないほうが良い
- 人気言語のPythonでも型定義は不要
- 手軽に作成できるというのがVBAの思想
Excelのセルが型定義を持たないというのは、言われてみればそのとおりで、鋭い着眼点だなと思いました。
上記を受けて、私も色々と考えてみましたが、結論としては「やはりOption Explicitはつけたほうが良い」と思いました。理由について記載していきます。
型定義が存在する言語が主流になってきている
「Excelのセルが型定義を持たない」、「人気言語のPythonでも型定義は不要」という点について考えてみました。
個人的に、プログラムの主流は型定義をする言語に流れてきているし、それは今後も続くと考えています。
例えば、HTMLのテキストボックスもExcelのセルと同じで数値・文字列などを格納でき、JavaScriptはVariant型で格納する仕様です。
しかし、TypeScriptを使用することで型を定義することが当たり前になってきています。コーディング量は増えますが、そのほうが生産性が高いためです。
よって型定義しないのが人気とは言えず、VBAにおいても生産性を高めるために型定義するべきと考えます。生産性が高まる理由は次項以降の理由のためです。
インテリセンスを使用することができるから
クラスの場合は変数の型を定義することにより、変数の後にドットを入力した際にメソッドがオートコンプリートされるようになります。(インテリセンス)
↓変数を宣言した場合
↓変数を宣言しない場合
変数を宣言しない方はコード量が1行減る代わりに、自分でメソッドを書かないといけなくなります。
更に言うとメソッド名を間違えた場合でもコンパイルエラーになりません。
エラーだと判明するのはこのコードが実際に実行されたときです。
仮にテストに漏れがあってこのコードが実行されないとバグになってしまいます。これはかなりリスクが大きいと考えます。
変数の重複を防ぐことができるから
変数宣言をしていない場合、前の方で使っている変数と同じ変数名を使っても気がつくことができません。
前に使っている変数の値を上書きしてしまい、バグに繋がる可能性があります。仮に上書きして問題ない場合でも可読性は下がります。
Option Explicitをつけることで変数宣言を強制すれば、必ず上記エラーになるので重複に気が付かないということはありません。
関数の引数不正をチェックすることができるから
以下のコードを実行するとどうなるでしょうか。
Sub test(i As Integer)
MsgBox CStr(i)
End Sub
Sub main()
i = 9000
Call test(i)
End Sub
結果は以下のようなエラーとなります。
これは、「test(i As Integer)」が引数にIntegerを要求しているのも関わらず、Variant型を渡しているためです。
※変数 i は方の宣言をしていないのですが、この場合はVariant型として扱われます。
型を宣言せずに、このエラーを回避するためには以下のようにコードを修正します。
Sub test(i)
MsgBox CStr(i)
End Sub
Sub main()
i = 9000
Call test(i)
End Sub
これでエラーが発生しなくはなりましたが、test関数の引数に何を渡したら良いかわかりにくくなってしまいました。
test関数を作成した人以外は、この関数の使い方がわからず困ってしまいます。このような自体を避けるためにも、変数の宣言は行っていったほうが良いと考えいます。
Variant型を使うとメモリ使用量が増えるから
前述したとおり、変数宣言をしない場合はVariant型として判断されることになります。
このVariant型は、どんな値でも入れられるようになっているのでメモリの使用量が大きいです。具体的には下記のようになっているようです。
Long | 4バイト |
Date | 8バイト |
Integer | 2バイト |
Variant | 16バイト |
Double | 8バイト |
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/data-type-summary
最小でも16バイト使用してしまうため、Integerを明示して使用する場合と比較して14バイト余計に使ってしまうことになります。
「今どき、メモリ使用量なんて気にしないよ」という意見もあるかと思いますが10万行くらいあるExcelのデータを変数に格納するときなどには、影響は大きいかと思います。
+演算子の挙動が変わるから
+演算子は文字列に対して使用した場合と数値に対して使用した場合で挙動が異なります。具体的に以下のコードを実行してみます。
Sub main()
Dim s1 As String
Dim s2 As String
s1 = "9000"
s2 = "500"
MsgBox s1 + s2
Dim i1 As Integer
Dim i2 As Integer
i1 = 9000
i2 = 500
MsgBox i1 + i2
End Sub
文字列の場合は、9000+500 が 9000500となり
数値の場合は、900+500が9500となります。
このように宣言された変数の型により挙動が異なるのですが、変数の宣言をしなかった場合はどうなるでしょうか。
格納されている値によって挙動が変わるという動きになります。つまり数値が格納されているのか文字列が格納されているのかを見極めなければ挙動がわからないということです。
変数に代入している箇所を全て洗わないと演算子の挙動がわからなくなるので、変数の型を宣言しておかないとバグの温床になりやすいです。
OptionExplictがないと「VBAProjectのコンパイル」ができないから
ブログのコメントで教えていただいたのですが、Dimをしっかりと宣言していてもOptionExplictがないと「VBAProjectのコンパイル」ができないようです。
コンパイルを行うことでそもそもコードがおかしい部分については自動でエラー検知してくれるので、大規模なプログラムや頻繁に改修するプログラムでは必須だと思います。
Option Explicitは自動で付与することができる
ここまで、Option Explicitをつけて置くべき理由について記載しました。
つけないことによるデメリットが大きすぎるので、必ずつけるべきだというのが僕の意見です。
それでは、このブログの筆者が必ずOption Explicitをつけているかと言うと正直忘れているときもあります。
(もちろん、仕事では意識してつけるようにしていますが。)
しかし、調べるとOption ExplicitはVBAのオプションで自動付与が出来るようでした。これを設定しておけば、設定忘れがないので安心ですね。
VBEから「ツール→オプション」を開く
「変数の宣言を強制する」にチェックを入れる
上記のチェックを入れておくと、モジュールを新規作成した際に自動でOption Explicitが記載されるようになります。
ここに書かれていることの多くは Dim 定義をすることのメリットのようです。
OptionExplict不要派 が Dimは一切用いないというわけではないと思いますが、Dimを一切使わないのを前提にしたような記事であり、
OptionExplict を設定することと、Dim定義の利便性について混ざった感じで話が飛躍しています。
OptionExplict不要派 が Dimを使用するしないはわからないととらえたうえで、OptionExplict 自体の良い点とDim定義の良い点をキッチリ分けて書くとよりロジカルになるのではないでしょうか。
コメントありがとうございます!!
確かに自分も以下のように考えて記事を作成しました。
Dimはメリットが多いので、お決まりで使うようにした方がいい→OptionExplictを設定した方がいい
ご指摘の通り、OptionExplictを使わなくてもDimは使用できるので「Dimは省略しない方が良いと思う理由」みたいな記事のタイトルでDimのメリットを紹介した後、その中でOptionExplictを紹介した方が混乱を招かなくてよかったですね。
> OptionExplict不要派 が Dimは一切用いないというわけではないと思いますが、
Dimを使っていようといまいと、OptionExplictがないと「VBAProjectのコンパイル」ができません。
これは論外だと思います。
すみません。ブログ最近確認していなかったもので、返信が完全に遅れてしまいました。
Dimでしっかり型宣言していても「VBAProjectのコンパイル」できないのですね。知らなかったので勉強になりました。
というかコンパイル自体あまりしてなかったのですが、正確なコードを書く上で実行した方が良いですね。ブログ本文でも紹介させてもらいました。