【VBAマクロ】Setの使い方を解説!必要・不要な場合の違い

スポンサードリンク
VBA
過去の自分
過去の自分

他の人が作ったマクロを見ると、「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」を使わないとエラーが発生し、うまく動きません。

エラー91

では次に、「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

これは、メモリの解放や意図しない再利用を防ぐための小技です。
特に、大量のオブジェクトを扱うマクロや、ループの中でオブジェクトを使い回す場合には有効です。

スポンサードリンク

うまく動作しないときの対処法

エラーが発生する

オブジェクトが必要です

エラー424

オブジェクトを変数に代入する際、「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 ブロック変数が設定されていません

エラー91

こちらも同じく「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など、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

最後までお読みいただき、ありがとうございました。がんばってください!

タイトルとURLをコピーしました