「参照と値の違い」図解をそのまま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
VB3. シート側の設定
- 新しいシートを作り、名前を
Lesson_Setに変更。 - 上に3つのボタンを配置します(挿入 → フォームコントロール → ボタン)
| ボタンの表示名 | 割り当てマクロ |
|---|---|
| Setありで実行 | Run_WithSet |
| Setなしで実行 | Run_WithoutSet |
| リセット | ResetLesson |
- 初期状態に戻すには、
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ブロックを使って参照操作を練習するステップに拡張
