Выбрать и удалить несколько строк

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 ответа

Таблицы не работают так же, как обычные диапазоны. Даже если вы зайдете в 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

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

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

 .DataBodyRange.SpecialCells(xlCellTypeVisible).Delete

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

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

https://stackru.com/images/d32010da41b5e ded39a222e2c5ac770949a1ad31.jpg

 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
Другие вопросы по тегам