2013-12-18 2 views
8

Совсем недавно я пытался удалить все строки данных в таблице, кроме первого (который должен быть просто очищен)Удалить все строки данных из таблицы Excel (кроме первого)

Некоторые из действующих таблиц уже не может быть строк, поэтому я запускал его для проблем, так как использование .DataBodyRange.Rows.Count в таблице без строк (только заголовок и/или нижний колонтитул) вызывает ошибки.

Я искал все решения и не мог найти целую, поэтому я надеюсь, что мой ответ на этот вопрос будет полезен другим в будущем.

+0

Если вы не хотите использовать исключения для обработки потока кода, я бы предположил, что вы столкнулись с ошибками, потому что у вас есть нулевое ссылочное исключение в какой-то момент этого вызова (если Table, DataBodyRange или Rows имеют значение null, вы получите ошибку). Вы можете исправить это путем проверки ошибок перед выполнением вызова. –

ответ

13

Ваш код может быть сужен до

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 

Edit:

На стороне примечания я бы добавил правильную обработку ошибок, если мне нужно интуитивно настроить пользователя, будет ли первая строка или другие строки были удалены или нет

+0

Верно, я полагаю, что мне не нужно обязательно сбросить ошибку, когда я это сделаю. Будет ли «End Sub» сбросить ошибку, или мне все еще нужно это сделать? –

+0

'On Error GoTo 0' сбросит ошибку –

+0

Отлично, спасибо за советы. –

0

Это 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 
+1

Если бы вы задали этот вопрос, мы бы дали вам аналогичный ответ :) Однако вам не нужны 2 условия ЕС. Вы можете комбинировать их. –

+2

Я согласен с @SiddharthRout Также у вас есть опечатка 'Err.clesr' должна быть' Err.Clear' – engineersmnky

+0

@engineersmnky - Спасибо, я просто заметил, что в VBA! –

2

Будет ли это работать на вас? Я тестировал его в Excel 2010, и он отлично работает. Это работает с таблицей под названием «Table1», который использует столбцы А через G.

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

Я хотел сохранить формулы в месте, что приведенный выше код не делать.

Вот что я делал, обратите внимание, что это оставляет одну пустую строку в таблице.

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 не спрашивайте меня, почему!)

0

Я предлагаю первые 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 
9

Это, как я очистить данные:

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

У меня есть 3 процедуры, которые работают нормально, просто выберите ячейку стол и запустить одну из подпрограмм

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

и термоусадочная таблицу для удаления databody диапазона, за исключением из него Адерс и первые данные строки

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 
0

Коды выше, не будет работать в 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 
Смежные вопросы