2017-04-09 33 views
2

関数からHTMLElementCollectionを返そうとしています。しかし、function-wiseはすべて動作する必要がありますが、コードが呼び出し側のサブプログラムに戻ると、関数出力 "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

こんにちはアドリアーノ。応答していただきありがとうございます。 私はあなたが言ったことを試してみました。私は一度に1つの修正を加えて、問題を正確に特定しました。 メインサブのHTMLDocumentの初期化であり、これをパラメータとして関数に渡しました。私はそれがライブラリを使用したい場合は、HTMLオブジェクトの本体を最初にサブ内で初期化する必要があると思います。 とにかく、ありがとう! – Soulwake

+0

これは単なる推測ですが、関数内でHTMLDocを初期化すると、関数を終了するときにこのオブジェクトが破棄されると思います。そのため、HTMLDocオブジェクトが破棄されたため、myTableはNullでgetElementsByTagNameを呼び出そうとします。 mainのオブジェクトを初期化することでそれを訂正し、実行の終わりまで生き続けるでしょう。 –

関連する問題