使用 Excel VBA 一一过滤列值(不同)
Filter column values (different) one by one using Excel VBA
我正在尝试逐一过滤列的值。过滤后的值每次都不同。有没有办法让宏可以捕捉到这一点。
Sub Macro1()
Sheets("Open").Select
'invoice value less than 0
ActiveSheet.Range("$A:$R00").AutoFilter Field:=11, Criteria1:="<0", _
Operator:=xlAnd
'Selected Country
ActiveSheet.Range("$A:$R00").AutoFilter Field:=3, Criteria1:="ARG"
'Selected invoice#
ActiveSheet.Range("$A:$R00").AutoFilter Field:=7, Criteria1:="1007225"
Range("G528").Select
ActiveSheet.Range("$A:$R00").AutoFilter Field:=7, Criteria1:="1015678"
ActiveSheet.Range("$A:$R00").AutoFilter Field:=7, Criteria1:="1018523"
Range("G1").Select
ActiveSheet.Range("$A:$R00").AutoFilter Field:=7, Criteria1:="1018962"
End Sub
将您的 .AutoFilter
字段填充到嵌套变量数组中,并使用 rank 和 LBound
和 UBound
查看集合。
Sub a1Multi_Filter()
Dim v As Long, vCRITs As Variant
Dim vKey As Variant, dCOL7s As New Scripting.Dictionary
dCOL7s.CompareMode = BinaryCompare
vCRITs = Array(Array(11, "<0"), _
Array(3, "ARG"), _
Array(7, "1007225"), _
Array(7, "1015678"), _
Array(7, "1018523"), _
Array(7, "1018962"))
With ActiveSheet.Cells(1, 1).CurrentRegion
.AutoFilter
For v = LBound(vCRITs, 1) To UBound(vCRITs, 1)
.AutoFilter Field:=vCRITs(v)(0), Criteria1:=vCRITs(v)(1)
'pause for effect and processing
MsgBox "array presets" & Chr(10) & "filtered " & .Address(0, 0) & " on column " & Chr(64 + vCRITs(v)(0)) & " for " & vCRITs(v)(1)
.AutoFilter Field:=vCRITs(v)(0)
Next v
.AutoFilter
For v = 2 To .Rows.Count
If CBool(Len(.Cells(v, 7).Value)) And Not dCOL7s.Exists(.Cells(v, 7).Value) Then _
dCOL7s.Add Key:=.Cells(v, 7).Value, Item:=7
Next v
For Each vKey In dCOL7s.Keys 'v = 0 To (dCOL7s.Count - 1)
.AutoFilter Field:=dCOL7s.Item(vKey), Criteria1:=vKey
'pause for effect and processing
MsgBox "column 7 special" & Chr(10) & "filtered " & .Address(0, 0) & " on column " & Chr(64 + dCOL7s.Item(vKey)) & " for " & vKey
.AutoFilter Field:=dCOL7s.Item(vKey)
Next vKey
End With
dCOL7s.RemoveAll: Set dCOL7s = Nothing
End Sub
我给你留下了足够的处理空间,消息文本应该有助于解释变量数组的元素。
在设置字段索引和条件参数对后,For ... Next
循环使用第一个等级的下限和上限作为处理的限制。每组依次应用,我暂停了一个显示自动筛选范围、筛选字段和筛选条件的消息框。在 'processing' 之后,该字段的自动过滤器被清除以准备序列中的下一个字段。
附录:
我已将 G 列中的唯一项集合添加到脚本字典中,然后循环遍历字典键和项,将每一对用作同一个 .AutoFilter
中的过滤器和条件。要使用脚本字典,您需要进入 VBE 的工具 ► 参考并将 Microsoft Scripting Runtime 添加到项目中。这只需要添加一次;并非适用于这可能 运行 的每台计算机,但如果开始使用脚本字典的新项目,则也必须将其添加到该项目中。
我正在尝试逐一过滤列的值。过滤后的值每次都不同。有没有办法让宏可以捕捉到这一点。
Sub Macro1()
Sheets("Open").Select
'invoice value less than 0
ActiveSheet.Range("$A:$R00").AutoFilter Field:=11, Criteria1:="<0", _
Operator:=xlAnd
'Selected Country
ActiveSheet.Range("$A:$R00").AutoFilter Field:=3, Criteria1:="ARG"
'Selected invoice#
ActiveSheet.Range("$A:$R00").AutoFilter Field:=7, Criteria1:="1007225"
Range("G528").Select
ActiveSheet.Range("$A:$R00").AutoFilter Field:=7, Criteria1:="1015678"
ActiveSheet.Range("$A:$R00").AutoFilter Field:=7, Criteria1:="1018523"
Range("G1").Select
ActiveSheet.Range("$A:$R00").AutoFilter Field:=7, Criteria1:="1018962"
End Sub
将您的 .AutoFilter
字段填充到嵌套变量数组中,并使用 rank 和 LBound
和 UBound
查看集合。
Sub a1Multi_Filter()
Dim v As Long, vCRITs As Variant
Dim vKey As Variant, dCOL7s As New Scripting.Dictionary
dCOL7s.CompareMode = BinaryCompare
vCRITs = Array(Array(11, "<0"), _
Array(3, "ARG"), _
Array(7, "1007225"), _
Array(7, "1015678"), _
Array(7, "1018523"), _
Array(7, "1018962"))
With ActiveSheet.Cells(1, 1).CurrentRegion
.AutoFilter
For v = LBound(vCRITs, 1) To UBound(vCRITs, 1)
.AutoFilter Field:=vCRITs(v)(0), Criteria1:=vCRITs(v)(1)
'pause for effect and processing
MsgBox "array presets" & Chr(10) & "filtered " & .Address(0, 0) & " on column " & Chr(64 + vCRITs(v)(0)) & " for " & vCRITs(v)(1)
.AutoFilter Field:=vCRITs(v)(0)
Next v
.AutoFilter
For v = 2 To .Rows.Count
If CBool(Len(.Cells(v, 7).Value)) And Not dCOL7s.Exists(.Cells(v, 7).Value) Then _
dCOL7s.Add Key:=.Cells(v, 7).Value, Item:=7
Next v
For Each vKey In dCOL7s.Keys 'v = 0 To (dCOL7s.Count - 1)
.AutoFilter Field:=dCOL7s.Item(vKey), Criteria1:=vKey
'pause for effect and processing
MsgBox "column 7 special" & Chr(10) & "filtered " & .Address(0, 0) & " on column " & Chr(64 + dCOL7s.Item(vKey)) & " for " & vKey
.AutoFilter Field:=dCOL7s.Item(vKey)
Next vKey
End With
dCOL7s.RemoveAll: Set dCOL7s = Nothing
End Sub
我给你留下了足够的处理空间,消息文本应该有助于解释变量数组的元素。
在设置字段索引和条件参数对后,For ... Next
循环使用第一个等级的下限和上限作为处理的限制。每组依次应用,我暂停了一个显示自动筛选范围、筛选字段和筛选条件的消息框。在 'processing' 之后,该字段的自动过滤器被清除以准备序列中的下一个字段。
附录:
我已将 G 列中的唯一项集合添加到脚本字典中,然后循环遍历字典键和项,将每一对用作同一个 .AutoFilter
中的过滤器和条件。要使用脚本字典,您需要进入 VBE 的工具 ► 参考并将 Microsoft Scripting Runtime 添加到项目中。这只需要添加一次;并非适用于这可能 运行 的每台计算机,但如果开始使用脚本字典的新项目,则也必须将其添加到该项目中。