Excel相同零件编号行求和:用VBA实现还是数据透视表更简便?
解决方案
完全可以用数据透视表实现该需求,比编写VBA脚本效率高得多,没有代码基础也能几分钟完成操作,具体步骤如下:
方案一:数据透视表(优先推荐)
- 第一步:选中原始数据表的全部数据区域,注意要包含表头行
- 第二步:点击顶部菜单栏「插入」选项卡,选择「数据透视表」,在弹出的配置窗口中,将存放位置指定为
Totals表的起始单元格即可 - 第三步:在右侧数据透视表字段面板按规则配置字段:
- 将除数量外的所有需要保留的字段(制造商、零件编号、产品、分类、单价、联系人、日期、PO号等)全部拖入「行」区域,务必将零件编号放在行区域的最上层,保证以零件编号为第一分组维度
- 将「数量」字段拖入「值」区域,默认计算规则为求和,若显示为计数可点击值字段设置,修改计算类型为「求和」
- 第四步:调整为常规表格样式:
- 选中数据透视表,顶部出现「设计」选项卡,点击「报表布局」,依次选择「以表格形式显示」、「重复所有项目标签」
- 点击「分类汇总」选择「不显示分类汇总」,点击「总计」选择「对行和列禁用」
最终生成的结果完全符合要求:相同零件编号的数量会自动求和,其余关联字段保留首行内容。后续原始数据更新后,只需要右键点击数据透视表选择「刷新」,汇总结果就会自动同步,维护成本远低于VBA脚本。
方案二:VBA脚本(如果需要自动化批量处理可选用)
如果需要固定流程批量执行汇总,可以直接使用下面的代码,适配你给出的样例表结构:
Sub 零件数量汇总() Dim dict As Object, sourceArr, i As Long, key Set dict = CreateObject("Scripting.Dictionary") ' 读取原始表数据,修改"原始表"为你自己的源数据表名称 sourceArr = Sheets("原始表").UsedRange.Value ' 遍历数据,按零件编号汇总 For i = 2 To UBound(sourceArr) ' 跳过表头行,从第2行开始 key = sourceArr(i, 2) ' 零件编号在B列,对应第2列 If Not dict.exists(key) Then ' 首次出现的零件编号,保存整行数据 dict.Add key, Array(sourceArr(i, 1), sourceArr(i, 2), sourceArr(i, 3), _ sourceArr(i, 4), sourceArr(i, 5), sourceArr(i, 6), sourceArr(i, 7), _ sourceArr(i, 8), sourceArr(i, 9), sourceArr(i, 10)) Else ' 已存在的零件编号,仅累加数量 Dim tempArr tempArr = dict(key) tempArr(2) = tempArr(2) + sourceArr(i, 3) ' 数量在C列,对应索引2 dict(key) = tempArr End If Next ' 输出结果到Totals表 With Sheets("Totals") .Cells.Clear ' 清空原有内容 ' 输出表头 .Range("A1").Resize(1, 10) = Array("制造商", "零件编号", "数量", "产品", "分类", _ "单价", "联系人", "下单日期", "交货日期", "PO号") ' 输出汇总数据 .Range("A2").Resize(dict.Count, 10) = Application.Transpose(Application.Transpose(dict.Items)) End With End Sub
如果你的表结构有调整,对应修改代码里的列索引即可。
内容的提问来源于stack exchange,提问作者brilliantcheek_1
相关产品推荐
相关产品推荐

