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

18

我有一个在Excel 2010中使用VBA函数,是在这里得到其他人的帮助后建立的。此函数复制表单/表格的内容,对其进行排序,并将其发送到相应的表格中。

现在,在运行此函数后,我想清除原始表格的内容。我可以通过以下代码实现,假设ACell已定义为表格中的第一个单元格。 ACell.ListObject.Range.ClearContents 可以正常工作,唯一的问题是它会删除表格以及数据值。

是否有任何方法可以解决这个问题?我不想每次输入数据时都重新设置表格。

7个回答

47

这样怎么样:

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建议的接近,只是它不会清除公式。


1
那么如果我删除所有行会发生什么?它会留下一个空白的行吗,还是只会有一个没有单元格的带名称的表格,在这个表格上我没有页眉或页脚。 - SpeedCrazy
1
好的,请深呼吸 :)。如果您在问题中提到数据验证和公式,那会很有帮助。我之前回答过关于这个主题的问题,其中包括离开一行的代码。这是您想要的吗? - Doug Glancy
我还需要清除那一行...但是没错。我只是假设只要表格保持完整,而且我在我的问题中也详细说明了,每一行自动包含的公式和内容也会被保留。 - SpeedCrazy
6
谢谢你的赞扬,我很高兴能够耐心地处理这个问题。+1 - Siddharth Rout
https://msdn.microsoft.com/zh-cn/library/office/ff196678.aspx 提供了与@DougGlancy上面提供的类似的偏移/调整大小示例。 - northern-bradley
显示剩余4条评论

10

尝试仅清除数据(而不是包括标题在内的整个表):

ACell.ListObject.DataBodyRange.ClearContents

如果你想保留表格行而只清除其内容,请使用上述方法。如果你想同时删除行,请使用道格的答案。 - Reafidy
1
如果您能以全新的视角看待这个问题,并在当时提供最接近信息的答案,那么我会给您一个加1。 - Doug Glancy

4

我修改了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

我最喜欢这个解决方案,但是注意到如果列表/表格只有一列,.ClearContents会清除列表外工作表上的其他单元格。我在这里发布了修订版本。 - Ben
@Ben 你说得完全正确,我也遇到了那个问题 :/ - iDevlop

3
大多数解决方案都没有解决的一个问题,我修改了Patrick Honorez的解决方案来应对它。我觉得我必须分享这个,因为当原始函数偶尔清除更多数据时,我感到非常烦恼。
当表格只有一列并且.SpecialCells(xlCellTypeConstants).ClearContents尝试清除顶行的内容时,就会出现这种情况。在这种情况下,仅选择了一个单元格(仅有一列的表格的顶行) ,而SpecialCells命令应用于整个工作表,而不是所选范围。发生在我身上的事情是其他在我的表格之外的单元格也被清除了。
我进行了一些调查,并从Mathieu Guindon那里找到了这个建议: Range SpecialCells ClearContents clears whole sheet

Range({任意单元格}).SpecialCells({任何内容})似乎适用于整张工作表。

Range({超过一个单元格}).SpecialCells({任何内容})似乎适用于指定的单元格。

如果列表/表格只有一列(在第1行),则此修订版将检查该单元格是否具有公式,如果没有,则仅清除该单个单元格的内容。
Public Sub ClearList(lst As ListObject)
'Clears a listObject while leaving 1 empty row + formula
' https://dev59.com/y2kv5IYBdhLWcg3w91hF#53856079
'
'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://dev59.com/35zha4cB1Zd3GeqPEWRR

    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 技巧73 自动重置最后一个单元格


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

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

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

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

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

0

如果您想删除整个表格,但保留标题和公式,则可以尝试以下操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接