Выбрать и удалить несколько строк
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