変数とスコープ
2020年7月2日
VBAに限らずプログラミングで扱う変数はとても重要です。
変数が扱えないとプログラミングできないでしょう ^^;
変数は文字通り変化する値を格納する入れ物で、「スコープ(Scope)=適用範囲」があります。
ややこしいですが、シートをまたいだ処理やプロシージャ(Procedure)間で変数を使いまわしたい時、あるいはプロシージャ内だけの処理などScopeを正しく理解する必要があります。
かく云う私もこの辺の理解はしばしば混同し、期待しない結果で悩むことがあります。
Dimステートメントの例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub exeTestDIM() Call TestDIM_01 Call TestDIM_02 End Sub Sub TestDIM_01() Dim NUM As Long NUM = 100 MsgBox NUM End Sub Sub TestDIM_02() MsgBox NUM End Sub |
exeTestDIMの実行結果


プロシージャの中で宣言されたDimステートメントは、そのプロシージャの中だけで有効です。これがスコープの範囲です。
上記では、TestDIM_01()の中で NUMを宣言しているので、TestDIM_02で参照しようとしても値がありません。(当たり前ですが)
ちなみにSub TestDIM_02()の中で使用しているNUMはあながち間違いではなく、Dimは省略できるのでTestDIM_02の中では成立しています。
|
1 2 3 4 |
Sub TestDIM_02() Dim NUM As Variant MsgBox NUM End Sub |
と同じ解釈です。
同じModuleの中で変数を共有したい
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Private NUM As Long Sub exeTestDIM() Call TestDIM_01 Call TestDIM_02 End Sub Sub TestDIM_01() 'Dim NUM As Long NUM = 100 MsgBox "TestDIM_01の値は " & NUM & " です。" End Sub Sub TestDIM_02() MsgBox "TestDIM_02の値は " & NUM & " です。" End Sub |
実行結果


得たかった結果はこんな感じでしょうか?
変数の扱いは他にも
・Static
・Public
など覚えておくことがあります。(別述)
※プロシージャの外で宣言する場合は、Privateステートメントで宣言するとの表現があるようですが、Dimでも Privateでも結果は同じです。
私には使い分けがわかりません ^^;
Dimは歴史的な使い方との意見や、省略形だとの意見もあるようですが・・・
また単純な変数をModule内で単独に使うことはあまり無いかと思います、値を保持する静的変数Staticとの組み合わせで使う場面があるでしょう。