2013-03-13 14 views
1

我收到一個錯誤,試圖安排使用包裝類在VBA中異步加載和解析XML文檔。在VBA中捕獲MSXML2.DOMDocument的onreadystatechange錯誤

this msdn articlethis tutorial已經非常完美了MSXML2.XMLHTTP40.send方法的異步處理我試圖做類似的事情DOMDocument.loadXML描述的想法。

下面是從包裝類DOMMonitor

Private domDoc As MSXML2.DOMDocument 
Public Event onXmlLoadComplete(d As MSXML2.DOMDocument) 

Public Sub loadXML(XmlFilePath As String) 
    Set domDoc = CreateObject("MSXML2.DOMDocument") 
    domDoc.async = True 
    domDoc.onreadystatechange = Me ' error occurs here 
    domDoc.Load XmlFilePath 
End Sub 

Public Sub onLoadComplete() 
    If domDoc.readyState = "4" Then 
     RaiseEvent onXmlLoadComplete(domDoc) 
    End If 
End Sub 

我已經通過設置VB_UserMemId = 0製成onLoadComplete默認方法的代碼,所以它應該被調用時domDoc火災onreadystatechange

然而,當我調用loadXML

Dim dm As DomMonitor 
Set dm = New DomMonitor 
dm.loadXML txtXMLData 

我得到以下運行時錯誤在這行:

domDoc.onreadystatechange = Me 

此對象不能擊沉 '的onreadystatechange' 事件。編組對象的IDispatch接口時發生錯誤

我在做什麼錯,是否有一個很好的解決方法?

在此先感謝。

P.S.我重新發布該事件的原因是,我不一定要爲此使用最終用戶的默認方法。然而,就目前情況來看,我甚至沒有達到這個階段。

+0

真的VBA?這不是一種處理事件的VBA方式...... – 2013-03-13 16:13:38

+0

我知道我很高興在這裏使用Java,但我必須堅持使用VBA來解決這個問題。這裏的技巧是當'onreadystatechange'被觸發時,它會隱式地調用被指定爲屬性值的類實例的默認方法。再次,它像XMLHTTP40的魅力一樣。 – Valentin 2013-03-13 16:42:05

+0

一如既往,'MSXML2.DOMDocument'是來自「Microsoft XML,v3.0」的「MSXML2.DOMDocument30」的同義詞。要使用更新的「Microsoft XML,v6.0」,您需要使用'MSXML2.DOMDocument60' – barrowc 2013-03-13 18:56:22

回答

3

我讀msdn文章的方式是,要將包裝類指派給readystatechange,該對象必須是IXMLHTTPRequest或IServerXMLHTTPRequest對象(第3項)。由於您的對象是DOMDocument,readystatechange不接受對象。

但是,我想你可以實例化一個DOMDocument WithEvents(第2項),使其他方式變得多餘。我沒有足夠大的xml文件來測試,但我認爲這應該起作用。我假設如果班級失去範圍,所有投注都關閉,所以我將其作爲一個全局變量。

在標準模塊

Public clsDOMMonitor As CDOMMonitor 

Sub test() 

    Set clsDOMMonitor = New CDOMMonitor 
    clsDOMMonitor.loadXML "C:\Users\dkusleika\Downloads\wurfl-2.3.xml" 

End Sub 

在CDOMMonitor類

Private WithEvents mDoc As MSXML2.DOMDocument 

Private Sub mDoc_onreadystatechange() 

    If mDoc.readyState = 4 Then 
     MsgBox "second" 
    End If 

End Sub 

Public Sub loadXML(XmlFilePath As String) 

    Set mDoc = New MSXML2.DOMDocument 
    mDoc.async = True 
    mDoc.Load XmlFilePath 

    MsgBox "first" 

End Sub 

我認爲異步設置爲True是所有需要爲此才能正常工作。我的100k xml文件可能速度非常快,以至於事件永遠不會放棄控制。但是如果你有一個足夠大的XML文件,我想你會在「秒」之前得到「第一」。

0

當延遲綁定時,將類'Instancing屬性從Private更改爲PublicNotCreatable,同時還應用您提到的調整。

在早期綁定時(如你的情況)使用上面的例子。