古いマクロは機能していないようです。 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
シートにはフィルターがある列がたくさんあるので、ユーザーが使いやすいようにすべてのフィルターをクリアするボタンがシートにあります。
シートにフィルターが既にある場合:
Sub Macro1()
Cells.AutoFilter
End Sub
削除します。
これを試して:
If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData
フィルターが現在適用されていない場合、ShowAllDataはエラーをスローします。これは動作します:
Sub ResetFilters()
On Error Resume Next
ActiveSheet.ShowAllData
End Sub
テーブルの場合は、これを試して、オンかオフかを確認してください。
If wrkSheetCodeName.ListObjects("TableName").ShowAutoFilter Then
wrkSheetCodeName.ListObjects("TableName").Range.AutoFilter
End if
再び有効にするには:
wrkSheetCodeName.ListObjects("TableName").Range.AutoFilter
これはすてきです。
If ActiveSheet.AutoFilterMode Then Cells.AutoFilter
この回避策は非常に効果的に機能することがわかりました。基本的にテーブルからオートフィルターを削除してから再適用し、以前のフィルターを削除します。私の経験から、これはここで言及した他の方法で必要なエラー処理の傾向はありません。
Set myTable = YOUR_SHEET.ListObjects("YourTableName")
myTable.ShowAutoFilter = False
myTable.ShowAutoFilter = True
それは素晴らしいです。私が見つけた唯一の答えは、私の特定のニーズを満たしてくれたことです。ありがとうございます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
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
これにより、すべてのデータが表示され、ドロップダウンボタンが削除されます。複数のシートまたはワークブックからデータを積み重ねる(コピーして貼り付ける)ときに便利です。お役に立てれば。
私は通常このコードを使用します
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
これは、最初に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
次のようなものを試してください:
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
メソッドに関する詳細情報を提供します。
これが私が使用しているワンライナーです。自動フィルタをチェックし、見つかった場合は削除します。
いくつかの回答とは異なり、このコードは、最初に自動フィルター処理されていないワークシートで使用された場合、自動フィルターを作成しません。
If Cells.AutoFilter Then Cells.AutoFilter
私はこのアプローチをユニークな方法としてマルチテーブルとレンジシートに使用しています。
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
フィルターを修正するためのコードを次に示します。たとえば、シートでフィルターをオンにしてから列を追加した場合、新しい列もフィルターで覆われるようにします。
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
フィルターヘッダーをアクティブにしてshowalldataを実行するだけで、100%動作します。何かのようなもの:
Range("A1:Z1").Activate
ActiveSheet.ShowAllData
Range("R1:Y1").Activate
ActiveSheet.ShowAllData
A1:Z1とR1:Y1にそれぞれフィールドヘッダーがある場合。
これを試して:
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
このコードは、すべてのフィルターをクリアし、並べ替えを削除します。
あなたが必要なのは:
ActiveSheet.AutoFilter.ShowAllData
どうして?ワークシートと同様に、AutoFilterにもShowAllDataメソッドがありますが、アクティブなフィルターなしで自動フィルターが有効になっていてもエラーはスローされません。
これは、フィルターがある場合にのみクリアされ、フィルターがない場合でもエラーは発生しません。 If ActiveSheet.AutoFilterMode Then ActiveSheet.Columns( "A")。AutoFilter
これは私に最適です。
通常、ファイルを保存して閉じる前に次を使用します。
Sub remove_filters
ActiveSheet.AutofilterMode = False
End Sub
フィルターがオンの場合、.filtermode
を使用してtrueを返します
Dim returnValue As Boolean
returnValue = worksheet1.FilterMode
if returnValue Then
worksheet1.ShowAllData
End If
このスレッドは古くからありますが、与えられた答えのどれにも満足せず、自分で書いてしまいました。私は今それを共有しています:
まずは:
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