在多个子文件夹中搜索文件的VBA宏

标签 vba excel

我有宏,如果我放入文件的单元格 E1 名称,则通过 C:\Users\Marek\Desktop\Makro\目录进行宏搜索,找到它并将所需的值放入带有宏的原始文件的特定单元格中。

是否可以在没有特定文件夹位置的情况下完成此工作?我需要一些可以通过 C:\Users\Marek\Desktop\Makro\进行搜索的东西,其中包含许多子文件夹。

我的代码:

Sub Zila1()
Dim SaveDriveDir As String, MyPath As String
Dim FName As Variant
Dim YrMth As String

SaveDriveDir = CurDir
MyPath = Application.DefaultFilePath    'or use "C:\Data"
ChDrive MyPath
ChDir MyPath
FName = Sheets("Sheet1").Range("E1").Text

If FName = False Then
    'do nothing
Else
    GetData "C:\Users\Marek\Desktop\Makro\" & FName & ".xls", "Vystupna_kontrola", _
        "A16:A17", Sheets("Sheet1").Range("B2:B3"), True, False

        GetData "C:\Users\Marek\Desktop\Makro\" & FName & ".xls", "Vystupna_kontrola", _
        "AE23:AE24", Sheets("Sheet1").Range("B3:B4"), True, False

        GetData "C:\Users\Marek\Desktop\Makro\" & FName & ".xls", "Vystupna_kontrola", _
        "AE26:AE27", Sheets("Sheet1").Range("B4:B5"), True, False

        GetData "C:\Users\Marek\Desktop\Makro\" & FName & ".xls", "Vystupna_kontrola", _
        "AQ59:AQ60", Sheets("Sheet1").Range("B5:B6"), True, False

        GetData "C:\Users\Marek\Desktop\Makro\" & FName & ".xls", "Vystupna_kontrola", _
        "AR65:AR66", Sheets("Sheet1").Range("B6:B7"), True, False

        End If

  ChDrive SaveDriveDir
  ChDir SaveDriveDir
End Sub

最佳答案

只是为了好玩,这里有一个带有递归函数的示例,(我希望)它应该更容易理解并与您的代码一起使用:

Function Recurse(sPath As String) As String

    Dim FSO As New FileSystemObject
    Dim myFolder As Folder
    Dim mySubFolder As Folder

    Set myFolder = FSO.GetFolder(sPath)
    For Each mySubFolder In myFolder.SubFolders
        Call TestSub(mySubFolder.Path)
        Recurse = Recurse(mySubFolder.Path)
    Next

End Function

Sub TestR()

    Call Recurse("D:\Projets\")

End Sub

Sub TestSub(ByVal s As String)

    Debug.Print s

End Sub

编辑:以下是您如何在工作簿中实现此代码以实现您的目标。

Sub TestSub(ByVal s As String)

    Dim FSO As New FileSystemObject
    Dim myFolder As Folder
    Dim myFile As File

    Set myFolder = FSO.GetFolder(s)
    For Each myFile In myFolder.Files
        If myFile.Name = Range("E1").Value Then
            Debug.Print myFile.Name 'Or do whatever you want with the file
        End If
    Next

End Sub

这里我只是调试找到的文件名,剩下的就看你的了。 ;)

当然,有些人会说调用两次 FileSystemObject 有点笨拙,因此您可以简单地编写这样的代码(取决于您是否想要划分):

Function Recurse(sPath As String) As String

    Dim FSO As New FileSystemObject
    Dim myFolder As Folder
    Dim mySubFolder As Folder
    Dim myFile As File

    Set myFolder = FSO.GetFolder(sPath)

    For Each mySubFolder In myFolder.SubFolders
        For Each myFile In mySubFolder.Files
            If myFile.Name = Range("E1").Value Then
                Debug.Print myFile.Name & " in " & myFile.Path 'Or do whatever you want with the file
                Exit For
            End If
        Next
        Recurse = Recurse(mySubFolder.Path)
    Next

End Function

Sub TestR()

    Call Recurse("D:\Projets\")

End Sub

关于在多个子文件夹中搜索文件的VBA宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20687810/

相关文章:

excel - 从 VBA 用户定义函数返回 Excel 数组常量

excel - 我可以转换为任何对象的默认接口(interface)吗?

vba - Excel VBA : How to capture MsgBox response

excel - Excel中的数字格式

excel - 如何使用vba变量在单元格中插入公式

excel - VBA : Set Range from Cell Function

VBA:带有 INDEX MATCH 的循环不会转到下一个值

excel - 使用 VBA 在 PowerPoint 中设置对象的位置

html - 从 HTML 中提取数据

excel - _xlfn.IFERROR Excel2013删除