Макрос Excel VBA для удаления строки, если столбец соответствует определенным словам - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть отчет, в котором столбец «E» имеет определенные статусы.Мне нужен только один или два, и мне нужно удалить остальные.Существует ли макрос, который может искать столбец «E» и удалять из следующего списка, если он соответствует?

DEAL_EXPIRED
DEAL_CLEARED
DEAL_AWAITING_AUTH
DEAL_AUTH_FAILED

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Для этого ответа я использую Sheet1.Try:

Option Explicit

Sub test()

    Dim LR As Long
    Dim i As Long

       With ThisWorkbook.Worksheets("Sheet1")

            LR = .Cells(.Rows.Count, "E").End(xlUp).Row

            For i = LR To 1 Step -1

                If .Range("E" & i).Value = "DEAL_EXPIRED" Or .Range("E" & i).Value = "DEAL_CLEARED" Or .Range("E" & i).Value = "DEAL_AWAITING_AUTH" Or .Range("E" & i).Value = "DEAL_AUTH_FAILED" Then
                    .Rows(i).EntireRow.Delete
                End If

            Next i

        End With

End Sub
0 голосов
/ 30 ноября 2018

Опция Явная

Private D1     As Variant
Private RSel   As Range
Private R2Del  As Range

Public Sub Squadra_Unita(Optional ByVal msg As Variant) _
    'https://youtu.be/sE6CMwO5Qm8

    Rows_Delete _
            Range_Walk( _
            List_Ask( _
            Selection_Check))
End Sub

Public Function Rows_Delete(Optional ByVal msg As Variant) _
       As Variant

    If R2Del Is Nothing Then _
       Exit Function

    R2Del.EntireRow.Delete shift:=xlUp

End Function

Public Function Range_Walk(Optional ByVal msg As Variant) _
       As Range
    Dim x      As Long
    For x = LBound(D1) To UBound(D1)
        Set R2Del = App_Union( _
                    R2Del, _
                    Search_Get(RSel, D1(x)))
    Next
End Function

Public Function Search_Get(ByVal r As Range, ByVal str As String) _
       As Variant

    Dim c As Range, found As Range, firstAddress As String

    With r
        Set c = .Find( _
                what:=str, LookAt:=xlPart, MatchCase:=False)

        If Not c Is Nothing Then
            firstAddress = c.Address
            Do

                Set found = App_Union(found, c)

                Set c = .FindNext(c)

                If c Is Nothing Then Exit Do

            Loop While c.Address <> firstAddress

        End If
    End With

    If Not found Is Nothing Then _
       Set Search_Get = found

End Function

Public Function List_Ask(Optional ByVal msg As Variant) As Variant        '   Òåñòîì ÍÅ ïîêðûòà
    Dim str    As String
    str = Application.InputBox( _
          "Type words with space", _
          "List for Delete Rows in Selection", , , , , , 2)

    D1 = Split(str)

End Function

Public Function Selection_Check(Optional ByVal msg As Variant) _
       As Variant

    If Selection.Count < 2 Then

        MsgBox "Need more selection :-)"

        End

    Else

        Set RSel = Application.Intersect( _
                   ActiveSheet.UsedRange, _
                   Selection)
    End If
End Function

Public Function App_Union(rng_Union As Range, _
                          ByVal rng As Range) _
                          As Range
' Set rng_union = App_Union(rng_union, .Rows(x))

    If Not rng_Union Is Nothing Then

        Set rng_Union = Application.Union(rng_Union, rng)

    Else

        Set rng_Union = rng

    End If

    Set App_Union = rng_Union

End Function
0 голосов
/ 30 ноября 2018

Предполагая, что ваши данные имеют заголовок в первой строке, вы можете использовать это:

Option Explicit

Sub DeleteMe()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim DeleteMe As Range, i As Long, ARR

ARR = ws.Range("E2:E" & ws.Range("E" & ws.Rows.Count).End(xlUp).Row).Value

For i = LBound(ARR) To UBound(ARR)
    Select Case ARR(i, 1)
        Case "DEAL_EXPIRED", "DEAL_CLEARED", "DEAL_AWAITING_AUTH", "DEAL_AUTH_FAILED"
            If Not DeleteMe Is Nothing Then
                Set DeleteMe = Union(DeleteMe, ws.Range("E" & i + 1))
            Else
                Set DeleteMe = ws.Range("E" & i + 1)
            End If
    End Select
Next i

If Not DeleteMe Is Nothing Then DeleteMe.EntireRow.Delete

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