Excel VBA | 定数の定義 練習用 Excel ファイル を作る

Excel VBA VBA
スポンサーリンク

では、「定数のスコープ」を学ぶための 学習支援モード付きインタラクティブVBA教材 を作りましょう。
ここでは、
🟢 範囲をクリックすると → 自動でハイライト+説明が出る
🟣 モジュール定義/プロシージャ定義ごとにスコープが色で可視化される
仕組みを Worksheet_SelectionChange イベントで実装します。


学習支援版:定数のスコープ可視化マクロ

手順

  1. 新しいExcelファイルを開く
  2. 開発タブ → Visual Basic を開く
  3. Sheet1 モジュールに以下を貼り付け
  4. シート上に「コード例」と「説明欄」を用意(下に配置例あり)

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📘「定数スコープ学習モード」タイトル
B2Const TAX_GLOBAL As Double = 0.1紫ゾーン(モジュールレベル)
B4:B8Sub Proc_Local()Const TAX_LOCAL緑ゾーン(ローカル定数)
B10:B12Sub Proc_Global()赤ゾーン(他プロシージャ)
D3💬説明表示欄SelectionChangeで更新される

注意ポイント

  • Constは定義と同時に値を代入する必要がある。
    途中で値を変更しようとすると「定数は代入できません」エラー。
  • 同じ名前の定数をモジュール内とSub内で定義した場合、
    Sub内の定義が優先(スコープのシャドーイング)。
  • SelectionChangeで大量セルを選択すると処理が重くなるため、
    範囲を限定して使うのがおすすめ。

応用アイデア

  • 説明欄を 吹き出しのようにポップアップ表示MsgBox 版)
  • 定数の値を自動表示して「どこで見えるか」デモ
  • 「Public Const」も追加して他モジュールとの違いを確認できる発展版

どちらを次に作りましょうか?

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました