Excel VBA | 「参照と値の違い」図解をそのままExcel上で体感できるインタラクティブ学習モード付きのマクロファイルを作る

Excel VBA VBA
スポンサーリンク

「参照と値の違い」図解をそのままExcel上で体感できる
インタラクティブ学習モード付きのマクロを作ります。

インタラクティブ学習シート「Setの意味を体験しよう」

このサンプルでは、ボタンを押して「Setあり」「Setなし」の挙動を比較できます。
VBAの初心者が“参照を渡す”とはどういうことかを感覚的に理解できるように設計しています。


1. ファイル構成(練習用)

要素内容
シート名Lesson_Set
ボタン①「Setありで実行」
ボタン②「Setなしで実行」
ボタン③「リセット」
説明エリアA1~B10あたりに解説文が表示される

2. モジュールコード(そのまま貼り付けOK)

1️⃣ VBAエディタを開く(Alt + F11)
2️⃣ 標準モジュール(Module1)に以下を貼り付け

Option Explicit

'==============================
' Excel VBA学習モード:Set体験シート
'==============================

Sub InitLesson()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Lesson_Set")
    
    ws.Cells.Clear
    ws.Range("A1").Value = "🔰 VBA学習モード:Setの意味を体験しよう"
    ws.Range("A2").Value = "下のボタンで「Setあり」「Setなし」を比較します。"
    ws.Range("A3").Value = "・Setあり:Rangeオブジェクトを正しく参照"
    ws.Range("A4").Value = "・Setなし:値代入として扱われ、エラー発生"
    
    ws.Range("A6").Value = "セルの初期化 →"
    ws.Range("B6").Value = ""
    ws.Range("B7").Value = ""
    
    ws.Range("A9").Value = "結果表示エリア:"
    ws.Range("B9").Value = ""
    
    ws.Range("A1:A9").Font.Bold = True
    ws.Columns("A:B").AutoFit
    
    MsgBox "準備完了!" & vbCrLf & _
           "「Setあり」「Setなし」ボタンを押して違いを見てみましょう。", vbInformation
End Sub

'------------------------------
' Setあり:正しく参照を渡す
'------------------------------
Sub Run_WithSet()
    Dim ws As Worksheet
    Dim r1 As Range
    Dim r2 As Range
    
    Set ws = ThisWorkbook.Worksheets("Lesson_Set")
    ws.Range("B9").Value = ""
    
    Set r1 = ws.Range("B6")
    r1.Value = "Original"
    
    ' Setで同じ場所を参照
    Set r2 = r1
    r2.Value = "Changed via r2"
    
    ws.Range("B9").Value = "✅ 成功:r1もr2も同じセルを指している!"
    ws.Range("B9").Font.Color = vbBlue
End Sub

'------------------------------
' Setなし:エラー発生パターン
'------------------------------
Sub Run_WithoutSet()
    Dim ws As Worksheet
    Dim r1 As Range
    Dim r2 As Range
    
    Set ws = ThisWorkbook.Worksheets("Lesson_Set")
    ws.Range("B9").Value = ""
    
    Set r1 = ws.Range("B7")
    r1.Value = "Original"
    
    On Error Resume Next
    r2 = r1   ' ❌ Setなし → 値代入として解釈される
    If Err.Number <> 0 Then
        ws.Range("B9").Value = "⚠ エラー発生!Setが必要です。"
        ws.Range("B9").Font.Color = vbRed
        Err.Clear
        Exit Sub
    End If
    
    ws.Range("B9").Value = "(なぜか通ってしまいました)"
End Sub

'------------------------------
' リセット(初期化)
'------------------------------
Sub ResetLesson()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Lesson_Set")
    ws.Range("B6:B9").ClearContents
    ws.Range("B9").Font.Color = vbBlack
End Sub
VB

3. シート側の設定

  1. 新しいシートを作り、名前を Lesson_Set に変更。
  2. 上に3つのボタンを配置します(挿入 → フォームコントロール → ボタン)
ボタンの表示名割り当てマクロ
Setありで実行Run_WithSet
Setなしで実行Run_WithoutSet
リセットResetLesson
  1. 初期状態に戻すには、InitLesson マクロを実行します(最初の1回だけ)。

4. 体験の流れ

操作結果学べること
「InitLesson」実行説明付きシートが整う準備完了
「Setありで実行」B6のセルに“Changed via r2”が表示同じセルを参照している
「Setなしで実行」エラー!⚠ 「Setが必要です」表示値代入扱いで失敗
「リセット」表示をクリア再挑戦OK

5. 学習ポイントを視覚で理解

Setあり:
 r1 → [B6]
 r2 → [B6]
 (同じ場所を見ている)

Setなし:
 r1 → [B7]
 r2 = r1 ← “値をコピーしようとして失敗”

拡張アイデア(発展練習用)

  • Setあり・なしのときに「矢印を色付き図形で描く」演出を追加
  • Nothing のときにセルの枠線を灰色に変える
  • With ブロックを使って参照操作を練習するステップに拡張

タイトルとURLをコピーしました