Excel VBA多列求和需求:按CTP.GRP合并数据并填充指定列
解决Excel VBA多列分组求和问题
嘿,我来帮你搞定这个分组求和的需求!你需要按H列(CTP.GRP)的唯一值作为行,同时对M列(Nominal)和P列(Mtm in IDR)分别求和,然后把结果放到另一个工作表的对应列里对吧?下面是修改后的完整VBA代码,能实现你要的双列求和功能:
Sub ins_data() Dim srcWs As Worksheet Dim destWs As Worksheet Dim dataArr As Variant Dim sumDict As Object Dim i As Long Dim key As Variant Dim lastRow As Long ' 定义源工作表和目标工作表,根据你的实际表名修改! Set srcWs = ThisWorkbook.Worksheets("数据源") Set destWs = ThisWorkbook.Worksheets("汇总表") Set sumDict = CreateObject("Scripting.Dictionary") ' 获取源数据的最后一行,读取数据到数组(提升运行效率) lastRow = srcWs.Cells(srcWs.Rows.Count, "H").End(xlUp).Row dataArr = srcWs.Range("H2:P" & lastRow).Value ' 从第2行开始,跳过表头 ' 遍历数据,按CTP.GRP分组累加两个列的值 For i = LBound(dataArr, 1) To UBound(dataArr, 1) key = dataArr(i, 1) ' H列是数组的第1列 If Not sumDict.Exists(key) Then ' 第一次遇到这个分组,初始化两个求和值:Nominal(M列)、Mtm in IDR(P列) sumDict(key) = Array(0, 0) End If ' 累加Nominal(M列对应数组的第6列:H是1,I2,J3,K4,L5,M6) sumDict(key)(0) = sumDict(key)(0) + dataArr(i, 6) ' 累加Mtm in IDR(P列对应数组的第9列:H1到P是9列) sumDict(key)(1) = sumDict(key)(1) + dataArr(i, 9) Next i ' 清空目标工作表旧数据(如果需要的话,可注释掉) destWs.Range("A2:C" & destWs.Rows.Count).ClearContents ' 把字典中的结果写入目标工作表 i = 2 ' 从第2行开始写,假设第1行是表头 For Each key In sumDict.Keys destWs.Cells(i, 1).Value = key ' 第一列写CTP.GRP destWs.Cells(i, 2).Value = sumDict(key)(0) ' 第二列写utilization(Nominal求和) destWs.Cells(i, 3).Value = sumDict(key)(1) ' 第三列写market value(Mtm in IDR求和) i = i + 1 Next key ' 释放对象 Set sumDict = Nothing Set srcWs = Nothing Set destWs = Nothing MsgBox "数据汇总完成!", vbInformation End Sub
关键说明:
- 字典的使用:这里用
Scripting.Dictionary来存储每个CTP.GRP对应的两个求和值,每个键对应一个包含两个元素的数组,第一个元素存Nominal的总和,第二个存Mtm in IDR的总和。 - 数组读取数据:把源数据一次性读到数组里,比逐行读取单元格快很多,适合大数据量的情况。
- 列对应关系:要注意数组里的列索引:H列是数组第1列,M列是第6列(H到M中间隔了I-J-K-L-M,共6列),P列是第9列(H到P共9列),如果你的列位置有变化,要对应调整这个索引。
- 工作表名修改:记得把
"数据源"和"汇总表"改成你实际的工作表名称,目标工作表的列位置(A、B、C列)也可以根据你的需求调整。
如果你的目标工作表表头已经固定,比如CTP.GRP在A列,utilization在B列,market value在C列,这段代码直接就能用啦!
内容的提问来源于stack exchange,提问作者MSY
相关产品推荐
相关产品推荐

