17

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

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

有没有办法解决?我宁愿每次输入一些数据时都不必设置表格。

4

7 回答 7

43

怎么样:

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

于 2012-04-19T03:05:51.753 回答
9

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

ACell.ListObject.DataBodyRange.ClearContents
于 2012-04-19T03:12:13.470 回答
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
于 2018-12-19T17:07:55.943 回答
2

有一个条件是这些解决方案中的大多数都没有解决的。我修改了 Patrick Honorez 的解决方案来处理它。我觉得我必须分享这个,因为当原始功能偶尔会清除我预期的更多数据时,我感到很困惑。

这种情况发生在表格只有一列并且.SpecialCells(xlCellTypeConstants).ClearContents尝试清除第一行的内容时。在这种情况下,只选择了一个单元格(只有一列的表格的顶行),并且 SpecialCells 命令应用于整个工作表而不是选定的范围。发生在我身上的是我桌子外面的其他单元格也被清除了。

我做了一些挖掘,从 Mathieu Guindon 那里找到了这个建议: Range SpecialCells ClearContents clears whole sheet

Range({any single cell}).SpecialCells({whatever}) 似乎适用于整个工作表。

Range({more than one cell}).SpecialCells({whatever}) 似乎对指定的单元格有效。

如果列表/表格只有一列(在第 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 自动重置最后一个单元格

于 2019-06-17T03:40:03.143 回答
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
于 2016-02-04T16:44:45.830 回答
0

如果要删除除标题和公式之外的整个表格,可以尝试以下操作:

Sub DeteteTableExceptFormula()
    Dim tb As ListObject
    Set tb = activeworksheet.ListObjects("MyTable")
    tb.DataBodyRange.Delete
End Sub
于 2021-06-16T09:20:28.723 回答
0

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

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

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

Sub Clear_table()
Worksheets("Sheet1").Range("Table1").ClearContents
End Sub
于 2021-06-11T10:34:07.917 回答