VBA Excel 내에서 Microsoft Internet Explorer 컨트롤을 사용하여 기본적인 IE 자동화 작업을 수행하는 방법을 설명하는 많은 온라인 리소스가 있습니다. 문제의 웹 페이지가 기본 구성을 가지고있을 때 위와 같은 작업이 효과적입니다. 그러나 웹 페이지에 여러 프레임이 포함되어 있으면 작업하기가 어려울 수 있습니다. 현재 웹 페이지 내의 개별 프레임이 완전히로드되었는지 확인하는 데 문제가 있습니다. 예를 들어 ...이 VBA Excel 코드는 IE를 열어 웹 페이지를로드하고 루프는 웹 페이지 필드에 데이터를 배치하고 검색을 실행 한 다음 IE 결과 데이터를 Excel로 반환합니다 (사이트 주소를 생략 한 것에 대한 사과). 검색을 표시하기위한 searchresults.asp 프레임에서VBA를 사용하여로드하는 IE9 프레임을 어떻게 기다릴 수 있습니까?
결과
2)
1) searchbar.asp 검색 값 입력 용 프레임 및 실행 됨 : 여기서 RUB 대상 웹 페이지는 두 프레임이 포함되어있다 이 검색 막대를 구성하는 것은 정적이며 검색 결과는 입력 기준에 따라 변경됩니다. 이러한 방식으로 웹 페이지가 작성되기 때문에 IEApp.ReadyState 및 IEApp.Busy를 사용하여 IEfr1 프레임로드 완료를 결정할 수 없습니다. 이러한 특성은 초기 search.asp로드 후에 변경되지 않습니다. 따라서 인터넷 트래픽이 희박 해짐에 따라 런타임 오류를 피하기 위해 대규모 정적 대기 시간을 사용합니다. 이 코드는 작동하지만 엄청나게 천천히 ... cmdGO 문 다음 10 초 대기. 프레임로드 진행률을 결정하는 확실한 로직을 추가하여이 프로세스의 성능을 향상시키고 싶습니다.
내 질문은 - 자율 프레임이로드를 완료했는지 확인하는 영리한 방법을 알고 있습니까?
감사합니다,
~ Z는 @JimmyPena 말했다
' 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
실제 URL을 게시 할 수 있습니까? 그것 없이는 진단하기가 어렵습니다. – JimmyPena