簡體   English   中英

使用Excel VBA自動篩選時如何刪除空白行

[英]How to remove blank rows when using Excel VBA Autofilter

我編寫了一個宏,該宏可搜索工作簿並將自動過濾器應用於具有名為“代碼”的列的任何列表對象。 但是,當我應用過濾器時,它不會過濾掉空白行。 關於如何過濾掉這些的任何想法?

這是應用過濾器的代碼:

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

如果要使用數組通過多個條件進行過濾,則不包括“ =”,則自動過濾器應過濾空白。 例如,這將不會過濾空白:

Criteria1:=Array("test", "2", "3", "4", "=")

否則,您可能需要使用specialcells(xlcelltypeblanks)手動隱藏它們。

編輯:

好吧,我想我可能已經把我的第一個解決方案弄糊塗了。 我已將其刪除。

現在,我可以看到您的代碼,我認為可能正在發生的事情是,當您遍歷范圍並添加條件時,可能正在添加一個空白單元格。 一次完成一個循環,並確保不是這種情況。 您可以添加它以顯示過濾器,並確保它不包含空格:

Debug.Print Join(arfilter,“,”)

我知道這是一個老問題,但是我在互聯網上找不到任何令人滿意的答案

因此,我想分享一個看起來效果很好的解決方案:

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

希望你喜歡!

暫無
暫無

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

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