Excel按ID动态累加统计需求:将源工作表数据汇总至目标工作表对应固定行
我来帮你解决这个Excel累计统计的问题,分两种方法给你,一种不用写代码,一种可以实现自动更新,你按需选择:
方法一:用Excel内置公式实现(无需VBA)
这种方法简单易操作,适合不想接触代码的场景:
- 假设你的源工作表叫
Source,目标工作表叫Target - 目标表第1行是表头,第2行对应ID=1,第121行对应ID=120(刚好覆盖1-120所有ID)
- 在目标表的
Bonus列(比如B2单元格)输入公式:
公式解释:=SUMIF(Source!$D:$D, Target!$A2, Source!$B:$B)Source!$D:$D是源表的ID列,Target!$A2是当前目标行的ID值,Source!$B:$B是源表需要累加的Bonus列 - 把这个公式横向拖动到其他需要累加的列(比如"No Bonus"、"No Multiplier"等列),再纵向拖动到120行
- 源表新增数据后,只要Excel开启了自动计算(默认是开启状态),目标表的统计值会自动更新
方法二:用VBA实现自动累加(适合源表频繁新增数据)
如果源表会持续大量新增数据,或者想要完全自动触发更新,VBA会更高效。步骤如下:
- 打开VBA编辑器:按下
Alt + F11组合键 - 在左侧「工程资源管理器」里找到你的工作簿,右键点击「插入」→「模块」
- 在弹出的代码窗口粘贴以下代码:
Sub UpdateTargetTable() Dim wsSource As Worksheet Dim wsTarget As Worksheet Dim lastRowSource As Long Dim i As Long Dim idValue As Integer Dim targetRow As Long ' 替换为你的实际工作表名称 Set wsSource = ThisWorkbook.Worksheets("Source") Set wsTarget = ThisWorkbook.Worksheets("Target") ' 清空目标表的数值列(保留ID列),按需修改列范围 wsTarget.Range("B2:E121").ClearContents ' 获取源表最后一行数据的行号 lastRowSource = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row ' 遍历源表所有数据行(从第2行开始,假设第1行是表头) For i = 2 To lastRowSource idValue = wsSource.Cells(i, "D").Value ' 替换为源表ID列的列标 ' 确保ID在1-120范围内 If idValue >= 1 And idValue <= 120 Then targetRow = idValue + 1 ' 目标行=ID值+1(因为目标表第1行是表头) ' 累加对应列的数据,按需修改列标 wsTarget.Cells(targetRow, "B").Value = wsTarget.Cells(targetRow, "B").Value + wsSource.Cells(i, "B").Value wsTarget.Cells(targetRow, "C").Value = wsTarget.Cells(targetRow, "C").Value + wsSource.Cells(i, "C").Value wsTarget.Cells(targetRow, "D").Value = wsTarget.Cells(targetRow, "D").Value + wsSource.Cells(i, "D").Value wsTarget.Cells(targetRow, "E").Value = wsTarget.Cells(targetRow, "E").Value + wsSource.Cells(i, "E").Value End If Next i MsgBox "目标表已完成更新!", vbInformation End Sub - 修改代码中的关键参数:
- 把
"Source"和"Target"改成你实际的工作表名称 - 把
"D"改成源表中ID列的列标(比如ID在C列就改成"C") - 把
"B:E"改成你需要累加的数值列范围
- 把
- 运行宏:回到Excel界面,按下
Alt + F8,选择UpdateTargetTable点击「运行」即可更新目标表
自动触发设置(可选)
如果想要源表新增数据时自动更新目标表,还可以添加以下步骤:
- 在「工程资源管理器」里找到源工作表(比如
Source),双击打开代码窗口 - 粘贴以下代码:
Private Sub Worksheet_Change(ByVal Target As Range) Dim wsSource As Worksheet Set wsSource = ThisWorkbook.Worksheets("Source") ' 当源表的数值列或ID列有变化时自动触发更新,按需修改列范围 If Not Intersect(Target, wsSource.Range("B:D")) Is Nothing Then UpdateTargetTable End If End Sub
之后只要源表的指定列有数据新增或修改,目标表会自动完成累加更新。
⚠️ 注意:第一次用VBA的话,记得把工作簿保存为.xlsm格式(启用宏的工作簿),否则宏会丢失。
内容的提问来源于stack exchange,提问作者Andy Jordan
相关产品推荐
相关产品推荐

