Xml 如何在&;中传递文档;vba中的函数失效
我有一个VBA函数,它递归地调用自己,以通常的方式导航目录树的所有分支。在此函数中,如果当前目录中的文件符合特定条件,则打开该文件并提取数据 然后我想将这些数据写入一个XML文件。由于XML文件可能会被函数的每个实例更新,也可能不会被更新(可能会多次),因此我将当前XML文件传递到函数中,在写入新节点后,更新后的XML文件需要传递回调用它的函数实例 有关守则如下: 1) 调用函数的子函数初始化XML文件(作为文档),然后将其传递给函数,因此:Xml 如何在&;中传递文档;vba中的函数失效,xml,excel,vba,domdocument,Xml,Excel,Vba,Domdocument,我有一个VBA函数,它递归地调用自己,以通常的方式导航目录树的所有分支。在此函数中,如果当前目录中的文件符合特定条件,则打开该文件并提取数据 然后我想将这些数据写入一个XML文件。由于XML文件可能会被函数的每个实例更新,也可能不会被更新(可能会多次),因此我将当前XML文件传递到函数中,在写入新节点后,更新后的XML文件需要传递回调用它的函数实例 有关守则如下: 1) 调用函数的子函数初始化XML文件(作为文档),然后将其传递给函数,因此: Dim XMLSource As DOMDocume
Dim XMLSource As DOMDocument
Set XMLSource = New DOMDocument
FindDir = "mydirectory/path"
XMLSource = MyRecursiveFunction(FindDir, XMLSource)
2) 递归函数接受它,因此:
Private Function MyRecursiveFunction(ByVal FindDir As String, ByRef XMLSource As DOMDocument) As DOMDocument
3) 它被递归地调用,因此:
For Each subfolder In ObjFolder.SubFolders
XMLSource = MyRecursiveFunction(subfolder, XMLSource)
Next subfolder
4) 并返回其值:
MyRecursiveFunction = XMLSource
无论何时到达“退出函数”,它都返回438错误。我已经注释掉了它写入DOMDocument的部分,因此这不是一个格式问题,它只是在这个阶段传入和传出文件。
我使用了一个现有的递归函数,它可以很好地处理字符串或整数的传入和传出。 它肯定加载了正确的库等,就像我的所有其他XML程序一样 有什么想法吗 要求的完整代码:
Private Sub CatFiles()
Target = "my path here\"
Dim XMLSource As DOMDocument
Set XMLSource = New DOMDocument
Set objFso = CreateObject("Scripting.FileSystemObject")
Set Folder1 = objFso.GetFolder(Target + "directory 1\")
FindDir = Target + "directory 1\"
XMLSource = RecursGet(FindDir, XMLSource)
Set Folder2 = objFso.GetFolder(Target + "directory 2")
FindDir = Target + "directory 2\"
XMLSource = RecursGet(FindDir, XMLSource)
XMLSource.Save ("path here\Data.xml")
MsgBox ("Consoldiation done")
End Sub
Private Function RecursGet(ByVal FindDir As String, ByRef XMLSource As DOMDocument) As DOMDocument
Set objFso = CreateObject("Scripting.FileSystemObject")
Set ObjFolder = objFso.GetFolder(FindDir)
Dim Filename() As String
For Each subfolder In ObjFolder.SubFolders
XMLSource = RecursGet(subfolder, XMLSource)
Next subfolder
For Each Item In ObjFolder.Files
ReDim Preserve Filename(itemNumber)
Filename(itemNumber) = Item
itemNumber = itemNumber + 1
Next Item
If Not IsArray(Filename) Then
Exit Function
End If
On Error Resume Next
itemNumber = UBound(Filename)
If itemNumber > 0 Then
For EI = 0 To itemNumber
If InStr(Filename(EI), ".xls") Then
Dim RecordSet As IXMLDOMElement
Dim RSAttrib As IXMLDOMAttribute
Set RecordSet = XMLSource.createElement("RecordSet")
XMLSource.appendChild (RecordSet)
Workbooks.Open (Filename(EI))
PathHold = Split(Filename(EI), "/")
File = PathHold(UBound(PathHold))
Set RSAttrib = XNLSource.createElement("RecordSet")
RSAttrib.NodeValue = File
RecordSet.setAttributeNode (RSAttrib)
With ActiveSheet
Set FoundAdd = Cells.Find(What:="Resource Title *", LookIn:=xlValues)
End With
If FoundAdd = Null Then
MsgBox ("File " + File + " doesn't have a standard data layout, please fix")
ResTitle = "please adjust file " + File
Else
FoundRange = "B" + FoundAdd.Row
ResTitle = Range(FoundRange).Value
End If
Dim D1 As IXMLDOMElement
Set D1 = XMLSource.createElement("ResTitle")
RSAttrib.appendChild D1
D1.Text = ResTitle
ActiveWorkbook.Close
End If
Next EI
End If
RecursGet = XMLSource
End Function
我认为问题在于
DomDocument
是一个对象变量,因此在创建赋值语句时需要使用Set
关键字
For Each subfolder In ObjFolder.SubFolders
Set XMLSource = MyRecursiveFunction(subfolder, XMLSource)
Next subfolder
正如@MiVoth提到的,在函数中,您还需要:
Set RecursGet = XMLSource
就我个人而言,我会将recurseget
更改为子例程,而不是函数,并传递Dom对象ByRef
。那么您应该能够:
For Each subfolder In ObjFolder.SubFolders
MyRecursiveFunction subfolder, XMLSource
Next subfolder
如果将
MyRecursiveFunction=XMLSource
更改为Set MyRecursiveFunction=XMLSource
,则可以从递归子项中省略Set recursiveget=XMLSource
,是否有任何区别。如果我们看不到整个代码或至少更多代码,就很难判断问题出在哪里。不,不幸的是,它没有帮助。以下是全部代码(大部分):谢谢,我选择了子程序方法。出于某种原因(可能是我弄错了),我不得不在初始xml文件中添加一个节点,然后使用XMLSource.FirstChild.appendChild记录集从递归子例程写入数据,否则它只将第一条记录写入xml文件