2017-02-16 29 views
4

ライブ実行時に以下の行が失敗しますが、この行の前にアプリケーションを中断するとうまくいきます。excel VBAコードは、ステップ実行時には動作しますが、ライブ実行時には動作しません。

I = InStr(html_document.body.innerHTML, "EPG") 

私は長いです、初期化され、正常に動作するはずです。 html_documentは、私が正しい文字の場所をピックアップし、このラインは、それが動作します前にブレークポイントを置く

Set IE = New InternetExplorer 

を通じて初期化、IE.documentです。 0

任意のアイデアが本当に理解されるように、この行の後にブレークポイントを置く

Iが残っています。

+4

html_documentを取得する前にページが読み込まれるのを待っていますか?例えば'IE.Navigate'を使った後、Do While IE.ReadyState <> 4:DoEvents:Loop'のようなことをする必要があります – Jordan

答えて

0

IEオブジェクトが完全に読み込まれていない可能性があります。つまり、 "I"変数が値を取得できない可能性があります。 あなたは事前に検証を追加してみてください:何かをペーストしようとしていると、アプリケーションがそうする準備ができていなかったことを見つけるとき、私はVBAと同様の問題を持っていた

Do While IE.busy 
    DoEvents 
Loop 

がmilissecondsのためのあなたのモジュールの先頭で定数を宣言します:

Const ms As Double = 0.000000011574 

次に、あなたのニーズのためにこれを適応してみてください:

私を助けた何かが、これに類似したタスクを実行するための関数を作成しました。
Function Try_Something() as Boolean 
    On Error GoTo errorHandler 
    Application.Wait Now + ms * 50 

     'Do something here, such as checking if the value is obtainable' 
     var = InStr(html_document.body.innerHTML, "EPG") 

    Try_Something = True 
    Exit Function 
errorHandler: 
    Try_Something = False 
End Function 

この機能は実行時エラーをカプセル化し、連続した試行間に50msの遅延を追加します。通常、コードをスムーズに実行するのに十分です。あなたは、ページが実際にロードされたことを確認するためにREADYSTATE列挙体を使用して最高だ

Do until Try_Something = True 
    DoEvents 
Loop 
I = InStr(html_document.body.innerHTML, "EPG") 
2

:この後、元のコードは次のように少し見えます。

'READYSTATE_UNINITIALIZED = 0 
'READYSTATE_LOADING = 1 
'READYSTATE_LOADED = 2 
'READYSTATE_INTERACTIVE = 3 
'READYSTATE_COMPLETE = 4 


Dim IE As New InternetExplorer 
'// your other code here 
IE.Navigate "http://www.google.co.uk" 

While IE.ReadyState <> READYSTATE_COMPLETE 
    DoEvents 
Wend 

'// Following code will only run once the document has completely loaded. 

Set html_document = IE.Document 
I = InStr(html_document.body.innerHTML, "EPG") 

'// rest of your code here.... 
関連する問題