2012-06-08 6 views
2

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 
+0

실제 URL을 게시 할 수 있습니까? 그것 없이는 진단하기가 어렵습니다. – JimmyPena

답변

0

으로. URL을 볼 수 있다면 쉽게 도움을받을 수 있습니다.

우리는 희망이 개요는 올바른 방향으로 넣을 수없는 경우 : 페이지 (IEApp.ReadyState 및 IEApp.Busy를)로드하는

  1. 기다립니다
  2. 로부터 문서 객체를 가져옵니다 IE 개체. (done)
  3. 문서 객체가 무의미 할 때까지 반복.
  4. 프레임 개체를 문서 개체에서 가져옵니다.
  5. 프레임 객체가 루프가 될 때까지 반복합니다.

희망이 있습니다.

0

나는 때까지 필드 값을 확인하기 위해 루프 옵션을 사용 그것이

마 IE.Document.getElementById ("USERID") 동안. 값 <> "TEST3" IE.Document.getElementById ("USERID처럼 채워 ") .Value ="test3 " 루프

관련 문제