Как искать несколько шаблонов для удаления строк? - PullRequest
1 голос
/ 05 июля 2019

Я хочу создать макрос, который удаляет все строки документа Excel, которые содержат определенные значения, скажем, «красный», «синий» и «желтый».

Я нашел некоторый код, который работает дляодно значение.Я попытался внести некоторые изменения, но не смог заставить его работать для нескольких значений.

Sub Colors() 

    Dim pattern As String
    pattern = "red"
    RowCount = ActiveSheet.UsedRange.Rows.Count

    Dim i As Integer
    For i = 1 To RowCount
        Dim j As Integer
        For j = 1 To 1
            If Cells(i, j) = pattern Then
                Cells(i, j).EntireRow.Delete
            End If
        Next j
    Next i

End Sub

Как вы перечисляете больше образцов?

Ответы [ 4 ]

3 голосов
/ 05 июля 2019

Нечто подобное должно работать.Вы можете использовать коллекцию, чтобы хранить все ваши шаблоны и проходить через них.В качестве альтернативы вы могли бы просто использовать серию операторов или в операторе If вместо этого.

Сделали несколько изменений, чтобы улучшить это.Вы также можете явно объявить лист, где вы взаимодействуете с ячейками, чего я не делал.Также я удаляю петлю For j, так как она не нужна.

Option Explicit

Sub Colors()

    Dim i        As Long
    Dim j        As Long
    Dim RowCount As Long
    Dim patterns As Collection: Set patterns = New Collection
    Dim pattern  As Variant

    patterns.Add "red"
    patterns.Add "blue"
    patterns.Add "yellow"

    RowCount = ActiveSheet.UsedRange.Rows.Count

    For i = RowCount To 1 Step -1
        For Each pattern In patterns
            If Cells(i, 1) = pattern Then 
                Cells(i, 1).EntireRow.Delete
                exit for
            end if
        Next
    Next

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

Не зацикливаться.Для больших наборов данных это занимает очень много времени.

Не удаляйте по той же причине.

Вместо этого: фильтруйте, копируйте набор данных на новый лист, удаляйте старый лист.

Sub Macro1()
'
' Macro1 Macro
'

    Dim mySheetname As String
    Dim mySheetnameOld As String
    Dim lastRow As Long

    'Replace "Sheet1" with your sheet name.
    mySheetname = "Sheet1"
    mySheetnameOld = mySheetname & "_Old"
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    Sheets(mySheetname).Name = mySheetname & "_Old"

    ' Add/remove your cell criteria to/from the filter array
    Sheets(mySheetnameOld).Rows("1:" & lastRow).AutoFilter Field:=1, Criteria1:=Array( _
        "Blue", "Green", "Red", "Yellow"), Operator:=xlFilterValues
    Sheets.Add After:=Sheets(mySheetnameOld)
    ActiveSheet.Name = mySheetname

    Sheets(mySheetnameOld).Select
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    Rows("1:" & lastRow).Copy Sheets(mySheetname).Cells(1, 1)

    Application.DisplayAlerts = False
    Sheets("Sheet1_Old").Delete
    Application.DisplayAlerts = True

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

Попробуйте:

Option Explicit

Sub Colors()

    Dim arr As Variant
    Dim LastRow As Long, i As Long, j As Long
    Dim Color As String

    arr = Array("Red", "Blue", "Yellow")

    'It is better to create a with statement with th workbook you want to work
    With ThisWorkbook.Worksheets("Sheet1")
        'It is better to avoid the usedrange, instead use a specific when you calculating the lastrow
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
        'Loop if you delete you loop from bottom to top
        For i = LastRow To 1 Step -1
            'Get the color in cell i column A
            Color = .Cells(i, 1).Value

            'Loop array with colors
            For j = LBound(arr) To UBound(arr)
                'If color much
                If Color = arr(j) Then
                    'Delete row
                    .Rows(i).EntireRow.Delete
                    Exit For
                End If

            Next j

        Next i

    End With

End Sub
0 голосов
/ 05 июля 2019
Sub Colors()

Dim pattern As String
Dim i As Long, j As Long

RowCount = ActiveSheet.UsedRange.Rows.Count

For i = RowCount To 1 Step -1
    If Cells(i, 1) = "red" Or Cells(i, 1) = "blue" Or Cells(i, 1) = "yellow" Then
       Cells(i, 1).EntireRow.Delete
    End If
Next i

End Sub

Вы можете использовать оператор or для указания нескольких критериев.При поиске в столбце 1 вы можете изменить индекс ячейки, чтобы скорректировать свои строки.

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