「アプリケーション定義または オブジェクト定義のエラーです。」の原因

中級VBA

はじめに

「アプリケーション定義または オブジェクト定義のエラーです。」というエラーを調べていると昔はこのメッセージが出ていた状況でも、別のエラーメッセージに変化している事があります。

 実はExcelVBAでの、このエラーは単に「エラーです」と言っているようなもので、具体的な状況を教えてくれているとは言えません。
 以下のコードでError関数のエラーメッセージを表示させてみると、筆者の環境(Excel2019)では、88行のメッセージが表示されました。

Sub エラーメッセージ一覧()
    Dim i As Long, cnt As Long, c As Long
    cnt = 1
    For i = 0 To 65535
        If Error(i) <> "アプリケーション定義またはオブジェクト定義のエラーです。" Then
            Cells(cnt, "A") = i
            Cells(cnt, "B") = Error(i)
            cnt = cnt + 1
        End If
    Next i
End Sub 

「アプリケーション定義または オブジェクト定義のエラーです。」はその他多数扱い

 プログラムが示す通り、88項目以外は全て「アプリケーション定義または オブジェクト定義のエラーです。」という事になります。

 ネット上で色々なエラーを調べてみますと、以前は「アプリケーション定義または オブジェクト定義のエラーです。」とされていたメッセージも現在は異なる(もっと具体的な)メッセージが表示されているようです。
 この事を鑑みますと、「このエラーはこういう時に出ます」という言い方がなかなか出来ないという事になります。
 しかし、それでは埒が明きませんので、実際に試してみてこのエラーが出た時の状況と、その対策について挙げてみます。

原因1:RangeやCellsの行列指定にあり得ない値を指定

 RangeやCellsで、行と列を指定する際、0以下や最大値を超えるような値を指定すると、「アプリケーション定義または オブジェクト定義のエラーです。」が発生します。

Sub Error1()
    Dim row As Long
    Worksheets("Sheet1").Cells(row, 1) = 123
End Sub

 上記の例では、rowを初期化しなかったため値が0となり、0行目を指定しているのでエラーとなります
 訂正例は以下の通りです。

Sub NotError1()
    Dim row As Long
    row = 1
    Worksheets("Sheet1").Cells(row, 1) = 123
End Sub

原因2:数式のRange指定の不備

 セルに数式を指定する際、Rangeの指定に不備がある場合に「アプリケーション定義または オブジェクト定義のエラーです。」が発生します。

Sub Error2()
    Range("A1").Value = "=SUM(1:B10)"
End Sub

 上記の例では、SUMの引数のRange指定が間違っています。修正例は以下の通りです。

Sub NotError2()
    Range("A1").Value = "=SUM(B1:B10)"
End Sub

原因3:Rangeの範囲指定の参照不備

 以下のプログラムはSheet1がアクティブな状態ではエラーが出ませんが、別のシートがアクティブだとエラーとなります

Sub Error3()
    With Worksheets("Sheet1")
    .Range(Cells(1, 1), Cells(2, 2)) = 1
    End With
End Sub

 わかりずらいエラーですが、Rangeの引数であるCellsにドット(.)が無いためにアクティブなシート(Sheet1以外)のセルが参照されたためにエラーとなっています
 以下のように修正すれば問題ありません。

Sub NotError3()
    With Worksheets("Sheet1")
    .Range(.Cells(1, 1), .Cells(2, 2)) = 1
    End With
End Sub

最後に

 いくつかの例を見てきましたが、これがすべては無いと思います。
 もし、こういう時に「アプリケーション定義または オブジェクト定義のエラーです。」が出たという情報がありましたらご連絡いただければ調査して、この記事に追加していきたいと思います。

コメント

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