Webサイトで特定のIDタグを検索する再帰関数

2019-11-08 html excel vba recursion

Webサイトで特定のIDを再帰的に検索しようとしています。

エラーメッセージなしでコードがクラッシュします。ステップバイステップで行っても問題ありません(IDが見つからなかった場合でも)。終了条件は正しく、無限ループではないと思います。

Public Function SetRecursiveInputFieldbyID(ByRef IE As Object, ByRef prevNode As Variant, _
  ByRef ident As String) As Boolean
'    On Error GoTo error

    For Each t In prevNode.Document.ChildNodes
        If t.ID = ident Then
            Debug.Print "Found"
            SetRecursiveInputFieldbyID = True
            Exit For
        ElseIf t.ChildNodes.length <> 0 Then
            If t.ID <> "" Then Debug.Print t.ID
            If SetRecursiveInputFieldbyID(IE, t, ident) Then
                SetRecursiveInputFieldbyID = True
                Exit For
            End If
        End If
    Next t
    Exit Function

'error:
'    SetRecursiveInputFieldbyID = False
End Function

On Error GoTo errorを削除した後、エラーが

「スタックスペースが足りません」

Answers

再帰の複雑さとオーバーヘッドの必要性を理解していません。単にidのノードを照合して、何かが設定されているかどうかをテストしないのはなぜですか?さらに、ページの読み込みが遅い場合に対応するために、一致するノードが存在するかどうかのタイミングループテストを追加することもできます。

Option Explicit
Public Sub test()
    Dim ie As InternetExplorer, ids(), i As Long

    Set ie = New InternetExplorer
    ids = Array("footer", "banana")

    With ie
        .Visible = True
        .Navigate2 "https://stackoverflow.com/"

        While .Busy Or .readyState <> 4: DoEvents: Wend

        For i = LBound(ids) To UBound(ids)

            If IdFound(.document, ids(i)) Then Debug.Print ids(i), vbTab, "Found"

        Next
        Stop
        '.Quit
    End With
End Sub

Public Function IdFound(ByVal document As htmlDocument, ByVal ident As String) As Boolean
    Dim node As Object
    Set node = document.querySelector("#" & ident & "")
    IdFound = Not node Is Nothing
End Function

参照:

  1. VBE> Tools> Referencesを介してMicrosoft HTML Object Libraryへの参照が必要

Related