2016-03-08 91 views
1

我有一個代碼,它打開一個網頁並單擊一個鏈接。然後從一個Iframe加載數據,我試圖改變下拉列表的值。使用VBA從iFrame填充網頁上的下拉列表

我試圖從Year iFrame填充Manufr下拉列表。使用VBA,但我得到Object Variable or With Block Variable not set錯誤。這可能與我試圖編輯的數據在Iframe中有關嗎?

這裏是代碼我試圖使用

Sub Scrape2() 
    Dim Browser As InternetExplorer 
    Dim Doc As HTMLDocument 
    Dim element As IHTMLElement 

    Set Browser = New InternetExplorer 
    Browser.Visible = True 
    Browser.navigate "http://catalog.xxxxxxx.com" 

    Do While Browser.Busy And Not Browser.readyState = READYSTATE_COMPLETE 
     DoEvents 
    Loop 

     For Each l In Browser.document.getElementsByTagName("a") 
     If l = "http://catalog.xxxxx.com/Catalog.asp?VehicleRef=2" Then 
      l.Click 
      Exit For 
     End If 
     Next 



    Stop 

    Set Doc = Browser.document 

     Dim mainIframe 
     Dim subIframe 
     Set mainIframe = Doc.frames.Item(1).document 
     Set subIframe = mainIframe.frames.Item(0).document 
     Set element = mainIframe.getElementById("Manufacturer").selectedIndex = 1 
     element.FireEvent ("onchange") 

    Set Doc = Nothing 
    Set Browser = Nothing 
End Sub 
+0

什麼是第一個鏈接點擊嗎?你是否需要等待該事件完成? –

+0

第一個鏈接在文檔中加載iframe。難道數據嵌入在Iframe中,導致問題? –

+0

是的框架中的文檔與您正在使用的文檔不是同一文檔。你需要時間來加載。 –

回答

1

嘗試:

Dim d2 
Set d2 = Doc.frames("Year").document 

Set element = d2.getElementById("Manufacturer").selectedIndex = 1 
element.FireEvent ("onchange") 

編輯:試試這個

Dim d2, evt 
Set d2 = Doc.frames("main").document.frames("year").document 
Set element = d2.getElementById("Manufacturer") 

If Not element Is nothing Then 

    Debug.Print "Got drop-down" 
    element.selectedIndex = 1 

    'either this... 
    element.FireEvent ("onchange") 

    'or try this... 
    Set evt = d2.createEvent("HTMLEvents") 
    evt.initEvent "change", True, False 
    element.dispatchEvent evt 

Else 
    Debug.Print "couldn't get drop-down!" 
End if 
+0

您需要在點擊第一個鏈接後添加一個等待(或者爲了測試目的,您可以在Set Doc = Browser.Document中放置一箇中斷,並等待頁面加載完成後再繼續) –

+0

難以提供其他方法去測試。你能提供一個URL嗎? –

+0

你好,我設法使用主索引(0)和子索引(0) –