変数は有効な範囲があります。有効範囲は変数の宣言時に指定可能で3種類あります。
- プロシージャレベル(プロシージャの中だけで有効)
- プライベートレベル(モジュールの範囲でのみ有効)
- パブリックレベル(全てのデータベースモジュール範囲で有効)
プロシージャレベルの変数
プロシージャレベルの変数は下の「Sub test() ~ End Sub」のプロシージャの中だけで有効です。ここでしか使わないし・・・。的な変数はプロシージャレベルにしておきましょう。
Sub test()
Dim i As Integer
i = 1
Msgbox i
End Sub
変数の宣言は「Dim i As Integer」の部分で、この場合は「Sub test() ~ End Sub」の中で宣言されているので、プロシージャレベルの変数となります。
プライベートレベルの変数
こちらはプロシージャレベルの一つ上、モジュールレベルの範囲で有効になります。
Private i As Integer
Dim j As Integer '←「Private」を省略した書き方'
Sub test1()
Call test2
Call test3
MsgBox i 'i = 11 になる'
End Sub
Sub test2()
i = 1
End Sub
Sub test3()
i = i + 10
End Sub
変数の宣言は「Private」を付けて「Sub test*() ~ End Sub」の外で宣言します。「Private」を省略して書いてもプロシージャの外であればプライベート変数として動作します。
ただしプロシージャの中に書いた場合はたとえ「Private」を付けてもプライベートレベルの変数として機能しません。「Dim i As Integer」で書いた場合は通常のプロシージャレベルの変数として機能します。
ここで言うモジュールは画像のようなプログラムを記述す場所の事です。今回宣言した変数はこのモジュール内でのみ有効です。
パブリックレベルの変数
パブリックレベルの変数はデータベースに使われているモジュール全てで有効になります。
モジュール1
Public i As Variant 'パブリックレベルでの宣言'
Sub test1()
i = "a"
Call test2
Call test3
MsgBox i ' iは「abc」となる'
End Sub
Sub test2()
i = i + "b"
End Sub
モジュール2
Public Sub test3()
i = i + "c"
End Sub
モジュール1の1行目のように「Public」を付けてプロシージャの外側で変数を宣言します。モジュール2には宣言がありませんが、この場合の変数「i」を扱えています。
ちなみにモジュール2のプロシージャに付いている「Public」はモジュール1からtest3のプロシージャを参照できるようにするためです。