Цикл по столбцам и строкам с несколькими критериями - PullRequest
1 голос
/ 05 марта 2020

В моем примере данных ниже, у каждого Клиента есть как минимум две ЗАДАЧИ. Я хочу удалить строки, если первая ЗАДАЧА КЛИЕНТА ОТМЕНЕНА. (первая задача должна быть определена на основе даты создания)

Мои ДАННЫЕ:

No. CLIENT  TASK        Created 
123 Aaaa    Done        14/12/2018
123 Aaaa    Done        20/12/2018
123 Bbbb    Cancelled   26/02/2020
123 Bbbb    Done        03/03/2020
123 Cccc    Done        20/02/2020
123 Cccc    Cancelled   01/03/2020

ДАННЫЕ, которые должны быть удалены: (Первая задача, созданная 26/02, отменена)

 123    Bbbb    Cancelled   26/02/2020
 123    Bbbb    Done        03/03/2020

Я начал писать код, но мне нужно какое-то направление, так как я не знаю, как действовать:

        With ActiveSheet.AutoFilter.Range
        Set rFiltered = .Resize(.Rows.Count - 1).Offset(1).Columns(2).SpecialCells(xlCellTypeVisible)
        End With

        FirstRow = rFiltered.Cells(1, 1).End(xlToLeft).Row
        LastRow = Sheet1.Range("A" & Sheet1.Rows.Count).End(xlUp).Row
        Set Frgn = Range(Cells(FirstRow, 2), Cells(LastRow, 2))


For i = FirstRow To LastRow
            For j = 2 To 2
                If Sheet1.Cells(i, j).Value = Sheet1.Cells(i, j) And _
                Sheet1.Cells(i, j) = "Done" Then
                    For k = 3 To 3
                        If Sheet1.Cells(i, j).Value = Sheet1.Cells(i, j) And _
                        Sheet1.Cells(i, k) = "Cancelled" Then
                        Sheet1.Cells(i, k).Delete
                        End If
                    Next k
                End If
            Next j
        Next i

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Не знаю, видели ли вы мой первый пост, но он был неверным, я недостаточно внимательно прочитал ваш запрос (извините). Это должно работать лучше для вас. Смотрите встроенные комментарии.

Надеюсь, это поможет.

Sub DeleteCancelledClients()

    'this "With" block will identify your auto-filtered table and detect the range of your non-header rows
    Dim dataRows As Range
    With ActiveSheet.AutoFilter.Range
        Set dataRows = .Resize(.Rows.Count - 1).Offset(1).SpecialCells(xlCellTypeVisible)
    End With

    'sort your table, the loop is easier to manage if your data is in a useful order
    With ActiveSheet.AutoFilter.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=dataRows.Columns(1)
        .SortFields.Add2 Key:=dataRows.Columns(2)
        .SortFields.Add2 Key:=dataRows.Columns(4)
        .Apply
    End With


    'iterate over the rows in your data
    For i = 1 To dataRows.Count
        'If this is a cancelled record, check to see if it's the first row for that client and number.  (We sorted client - number groups by date, so this is easier)
        If dataRows.Cells(i, 3) = "Cancelled" _
            And (dataRows.Cells(i, 2) <> dataRows.Cells(i, 2).Offset(-1, 0) _
            Or dataRows.Cells(i, 1) <> dataRows.Cells(i, 1).Offset(-1, 0)) Then

            'our client-number's first row is a cancelled task.  read through for all the other rows for this client-number (They're in a block, so this is easier)
            j = 0
            While dataRows.Cells(i, 2) = dataRows.Cells(i, 2).Offset(j + 1, 0) _
                And dataRows.Cells(i, 1) = dataRows.Cells(i, 1).Offset(j + 1, 0)

                j = j + 1
            Wend

            'delete this client-number all at once
            Rows(dataRows.Cells(i, 2).Row & ":" & dataRows.Cells(i, 2).Row + j).Delete

            'roll back our counter by one.  Our current row actually contains a new client thanks to the delete operation so we have to process this again
            i = i - 1
        End If
    Next i

End Sub
0 голосов
/ 06 марта 2020

А как насчет следующего сценария? Если NUMBER отличается, его следует рассматривать отдельно. В случае ниже, только строки с № 456 должны быть удалены. Но макрос удаляет также 123 . Как изменить код, чтобы он также содержал числовые критерии?

Number  Client  Status       Date
123     Aaa     Done        20/02/2020
123     Aaa     Done        05/03/2020
456     Aaa     Cancelled   05/03/2020
456     Aaa     Done        03/03/2020
...