基本的な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