2014-07-15 47 views
1

我在一堆列上有一個標準過濾器,我想閱讀過濾器標準。在選擇超過2個標準的情況下,這不是真正的問題。我有一行不同的字符串,我希望能夠得到用戶選擇的標準。目前我正在處理這段代碼:VBA:返回超過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個標準最大值的機會。 我發現這條線在不同的論壇代碼,但它被用於其他的原因,我真的不知道如何使用我這個代碼:

ActiveSheet.AutoFilter Field:=1, Criteria1:=Array(param1, param2, param3,...) _ 
         Operator:=xlFilterValues 

這樣你就可以設置標準,我認爲,但我想得到吧。 任何想法如何我可以使用此代碼?或者我的問題的另一個建議?

在此先感謝!


編輯:

嗯,我曾在這個有很多的時間,仍然沒有解決。在Array中的Criteria1中獲取數組是不可能的。總是相同的錯誤「不能分配給數組」。雖然我分配了相同的陣列來篩選標準1 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 

回答

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。

+0

謝謝您的回答!但我早些時候有這樣一個方法,它有一個問題,我會通過例子來解釋它:Col1包含Test1,Test2和Test3; Col2包含1,2,1。現在我通過Test1和Test2篩選Col1,並通過1篩選Col2。 在這一點上,該方法只返回Test1和1,但它應該返回Test1,Test2和1. 我不明白,如果我將鼠標指向filter-dropdown按鈕,它確切地說明了我想要獲取的內容!但我不知道該從哪裏得到它......而且,由於我在一週的研究中沒有找到答案,我可能會認爲沒有答案。 – ch1ll

+0

@ sk1ll實際上,該例程也可以在其他列上獲取過濾器。但是如果過濾了某些東西,你需要添加檢查。 – L42

+0

我知道,但方法運行時,所有的過濾器設置。只有在應用了所有濾鏡後纔會查看這些值。在像我上面所述的情況下,可能會有一個過濾器集,但沒有實際值,因爲另一列中的其他過濾器使該行不可見。 可以理解嗎?或者我只是想念一些東西而不理解你? – ch1ll

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只是我的活動工作

我不知道,我應該做的陣列變異,而不是初始化它作爲一個簡單的字符串數組。

之後,標準字符串看起來像「Criteria1:= test1 = test2 = test3」,所以只需將「=」替換爲「,」或類似的東西,你就完成了!

阿克塞爾從德國辦公室裏氏板在這個問題上有很大幫助;)(爲德國讀者:http://www.office-loesung.de/p/viewtopic.php?f=166&t=666472&p=2773974#p2773974