VBA动态范围求和合并:按序号汇总数量并合并单元格问题
修正VBA代码实现按序号汇总并合并单元格
原代码的核心问题是每次循环未重置sum_criteria,且仅输出所有序号的累计总和,未针对单个序号处理结果写入与单元格合并。以下是修正后的代码,可实现按A列序号汇总B列数量、写入对应C列并合并单元格的需求:
Sub SumAndMergeBySerialNo() Dim ws As Worksheet Dim lastRow As Long, i As Long, j As Long Dim currentSerial As Variant Dim totalQty As Double Dim startRow As Long ' 指定操作的工作表,可根据实际修改为工作表名称(如Sheets("Sheet1")) Set ws = ThisWorkbook.ActiveSheet ' 获取A列最后一行的行号 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 假设第1行为表头,从第2行开始处理数据 startRow = 2 Do While startRow <= lastRow ' 记录当前处理的序号 currentSerial = ws.Cells(startRow, "A").Value totalQty = 0 ' 遍历当前序号对应的所有行,计算B列总和 For i = startRow To lastRow If ws.Cells(i, "A").Value = currentSerial Then totalQty = totalQty + ws.Cells(i, "B").Value Else ' 遇到不同序号,终止当前序号的求和循环 Exit For End If Next i ' 将总和写入当前序号对应的C列起始单元格 ws.Cells(startRow, "C").Value = totalQty ' 合并当前序号对应的所有C列单元格 ws.Range(ws.Cells(startRow, "C"), ws.Cells(i - 1, "C")).Merge ' 可选:若需要合并A列和B列的对应单元格,取消下方两行注释 ' ws.Range(ws.Cells(startRow, "A"), ws.Cells(i - 1, "A")).Merge ' ws.Range(ws.Cells(startRow, "B"), ws.Cells(i - 1, "B")).Merge ' 优化:设置合并后单元格的水平居中对齐 ws.Range(ws.Cells(startRow, "C"), ws.Cells(i - 1, "C")).HorizontalAlignment = xlCenter ' 跳转到下一个序号的起始行 startRow = i Loop End Sub
关键改进说明
- 引入工作表对象
ws,避免依赖活动工作表,提升代码稳定性与通用性 - 采用连续分组遍历逻辑,精准定位同一序号的所有行(需确保A列相同序号的行连续排列,若乱序建议先对A列排序)
- 每次处理新序号时重置
totalQty,保证每个序号的总和独立计算,不会累计之前的结果 - 直接将汇总结果写入对应C列,并自动合并该序号对应的所有C列单元格
- 提供可选的A、B列合并逻辑,满足不同格式需求
- 增加单元格居中对齐的优化,提升表格可读性
使用注意事项
- 若表头不是第1行,修改
startRow的值为实际数据起始行 - 运行前建议备份数据,避免意外修改
- 若A列序号不连续,需先对A列进行排序,确保相同序号的行连在一起
内容的提问来源于stack exchange,提问作者Dhavnil Modi
相关产品推荐
相关产品推荐

