Страницы: 1
RSS
Как найти последнюю дату с условиями?, VBA
 
Добрый день,
У меня есть файл с ценами поставщика. Цены обновляются не регулярно, скорее даже произвольно. Мне необходимо вести базу цен по продуктам на каждый день. Как можно с помощью VBA вытянуть значение последней доступной даты подходящей под условие двух других ячеек чтобы формировать прайс на каждый день(максимальная дата или что-то тип того, не знаю)?
P.S. Я буду вытягивать данные из другой книги каждое утро и оба файла достаточно тяжеловесные.
Заранее спасибо
 
см.вложение
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Валерий Кишин,
если данные отсортированы может просто брать последнее значение?

честно говоря, не очень понятна задача, попробуйте сделать более четки пример с желаемым результатом
 
Окей, я чуть более очевидно написал необходимые действия в файле
 
Цитата
написал:
я чуть более очевидно написал
да ладно, не прибедняйтесь - не чуть более,  а полностью очевидно!
жаль только, что не понятно куда формулу написать и что она должна вычислить
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
жаль только, что не понятно куда формулу написать и что она должна вычислить
В диапазоне D14:D34 с помощью VBA подставляются значение цены из диапазона D2:D9 при совпадении критерий "дом", "продукт" и "дата" (ближайшей прошедшей от заданной в диапазоне B14:B34 при отсутствии совпадения в диапазоне B2:B9). Мне очень хочется правильно сформулировать поставленную задачу чтобы Вы её поняли и в дальнейшем делать лучше. Скажите пожалуйста если поняли или задайте вопросы для верной формулировки.
Изменено: Валерий Кишин - 22.02.2023 09:39:00
 
Валерий Кишин,
теперь мне стало яснее.
формулой так:
Код
=ЕСЛИОШИБКА(ИНДЕКС($D$2:$D$9;ПОИСКПОЗ(A14&B14&C14;$A$2:$A$9&$B$2:$B$9&$C$2:$C$9;0));
ИНДЕКС($D$2:$D$9;ПОИСКПОЗ(A14&МАКСЕСЛИ($B$2:$B$9;$B$2:$B$9;"<"&B14;$A$2:$A$9;A14;$C$2:$C$9;C14)&C14;$A$2:$A$9&$B$2:$B$9&$C$2:$C$9;0)))
 
для решения любой задачи, как минимум, необходимо знать точные ответы на три вопроса:
1. Исходные (где находятся, как поступают в систему)
2. Результаты (что нужно получить в итоге, куда и в каком виде положить)
3. Алгоритм (свод правил, действий следуя которым, можно из Исходных получить Результаты)
Последнее не обязательно, если очевидно из первых двух
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
evgeniygeo написал:
формулой так:
В целом да, но исключает полное совпадение даты. И это необходимо на VBA, я не понимаю как вытащить последнюю дату меньше чем заданная кодом а не формулой.
Ігор Гончаренко, В текущем варианте Вам не хватает какой либо информации?
 
PQ тоже кое-что может
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    date_type = Table.TransformColumnTypes(Source,{{"Дата", type date}}),
    groups = Table.Group(date_type, {"Дом", "Продукт"}, {{"rows", each _}}),
    fx_tbl = (x as table) =>
        let
            dates = 
                List.Transform(
                    {Number.From(List.Min(x[Дата]))..Number.From(DateTime.Date(DateTime.LocalNow()))},
                    Date.From
                ),
            dates_to_add = List.Difference(dates, x[Дата]),
            new_dates_tbl = Table.FromList(dates_to_add, Splitter.SplitByNothing(), type table[ Дата = Date.Type ]),
            add_dates = Table.Combine({x, new_dates_tbl}),
            sort = Table.Sort(add_dates, {"Дата", Order.Ascending}),
            fill_down = Table.FillDown(sort, {"Дом", "Продукт", "Цена"})
        in fill_down,
    f = Table.TransformColumns(groups, {"rows", fx_tbl}),
    exp = Table.ExpandTableColumn(f, "rows", {"Дата", "Цена"}, {"Дата", "Цена"})
in
    exp
Пришелец-прораб.
 
Alien Sphinx,
что-то совсем не то...

Валерий Кишин,
на vba:
Код
Sub aaa()
база = Range("A2:D9")
данные = Range("A14:D34")
For b = 1 To UBound(данные)
a = Application.WorksheetFunction.MaxIfs(Range("B2:B9"), _
Range("A2:A9"), Cells(b + 13, 1), Range("C2:C9"), Cells(b + 13, 3), Range("B2:B9"), "<=" & Cells(b + 13, 2).Value2)
    For d = 1 To UBound(база)
         If данные(b, 1) = база(d, 1) Then
            If DateValue(Format(a, "dd.mm.yyyy")) = база(d, 2) Then
                If данные(b, 3) = база(d, 3) Then
                    Cells(b + 13, 4) = Cells(d + 1, 4)
                End If
            End If
        End If
    Next d
Next b
End Sub
Изменено: evgeniygeo - 22.02.2023 11:09:30
 
Цитата
написал:
совсем не то...
странно. ТС хочет из таблицы с изменениями цен получить такую же, но чтобы цены были указаны на все даты, даже если изменений цены не было. Я это реализовал. Он вам про черный-молоко расписал все подробно.  
Пришелец-прораб.
 
Цитата
Alien Sphinx написал:
чтобы цены были указаны на все даты
ну если с этой точки зрения, то да. я даже не задумался об этом
 
пока нет однозначных обьяснений что есть, что нужно
каждый может решать "свою" задачу (как понял так и решил). результаты могут быть абсолютно разные, зато у всех правильные))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
базу цен по продуктам на каждый день
да это фейерически логично, цена не менялась год, но в файле 365 записей с одной и той же ценой! просто предел логики и оптимизации для хранения минимума информации  
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
ну если с этой точки зрения
А как еще можно было понять ТС? Вот цитата из первого сообщения ТС
Цитата
Мне необходимо вести базу цен по продуктам на каждый день.
В последнем файле он прямо идет по таблице и объясняет почему выбрана та или иная цена в зависимости от даты.
Цитата
найдено совпадение И дома И даты И продукта. Берем значение цены
дата отсутвует, берется значение последней доступной назад от текущей (01.02.2023) при совпадении продукта (молоко) и дома (черный)
Подождем ТС...
Пришелец-прораб.
 
Цитата
написал:
да это фейерически логично
Да я сам удивился! Сначала подумал, что он из большой таблицы маленькую хочет сделать и уже код под это дело написал, а потом пригляделся...
Пришелец-прораб.
 
Alien Sphinx, все верно, все правильно. Все так, все работает . Да, табличка огромная кака, но именно такая нужны для использования в других местах. К сожалению PQ использовать не получится, надо быстро, а в исходнике 600к+ строк.
evgeniygeo,Alien Sphinx во всем прав. Ваш код так же отрабатывает нормально, надо еще погонять и понять может что не так
 
Валерий Кишин,
ну у меня 600к строк отрабатывает за 65 секунд

Цитата
Валерий Кишин написал:
надо еще погонять и понять может что не так
удачи
Изменено: evgeniygeo - 22.02.2023 12:45:40
 
Цитата
evgeniygeo написал:
600к строк отрабатывает за 65 секунд
PQ? У меня PQ иногда минут по 15 формирует таблички. Может правда сложные изначально, ибо обычно он собирает 400+ файлов в папке
 
Валерий Кишин,
нет, vba
 
Валерий Кишин, ну хотя бы прояснилось, наконец, что вам на самом деле надо :)  
Пришелец-прораб.
Страницы: 1
Наверх