vlookup 和 sumif(每个项目的总利润)

vlookup and sumif (sum profit per item)

我有一个包含 100k 行的数据集,我想总结每个独特项目的利润。 table 看起来像这样:

是否可以选择结合 vlookup 和 sumif 来提取每件商品的所有利润?

使用 Dictinary 将轻松解决您的问题。请复制标准模块中的下一个代码并 运行 它。它将 return 在 shDest 中工作 sheet。在示例代码中 它 return 在下一个 sheet 中,在活动代码 之后。但是 Set shDest = sh.Next 你可以 Set 任何 sheet:

Sub TotalProfit()
 Dim sh As Worksheet, shDest As Worksheet, lastRow As Long, arr, i As Long, dict As New Scripting.Dictionary
 
 Set sh = ActiveSheet 'use here the sheet you need, even not active
 Set shDest = sh.Next
 lastRow = sh.Range("C" & sh.rows.count).End(xlUp).Row
 arr = sh.Range("C2:N" & lastRow).Value2
 For i = 1 To UBound(arr)
    dict(arr(i, 1)) = dict(arr(i, 1)) + arr(i, 12)
 Next i
 shDest.Range("A1:B1").value = Array("ItemType", "Total Profit")
 With shDest.Range("A2")
    .Resize(dict.count, 1).value = Application.Transpose(dict.Keys)
    .Offset(0, 1).Resize(dict.count, 1).value = Application.Transpose(dict.Items)
 End With
End Sub

Application.Transpose() 有一些限制,但我认为您的范围不会超过它们。如果是这样,我可以轻松调整代码以基于 Dictionary keys/items...

构建二维数组

从函数 UNIQUE 开始,它列出没有重复项的项目。然后你只需要在新列表上SUMIF

列表的公式为:=UNIQUE(Table13[Item Type])

  • 由于您使用的是 tables,您可以通过名称引用该列:“项目类型”——它在我的文件的表 13 中。我的意思是,“Table13[Item Type]”是您的范围。
  • 公式“溢出”单元格,只需将其写在一个单元格中即可看到整个列表。

现在,您只需对每一项求和即可。我唯一的项目列表在“G”列中。 因此我的第一项公式是:=SUMIF(Table13[Item Type],G5,Table13[Total Profit])

  • 第一个参数是原始 table 上的项目列表。
  • 第二个是与范围比较的值(与第一个参数比较)。
  • 第三个参数是值所在的位置。

向下拖动公式,您将得到新的 table!


最终结果如下

我假设您使用的是 Excel 365。如果您使用的是较旧的 Excel 版本,则不能使用“唯一”,所以我们应该更深入一点复杂的解决方案。