web-dev-qa-db-ja.com

Excel 2013 VBA Clear All Filtersマクロ

古いマクロは機能していないようです。 VBAマクロを実行するための適切なセキュリティ設定がありますが、ワークシート上のすべてのフィルターをクリアするためのいくつかの方法を試したときに、コンパイルエラーが発生します。

ここに私が試したものがあります:


Sub AutoFilter_Remove()
'This macro removes any filtering in order to display all of the data but it does not remove the filter arrows
ActiveSheet.ShowAllData
End Sub

シートにはフィルターがある列がたくさんあるので、ユーザーが使いやすいようにすべてのフィルターをクリアするボタンがシートにあります。

37
CJSoldier

シートにフィルターが既にある場合:

Sub Macro1()
    Cells.AutoFilter
End Sub

削除します。

30
Gary's Student

これを試して:

If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData
53
CRondao

フィルターが現在適用されていない場合、ShowAllDataはエラーをスローします。これは動作します:

Sub ResetFilters()
    On Error Resume Next
    ActiveSheet.ShowAllData
End Sub
26
BobbyA

テーブルの場合は、これを試して、オンかオフかを確認してください。

If wrkSheetCodeName.ListObjects("TableName").ShowAutoFilter Then
    wrkSheetCodeName.ListObjects("TableName").Range.AutoFilter
End if

再び有効にするには:

wrkSheetCodeName.ListObjects("TableName").Range.AutoFilter
16
Aaron Donnelly

これはすてきです。

If ActiveSheet.AutoFilterMode Then Cells.AutoFilter
9
saltorr

この回避策は非常に効果的に機能することがわかりました。基本的にテーブルからオートフィルターを削除してから再適用し、以前のフィルターを削除します。私の経験から、これはここで言及した他の方法で必要なエラー処理の傾向はありません。

Set myTable = YOUR_SHEET.ListObjects("YourTableName")

myTable.ShowAutoFilter = False
myTable.ShowAutoFilter = True
5

それは素晴らしいです。私が見つけた唯一の答えは、私の特定のニーズを満たしてくれたことです。ありがとうございますSO

画面が点滅せず、[ワークブック内のすべてのシートに同じパスワードがあります]が切り替わるたびに、各シートのパスワードが削除されて再適用されるように、ほんの少し追加しました。あなたの提出の精神で、私はこれを他の誰かを助けるために追加します。

Sub ClearFilters()
    Application.ScreenUpdating = False

    On Error Resume Next
    For Each wrksheet In ActiveWorkbook.Worksheets
        'Change the password to whatever is required
        wrksheet.Unprotect Password:="Albuterol1"
        wrksheet.ShowAllData 'This works for filtered data not in a table

        For Each lstobj In wrksheet.ListObjects
            If lstobj.ShowAutoFilter Then
                lstobj.Range.AutoFilter 'Clear filters from a table
                lstobj.Range.AutoFilter 'Add the filters back to the table
            End If

        'Change the password to whatever is required
        wrksheet.Protect Password:="Albuterol1", _
              DrawingObjects:=True, _
              Contents:=True, _
              Scenarios:=True, _
              AllowFiltering:=True
        Next 'Check next worksheet in the workbook
    Next

    Application.ScreenUpdating = True
End Sub

私はこれが比較的古い投稿であり、ネクロマンサーであることを本当に好きではないことを知っています...しかし、私は同じ問題を抱えており、成功せずにこのスレッドでいくつかのオプションを試したので、作業マクロを得るためにいくつかの答えを組み合わせました..

うまくいけば、これはそこに誰かを助ける:)

Sub ResetFilters()
    On Error Resume Next
    For Each wrksheet In ActiveWorkbook.Worksheets
        wrksheet.ShowAllData 'This works for filtered data not in a table
        For Each lstobj In wrksheet.ListObjects
            If lstobj.ShowAutoFilter Then
                lstobj.Range.AutoFilter 'Clear filters from a table
                lstobj.Range.AutoFilter 'Add the filters back to the table
            End If
        Next 'Check next worksheet in the workbook
    Next
End Sub
4
Shadmage

Excelには2種類のフィルターがあります。

  • オートフィルター
  • 高度なフィルター

自動フィルター機能を使用すると、これらの小さなドロップダウンボタンを使用してExcelインターフェイスからフィルターできます。また、高度なフィルタ機能を使用すると、基準範囲を使用してフィルタリングできます。

