最近我一直在尝试删除表中的所有数据行,除了第一个数据行(只需清除)
一些正在执行的表可能已经没有行,所以我运行它时遇到了问题,因为在没有行(只有页眉和/或页脚)的表上使用
.DataBodyRange.Rows.Count
会导致错误。
我到处寻找解决方案,但找不到完整的解决方案,所以我希望我对这个问题的回答将来对其他人有用。
这就是我清除数据的方法:
Sub Macro3()
With Sheet1.ListObjects("Table1")
If Not .DataBodyRange Is Nothing Then
.DataBodyRange.Delete
End If
End With
End Sub
您的代码可以缩小到
Sub DeleteTableRows(ByRef Table As ListObject)
On Error Resume Next
'~~> Clear Header Row `IF` it exists
Table.DataBodyRange.Rows(1).ClearContents
'~~> Delete all the other rows `IF `they exist
Table.DataBodyRange.Offset(1, 0).Resize(Table.DataBodyRange.Rows.Count - 1, _
Table.DataBodyRange.Columns.Count).Rows.Delete
On Error GoTo 0
End Sub
编辑:
顺便说一句,如果我需要告知用户第一行或其他行是否被删除,我会添加适当的错误处理
我有 3 个运行良好的例程,只需选择表格中的一个单元格并运行其中一个子例程
Sub ClearTable()
If Not ActiveCell.ListObject Is Nothing Then
ActiveCell.ListObject.DataBodyRange.Rows.ClearContents
End If
End Sub
和收缩表以删除除标题和第一个数据行之外的数据体范围
Sub ShrinkTable()
If Not ActiveCell.ListObject Is Nothing Then
ActiveCell.ListObject.DataBodyRange.Delete
End If
End Sub
和删除表格以从工作表中完全删除表格
Sub DeleteTable()
If Not ActiveCell.ListObject Is Nothing Then
ActiveCell.ListObject.Delete
End If
End Sub
我想保留公式,但上面的代码没有做到这一点。
这就是我一直在做的事情,请注意,这会在表格中留下一个空行。
Sub DeleteTableRows(ByRef Table As ListObject, KeepFormulas as boolean)
On Error Resume Next
if not KeepFormulas then
Table.DataBodyRange.clearcontents
end if
Table.DataBodyRange.Rows.Delete
On Error GoTo 0
End Sub
(PS别问我为什么!)
我只是用这个:
On Error Resume Next
Worksheets("Sheet1").ListObjects("Table1").DataBodyRange.Rows.Delete
第一行在所有情况下都保留(当然,它被清除)。
这对你有用吗?我已经在 Excel 2010 中进行了测试,效果很好。 这是使用名为“Table1”的表,该表使用 A 至 G 列。
Sub Clear_Table()
Range("Table1").Select
Application.DisplayAlerts = False
Selection.Delete
Application.DisplayAlerts = True
Range("A1:G1").Select
Selection.ClearContents
End Sub
此
VBA Sub
将删除所有数据行(除了第一行,它只会清除)-
Sub DeleteTableRows(ByRef Table as ListObject)
'** Work out the current number of rows in the table
On Error Resume Next ' If there are no rows, then counting them will cause an error
Dim Rows As Integer
Rows = Table.DataBodyRange.Rows.Count ' Cound the number of rows in the table
If Err.Number <> 0 Then ' Check to see if there has been an error
Rows = 0 ' Set rows to 0, as the table is empty
Err.Clear ' Clear the error
End If
On Error GoTo 0 ' Reset the error handling
'** Empty the table *'
With Table
If Rows > 0 Then ' Clear the first row
.DataBodyRange.Rows(1).ClearContents
End If
If Rows > 1 Then ' Delete all the other rows
.DataBodyRange.Offset(1, 0).Resize(.DataBodyRange.Rows.Count - 1, .DataBodyRange.Columns.Count).Rows.Delete
End If
End With
End Sub
我建议先清除内容,然后调整表格大小:
Sub DeleteTableRows(ByRef Table As ListObject)
Dim R As Range
On Error Resume Next
Table.DataBodyRange.ClearContents
Set R = Table.Range.Rows(1).Resize(2)
Table.Resize R
On Error GoTo 0
End Sub
上面的代码在 Excel 2010 中不起作用 我的下面的代码允许您浏览所需的工作表数量,然后选择表格并删除行
Sub DeleteTableRows()
Dim table As ListObject
Dim SelectedCell As Range
Dim TableName As String
Dim ActiveTable As ListObject
'select ammount of sheets want to this to run
For i = 1 To 3
Sheets(i).Select
Range("A1").Select
Set SelectedCell = ActiveCell
Selection.AutoFilter
'Determine if ActiveCell is inside a Table
On Error GoTo NoTableSelected
TableName = SelectedCell.ListObject.Name
Set ActiveTable = ActiveSheet.ListObjects(TableName)
On Error GoTo 0
'Clear first Row
ActiveTable.DataBodyRange.Rows(1).ClearContents
'Delete all the other rows `IF `they exist
On Error Resume Next
ActiveTable.DataBodyRange.Offset(1, 0).Resize(ActiveTable.DataBodyRange.Rows.Count - 1, _
ActiveTable.DataBodyRange.Columns.Count).Rows.Delete
Selection.AutoFilter
On Error GoTo 0
Next i
Exit Sub
'Error Handling
NoTableSelected:
MsgBox "There is no Table currently selected!", vbCritical
End Sub
如果您已经提前知道表名称,这是我使用的一种简短方法
With [TableName].ListObject
If Not .DataBodyRange Is Nothing Then: .DataBodyRange.Delete
End With
无需表格参考等
操作表格的另一个方面。如果表具有主动隐藏行的筛选器,则通过在修改表之前显示所有数据可能会获得更好的结果。我使用 ActiveCell.ListObject.ShowAllData。
Sub ClearTable()
If Not ActiveCell.ListObject Is Nothing Then
On Error Resume Next
ActiveCell.ListObject.ShowAllData
ActiveCell.ListObject.DataBodyRange.Rows.ClearContents
End If
End Sub