Как удалить пустые строки при использовании автофильтра Excel VBA

Я написал макрос, который выполняет поиск в книге и применяет автофильтр к любым листобъектам, у которых есть столбец с именем «Код». Однако когда я применяю фильтр, он не отфильтровывает пустые строки. Есть идеи, как их отфильтровать?

Вот код, который применяет фильтр:

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

Передаваемый фильтр представляет собой массив, который может иметь только один критерий или несколько. Я также пробовал добавить критерий2: = "", но это ничего не изменило.

Дайте мне знать, если у вас есть идеи. Спасибо!

Вот другой связанный код:

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

person JoshPeltier    schedule 12.10.2011    source источник


Ответы (2)


Если вы фильтруете по нескольким критериям с использованием массива, то, не включая «=», автофильтр должен фильтровать пустые места. Например, это НЕ будет фильтровать пробелы:

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

В противном случае вам может потребоваться скрыть их вручную с помощью специальных ячеек (xlcelltypeblanks).

РЕДАКТИРОВАТЬ:

Ладно, думаю, я запутала вас своим первым решением. Я удалил это.

Теперь, когда я вижу ваш код, я думаю, что может происходить то, что, когда вы просматриваете диапазон и добавляете свои критерии, вы, вероятно, добавляете пустую ячейку. Пройдите по циклу по очереди и убедитесь, что это не так. Вы можете добавить это, чтобы отобразить фильтр и убедиться, что он не содержит пробелов:

Debug.Print Join (arfilter, ",")

person Reafidy    schedule 12.10.2011
comment
Не могли бы вы расшириться? Мне нужно, чтобы одним из критериев был мой массив, содержащий коды, которые я фильтрую. Я пробовал использовать массив как критерий 1 и ‹› как критерий 2, это не дало результатов. Если я оставлю для оператора значение xlFilterValues, он даст исходные результаты (с пустыми строками). Из любопытства, что означают критерии ‹›? - person JoshPeltier; 13.10.2011
comment
Если вам нужна дополнительная помощь, покажите мне код, который заполняет фактический фильтр, который вы используете, и вызывает подпрограмму applyfilter. - person Reafidy; 13.10.2011
comment
Думаю, это будет вручную. Я изменяю код фильтра сборки, чтобы добавить как ‹›, так и ‹900 в конец массива, и он продолжал давать мне забавные результаты как с xlAnd, так и с xlFilterValues. Спасибо за вклад! - person JoshPeltier; 13.10.2011
comment
Ты прав. Мне нужно было, чтобы моим первым сохранением redim было arfilter (0), а не arfilter (1). Спасибо за помощь! - person JoshPeltier; 13.10.2011

Я знаю, что это старый вопрос, но я не смог найти удовлетворительного ответа нигде в Интернете.

Итак, я хотел бы поделиться решением, которое, похоже, работает очень хорошо:

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

Надеюсь, ты повеселишься!

person fro zen    schedule 10.01.2019