ShowAllメソッドは、すべての行を表示するようにフィルターを削除しますが、これらのドロップダウンボタンは削除しません。これらのボタンを削除するには、ワークシートのAutoFilterModeプロパティをFALSEに設定する必要があります。

これは、フィルターを削除するために頻繁に使用するSubです。

Sub RemoveFilters(ByRef WhichSheet As Worksheet)

If WhichSheet.FilterMode Then WhichSheet.ShowAllData
If WhichSheet.AutoFilterMode Then WhichSheet.AutoFilterMode = False

End Sub

これにより、すべてのデータが表示され、ドロップダウンボタンが削除されます。複数のシートまたはワークブックからデータを積み重ねる(コピーして貼り付ける)ときに便利です。お役に立てれば。

3
Ejaz Ahmed

私は通常このコードを使用します

Sub AutoFilter_Remove()
    Sheet1.AutoFilterMode = False  'Change Sheet1 to the relevant sheet
                                   'Alternatively: Worksheets("[Your Sheet Name]").AutoFilterMode = False
End Sub

これも機能します:

If ActiveSheet.FilterMode Then cells.AutoFilter
3
Linga

これは、最初にAutoFilterModeが設定されているかどうかをチェックし(フィルタリングが可能)、次にFilterModeがオンになっている(何かをフィルタリングしている)かどうかをチェックし、フィルタリングをオフにします。

エラー、つまり保護に関して-その他の回答

