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
我写了这篇 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