You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:18:02