簡體   English   中英

如何使用 VBA 在 Excel 2016 中獲取篩選條件?

[英]How do I get Filter Criteria in Excel 2016 using VBA?

我正在處理將過濾器應用於標題列的 Excel 2016 VBA 宏。 之后,用戶應用過濾條件。 我希望能夠在 VBA 中檢索用戶應用的過濾條件並將其保存到字符串數組中。 有沒有辦法訪問過濾條件?

我檢查了這個問題並幾乎復制了代碼的第一部分,唯一的問題是你沒有得到它所應用的領域,這可能會有問題。

Dim sht As Worksheet
Set sht = ActiveSheet
With sht.AutoFilter
    With .Filters
        ReDim filtarr(1 To .Count, 1 To 3)
        For f = 1 To .Count
            With .Item(f)
                If .On Then
                    filtarr(f, 1) = .Criteria1
                    Debug.Print .Criteria1
                    If .Operator Then
                        filtarr(f, 2) = .Operator
                        filtarr(f, 3) = .Criteria2
                        Debug.Print .Operator & ", " & .Criteria2
                    End If
                End If
            End With
        Next f
    End With
End With

我想在討論中補充一點。 在研究如何“返回”過濾器狀態時,我發現了這個(以及其他優秀的幫助來源)。 就我而言,我想在工作表的單元格中顯示過濾器狀態。

正如我所說,這個問題和許多其他類似的問題都非常有用。 由此,我能夠構建下面代碼中顯示的函數。

我將我想要過濾器狀態的表的名稱傳遞給它...因此它作為 RANGE 傳遞,然后需要在 PARENT(工作表)中查找信息。 這是因為它來自 SHEET 上可能有幾個表,所以我不能只使用 SHEET 本身來獲取 Autofilter 信息。

這很好用,除了一件事:如果工作表上的活動單元格不在相關表格內,該函數會將過濾器的數量視為零(下面示例中的 WholeTable.Parent.Autofilter.Filters.Count)。 我不明白為什么會這樣,也不明白如何預防。 如果活動單元格在表格范圍內,則效果很好。

任何提示將不勝感激!

代碼:


Public Function AutoFilterCriteria(ByVal WholeTable As Range) As String

On Error Resume Next

If WholeTable.Parent.AutoFilter Is Nothing Then                     ' if no filter is applied
    AutoFilterCriteria = "None"
    On Error GoTo 0
    Exit Function
End If

Dim LongStr As String, FirstOne As Boolean
LongStr = ""
FirstOne = False

Dim iFilt As Integer
For iFilt = 1 To WholeTable.Parent.AutoFilter.Filters.Count         ' loop through each column of the table
    Dim ThisFilt As Filter
    Set ThisFilt = WholeTable.Parent.AutoFilter.Filters(iFilt)      ' look at each filter
    On Error Resume Next
    With ThisFilt
        If .On Then
            If FirstOne Then LongStr = LongStr & " AND "            ' Get column title
            LongStr = LongStr & "[" & WholeTable.Parent.Cells(WholeTable.Row - 1, WholeTable.Column + iFilt - 1).Value & ":"
            On Error GoTo Handle
            If .Operator = xlFilterValues Then                      ' dont really care to enumerate multiples, just show "multiple"
                LongStr = LongStr & "<Multiple>]"
            ElseIf .Operator = 0 Then
                LongStr = LongStr & .Criteria1 & "]"
            ElseIf .Operator = xlAnd Then
                LongStr = LongStr & .Criteria1 & " AND " & .Criteria2 & "]"
            ElseIf .Operator = xlOr Then
                LongStr = LongStr & .Criteria1 & " OR " & .Criteria2 & "]"
            End If
            On Error GoTo 0
            FirstOne = True
        End If
    End With
Next

AutoFilterCriteria = LongStr
On Error GoTo 0
Exit Function

Handle:
AutoFilterCriteria = "! Error !"
On Error GoTo 0

End Function

代碼將是這樣的。 字段代碼為cells(1, f)。

Dim sht As Worksheet
Set sht = ActiveSheet
With sht.AutoFilter
    With .Filters
        ReDim filtarr(1 To .Count, 1 To 4) ' change array
        For f = 1 To .Count
            With .Item(f)
                If .On Then
                    filtarr(f, 1) = .Criteria1
                    filtarr(f, 4) = Cells(1, f) 'field
                    Debug.Print .Criteria1, Cells(1, f)
                    If .Operator Then
                        filtarr(f, 2) = .Operator
                        filtarr(f, 3) = .Criteria2

                        Debug.Print .Operator & ", " & .Criteria2
                    End If
                End If
            End With
        Next f
    End With
End With

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM