在Excel中创建On Change事件或Macro实现库存报表部门总额自动更新
实现步骤
你需要给生成的Excel文件内置明细工作表的Change事件宏,操作和代码如下:
1. 编写VBA事件代码
这段代码需要放在**第2页(商品明细工作表)**的代码模块中:
Private Sub Worksheet_Change(ByVal Target As Range) Dim wsSummary As Worksheet Dim deptName As String Dim deptRange As Range Dim affectRow As Range ' 绑定第1页(部门汇总工作表),可根据实际表名修改 Set wsSummary = ThisWorkbook.Worksheets(1) ' 仅响应B列(数量)、F列(单价)的修改 If Not Intersect(Target, Me.Range("B:B,F:F")) Is Nothing Then ' 关闭事件防止修改单元格时递归触发 Application.EnableEvents = False On Error GoTo ErrHandler ' 遍历所有被修改的行,适配批量修改场景 For Each affectRow In Intersect(Target, Me.Range("B:B,F:F")).Rows ' 取当前行的部门名称(C列) deptName = Me.Cells(affectRow.Row, "C").Value If deptName = "" Then GoTo NextRow ' 在汇总页A列匹配对应部门的行 Set deptRange = wsSummary.Range("A:A").Find(What:=deptName, LookIn:=xlValues, LookAt:=xlWhole) If Not deptRange Is Nothing Then ' 重新汇总该部门所有明细的小计(G列),赋值到汇总页对应B列 deptRange.Offset(0, 1).Value = Application.WorksheetFunction.SumIf(Me.Range("C:C"), deptName, Me.Range("G:G")) End If NextRow: Next affectRow ErrHandler: ' 恢复事件响应 Application.EnableEvents = True End If End Sub
2. C#生成Excel时嵌入宏的注意事项
- 生成的Excel文件必须保存为
.xlsm格式(启用宏的工作簿),普通xlsx格式无法存储宏代码 - 如果你使用Microsoft.Office.Interop.Excel库生成文件:通过
Workbook.VBProject.VBComponents接口获取明细工作表的代码模块,直接写入上述VBA代码即可 - 如果你使用EPPlus库生成文件:需要先开启VBA项目支持
package.Workbook.CreateVBAProject = true,再通过明细工作表对象.CodeModule.Code属性写入上述代码
替代方案(无需宏)
如果客户不愿意开启宏权限,可以直接在汇总页的B列预设SUMIF公式,同样能实现自动更新效果,例如汇总页B2单元格公式为:=SUMIF(Sheet2!C:C,A2,Sheet2!G:G)
生成Excel时直接把公式写入对应单元格即可,不需要额外开发宏逻辑。
内容的提问来源于stack exchange,提问作者Alfred Mey
相关产品推荐
相关产品推荐

