有没有办法查看哪些filter在Excel中处于活动状态,而不仅仅是渠道图标?

这个问题实际上是针对Excel的,而不是Excel的“编程”本身。 但是,如果在GUI中不可用,我会好奇的是,如果有VBA解决scheme(尽pipe我基本上没有VBA知识/经验)。

有没有一种方法可以查看哪些filter在Excel中处于活动状态,而不仅仅是查看渠道图标? 正如我所附的截图所示,一些电子表格可能有一些从可见屏幕延伸出来的列,所以很容易漏掉表示有效filter的漏斗图标。 (另外,我认为忽略这个图标可能相当容易,即使在几列中也是如此。)

列的例子离开屏幕

理想情况下,会有某种列表显示哪些列/头被主动过滤。

谢谢。

如果您只想要应用filter的列的简单列表,那么下面的VBA代码就足够了:

 Option Explicit Function FilterCrit() As String Dim i As Long Dim ws As Worksheet Dim Filter As String 'Application.Volatile Set ws = ThisWorkbook.Worksheets(1) If Not ws.FilterMode Then FilterCrit = "not filtered" Exit Function End If For i = 1 To ws.AutoFilter.Filters.Count If ws.AutoFilter.Filters(i).On Then FilterCrit = FilterCrit & "Filter on column " & i & Chr(10) End If Next i End Function 

这将迭代列,如果filter应用在这些列的任何一个,那么它将被列出。

默认情况下,所有UDF 用户定义的函数都不是易失性的,因此不会自动重新计算。 但是,您可以强制他们使用Application.Volatile自动重新计算。 但强烈build议不要使用此选项,因为它可能会严重减慢您的Excel文件。 这里推荐替代解决scheme: 替代Application.Volatile来自动更新UDF

这将突出显示包含有效filter的列。 此代码只是粗体和设置字体颜色红色,但您可以根据您的需要修改样式更改。

在这里输入图像说明

 Sub test() Call markFilter(ActiveSheet) End Sub Sub markFilter(wks As Worksheet) Dim lFilCol As Long With wks If .AutoFilterMode Then For lFilCol = 1 To .AutoFilter.Filters.Count '/ If filter is applied then mark the header as bold and font color as red If .AutoFilter.Filters(lFilCol).On Then .AutoFilter.Range.Columns(lFilCol).Cells(1, 1).Font.Color = vbRed .AutoFilter.Range.Columns(lFilCol).Cells(1, 1).Font.Bold = True Else '/ No Filter. Column header font normal and black. .AutoFilter.Range.Columns(lFilCol).Cells(1, 1).Font.Color = vbBlack .AutoFilter.Range.Columns(lFilCol).Cells(1, 1).Font.Bold = False End If Next Else '/ No Filter at all. Column header font normal and black. .UsedRange.Rows(1).Font.Color = vbBlack .UsedRange.Rows(1).Font.Bold = False End If End With End Sub 

 Sub Active_Filter() Dim Sht As Worksheet Dim lngCount As Long Dim i As Long Set Sht = ActiveSheet If Sht.FilterMode Then lngCount = Sht.AutoFilter.Filters.Count ' // Go through each column look for active Filter For i = 1 To lngCount Step 1 If Sht.AutoFilter.Filters(i).On Then Debug.Print "Filter is set on " & Sht.Columns(i).Address End If Next i End If End Sub