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

Excel按Name、Age列分组对NetPay、Gross Value求和的实现方法

Excel多列分组求和实现方案

方案1:数据透视表实现(无需编码)

按以下步骤操作即可正确得到汇总结果:

  • 选中原始数据区域任意单元格,点击「插入」选项卡下的「数据透视表」,选择透视表存放位置,建议选择新工作表避免覆盖原数据
  • 在透视表字段面板中,将Name、Age两个字段依次拖入「行」区域
  • 将NetPay、Gross Value两个字段依次拖入「值」区域,如果值字段默认计算方式为计数,点击字段下拉菜单选择「值字段设置」,将计算类型修改为「求和」
  • 进入透视表「设计」选项卡,将报表布局设置为「以表格形式显示」,取消分类汇总、行总计/列总计,即可得到和示例完全一致的汇总结果

方案2:VBA代码实现(适配现有框架)

你原有代码存在一处笔误:wrkbokPRval对象未定义,应为之前声明的wrkbokval。以下补全后的代码采用字典+数组的方式实现分组求和,运行效率高,适配大数据量场景:

Sub Output_Final_Validation(strval As String)
    
    Dim wrkbokval As Workbook
    Dim shtval As Worksheet
    Dim Lastrow As Long
    Dim i As Long
    Dim dict As Object
    Dim key As String
    Dim arrData As Variant
    Dim arrRes() As Variant
    Dim resIndex As Long
    Dim tempArr As Variant
    
    ' 初始化分组用字典
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' 打开目标工作簿(修正原有笔误)
    Set wrkbokval = Workbooks.Open(strval)
    Set shtval = wrkbokval.Sheets("Sheet4")
    
    ' 获取数据边界
    Lastrow = shtval.Cells(shtval.Rows.Count, 1).End(xlUp).Row
    ' 如需保留原代码中Z列复制到AP列的逻辑,可保留下方行
    ' shtval.Range("A2:AP" & Lastrow).Value = shtval.Range("A2:Z" & Lastrow).Value
    
    ' 读取原始数据到内存数组,提升运行速度
    arrData = shtval.Range("A2:D" & Lastrow).Value
    
    ' 遍历数据完成分组累加
    For i = 1 To UBound(arrData, 1)
        ' 用特殊字符拼接Name和Age作为唯一分组键,避免键值冲突
        key = arrData(i, 1) & "|" & arrData(i, 2)
        If Not dict.Exists(key) Then
            dict.Add key, Array(arrData(i, 1), arrData(i, 2), arrData(i, 3), arrData(i, 4))
        Else
            tempArr = dict(key)
            tempArr(2) = tempArr(2) + arrData(i, 3)
            tempArr(3) = tempArr(3) + arrData(i, 4)
            dict(key) = tempArr
        End If
    Next i
    
    ' 整理汇总结果到数组
    ReDim arrRes(1 To dict.Count, 1 To 4)
    resIndex = 1
    For Each key In dict.Keys
        arrRes(resIndex, 1) = dict(key)(0)
        arrRes(resIndex, 2) = dict(key)(1)
        arrRes(resIndex, 3) = dict(key)(2)
        arrRes(resIndex, 4) = dict(key)(3)
        resIndex = resIndex + 1
    Next key
    
    ' 写入结果(默认输出到原表F列起始位置,可按需修改输出位置)
    shtval.Range("F1:I1").Value = Array("Name", "Age", "NetPay", "Gross Value")
    shtval.Range("F2").Resize(dict.Count, 4).Value = arrRes
    
    ' 释放内存对象
    Set dict = Nothing
    ' 如需自动保存修改,可放开下方注释
    ' wrkbokval.Save
End Sub

代码说明:

  • 数组+字典的处理方式相比逐单元格遍历效率提升数十倍,可流畅处理十万行级数据
  • 若NetPay、Gross Value列不在C、D列,只需修改读取数组时对应的列索引即可
  • 输出位置可根据需求自定义,也可新建工作表单独存放汇总结果,避免覆盖原始数据

内容的提问来源于stack exchange,提问作者Manz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:12:29