VBAテクニック集 VBA一覧 オブジェクト変数 文法・構文

【VBA】Setとは?オブジェクト変数の基本と参照の仕組み|初心者が必ず押さえるべき基礎文法

VBAを勉強していると必ず登場するキーワードが「Set」です。しかし、初心者の段階では「なぜ Set を使うのか?」「普通の変数代入と何が違うのか?」が分からず混乱してしまうことがあります。特に、ChatGPT でコードを生成したり、業務でVBAを使って自動化を始めた人にとっては、Set と Nothing の扱いが不明確なまま進めてしまい、後々エラーの原因になるケースが少なくありません。

実務では、Range・Worksheet・Workbook など、あらゆるオブジェクトを変数に代入するために Set を使う必要があります。Set を正しく理解することは、VBAの基礎から応用までスムーズに進むためにも重要です。この記事では、Set の意味、使い方、参照型のしくみ、よくあるエラー、初心者がつまずきやすいポイント、さらに ChatGPT を活用したコード生成との相性まで、丁寧に解説していきます。

目次

✅ Setとは?オブジェクトに参照を代入するためのVBAの基本構文

・Set の役割と基本定義

VBAの「Set」とは、
オブジェクトを変数へ“参照として”代入するために使うキーワード です。

値型の代入(数値・文字列など)には使いませんが、
Range・Worksheet・Workbook など オブジェクト型のデータ を扱うときには必ず必要になります。

基本構文は以下のとおりです。

Set 変数名 = オブジェクト

例:

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("集計")

このように、Set を使うことで ws という変数に Sheet オブジェクトの「参照」を渡しています。


・値の代入との違い(Set が必要な理由)

以下のコードを見てください。

Dim x As Long
x = 10

これは 値型 の代入で、Set は不要です。

一方、以下は オブジェクト型 の代入です。

Dim r As Range
Set r = Range("A1")

Set を省略すると “オブジェクトを値として代入しようとした” と判断され、VBAはエラーを返します。


・Set が必要なのは「参照型」であるため

オブジェクトを変数に代入する場合、その変数が保持するのは 値ではなく参照(アドレス) です。

Excelで言えば:

  • Range(“A1”) というオブジェクトそのもの
    ではなく
  • 「A1セルという場所を指す情報」

を変数に持たせているイメージです。

これが Set が必要な理由です。


✅ 値型と参照型の違い|なぜSetが必要になるのか

・値型(Value Type)

  • Long
  • Integer
  • Double
  • String
  • Boolean
  • Date

これらは代入時に「値そのもの」がコピーされます。


・参照型(Reference Type / Object Type)

  • Range
  • Worksheet
  • Workbook
  • Chart
  • Collection
  • Dictionary
  • FileSystemObject

これらは「実体そのもの」ではなく「場所の参照」を変数に持たせます。


・値型と参照型の違いを具体例で理解する

値型(Set 不要)

Dim a As Long
Dim b As Long

a = 10
b = a ' ← 値がコピーされる

この場合 b を変更しても a は変わりません。


参照型(Set 必須)

Dim r1 As Range
Dim r2 As Range

Set r1 = Range("A1")
Set r2 = r1 ' ← 同じセルを指す参照がコピーされる

この場合 r2 の値を変更すると、r1 が参照するセルも同時に変わります。


・「参照」は2つの変数が同じものを指す可能性がある

Set r1 = Range("A1")
Set r2 = r1

この関係を知らずに操作をすると、意図しないセルの書き換えが起こることがあります。

Set の理解は「何を指しているのか」を把握するために不可欠です。


✅ Set の実務的な使いどころ(必ず役立つ場面)

・頻繁に使用するオブジェクトを変数化して読みやすいコードにしたい時

Set ws = Worksheets("売上")
Set r = ws.Range("A1")

このようにオブジェクトを変数にすることでコードを短くし、保守性も高まります。


・複雑な処理で同じオブジェクトを繰り返し参照する場合

Set target = ws.Range("A1:F1000")
target.Sort ...
target.ClearContents

大きいデータ範囲を何度も使う処理では Set が必須。


・ブック/シートを複数扱う場合の整理

Set wb = Workbooks("月次報告.xlsx")
Set ws = wb.Sheets("集計")

実務で最も重要なパターンです。


・FileSystemObject など外部オブジェクトを使う場合

Set を理解していないと FSO や Dictionary が扱えません。

参考:【VBA】ByVal と ByRef の違いと使い方




