2016-02-12 68 views
0

我試圖使用InternetExplorerMedium對象從網頁中獲取信息。獲取信息的基本步驟如下:VBA:查找新創建的HTML元素

  1. 加載網頁。
  2. 在2個可編輯文本字段中輸入開始日期和結束日期。
  3. 按下「提交」按鈕。 頁面然後運行一些JavaScript並將表格加載到先前存在的容器中。在這個容器裏面是表格以及帶有用於下一頁,導出,刷新等的按鈕的菜單欄。
  4. 等待5秒讓javascript執行並顯示錶格。
  5. 單擊此容器內的導出按鈕以下載所列數據的Excel文件。

,代碼:

Sub GetReport() 
Dim frm As Variant 
Dim TxtRng As Range 

'Load IE page 
Set IE = New InternetExplorerMedium 
IE.Visible = True 
IE.Navigate "http://example.com/page" 

'Wait until page is ready 
Do Until IE.ReadyState = 4 

Loop 

'Enter data into fields, press submit 
IE.Document.getElementsByName("userField1").Item(0).Value = Date 
IE.Document.getElementsByName("userField2").Item(0).Value = Date 
IE.Document.getElementsByName("submitButton").Item(0).Click 

'Wait for table to load, find export button 
Application.Wait (Now + TimeValue("00:00:05")) 
Set frm = IE.Document.getElementByID("exportButton") 

'Testing to see if frm was successfully grabbed 
Set TxtRng = ActiveWorkbook.Sheets("Sheet2").Range("A1") 
TxtRng.Value = frm.getAttribute("innerHTML") 

End Sub 

我實現步驟1-4,但試圖找到出口按鈕的HTML元素的時候,我收到一個錯誤:

Run-time error '01': Object variable or With block variable not set

我已經做了一些故障排除,發現:

  • 當您搜索時發生同樣的錯誤h表示不存在的項目。
  • 在執行「submit」按鈕的javascript函數之前,所有不存在的元素都會出現同樣的錯誤。
  • 搜索在執行「提交」按鈕的javascript函數之前存在的項目時,不會發生該錯誤。
  • 使用getElementsbyName會產生相同的結果。
  • 我等待了足夠長的時間才能加載表格。等待10,15,20 +秒不會改變結果。

因此,它看起來像getElementbyID和getElementsbyName找不到新創建的元素。沒有元素被標記,所以我不能使用getElementsbyTagName ...我是否需要以某種方式「刷新」InternetExplorerMedium對象,以便它可以檢測對頁面所做的更改?我看過對象引用,並沒有看到這些行中的任何內容。在頁面加載新元素時,ReadyState是否改變?

謝謝你的幫助。

+0

很難在沒有看到頁面的情況下提示任何內容,或者至少與您試圖獲取的元素相關的HTML。 –

回答

0

您的代碼的問題是您使用Application.Wait。與此問題是,InternetExplorer和Excel都在同一線程上工作,因爲你正在控制它們。因此,當您調用凍結Excel的Application.Wait時,它也會凍結InternetExplorer並因此插入新元素。

答案是你需要讓線程運行並讓InternetExplorer完成它的工作。在VBA中這是非常困難的,因爲你只有一個線程。如果你可以將它移動到VB.net,你可以使用線程。

我的建議是,你點擊提交按鈕後,你設置一個計時器,每1000毫秒滴答一次。當這個計時器打勾時,檢查你想要的表是否存在。如果不存在,讓定時器再次出現,如果存在,結束定時器並繼續找到你想要的按鈕。

我已經處理了類似的情況,其中HTMLDocument沒有刷新,但元素添加到它。在我的情況下,我無法找到要等待的事件,我也只能設置一個計時器並等待它打勾,然後檢查新元素是否在那裏。

如果您確實需要尋找這個新元素的幫助,那麼您將需要發佈鏈接或發佈一些HTML。正如你使用InternetExplorerMedium我猜測它是一個內部網站,所以在這種情況下嘗試張貼部分的HTML,即使它只是插入的新部分。