web-dev-qa-db-de.com

Alle Datenzeilen aus einer Excel-Tabelle löschen (außer der ersten)

Ich habe vor kurzem versucht, alle Datenzeilen in einer Tabelle zu löschen, außer der ersten (die gerade gelöscht werden muss).

Einige der Tabellen, für die eine Aktion ausgeführt wird, konnten bereits keine Zeilen enthalten. Daher führte ich Probleme aus, da die Verwendung von .DataBodyRange.Rows.Count für eine Tabelle ohne Zeilen (nur Kopf- und/oder Fußzeile) Fehler verursacht.

Ich habe überall nach einer Lösung gesucht und konnte keine vollständige Lösung finden, daher hoffe ich, dass meine Antwort auf diese Frage in der Zukunft anderen nützlich sein wird.

11
David Gard

Ihr Code kann auf eingegrenzt werden

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

Bearbeiten :

Nebenbei bemerkt, würde ich die richtige Fehlerbehandlung hinzufügen, wenn ich den Benutzer einschätzen muss, ob die erste Zeile oder die anderen Zeilen gelöscht wurden oder nicht

14
Siddharth Rout

So lösche ich die Daten:

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

Ich habe 3 Routinen, die gut funktionieren, wählen Sie einfach eine Zelle in einer Tabelle aus und führen Sie eine der Subroutinen aus

Sub ClearTable()
If Not ActiveCell.ListObject Is Nothing Then
    ActiveCell.ListObject.DataBodyRange.Rows.ClearContents
End If
End Sub

und Tabelle verkleinern, um den Datenbereich außer den Kopfzeilen und der ersten Datenzeile zu entfernen

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

und Tabelle löschen, um die Tabelle vollständig aus dem Arbeitsblatt zu löschen

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

Würde das für dich funktionieren? Ich habe es in Excel 2010 getestet und funktioniert einwandfrei ... Dies funktioniert mit einer Tabelle namens "Table1", die die Spalten A bis G verwendet.

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

Ich wollte die Formeln beibehalten, was der obige Code nicht tat. 

Hier ist, was ich getan habe. Beachten Sie, dass dies eine leere Reihe in der Tabelle hinterlässt.

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 frag mich nicht warum!) 

3
HarveyFrench

Die obigen Codes funktionieren in Excel 2010 nicht Mit dem folgenden Code können Sie die gewünschte Anzahl von Blättern durchgehen und dann Tabellen auswählen und Zeilen löschen 

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

Ich schlage vor, zunächst klare Inhalte zu machen, dann die Größe der Tabelle zu ändern:

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

Dieser VBA Sub löscht alle Datenzeilen (abgesehen von der ersten, die gerade gelöscht wird) -

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