09. august 2012 - 14:07
Der er
1 kommentar og
1 løsning
metode til at gemme/Opdatere userform data i XML fil
Jeg har arvet en WORD template, som får en stor del af sit input via XML filer genereret andetsteds. Templaten skal nu leve sit eget liv og en del af data skal komme fra bl.a. en userform indtasting.
Disse useformdata har jeg skilt ud fra den store XML i en særskilt XML, som læses ind i variable, som ud over at føde templaten også læses ind i Userformens variable.
En del af userformens data skal genbruges og andre opdateres. Jeg vil gerne gemme /opdatere disse data til den oprindelige XML fil.
jeg søger et eksempel på, hvordan man skriver og opdaterer data i en XML fil baseret på word 2003 VBA.
PFT Henrik
10. august 2012 - 13:20
#1
Nøgen kvinde lærer at spinde. Jeg har selv udarbejdet en løsnning.
Sub XMLUpdateTEST()
Dim XmlField As String, XMLFile As String, Updated As Boolean
Dim XMLDOC As MSXML2.DOMDocument
Set XMLDOC = New MSXML2.DOMDocument
XMLFile = ActiveDocument.AttachedTemplate.Path & "\XML\" & "RapportFrontDATA.xml"
If Not FileThere(XMLFile) Then
MsgBox "XML Filen blev ikke fundet: " & vbCrLf & XMLFile
Exit Sub
End If
If XMLDOC.Load(XMLFile) Then
Updated = False
UpdateNode XMLDOC.ChildNodes, "CreatedbyFullName", "The Great Pretender", Updated
If Updated Then
XMLDOC.Save (XMLFile)
End If
Else
' The document failed to load.
Dim strErrText As String
Dim xPE As MSXML2.IXMLDOMParseError
' Obtain the ParseError object
Set xPE = XMLDOC.parseError
With xPE
strErrText = "Your XML Document failed to load " & _
"due the following error." & vbCrLf & _
"Error #: " & .errorCode & ": " & xPE.reason & _
"Line #: " & .Line & vbCrLf & _
"Line Position: " & .linepos & vbCrLf & _
"Position In File: " & .filepos & vbCrLf & _
"Source Text: " & .srcText & vbCrLf & _
"Document URL: " & .URL
End With
MsgBox strErrText, vbExclamation
End If
'Destroy
Set XMLDOC = Nothing
End Sub
Public Sub UpdateNode(ByRef Nodes As MSXML2.IXMLDOMNodeList, _
ByVal txtNodename As String, ByVal txtNodeValue As String, Updated)
Dim xNode As MSXML2.IXMLDOMNode
For Each xNode In Nodes
If xNode.NodeType = NODE_TEXT And xNode.ParentNode.nodeName = txtNodename Then
xNode.NodeValue = txtNodeValue
Updated = True
Exit Sub
End If
If xNode.HasChildNodes Then
UpdateNode xNode.ChildNodes, txtNodename, txtNodeValue, Updated
End If
Next xNode
End Sub
Det virker, men kan sikkert gøres mere effektivt.
10. august 2012 - 15:48
#2
Hvis man ved at de enkelte XML tags eksisterer kan denne metode være huritgere:
If XMLDOC.Load(XMLFile) Then
XMLDOC.getElementsByTagName("DeltagerFirma").Item(0).Text = "Andeby Posthus"
' for indekserede data ellers
XMLDOC.getElementsByTagName("navn").Text = "Anders"
XMLDOC.Save (XMLFile)