Xml 如何在&;中传递文档;vba中的函数失效

Xml 如何在&;中传递文档;vba中的函数失效,xml,excel,vba,domdocument,Xml,Excel,Vba,Domdocument,我有一个VBA函数,它递归地调用自己,以通常的方式导航目录树的所有分支。在此函数中,如果当前目录中的文件符合特定条件,则打开该文件并提取数据 然后我想将这些数据写入一个XML文件。由于XML文件可能会被函数的每个实例更新,也可能不会被更新(可能会多次),因此我将当前XML文件传递到函数中,在写入新节点后,更新后的XML文件需要传递回调用它的函数实例 有关守则如下: 1) 调用函数的子函数初始化XML文件(作为文档),然后将其传递给函数,因此: Dim XMLSource As DOMDocume

我有一个VBA函数,它递归地调用自己,以通常的方式导航目录树的所有分支。在此函数中,如果当前目录中的文件符合特定条件,则打开该文件并提取数据

然后我想将这些数据写入一个XML文件。由于XML文件可能会被函数的每个实例更新,也可能不会被更新(可能会多次),因此我将当前XML文件传递到函数中,在写入新节点后,更新后的XML文件需要传递回调用它的函数实例

有关守则如下: 1) 调用函数的子函数初始化XML文件(作为文档),然后将其传递给函数,因此:

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文件