Страницы: 1
RSS
Cоздание массива дат из произвольных интервалов дат
 
Дорогие эксперты)
Бьюсь с задачей третий день

Как можно из интервалов в столбцах A и B (интервал от и до) получить результат как в столбце E.
Важные ограничения:
1. В столбцах A и B может стать около 1000 интервалов (интервалы задаются руками).
2. В идеале получить решение не макросами, потому что я в них очень слаб(
Изменено: Olegio555 - 14.02.2020 21:18:58
 
С доп. столбцом
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Olegio555,
Извините, макросом
Код
Sub iDataSeries()
Dim iLastRow As Long
Dim iLR As Long
Dim i As Long
   iLastRow = Cells(Rows.Count, "E").End(xlUp).Row + 1
   Range("E2:E" & iLastRow).ClearContents
   iLR = Cells(Rows.Count, "A").End(xlUp).Row
 For i = 2 To iLR
   iLastRow = Cells(Rows.Count, "E").End(xlUp).Row + 1
   Cells(iLastRow, "E") = Cells(i, "A")
   Cells(iLastRow, "E").DataSeries Rowcol:=xlColumns, Type:=xlChronological, Date:= _
        xlDay, Step:=1, Stop:=Cells(i, "B"), Trend:=False
 Next
    Range("E2:E" & iLastRow).NumberFormat = "dd.mmm"
End Sub
 
Olegio555,  для коллекции PQ
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Интервал с", type date}, {"Интервал до", type date}}),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Измененный тип", "Пользовательская", each Duration.Days([Интервал до]-[Интервал с])+1),
    #"Добавлен пользовательский объект1" = Table.AddColumn(#"Добавлен пользовательский объект", "Пользовательская.1", each List.Dates([Интервал с], [Пользовательская], #duration(1, 0, 0, 0))),
    #"Строки с примененным фильтром" = Table.SelectRows(#"Добавлен пользовательский объект1", each [Интервал с] <> null and [Интервал с] <> ""),
    #"Развернутый элемент Пользовательская.1" = Table.ExpandListColumn(#"Строки с примененным фильтром", "Пользовательская.1"),
    #"Удаленные столбцы" = Table.RemoveColumns(#"Развернутый элемент Пользовательская.1",{"Интервал с", "Интервал до", "Пользовательская"})
in
    #"Удаленные столбцы"
Изменено: Aleksey1107 - 14.02.2020 19:39:43
 
Огромное всем спасибо !

Спасли мою психику от саморазрушения)
 
ещё на PQ
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    period = Table.AddColumn(Источник, "period", each {Number.From([Интервал с])..Number.From([Интервал до])}),
    dates_nmb = Table.ExpandListColumn(period, "period"),
    dates = Table.TransformColumnTypes(dates_nmb,{{"period", type date}}),
    out = Table.SelectColumns(dates, "period")
in
    out
 
Цитата
Максим В. написал: С доп. столбцом
Ваше решение очень гармонично! Спасибо!

Но я обнаружил, что не до конца верно сформулировал первоначальную проблему( В связи с этим ваше гениальное решение работает не так, как я мечтал(
Пытался разобраться с вашей формулой в доп столбце - это оказался путь в никуда((

Может, у вас есть идея - как выполнить то, что указано в этом файле (цвета - для наглядности).
Если словами, то:
1. Введённые интервалы могут пересекаться. Оч нужно, чтобы разбивка адекватно это воспринимала.
2. В совершенном варианте - хотелось бы, чтобы она подтягивала и множила в нужном объёме ещё и строчку, которая идёт следом за второй датой
 
Olegio555, чем PQ не устраивает?
 
В столбец I и тянем вниз
=ЕСЛИ(H2<>H1;H2;СУММ(I1;1))
Изменено: Максим В. - 18.02.2020 09:11:36 (Добавил файл)
Если в мире всё бессмысленно, — сказала Алиса, — что мешает выдумать какой-нибудь смысл? ©Льюис Кэрролл
 
Olegio555,
Цитата
Введённые интервалы могут пересекаться. Оч нужно, чтобы разбивка адекватно это воспринимала.
Похоже, что вы проигнорировали решение макросом. Ну это ваше дело.
Цитата
чтобы она подтягивала и множила в нужном объёме ещё и строчку,
Добавил в макрос эту вашу хотелку. Для примера из сообщения #7
Код
Sub iDataSeries()
Dim iLastRow As Long
Dim iLR As Long
Dim i As Long
   iLastRow = Cells(Rows.Count, "E").End(xlUp).Row + 1
   Range("E2:F" & iLastRow).ClearContents
   iLR = Cells(Rows.Count, "B").End(xlUp).Row
 For i = 2 To iLR
   iLastRow = Cells(Rows.Count, "E").End(xlUp).Row + 1
   Cells(iLastRow, "E") = Cells(i, "B")
   Cells(iLastRow, "F").Resize(Cells(i, "C") - Cells(i, "B") + 1) = Cells(i, "D")
   Cells(iLastRow, "E").DataSeries Rowcol:=xlColumns, Type:=xlChronological, Date:= _
        xlDay, Step:=1, Stop:=Cells(i, "C"), Trend:=False
 Next
   iLastRow = Cells(Rows.Count, "E").End(xlUp).Row
    Range("E2:E" & iLastRow).NumberFormat = "dd.mmm"
End Sub
Страницы: 1
Наверх