スポンサーリンク
下記のエラーがVBAに表示されることがあります。
「コンパイルエラー:変数が定義されていません。」
このとき、次のようなことがエラーの原因として考えられます。
- 変数を定義していない。
- 定義した変数がスコープの範囲外になっている。
- 変数を使用するコードより、下の位置でその変数を定義している。
今回は変数の定義をスコープの範囲内で設定しているのに、エラーが起きた場合の対処方法をご紹介します。
なお、この記事で紹介するのは「Option Explicit」の記載がある場合についてであることを、あらかじめご了承下さい。
スポンサーリンク
最終手段!「Option Explicit」を消す
あまりおすすめはできませんが、「Option Explicit」を消すという方法があります。この方法は根本的な解決にはならないので、エラーが表示されたからといってすぐに「Option Explicit」を消すのは良くありません。最終手段にすると良いでしょう。
しかし、一方、お仕事でプログラムを作成している人には、「Option Explicit」の記述ありのプログラムは変数の定義が必須なため、「Option Explicit」の記述がないプログラムに比べて定型化されたプログラムになることから好まれている方法でもあります。
では、何故この方法が一般的にはあまりおすすめできないのか疑問に思われる方もいると思います。
続いて「Option Explicit」についてお話しますので、そちらも読んで頂けると「Option Explicit」を消すという対処方法のメリット・デメリットをご理解頂けると思います。
「Option Explicit」について
「Option Explicit」を記載すると、「変数の宣言を強制させる」ことができるようになります。
「Option Explicit」が記載されている場合、変数の宣言が行われていないとVBAがエラーとして通知してくれます。逆に「Option Explicit」を記載していない場合、変数の宣言をしなくても良くなるので、変数にはどんな型のデータも入れられるようになります。
つまり、「Option Explicit」を記載するということは、変数を強制して決まった型のデータしか入れられないようにするということなので、プログラムがより安定した作りになり信頼性が増すということが言えます。もちろん、プログラムのコード数が短くなったり、短時間でプログラムを作成できたり、緩いプログラムになるためどのPCでも動作可能になったりするなど、「Option Explicit」を記載しないことで得られるメリットもあります。
先ほどお話したように、お仕事の都合上、あえて「Option Explicit」を記載しないという人もいます。作成するプログラムの用途によって、記載するのか、しないのか検討して下さい。
なお、「Option Explicit」を記載したプログラムを作成したい人へは、VBA画面の「ツール」→「オプション」→「編集」タブの「コード設定」から「変数の宣言を強制する」にチェックを入れておくことをおすすめします。そうすることでプログラムを作成する際、初めから「Option Explicit」が記載されるので便利です。
ここまで「Option Explicit」についてお話してきましたが、当サイトは、プログラムを作成したい皆さんにわかりやすく伝えることや、新しい発見・提案を一早く皆さんお知らせすることを目的としているため、例示しているプログラム上であえて「Option Explicit」を記述していないことがあります。「Option Explicit」が記載されていないからと言って安定性の低いプログラムをご紹介しているわけではありません。当サイトで例示しているプログラムはどれも動作の安全性を十分考慮して作られているので、安心して皆さんに参考にして頂けたらと思います。
スポンサーリンク
具体的なエラー例
伝えるのが難しいのでサンプルプログラムを見ながら説明します。
下記のプログラム1、プログラム2でJob1を実行するとエラーはなく、メッセージボックスがポップアップされ「3」と表示されます。
しかし、プログラム3でJob1を実行するとエラーが表示され、コード内の変数「b」が黄色で表示されます。エラー文面では「『b』が変数定義していないから設定しなさい」ですが、実際、bはグローバル変数として定義しています。
'【Module1】
Option Explicit
Sub Job1()
Dim a As Integer
Dim b As Integer
Dim c As Integer
a = 1
b = 2
c = a + b
MsgBox c
End Sub
'【Module1】
Option Explicit
Sub Job1()
Dim c As Integer
c = a + b
MsgBox c
End Sub
'【Module2】
Option Explicit
Public Const a = 1
Public Const b = 2
'【Module1】
Option Explicit
Sub Job1()
Dim c As Integer
c = a + b
MsgBox c
End Sub
'【Module2】
Option Explicit
Public Const a = 1
Public Sub Job1_Partner()
Dim d As Integer
d = 0
End Sub
Public Const b = 2
▼プログラム3でJob1を実行した際に表示されるエラー
▼プログラム3でModule2を実行した際に表示されるエラー
プログラム3でJob1でエラーが発生する時に「Module2」を実行すると、下記エラーが発生します。
「コンパイルエラー:End Sub,End FunctionまたはEnd Property 以降には、コメントのみが記述できます。」
スポンサーリンク
原因と対処方法
実は、エラー発生直後VBA画面で黄色に表示されていたコードが、エラーの原因のヒントになっています。
プログラム3に表示されたエラーは、「Module2」を下記のように変更することで表示されなくなります。このことから、SubやFunctionの関数より下の位置で変数の定義をしていたことがエラーの原因となっていたとわかります。なので、同様のエラーが起きたときはSubやFunctionの関数より上の位置で変数定義しているか確認してみて下さい。このようなエラーを起こさないよう、特にグローバル変数やその配列を作成する際には気を付けましょう。
'【Module2】
Option Explicit
Public Const a = 1
Public Const b = 2
Public Sub Job1_Partner()
Dim d As Integer
d = 0
End Sub
最後までお付き合いいただきありがとうございます!
この情報が誰かの役にたてれば幸いです。