#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