Удалить строку таблицы на основе критериев VBA - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь удалить конкретную строку таблицы на основе значений в двух столбцах.Я попытался применить фильтры к столбцам таблицы, чтобы сузить критерии, но как только я нажму «Удалить», будет удален ВЕСЬ СТРОК, что приведет к удалению значений за пределами таблицы.Кроме того, макро-рекордер не так динамичен, как хотелось бы, поскольку он выбирает ТОЛЬКО ячейку, которую я щелкнул во время записи.

   Sub Macro2()
    '
    ' Macro2 Macro
    '
    '
         ActiveSheet.ListObjects("Table1").Range.AutoFilter Field:=1, Criteria1:= _
    "Apple"                               \\Narrowing criteria in Column 1 of the table
         Range("A4").Select               \\This only applies to a specific cell, and the value can shift
         Selection.EntireRow.Delete       \\This will delete the entire sheet row, I'd like for only the table row to be deleted    
         Range("A5").Select
         Selection.EntireRow.Delete
         Selection.EntireRow.Delete
    End Sub

enter image description here

Есть ли способ найти нужную строку в столбце и удалить только строки в таблице, если критерии удовлетворены?Я попытался удалить только ListObject.ListRows, но он ссылается только на выбранную мной строку, а не на основанную на критериях.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вам нужно будет указать, какие ячейки / диапазон вы хотите удалить.Вы можете найти соответствующую строку с помощью функции поиска.Поскольку ваша таблица статическая, я бы предложил следующий макрос.Проверка цикла for для каждой строки также возможна, но не очень эффективна для очень большой таблицы.Может быть полезно подготовить ваш набор данных, добавив флаг в столбец c (например, 1, если будет удалено).

РЕДАКТИРОВАТЬ предложение Тейта также выглядит довольно чисто

Sub tabledelete()

Dim ws As Worksheet
Dim rangecheck As Range
Dim rcheck As Integer

Set ws = Sheets("Sheet1") 'fill in name of relevant sheet
Set rangecheck = Range("A1") ' dummy to get the do function started

Do While Not rangecheck Is Nothing
With ws
    With .Range("C2:C30") ' fill in relevant range of table
        Set rangecheck = .Find(what:=1, LookAt:=xlWhole)
    End With
If Not rangecheck Is Nothing Then 'only do something if a 1 is found
rcheck = rangecheck.Row
.Range(.Cells(rcheck, 1), .Cells(rcheck, 3)).Delete Shift:=xlUp 'delete 3 columns in row found
End If

End With

Loop

End Sub
0 голосов
/ 13 февраля 2019

Вы можете использовать .DataBodyRange и .SpecialCells(xlCellTypeVisible), чтобы установить переменную диапазона, равную отфильтрованным диапазонам, затем отфильтровать и удалить:

Dim dRng As Range
With ActiveSheet.ListObjects("Table1")
    .Range.AutoFilter Field:=1, Criteria1:="Apple"
    If WorksheetFunction.Subtotal(2, .DataBodyRange) > 0 Then
        Set dRng = .DataBodyRange.SpecialCells(xlCellTypeVisible)
        .Range.AutoFilter
        dRng.Delete xlUp
    End If
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...