AutoFilterMode 的优化

Optimisation of AutoFilterMode

我写了这篇 VBA,它完全符合我的要求。然而,大多数值都会重复多次,我想知道下面是否可以转换为循环。当然,这可以通过某种方式进行优化,但我正在努力了解如何优化,特别是如果 "AutoFilter" 只能携带一个 "Field"。有什么想法吗?

With Sheets(7)
        .AutoFilterMode = False
        .Range("A:E").AutoFilter Field:=1, Criteria1:="=*apple"
        .Range("A:E").AutoFilter Field:=14, Criteria1:="america"
        j = .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
        Sheets(15).Cells(18, 2) = j

        .AutoFilterMode = False
        .Range("A:E").AutoFilter Field:=1, Criteria1:="=*apple"
        .Range("A:E").AutoFilter Field:=14, Criteria1:="asia"
        j = .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
        Sheets(15).Cells(19, 2) = j

        .AutoFilterMode = False
        .Range("A:E").AutoFilter Field:=1, Criteria1:="=*apple"
        .Range("A:E").AutoFilter Field:=14, Criteria1:="europe"
        j = .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
        Sheets(15).Cells(20, 2) = j

        .AutoFilterMode = False
        .Range("A:E").AutoFilter Field:=1, Criteria1:="=*apple"
        .Range("A:E").AutoFilter Field:=14, Criteria1:="africa"
        j = .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
        Sheets(15).Cells(21, 2) = j

        .AutoFilterMode = False
        .Range("A:E").AutoFilter Field:=1, Criteria1:="=*apple"
        .Range("A:E").AutoFilter Field:=15, Criteria1:="america"
        .Range("A:E").AutoFilter Field:=12, Criteria1:="red"
        j = .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
        Sheets(15).Cells(18, 3) = j

        .AutoFilterMode = False
        .Range("A:E").AutoFilter Field:=1, Criteria1:="=*apple"
        .Range("A:E").AutoFilter Field:=15, Criteria1:="asia"
        .Range("A:E").AutoFilter Field:=12, Criteria1:="green"
        j = .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
        Sheets(15).Cells(19, 3) = j

        .AutoFilterMode = False
        .Range("A:E").AutoFilter Field:=1, Criteria1:="=*apple"
        .Range("A:E").AutoFilter Field:=15, Criteria1:="europe"
        .Range("A:E").AutoFilter Field:=12, Criteria1:="yellow"
        j = .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
        Sheets(15).Cells(20, 3) = j

        .AutoFilterMode = False
        .Range("A:E").AutoFilter Field:=1, Criteria1:="=*apple"
        .Range("A:E").AutoFilter Field:=15, Criteria1:="africa"
        .Range("A:E").AutoFilter Field:=12, Criteria1:="dark red"
        j = .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
        Sheets(15).Cells(21, 3) = j

        .AutoFilterMode = False
        .Range("A:E").AutoFilter Field:=1, Criteria1:="=*apple"
        .Range("A:E").AutoFilter Field:=17, Criteria1:="america"
        j = .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
        Sheets(15).Cells(18, 5) = j

        .AutoFilterMode = False
        .Range("A:E").AutoFilter Field:=1, Criteria1:="=*apple"
        .Range("A:E").AutoFilter Field:=17, Criteria1:="asia"
        j = .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
        Sheets(15).Cells(19, 5) = j

        .AutoFilterMode = False
        .Range("A:E").AutoFilter Field:=1, Criteria1:="=*apple"
        .Range("A:E").AutoFilter Field:=17, Criteria1:="europe"
        j = .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
        Sheets(15).Cells(20, 5) = j

        .AutoFilterMode = False
        .Range("A:E").AutoFilter Field:=1, Criteria1:="=*apple"
        .Range("A:E").AutoFilter Field:=17, Criteria1:="africa"
        j = .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
        Sheets(15).Cells(21, 5) = j

        .AutoFilterMode = False
End With

使用 Excel.WorksheetFunction.CountIfs 而不是 AutoFilter 只是为了计算符合某些条件的行数会更快。您可以替换为:

    .AutoFilterMode = False
    .Range("A:E").AutoFilter Field:=1, Criteria1:="=*apple"
    .Range("A:E").AutoFilter Field:=14, Criteria1:="america"
    j = .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
    Sheets(15).Cells(18, 2) = j

有了这个:

Sheets(15).Cells(18, 2) = Excel.WorksheetFunction.CountIfs(Sheets(7).Columns(1), "=*apple", Sheets(7).Columns(14), "america")

因此,您可以通过以下方式轻松替换代码:

With Sheets(7)
    Sheets(15).Cells(18, 2) = Excel.WorksheetFunction.CountIfs(.Columns(1), "=*apple", .Columns(14), "america")
    Sheets(15).Cells(19, 2) = Excel.WorksheetFunction.CountIfs(.Columns(1), "=*apple", .Columns(14), "asia")
    Sheets(15).Cells(20, 2) = Excel.WorksheetFunction.CountIfs(.Columns(1), "=*apple", .Columns(14), "europe")
    Sheets(15).Cells(21, 2) = Excel.WorksheetFunction.CountIfs(.Columns(1), "=*apple", .Columns(14), "africa")
    Sheets(15).Cells(18, 3) = Excel.WorksheetFunction.CountIfs(.Columns(1), "=*apple", .Columns(15), "america", .Columns(12), "red")
    Sheets(15).Cells(19, 3) = Excel.WorksheetFunction.CountIfs(.Columns(1), "=*apple", .Columns(15), "asia", .Columns(12), "green")
    Sheets(15).Cells(20, 3) = Excel.WorksheetFunction.CountIfs(.Columns(1), "=*apple", .Columns(15), "europe", .Columns(12), "yellow")
    Sheets(15).Cells(21, 3) = Excel.WorksheetFunction.CountIfs(.Columns(1), "=*apple", .Columns(15), "africa", .Columns(12), "dark red")
    Sheets(15).Cells(18, 5) = Excel.WorksheetFunction.CountIfs(.Columns(1), "=*apple", .Columns(17), "america")
    Sheets(15).Cells(19, 5) = Excel.WorksheetFunction.CountIfs(.Columns(1), "=*apple", .Columns(17), "asia")
    Sheets(15).Cells(20, 5) = Excel.WorksheetFunction.CountIfs(.Columns(1), "=*apple", .Columns(17), "europe")
    Sheets(15).Cells(21, 5) = Excel.WorksheetFunction.CountIfs(.Columns(1), "=*apple", .Columns(17), "africa")
End With

此时没问题,因为根据您的条件不规则,创建循环会很棘手。但是,您可以这样包装它:

cols = Array(2, 3, 5)
contin = Array("america", "asia", "europe", "africa")
colour = Array("red", "green", "yellow", "dark red")

For Each k In cols
    For i = 0 To 3
        If k <> 3 Then Sheets(15).Cells(i + 18, k) = Excel.WorksheetFunction.CountIfs(Sheets(7).Columns(1), "=*apple", Sheets(7).Columns(12 + k), contin(i))
        If k = 3 Then Sheets(15).Cells(i + 18, k) = Excel.WorksheetFunction.CountIfs(Sheets(7).Columns(1), "=*apple", Sheets(7).Columns(12 + k), contin(i), Sheets(7).Columns(12), colour(i))
    Next i
Next k