2011-03-10 103 views
0

我試圖從Excel VBA中使用Microsoft XML 6.0編寫一個xml文件。 到目前爲止,它工作正常,除了一些屬性。 這是我的代碼的摘錄:從Excel VBA創建xml屬性

Dim block,knoten,subknoten, subknoten2 As MSXML2.IXMLDOMNode 
Dim attribut, attribut2 As MSXML2.IXMLDOMAttribute 

'...' 
Set knoten = block.appendChild(.createNode(NODE_ELEMENT, "name", "")) 
Set attribut = .createAttribute("id") 
attribut.nodeValue = "Knotentext" 
knoten.setAttributeNode attribut ' works fine so far ' 

Set subknoten = knoten.appendChild(.createNode(NODE_ELEMENT, "unterknoten", "")) 
Set subknoten2 = subknoten.appendChild(.createNode(NODE_ELEMENT, "unterknoten2", "")) 
subknoten2.nodeTypedValue = "Knotentext" 
Set attribut = .createAttribute("id") 
attribut.Value ="Attributstext" 
subknoten2.setAttributeNode attribut ' this line creates an error, rest is ok 
'...' 

最後一行導致編譯器消息「方法或找不到對象」 這符合事實,進入subknoten2當「setAttributeNode方法」是不是在選擇列表。 但打結有什麼不同?它們都是以相同的方式定義和創建的。 在監視窗口(Überwachungsfenster)我看到了以下幾種類型: knoten:株/對象/ IXMLDOMElement subknoten2:IXMLDOMNODE/IXMLDOMElement

有沒有人有一個想法是怎麼回事,我怎麼可以將一個屬性subknoten2 ? 感謝您的時間...

回答

1

問題可能出在DIM聲明:
當你暗淡無作爲子句變量聲明爲一個變體

Dim block,knoten,subknoten, subknoten2 As MSXML2.IXMLDOMNode 
Dim attribut, attribut2 As MSXML2.IXMLDOMAttribute 

block,knoten,subknoten,attribut是所有變體

這解釋了您在監視器窗口中看到的差異,但不會解決潛在的問題。

你得到一個錯誤的原因是setAttributeNodeIXMLDOMElement的方法,而不是IXMLDOMNode

很難確定形式的片段貼,但它可能是你需要使用.createElement,而不是.createNode

+0

您好Chris,非常感謝! 我不知道該聲明只適用於最後一個變量。 我現在定義了塊,knoten,subknoten和subknoten2作爲IXMLDOMElement,並且這個工作完美。 – Adrian 2011-03-10 11:34:12

0

您可以使用以下代碼將屬性添加到現有節點中

Dim pairList As IXMLDOMNodeList 
Dim pairNode As IXMLDOMNode 
Dim objAttr As IXMLDOMAttribute 

Set pairList = objDom.selectNodes("/PairList/*") 



For Each pairNode In pairList 
      '-------------------------------------------------- 
      ' Setting Target Positions 
      '------------------------------------------------- 
      Set objAttr = objDom.createAttribute("TX") 
      pairNode.Attributes.setNamedItem(objAttr).Text = tPoint.X 
      Set objAttr = objDom.createAttribute("TY") 
      pairNode.Attributes.setNamedItem(objAttr).Text = tPoint.Y 
      Set objAttr = objDom.createAttribute("TZ") 
      pairNode.Attributes.setNamedItem(objAttr).Text = tPoint.Z 


Next pairNode