2015-04-06 107 views
0

我需要使用它的xpath從html代碼中獲取元素。我使用的是「非標準編碼功能」爲在excel中實現HTMLBaseEle vba

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 

但是,當我試圖用下面的代碼

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 

執行它...它只是打破了「對象變量或沒有設置塊「錯誤。我也試圖實現ELEM變量與

Set elem = New HTMLBaseElement 

...但Excel的告訴我:「無效使用new關鍵字」。調試那個過程我發現elem var總是等於沒有。 :/

以防萬一,我有MS Office 2013,是的,我檢查了我的參考

+1

* Object variable ... *錯誤似乎表明您的'getXPathElement'不返回一個對象。在你的'For lCount ...'循環中,你可能不會返回一個對象(你正在分配它,但是你沒有在分配時退出循環) –

+0

沒關係,但即使嘗試了'​​elem.innerHTML =「大聲笑「'我得到相同_」對象變量或未設置塊「_錯誤 – impulsgraw

+1

是的,因爲你的函數getXPathElement'是**不**返回一個對象。你不能設置一個屬性在一個'Nothing',如果該函數沒有返回對象(這不是),那麼這就是你試圖做的事情。 –

回答

2

在這個循環中,你需要在一個返回值的分配退出循環:

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 

應該改爲:

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 

注:您應該可能還在測試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