【问题标题】:Delete all data rows from an Excel table (apart from the first)从 Excel 表中删除所有数据行(除了第一行)
【发布时间】:2014-01-06 22:43:32
【问题描述】:

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

一些正在操作的表可能已经没有行,所以我运行它时遇到问题,因为在没有行(只有页眉和/或页脚)的表上使用 .DataBodyRange.Rows.Count 会导致错误。

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

【问题讨论】:

  • 如果您不想使用异常来处理代码流,我猜您会遇到错误,因为在该调用中的某个时刻出现空引用异常(如果 Table, DataBodyRange , 或 Rows 为空,您将遇到错误)。您可以在拨打电话之前通过错误检查来解决此问题。

标签: excel vba excel-2007


【解决方案1】:

这就是我清除数据的方式:

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

【讨论】:

  • 这里的大多数答案都假设您的表格在当前工作表上,或者您知道工作表名称。为了在不引用工作表的情况下清除命名表,我将您的 With Sheet1.ListObjects("Table1") 行更改为 With Range("Table1").ListObject
  • 如果我理解正确,也许 Application.Range 会更彻底,但在正确的选择上?
【解决方案2】:

您的代码可以缩小到

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

编辑

附带说明,如果我需要告知用户第一行或其他行是否被删除,我会添加适当的错误处理

【讨论】:

  • 是的,我想我不需要特别重置错误。 End Sub 会重置错误,还是我仍然需要这样做?
  • 用户不需要知道这些行之前是否被删除,只是为了确保清除任何旧数据。
【解决方案3】:

我有 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

和删除表格从工作表中完全删除表格

Sub DeleteTable()
If Not ActiveCell.ListObject Is Nothing Then
    ActiveCell.ListObject.Delete
End If
End Sub

【讨论】:

  • 在区分清除、缩小和删除方面做得很好。
【解决方案4】:

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

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

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 别问我为什么!)

【讨论】:

    【解决方案5】:

    我只是用这个:

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

    第一行在所有情况下都保留(当然,它被清除了)。

    【讨论】:

      【解决方案6】:

      这对你有用吗?我已经在 Excel 2010 中对其进行了测试,它运行良好。 这适用于使用 A 到 G 列的名为“Table1”的表。

      Sub Clear_Table()
          Range("Table1").Select
          Application.DisplayAlerts = False
          Selection.Delete
          Application.DisplayAlerts = True
          Range("A1:G1").Select
          Selection.ClearContents
      End Sub
      

      【讨论】:

        【解决方案7】:

        这个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
        

        【讨论】:

        • 如果你会问这个问题,我们会给你一个类似的答案 :) 但是你不需要 2 个 IF 条件。您可以将它们组合起来。
        • 我同意@SiddharthRout 还有你有一个错字Err.clesr 应该是Err.Clear
        • @engineersmnky - 谢谢,我刚刚在 VBA 中发现了这一点!
        • @SiddharthRout - 在这种情况下,我确实需要 2x If,因为它们都检查不同的东西。但是,我正在寻找另一个答案,它可以避免同时使用 If 声明。谢谢。
        【解决方案8】:

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

        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
        

        【讨论】:

          【解决方案9】:

          以上代码在 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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-04-22
            • 2010-09-27
            • 2014-01-30
            • 2023-02-02
            • 1970-01-01
            • 2011-12-20
            • 1970-01-01
            • 2011-12-29
            相关资源
            最近更新 更多