Excel VBA:如何使用给定的代码循环浏览同一文件夹中的工作簿?

Excel VBA:如何使用给定的代码循环浏览同一文件夹中的工作簿?,vba,excel,macros,Vba,Excel,Macros,() 我需要创建一个宏,循环遍历单个文件夹中的文件,并运行下面提供的代码。所有文件的结构相同,但数据不同。代码帮助我转到指定的目标文件,并计算列中“是”的数目。然后将其输出到CountResults.xlsm(主工作簿)中。在以下人员的帮助下,我获得了以下代码: 这就是CountResults.xlsm(主工作簿)的外观: 这是Test01.xlsx的示例: 注意,有10个测试文件(Test01、Test02…),但是代码应该能够更新添加的任何新测试文件(例如Test11、Test12…)。

()

我需要创建一个宏,循环遍历单个文件夹中的文件,并运行下面提供的代码。所有文件的结构相同,但数据不同。代码帮助我转到指定的目标文件,并计算列中“是”的数目。然后将其输出到CountResults.xlsm(主工作簿)中。在以下人员的帮助下,我获得了以下代码:

这就是CountResults.xlsm(主工作簿)的外观:

这是Test01.xlsx的示例:


注意,有10个测试文件(Test01、Test02…),但是代码应该能够更新添加的任何新测试文件(例如Test11、Test12…)。我有一个想法,将“文件”列合并到第一个图像中,以提取文件名并循环它们。

最简单的方法是使用
filesystemobject
循环遍历文件夹中的所有文件,并找到文件名类似于预定义掩码的文件(在您的示例中为“Test*.xslx”)。请注意,它也会经过指定文件夹中的子文件夹。如果不是必需的,则省略每个循环的第一个循环:

Dim fso As Object 'FileSystemObject
Dim fldStart As Object 'Folder
Dim fld As Object 'Folder
Dim fl As Object 'File
Dim oWBWithColumn As Workbook
Dim oWbMaster as workbook
Dim oWsSource as worksheet
Dim oWsTarget as worksheet
Dim Mask As String
Dim k as long
k=2
Set oWbMaster = ActiveWorkbook
Set oWsTarget = oWbMaster.Sheets("Sheet1")
Set fso = CreateObject("scripting.FileSystemObject")

Set fldStart = fso.GetFolder("C:\Users\khanr1\Desktop\CodeUpdateTest\")

Mask = "Test*" & ".xlsx"
For Each fld In fldStart.Subfolders

    For Each fl In fld.Files

    If fl.Name Like Mask Then

    Set oWBWithColumn = Application.Workbooks.Open(Filename:=fld.Path & "\" & fl.Name, ReadOnly:=True)
    Set oWsSource = oWBWithColumn.Worksheets("Sheet2")

        oWsTarget.Range("B"& k).Value = Application.WorksheetFunction.CountIf(oWsSource.Range("B:B"), "YES")

        oWBWithColumn.Close SaveChanges:=False
        k = k+1

    End If

Next

Next
如果此答案有帮助,请标记为已接受。还要注意,在循环的每次迭代中,您的原始代码将替换主电子表格中B2单元格的值,这就是为什么我添加了
k
变量,以在每次迭代后更改目标单元格

附言

您可以同时从文件夹中生成文件列表以及“是”计数,只需在关闭文件之前将此行添加到代码中:

oWsTarget.Range("A"& k).Value= fl.Name

最简单的方法是将代码转换为函数

Private Sub CommandButton1_Click()
    Dim r As Range
    With Worksheets("Sheet1")
        For Each r In .Range("A2", .Range("A" & .Rows.Count).End(xlUp))
            r.Offset(0, 1).Value = getYesCount(r.Value)
        Next
    End With
End Sub

Function getYesCount(WorkBookName As String) As Long
    Const FolderPath As String = "C:\Users\khanr1\Desktop\CodeUpdateTest\"

    If Len(Dir(FolderPath & WorkBookName)) Then
        With Workbooks.Open(FolderPath & WorkBookName)
            With .Worksheets("Sheet2")
                getYesCount = Application.CountIf(.Range("B:B"), "YES")
            End With
            .Close False
        End With
    Else
        Debug.Print FolderPath & WorkBookName; ": Not Found"
    End If
End Function

我省略了第一个“for each”循环,因为我没有使用子文件夹。当我编译代码时,我在第二个“for each”循环中得到一个错误:“for each fl In fld.Files”。我收到一个错误:未设置对象变量或With block变量。您知道问题可能是什么吗?将fld.Files中每个fl的
更改为fldStart.Files中每个fl的

Private Sub CommandButton1_Click()
    Dim r As Range
    With Worksheets("Sheet1")
        For Each r In .Range("A2", .Range("A" & .Rows.Count).End(xlUp))
            r.Offset(0, 1).Value = getYesCount(r.Value)
        Next
    End With
End Sub

Function getYesCount(WorkBookName As String) As Long
    Const FolderPath As String = "C:\Users\khanr1\Desktop\CodeUpdateTest\"

    If Len(Dir(FolderPath & WorkBookName)) Then
        With Workbooks.Open(FolderPath & WorkBookName)
            With .Worksheets("Sheet2")
                getYesCount = Application.CountIf(.Range("B:B"), "YES")
            End With
            .Close False
        End With
    Else
        Debug.Print FolderPath & WorkBookName; ": Not Found"
    End If
End Function