Страницы: 1
RSS
Расчет ближайшей даты доставки при определенных условиях
 
Доброго времени суток!

Нужна помощь с задачкой ниже.
Возможно для этого даже есть готовая формула, но уровень моего знания  экселя оставляет желать лучшего. Поэтому буду очень рад любому совету:  от направления, с какими темами мне стоит ознакомиться, до готового  решения.
Спасибо!

Дано: несколько торговых точек с разным сроком доставки продукции в зависимости от дня размещения заказа. Пример во вложении.

можно ли каким то образом составить формулу так, чтобы для текущей даты можно было рассчитать ближайшую дату доставки с учетом следующих условий:

Если при размещения заказа в указанный день имеются данные по сроку доставки, то заказ формируется на дату = день заказа + срок доставки
Если при размещения заказа в указанный день данных по сроку доставки нет, то днем заказа считается следующий ближайший день, где эти данные есть.

Немножко конкретики по примеру:
магазин3 делает заказ в понедельник 27.01.2020 и получает товар через 5 дней - 01.02.2020.
Если этот же магазин делает заказ уже во вторник 28.01.2020, то товар он получит только 08.02.2020 ( следующий ближайший заказ 03.02 + 5 дней на доставку  )

В столбце К примера указаны даты, которые должны получиться, если дата заказ для каждого магазина = 29.01.2020
 
Обязательно ли это должна быть формула листа ?
Сделать такую ​​формулу будет довольно сложно даже с помощью вспомогательных столбцов.
Может ли это быть "UDF-формула" (vba) ?
 
Не обязательно, любой вариант подойдёт для начала. У меня даже нет понимания какого то общего алгоритма для решения такой задачи.

параллельно пойду знакомиться с понятием udf- формулы. С макросами в вба немного знаком, а с таким не сталкивался.  
 
Я не знаю, правильно ли я понял, но это может выглядеть так:
Код
Function datadost(rRng, crit, dDate)
    Dim cls%, arr, c, i&
    i = crit.Row
    cls = rRng.Columns.Count
    arr = Range(rRng.Columns(2), rRng.Columns(cls)).Rows(1).Value
    c = Application.Match(Format(dDate, "ddd"), arr, 0): arr = Empty
    If IsError(c) Then datadost = CVErr(xlErrNA): Exit Function
    arr = Range(rRng.Columns(2), rRng.Columns(cls)).Rows(i).Value
    cls = UBound(arr, 2): i = 0
jr: For c = c To cls
        If Trim(arr(1, c)) <> "" Then Exit For
        i = i + 1
    Next
    If i = UBound(arr, 2) Then datadost = CVErr(xlErrNA): Exit Function
    If c > cls Then cls = c - i - 1: c = 1: GoTo jr
    datadost = dDate + i + arr(1, c): arr = Empty
End Function

но, кроме вашего примера, не проверено.

функция должна быть скопирована в стандартный модуль редактора vba (Alt+F11 => Insert \ Module), например, "Module1".

Вызов функции на листе (например в "I2" и скопировать вниз) - для вашего примера:

Код
=datadost($A$1:$H$4;$A2;СЕГОДНЯ())
$A$1:$H$4 - это ваша таблица - целая
$A2 - конкретный магазин

Пс:
Я не знаю, будет ли "Format(dDate, "ddd")" работать правильно с кириллицей (и в результате возвращать правильный символ дня недели: пн, вт, ...).
Изменено: ocet p - 30.01.2020 14:35:46
 
Не одной формулой, но в принципе рабочий вариант.
Вот горшок пустой, он предмет простой...
 
ocet p, PooHkrd,

спасибо огромное!

Оба варианта у меня работают. Теперь буду разбираться, что из чего получается и попробую перенести на конкретный список. Через какое-то время расскажу, что из этого получится.

Еще раз низкий вам поклон!
 
Цитата
ocet p написал:
будет ли "Format(dDate, "ddd")" работать правильно с кириллицей
Функция Format учитывает региональные настройки.
Владимир
Страницы: 1
Наверх