Страницы: 1
RSS
Пересечение диапазонов дат в пределах строки, Пересечение дат в строке
 

Доброго дня! Очень надеюсь на Вашу подсказку. Всегда обращаюсь к обсуждениям на форуме для упрощения своей работы в Excel, но тут затык. Материала, близкого по теме, много, но найти подходящего именно к своей выборке не удалось.

Есть огромный массив информации – глазами ни за что не проверить, а своих знаний Excel недостаточно. Необходимо по каждой строке найти пересечение диапазонов дат. Исходный диапазон по каждой строке выделен жёлтым. Надо относительно этого диапазона проверить, есть ли пересечение с каждой парой следующих дат – диапазоном периода работы. Количество дней пересечений не важно, достаточно значения «ложь/истина» в каждой паре, с пересечениями буду отдельно работать.

Подскажите, пожалуйста, начинающему пользователю. Хотя бы направление, я почитаю. Спасибо!

 
Цитата
Tinatin написал:
достаточно значения «ложь/истина» в каждой паре
именно в каждой паре или одна метка по строке если в любой паре было пересечение с желты периодом
Лень двигатель прогресса, доказано!!!
 
Можно одну отметку на всю строку
 
чет долго думаете вариант о котором говорил
и да у вас КОРЯВЫЕ даты они написаны с пробелами вокруг, я для своего примера исправил
Лень двигатель прогресса, доказано!!!
 
Спасибо большое! Это я в своем массиве смогу поправить. Премного благодарна!!!
 
ещё вариант
Код
=СУММПРОИЗВ((D2:L2<=C2)*(D2:L2>=B2))>0
 
для начала преобразовать значения похожие на даты в даты, потом условный формат:
Код
=(МАКС(RC2:RC3)-МИН(Пара))*(МАКС(Пара)-МИН(RC2:RC3))>0
зеленые - пересеклись
желтые - соприкоснулись
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Мучаем List.Intersect на PQ.. Но, наверное формулами в данном случае проще  :)

Скрипт очень медленный из-за наличия TransformColumns и генерации списков с List.Intersect.  На моем ноуте скорость ~200 строк в секунду для 100 тыс. записей по 5 пар колонок. Но он и не рассчитан на большие объемы данных, скорее было интересно придумать что-нибудь этакое.


Код
    // Готовые списки чтобы каждый раз руками не забивать.
    Unpf = {"УНПФ"}, RegL = {"регистрация", "ликвидация"},

    // Исходная таблица
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],

    // Убираем УПНФ из списка заголовков
    List = List.Difference(Table.ColumnNames(Source), Unpf), 

    // И для этого списка столбцов преобразуем колонки в числовое представление дат.
    // установить для колонки тип number в данном случае - бесполезно, не переварит.
    Type = Table.TransformColumns(Source, List.Transform(List, (Item) => {Item, each Number.From(Date.From(_))})),

    // Таблица создается путем группировки по трем основным колонкам (упнф, региистрация, ликвидация)
    // Добавляемые столбцы генерируются путем трансформации половинного списка индексов (так как колонки прием/увольнение идут всегда парами)
    Grp = Table.Group
           (
            Type, 
            Unpf & RegL, 
            List.Transform
             (

              // Список индексов 0.. до половины длины списка доп. колонок
              {0..Number.RoundDown(List.Count(List.Difference(List, RegL)) / 2) - 1}, 

               // В качестве каждого элемента будущего списка будет списочек вида {имя столбца, функция_генерации_значений_столбца}
              (Id) => {
                       // Имя стобца
                       "Диапазон " & Text.From(Id + 1), 
                       // Функция генерации значений
                       each 
                        let
                          // Так как в таблице-аргументе всегда одна строка в данном случае.
                          Row = _{0}
                        in
                          // Нужно для отлова null в исходных данных
                          try
                            // Признак - пересечение списков дат не пустое.
                            not List.IsEmpty
                                 (
                                  List.Intersect
                                   (
                                    {
                                     {Row[регистрация].. Row[ликвидация]}, 
                                      // Обращение к столбцу по его имени через индекс в том 
                                      // самом "половинном" списке индексов.
                                     {Record.Field(Row, List{Id*2})..Record.Field(Row, List{Id*2 + 1})}
                                    }
                                   )
                                 )
                          otherwise null
                      }
             )
           ),
    // Приведение чисел в даты для двух основных столбцов
    CType = Table.TransformColumnTypes(Grp,{{"регистрация", type date}, {"ликвидация", type date}})
in
    CType
Изменено: Alexey_Spb - 19.03.2019 16:34:00
 
Спасибо большое!
Страницы: 1
Наверх