Уникальный список продуктов, пропустить пропуски, пропустить черный список, пропустить номера - PullRequest
0 голосов
/ 06 июля 2019

У меня есть список продуктов в определенной колонке. Этот столбец содержит пробелы, однако все имена уникальны. Этот список находится на листе 2. Я отслеживаю продажи на листе 1, каждая продажа добавляется ниже предыдущей продажи. Каждая продажа представляет собой диапазон ячеек, например, A1: F6, содержащий такую ​​информацию, как: номер счета, количество, цена за продукт, общая стоимость и т. Д. Название продукта будет указано в столбце D. В столбце D дополнительно указаны цены и способы оплаты, такие как VISA, CASH. или даже заготовки.

enter image description here

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

Я пробовал формулу:

=LOOKUP(2, 1/((COUNTIF($K$53:K53, $D$1:$D$1000)=0)*($D$1:$D$1000<>""&"<>0")), $D$1:$D$1000)

Но не только это не будет выходить за пределы пустых пространств, но я не могу понять, как я могу добавить в него черный список слов или цифр. Кто-нибудь имел бы представление о том, какой тип макроса или формулы я мог бы использовать для этого, даже если бы я добавил еще одну таблицу, которая будет использоваться в качестве черного списка?

=LOOKUP(2, 1/((COUNTIF($K$53:K53, $D$1:$D$1000)=0)*($D$1:$D$1000<>""&"<>0"&<>$Z$10:$Z$20)), $D$1:$D$1000)

Я пробовал варианты такой формулы, но не могу заставить это работать ...

Спасибо за помощь.

Мне удалось обойти мой испорченный дизайн и т. Д. И я нашел лучшее решение для обработки продаж / возмещений с помощью макроса, пока он изначально задействован / размещен, однако я не могу заставить работать несколько IF, - нуб здесь пожалуйста, помилуй.

' This handles refund: bottle
If Range("K2").Value < "0" And IsNumeric(Range("K2")) = True And Range("K4").Value = "0" Then
rowNum = Range("I1").Value
copySheet.Range("K2").Copy
calcSheet.Cells(rowNum, "G").PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd

' This handles refund: glass
ElseIf Range("K3").Value < "0" And IsNumeric(Range("K3")) = True And Range("K4").Value = "0" Then
rowNum = Range("I1").Value
copySheet.Range("K3").Copy
calcSheet.Cells(rowNum, "H").PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd

' This handles refund: portion
ElseIf Range("K4").Value < "0" And IsNumeric(Range("K4")) = True And Range("K3").Value = "0" And Range("K2").Value = "0" Then
rowNum = Range("I1").Value
copySheet.Range("K4").Copy
calcSheet.Cells(rowNum, "G").PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd

' This handles sale: bottle
ElseIf Range("K2").Value > "0" And IsNumeric(Range("K2")) = True And Range("K4").Value = "0" Then
rowNum = Range("I1").Value
copySheet.Range("K2").Copy
calcSheet.Cells(rowNum, "C").PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd

' This handles sale: glass
ElseIf Range("K3").Value > "0" And IsNumeric(Range("K3")) = True And Range("K4").Value = "0" Then
rowNum = Range("I1").Value
copySheet.Range("K3").Copy
calcSheet.Cells(rowNum, "B").PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd

' This handles sale: portion
ElseIf Range("K4").Value > "0" And IsNumeric(Range("K4")) = True And Range("K3").Value = "0" And Range("K2").Value = "0" Then
rowNum = Range("I1").Value
copySheet.Range("K4").Copy
calcSheet.Cells(rowNum, "A").PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd

Else: MsgBox "You cannot add drinks with food. B: quantity as number only"
End If

