web-dev-qa-db-ja.com

Excelテーブルからすべてのデータ行を削除します(最初の行を除く)

つい最近、私はテーブルのすべてのデータ行を削除しようとしました。

アクション対象のテーブルの一部にはすでに行がない可能性があるため、.DataBodyRange.Rows.Count行のないテーブル(ヘッダーまたはフッターのみ)でエラーが発生します。

私はすべてを見つけることができなかった解決策を探しましたので、この質問に対する私の答えが将来他の人に役立つことを願っています。

14
David Gard

コードを絞り込むことができます

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

編集

サイドノートでは、最初の行または他の行が削除されたかどうかに関係なくユーザーを推測する必要がある場合、適切なエラー処理を追加します

19
Siddharth Rout

これは私がデータをクリアする方法です:

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

うまく動作する3つのルーチンがあり、テーブル内のセルを選択して、サブルーチンの1つを実行するだけです。

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
4
Erik

これはあなたのために働くでしょうか? 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
4
Jack McCoy

上記のコードではできなかった数式を保持したかったのです。

これが私がやってきたことです。これにより、テーブルに空の行が1つ残ることに注意してください。

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は理由を聞かない!)

3
HarveyFrench

上記のコードは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
0
Tariq Khalaf

最初にclearcontentsを提案し、次に表のサイズを変更することをお勧めします。

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
0
Max Makhrov

この 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
0
David Gard