Невозможно напечатать весь результат в рамках вспомогательной процедуры, заполненной функцией

#excel #vba #function #web-scraping

#excel #vba #функция #очистка веб-страниц

Вопрос:

Я написал скрипт на vba для печати всего результата в рамках вспомогательной процедуры, PrintResult() заполненной getPOST() функцией. Моя текущая попытка печатает только последний результат проанализированного содержимого. Я знаю, что можно было бы сохранить результат в словаре, чтобы распечатать их все сразу, но не могу получить представление об этом конкретном использовании.

Важно сохранить существующий дизайн нетронутым.

Текущая попытка:

 Function getPOST() As String
    Const link$ = "https://admintool.noah-connect.com/widget/attendees"
    Dim Http As New XMLHTTP60, Html As New HTMLDocument
    Dim elem As Object, tRow As Object, oName As Object, oCom As Object

    With Http
        .Open "GET", link, False
        .send
        Html.body.innerHTML = .responseText
        For Each elem In Html.getElementsByTagName("tbody")(0).getElementsByTagName("tr")
            Set oName = elem.getElementsByTagName("td")(0)
            Set oCom = elem.getElementsByTagName("td")(1)
            getPOST = oName.innerText amp; "-" amp; oCom.innerText
        Next elem
    End With
End Function

Sub PrintResult()
    Debug.Print getPOST()
End Sub
  

Как я могу напечатать весь результат внутри, PrintResult() заполненный getPOST() функцией?

Комментарии:

1. Не должно ли это быть больше похоже … getPost = getPost amp; oName.innerText amp; и т.д.? Вероятно, вам также понадобится разрыв строки или что-то еще. Нет причин, по которым вы не могли бы просто записать для отладки в getPost.

Ответ №1:

Не уверен, что вы подразумеваете под сохранением дизайна, поэтому предоставляете методы возврата string и dict (как object)

 Option Explicit
Public Sub PrintResult()
    Dim dict As Object, key As Variant
    Set dict = getPOST
    For Each key In dict.keys
        Debug.Print dict(key)
    Next
End Sub

Public Function getPOST() As Object
    Const link$ = "https://admintool.noah-connect.com/widget/attendees"
    Dim http As New XMLHTTP60, html As New HTMLDocument
    Dim elem As Object, tRow As Object, oName As Object, oCom As Object
    Dim i As Long, dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    With http
        .Open "GET", link, False
        .send
        html.body.innerHTML = .responseText
        For Each elem In html.getElementsByTagName("tbody")(0).getElementsByTagName("tr")
            i = i   1
            Set oName = elem.getElementsByTagName("td")(0)
            Set oCom = elem.getElementsByTagName("td")(1)
            dict(i) = oName.innerText amp; "-" amp; oCom.innerText
        Next elem
    End With
    Set getPOST = dict
End Function
  

 Option Explicit
Public Sub PrintResult()
    Dim items() As String, result As String, i As Long
    result = getPOST
    items = Split(result, "###")
    For i = LBound(items) To UBound(items)
        Debug.Print items(i)
    Next
End Sub
Public Function getPOST() As String
    Const link$ = "https://admintool.noah-connect.com/widget/attendees"
    Dim http As New XMLHTTP60, html As New HTMLDocument
    Dim elem As Object, tRow As Object, oName As Object, oCom As Object, result As String
    result = ""
    With http
        .Open "GET", link, False
        .send
        html.body.innerHTML = .responseText
        For Each elem In html.getElementsByTagName("tbody")(0).getElementsByTagName("tr")
            Set oName = elem.getElementsByTagName("td")(0)
            Set oCom = elem.getElementsByTagName("td")(1)
            result = result amp; oName.innerText amp; "-" amp; oCom.innerText amp; "###"
        Next elem
    End With
    getPOST = result
End Function