excel VBA удаляет строки после автофильтра

#excel #vba

#преуспеть #vba #excel

Вопрос:

здравствуйте, я пытаюсь создать кнопку для части бизнеса, в котором я работаю, которая фильтрует по критериям, а затем удаляет все эти строки. Я в порядке с «фильтрующей» частью, и это успех, я просто не могу удалить все отфильтрованные строки. Я пробовал разные коды, и ниже приведен последний, с которым я пытался и потерпел неудачу. сбой происходит под комментарием «Удалить строки

 Sub delete_stage()

Dim ws As Worksheet

Set ws = ThisWorkbook.Worksheets("Sales Pipeline Report")
ws.Activate

'Clear any existing filters
On Error Resume Next
ws.ShowAllData
On Error GoTo 0

' filter cells on criterea

ws.Range("$E$2").AutoFilter Field:=4, Criteria1:="Onboarding"

'Delete Rows

 ws.Range("$E$2").Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete


'3. Clear Filter
On Error Resume Next
ws.ShowAllData
On Error GoTo 0
  

Надеюсь, кто-нибудь сможет помочь. Я чувствую, что это не должно быть так сложно, как я это делаю: -s

Комментарии:

1. Если бы вы могли записать отфильтрованную таблицу на другой рабочий лист, это было бы довольно просто сделать.

2. я бы сказал, добавьте 1-й вспомогательный столбец для ввода индекса СТРОКИ, затем добавьте 2-й вспомогательный столбец, чтобы отметить 1 для удаления 0 для сохранения. Затем отсортируйте по 2-му вспомогательному столбцу, затем по первому вспомогательному столбцу, затем удалите все строки, где 2-й вспомогательный столбец = 1, затем удалите два вспомогательных столбца

Ответ №1:

Удаление отфильтрованных строк (автофильтр)

Код

 Option Explicit

Sub deleteFilteredRows()
  
    ' Define constants.
  
    Const wsName As String = "Sales Pipeline Report"
    Const FirstCell As String = "E2"
    Const afField As Long = 4
    Const Criteria As String = "Onboarding"
      
    ' Define Source Range.
    
    ' Define Success Boolean.
    Dim Success As Boolean
    ' Define Worksheet.
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(wsName)
    ' Define First Cell Range ('cel').
    Dim cel As Range
    Set cel = ws.Range(FirstCell)
    ' Define Current Region ('rng').
    Dim rng As Range
    Set rng = cel.CurrentRegion
    ' Define Source Range ('rng').
    Set rng = cel _
      .Resize(rng.Rows.Count   rng.Row - cel.Row, _
              rng.Columns.Count   rng.Column - cel.Column)
    
    ' Delete filtered rows.
    
    ' Turn off screen updating.
    Application.ScreenUpdating = False
    ' Turn off AutoFilter.
    If ws.AutoFilterMode Then
        ws.AutoFilterMode = False
    End If
    ' Filter Source Range.
    rng.AutoFilter Field:=afField, Criteria1:=Criteria
    ' Try to define Filtered Range ('rng').
    Dim dRng As Range
    On Error Resume Next
    Set dRng = rng.Resize(rng.Rows.Count - 1).Offset(1) _
                                             .SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    ' Validate Filtered Range.
    If dRng Is Nothing Then
        GoTo SafeExit
    End If
    ' Delete entire rows of Filtered Range.
    dRng.EntireRow.Delete
    ' Validate Success.
    Success = True
SafeExit:
    ' Clear filter.
    ws.ShowAllData
    ' Turn on screen updating.        
    Application.ScreenUpdating = True

    ' Inform user.
    
    If Success = True Then
        MsgBox "Rows of filtered data deleted.", vbInformation, "Success"
    Else
        MsgBox "No action taken.", vbCritical, "Fail"
    End If

End Sub