エクセルVBAの実行時「実行時エラー ‘424’: オブジェクトが必要です。」が出る原因と回避方法

エクセルのマクロを使って、サイトのスクレイピング(サイトからの情報を自動で取得してくること)をやってくれるツールを作りました。

いつも使っている分には問題なく動くのですが、たまに取得しようと想定している情報が取れないと、

「実行時エラー ‘424’: オブジェクトが必要です。」

というエラーが表示される問題に悩まされることに。。

この記事では、そのエラーが表示される原因と対策をご説明します。

エラーの原因と解決策は?

このエラーが出るのは、オブジェクトがnull(空)状態なのにもかかわらず、そのオブジェクトに対して操作をしようとするからです。

私の経験した中では、大きく、以下の3つのケースがありました。

変数の宣言をしないまま、その変数を使おうとした場合

この場合は、きちんと変数宣言を行いましょう。

変数の宣言は行っているが、型の指定を行っていないので、暗黙的に「文字列型」になっている場合

その状態の変数に対して、プロパティを参照・設定したり、メソッドを呼び出したりした場合

Dim val          '← これで暗黙的に文字列型でインスタンスが出来る。
val = CreateObject("InternetExplorer.Application")
val.Visible = True    '← ここで発生! そのオブジェクトに対してプロパティを設定した

この場合は、きちんと型を指定するか、下記のようにObject型とします。

Dim val

↓ 下記のように変更

Dim val As Object

IE等によるHTMLのDOM操作で、期待した要素がとれない場合

例:

Dim ObjIE As Object
Set ObjIE = CreateObject("InternetExplorer.Application")

Dim gElement As IHTMLElement
Set ObjHtml = ObjIE.document

Set gElement = ObjHtml.getElementById("val")    '← ここで発生! 「val」という要素が存在しないから。

この場合は、以下のように、操作を行う前に、IsNull()で、そのオブジェクトが空かどうかを判断してあげるとエラーは出なくなります。

If IsNull(ObjHtml.getElementById("val")) Then
    Debug.Print "取得できなかったときの動き"
Else
	Debug.Print "取得できたときの動き"
	Set gElement = ObjHtml.getElementById("val") 
End If

修正する前は、以下のように「Nothing」かどうか?で判断していたのですが、これはだめでしたね。。

1行目の時点で「オブジェクトが必要です。」のエラーが出てしまいます。

Set gElement = ObjHtml.getElementById("Si2")  '←ここでもうエラーが発生してしまう。

If gElement Is Nothing Then
    Debug.Print "取得できなかったときの動き"
Else
	Debug.Print "取得できたときの動き"
End If