产品的唯一计数列表,跳过空白,跳过黑名单,跳过编号

时间:2019-07-06 11:32:10

标签: excel vba excel-formula

我在特定列中列出了产品列表。该列包含空格,但是所有名称都是唯一的。此列表在工作表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 :(得分:0)

我的第一个建议是将数据重新格式化为表格形式。从本质上讲,这意味着每一行将是一个销售,并且该销售的所有属性将是列标题。这将使分析数据变得更加容易。

如果您想保留当前的数据格式设置方法,请首先让我总结一下我对您的问题的理解-您要计算在第二张纸上的列表中出现的产品名称的出现次数。 D列(看起来是葡萄酒的种类)。为此,建议您阅读SUMPRODUCT。 例如,假设您要计算巴勃罗·聂鲁达出现的次数-

{
    _id: '...',
    name: 'Awesome lens',
    treatments: [
         {
             _id: '...',
             type: null,
             colors: []
    ]
}

'-'将True和False的数组函数转换为1和0,可以计数。 -希望有帮助。

答案 1 :(得分:0)

您可以使用sumif,索引/匹配和偏移量的组合来计算每种产品销售数量的总和。

enter image description here

找到列表中第一个产品的第一个匹配项:

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

列表中第一个产品的第一个匹配项的数量:

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

找到列表中最后一个产品的第一个匹配项:

=INDEX($D:$D,MATCH($H$3,$D:$D,0),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))

答案 2 :(得分:0)

我想出的最好办法是,在此类动作发布的最初阶段就处理销售/退款/ 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