简体   繁体   English

在excel vba中实现HTMLBaseElement

[英]Implementing HTMLBaseElement in excel vba

I need to get an element from html code using it's xpath. 我需要使用它的xpath从html代码中获取一个元素。 I'm using "standart coded function" for that 我正在使用“标准编码功能”

Public Function getXPathElement(sXPath As String, objElement As Object) As 

HTMLBaseElement
    Dim sXPathArray() As String

    Dim sNodeName As String
    Dim sNodeNameIndex As String
    Dim sRestOfXPath As String
    Dim lNodeIndex As Long
    Dim lCount As Long

     ' Split the xpath statement
    sXPathArray = Split(sXPath, "/")
    sNodeNameIndex = sXPathArray(1)
    If Not InStr(sNodeNameIndex, "[") > 0 Then
        sNodeName = sNodeNameIndex
        lNodeIndex = 1
    Else
        sXPathArray = Split(sNodeNameIndex, "[")
        sNodeName = sXPathArray(0)
        lNodeIndex = CLng(Left(sXPathArray(1), Len(sXPathArray(1)) - 1))
    End If
    sRestOfXPath = Right(sXPath, Len(sXPath) - (Len(sNodeNameIndex) + 1))

    Set getXPathElement = Nothing
    For lCount = 0 To objElement.ChildNodes().Length - 1
        If UCase(objElement.ChildNodes().Item(lCount).nodeName) = UCase(sNodeName) Then
            If lNodeIndex = 1 Then
                If sRestOfXPath = "" Then
                    Set getXPathElement = objElement.ChildNodes().Item(lCount)
                Else
                    Set getXPathElement = getXPathElement(sRestOfXPath, objElement.ChildNodes().Item(lCount))
                End If
            End If
            lNodeIndex = lNodeIndex - 1
        End If
    Next lCount
End Function

But when i'm trying to execute it with the following code 但是,当我尝试使用以下代码执行它时

Dim elem As HTMLBaseElement
Dim oHTML As New HTMLDocument

oHTML.body.innerHTML = GetHTML("http://ya.ru")

Set elem = getXPathElement("/html/body/table/", oHTML)

MsgBox elem.InnerText

... it just breaks up with "Object variable or With block not set" error. ...它只是分解为“对象变量或未设置块”错误。 I also tried to implement elem variable with 我也试过用它来实现elem变量

Set elem = New HTMLBaseElement

... but Excel told me "Invalid use of New keyword". ...但Excel告诉我“新关键字的使用无效”。 Debugging that process I found out that elem var always equals to nothing. 调试那个过程我发现elem var总是等于什么都没有。 :/ :/

Just in case, I have MS Office 2013, and yes, I checked up my References . 为了以防万一,我有MS Office 2013,是的,我检查了我的参考资料

In this loop, you need to exit the loop upon assignment of a return value: 在此循环中,您需要在分配返回值时退出循环:

For lCount = 0 To objElement.ChildNodes().Length - 1
    If UCase(objElement.ChildNodes().Item(lCount).nodeName) = UCase(sNodeName) Then
        If lNodeIndex = 1 Then
            If sRestOfXPath = "" Then
                Set getXPathElement = objElement.ChildNodes().Item(lCount)
            Else
                Set getXPathElement = getXPathElement(sRestOfXPath, objElement.ChildNodes().Item(lCount))
            End If
        End If
        lNodeIndex = lNodeIndex - 1
    End If
Next lCount

Should become: 应该成为:

For lCount = 0 To objElement.ChildNodes().Length - 1
    If UCase(objElement.ChildNodes().Item(lCount).nodeName) = UCase(sNodeName) Then
        If lNodeIndex = 1 Then
            If sRestOfXPath = "" Then
                Set getXPathElement = objElement.ChildNodes().Item(lCount)
                Exit For
            Else
                Set getXPathElement = getXPathElement(sRestOfXPath, objElement.ChildNodes().Item(lCount))
                Exit For
            End If
        End If
        lNodeIndex = lNodeIndex - 1
    End If
Next lCount

NOTE: You should probably still test for Nothing -ness to avoid unhandled errors, eg: 注意:您可能仍应测试Nothing -ness以避免未处理的错误,例如:

Set elem = getXPathElement("/html/body/table/", oHTML)
If elem Is Nothing Then
    MsgBox "Error!", vbINformation
    Exit Sub 'etc...
End If
MsgBox elem.InnerText

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM