programing

Excel 2013 VBA Clear All Filters 매크로

linuxpc 2023. 4. 21. 20:18
반응형

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

시트에 필터가 있는 컬럼이 많기 때문에 사용자가 사용하기 쉽도록 모든 필터를 지울 수 있는 버튼이 있습니다.

이것을 시험해 보세요.

If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData

필터가 현재 적용되지 않으면 ShowAllData가 오류를 발생시킵니다.이 조작은 유효합니다.

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

시트에 이미 필터가 붙어 있는 경우는, 다음의 순서에 따릅니다.

Sub Macro1()
    Cells.AutoFilter
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

훌륭합니다. 제가 찾은 유일한 답변은 저의 특별한 욕구를 충족시키는 것입니다.참고마워요!

화면이 깜박이지 않도록 약간의 추가만 하면 [워크북의 모든 시트에 동일한 비밀번호가 할당됩니다]를 반복하면서 각 시트에 비밀번호가 삭제되었다가 다시 적용됩니다.당신의 투고 정신에 따라, 다른 누군가를 돕기 위해 이 말을 덧붙입니다.

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에는 두 가지 유형의 필터가 있습니다.

  • 자동 필터
  • 고급 필터

자동 필터 기능을 사용하면, 이러한 작은 드롭 다운 버튼을 사용해 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

모든 데이터가 표시되며 드롭다운버튼이 삭제됩니다.여러 시트 또는 워크북에서 데이터를 스태킹(복사 및 붙여넣기)할 때 유용합니다.이게 도움이 됐으면 좋겠다.

저는 이 회피책이 꽤 효과적이라는 것을 알았습니다.기본적으로 테이블에서 자동 필터가 삭제되었다가 다시 적용되므로 이전 필터가 모두 삭제됩니다.지금까지의 경험으로 볼 때, 여기에 기재되어 있는 다른 방법에서는, 에러 처리가 필요하게 되는 일은 없습니다.

Set myTable = YOUR_SHEET.ListObjects("YourTableName")

myTable.ShowAutoFilter = False
myTable.ShowAutoFilter = True

이것도 동작합니다.

If ActiveSheet.FilterMode Then cells.AutoFilter

나는 보통 이 코드를 사용한다.

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

그러면 먼저 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.
그리고 마지막으로, 이것은 다음 정보에 대해 더 많은 정보를 제공합니다..ShowAllData★★★★★★ 。

여기 제가 사용하는 원라이너가 있습니다.자동 필터를 체크하고, 검출되면 삭제합니다.

일부 응답과 달리 이 코드는 처음부터 자동 필터링되지 않은 워크시트에 사용되는 경우 자동 필터링을 생성하지 않습니다.

If Cells.AutoFilter Then Cells.AutoFilter

필요한 것은 다음과 같습니다.

    ActiveSheet.AutoFilter.ShowAllData

이유는 무엇입니까? 워크시트와 마찬가지로 AutoFilter에도 ShowAllData 메서드가 있지만 활성 필터 없이 자동 필터를 사용하도록 설정한 경우에도 오류가 발생하지 않습니다.

저는 이게 제일 좋아요.

파일을 저장하고 닫기 전에 보통 다음을 사용합니다.

Sub remove_filters

ActiveSheet.AutofilterMode = False

End Sub

필터 헤더를 활성화하고 showaldata를 실행하면 100% 작동합니다.예를 들어 다음과 같습니다.

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

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

A1:Z1 및 R1에 필드 헤더가 있는 경우:각각 Y1 입니다.

.filtermode가 반환됩니다.

Dim returnValue As Boolean
    returnValue = worksheet1.FilterMode

    if returnValue Then
    worksheet1.ShowAllData
    End If

이것을 시험해 보세요.

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)

여기 필터를 수정하기 위한 코드가 있습니다.예를 들어 시트에서 필터를 켜면 열을 추가한 다음 새 열도 필터로 덮이도록 할 수 있습니다.

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

이 실마리는 아주 오래된 것이지만, 나는 어떤 대답도 마음에 들지 않았고, 결국 나만의 글을 쓰게 되었다.지금 공유합니다.

우선은 다음과 같습니다.

  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

이 매크로에 특정 워크시트를 입력하면 해당 워크시트가 필터링되지 않습니다.워크시트가 하나만 명확한지 확인해야 할 경우 유용합니다.그러나 나는 보통 워크북 전체를 하고 싶다.

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

필터가 있는 경우에만 지워지고 필터가 없는 경우에도 오류가 발생하지 않습니다.ActiveSheet의 경우.AutoFilterMode, ActiveSheet 순으로 선택합니다.열("A")자동 필터

멀티 테이블과 레인지 시트에 이 방법을 사용하고 있습니다.

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

와우, 나중에 로그인하면 첫 번째 줄의 일부를 제외하고 모두 삭제되었습니다.내 잘못이다.하지만, 이것은 간단할 것이다.

두 테스트 모두 Sheet1 Filter의 A1 및 A5에 공백으로만 텍스트를 입력합니다.A5에서 텍스트 입력 테스트 중 하나를 실행합니다. 필터링을 시도해 보십시오!

Sub SubsequentFilterFails()
   With Sheet1     'assumes code name is still Sheet1
      .ShowAllData  'assumes a filter has been applied
      .Range(.Cells(2, 1), .Cells(7, 1)).EntireRow.Delete
   End With
End Sub

Sub SubsequentFilterWorks()
   With Sheet1
      .Cells.AutoFilter
      .Range(.Cells(2, 1), .Cells(7, 1)).EntireRow.Delete
      .Cells.AutoFilter
   End With
End Sub

따라서 워크시트를 클리닝하기 위해 필터를 클리어하는 경우.Cells.AutoFilter 가 사용됩니다.

AutoFilter 열을 루프합니다. 열이 활성화(on)된 후 열 필터를 재설정하면 루프 후에 새 기준을 삽입할 수 있습니다.이 코드는 AutoFilter 배너를 삭제하지 않습니다.

Dim iCol as Long
Dim ws as Worksheet
...
For iCol = 1 To ws.AutoFilter.Filters.count
  If ws.AutoFilter.Filters(iCol).On Then ws.AutoFilter.Range.AutoFilter Field:=iCol
Next
...
ws.AutoFilter.Range.AutoFilter Field:=4, Criteria1:="AABBCC"

마이크로소프트페이지에서 이 답을 찾았습니다.

AutoFilterMode를 부울로 사용합니다.

   If Worksheets("Sheet1").AutoFilterMode Then Selection.AutoFilter

사용하기 전에 먼저 테이블의 범위를 선택해야 합니다.ActiveSheet.ShowAllData

언급URL : https://stackoverflow.com/questions/21761027/excel-2013-vba-clear-all-filters-macro

반응형