Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Excel表格中删除所有数据行(第一行除外)_Excel_Vba_Excel 2007 - Fatal编程技术网

从Excel表格中删除所有数据行(第一行除外)

从Excel表格中删除所有数据行(第一行除外),excel,vba,excel-2007,Excel,Vba,Excel 2007,就在最近,我一直在尝试删除表中的所有数据行,第一行除外(需要清除) 正在执行操作的某些表可能已经没有行,因此我运行它时遇到了问题,因为在没有行(只有页眉和/或页脚)的表上使用.dataodyrange.rows.Count会导致错误 我到处寻找一个解决方案,但找不到一个完整的解决方案,因此我希望我对这个问题的回答将来对其他人有用。此VBA Sub将删除所有数据行(第一行除外,它只会清除)- 子DeleteTableRows(ByRef表作为ListObject) “**计算出表中当前的行数 如果

就在最近,我一直在尝试删除表中的所有数据行,第一行除外(需要清除)

正在执行操作的某些表可能已经没有行,因此我运行它时遇到了问题,因为在没有行(只有页眉和/或页脚)的表上使用
.dataodyrange.rows.Count
会导致错误


我到处寻找一个解决方案,但找不到一个完整的解决方案,因此我希望我对这个问题的回答将来对其他人有用。

VBA Sub
将删除所有数据行(第一行除外,它只会清除)-

子DeleteTableRows(ByRef表作为ListObject)
“**计算出表中当前的行数
如果没有行,则计数它们将导致错误
将行设置为整数
Rows=Table.DataBodyRange.Rows.Count'指定表中的行数
如果错误号为0,则“检查是否存在错误”
Rows=0'将行设置为0,因为表为空
Err.Clear“清除错误”
如果结束
在出现错误时转到0'重置错误处理
“**清空桌子*”
带桌子
如果行>0,则“清除第一行”
.DataBodyRange.Rows(1).ClearContent
如果结束
如果行>1,则“删除所有其他行”
.DataBodyRange.Offset(1,0).调整大小(.DataBodyRange.Rows.Count-1、.DataBodyRange.Columns.Count).行.Delete
如果结束
以
端接头

您的代码可以缩小到

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
编辑


另一方面,如果我需要告知用户是否删除了第一行或其他行,我会添加正确的错误处理

这对您有用吗?我已经在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

我想保留公式,但上面的代码没有这样做

这是我一直在做的,注意这会在表中留下一行空白

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

(请不要问我为什么!)

我建议先清除目录,然后调整表格大小:

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

以下是我清除数据的方式:

Sub Macro3()
    With Sheet1.ListObjects("Table1")
        If Not .DataBodyRange Is Nothing Then
            .DataBodyRange.Delete
        End If
    End With
End Sub

我有3个例程,它们工作得很好,只需在表中选择一个单元格并运行其中一个子例程

Sub ClearTable()
If Not ActiveCell.ListObject Is Nothing Then
    ActiveCell.ListObject.DataBodyRange.Rows.ClearContents
End If
End Sub
和Shrink Table以删除除标头和第一个数据行之外的数据体范围

Sub ShrinkTable()
If Not ActiveCell.ListObject Is Nothing Then
    ActiveCell.ListObject.DataBodyRange.Delete
End If
End Sub
和Delete Table可从图纸中完全删除该表

Sub DeleteTable()
If Not ActiveCell.ListObject Is Nothing Then
    ActiveCell.ListObject.Delete
End If
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
我只是用这个:

On Error Resume Next
Worksheets("Sheet1").ListObjects("Table1").DataBodyRange.Rows.Delete

第一行在所有情况下都保持不变(当然是清除的)。

如果你问这个问题,我们会给你一个类似的答案:)但是你不需要2 If条件。你可以把它们结合起来。我同意@SiddharthRout的观点,你也有一个打字错误
Err。clesr
应该是
Err.Clear
@engineersmnky-谢谢,我刚刚在VBA中发现了这个问题@SiddharthRout——在这种情况下,我确实需要2x
If
,因为它们都检查不同的东西。然而,我正在寻找另一个答案,它可以避免使用
If
语句。谢谢。是的,我想我不需要特别重置错误。
End Sub
是否会重置错误,或者我仍然需要重置错误?用户无需知道行之前是否已被删除,只需确保清除所有旧数据。如果不想使用异常来处理代码流,我猜您会遇到错误,因为在该调用的某个点上有一个null引用异常(如果Table、dataodyrange或Rows为null,则会出现错误)。你可以在打电话之前通过错误检查来解决这个问题。这里的大多数答案都假设你的表格在当前工作表上,或者你知道工作表的名称。为了在不引用工作表的情况下清除命名表,我将Sheet1.ListObjects(“Table1”)行更改为带有范围(“Table1”)的
。ListObject
可能是应用程序。如果我理解正确,范围将更全面,但选择正确?在区分清除、收缩和删除方面做得很好。
On Error Resume Next
Worksheets("Sheet1").ListObjects("Table1").DataBodyRange.Rows.Delete