Всем привет! Задачка такая: нужно создать файл, в котором пользователь задаст даты и время старта поездок и даты и время финиша. Excel должен разложить каждый промежуток следующим образом (во вложении). Думал попробовать сделать это при помощи Powerquery, но не придумал, как конкретно.
написал: Excelopfer, Добрый день! Реализация на коленке формулами, смотрите вложение.
Доброго дня! Спасибо, но не совсем то, что я хотел. Пользователь будет вводить несколько дат и времен старта и финиша. и на каждый должно быть такое разделение. Формулами тут вряд ли. Скорее Powerquery или макрос.
Сделал тоже для одной строки, выложу уж, не пропадать же
Код
let
C = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content]{0}[Старт],
ДО= Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content]{0}[финиш],
Источник = List.Dates(Date.From(C), Number.From(Date.From(ДО))- Number.From(Date.From(C))+1, #duration(1,0,0,0)),
ВТаблицу = Table.TransformColumnTypes(Table.RenameColumns(Table.FromList(Источник, Splitter.SplitByNothing(), null, null, ExtraValues.Error), {"Column1", "Результат"}), {"Результат", type date}),
Старт = Table.AddColumn(ВТаблицу, "Старт", each if [Результат] = Date.From(C) then Time.From(C) else #time(0,0,0), type time),
Финиш = Table.AddColumn(Старт, "Финиш", each if [Результат] = Date.From(ДО) then Time.From(ДО) else #time(23,59,0), type time)
in
Финиш
Как раз вот формулами-то и несложно совсем с 01.01.2022 по 31.12.2025 =ЕСЛИОШИБКА(НАИМЕНЬШИЙ(ЕСЛИ((СТРОКА($44562:$46022)>=ТРАНСП(Tabelle1[Старт дата]))*(СТРОКА($44562:$46022)<=ТРАНСП(Tabelle1[финиш]));СТРОКА($44562:$46022));СТРОКА(K1));"") Любая дата (должно быть пошустрее, если в исходнике небольшой период =ЕСЛИОШИБКА(НАИМЕНЬШИЙ(ЕСЛИ((СТРОКА(ИНДЕКС(A:A;МИН(Tabelle1[Старт дата])):ИНДЕКС(A:A;МАКС(Tabelle1[финиш])))>=ТРАНСП(Tabelle1[Старт дата]))*(СТРОКА(ИНДЕКС(A:A;МИН(Tabelle1[Старт дата])):ИНДЕКС(A:A;МАКС(Tabelle1[финиш])))<=ТРАНСП(Tabelle1[финиш]));СТРОКА(ИНДЕКС(A:A;МИН(Tabelle1[Старт дата])):ИНДЕКС(A:A;МАКС(Tabelle1[финиш]))));СТРОКА(K1));"")
Excelopfer, 1. кнопка Цитировать не для ответа, а для АКЦЕНТИРОВАНИЯ ВНИМАНИЯ на определенной фразе из текста, а не всего полностью. для ответа есть кнопка "ИМЯ". лучше бы исправить свои предыдущие сообщения.(удалить бесполезные цитаты) 2. вы бы прежде чем отвечать посмотрели бы файл от _Boroda_, в #13 сообщении.
Excelopfer, не жмите на кнопку цитирования. Достаточно нажать "Имя". Как убрать секунды оставлю Вам на откуп, т.к. сам не знаю как.
Функция
Код
(x)=>
let
//x = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content]{0},
Даты =
List.Dates(
Date.From(x[Старт дата]),
Number.From(Date.From(x[финиш])-Date.From(x[Старт дата]))+1,
#duration(1,0,0,0)
),
ВТаблицу =
Table.TransformColumnTypes(
Table.RenameColumns(
Table.FromList(
Даты,
Splitter.SplitByNothing(), null, null, ExtraValues.Error),
{"Column1","Результат"}),
{"Результат", type date}),
Старт =
Table.AddColumn(
ВТаблицу,
"Старт",
each if [Результат] = Date.From(x[Старт дата])
then Time.From(x[Старт время])
else #time(0,0,0), type time),
Финиш =
Table.AddColumn(
Старт,
"Финиш",
each if [Результат] = Date.From(x[финиш])
then Time.From(x[Финиш время])
else #time(23,59,59), type time)
in[
Финиш
Запрос
Код
let
Источник = Table.RemoveLastN(Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],1),
f = Table.AddColumn(Источник,"tmp",each f_dates(_)),
cmb = Table.Combine(f[tmp])
in
cmb
Excelopfer, с самым нижним? Готовьте всегда пример, т.к. он есть в реальных данных. В Вашем примере нижняя строка была с какими-то точками, я ее удалил. Запрос поменяйте на:
Код
let
Источник = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
f = Table.AddColumn(Источник,"tmp",each f_dates(_)),
cmb = Table.Combine(f[tmp])
in
cmb
upd. а понял, что с одной не работает, а не с последней, но решение то же. Так и оставьте, как код в этом сообщении, вряд ли у Вас в реальном примере эта строка с точками будет.
whateverlover, Теперь всё работает, спасибо большое. Только формат меняет на числовой, если новые данные. Странно. Нельзя это исправить? В редакторе PQ стоят правильные форматы, а выдаёт такое
whateverlover, да, странно, конечно. Решил так: создал ссылку на запрос и там ещё раз задал формат. РАботает. Спасибо огромное. Это гениально. Про функции в PQ я и не знал ;D
whateverlover, подскажите ещё, пожалуйста, как можно так же, как и номер, вставить страну. Я попробовал по аналогии
Код
СтолбецСтрана =
Table.AddColumn(ВТаблицу, "Reiseziel", each x[Reiseziel], type text),
но не работает. Мне ещё нужно вставить столбец страна, чтобы он так же повторялся, как и номер, а также столбцы с чекбоксами, которые тоже будут повторяться в выгрузке.
Логика должна быть такая, что в каждом следующем шаге мы указываем предыдущий шаг. Т.е. у СтолбецСтрана мы не указываем "Table.AddColumn(ВТаблицу", а заменяем первый аргумент на предыдущий шаг, коим теперь является СтолбецСНомером.
Код
...
ВТаблицу =
Table.TransformColumnTypes(
Table.RenameColumns(
Table.FromList(
Даты,
Splitter.SplitByNothing(), null, null, ExtraValues.Error),
{"Column1","Tag"}),
{"Tag", type date}),
СтолбецСНомером =
Table.AddColumn(ВТаблицу, "№", each x[N], type number),
СтолбецСтрана =
Table.AddColumn(СтолбецСНомером, "Reiseziel", each x[Reiseziel], type text),
Старт =
Table.AddColumn(
СтолбецСтрана,
"Startzeit",
each if [Tag] = Date.From(x[Startdatum])
then Time.From(x[Startzeit])
else #time(0,0,0), type time)
...
Но если уж очень много столбцов надо добавлять, можно просто в функции создать диапазон периодов и развернуть их, тогда сохранятся все столбцы и не нужно будет к каждому создавать Table.AddColumn. (в файле сделал, но тогда слетают форматы в развернутых столбцах и надо заново им задавать форматы)