Просьба о помощи. Этот массив, кажется, работает ... но он не останавливается - он все еще выполняет части кода: (

Ответы [ 3 ]

0 голосов
/ 06 июля 2019

Вы можете рассчитать сумму количества каждого проданного продукта, используя комбинацию sumif, index / match и offset.

enter image description here

Найдите первое совпадение для 1-го продукта в списке:

=INDEX($D:$D,MATCH($H$2,$D:$D,0),1)

Количество для 1-го матча 1-го продукта в списке:

=OFFSET(INDEX(D:D,MATCH($H$2,D:D,0),1),1,-1)

Найдите 1-е совпадение с последним продуктом в списке:

=INDEX($D:$D,MATCH($H$3,$D:$D,0),1)

Количество для 1-го матча последнего продукта в списке:

=OFFSET(INDEX($D:$D,MATCH($H$3,$D:$D,0),1),1,-1)

Сложите их вместе, чтобы построить свои диапазоны и добавьте критерий суммы:

=SUMIF($D:$D,$H2,OFFSET(INDEX($D:$D,MATCH($H$2,$D:$D,0),1),0,-1):OFFSET(INDEX($D:$D,MATCH($H$3,$D:$D,0),1),0,-1))
0 голосов
/ 08 июля 2019

Лучшее, что я придумал, - это отслеживание продаж / возвратов / cxl на самом начальном этапе публикации таких действий - таким образом, это дало мне возможность отслеживать даже больше, чем я изначально ожидал.Я поделюсь файлом примера, как только вернусь из отпуска, чтобы все заинтересованные могли лучше понять, что мне нужно.

Мое решение, как показано ниже - мне пришлось отдельно проверять IsNumeric, так как он проходил через текст...:

    If Not IsNumeric(Range("K2")) Or Not IsNumeric(Range("K3")) Or Not IsNumeric(Range("K4")) Then
MsgBox ("Bottle, Glass or Portion as number only!")
GoTo final
End If

If MsgBox("Confirm action.", vbYesNo + vbQuestion) = vbNo Then Exit Sub

' This handles refund: bottle
If Range("K2").Value < "0" And Range("K4").Value = "0" Then
rowNum = Range("I1").Value
copySheet.Range("K2").Copy
calcSheet.Cells(rowNum, "G").PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd
' This handles refund: glass
ElseIf Range("K3").Value < "0" And Range("K4").Value = "0" Then
rowNum = Range("I1").Value
copySheet.Range("K3").Copy
calcSheet.Cells(rowNum, "H").PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd
' This handles refund: portion
ElseIf Range("K4").Value < "0" And Range("K3").Value = "0" And Range("K2").Value = "0" Then
rowNum = Range("I1").Value
copySheet.Range("K4").Copy
calcSheet.Cells(rowNum, "G").PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd
' This handles sale: bottle
ElseIf Range("K2").Value > "0" And Range("K4").Value = "0" Then
rowNum = Range("I1").Value
copySheet.Range("K2").Copy
calcSheet.Cells(rowNum, "C").PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd
' This handles sale: glass
ElseIf Range("K3").Value > "0" And Range("K4").Value = "0" Then
rowNum = Range("I1").Value
copySheet.Range("K3").Copy
calcSheet.Cells(rowNum, "B").PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd
' This handles sale: portion
ElseIf Range("K4").Value > "0" And Range("K3").Value = "0" And Range("K2").Value = "0" Then
rowNum = Range("I1").Value
copySheet.Range("K4").Copy
calcSheet.Cells(rowNum, "A").PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd

Else: MsgBox "You cannot add drinks with food!"
GoTo final
End If
0 голосов
/ 06 июля 2019

Мое первое предложение - переформатировать ваши данные в табличную форму. По сути это означает, что каждая строка будет продажей, а все атрибуты этой продажи будут заголовками столбцов. Это значительно облегчит анализ ваших данных.

Если вы хотите сохранить свой текущий метод форматирования данных, сначала позвольте мне обобщить мое понимание вашего вопроса - вы хотите подсчитать, сколько раз продукт, название которого появляется в списке на втором листе, появляется в col D (выглядит как вино). Для этого я предлагаю вам прочитать SUMPRODUCT. Например, скажем, вы хотите посчитать, сколько раз появляется Пабло Неруда-

=SUMPRODUCT(--((D:D)="Pablo Neruda Cabernet Savignon"))

'-' превращает функцию массива Trues и False в 1 и 0, которые можно сосчитать. -Надеюсь, это поможет.

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