2015-04-15 60 views
4

您好StackOverflow社區,使用VBA瀏覽網頁/ maniuplate IE通過訪問

我有一個關於使用Access VBA操縱IE的問題。

本質上,我試圖編寫代碼,使用IE打開特定的網頁,搜索特定鏈接的頁面(目標鏈接的名稱將取決於用戶的情況),導航到新頁面通過編程方式點擊該鏈接,然後通過在生成的新頁面上查找特定的鏈接/元素來重複該過程。

爲最終目標的鏈接顯示的文字永遠是相同的,但它駐留在頁面將在每一個案件不同。

我的問題是與編程搜索第二級頁面駐留那裏的元素......我的成績不斷給我從第一級頁面僅元素,瀏覽器加載了新的鏈接後還是一樣。

道歉,如果我做了一個糟糕的工作描述問題的上下文到目前爲止。

我的代碼,本質上,如下:

Dim ie As Object, ieDoc As HTMLDocument 

Set ie = CreateObject("InternetExplorer.Application") 
ie.Visible = True 

strHTML = "http://targetsite.com/first-level_page" 

ie.navigate strHTML 

'wait for browser 
While ie.ReadyState <> READYSTATE_COMPLETE 
DoEvents 
Wend 


'define first-level target link and search for it and then "click" it 

Dim i As Integer 
Dim txt As String, link As String, p As String 

Set ieDoc = ie.Document 

txt = "First-Level Target" 
    Do Until link = txt Or i >= 1000 
    i = i + 1 
    link = ieDoc.Links(i).outerText 
Loop 

'I know the above loop is not exactly ideal in its current form, but it does give me a working first attempt at the functionality I'm trying to build.  

ieDoc.Links(i).Click 

到目前爲止,一切都很好。上面的代碼正如預期的那樣工作。在所有情況下,它都能正確導航到所需的二級頁面。我要去哪裏錯了是,當我試圖尋找該二級頁面的最終目標元素:

'wait for browser 
While ie.ReadyState <> READYSTATE_COMPLETE 
DoEvents 
Wend 

'Search for final target element (which always has the same name and anchor text on all second-level pages) 
ieDoc.getElementsByName("final-target-name").Item.Click 

上面的線(基於.getElementsByName)如果我嘗試使用它的工作就好了第一級頁面。但是,一旦我導航到任何二級頁面,它什麼都不做。我也嘗試用上面的循環的修改版本替換它,該循環搜索第一級頁面上的鏈接。同樣的結果。

作爲一個故障排除步驟,我也更換爲debug.print命令簡單地命名所有的二級頁面元素的那條線,而這總是從第一頁返回元素名稱來代替。

我認爲很明顯,我不知何故未能正確更新或重新定義我的HTMLDocument我跟着第一個鏈接之後。我已經將ieDoc設置爲無,然後將其重新設置爲ie.document,但這也不起作用。

希望有一個簡單的命令或語法,我只是無知。但是對於我的生活,我沒有能夠讓VBA在單擊第一個鏈接後正確引用頁面上存在的HTML元素。

在此先感謝您的任何建議!

〜JQN

+1

未經測試,我可能會建議您查看您的getElementsByName(「target」)是否獲取多個鏈接,其中第一個鏈接可能不是活動鏈接。而不是使用'.Item'訪問元素,添加一個索引並嘗試用'(1)'(它可以訪問第二個元素,即頁面的第二層)。 –

+1

代碼放置在哪裏?我想它在二級頁面? –

+1

導航事件之後,您仍然具有相同的'ieDoc'引用,該引用指向不再加載的頁面。在任何導航完成後,您需要刷新該引用'Set ieDoc = ie.Document'。 –

回答

1

你需要如果你知道元素的 「ID」 的名稱使用@Matteo NNZ的組合和@TimWilliams

它更容易使用getElementsByName( 「目標」)。

,如果你不知道「ID」然後循環錨元素,並搜索正確的文本。這縮小到只有鏈接或元素。

Set Anchors = IeDoc.getElementsByTagName("a") 

然後循環比較.outertext或任何您需要的子字段。

@TimWilliams: 您需要加載找到的URL,然後在循環中設置新加載的IeDoc。將「ie」對象設置爲新的「ie」加載頁面,否則「ie」對象將正確保持加載的第一頁。 當你找到你的鏈接時,你需要像你已經完成的那樣加載新頁面。

'' throw away the first page loaded. 
ie = nothing 
IeDoc = nothing 

'' Set the new page loaded. 
ie.navigate newHTML 

'wait for browser 
While ie.ReadyState <> READYSTATE_COMPLETE 
DoEvents 
Wend 

Set IeDoc = ie.Document 

重複此過程,如以上對第二頁

以下是有關「解析在VBA HTML」其他一些資源: http://www.ozgrid.com/forum/showthread.php?t=184695 Parse HTML content in VBA

0

在這種特殊情況下,我能儘管我認爲@Matteo NNZ,@TimWilliams和@durbo發佈的答案只會解決問題的Access/VBA方面的問題,但在解決問題的HTML方面問題仍然存在。再次感謝所有花時間回覆的人!

+2

約翰,這不是你的問題的答案。通過提供有關如何解決問題的正確答案來幫助社區。它關於幫助解決類似問題後出現的人。 – durbo