我编写了一个宏来搜索工作簿并将自动过滤器应用于任何具有名为“Code”的列的列表对象。但是,当我应用过滤器时,它不会过滤掉空行。关于我如何过滤这些的想法?
以下是应用过滤器的代码:
Public Sub ApplyFilter(filter As Variant)
Dim wb As Workbook
Dim ws As Worksheet
Dim lo As ListObject
Set wb = ActiveWorkbook
' Loop through each sheet in the workbook
For Each ws In wb.Sheets
' Find any listobjects within the sheet
For Each lo In ws.ListObjects
Dim r As Integer
' Find the column named Code and filter on this column
r = lo.Range.Rows(1).Find("Code").Column
' Clear any existing filter
lo.Range.AutoFilter Field:=r
' If the filter code is not "All Categories", 999, apply the filter
If filter(0) <> 999 Then
lo.Range.AutoFilter Field:=r, Criteria1:=filter, Operator:=xlFilterValues
End If
Next
Next
End Sub
传入的过滤器是一个数组,可能只有一个或多个条件。我也尝试过添加criteria2:=“”,但这并没有改变任何东西。
如果您有任何想法,请告诉我。谢谢!
以下是其他相关代码:
Public Sub FilterInvoice(filter As Range)
Me.ApplyFilter Me.BuildFilter(filter)
End Sub
Public Function BuildFilter(filter As Range) As Variant
Dim r As Range
Dim arFilter() As String
' Get the cell of the current category
Set r = Range("Categories").Find(filter.Value)
' Set the initial filter value to the category id
ReDim Preserve arFilter(1)
arFilter(0) = r.Offset(0, -1).Value
' Find any child categories, add child id's to filter array
For c = 1 To Application.CountIf(Range("Categories").Columns(3), arFilter(0))
Dim PrevChild As Range
' Expand the filter array
ReDim Preserve arFilter(c + 1)
If c = 1 Then
Set PrevChild = Range("Categories").Columns(3).Find(arFilter(0))
Else
' If it is not the first time through the loop, look for the next child after PrevChild
Set PrevChild = Range("Categories").Columns(3).Find(arFilter(0), PrevChild)
End If
' Offset the found child to get its code, add it to the filter array
arFilter(c) = PrevChild.Offset(, -2)
Next
' Add "<>" and "<900" to the criteria list to hide blank rows
'ReDim Preserve arFilter(UBound(arFilter) + 2)
'arFilter(UBound(arFilter) - 1) = "<>"
'arFilter(UBound(arFilter)) = "<900"
'Return the filter array
BuildFilter = arFilter
End Function
答案 0 :(得分:1)
如果使用数组过滤多个条件,则不包括“=”,自动过滤器应过滤空白。例如,这不会过滤空白:
Criteria1:=Array("test", "2", "3", "4", "=")
如果失败,您可能需要使用specialcells(xlcelltypeblanks)手动隐藏它们。
编辑:
好吧,我想我可能会把你弄糊涂我的第一个解决方案。我已将其删除。
现在我可以看到你的代码我认为可能发生的事情是,当你循环遍历范围并添加标准时,你可能正在添加一个空白单元格。逐个循环,确保不是这种情况。您可以添加它以显示过滤器并确保它不包含空格:
Debug.Print Join(arfilter,“,”)
答案 1 :(得分:0)
我知道这是一个老问题,但是我在互联网上找不到任何令人满意的答案
所以我想分享一个看起来效果很好的解决方案:
ActiveSheet.Range("$A$1:$V$3000").AutoFilter Field:=ActiveSheet.Range("$A$1:$V$1").Find("Monitoring").Column, _
Criteria1:="<>Done", Operator:=xlFilterValues
空白单元格仍然存在,因此我们无需过滤掉它们
ActiveSheet.Range("$A$1:$V$1").Find("Monitoring").EntireColumn.SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
当然,因为它使用xlFilterValues,所以您也可以使用Array过滤器
ActiveSheet.Range("$A$1:$V$3000").AutoFilter Field:=ActiveSheet.Range("$A$1:$V$1").Find("Monitoring").Column, _
Criteria1:=Array( _
"Department1", "Department2", "Department3", "Department4", _
"Department5", "Department6", "="), Operator:=xlFilterValues
希望您喜欢!