2011-10-12 11 views
1

ブックを検索し、 "コード"という名前の列を持つlistobjectsにオートフィルタを適用するマクロを作成しました。ただし、フィルタを適用すると、空白の行が除外されません。どのようにこれらをフィルタリングすることができますか?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 

に渡されるフィルタは、単に1つの基準、または多くを有することができる配列である:ここ

フィルタを適用するコードです。私は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 

答えて

1

「=」オートフィルタは空白をフィルタリングする必要があります。ここでは

は、他の関連するコードです。たとえば、これは空白をフィルタリングしません。

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

手動specialcells(xlcelltypeblanks)を使用して、それらを非表示にする必要があるかもしれない失敗します。

EDIT:

わかりました、私は私が私の最初の溶液でそこを混同しているかもしれないと思います。私はそれを削除しました。

私はあなたのコードを見ることができました。何が起こっているのだろうと思うのは、あなたが範囲をループして基準を追加するときにおそらく空白のセルを追加することです。ループを一度に1つずつ実行し、そうでないことを確認します。あなたは、フィルタを表示し、それは空白が含まれていないことを確認するためにこれを追加することができます。

ます。Debug.Print(arfilter、「」)

+0

に参加し、あなたが拡大して気にしませんか?私は、私がフィルタリングしているコードを含む配列であるという基準の一つが必要です。私は条件1と "<>"として条件2として配列を使用しようとしましたが、結果は得られませんでした。演算子をxlFilterValuesに設定したままにすると、元の結果(空白行)が得られます。好奇心から "<>"基準はどういう意味ですか? – JoshPeltier

+0

私の編集を見てください。 "<>"は "空白ではない"という意味です – Reafidy

+0

もっと助けが必要な場合は、使用している実際のフィルターを挿入するコードを表示して、applyfilterサブルーチンを呼び出してください。 – Reafidy

関連する問題