Коллеги, добрый день. Не нашел решения подскажите. Стандартные функции ВПР и СУММЕСЛИ не подходят. Есть массив данных (в приложенном примере лист "Данные"): - Код товара - уникальный идентификатор. - Кол-во товара. - Дата отправки (возможные форматы значений: текстовый "НЕТ", текстовый "*" (означает товар на отгрузке, то есть в транзите), и собственно Дата) - Дата поступления на склад.
Если отфильтровать исходную таблицу например по коду УП-00002960 (в приложенном примере лист "Данные"): Видно что по этому коду есть 4 партии товара: - 2 партии в транзите (по колонке "Дата отправки" имеют запись в ячейке "Дата" и "*"). - 2 партии в производстве (по колонке "Дата отправки" имеют запись в ячейке "НЕТ"). Все партии с разными датами поступления на склад.
Задача сделать сводную таблицу (в приложенном примере лист "Сводная"), где в строке по коду товара автоматически выполнялся бы расчет и подстановка: 1. Товар в транзите общее количество, шт. (определить что надо суммировать значения у которых по колонке "Дата отправки" имеется запись в ячейке "Дата" и "*" и посчитать сумму.). 2. Товар в транзите ближайшая партия, шт. (из значений определенных как "транзит", подставить количество по партии с ближайшей датой поступления на склад.). 3. Поступление из транзита на склад МСК ближайшая партия, дата (определить и подставить дату поступления ближайшей партии из транзита). 4. Товар в производстве общее количество, шт. (определить, что надо суммировать значения у которых по колонке "Дата отправки" имеется запись в ячейке "НЕТ" и посчитать сумму.). 5. Товар в производстве ближайшая партия, шт. (из значений определенных как "производство", подставить количество по партии с ближайшей датой поступления на склад.). 6. Поступление из производства на склад МСК ближайшая партия, дата (определить и подставить дату поступления ближайшей партии из производства).
Интересный подход, но хотелось бы результата достичь через формулы и результат получить в простой таблице, а не сводной типовой. Потому что из этого массива необходима информация только по отдельным кодам или группам кодов. Будем думать, вопрос пока не решен.
Если формулой массива (Ctrl-Enter), то можно менять Массив!$C:$C на нужный столбец: =ИНДЕКС(Массив!$C:$C;ПОИСКПОЗ(1;(Массив!$A:$A=$A4)*(Массив!$C:$C<>"Нет");0))
написал: Вот без формулы массива (лучше избегать):Ячейка B4 =СУММЕСЛИМН(Массив!$B:$B;Массив!$A:$A;$A4;Массив!$C:$C;"<>"&"НЕТ")Ячейка C4 =ИНДЕКС(Массив!B:B;АГРЕГАТ(15;6;СТРОКА(Массив!$A$1:$A$500)/(Массив!$A$1:$A$500=$A4)/(Массив!$C$1:$C$500=$D4);1))Ячейка D4 =АГРЕГАТ(15;6;(Массив!$C$1:$C$500)/(Массив!$A$1:$A$500=$A4)/(Массив!$C$1:$C$500<>"Нет");1)Ячейка E4 =СУММЕСЛИМН(Массив!$B:$B;Массив!$A:$A;$A4;Массив!$C:$C;"НЕТ")Ячейка F4 =ИНДЕКС(Массив!$B:$B;АГРЕГАТ(15;6;СТРОКА(Массив!$A$1:$A$500)/(Массив!$A$1:$A$500=$A4)/(Массив!$D$1:$D$500=$G4);1))Ячейка G4 =АГРЕГАТ(15;6;(Массив!$D$1:$D$500)/(Массив!$A$1:$A$500=$A4)/(Массив!$C$1:$C$500="Нет");1)Файл приложить не могу из-за корп.ограничений.
Извиняюсь, некорректно понял, какая дата интересует. Теперь ищет дату в столбце Поступления на склад. Ячейка D4 =АГРЕГАТ(15;6;(Массив!$D$1:$D$500)/(Массив!$A$1:$A$500=$A4)/(Массив!$C$1:$C$500<>"Нет");1) Ячейка C4 =ИНДЕКС(Данные!B:B;АГРЕГАТ(15;6;СТРОКА(Данные!$A$1:$A$500)/(Данные!$A$1:$A$500=$A4)/(Данные!$D$1:$D$500=$D4);1)) А здесь условие добавил на неотправленные: Ячейка F4 =ИНДЕКС(Данные!$B:$B;АГРЕГАТ(15;6;СТРОКА(Данные!$A$1:$A$500)/(Данные!$A$1:$A$500=$A6)/(Данные!$C$1:$C$500="Нет")/(Данные!$D$1:$D$500=$G6);1))
Если нужно, поясню смысл: АГРЕГАТ(15; - поиск наименьшего значения в массиве. 6 - исключение ошибок (ДЕЛ/0) Далее получаем массив для поиска:
Массив!D$1:D$500 - это массив основных значений, в которых ищем. / - для проверки на условие. Если не выполняется, то получаем 0, на который делим и полуем ошибку ДЕЛ/0, которая исключается (см. 6). Если условие выполняется, то ИСТИНА = 1 и деление на 1 не изменяет нужное значение. Новые условия добавляются через /.
В конце ;1 - это первое по счету наименьшее.
ИНДЕКС - выборка из массива по номеру строки. АГРЕГАТ(15;6;СТРОКА - это чтобы получить номера строк в массиве, которые мы также проверяем условиями через /.
написал: Если нужно, поясню смысл:АГРЕГАТ(15; - поиск наименьшего значения в массиве.6 - исключение ошибок (ДЕЛ/0)Далее получаем массив для поиска:Массив!D$1:D$500 - это массив основных значений, в которых ищем./ - для проверки на условие. Если не выполняется, то получаем 0, на который делим и полуем ошибку ДЕЛ/0, которая исключается (см. 6).Если условие выполняется, то ИСТИНА = 1 и деление на 1 не изменяет нужное значение.Новые условия добавляются через /. В конце ;1 - это первое по счету наименьшее.ИНДЕКС - выборка из массива по номеру строки.АГРЕГАТ(15;6;СТРОКА - это чтобы получить номера строк в массиве, которые мы также проверяем условиями через /.
Артур спасибо, большое! Все формулы работают! За объяснения - ОТДЕЛЬНЫЙ РЕСПЕКТ! ИСКРЕННЕ БЛАГОДАРЮ!