では、「定数のスコープ」を学ぶための 学習支援モード付きインタラクティブVBA教材 を作りましょう。
ここでは、
🟢 範囲をクリックすると → 自動でハイライト+説明が出る
🟣 モジュール定義/プロシージャ定義ごとにスコープが色で可視化される
仕組みを Worksheet_SelectionChange イベントで実装します。
学習支援版:定数のスコープ可視化マクロ
手順
- 新しいExcelファイルを開く
- 開発タブ → Visual Basic を開く
Sheet1モジュールに以下を貼り付け- シート上に「コード例」と「説明欄」を用意(下に配置例あり)
Sheet1(コード)
Option Explicit
'--- 定数の定義スコープ ---
Const TAX_GLOBAL As Double = 0.1 ' モジュール全体で使える(紫)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim msg As String
' すべてのセルの色をリセット
Cells.Interior.ColorIndex = xlNone
' 範囲ごとに判定してハイライト+説明表示
Select Case True
' モジュールレベル定数
Case Not Intersect(Target, Range("B2")) Is Nothing
Range("B2").Interior.Color = RGB(190, 170, 255)
msg = "🟣 モジュールレベル定数: " & vbCrLf & _
"Const TAX_GLOBAL As Double = 0.1" & vbCrLf & _
"→ この定数は同じモジュール内のすべてのプロシージャで使用可能。"
' プロシージャ内の定数
Case Not Intersect(Target, Range("B4:B8")) Is Nothing
Range("B4:B8").Interior.Color = RGB(170, 255, 170)
msg = "🟢 プロシージャ内定数: " & vbCrLf & _
"Const TAX_LOCAL As Double = 0.08" & vbCrLf & _
"→ この定数は Sub 内でしか使えない。別のプロシージャでは未定義扱い。"
' 他プロシージャ(スコープ外)
Case Not Intersect(Target, Range("B10:B12")) Is Nothing
Range("B10:B12").Interior.Color = RGB(255, 200, 200)
msg = "🔴 この範囲では TAX_LOCAL は使えない!" & vbCrLf & _
"プロシージャ外(または別プロシージャ)では参照できず、" & _
"「未定義エラー」になる。"
' デフォルト
Case Else
msg = "セルをクリックするとスコープごとの説明が表示されます。"
End Select
' 説明欄に表示
Range("D3").Value = msg
End Sub
'=== 各プロシージャ(説明用) ===
Sub Proc_Local()
Const TAX_LOCAL As Double = 0.08
Range("B4").Value = "TAX_LOCAL を使用: " & (100 * (1 + TAX_LOCAL))
End Sub
Sub Proc_Global()
Range("B10").Value = "TAX_GLOBAL を使用: " & (100 * (1 + TAX_GLOBAL))
End Sub
VBシート構成(例)
| セル | 内容 | 補足 |
|---|---|---|
| B1 | 📘「定数スコープ学習モード」 | タイトル |
| B2 | Const TAX_GLOBAL As Double = 0.1 | 紫ゾーン(モジュールレベル) |
| B4:B8 | Sub Proc_Local() ~ Const TAX_LOCAL | 緑ゾーン(ローカル定数) |
| B10:B12 | Sub Proc_Global() ~ | 赤ゾーン(他プロシージャ) |
| D3 | 💬説明表示欄 | SelectionChangeで更新される |
注意ポイント
- Constは定義と同時に値を代入する必要がある。
途中で値を変更しようとすると「定数は代入できません」エラー。 - 同じ名前の定数をモジュール内とSub内で定義した場合、
Sub内の定義が優先(スコープのシャドーイング)。 - SelectionChangeで大量セルを選択すると処理が重くなるため、
範囲を限定して使うのがおすすめ。
応用アイデア
- 説明欄を 吹き出しのようにポップアップ表示(
MsgBox版) - 定数の値を自動表示して「どこで見えるか」デモ
- 「Public Const」も追加して他モジュールとの違いを確認できる発展版
どちらを次に作りましょうか?

