Удалить строки в большой таблице - PullRequest
0 голосов
/ 24 июня 2019

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

Sub deleteRow()
    For i = 1 To 900000
        If Cells(i, 1) > 7 Then
            Rows(i).Select
            Selection.Delete
        End If
    Next i
End Sub

Ответы [ 3 ]

2 голосов
/ 24 июня 2019

Этот простой макрос будет работать для вас:

Нет необходимости в петле

Для таблицы используйте это:

Sub deleteRow()

    With ActiveSheet.ListObjects("Table1") ' Change table name

        .Range.AutoFilter Field:=1, Criteria1:=">7"
        .DataBodyRange.Delete

    End With

End Sub

Это также покажет предупреждение, выберите Да, когда оно появится


Для объекта простого диапазона Используйте это:

Sub deleteRow()

    With ActiveSheet.UsedRange

        .AutoFilter Field:=1, Criteria1:=">7"
        .Offset(1, 0).SpecialCells(xlCellTypeVisible).Delete xlShiftUp

    End With

End Sub

Полезная связь с различными командами операций таблицы. Здесь

0 голосов
/ 24 июня 2019

Несколько советов:

Option Explicit

Sub deleteRow()

    Dim i As Long, LastRow As Long

    'Create a with statement refer to the sheet where data are store
    With ThisWorkbook.Worksheets("Sheet1")

        'Find LastRow of column A. There is no need to loop up to 900000
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        'When you loop aiming to delete you loop from bottom to top
        For i = LastRow To 1 Step -1

            'In both ".Cells(i, 1) > 7" & ".Rows(i).EntireRow.Delete" we use "." before
            If .Cells(i, 1).Value > 7 Then
                .Rows(i).EntireRow.Delete
            End If

        Next i

    End With

End Sub
0 голосов
/ 24 июня 2019

Вы должны удалить их все сразу в конце, а не в каждом экземпляре.

Попробуйте это.

Sub deleteRow()
Dim killRNG As Range
Set killRNG = Cells(Rows.Count, 1).EntireRow

For i = 1 To 900000


If Cells(i, 1) > 7 Then

Set killRNG = Union(Cells(i, 1).EntireRow, killRNG)

End If
Next i

killRNG.Delete

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...