通过函数或VBA统计油罐各类型油品累计入库总量
嘿,我来给你两个靠谱的方案解决这个需求——不管你想用Excel原生函数快速搞定,还是用VBA自动化处理,都能完美匹配你的要求:
方法一:用Excel原生函数快速计算
其实你的需求本质上就是按油品类型求和所有入库记录(因为“累加最后一次入库及之前的所有记录”,就是该类型的全部入库量)。用SUMIF函数就能直接实现,操作超简单:
假设你的数据在A列(Volume)和B列(Oil type),表头在第1行,那么:
- 计算Type 1的总入库量:
=SUMIF(B:B, 1, A:A) - 计算Type 2的总入库量:
=SUMIF(B:B, 2, A:A) - 计算Type 3的总入库量:
=SUMIF(B:B, 3, A:A)
这个函数的逻辑很清晰:第一个参数指定条件判断的列(油品类型列),第二个参数是要匹配的类型值,第三个参数是需要求和的数值列(入库量列)。它会自动遍历所有行,把符合类型条件的入库量全部累加起来,结果完全符合你的预期(Type1=171,Type2=159,Type3=155)。
方法二:用VBA脚本自动化批量计算
如果你的数据量很大,或者需要定期重复计算,写个VBA宏会更高效。下面是现成的代码,你可以直接用:
Sub CalculateTotalOilVolume() Dim ws As Worksheet Dim lastRow As Long Dim oilType As Variant Dim totalVolume As Double Dim i As Long ' 替换成你实际要处理的工作表名称,比如"数据Sheet" Set ws = ThisWorkbook.Worksheets("Sheet1") ' 找到数据的最后一行,避免空行干扰 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 用字典存储每种油品的累计入库量,自动去重分类 Dim oilDict As Object Set oilDict = CreateObject("Scripting.Dictionary") ' 遍历所有数据行(跳过第1行表头) For i = 2 To lastRow oilType = ws.Cells(i, "B").Value totalVolume = ws.Cells(i, "A").Value ' 如果该油品类型已存在,就累加入库量;否则新增条目 If oilDict.Exists(oilType) Then oilDict(oilType) = oilDict(oilType) + totalVolume Else oilDict(oilType) = totalVolume End If Next i ' 输出结果:这里先打印到VBA的立即窗口,你也可以改成写入工作表 For Each oilType In oilDict.Keys Debug.Print "Type " & oilType & " total volume : " & oilDict(oilType) ' 如果要写入到工作表的D列,比如D1开始: ' ws.Cells(oilType, "D").Value = "Type " & oilType & " total volume : " & oilDict(oilType) Next oilType ' 释放内存 Set oilDict = Nothing Set ws = Nothing End Sub
代码说明:
- 首先指定要处理的工作表,找到数据的最后一行,避免处理空行;
- 用
Scripting.Dictionary来自动分类存储每种油品的累计量,不用手动判断类型; - 遍历所有数据行,把同类型的入库量累加起来;
- 最后输出结果到立即窗口(按Ctrl+G在VBA编辑器里打开),或者修改代码把结果直接写到工作表的指定位置。
运行这个宏之后,就能得到你想要的所有油品类型的总入库量啦。
内容的提问来源于stack exchange,提问作者Maxim Batyukov
相关产品推荐
相关产品推荐

