VBA Excel在一组文件夹中查找文件(部分文件名)

VBA Excel在一组文件夹中查找文件(部分文件名),excel,windows-7,excel-2010,vba,Excel,Windows 7,Excel 2010,Vba,早上好/下午好/晚上好 我想为下面的代码提供一些语法帮助,或者为我指明做得更好的方向,因为有一些事情不太正确 我最初在一个文件夹宏中有一个文件列表,我已经调整了它来尝试做我想做的事情 接下来,我有一个stem文件名列表(strDesignDocs),我有一个顶部文件夹,在那里我可以找到这些文件的一个版本(combobox21.value) 我将顶部文件夹路径和零件文件名输入到ListMyFiles函数中,希望仅出于测试目的,它将为我提供已找到的完整文件名以及完整文件夹路径的消息。它确实在函数中打

早上好/下午好/晚上好

我想为下面的代码提供一些语法帮助,或者为我指明做得更好的方向,因为有一些事情不太正确

我最初在一个文件夹宏中有一个文件列表,我已经调整了它来尝试做我想做的事情

接下来,我有一个stem文件名列表(strDesignDocs),我有一个顶部文件夹,在那里我可以找到这些文件的一个版本(combobox21.value)

我将顶部文件夹路径和零件文件名输入到ListMyFiles函数中,希望仅出于测试目的,它将为我提供已找到的完整文件名以及完整文件夹路径的消息。它确实在函数中打印消息,但希望它将消息传递回调用函数,以便最终对其执行其他操作

代码如下:

  • 一旦找到文件,它似乎不会退出函数(它似乎只是移动到下一个文件夹,仍然在寻找同一个文件,而不会破坏整个函数)
  • 它不会将值返回给调用函数,可能是因为它继续执行我仍然无法修复的exit函数
  • 它似乎从未返回到调用函数,但仍尝试处理所有文件,因此只能假设它返回了
  • 蒂亚

    安迪

    Dim iRow
    暗色计数器
    将myFile设置为脚本.File
    子列表文件()
    将WS1、WS2标注为工作表
    Dim strDesignDocs作为变量
    出错时继续下一步
    设置WS1=图纸(“数据”)
    设置WS2=工作表(“清理”)
    使用WS1
    设置strDesignDocs=.Range(.Cells(15,1),.Cells(27,1))
    以
    对于strDesignDocs中的每个单元格
    strReturnValue=ListMyFiles(ComboBox21.Value,True,cell.Value)
    调试。打印strerturnvalue
    下一个
    端接头
    函数ListMyFiles(mySourcePath,IncludeSubfolders,sFileName)
    将MyObject设置为Scripting.FileSystemObject
    出错时继续下一步
    设置MyObject=New Scripting.FileSystemObject
    设置mySource=MyObject.GetFolder(mySourcePath)
    对于mySource.Files中的每个myFile
    如果InStr(1,myFile.Name,sFileName)为0,则
    strReport=myFile.Name&“in”&myFile.Path
    ListMyFiles=strReport
    'Debug.Print strReport
    退出功能
    如果结束
    下一个
    如果包含子文件夹,则
    对于mySource.SubFolders中的每个mySubFolder
    调用ListMyFiles(mySubFolder.Path,True,sFileName)
    下一个
    如果结束
    端函数
    
    要解决它不返回任何内容的问题,您需要声明函数Return:
    函数ListMyFiles(mySourcePath,IncludeSubfolders,sFileName)正如String
    @ScottHoltzman为回复喝彩,但仍然没有传回String你是否真的一行一行地通过代码进行调试,看看它到底在做什么?如果没有,那就这么做吧,我打赌你会找到它不返回任何东西的原因。是的,还是一样,我已经放弃了让它工作
    Dim iRow
    Dim Counter
    Dim myFile As Scripting.File
    Sub ListFiles()
        Dim WS1, WS2 As Worksheet
        Dim strDesignDocs As Variant
        On Error Resume Next
    
        Set WS1 = Sheets("Data")
        Set WS2 = Sheets("Clean_Up")
    
        With WS1
            Set strDesignDocs = .Range(.Cells(15, 1), .Cells(27, 1))
        End With
    
        For Each cell In strDesignDocs
            strReturnValue = ListMyFiles(ComboBox21.Value, True, cell.Value)
            Debug.Print strReturnValue
        Next
    End Sub
    
    Function ListMyFiles(mySourcePath, IncludeSubfolders, sFileName)
        Dim MyObject As Scripting.FileSystemObject
    
        On Error Resume Next
        Set MyObject = New Scripting.FileSystemObject
        Set mySource = MyObject.GetFolder(mySourcePath)
    
        For Each myFile In mySource.Files
            If InStr(1, myFile.Name, sFileName) <> 0 Then
                strReport = myFile.Name & " in " & myFile.Path
                ListMyFiles = strReport
                'Debug.Print strReport
                Exit Function
            End If
    
        Next
        If IncludeSubfolders Then
            For Each mySubFolder In mySource.SubFolders
                Call ListMyFiles(mySubFolder.Path, True, sFileName)
            Next
        End If
    End Function