Excel VBA удаляет много разных строк - PullRequest
0 голосов
/ 05 марта 2019

Я использую Excel 365 и пытаюсь удалить много строк различий и у меня есть рабочий код, но это очень неэффективно.Удаление 500 из примерно 2000 строк занимает много времени по сравнению с ручной фильтрацией столбца, выделением строк и удалением, поэтому я подумал, что нужно удалить все строки, которые нужно удалить, и сделать это за один раз, но не удалось.Мой рабочий код:

' When cell contains TRUE, erase that row
For i = LastRow To firstDataRow Step -1
    If Cells(i, eraseCol).Value = True Then
        sheetdata.Rows(i).Delete
        LastRow = LastRow - 1
    End If
Next

То, что я пытаюсь сделать, что не работает:

For i = LastRow To firstDataRow Step -1
    ' collect all rows to be deleted in range r
    If Cells(i, eraseCol).Value = True Then
        r = Union(Rows(i), r)
    End If
Next
r.Delete

Любая идея, как я могу получить все строки, которые будут удалены в r и сделатьэто сразу?Или, может быть, есть лучший способ?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019
' collect rows to be deleted into range r

' Alternate loop construct using iterator (partial code - diff only)
' Dim i as Range
' For Each i in <column range> ' i.e. <EraseCol>2:<EraseCol>10000
'     If i.value Then
'         If r Is Nothing Then
'             Set r = i
'         Else
'             Set r = Union(r, i)
'         End If
'     End If
' Next i

' No need to step backward, this will only scroll up one time.
For i = firstDataRow to LastRow
    If Cells(i, eraseCol).Value Then
        If r Is Nothing Then
            Set r = Rows(i)
        Else
            Set r = Union(r, Rows(i))
        End If
    End If
Next i
r.EntireRow.Delete ' NO UNDO - wipes undo buffer
0 голосов
/ 05 марта 2019

Вы рядом.Дайте этому шанс:

For i = LastRow To firstDataRow Step -1
    ' collect all rows to be deleted in range r
    If Cells(i, eraseCol).Value Then 
        If r is Nothing Then set r = cells(i,eraseCol) else: Set r = union(r,Cells(i,eraseCol))
    End If
Next

r.EntireRow.Delete

NB - поскольку вы собираете только ячейки в диапазоне, вы можете зацикливаться, если хотите;но цикл в обратном направлении все равно будет работать

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