2

基本的なIE自動化タスクを実行するためにVBAExcel内でMicrosoftInternetExplorerコントロールを使用することを説明する多くのオンラインリソースがあります。これらは、Webページに基本的な構成がある場合に機能します。ただし、Webページに複数のフレームが含まれている場合、それらを操作するのは難しい場合があります。

Webページ内の個々のフレームが完全に読み込まれたかどうかを判断する必要があります。たとえば、このVBA Excelコードは、IEを開き、Webページを読み込み、ExcelシートをループしてデータをWebページフィールドに配置し、検索を実行してから、IEの結果データをExcelに返します(サイトアドレスを省略してしまったことをお詫びします)。

ターゲットWebページには2つのフレームが含まれています。

1)検索値の入力と検索の実行のためのsearchbar.aspフレーム

2)検索結果を表示するためのsearchresults.aspフレーム

この構成では、検索バーは静的ですが、検索結果は入力条件に従って変化します。Webページはこの方法で構築されているため、IEApp.ReadyStateおよびIEApp.Busyを使用してIEfr1フレームのロード完了を判断することはできません。これらのプロパティは、search.aspの最初のロード後に変更されないためです。したがって、インターネットトラフィックが変動するときの実行時エラーを回避するために、大きな静的待機時間を使用します。このコードは機能しますが、低速です。cmdGOステートメントの後の10秒間の待機に注意してください。フレームロードの進行状況を判断するための堅実なロジックを追加して、パフォーマンスを向上させたいと思います。

自律フレームのロードが完了したかどうかを確認するにはどうすればよいですか?

' NOTE: you must add a VBA project reference to "Internet Explorer Controls"
' in order for this code to work
Dim IEapp As Object
Dim IEfr0 As Object
Dim IEfr1 As Object

' Set new IE instance
Set IEapp = New InternetExplorer

' With IE object
With IEapp
    ' Make visible on desktop
    .Visible = True
    ' Load target webpage
    .Navigate "http://www.MyTargetWebpage.com/search.asp"
    ' Loop until IE finishes loading
    While .ReadyState <> READYSTATE_COMPLETE
        DoEvents
    Wend
End With

' Set the searchbar.asp frame0
Set IEfr0 = IEapp.Document.frames(0).Document 

' For each row in my worksheet
For i = 1 To 9999                

    ' Input search values into IEfr0 (frame0)
    IEfr0.getElementById("SearchVal1").Value = Cells(i, 5)
    IEfr0.getElementById("SearchVal2").Value = Cells(i, 6)

    ' Execute search
    IEfr0.all("cmdGo").Click        

    ' Wait a fixed 10sec
    Application.Wait (Now() + TimeValue("00:00:10"))

    ' Set the searchresults.asp frame1
    Set IEfr1 = IEapp.Document.frames(1).Document

    ' Retrieve webpage results data
    Cells(i, 7) = Trim(IEfr1.all.Item(26).innerText)
    Cells(i, 8) = Trim(IEfr1.all.Item(35).innerText)

Next
4

3 に答える 3

0

このように入力されるまで、ループオプションを使用してフィールド値をチェックしました

Do While IE.Document.getElementById("USERID").Value <> "test3" IE.Document.getElementById("USERID").Value = "test3" ループ

于 2014-10-17T12:21:14.587 に答える
0

@JimmyPenaが言ったように。URL が表示されると、非常に簡単に解決できます。

それができない場合は、この概要で正しい方向に進むことができれば幸いです。

  1. ページがロードされるのを待ちます (IEApp.ReadyState および IEApp.Busy)
  2. IE オブジェクトからドキュメント オブジェクトを取得します。(終わり)
  3. ドキュメント オブジェクトが空でなくなるまでループします。
  4. ドキュメント オブジェクトからフレーム オブジェクトを取得します。
  5. フレーム オブジェクトが空でなくなるまでループします。

お役に立てれば!

于 2012-07-10T21:09:00.393 に答える