Excel 自动滤波模式的优化

Excel 自动滤波模式的优化,excel,autofilter,vba,Excel,Autofilter,Vba,我已经写了这篇VBA,它正是我想要它做的。但是,大多数值会重复多次,我想知道下面的内容是否可以转换为循环。当然,这可以在某种程度上得到优化,但我很难看到如何优化,特别是如果“自动过滤器”只能携带一个“字段”。有什么想法吗 With Sheets(7) .AutoFilterMode = False .Range("A:E").AutoFilter Field:=1, Criteria1:="=*apple" .Range("A:E").AutoFi

我已经写了这篇VBA,它正是我想要它做的。但是,大多数值会重复多次,我想知道下面的内容是否可以转换为循环。当然,这可以在某种程度上得到优化,但我很难看到如何优化,特别是如果“自动过滤器”只能携带一个“字段”。有什么想法吗

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
istead of
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
cols=Array(2,3,5)
contin=数组(“美洲”、“亚洲”、“欧洲”、“非洲”)
颜色=阵列(“红色”、“绿色”、“黄色”、“深红色”)
每k在cols中
对于i=0到3
如果是K3,则表(15).单元格(i+18,k)=Excel.WorksheetFunction.CountIfs(表(7).列(1),“=*apple”,表(7).列(12+k),续(i))
如果k=3,则表(15).单元格(i+18,k)=Excel.工作表函数.计数(表(7).列(1),“=*苹果”,表(7).列(12+k),续(i),表(7).列(12),颜色(i))
接下来我
下一个k

使用
Excel.WorksheetFunction.CountIfs
istead of
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
cols=Array(2,3,5)
contin=数组(“美洲”、“亚洲”、“欧洲”、“非洲”)
颜色=阵列(“红色”、“绿色”、“黄色”、“深红色”)
每k在cols中
对于i=0到3
如果是K3,则表(15).单元格(i+18,k)=Excel.WorksheetFunction.CountIfs(表(7).列(1),“=*apple”,表(7).列(12+k),续(i))
如果k=3,则表(15).单元格(i+18,k)=Excel.工作表函数.计数(表(7).列(1),“=*苹果”,表(7).列(12+k),续(i),表(7).列(12),颜色(i))
接下来我
下一个k

在我为您加速之前,请快速提问-最后第四行显示.Range(“A:E”)。自动筛选字段:=17,标准1:=“africs”应为.Range(“A:E”)。自动筛选字段:=17,标准1:=非洲在我看来,您最好使用
工作表(15)
中的一些COUNTIFS公式。您最好使用请求对其他工作代码进行代码审阅。您好,Jeremy,您好,抱歉输入错误。在我为您加快速度之前,请快速提问-最后第四行显示.Range(“A:E”)。自动筛选字段:=17,标准1:=africs应为.Range(“A:E”)。自动筛选字段:=17,标准1:=非洲?在我看来,您最好使用
工作表(15)
中的一些COUNTIFS公式。您最好使用请求对其他工作代码进行代码审阅。嗨,Jeremy,您好,您好,很抱歉输入错误。非常感谢。标准的不规则性使我很难做出一个循环。COUNTIFS是个好主意,非常感谢你。标准的不规则性使我很难做出一个循环。COUNTIFS是个好主意。