如何在不破坏表格的情况下选择清除表格内容?

时间:2012-04-19 02:37:16

标签: excel-vba excel-2010 vba excel

我在excel 2010中有一个vba函数,我是在这里使用人们的帮助构建的。此函数复制表/表单的内容,对其进行排序,并将它们发送到适当的表。

现在运行此功能后,我希望清除原始表。我可以使用以下代码实现此目的,假设ACell已被定义为表中的第一个单元格。 ACell.ListObject.Range.ClearContents工作正常,唯一的问题是它会删除表格以及数据值。

这有什么办法吗?每次输入一些数据时,我宁愿不必设置表格。

7 个答案:

答案 0 :(得分:30)

怎么样:

ACell.ListObject.DataBodyRange.Rows.Delete

这将保留您的表格结构和标题,但清除所有数据和行。

编辑:我只是修改your previous post的答案部分,因为它主要是你想要的。这只留下一行:

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建议的内容很接近,但它不会清除公式。

答案 1 :(得分:7)

尝试清除数据(不是整个表格,包括标题):

ACell.ListObject.DataBodyRange.ClearContents

答案 2 :(得分:2)

我重新设计了道格·格兰西(Doug Glancy)的解决方案,以避免行删除,这可能导致公式中的#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

答案 3 :(得分: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

答案 4 :(得分:1)

在某些情况下,大多数解决方案都无法解决。我修改了Patrick Honorez的解决方案来处理它。我觉得我必须分享这一点,因为当原始功能偶尔清除我期望的更多数据时,我正在拔头发。

表只有一列,并且.SpecialCells(xlCellTypeConstants).ClearContents试图清除第一行的内容时,就会发生这种情况。在这种情况下,仅选择一个单元格(表的第一行只有一列),并且SpecialCells命令将应用于整个工作表,而不是所选范围。对我来说,发生了什么事,桌子上其他的单元格也被清除了。

我做了一些挖掘,发现了Mathieu Guindon的以下建议: Range SpecialCells ClearContents clears whole sheet

  

范围({任何单个单元格})。SpecialCells({任何内容))似乎可以处理整个工作表。

     

范围({多个单元格})。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

我要介绍的最后一步是归因于约翰·沃肯巴赫(John Walkenbach)的小费,有时将其记为J-Walkenbach tip 73 Automatically Resetting The Last Cell

答案 5 :(得分:0)

如果您只想清除表格内容,我通常会使用非常简单的方法。

Sub Clear_table()
Range("Table1").ClearContents
End Sub

显然,如果您有一个包含多个页面的工作簿,您可能需要更改代码以适应这种情况。

Sub Clear_table()
Worksheets("Sheet1").Range("Table1").ClearContents
End Sub

答案 6 :(得分:0)

如果你想删除除标题和公式之外的整个表格,你可以试试这个:

Sub DeteteTableExceptFormula()
    Dim tb As ListObject
    Set tb = activeworksheet.ListObjects("MyTable")
    tb.DataBodyRange.Delete
End Sub