递归函数调用问题:strJDFile值无法传递至主Sub的求助
解决递归函数中变量重置、主Sub拿不到文件路径的问题
嘿,这个递归变量“丢失”的问题我碰到过好多次!核心原因就是递归过程中变量的作用域没搞对,或者没有正确把找到的结果传递回上层调用。咱们一步步拆解:
问题根源
你原来的递归函数里,strJDFile大概率是局部变量(比如在函数内部声明的),或者是用值传递的方式传参。递归的时候每一层函数都会创建自己的变量副本,下层找到文件后赋值的是自己的副本,上层的变量根本看不到这个值,等递归回到上层,原来的变量还是初始状态,看起来就像“被重置”了。
两种靠谱的解决方案
方案1:用模块级变量共享结果
把strJDFile声明在所有Sub/Function外面,变成模块级变量,这样主Sub和递归函数都能直接读写它。找到目标文件后直接赋值,主Sub就能拿到最终结果。
' 注意:把这行放在模块最顶部,所有过程外面! Dim strJDFile As String Sub MainSub() ' 每次运行先清空变量,避免残留上次的结果 strJDFile = "" ' 调用递归函数开始搜索 SearchFiles "C:\你的根文件夹路径" ' 主Sub里直接用这个变量 If strJDFile <> "" Then Debug.Print "找到目标文件:" & strJDFile ' 这里写创建附件的逻辑 Else Debug.Print "未找到目标文件" End If End Sub Sub SearchFiles(folderPath As String) Dim fso As Object, targetFolder As Object, subFolder As Object, currFile As Object Set fso = CreateObject("Scripting.FileSystemObject") Set targetFolder = fso.GetFolder(folderPath) ' 先检查当前文件夹的文件 For Each currFile In targetFolder.Files ' 这里替换成你的目标文件判断条件,比如文件名匹配 If currFile.Name = "目标文件名.xlsx" Then strJDFile = currFile.Path ' 直接赋值给模块级变量 Exit Sub ' 找到就停止,不用继续搜了 End If Next currFile ' 递归遍历子文件夹(如果还没找到的话) For Each subFolder In targetFolder.SubFolders If strJDFile <> "" Then Exit Sub ' 已经找到就提前退出 SearchFiles subFolder.Path Next subFolder End Sub
方案2:让递归函数返回结果(更严谨,无全局变量)
如果不想用模块级变量(避免全局变量的副作用),可以让递归函数返回字符串类型的结果。每次调用子递归后,检查返回值,如果不为空就立刻把这个结果传递回上层,终止后续搜索。
Sub MainSub() Dim targetPath As String ' 调用递归函数,直接接收返回的路径 targetPath = SearchFiles("C:\你的根文件夹路径") If targetPath <> "" Then Debug.Print "找到目标文件:" & targetPath ' 创建附件的逻辑 Else Debug.Print "未找到目标文件" End If End Sub Function SearchFiles(folderPath As String) As String Dim fso As Object, targetFolder As Object, subFolder As Object, currFile As Object Dim tempPath As String Set fso = CreateObject("Scripting.FileSystemObject") Set targetFolder = fso.GetFolder(folderPath) ' 检查当前文件夹的文件 For Each currFile In targetFolder.Files If currFile.Name = "目标文件名.xlsx" Then SearchFiles = currFile.Path ' 返回找到的路径 Exit Function ' 终止函数,不用继续执行 End If Next currFile ' 递归遍历子文件夹 For Each subFolder In targetFolder.SubFolders tempPath = SearchFiles(subFolder.Path) If tempPath <> "" Then SearchFiles = tempPath ' 子递归找到结果,直接返回给上层 Exit Function End If Next subFolder ' 没找到就返回空字符串 SearchFiles = "" End Function
额外提醒
如果你的需求是找多个目标文件,那变量就要换成数组或者集合(比如Collection),但看你说的是“创建附件”,应该是找单个文件,上面两种方法都完全够用啦。
内容的提问来源于stack exchange,提问作者learningthisstuff
相关产品推荐
相关产品推荐

