7

このような質問が以前にも出されたことは知っていますが、私の質問は少し異なり、かなり厄介です。私が扱っているのは、入力ボックス内の特定の項目が入力されたときに、より多くのページをロードするいくつかのイベントを持つフォームを持つ Web ページです。これらのイベントが発生すると、ページが再び読み込まれますが、同じ nameprop を持つ同じ URL にとどまります。私は次のタイプのメソッドを別々に使用して、ページがロードされるのを待つのを処理しましたが、VBA がまだ実行を継続し、適切な情報がないページに HTMLDocument 変数を設定してマクロを引き起こしている場合があります。デバッグします。これまでに私が試してきた種類は次のとおりです。

While IE.Busy
    DoEvents
Wend

Do Until IE.statusText = "Done"
    DoEvents
Loop

Do Until IE.readyState = 4
    DoEvents
Loop

これらのイベントを次のようなループに配置しようとさえしましたが、lastModified プロパティは秒単位までの値しか返さず、マクロは新しい値を返すのに十分な速さでフィールドをスピンするため、うまくいきませんでした。同じ秒のページ:

Do Until IE.statusText = "Done" And IE.Busy = False And IE.ReadyState = 4 _
And IE.document.lastModified > LastModified ----or---- IE.document.nameprop = _
"some known and expected name prop here"
    While IE.Busy
        DoEvents
    Wend
    Do Until IE.statusText = "Done"
        DoEvents
    Loop
    Do Until IE.readyState = 4
        DoEvents
    Loop
Loop

それでも、デバッグにつながる HTMLDocument オブジェクトを設定するのに十分な時間待つことができません。次の入力要素を設定し、それをチェックしてコードを進めることを考えましたが、通常、入力要素は HTML に存在しますが、適切なイベントが発生するまで隠されているため、100% 成功することはありません。これは問題にはなりませんが、イベントが発生するまで可能な選択をロードしません。変なページかもしれません。

とにかく...他に何を追加すればよいかわかりません。見るのに役立つ可能性のある何かが他にある場合は、質問してください。私が探しているのは、別のページが進行中ではないことを IE が認識するまで VBA を待機させる方法だと思います。完全に完了するまでに数回ロードするようです。

だから...誰かアイデアはありますか?

編集:試してみるべきいくつかの新しいことを見つけました。それでも、サイコロはありません。これらの試行を追加することが提案されました。これがコードです。何らかの理由で、選択要素のオプションを設定する必要があるイベントを発生させた後にこのアプローチを使用すると、VBE と Excel インスタンスが応答しなくなります... xml を試すことを考えています... コードは次のとおりです。

intCounter = 0
Do until intCounter > 2
    Do Until IE.Busy = False: DoEvents: Loop
    Do Until IE.ReadyState = 4: DoEvents: Loop
    Set HTMLDoc = IE.Document
    Do Until HTMLDoc.ReadyState = "complete"
    Set HTMLSelect = HTMLDoc.getElementById("ctl00$ctl00$MainContent$ChildMainContent$ddlEmployeeBranchCodes")
    intCounter = 0
    For each Opt in HTMLSelect
        intCounter = intCounter + 1
    Next Opt
Loop

Web ページで発生していることに基づいて、このループのどこかで VBE と Excel が応答しなくなることがわかりました。

それが役立つことを願っています...私はそれが私を助けなかったことを知っています.Drats。

編集:これを追加すると思っただけです。Web ページの自動化に関しては、ほとんどの場合、IE を使用しなくなりました。単純に投稿を実行して自分自身を取得する方がはるかに優れており、この非同期の問題を完全に回避できることがわかりました。何をしようとしているのかによっては、最善の解決策ではないかもしれませんが、トラフィックを注意深く見てパラメータ化すれば、かなり確実に機能します。

4

3 に答える 3

7

徹底的な検索の結果、バックグラウンドで非同期に実行される AJAX リクエスト、javascript コードは、何らかの方法でシグナルを取得できるものではないと判断しました。ページの読み込みが完了すると、何らかのイベントがトリガーされるようです。これは、将来検討したいオプションです。ただし、私の目的のために、ページのフォームに入力するために既に使用していたのと同じコードを使用しただけで、各フィールドを再度ループして、送信ボタンをクリックする前に値がまだ正しいかどうかを確認します。これは理想的な解決策ではありませんが、この場合の問題を解決したように見える回避策です。

私の解決策がこの問題を扱っている他の誰かに適用できるかどうかはわかりませんが、それが役立つ場合はあります. この問題の回避策は、問題のアプリケーションと Web ページに基づいている必要があると思います。

于 2013-11-14T16:35:22.590 に答える