エクセルのマクロを使って、サイトのスクレイピング(サイトからの情報を自動で取得してくること)をやってくれるツールを作りました。
いつも使っている分には問題なく動くのですが、たまに取得しようと想定している情報が取れないと、
「実行時エラー ‘424’: オブジェクトが必要です。」
というエラーが表示される問題に悩まされることに。。
この記事では、そのエラーが表示される原因と対策をご説明します。
目次
エラーの原因と解決策は?
このエラーが出るのは、オブジェクトがnull(空)状態なのにもかかわらず、そのオブジェクトに対して操作をしようとするからです。
私の経験した中では、大きく、以下の3つのケースがありました。
この場合は、きちんと変数宣言を行いましょう。
その状態の変数に対して、プロパティを参照・設定したり、メソッドを呼び出したりした場合
Dim val '← これで暗黙的に文字列型でインスタンスが出来る。
val = CreateObject("InternetExplorer.Application")
val.Visible = True '← ここで発生! そのオブジェクトに対してプロパティを設定した
この場合は、きちんと型を指定するか、下記のようにObject型とします。
Dim val
↓ 下記のように変更
Dim val As Object
例:
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