目次

Option Explicit ステートメント

今回の投稿は、 ExcelVBA で変数の宣言を強制したい場合のマクロの作成方法を書いています。具体的には、 Option Explicit ステートメントを一文書くことで、変数の宣言を必須にすることができます。 Explicit の英語の意味をインターネットの辞書で調べてみますと「明示的」という意味になるようです。

コンパイルエラー 変数が宣言されていません。
コンパイルエラー 変数が宣言されていません。

目次まで戻る

宣言を強制する前

下記のマクロのコードは、 Option Explicit ステートメントを記述する前のものです。

Option Explicit ステートメントを記述する前のマクロです。
Option Explicit ステートメントを記述する前のマクロです。
Sub メッセージボックスを表示するマクロ()

a = "ABC"

MsgBox a

End Sub

上記マクロを実行してみると、エラーが発生することなくダイアログボックスにメッセージが表示されました。

エラーが発生していない。
エラーが発生していない。

目次まで戻る

宣言を強制した後

次は、 Option Explicit ステートメントを記述した後のマクロを見てみます。「Sub」よりも前に「Option Explicit」の記述を追加しています。変数の宣言を強制している状態になっています。

Option Explicit ステートメントを記述した後のマクロです。
Option Explicit ステートメントを記述した後のマクロです。
Option Explicit

Sub メッセージボックスを表示するマクロ()

a = "ABC"

MsgBox a

End Sub

上のマクロを実行すると、「コンパイルエラー 変数が宣言されていません。」とエラーメッセージが表示されます。変数の宣言が強制されている状態で、変数「a」の宣言を行っていないのでエラーが発生しているようです。

変数を宣言していないので、エラーが発生しています。
変数を宣言していないので、エラーが発生しています。

マクロを修正してみることにします。変数「a」の宣言を行ってみます。

Option Explicit

Sub メッセージボックスを表示するマクロ()

Dim a As String '変数「a」の宣言を行ってみます。

a = "ABC"

MsgBox a

End Sub

上のマクロを実行すると、エラーは発生せず、ダイアログボックスが表示されました。

エラーが発生せず、ダイアログボックスが表示されました。
エラーが発生せず、ダイアログボックスが表示されました。

目次まで戻る

Option Explicit を書く場所

Option Explicit ステートメントを書く場所は、「Sub ... End Sub」「Function ... End Function」よりも前になります。私の場合は、先頭の方に書いていることが多いです。

Sub プロシージャ、 Function プロシージャよりも前に記述する。
Sub プロシージャ、 Function プロシージャよりも前に記述する。
Option Explicit

'subプロシージャよりも前
Sub メッセージボックスを表示するマクロ()

Dim a As String

a = fx1("ABC")

MsgBox a

End Sub

'Function プロシージャよりも前
Function fx1(a As String)

fx1 = a & a

End Function

Option Explicit ステートメントをモジュールの先頭に書いておくと、そのモジュール内で変数の宣言が強制される状態になるようです。

「Module1」に「Option Explicit」と記述してあっても、「Module2」「Module3」では、変数の宣言が強制にならないようです。

モジュール単位で変数の宣言が強制される。
モジュール単位で変数の宣言が強制される。

目次まで戻る

テスト環境

  • Windows 10
  • Microsoft Office Excel 2003

目次まで戻る

あとがき

変数の宣言を必須にしておくと、宣言済みの変数の値を間違って上書きしてしまって、マクロの動作結果が変わってしまう等のミスを少なくできる気がします。

私の場合は、マクロのコードが長めになってきた時、変数の数が多めになった時に、 Option Explicit ステートメントを使用しています。

以上閲覧ありがとうございました。

目次まで戻る

同じカテゴリの投稿(Excel VBA)

前後の投稿