2017-04-09 180 views
2

我試圖從一個函數返回一個HTMLElementCollection。但是,函數式方式一切正常,但是當代碼返回到調用子時,分配給函數輸出「myTable」的變量將顯示「<無變量>」。我試過將集合作爲scripting.dictionary的一部分傳回,但結果相同。VBA函數不返回HTMLElementCollection對象

任何幫助表示讚賞。謝謝大家。

Sub updateReports() 
'//Function gathers latest report information and adds to sheets("Reports") 
'//URL 
Dim strURL As String 
    strURL = "http://www.ndbc.noaa.gov/station_page.php?station=62103" 

     Dim myTable As HTMLElementCollection 
     Set myTable = getTable(strURL) 
     '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 
     'From here on, "myTable" listed as '<No Variables>'. 
     'HTMLElementCollection not sucessfully returned. 
     '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 
End Sub 

Public Function getTable(strURL As String) As Variant 
'//Downloads HTML Table from strURL 
'//Create HTTP Object 
Dim oXMLHTTP As Object 
    Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.6.0") 
     oXMLHTTP.Open "GET", strURL, False 
     oXMLHTTP.send 

Dim HTMLDoc As New HTMLDocument 
    If oXMLHTTP.Status = 200 Then 
     HTMLDoc.body.innerHTML = oXMLHTTP.responsetext 
     Set getTable = HTMLDoc.getElementsByTagName("tr")() 
     '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 
     'Under "getTable" call stack, getTable shows correct object (HTMLElementCollection) 
     '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 
    End If 
End Function 

回答

1

一些測試後,我想我想通了這是怎麼回事...嘗試創建主子(updateReports)的HTMLDocument的,並通過ByRef參數把它傳遞給getTable功能。還要將函數的返回類型更改爲HTMLElementCollection。類似的東西:

Sub updateReports() 
'//Function gathers latest report information and adds to sheets("Reports") 
'//URL 
Dim strURL As String 
    strURL = "http://www.ndbc.noaa.gov/station_page.php?station=62103" 

     Dim myTable As HTMLElementCollection 
     Dim HTMLDoc As New HTMLDocument 

     Set myTable = getTable(strURL, HTMLDoc) 
     '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 
     'From here on, "myTable" listed as '<No Variables>'. 
     'HTMLElementCollection not sucessfully returned. 
     '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 
End Sub 

Public Function getTable(strURL As String, ByRef HTMLDoc As HTMLDocument) As HTMLElementCollection 
'//Downloads HTML Table from strURL 
'//Create HTTP Object 
Dim oXMLHTTP As Object 
    Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.6.0") 
     oXMLHTTP.Open "GET", strURL, False 
     oXMLHTTP.send 

    If oXMLHTTP.Status = 200 Then 
     HTMLDoc.body.innerHTML = oXMLHTTP.responsetext 
     Set getTable = HTMLDoc.getElementsByTagName("tr")() 
     '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 
     'Under "getTable" call stack, getTable shows correct object (HTMLElementCollection) 
     '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 
    End If 
End Function 

讓我知道這是否適合你!

+0

嗨阿德里亞諾。感謝您的迴應。 我嘗試了你說的和它的工作。然後,我一次做了一次修改,準確地指出問題。 原來,它是main子文件中HTMLDocument的初始化,並將其作爲參數傳遞給函數。我猜如果我想使用它的庫,HTML對象體首先需要在子文件中初始化?! 無論如何,謝謝一堆! – Soulwake

+0

這只是一個猜測,但我認爲當你在函數中初始化HTMLDoc時,當你離開函數時,這個對象被破壞。因此myTable嘗試調用Null上的getElementsByTagName,因爲HTMLDoc對象已被銷燬。你可以通過初始化main中的對象來糾正它,它會一直保持活動狀態直到執行結束。 –