我在一堆列上有一个标准过滤器,我想阅读过滤器标准。在选择了2个以上的标准之前,这不是一个真正的问题。我有一行不同的字符串,我希望能够得到用户选择的标准。目前我正在处理这段代码:
Set ws = Worksheets(actSheet)
For Each flt In ws.AutoFilter.Filters
If flt.On = True Then
criterias = criterias & flt.Criteria1 & ", "
criterias = criterias & flt.Criteria2 & ", "
End If
Next flt
这只能让我有机会获得最多2个Criteria。 我在不同的论坛中找到了这行代码,但由于其他原因使用它,我真的不知道如何为我使用这段代码:
ActiveSheet.AutoFilter Field:=1, Criteria1:=Array(param1, param2, param3,...) _
Operator:=xlFilterValues
这样你就可以设置标准,但我想获取它。 我有什么想法可以使用这段代码?还是我的问题的另一个建议?
提前致谢!
编辑:
我已经花了很多时间在这上面,但仍然没有解决方案。实际上不可能在Array中的Criteria1中获取Array。始终相同的错误"无法分配给数组"。虽然我在...之前将相同的数组分配给Filter Criteria1 10行代码。
这样可行:
Dim arr(3) As String
arr(2) = "test1"
arr(1) = "test2"
arr(3) = "test3"
ActiveSheet.Range("A1:C1").AutoFilter Field:=1, Criteria1:=arr, Operator:=xlFilterValues
但这并不是:
arr = ws.AutoFilter.Filters.Criteria1
答案 0 :(得分:2)
Edit2:这会获取过滤器及其标题
Sub GetFilteredItems()
Dim fl As Filter
Dim ws As Worksheet: Set ws = ActiveSheet
Dim i As Long: i = 0
Dim myfilters As String
For Each fl In ws.AutoFilter.Filters
If fl.On Then
If Len(myfilters) = 0 Then
myfilters = ws.AutoFilter.Range.Offset(0, i).Resize(1, 1).Value
Else
myfilters = myfilters & "; " & _
ws.AutoFilter.Range.Offset(0, i).Resize(1, 1).Value
End If
If fl.Count > 2 Then
myfilters = myfilters & ": " & Replace(Join(fl.Criteria1), "=", "")
Else
myfilters = myfilters & ": " & Replace(fl.Criteria1, "=", "")
On Error Resume Next
myfilters = myfilters & " " & Replace(fl.Criteria2, "=", "")
On Error GoTo 0
End If
End If
i = i + 1
Next
Debug.Print myfilters
End Sub
我删除其他代码以避免混淆读者 这很像OP的方法,但有点直接。 HTH。
答案 1 :(得分:1)
最后我找到了答案!
问题不是太大,只是很难得到答案,因为你几乎没有在互联网上找到任何东西。
Dim criterias As String
Dim arr As Variant
For Each flt In ws.AutoFilter.Filters
If flt.On = True Then
'write the column head in the string
criterias = criterias & "=" & _
ws.AutoFilter.Range.Offset(0, i - 1).Resize(1, 1).Value & ": "
If flt.Count > 2 Then
arr = flt.Criteria1 '<----- my problem
For i = LBound(arr) To UBound(arr) '<-----
criterias = criterias & arr(i) '<-----
Next '<-----
Else
criterias = criterias & flt.Criteria1
On Error Resume Next
criterias = criterias & flt.Criteria2 & ", "
End If
End If
i = i + 1
Next flt
ws只是我的活动工作表
我没有意识到我应该创建Variant数组,而不是将它初始化为一个简单的String数组。
之后,标准字符串看起来像“Criteria1:= test1 = test2 = test3”,所以只需将“=”替换为“,”或类似的东西,你就完成了!
来自德国办事处的Axel Richter在这个问题上是一个很大的帮助;)(对于德国读者:http://www.office-loesung.de/p/viewtopic.php?f=166&t=666472&p=2773974#p2773974)