У меня есть очень большая электронная таблица с заголовками (более 180 тысяч строк) с уникальными идентификаторами в A, датой начала в B и датой окончания в C. На каждый идентификатор приходится несколько строк, а даты начала и окончания беспорядочно перекрываются.
Мне нужно найти пробелы в диапазонах дат для каждого идентификатора. Я написал несколько разных формул и макросов, попробовал и подправил другие скрипты VBA, которые нашел здесь и в других местах. Я попытался выполнить запрос мощности и цепляться за соломинку, но если Excel не рухнет, я не получу пригодный для использования результат.
Вот пример данных, которые у меня есть:
ID | start | end |
---|---|---|
100 | 1/1/2015 | 3/1/2015 |
100 | 3/1/2015 | 1/1/2300 |
100 | 1/1/2018 | 1/1/2019 |
096 | 7/1/2020 | 1/1/2021 |
182 | 9/17/2017 | 1/1/2018 |
182 | 1/1/2018 | 1/1/2019 |
607 | 1/1/2015 | 9/1/2015 |
607 | 9/1/2015 | 1/1/2017 |
607 | 1/1/2018 | 1/1/2020 |
607 | 1/1/2021 | 1/1/2300 |
Я хотел бы запустить скрипт, который каким-то образом объединяет или объединяет их, чтобы удалить лишние строки для идентификаторов, у которых нет пробелов в диапазоне дат, но оставит дополнительную строку для идентификаторов, которые имеют:
ID | start | end |
---|---|---|
100 | 1/1/2015 | 1/1/2300 |
096 | 7/1/2020 | 1/1/2021 |
182 | 9/17/2017 | 1/1/2019 |
607 | 1/1/2015 | 1/1/2017 |
607 | 1/1/2018 | 1/1/2020 |
607 | 1/1/2021 | 1/1/2300 |
Мне не нужно это комбинировать; хотя для презентаций было бы неплохо. Кроме того, я бы согласился на что-то, что может сказать мне, какие идентификаторы имеют пробел в диапазоне, даже если он не объединяет даты и не удаляет лишние строки.
Новичок в VBA и формулах, хотя это первый случай, когда мне не удалось получить желаемый результат. Будем очень признательны за любую помощь или указание на лучший способ приблизиться к этому.
Я нашел скрипт с другого сайта, который почти справился со своей задачей, хотя, поскольку диапазоны дат не могут быть отсортированы в правильном порядке, например, ID 100 в примере, он создает дополнительную строку, когда этого не должно быть. Я вставлю это ниже.
Sub Consolidate_Dates()
Dim cell As Range
Dim Nextrow As Long
Dim Startdate As Date
Nextrow = Range("A" & Rows.Count).End(xlUp).Row + 2
Startdate = Range("B2").Value
Application.ScreenUpdating = False
For Each cell In Range("A2", Range("A2").End(xlDown))
If cell.Value <> cell.Offset(1).Value Or _
cell.Offset(0, 2).Value < cell.Offset(1, 1).Value - 1 Then
Range("A" & Nextrow).Resize(1, 3).Value = cell.Resize(1, 3).Value
Range("B" & Nextrow).Value = Startdate
Nextrow = Nextrow + 1
Startdate = cell.Offset(1, 1).Value
End If
Next cell
Application.ScreenUpdating = True
Конец сабвуфера