変数は有効な範囲があります。有効範囲は変数の宣言時に指定可能で3種類あります。
- プロシージャレベル(プロシージャの中だけで有効)
- プライベートレベル(モジュールの範囲でのみ有効)
- パブリックレベル(全てのデータベースモジュール範囲で有効)
プロシージャレベルの変数
プロシージャレベルの変数は下の「Sub test() ~ End Sub」のプロシージャの中だけで有効です。ここでしか使わないし・・・。的な変数はプロシージャレベルにしておきましょう。
1 2 3 4 5 6 7 |
Sub test() Dim i As Integer i = 1 Msgbox i End Sub |
変数の宣言は「Dim i As Integer」の部分で、この場合は「Sub test() ~ End Sub」の中で宣言されているので、プロシージャレベルの変数となります。
プライベートレベルの変数
こちらはプロシージャレベルの一つ上、モジュールレベルの範囲で有効になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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
1 2 3 |
Public Sub test3() i = i + "c" End Sub |
モジュール1の1行目のように「Public」を付けてプロシージャの外側で変数を宣言します。モジュール2には宣言がありませんが、この場合の変数「i」を扱えています。
ちなみにモジュール2のプロシージャに付いている「Public」はモジュール1からtest3のプロシージャを参照できるようにするためです。
プログラミング集中的に学びたい方向け

