実行時エラー424「オブジェクトが必要です」の原因と直し方

公開日:2026年10月7日 執筆:Takuya カテゴリ:エラー対処

実行時エラー424は、オブジェクトでないものをオブジェクトとして扱ったときに起きます。Set の右側が値になっている、変数名の打ち間違い、配列の要素に .Value を付けているなどの原因と直し方を解説します。

どんなエラーか

実行時エラー424「オブジェクトが必要です」は、シートやセル範囲のようなオブジェクトが来るべき場所に、文字列や数値、空の値が来たときに表示されます。よく似たエラー91が「オブジェクト変数の中身が空」なのに対し、424は「そもそもオブジェクトではないもの」を扱おうとしているのが特徴です。

止まった行で「.」の左側にあるものや、Set の右側にあるものが、本当にオブジェクトかどうかを確認すると原因が見つかります。

原因1:Set の右側が値になっている

Set はオブジェクトを変数に入れるための書き方です。右側にセルの値(.Value)や文字列を書くと、オブジェクトではないためエラー424になります。セル範囲そのものを入れたいのか、セルの値を入れたいのかを区別して書きます。

Sub SetSample()
    Dim ws As Worksheet, rng As Range, v As Variant

    Set ws = ThisWorkbook.Worksheets("売上")

    ' エラー424:右側はセルの値(オブジェクトではない)
    ' Set rng = ws.Range("A1").Value

    Set rng = ws.Range("A1")          ' セル範囲を入れるなら Set + Range
    v = ws.Range("A1").Value          ' 値を入れるなら Set なし + .Value
    Debug.Print rng.Address, v
End Sub

原因2:変数名の打ち間違い(Option Explicit がない)

モジュールの先頭に Option Explicit がないと、打ち間違えた変数名は「新しい空の変数」として扱われます。たとえば ws と書くべきところを wss と書くと、wss は中身が空の変数になり、「wss.Range」の行でエラー424が起きます。

ユーザーフォームのテキストボックスの名前を変更したのに、コード側で古い名前(TextBox1 など)を使っている場合も同じ理由で起きます。Option Explicit を書いておけば、こうした打ち間違いは実行前にコンパイルエラーとして見つかるので、すべてのモジュールの先頭に書いておくことをおすすめします。

原因3:配列の要素をセルのように扱っている

高速化のためにセル範囲の値を配列に読み込んだあと、配列の要素に .Value や .Interior を付けてしまうケースです。配列の中身はただの値なので、セルのプロパティは使えません。色を付けるなど、セルに対する操作はシートのセルを指定し直して行います。

Sub ArraySample()
    Dim ws As Worksheet, data As Variant, i As Long

    Set ws = ThisWorkbook.Worksheets("売上")
    data = ws.Range("A2:C10").Value

    For i = 1 To UBound(data, 1)
        ' エラー424:data(i, 3) は値なので .Value は使えない
        ' If data(i, 3).Value < 0 Then ...

        If data(i, 3) < 0 Then
            ' 色付けはセルに対して行う(配列の行 i はシートの i + 1 行目)
            ws.Cells(i + 1, 3).Interior.Color = RGB(255, 200, 200)
        End If
    Next i
End Sub

原因の調べ方

どのオブジェクトが原因か分からないときは、止まった状態でイミディエイトウィンドウを開き、「? TypeName(調べたいもの)」と入力します。Range や Worksheet と表示されればオブジェクト、String や Double、Empty と表示されればオブジェクトではありません。Empty と表示される場合は、変数名の打ち間違いや、値が一度も入っていないことを疑います。

  • Set の右側に .Value や文字列が来ていないか
  • Option Explicit がなく、変数名を打ち間違えていないか
  • 配列の要素や、関数の戻り値(文字列)に .Value などを付けていないか
  • Variant 型の変数に、オブジェクトではなく値が入っていないか

ほかの記事