2011-10-12 4 views
1

Я написал макрос, который выполняет поиск по книге и применяет автофильтр для любых списков, имеющих столбец с именем «Код». Однако, когда я применяю фильтр, он не отфильтровывает пустые строки. Любая идея о том, как я могу их отфильтровать?Как удалить пустые строки при использовании 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 

Фильтр, который передается в массив, который, возможно, только один критерий, или много. Я также попытался добавить критерии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 

ответ

1

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

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

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

EDIT:

Хорошо, я думаю, что я мог бы спутать вас там с моим первым решением. Я удалил его.

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

Debug.Print Регистрация (arfilter «»)

+0

Вы не возражаете расширения? Мне нужен один из критериев, чтобы быть моим массивом, содержащим коды, для которых я фильтрую. Я попытался использовать массив в качестве критериев 1 и «<>» в качестве критериев 2, он не дал никаких результатов. Если оставить оператор, установленный в xlFilterValues, он даст исходные результаты (с пустыми строками). Из любопытства, что означает «<>» критерии? – JoshPeltier

+0

См. Мое редактирование, «<>» означает «не пусто» – Reafidy

+0

Если вам нужна дополнительная помощь, пожалуйста, покажите мне код, который заполняет фактический фильтр, который вы используете, и вызывает подпрограмму applyfilter. – Reafidy

Смежные вопросы