Я провел последние несколько часов, пытаясь найти что-то похожее на проблему, которая у меня есть, и в настоящее время из моих ушей выходит дым!

У меня два листа, один с заказами, второй с продажами.

Мне нужна помощь, автоматически вычитая из заказов на основе продаж.

Я пытаюсь разработать сценарий, который будет проходить через каждую продажу, и если местоположение и товар будут одинаковыми, вычтите проданное количество из количества, заказанного для получения "нового срока".

Будут продажи без заказа, что не является проблемой, но было бы неплохо, если бы эти результаты могли перейти на другую вкладку. Ниже приводится краткое изложение того, что требуется в терминах n00b.

Sheet1 продается, Sheet2 порядок.

Если Sheet1 С2 & F2, такие же , как и любой строки в Sheet2 (A2, D2, которые коррелируют поля) вычесть Sheet1 G2, F2 от Sheet2

Я добавил пример, который вы можете посмотреть здесь. Вычтите, если выполнено несколько условий https://app.box.com/s/2m8nfjo8lieh5mfb9wgspy73f1bvzp0e.

На вкладке результатов все, что выделено желтым, изменилось бы. Предметы, не выделенные желтым цветом, не продавались. Зеленое и красное форматирование было для справки и не требуется, если трудно. (было бы идеально), столбец H иллюстрирует, если это даже возможно, когда количество заказа достигает 0, чтобы скрипт продолжал поиск листа для следующего заказа с теми же критериями и вычитал оставшееся количество. Все поможет, в настоящее время я делаю это вручную в выходные дни и, как правило, 150+ продаж в неделю, и это занимает очень много времени.

Проще говоря, я пытаюсь, чтобы скрипт проходил каждую строку продажи и вычитал количество из листа заказа, если завод и номер детали совпадают. Я отсортирую лист заказа, основываясь на том, когда они это сделают, поэтому он удалит из правильного порядка.

Спасибо за любую помощь!

1 ответ1

0

Я не думаю, что вам нужен VBA.

Посмотрите на SUMIFS()

Мне не разрешено просматривать ваши скриншоты, поскольку обратный прокси-сервер моей организации не разрешает доступ к app.box, но я предполагаю:

  • Столбец "C" листа Sheet1 содержит местоположения.
  • Столбец "F" листа Sheet1 содержит элементы.
  • Столбец "G" листа Sheet1 содержит проданное количество.
  • Столбец "A" на листе 2 содержит местоположения.
  • Столбец "D" на листе 2 содержит элементы.
  • Столбец "G" на листе 2 содержит заказанное количество.
  • Столбец "H" на листе 2 содержит количество, подлежащее оплате

В то время как на листе 2, общее количество, проданное для товара и местоположения, перечисленных в строке 2:

=IF(OR(A2="",D2=""),0,SUMIFS(Sheet1!G:G,Sheet1!C:C,A2,Sheet1:F:F,D2))

Так что формула используется для Sheet2!H2 просто вычел бы это из заказанного количества:

=G2-IF(OR(A2="",D2=""),0,SUMIFS(Sheet1!G:G,Sheet1!C:C,A2,Sheet1:F:F,D2))

За исключением того, что если заказ заполнен, а последующий заказ для того же местоположения и предмета, по крайней мере, частично заполнен, общая проданная сумма может быть больше, чем заказ в строке 2, а Заказ - продано будет меньше нуля! Но это легко защитить ...

=MAX(0,G2-IF(OR(A2="",D2=""),0,SUMIFS(Sheet1!G:G,Sheet1!C:C,A2,Sheet1:F:F,D2)))

Но это не учитывает никаких заказов выше текущей строки! У нас есть MIN(0, ThisOrderQuantity - LocationItemQtySold), когда у нас должно быть MIN(0, ThisOrderQuantity+PreviouslyOrderedQuantities - LocationItemQtySold). Сумма всех заказов выше текущей строки в Sheet2 равна

=OFFSET(G2,0,0,ROW()-2, 1)

... ну ... это сломается на второй ряд. Мы хотим что-то, что будет работать на всех строках, включая первый. Итак, давайте защитимся в ряду 2.

=IF(ROW()<3,0,OFFSET(G2,0,0,ROW()-2, 1))

но это все предыдущие заказы, когда нам нужны только предыдущие заказы для того же места и предмета. Нам нужны еще SUMIFS(). Для строки 10 листа 2 это будет

=IF(ROW()<3,0,SUMIFS(OFFSET(G2,0,0,ROW()-2, 1),OFFSET(A:A,0,0,ROW()-2,1),A10,OFFSET(D:D,0,0,ROW()-2,1),D10))

Хорошо, теперь мы можем их объединить. Для H2, перетаскиваемого до конца столбца, формула будет иметь вид:

=MAX(0,G2+IF(OR(A2="",D2=""),0,IF(ROW()<3,0,SUMIFS(OFFSET(G2,0,0,ROW()-2, 1),OFFSET(A:A,0,0,ROW()-2,1),A2,OFFSET(D:D,0,0,ROW()-2,1),D2))-SUMIFS(Sheet1!G:G,Sheet1!C:C,A2,Sheet1:F:F,D2)))

За исключением того, что если у вас есть три заказа для местоположения / элемента и заполнен только первый, то "третьим" количеством этого третьего будет этот заказ плюс количество второго заказа! Нам нужно убедиться, что если все предыдущие заказы еще не полностью заполнены, это не испортит наше "должное" количество. Таким образом, мы должны добавить функцию MAX, чтобы срок не превышал того, что было заказано.

=MIN(G2,MIN(0,G2+IF(OR(A2="",D2=""),0,IF(ROW()<3,0,SUMIFS(OFFSET(G2,0,0,ROW()-2, 1),OFFSET(A:A,0,0,ROW()-2,1),A2,OFFSET(D:D,0,0,ROW()-2,1),D2))-SUMIFS(Sheet1!G:G,Sheet1!C:C,A2,Sheet1:F:F,D2))))

Вставьте это в H2, перетащите эту формулу вниз к остальной части H, отладьте то, что я сделал (потому что, спойлер, я не сделал), и все готово! VBA не требуется.

(Предупреждение: вы упомянули «не выпуск» продаж без заказов. Пожалуйста, учтите, что в таком случае, если у вас позже будет заказ, этот заказ будет мгновенно заполнен!)

Обновление 3 февраля 2017: исправлена проблема с MIN и MAX; это должно было быть МАКС и МИН.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .