VBAで Set を使うと、シートやセル範囲などのオブジェクトを変数に入れて使いまわせます。たとえば Set ws = Sheets("Sheet1") とすると、その後は ws と書くだけで Sheets("Sheet1") の代わりになります。シート名を変更するときも Set の1行だけ直せばOKです。
この記事では、次の内容を順番に解説します。
- Setの基本的な使い方
- シートを変数に入れるメリット
- Setの解除(Nothing)について
Setとは?
VBAでは文字列や数値は Dim x As String のように変数に入れられますが、シートやセル範囲などのオブジェクトを変数に入れるときは Set が必要です。
' シートを変数に入れる
Dim ws As Worksheet
Set ws = Sheets("Sheet1")
これ以降は ws と書くだけで Sheets("Sheet1") の代わりになります。
Setを使うとコードがどう変わる?
複数のシートを操作するコードで比べてみます。
Setを使わない場合
Sheets("Sheet2").Cells(1, 1).Value = Sheets("Sheet1").Cells(1, 1).Value
Sheets("Sheet3").Cells(1, 1).Value = Sheets("Sheet1").Cells(2, 1).Value
「Sheet1」というシート名が何度も出てきます。もし「Sheet1」を「一覧」に変えたら、すべての場所を直す必要があります。
Setを使った場合
Dim ws As Worksheet
Dim ws2 As Worksheet
Dim ws3 As Worksheet
Set ws = Sheets("Sheet1")
Set ws2 = Sheets("Sheet2")
Set ws3 = Sheets("Sheet3")
ws2.Cells(1, 1).Value = ws.Cells(1, 1).Value
ws3.Cells(1, 1).Value = ws.Cells(2, 1).Value
「Sheet1」を「一覧」に変えるときは Set ws = Sheets("一覧") の1行だけ直せばOKです。コードが長くなるほど、この差が大きくなります。
シート以外にも使える?
Setはシートだけでなく、セル範囲やブックなど様々なオブジェクトに使えます。
' セル範囲を変数に入れる
Dim rng As Range
Set rng = Range("A1:A10")
rng.Interior.Color = RGB(255, 255, 0) ' 黄色の背景をつける
' ブックを変数に入れる
Dim wb As Workbook
Set wb = Workbooks("売上データ.xlsx")
wb.Sheets("Sheet1").Cells(1, 1).Value = "テスト"
Setを解除するには?
変数の使用が終わったら Nothing を代入してメモリを解放できます。
Set ws = Nothing
ただし、マクロが終了すると自動でメモリは解放されるので、通常は書かなくても問題ありません。大量のオブジェクトを扱うマクロで処理を軽くしたい場合に使います。
まとめ
Setを使うとシート名などを1か所にまとめられるので、後から修正しやすいコードになります。
- 基本の書き方:
Dim ws As Worksheet→Set ws = Sheets("シート名") - メリット:シート名の変更が1か所だけで済む。コードが短くなって読みやすい。
- シート以外にも使える:Rangeオブジェクト・Workbookオブジェクトなどにも使える。
- 解除:
Set ws = Nothingで解放できるが、マクロ終了時に自動解放されるので必須ではない。
よくある質問
SetとDimの違いは?
Dim は変数の「型と名前を宣言する」ための命令です。Set は「オブジェクトを変数に入れる」ための命令です。シートなどのオブジェクトを使う場合は Dim ws As Worksheet で宣言して、Set ws = Sheets("Sheet1") で代入するという2ステップになります。
Setを使わずにシートを変数に入れるとどうなる?
オブジェクトを変数に代入するときに Set を省略するとエラーになります。文字列や数値と違い、オブジェクトには必ず Set が必要です。
シートをインデックス番号で指定することはできる?
できます。Set ws = Sheets(1) のように番号で指定すると左から1番目のシートを指します。ただしシートの順番が変わると意図しないシートになることがあるので、シート名で指定する方が安全です。
Nothingを代入した後に変数を使うとどうなる?
エラーになります。Nothing を代入した変数はオブジェクトが空の状態になるため、その後 ws.Cells(1,1) のように使うとエラーが発生します。解除した後に使いたい場合は、もう一度 Set で代入し直してください。
複数のシートをまとめて処理したい場合は?
For Each ws In Worksheets のように書くと、ブック内のすべてのシートを順番に処理できます。ws に1枚ずつシートが入るので、ws.Cells(1,1).Value のように操作できます。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