コンテキストが追加されました(私のスクリプトはシートをループし、CSVとして保存されるため、フィルターを削除する必要がありますが、設定されている場合はAutoFilterModeをオンのままにします。

For Each WS In ActiveWorkbook.Worksheets
  Select Case WS.Name
    Case "01", "02", "03", "04", "05"
      With WS
        If WS.AutoFilterMode Then
            If WS.FilterMode Then WS.ShowAllData
        End If

        ' Processing data
      End With
    Case Else
      ' Nothing to see here
  End Select
Next
2
sastorsl

次のようなものを試してください:

Sub ClearDataFilters()
'Clears filters on the activesheet. Will not clear filters if the sheet is protected.
On Error GoTo Protection
If ActiveWorkbook.ActiveSheet.FilterMode Or _
   ActiveWorkbook.ActiveSheet.AutoFilterMode Then _
   ActiveWorkbook.ActiveSheet.ShowAllData

Exit Sub
Protection:
If Err.Number = 1004 And Err.Description = _ 
    "ShowAllData method of Worksheet class failed" Then
    MsgBox "Unable to Clear Filters. This could be due to protection on the sheet.", _
    vbInformation
End If

End Sub

ワークシートがフィルターモードの場合、.FilterModeはtrueを返します。 ( 詳細はこちら を参照してください。)
これを参照.AutoFilterの詳細について。
そして最後に、 this.ShowAllDataメソッドに関する詳細情報を提供します。

1
ARich

これが私が使用しているワンライナーです。自動フィルタをチェックし、見つかった場合は削除します。

いくつかの回答とは異なり、このコードは、最初に自動フィルター処理されていないワークシートで使用された場合、自動フィルターを作成しません。

If Cells.AutoFilter Then Cells.AutoFilter
1
ChrisB

私はこのアプローチをユニークな方法としてマルチテーブルとレンジシートに使用しています。

Sub RemoveFilters(Ws As Worksheet)
Dim LO As ListObject
On Error Resume Next
    Ws.ShowAllData
    For Each LO In Ws.ListObjects
        LO.ShowAutoFilter = True
        LO.AutoFilter.ShowAllData
    Next
    Ws.ShowAllData
End Sub
0
Mahhdy

フィルターを修正するためのコードを次に示します。たとえば、シートでフィルターをオンにしてから列を追加した場合、新しい列もフィルターで覆われるようにします。

Private Sub AddOrFixFilters()

    ActiveSheet.UsedRange.Select

    ' turn off filters if on, which forces a reset in case some columns weren't covered by the filter
    If ActiveSheet.AutoFilterMode Then
        Selection.AutoFilter
    End If

    ' turn filters back on, auto-calculating the new columns to filter
    Selection.AutoFilter

End Sub
0
AdmiralAdama

フィルターヘッダーをアクティブにしてshowalldataを実行するだけで、100%動作します。何かのようなもの:

Range("A1:Z1").Activate
ActiveSheet.ShowAllData

Range("R1:Y1").Activate
ActiveSheet.ShowAllData

A1:Z1とR1:Y1にそれぞれフィールドヘッダーがある場合。

0
JDuarteDJ

これを試して:

Sub ResetFilters()
    Dim ws                    As Worksheet
    Dim wb                    As Workbook
    Dim listObj               As ListObject

    For Each ws In ActiveWorkbook.Worksheets
        For Each listObj In ws.ListObjects
            If listObj.ShowHeaders Then
                listObj.AutoFilter.ShowAllData
                listObj.Sort.SortFields.Clear
            End If
        Next listObj
    Next ws
End Sub

このコードは、すべてのフィルターをクリアし、並べ替えを削除します。

ソース: ワークブック内の各テーブルのフィルターの削除、VBA

0
Markus Hanisch

あなたが必要なのは:

    ActiveSheet.AutoFilter.ShowAllData

どうして?ワークシートと同様に、AutoFilterにもShowAllDataメソッドがありますが、アクティブなフィルターなしで自動フィルターが有効になっていてもエラーはスローされません。

0
John Joseph

これは、フィルターがある場合にのみクリアされ、フィルターがない場合でもエラーは発生しません。 If ActiveSheet.AutoFilterMode Then ActiveSheet.Columns( "A")。AutoFilter

0
ganga chamlagai

これは私に最適です。

通常、ファイルを保存して閉じる前に次を使用します。

Sub remove_filters

ActiveSheet.AutofilterMode = False

End Sub
0
Rahul Takalikar

フィルターがオンの場合、.filtermodeを使用してtrueを返します

Dim returnValue As Boolean
    returnValue = worksheet1.FilterMode

    if returnValue Then
    worksheet1.ShowAllData
    End If
0
Kesko

このスレッドは古くからありますが、与えられた答えのどれにも満足せず、自分で書いてしまいました。私は今それを共有しています:

まずは:

  Sub ResetWSFilters(ws as worksheet)
             If ws.FilterMode Then   
     ws.ShowAllData   
     Else   
     End If  
    'This gets rid of "normal" filters - but tables will remain filtered
    For Each listObj In ws.ListObjects 
               If listObj.ShowHeaders Then   
                    listObj.AutoFilter.ShowAllData
                    listObj.Sort.SortFields.Clear    
               End If     
       Next listObj
        'And this gets rid of table filters
        End Sub

特定のワークシートをこのマクロにフィードすると、その1つのワークシートだけがフィルター解除されます。ワークシートを1つだけ明確にする必要がある場合に役立ちます。ただし、通常はワークブック全体を実行したい

Sub ResetAllWBFilters(wb as workbook)
  Dim ws As Worksheet  
  Dim wb As Workbook  
  Dim listObj As ListObject    

       For Each ws In wb.Worksheets  
          If ws.FilterMode Then 
          ws.ShowAllData  
          Else   
          End If   
 'This removes "normal" filters in the workbook - however, it doesn't remove table filters           
   For Each listObj In ws.ListObjects 
        If listObj.ShowHeaders Then   
             listObj.AutoFilter.ShowAllData 
             listObj.Sort.SortFields.Clear    
        End If     
   Next listObj

        Next   
'And this removes table filters. You need both aspects to make it work.  
    End Sub

これを使用するには、たとえば、処理する必要があるワークブックを開き、処理を行う前にフィルターをリセットします。

Sub ExampleOpen()
Set TestingWorkBook = Workbooks.Open("C:\Intel\......") 'The .open is assuming you need to open the workbook in question - different procedure if it's already open
Call ResetAllWBFilters(TestingWorkBook)
End Sub

最もよく使用するもの:モジュールが保存されているワークブック内のすべてのフィルターをリセットする:

Sub ResetFilters()
      Dim ws As Worksheet  
      Dim wb As Workbook  
      Dim listObj As ListObject  
       Set wb = ThisWorkbook  
       'Set wb = ActiveWorkbook
       'This is if you place the macro in your personal wb to be able to reset the filters on any wb you're currently working on. Remove the set wb = thisworkbook if that's what you need
           For Each ws In wb.Worksheets  
              If ws.FilterMode Then 
              ws.ShowAllData  
              Else   
              End If   
     'This removes "normal" filters in the workbook - however, it doesn't remove table filters           
       For Each listObj In ws.ListObjects 
            If listObj.ShowHeaders Then   
                 listObj.AutoFilter.ShowAllData 
                 listObj.Sort.SortFields.Clear    
            End If     
       Next listObj

            Next   
'And this removes table filters. You need both aspects to make it work.  
    End Sub
0
Selkie