【VBA】Option Explicitはつけるべきか?→結論:つけるべきだと思う

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型は、どんな値でも入れられるようになっているのでメモリの使用量が大きいです。具体的には下記のようになっているようです。

Long4バイト
Date8バイト
Integer2バイト
Variant16バイト
Double8バイト

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となります。

このように宣言された変数の型により挙動が異なるのですが、変数の宣言をしなかった場合はどうなるでしょうか。

格納されている値によって挙動が変わるという動きになります。つまり数値が格納されているのか文字列が格納されているのかを見極めなければ挙動がわからないということです。

変数に代入している箇所を全て洗わないと演算子の挙動がわからなくなるので、変数の型を宣言しておかないとバグの温床になりやすいです。

Option Explicitは自動で付与することができる

ここまで、Option Explicitをつけて置くべき理由について記載しました。

つけないことによるデメリットが大きすぎるので、必ずつけるべきだというのが僕の意見です。

それでは、このブログの筆者が必ずOption Explicitをつけているかと言うと正直忘れているときもあります。

(もちろん、仕事では意識してつけるようにしていますが。)

しかし、調べるとOption ExplicitはVBAのオプションで自動付与が出来るようでした。これを設定しておけば、設定忘れがないので安心ですね。

VBEから「ツール→オプション」を開く

「変数の宣言を強制する」にチェックを入れる

上記のチェックを入れておくと、モジュールを新規作成した際に自動でOption Explicitが記載されるようになります。


コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)