Excel VBA - проверьте, попадают ли даты в динамический диапазон, если у них совпадают имя и заголовок, затем примите меры по исправлению - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь создать отчет о текучести кадров, отображая, сколько лет кто-то остается на каждой должности (должность).Я выяснил, как удалить точные дубликаты и дублировать даты начала / окончания, однако я застрял на заключительном этапе очистки.Очистка диапазона дат для дат, перекрывающих друг друга, и удаление строк для перекрывающихся дат.Таким образом, я не считаю один и тот же день несколько раз.

Вот упрощенный набор данных, с которыми я работаю: enter image description here

Мне нужно определитьдиапазон путем сопоставления имен:

Джон К. = строки 2-6

Затем, чтобы проверять только даты с соответствующим названием должности:

Sales = Rows 2, 5,6

Sr.Sales = Rows 3

Sales Mng.= Строки 4

Затем для массивов с более чем одной строкой проверьте, попадают ли начальные и конечные даты друг в друга и в эфир: 1. Создайте новую строку с самой ранней датой начала, которая заканчивается за кругами, самой поздней датой начала, которая превышаеткругов и удаляет исходные строки, которые перекрываются.2. Используйте цикл с вопросами Да / Нет, чтобы обновить существующую строку с самым широким диапазоном перекрывающихся дат и удалить строки, попадающие в этот диапазон.

Например, с Джоном К. мне понадобится удалить строки5 и 6, поскольку они попадают в диапазон дат для строки 2, но строки 3 и 4 удалять не нужно, поскольку они представляют собой другое название должности.

Для Dom Q. Изменений не требуетсяпоскольку ни одна из его дат не совпадает.

Для Генри С. мне нужно обновить D10 до D11, а затем удалить строку 11.

Набор данных, на котором я буду работать200 000 строк, поэтому, к сожалению, он слишком велик, чтобы его можно было исправить вручную.Я видел несколько хороших формул для проверки, находятся ли диапазоны дат между собой, однако я не уверен, как сделать их достаточно динамичными, чтобы проверять только совпадающие имена и заголовки.

Заранее спасибо за ваши мысли по этому поводу иЯ рад предоставить больше данных / контекста, если это необходимо.

1 Ответ

0 голосов
/ 05 июня 2018

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

Сначала выполните следующие сортировки:

-Sort Job EndДата от А до Я

-Сортировка Дата начала работы от А до Я

-Сортировка Провайдера от А до Я

Затем я добавляю 3 новых столбца в конце моегонабор данных:

Новый столбец 1: Проверка даты окончания - чтобы указать проверяемую дату окончания для пустых ячеек Дата окончания задания

=IF(R2="",TODAY(),R2)

Новый столбец 2: Q <= выше AE - Должен начинаться сстрока 3. Если поставщик (имя) в приведенной выше строке совпадает, проверьте, не является ли дата начала работы меньше или равна дате окончания работы в строке выше. </p>

=SUMPRODUCT((B3=OFFSET(B3,-1,0))*(Q3<=OFFSET(AE3,-1,0)))

Новый столбец 3: IFAF = 1, AE> = выше AE - должно начинаться с строки 3. Если новый столбец 2 равен 1, проверьте, больше ли дата окончания или равна дате окончания над ним.

=SUMPRODUCT((AF3=1)*(AE3>=OFFSET(AE3,-1,0)))

КонецРезультат со скрытыми ненужными столбцами выглядит следующим образом: Образец данных Excel 2

После подготовки dАта я запускаю следующий макрос.Это начнется в ячейке AF3, проверьте, является ли значение ячейки 1, если нет, то увеличит значение текущей строки (C_Row) и предыдущей строки (P_Row) на 1 и проверит снова, пока не достигнет пустой ячейки.,Если ячейка AF равна 1, она также проверит, равна ли соответствующая ячейка AG 1.Если AG равен 1, он скопирует значение текущей строки Дата окончания задания и вставит его в качестве значения только в дату окончания задания предыдущей строки и удалит текущую строку, создав таким образом самый большой перекрывающийся период времени в одной строке и удаливконфликтный ряд.Если AE не равно 1, он просто удалит текущую строку, поскольку перекрывающиеся даты полностью попадают в строку над ней.

Sub Aging_Overlapping_Dates()

Dim C_Row As Long: C_Row = 3
Dim P_Row As Long: P_Row = 2

    'Loops until AF = Blank
    Do While Not Cells(C_Row, "AF") = ""
        'Checks if AF is 1
        If Cells(C_Row, "AF") = 1 Then
            'If AF is 1, check if AG is 1
            If Cells(C_Row, "AG") = 1 Then
                'Moves Job End Date to the previous row and deletes current row
                Cells(C_Row, "R").Copy
                Cells(P_Row, "R").PasteSpecial xlPasteValues
                Rows(C_Row).Select
            End If
            'Deletes Current Row if AF or AG is 1
            Rows(C_Row).Select
            Selection.EntireRow.Delete
        Else
        'Increase row count if row was not deleted
        C_Row = C_Row + 1
        P_Row = P_Row + 1
        End If
    Loop

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