で「参照と値の違いを体験できる学習用Excelシート(ボタン付き)」を作りましょう。
この説明では、初心者でも手順通りに進めるだけで再現できるように、
① シート構成 → ② ボタン配置 → ③ VBAコード → ④ 実行の流れ
の順に説明します。
① シート構成
新しいExcelファイルを作って、名前を「参照と値の違い_練習.xlsm」として保存してください。
マクロ有効ブック(.xlsm)であることがポイントです。
シート名:Sheet1
| セル | 内容 |
|---|---|
| A1 | 🔷 値型(Value Type)テスト |
| A2 | a = |
| A3 | b = |
| A5 | 🔷 参照型(Reference Type)テスト(Range) |
| B6 | ← B列に結果を表示します |
| A7 | r1 = |
| A8 | r2 = |
② ボタンを配置
- Excelのメニューから「開発タブ」→「挿入」→「フォームコントロールのボタン」を選択
- シート上にボタンを2つ配置
- それぞれ次のマクロを割り当てます👇
| ボタンの名前 | 割り当てるマクロ |
|---|---|
| 🔘 値型をテスト | TestValueType |
| 🔘 参照型をテスト | TestReferenceType |
③ モジュールコード(コピーして貼るだけ)
- VBAエディタを開く(
Alt + F11) - 「挿入 → 標準モジュール」
- 以下のコードをそのまま貼り付けてください👇
'---------------------------------------
' 📘 学習用:参照と値の違いデモ
'---------------------------------------
Option Explicit
'=== 値型(Value Type)のテスト ===
Sub TestValueType()
Dim a As Long
Dim b As Long
' 値の代入
a = 10
b = a ' ← 値をコピー(独立)
' bを変更
b = 20
' 結果をシートに表示
With ThisWorkbook.Sheets("Sheet1")
.Range("B2").Value = a
.Range("B3").Value = b
End With
MsgBox "値型は“値そのもの”をコピーします。" & vbCrLf & _
"bを変えてもaには影響しません。", vbInformation
End Sub
'=== 参照型(Reference Type)のテスト ===
Sub TestReferenceType()
Dim r1 As Range
Dim r2 As Range
' まずセルをクリア
With ThisWorkbook.Sheets("Sheet1")
.Range("B7:B8").ClearContents
End With
' 参照を代入
Set r1 = ThisWorkbook.Sheets("Sheet1").Range("B7")
Set r2 = r1 ' ← 同じ場所を指す
' 値を設定
r1.Value = "りんご"
r2.Value = "バナナ"
' 結果を表示
With ThisWorkbook.Sheets("Sheet1")
.Range("B8").Value = "(r1とr2は同じセルを指している)"
End With
MsgBox "参照型は“同じ実体”を共有します。" & vbCrLf & _
"r2を変更するとr1にも反映されます。", vbInformation
End Sub
VB④ 実行の流れ(体験手順)
- [値型をテスト] ボタンをクリック
→ A2とA3の横(B列)に「a=10」「b=20」と表示
→bを変えてもaには影響しないことが分かります。 - [参照型をテスト] ボタンをクリック
→ B7セルに「バナナ」と表示(最初はりんごだったのに上書き)
→r1とr2が同じセルを指していることがわかります。
⑤ 図解での理解補助(テキスト)
┌────────┐
│ 値型(コピー)│
└────────┘
a ─ [10]
b ─ [20] ← 独立!
┌────────┐
│ 参照型(共有)│
└────────┘
r1 ─┐
├─→ B7セル(バナナ)
r2 ─┘
応用練習(理解チェック)
以下を自分で追記してみましょう。
1️⃣ Set r2 = r1 の行をコメントアウト(’で無効化)
2️⃣ 再実行すると…
→ r2がNothingなので、r2.Value = "バナナ"でエラー91発生!
→ 「Setで参照を設定しないと使えない」ことを体験できます。
⑦ まとめ
| ポイント | 内容 |
|---|---|
| 値型 | 値そのものをコピー(独立) |
| 参照型 | 実体(オブジェクト)を共有(同じものを指す) |
| Set必須 | オブジェクト参照を代入するときは必ずSet |
| Nothing | どのオブジェクトも指していない状態(エラー91の原因) |

