当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

【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 はコードの品質を向上させるために有用なツールです。最終的にはチーム全体での方針を決める必要がありますね。
 
高橋さん: そうですね、チームの方針とプロジェクトの要件に応じて使い分けることが大切なんですね。しっかり考えてみます。

コメント

  1. あとりえこばと より:

    [ChatGPT] Option Explicitステートメントは、VBAコードで宣言されていない変数の使用を禁止するための指示です。つまり、Option Explicitステートメントがない場合、VBAは未宣言の変数を自動的に作成し、その値を格納します。これにより、意図しない結果やエラーが発生する可能性があります。Option Explicitステートメントを使用すると、コード内で使用する変数を明示的に宣言する必要があります。これにより、タイプミスや変数名の間違いなどのエラーを防ぐことができます。また、コードの可読性も向上します。したがって、Option Explicitステートメントは、VBAコードの先頭に配置することが推奨される必須の要素です。

  2. あとりえこばと より:

    【AI連載小説】生田目次郎のエクセル奮闘記(11)
    「変数宣言は大切です」
     
    ある日、次郎はVBAの学習を進め、変数宣言の正しい方法を学ぶことにしました。彼はオンラインのVBAのリファレンスを参照し、変数宣言の重要性に気づいていました。そこで、同僚の京子にアドバイスを求めることにしました。
    「京子さん、VBAで変数を宣言するってどうすればいいんですか?」
    「変数宣言ですね。それはVBAで重要な一歩です。変数を使うと、データを保持できるし、コードの理解や保守がしやすくなります」
    「でも、どうやって宣言すればいいか分からないんです」
    「まず、変数を宣言するには Dim(Dimensionの略)を使います。例えば、数値を格納する変数を宣言するときは、こんな感じです。」

    Dim myNumber As Integer

    京子はエクセルを開き、VBAエディタを起動しました。
    「これで myNumber という変数が整数型として宣言されます。また、倍精度浮動小数点数を使いたい場合は、Double型を使います」

    Dim myDouble As Double
    

    「なるほど、Dim で始めて、変数名と型を指定するんですね」
    「そうです。型は変数に格納するデータの種類を指定します。整数、小数、文字列など、適切な型を選ぶことが重要です」
    「分かりました。これで変数宣言の基本がわかりました」

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