Excel 自动滤波模式的优化
我已经写了这篇VBA,它正是我想要它做的。但是,大多数值会重复多次,我想知道下面的内容是否可以转换为循环。当然,这可以在某种程度上得到优化,但我很难看到如何优化,特别是如果“自动过滤器”只能携带一个“字段”。有什么想法吗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
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 ofAutoFilter
仅用于计算具有某些条件的行数会更快。您可以将其替换为:
.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 ofAutoFilter
会更快,只需使用一些标准计算行数即可。您可以将其替换为:
.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是个好主意。