我有一个在Excel 2010中使用VBA函数,是在这里得到其他人的帮助后建立的。此函数复制表单/表格的内容,对其进行排序,并将其发送到相应的表格中。
现在,在运行此函数后,我想清除原始表格的内容。我可以通过以下代码实现,假设ACell已定义为表格中的第一个单元格。
ACell.ListObject.Range.ClearContents
可以正常工作,唯一的问题是它会删除表格以及数据值。
是否有任何方法可以解决这个问题?我不想每次输入数据时都重新设置表格。
我有一个在Excel 2010中使用VBA函数,是在这里得到其他人的帮助后建立的。此函数复制表单/表格的内容,对其进行排序,并将其发送到相应的表格中。
现在,在运行此函数后,我想清除原始表格的内容。我可以通过以下代码实现,假设ACell已定义为表格中的第一个单元格。
ACell.ListObject.Range.ClearContents
可以正常工作,唯一的问题是它会删除表格以及数据值。
是否有任何方法可以解决这个问题?我不想每次输入数据时都重新设置表格。
这样怎么样:
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建议的接近,只是它不会清除公式。
尝试仅清除数据(而不是包括标题在内的整个表):
ACell.ListObject.DataBodyRange.ClearContents
我修改了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
.SpecialCells(xlCellTypeConstants).ClearContents
尝试清除顶行的内容时,就会出现这种情况。在这种情况下,仅选择了一个单元格(仅有一列的表格的顶行) ,而SpecialCells命令应用于整个工作表,而不是所选范围。发生在我身上的事情是其他在我的表格之外的单元格也被清除了。如果列表/表格只有一列(在第1行),则此修订版将检查该单元格是否具有公式,如果没有,则仅清除该单个单元格的内容。Range({任意单元格}).SpecialCells({任何内容})似乎适用于整张工作表。
Range({超过一个单元格}).SpecialCells({任何内容})似乎适用于指定的单元格。
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 自动重置最后一个单元格
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
如果你只想清除表格内容,我通常会使用非常简单的方法。
Sub Clear_table()
Range("Table1").ClearContents
End Sub
显然,如果你有一个包含多个页面的工作簿,你可能想要更改代码以适应这种情况。
Sub Clear_table()
Worksheets("Sheet1").Range("Table1").ClearContents
End Sub
如果您想删除整个表格,但保留标题和公式,则可以尝试以下操作:
Sub DeteteTableExceptFormula()
Dim tb As ListObject
Set tb = activeworksheet.ListObjects("MyTable")
tb.DataBodyRange.Delete
End Sub