2017-07-05 6 views
0

こんにちは私はエラー91( "オブジェクト変数またはブロック変数が設定されていません")を取得するこの奇妙な問題があります。私はスクリプトを実行するときにエラーが発生するとは限りません。私は成功することなくできる限り多くのことをしようとしました。VBA EXCELエラー91オブジェクト変数またはブロック変数が設定されていません

一部のPCコンポーネントの最新価格を取得するためにサイトを削っています。

これを行うために、私はスクリプトを作成し、スクリプトをさまざまな部分に対して順次複数回呼び出します。エラーは特定の部品に関連していません。私はすべての部分でランダムにエラーを取得します。場合によっては、エラーなくすべての通話を行うことができます。

スクリプト(ない完全なスクリプト、必要なものだけ):

Sub ImportUrlData(url As String) 

    Dim ie As InternetExplorer 
    Dim html As HTMLDocument 
    Dim varListingIDElement As IHTMLElement 
    Dim varShopName As String 
    varShopName = "" 

    Set ie = New InternetExplorer 
    ie.Visible = False 
    ie.navigate url 

    Do While ie.readyState <> READYSTATE_COMPLETE 
     DoEvents 
    Loop 

    Set html = ie.document 

    Set varListingIDElement = html.getElementById("listing") 
    varShopName = getXPathElement("/table/tbody/tr[1]/td[1]/p/a", varListingIDElement).innerText 

私はいつもこの最後の行にエラーを取得:

varShopName = getXPathElement("/table/tbody/tr[" & count & "]/td[1]/p/a", varListingIDElement).innerText 

が(エラーが内部で発生していません'getXPathElement'関数なので、それを表示する必要はありません。ちょっと調べてみたいのですが、ここで編集して投稿します)

F8で最初から最後までデバッグするとき私は決して得ないエラー。前の通話がまだ終了していないうちに、次の通話がすでに開始されている可能性はありますか?

ありがとうございます!

(申し訳ありませんが、私が監督しているいくつかのオランダ語の単語が存在する場合。)

答えて

0

あなたはこのような問題に遭遇することができますいくつかの例があります(F8は常に動作しますが、通常の実行にはありません)オブジェクトの場合返品は、いかなる方法でも、完全にに接続されていません。。これが事実であるかどうかはっきり言うことは難しく、オブジェクトを初期化するための独自のプロセスを持つものにオブジェクトを設定しているとき、およびこのプロセスがVBAルーチンの制御外にあるときにのみこれを遭遇しました。あなたの問題のために

、具体的には、あなたが取ることができるのアプローチのカップルがあります:

Set varListingIDElement = html.getElementById("listing") 
If Not varListingIDEElement is Nothing Then 
    varShopName = getXPathElement("/table/tbody/tr[1]/td[1]/p/a", varListingIDElement).innerText 
End If 

上記のアプローチは、完全にエラーを回避する必要がありますが、それはまたvarShopNameが設定されていない可能性を意味します。一方

Set varListingIDElement = html.getElementById("listing") 

Application.Wait(Now + TimeValue("00:00:03")) 

varShopName = getXPathElement("/table/tbody/tr[1]/td[1]/p/a", varListingIDElement).innerText 

これは、変数の初期設定、および変数の最後の呼び出しの間で3秒を待つようにアプリケーションを強制します。新しいアプローチが始まる前に完了していない前のプロセスの問題である場合、このアプローチを使用することができます。このアプローチを最初のものと組み合わせて、両方の利点を最大限に活用することもできます。

幸運を祈る!

+0

私は最初のアプローチを試してみましたが、それは長い間働いていました。今度は第2のアプローチを追加します。 'Application.Wait(Now + TimeValue( "00:00:02")'の後に ')'を忘れました。 6文字以上を追加または変更する必要があるため編集できません。 –

関連する問題