
他の人が作ったマクロを見ると、「Set」というワードを見かけることがある…。
Set ws = Worksheets("Sheet1")

変数に値を代入しているだけのように見えるけど、なぜ「Set」が必要なの?

なるほど…。
それは誰しもが1度は抱く疑問ですね。
では今回は、「Setの使い方」や「Setが必要な場合と不要な場合の違い」を
できるだけわかりやすく解説いたします。
-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
エクセル使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
VBAにおける「Set」とは?
「Set」は、オブジェクトを変数に代入するときに使うキーワードです。
オブジェクトとは、セルやシート、ブックなどを指します。
例えばセルは値だけでなく、書式や位置情報なども含んでいます。
このようなたくさんの情報は通常の変数では背負いきれないので、「Set」を使って拡張したものだと思ってください。
【例】
Setを使わない場合:紙1枚
Setを使った場合:ノート一冊
VBAでは、変数に値を代入する場合と、オブジェクトを代入する場合で書き方が異なります。
では「Set」が必要な場合と不要な場合の違いを見ていきましょう。
「Set」が必要な場合・不要な場合
前項で少し触れましたが、結論としては以下のようになります。
- 変数にオブジェクトを代入する場合は「Set」が必要
- 変数に値を代入する場合は「Set」が不要
具体例を見ていきましょう。
まずは「Set」が必要な場合です。
下記のVBAコードを見てください。
Dim rng As Range
Set rng = Range("A1") ' ← Setが必要
Setが必要か不要かは、型によって決まります。
【Setが必要な型】
- Range
- Worksheet
- Workbook
- Userform
- Collection など
なにやら複雑な情報を含んだ型が多いですね…。
これらの型を変数に代入する際には「Set」が必要です。
「Set」を使わないとエラーが発生し、うまく動きません。

では次に、「Set」が不要な場合です。
Dim count As Integer
count = 10 ' ← Setは不要
【Setが不要な型】
- Integer
- String
- Boolean
- Double など
数値や文字列など、シンプルな「値」を示す型が多いですね。
【値以外の情報を含んだ型なら「Set」が必要】と覚えるとわかりやすいかと思います。
オブジェクトを変数に代入する際、「Set」を使わないというのは、
紙1枚にノート一冊の情報を書き記すようなものです。
文字が極端に小さくなったり、必要な情報を書ききれなかったり、いずれも機能しないと思ってください。
では、「Set」を使った具体的な活用例を見ていきましょう。
実践的な活用例
よく使う「Set」の活用例を紹介いたします。
ワークシートを変数に格納
下記VBAコードは、ワークシートを変数に代入した例です。
変数に格納されたワークシートのセルA1に「Utatane」と書き込みしています。
Sub 実践例1()
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
ws.Range("A1").Value = "Utatane"
End Sub
オブジェクトであるワークシートを変数に代入するため、「Set」が必要です。
オブジェクトを変数に代入することで、ワークシートを操作する際、いちいち「Worksheets(“Sheet1”)」と指定しなくてよくなります。
「ws」と変数を指定すれば同じ結果が得られるため、コードの短縮につながります。
セル範囲を変数に格納して処理
セルもオブジェクトなので「Set」が必要となります。
Sub 実践例2()
Dim rng As Range
Set rng = Range("A1:A10")
rng.Font.Bold = True
End Sub
上記VBAコードは、セル範囲(A1~A10)を変数に格納した例です。
その後、変数に太字を付与しているため、結果的に「A1~A10」が太字になります。
別のブックを扱う場合
別のブックを操作する際、対象のブックを開いて変数に代入する必要があります。
ブックもオブジェクトなので、「Set」が必要となります。
Sub 実践例3()
Dim wb As Workbook
Set wb = Workbooks.Open("C:/Utatane/test.xlsx")
End Sub
Setを使う際のコツ
オブジェクト変数を使用し終わったら、Nothingを代入することで変数をカラにすることができます。
Set rng = Nothing
これは、メモリの解放や意図しない再利用を防ぐための小技です。
特に、大量のオブジェクトを扱うマクロや、ループの中でオブジェクトを使い回す場合には有効です。
うまく動作しないときの対処法
エラーが発生する
オブジェクトが必要です

オブジェクトを変数に代入する際、「Set」を使用しないとエラーが発生します。
Sub エラー()
Dim rng As Variant
rng = ActiveSheet.Range("A1")
Debug.Print rng.Value
End Sub
「rng」を「Set rng」などに変更しましょう。
Sub エラー()
Dim rng As Variant
Set rng = ActiveSheet.Range("A1")
Debug.Print rng.Value
End Sub
オブジェクト変数または With ブロック変数が設定されていません

こちらも同じく「Set」が無いため発生したエラーです。
Sub エラー()
Dim ws As Worksheet
ws = Worksheets("Sheet1") ' ← Setがないのでエラー
End Sub
「ws」を「Set ws」などに変更しましょう。
Sub エラー()
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
End Sub
その他のコンパイルエラー・実行時エラー
コードに問題がある場合が多いです。
「”」や()など、2つセットの記号が片方だけになっていないかなど、コードを再確認しましょう。
セル名を「”」で囲っていない場合でもエラーが発生します。
警告表示

上記の表示が出た場合は、マクロが無効になっています。
エクセルに表示された「コンテンツの有効化」をクリックするか、下記記事を参考にセキュリティ設定を変更してください。
最後に
VBAの「Set」について解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!