У меня есть следующие две колонки (упрощенно)

Bond   BMW
Equity Amazon
Bond   Netflix
Bond   Uber
Equity Google

Мне нужен код, который в основном проходит через первый столбец и удаляет строку, если это Equity.

Моя идея (с точки зрения цикла for):

for i = 1 to 5
if ws.Cells(i,1).Value = "Bond" Then
Else 
ws.Rows(i).Select
End If 
Next i
Selection.Delete
End Sub

Проблема, которую я заметил, заключается в том, что удаляется только последняя выбранная ячейка. Я бы подумал, что все ячейки, которые я выделил в цикле, будут выделены. Есть ли особый способ выбрать несколько. (Union в этом случае работать не будет, так как список будет динамическим).

1
user9078057 22 Окт 2018 в 11:54

2 ответа

Лучший ответ

Обычно при удалении строк вы начинаете снизу и продвигаетесь вверх.

Sub Button2_Click()
    Dim LstRw As Long, x

    LstRw = Cells(Rows.Count, "A").End(xlUp).Row

    For x = LstRw To 1 Step -1

        If Cells(x, "A").Value = "Equity" Then

            Cells(x, "A").EntireRow.Delete

        End If

    Next x

End Sub
2
Davesexcel 22 Окт 2018 в 09:01

Чтобы свести активность с листом к минимуму, попробуйте вот так

Sub Button2_Click()
    Dim DeleteRange As Range
    Dim LstRw As Long, x As Long

    LstRw = Cells(Rows.Count, "A").End(xlUp).Row

    For x = 1 To LstRw

        If Cells(x, "A").Value = "Equity" Then

            If DeleteRange Is Nothing Then
                Set DeleteRange = Rows(x)
            Else
                Set DeleteRange = Union(DeleteRange, Rows(x))
            End If

        End If

    Next x

    If Not (DeleteRange Is Nothing) Then
        DeleteRange.EntireRow.Delete
    End If

End Sub

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

0
Storax 22 Окт 2018 в 09:39
52925553