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 版本,则不能使用“唯一”,所以我们应该更深入一点复杂的解决方案。
我有一个包含 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 版本,则不能使用“唯一”,所以我们应该更深入一点复杂的解决方案。