「スコープ(変数の有効範囲)」の動作を体感できる例コード+注意点付き解説をまとめます。
1. ローカル変数(プロシージャ内だけ有効)
コード例
Sub Sample1()
Dim num As Integer
num = 10
MsgBox "Sample1 の num = " & num
End Sub
Sub Sample2()
MsgBox "Sample2 の num = " & num ' ←ここでエラー!
End Sub
VBポイント
Dim num As Integerは Sample1 の中だけ で使える。Sample2からはnumが存在しないため、「変数が定義されていません」というエラーが出る。- つまり、同じ名前でも別の Sub では見えない。
注意
別のプロシージャでも同じ名前の変数を宣言すれば使えるが、それぞれ完全に別物。
Sub Sample3()
Dim num As Integer
num = 100
MsgBox "Sample3 の num = " & num
End Sub
VB→ Sample1 の num(10)と Sample3 の num(100)は、同じ名前でも全く別の変数。
2. モジュールレベル変数(同じモジュール内で共有)
コード例
Dim num As Integer ' ←モジュールの先頭(Subの外)で宣言!
Sub Sample4()
num = 10
MsgBox "Sample4 の num = " & num
End Sub
Sub Sample5()
num = num + 5
MsgBox "Sample5 の num = " & num
End Sub
VBポイント
- モジュールの上で宣言すると、そのモジュール内のすべてのSubから見える。
Sample4→Sample5の順で実行すると:Sample4実行後 → num = 10Sample5実行時 → num = 15(前回の値を引き継いでいる)
注意:値が残る!
- モジュール変数は、Excelを閉じるまで値が保持される(Subを抜けても消えない)。
- 意図せず前回の値を引きずることがあり、バグの原因になりやすい。
3. ローカル変数とモジュール変数が同名の場合
コード例
Dim num As Integer ' モジュールレベル変数
Sub Sample6()
Dim num As Integer ' ←ローカル変数で上書き!
num = 50
MsgBox "Sample6 のローカル num = " & num
End Sub
Sub Sample7()
MsgBox "Sample7 のモジュール num = " & num
End Sub
VBポイント
Sample6内で再度Dim numと宣言したため、モジュール変数とは別扱い。- 結果:
Sample6→ 50(ローカル変数)Sample7→ 0(モジュール変数、初期値のまま)
同名でもローカルが優先される!
4. モジュール変数を他のモジュールでも使いたい場合(Public変数)
コード例
'--- Module1 ---
Public countNum As Integer
Sub SetCount()
countNum = 5
End Sub
VB'--- Module2 ---
Sub ShowCount()
MsgBox countNum ' Module1 の変数を参照できる!
End Sub
VBポイント
Publicにすると、全モジュール・全プロシージャで共有可能。- ただし、複数モジュールで
Public名が衝突すると大混乱するため注意。
よくある落とし穴
| 落とし穴 | 原因 | 回避法 |
|---|---|---|
| 「変数が定義されていません」エラー | スコープ外からアクセスしている | 宣言位置を確認 or 引数で受け渡す |
| 値が残り続けて予期せぬ動作 | モジュール変数が Sub 終了後も生きている | 必要なら明示的に初期化 |
| 同じ名前の変数で上書き混乱 | ローカルとモジュールで同名宣言 | 命名規則(例:mNum や gCount)を設ける |
練習のすすめ
簡単な練習手順:
- Excelを開く
Alt + F11でVBEを開く挿入 → 標準モジュール- 上記の各コードを貼り付けて、1つずつ実行(
F5キー) - どの変数がエラーになるか/値が引き継がれるかを確認
まとめ
| 宣言場所 | 有効範囲 | キーワード | 代表的な使い道 |
|---|---|---|---|
| プロシージャ内 | そのSub/Function内のみ | Dim | 一時的な値 |
| モジュール内 | そのモジュール全体 | Dim | モジュール間共有データ |
| 全モジュール | 全プロジェクト | Public | グローバル設定値など |