✅ Set の使い方(基本〜応用)

・基本:オブジェクトに Set を使うとき

Range

Dim r As Range
Set r = Sheets("集計").Range("A1")

Worksheet

Dim ws As Worksheet
Set ws = Worksheets("明細")

Workbook

Dim wb As Workbook
Set wb = Workbooks.Open("C:\data\売上.xlsx")

Collection / Dictionary

Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")

・Set を外すとエラーになる例

Dim r As Range
r = Range("A1") ' ← エラー:オブジェクト変数または With ブロック変数が設定されていません

✅ Nothing と Set の関係|参照解除の仕組み

・変数の参照を解除するには Nothing を使う

Set r = Nothing

これにより、r が参照していたオブジェクトとの関連が断たれます。


・参照解除が必要なケース

  • 外部オブジェクト(FSO、ADO)を扱った後
  • 大量処理でメモリ開放が必要な場面
  • RPAからマクロを呼び出す際の安定性確保

Excelは自動的にメモリ管理してくれますが、Nothing を使うとより安全です。

参考:【VBA】Findの戻り値を理解する方法|Nothing判定と実務での活用例を解説


✅ 初心者がつまずくSetのエラーとその原因

・エラー1:オブジェクト変数が設定されていません(Object variable not set)

最も多い原因は Set の記述不足。

Dim r As Range
r.ClearContents ' ← Setしていないのでエラー

・エラー2:Nothing のまま操作しようとした

Set r = Nothing
r.Value = 10 ' ← Nothing に対して操作するとエラー

・エラー3:存在しないオブジェクトにSetしようとした

Set ws = Sheets("存在しないシート")

→ “インデックスが有効範囲にありません” エラー。


✅ Set を理解するとVBAの高度な処理が書けるようになる

Set の理解は、以下の処理につながる“基礎中の基礎”です:

  • Range を柔軟に扱う
  • シートやブックの切り替え
  • 外部オブジェクト(Dictionary, FileSystemObject)
  • With と組み合わせた高速化
  • オブジェクトの配列
  • 参照渡し(ByRef)との連携
  • RPA との連携で安定したマクロ運用

つまり Set を理解できれば、VBAの世界が一気に広がります。


✅ ChatGPT・RPA時代でも Set の理解は必須

最近は ChatGPT がVBAコードを生成するケースが増えています。しかし生成コードの中には:

  • Set の不足
  • オブジェクトの扱いが曖昧
  • Nothing を使わない
  • Workbook / Worksheet の参照ミス

といった“ニュアンスの違いによる不具合”が多発します。

Set を理解していれば、ChatGPT が提示したコードを自分で正すことができ、
AIと人間の相乗効果で信頼性の高いマクロが作れます。


RPA(UiPath / Power Automate Desktop)と併用する際もSetは重要

RPAからExcelマクロを起動する場合、参照が曖昧なコードは以下の原因で“止まる”ことがあります。

  • Nothing の残存
  • 想定外のブックがアクティブ化
  • 参照の混在
  • 明示しないシート・ブック指定

Set と指定型の管理によって、RPA × Excel VBA の運用が安定します。


❗ Set を使わない方がいいケースはあるのか?

基本的にありません。

Set を使わずにオブジェクト操作しようとすると例外なくエラーになります。


❗ よくある質問(Q&A)

Q1. Set を使わずに代入できる方法はある?

→ ありません。オブジェクト代入には必ずSetが必要です。

Q2. Nothingは必ず使うべき?

→ 外部オブジェクトの場合は推奨。Excel内部オブジェクトは必須ではありません。

Q3. ChatGPTで生成されたコードのSetは信用できる?

→ 基本正しいが、省略されている時もあるので必ずレビューしましょう。


✅ まとめ:Setは「参照を扱うための必須知識」VBAの基礎中の基礎

最後にこの記事の内容を整理します。

  • Set は「オブジェクトを変数に代入するためのキーワード」
  • Range / Worksheet / Workbook / Dictionary などに必須
  • 値型とは違い「参照」を扱うため Set が必要
  • Nothing で参照を解除できる
  • よく起きるエラーのほとんどは Set の不足
  • ChatGPT・RPA と組み合わせる際も重要
  • Set を理解するとVBAの応用が一気に進む

Set を理解すると、VBAコードの“構造”が見えるようになり、より複雑なマクロも正確に書けるようになります。

    -VBAテクニック集, VBA一覧, オブジェクト変数, 文法・構文