Выделите превышение лимита в VBA - PullRequest
0 голосов
/ 29 апреля 2020
line    customer product OrderQty TotalQty
1        A        11111    5        10
2        B        11111    5        10
3        c        11111    5        10
4        A        22222    5        20
5        B        22222    5        20
6        C        22222    5        20

У меня есть таблица, как показано выше.

Я хочу выделить строки, когда OrderQty больше, чем TotalQty для продукта.

OrderQty представляет количество единиц, запрошенных в этом заказе, TotalQty представляет общее количество единиц, доступных для выполнения всех заказов. ,

В этом примере я хочу выделить строки 1,2,3, так как продукт 11111 OrderQty 5 + 5 + 5 = 15 больше, чем TotalQty 10.

Есть ли способ автоматизировать это в VBA? Я подозреваю, что использую Sumifs, но не могу обернуть голову ..

Заранее спасибо!

Ответы [ 4 ]

1 голос
/ 29 апреля 2020

Вам не нужен VBA для этого. Предполагая, что ваша таблица начинается с строки 1 со строки в столбце A и TotalQty в столбце E; поместите уникальный список Product в столбец F и в ячейку G2 поместите формулу:

=IF(SUMIF(C:C,F2,D:D)>VLOOKUP(F2,C:E,3,FALSE), "Over", "Equal or under")

SUMIF суммы OrderQty для каждого продукта, VLOOKUP возвращает TotalQty для первого экземпляра каждого найденного продукта в таблице. Затем вы можете использовать условное форматирование, чтобы выделить строки, если это необходимо.

Если вы сделали go маршрут VBA, я бы, вероятно, поместил таблицу в массив, создал бы словарь Product со значением для OrderQty, и либо l oop для значений массива и суммы, либо l oop для ключей словаря и вызов функции функции таблицы sumif.

0 голосов
/ 29 апреля 2020

Может быть, что-то вроде этого?

Sub test()
Range("A:E").Interior.Pattern = xlNone
Range("C1:C7").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("AA1"), Unique:=True
Set Rng = Range("AA2", Range("AA100000").End(xlUp))
For Each Prod In Rng
Set c = Range("C:C").Find(Prod.Value, lookat:=xlWhole)
Tot = c.Offset(0, 2).Value
Ord = Application.SumIf(Range("C:C"), Prod.Value, Range("D:D"))
If Ord > Tot Then
For Each cell In Range("C2", Range("C2").End(xlDown))
If cell.Value = Prod.Value Then
Range(cell.Offset(0, -2), cell.Offset(0, 2)).Interior.Color = 65535
End If
Next cell
End If
Next Prod
Range("AA:AA").ClearContents
End Sub

Или, если вы выбираете без VBA, используйте условное форматирование.

  1. Выберите диапазон, который вы хотите выделить
  2. Нажмите Условное форматирование ---> Новое правило
  3. Выберите «Использовать формулу, чтобы определить, какие ячейки форматировать» *
  4. Введите =SUMIF($C:$C,$C2,$D:$D)>VLOOKUP($C2,$C:$E,3,FALSE) в поле формулы
  5. Нажмите Формат нажмите кнопку, затем выполните необходимое форматирование
  6. Нажмите кнопку ОК, нажмите кнопку ОК.

enter image description here

0 голосов
/ 29 апреля 2020

Сначала упростите свою таблицу, разделите на две таблицы:

  1. строка, клиент, продукт, OrderQty в одной таблице.
  2. продукт, TotalQty, другая таблица.

Предполагая {product, TotalQty} в «Листе 2» и другую таблицу в «Листе 1», затем добавьте столбец во второй таблице (C столбец на листе 2) «OrderQty> TotalQty» и вставьте формула в ячейке под ней, следующим образом:

=IF(SUMIF(Sheet1!$C:$C,$A2,Sheet1!$D:$D)>$B2,"Yes","No")

Перетащите или скопируйте и вставьте формулу в оставшиеся строки продукта.

Снимки экрана: Table 1

Table 2

0 голосов
/ 29 апреля 2020

[Добрый день, Кайл,

Это то, что вы пытаетесь сделать. Это только простое решение, но может помочь вам. Я использовал столбец помощи для ваших критериев, которые вы упомянули. Я использовал талифы. Вы можете изменить его в соответствии со своим стилем и потребностями. Я использовал условное форматирование для выделения ячеек.] 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...