Выбрать и удалить несколько строк - PullRequest
0 голосов
/ 10 февраля 2019
With Sheet(name)

    .ListObjects(Table_name).ShowTotals = False

    .ListObjects(Table_name).Range.AutoFilter _
      Field:=8, Criteria1:=ListBox1.Value, _
      Operator:=xlFilterValues

       .ListObjects(Table_name).DataBodyRange.EntireRow.Delete

    .ListObjects(Table_name).AutoFilter.ShowAllData
    .ListObjects(Table_name).ShowTotals = True

  End With

проблема в

.ListObjects("Table13").DataBodyRange.EntireRow.Delete

Это не удаляет строки, и я не понимаю, почему ...

Ответы [ 2 ]

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

Для удаления строк в таблице с автоматической фильтрацией необходимо использовать

 .DataBodyRange.SpecialCells(xlCellTypeVisible).Delete

Следующий пример программы работает для меня.Поскольку ваша таблица связана со списком, сделайте соответствующую настройку для критериев.[Таблица перед удалением]

table before delete Таблица после удаления

table after delete

 Sub DeleteRows()
        Application.DisplayAlerts = False

        With ActiveSheet.ListObjects("Table1") 'Change table as per your requirement
             If .Parent.FilterMode Then .Range.AutoFilter
             .Range.AutoFilter Field:=1, Criteria1:="Margeret"    'Set criteria as per yr requirements
             .DataBodyRange.SpecialCells(xlCellTypeVisible).Delete
             .Range.AutoFilter
        End With

        Application.DisplayAlerts = True
    End Sub
0 голосов
/ 10 февраля 2019

Таблицы не работают так же, как обычные диапазоны.Даже если вы зайдете в Excel, нажмите на таблицу и попробуйте сделать Alt-ED (удалить).Обычно это дает вам возможность сместить ячейки вверх, сместить ячейки влево, удалить всю строку или удалить весь столбец, но если вы сделаете это из таблицы, это ничего не даст.

Я предполагаюнемного, но я подозреваю, что это как-то связано с вашим неожиданным поведением.

Вместо этого, если вы просто хотите удалить строки, вместо этого удалите строки таблицы (ListRows):

.ListObjects(Table_name).ListRows(row_number).Delete

Или, если вы хотите удалить их все (как показано в вашем вопросе):

For i = .ListObjects(Table_name).ListRows.Count To 1 Step -1
  .ListObjects(Table_name).ListRows(i).Delete
Next i

Если вы не сделаете это задом наперед, я уверен, что он пропускает строки, а затем разбивает.

Тогда всегда есть подход выжженной земли:

.ListObjects(Table_name).DataBodyRange.Delete

Если вы не заботитесь о содержимом в тех же строках за пределами вашей таблицы данных, они должны работать.

...