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

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

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

Есть ли способ обойти это? Я бы предпочел не устанавливать таблицу при каждом вводе некоторых данных.

Ответ 1

Как насчет:

ACell.ListObject.DataBodyRange.Rows.Delete

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

РЕДАКТИРОВАТЬ: Я собираюсь просто изменить раздел моего ответа из вашего предыдущего поста, так как он делает в основном то, что вы хотите. Это оставляет только один ряд:

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, за исключением того, что оно не очищает формулы.

Ответ 2

Попробуйте просто очистить данные (не всю таблицу, включая заголовки):

ACell.ListObject.DataBodyRange.ClearContents

Ответ 3

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

Sub ListReset(lst As ListObject)
'clears a listObject while leaving row 1 empty, with formulae
    With lst
        If .ShowAutoFilter Then .AutoFilter.ShowAllData
        On Error Resume Next
        With .DataBodyRange
            .Offset(1).Rows.Clear
            .Rows(1).SpecialCells(xlCellTypeConstants).ClearContents
        End With
        On Error GoTo 0
        .Resize .Range.Rows("1:2")
    End With
End Sub

Ответ 4

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

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

Ответ 5

Существует условие, что большинство из этих решений не рассматриваются. Я пересмотрел решение Патрика Хонореза, чтобы справиться с этим. Я чувствовал, что должен был поделиться этим, потому что я вырывал свои волосы, когда оригинальная функция иногда удаляла больше данных, которые я ожидал.

Ситуация возникает, когда таблица имеет только один столбец и .SpecialCells(xlCellTypeConstants).ClearContents пытается очистить содержимое верхней строки. В этой ситуации выбирается только одна ячейка (верхняя строка таблицы, в которой есть только один столбец), а команда SpecialCells применяется ко всему листу, а не к выбранному диапазону. Что происходило со мной, так это то, что другие ячейки на листе, которые находились за пределами моего стола, также очищались.

Я немного покопался и нашел этот совет от Матье Гиндона: Range SpecialCells ClearContents очищает весь лист

Range ({любая отдельная ячейка}). SpecialCells ({что угодно}), кажется, работает на всем листе.

Range ({больше чем одна ячейка}). SpecialCells ({что угодно}), кажется, работает от указанных ячеек.

Если список/таблица имеет только один столбец (в строке 1), эта редакция проверит, имеет ли ячейка формулу, а если нет, то очистит только содержимое этой одной ячейки.

Public Sub ClearList(lst As ListObject)
'Clears a listObject while leaving 1 empty row + formula
' https://stackoverflow.com/a/53856079/1898524
'
'With special help from this post to handle a single column table.
'   Range({any single cell}).SpecialCells({whatever}) seems to work off the entire sheet.
'   Range({more than one cell}).SpecialCells({whatever}) seems to work off the specified cells.
' https://stackoverflow.com/questions/40537537/range-specialcells-clearcontents-clears-whole-sheet-instead

    On Error Resume Next

    With lst
        '.Range.Worksheet.Activate ' Enable this if you are debugging 

        If .ShowAutoFilter Then .AutoFilter.ShowAllData
        If .DataBodyRange.Rows.Count = 1 Then Exit Sub ' Table is already clear
        .DataBodyRange.Offset(1).Rows.Clear

        If .DataBodyRange.Columns.Count > 1 Then ' Check to see if SpecialCells is going to evaluate just one cell.
            .DataBodyRange.Rows(1).SpecialCells(xlCellTypeConstants).ClearContents
        ElseIf Not .Range.HasFormula Then
            ' Only one cell in range and it does not contain a formula.
            .DataBodyRange.Rows(1).ClearContents
        End If

        .Resize .Range.Rows("1:2")

        .HeaderRowRange.Offset(1).Select

        ' Reset used range on the sheet
        Dim X
        X = .Range.Worksheet.UsedRange.Rows.Count 'see J-Walkenbach tip 73

    End With

End Sub

Последний шаг, который я включил, - это совет, который приписывается Джону Уокенбаху, иногда отмечаемому как J-Walkenbach tip 73 Автоматический J-Walkenbach tip 73 последней ячейки

Ответ 6

Этот код великолепен. Я использовал это много раз, поскольку это было именно то, что я искал. У меня есть вопрос - Что, если я хочу, чтобы этот макрос очищал более одной таблицы? У меня есть еще одна вкладка, которую я хотел бы очистить одновременно.

Я очень новичок в VBA, и мне трудно понять, где добавить код для очистки второй таблицы.