VBAのSetを忘れるとどうなる?|オブジェクト変数の代入・エラー424・Nothing解除の使い方

VBAでオブジェクト(Worksheet・Range・Workbookなど)を変数に代入するときは、必ず Set を使う必要があります。Setを忘れると「オブジェクトが必要です(エラー424)」が発生します。なぜSetが必要なのか、値の代入との違いを理解しておくだけで、このエラーを完全に避けられます。

この記事では、次の内容を順番に解説します。

  • Setが必要な変数と不要な変数の違い
  • Setを忘れたときに起きるエラーの原因
  • Setを使うことでコードが読みやすくなる理由
  • NothingでSetを解除する方法と使いどころ

Setが必要な変数と不要な変数の違いを理解するには?

VBAの変数には「値を入れる変数」と「オブジェクトを参照する変数」の2種類があります。Setが必要なのは後者だけです。

種類代入の書き方
値の変数(Long・String・Boolean など)Set 不要。= で代入Dim i As Long : i = 10
オブジェクト変数(Range・Worksheet・Workbook など)Set が必要Set ws = Worksheets("データ")
'値の変数(Setは不要)
Dim total As Long
Dim name  As String
total = 100
name  = "山田"

'オブジェクト変数(Setが必要)
Dim ws  As Worksheet
Dim rng As Range
Set ws  = Worksheets("データ")
Set rng = ws.Range("A1:A10")

「オブジェクト=Setが必要」と覚えておくだけで、ほとんどの場面で迷いません。

Setを忘れるとどうなるかを確認するには?

Setを省略してオブジェクトを代入しようとすると、実行時エラー424「オブジェクトが必要です」が発生します。

'Setを忘れた場合(エラーになる)
Sub ErrorExample()

    Dim ws As Worksheet
    ws = Worksheets("データ")   '← エラー424「オブジェクトが必要です」

End Sub

'正しい書き方
Sub CorrectExample()

    Dim ws As Worksheet
    Set ws = Worksheets("データ")   '← Setを付ける
    ws.Range("A1").Value = "完了"

End Sub

このエラーが起きる理由は、ws = Worksheets("データ") と書いた場合にVBAが「値を代入しようとしている」と解釈し、Worksheetオブジェクトを「値として受け取れない」と判断するためです。オブジェクトは値ではなく「参照」として扱う必要があり、そのためにSetが必要です。

Setを使うとコードが読みやすくなる理由を知るには?

同じシートやセル範囲を何度も使う処理では、オブジェクト変数にSetで格納しておくと、コードが短くなり修正も1か所で済みます。

'Setを使わない場合(毎回フルパスを書く)
Sub WithoutSet()

    Worksheets("売上").Range("A1").Value = "売上高"
    Worksheets("売上").Range("B1").Value = "金額"
    Worksheets("売上").Range("C1").Value = "担当者"
    Worksheets("売上").Range("A2").Value = 100000

End Sub

'Setを使った場合(シンプルで修正しやすい)
Sub WithSet()

    Dim ws As Worksheet
    Set ws = Worksheets("売上")

    ws.Range("A1").Value = "売上高"
    ws.Range("B1").Value = "金額"
    ws.Range("C1").Value = "担当者"
    ws.Range("A2").Value = 100000

End Sub

Setを使うと「売上」→「集計」にシート名を変えたいときも、Set ws = Worksheets("集計") の1行だけ直せば済みます。毎回フルパスで書いていると、書き換え箇所が増えてミスのリスクが上がります。

Setを解除するNothingの使い方を知るには?

オブジェクト変数を使い終わったら Set 変数 = Nothing で参照を解除できます。メモリの解放や、誤って使い続けることを防ぐ目的で使います。

Sub UseAndRelease()

    Dim ws As Worksheet
    Set ws = Worksheets("データ")

    ws.Range("A1").Value = "処理完了"

    '使い終わったら参照を解除
    Set ws = Nothing

    '解除後にwsを使おうとするとエラーになる
    ' ws.Range("A2").Value = "追加"  '← これはエラー

End Sub

また、オブジェクト変数がNothingかどうかを確認してから処理を進める書き方も実務でよく使います。

Sub CheckNothing()

    Dim ws As Worksheet

    'シートが存在するか確認してからSetする
    On Error Resume Next
    Set ws = Worksheets("集計")
    On Error GoTo 0

    If ws Is Nothing Then
        MsgBox "「集計」シートが見つかりません。", vbExclamation
        Exit Sub
    End If

    ws.Range("A1").Value = "処理完了"

End Sub

まとめ

  • オブジェクト変数(Worksheet・Range・Workbook など)への代入には必ず Set が必要
  • Setを忘れると実行時エラー424「オブジェクトが必要です」が発生する
  • 同じシートやセル範囲を繰り返し使う場合は Set ws = Worksheets("〇〇") のようにまとめるとコードが短くなり修正も楽になる
  • 使い終わったオブジェクト変数は Set ws = Nothing で参照を解除できる
  • If ws Is Nothing Then でオブジェクトが取得できたか確認してから処理を進めると安全

よくある質問

Setを付け忘れたときのエラーメッセージはどれですか?

「実行時エラー ‘424’: オブジェクトが必要です」というメッセージが表示されます。このエラーが出たらまずSetの付け忘れを疑ってください。

Rangeに値を代入するときもSetが必要ですか?

Rangeオブジェクト自体を変数に入れるときはSetが必要ですが、セルに値を書き込む場合は不要です。Set rng = Range("A1") はオブジェクトの代入なのでSet必要。Range("A1").Value = 100 はセルへの値の書き込みなのでSetは不要です。

Setを使わなくても動くコードを見たことがあります

Variant型の変数ではSetなしでもオブジェクトを代入できる場合があります。ただしVariant型は意図しない動作が起きやすいため、オブジェクトを扱う場合は型を明示してSetを使う書き方が安全です。

NothingはいつSet解除すればいいですか?

プロシージャが終わると変数は自動的に解放されるため、短いコードなら省略しても問題ありません。ループで大量のオブジェクトを扱う場合や、長時間動くマクロでメモリを節約したいときに意識的に使うと効果的です。

「オブジェクト変数またはWithブロック変数が設定されていません(エラー91)」とはどう違いますか?

エラー424はSetを書かずに代入しようとしたとき、エラー91はSetで代入する前(Nothingの状態)にオブジェクトのプロパティやメソッドを使おうとしたときに発生します。どちらもSetの使い方に関係するエラーで、「Set ws = Worksheets(…)」の前に ws.Range(...) を呼んでしまうとエラー91になります。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール