Вопрос по excel, vba – Как выбрать очистить содержимое таблицы, не разрушая таблицу?

9

У меня есть функция VBA в Excel 2010, которую я создал, используя помощь людей здесь. Эта функция копирует содержимое таблицы / формы, сортирует их и отправляет в соответствующие таблицы.

Теперь, после запуска этой функции, я хочу, чтобы исходная таблица была очищена. Я могу добиться этого с помощью следующего кода, предполагая, что ACell был определен как первая ячейка в таблице.ACell.ListObject.Range.ClearContents работает нормально, единственная проблема - это удаление таблицы и значений данных.

Есть ли способ обойти это? Я бы предпочел не настраивать таблицу каждый раз, когда я вводю некоторые данные.

Ваш Ответ

4   ответа
28

Как насчет

ACell.ListObject.DataBodyRange.Rows.Delete

Это сохранит структуру таблицы и заголовки, но очистит все данные и строки.

EDIT: я собираюсь просто изменить раздел моего ответа от твое предыдущее сообщение, так как это делает в основном то, что вы хотите. Это оставляет только одну строку:

With loSource
   .Range.AutoFilter
   .DataBodyRange.Offset(1).Resize(.DataBodyRange.Rows.Count - 1, .DataBodyRange.Columns.Count).Rows.Delete
   .DataBodyRange.Rows(1).Specialcells(xlCellTypeConstants).ClearContents
End With

Если вы хотите оставить все строки без изменений с их формулами и так далее, просто сделайте:

With loSource
   .Range.AutoFilter
   .DataBodyRange.Specialcells(xlCellTypeConstants).ClearContents
End With

Что близко к тому, что предлагает @Readify, за исключением того, что оно не очищает формулы.

Только что попробовал, и это полностью удаляет таблицу, формулы, проверку данных, форматирование, все! SpeedCrazy
+ 1 за терпеливое решение этого вопроса:) Siddharth Rout
Так что, если я удалю все строки, что произойдет? Оставит ли он пустым один или я просто назвал таблицу без ячеек, у меня нет заголовка нижнего колонтитула в этой таблице. SpeedCrazy
Хорошо, сделай глубокий вдох :). Было бы полезно, если бы вы упомянули такие вещи, как проверка данных и формулы в вашем вопросе. Предыдущий вопрос, на который я ответил по этой теме, включал код, оставляющий одну строку. Это то, что вы хотите Doug Glancy
Ну, мне еще нужно очистить этот ряд ... но да. я только что предположил, что до тех пор, пока таблица оставлена нетронутой, и я подробно изложил в своем вопросе, что формулы и прочее, которые были автоматически в каждой строке, также будут сохранены. SpeedCrazy
7

ACell.ListObject.DataBodyRange.ClearContents
Если вы хотите покинуть строки таблицы и просто очистить содержимое, используйте приведенное выше. Если вы хотите удалить строки, используйте ответ Дуга. Reafidy
+ 1 для того, чтобы увидеть это свежим взглядом и дать самый близкий ответ на информацию в то время. Doug Glancy
1

но оставляю формулы в верхнем ряду. Он также удаляет все строки, кроме верхней, и прокручивает страницу вверх.

Sub CleanTheTable()
    Application.ScreenUpdating = False
    Sheets("Data").Select
    ActiveSheet.ListObjects("TestTable").HeaderRowRange.Select
    'Remove the filters if one exists.
    If ActiveSheet.FilterMode Then
    Selection.AutoFilter
    End If
    'Clear all lines but the first one in the table leaving formulas for the next go round.
    With Worksheets("Data").ListObjects("TestTable")
    .Range.AutoFilter
    On Error Resume Next
    .DataBodyRange.Offset(1).Resize(.DataBodyRange.Rows.Count - 1, .DataBodyRange.Columns.Count).Rows.Delete
    .DataBodyRange.Rows(1).SpecialCells(xlCellTypeConstants).ClearContents
    ActiveWindow.SmallScroll Down:=-10000

    End With
Application.ScreenUpdating = True
End Sub
1

чтобы избежать удаления строк, что может привести к проблеме #Ref в формулах.

Sub ClearList(lst As ListObject)
'clears a listObject while leaving 1 empty row + formulae
    With lst
        If .ShowAutoFilter Then .AutoFilter.ShowAllData
        If .DataBodyRange.Rows.Count = 1 Then Exit Sub
        .DataBodyRange.Offset(1).Rows.Clear
        .DataBodyRange.Rows(1).SpecialCells(xlCellTypeConstants).ClearContents
        .Resize .Range.Rows("1:2")
    End With

End Sub

Похожие вопросы