Excel VBA去重并求和对应值问题:指定单元格范围代码失效
解决Excel VBA去重求和失效的问题
嘿,我来帮你搞定这个VBA的小麻烦!从你的描述来看,问题大概率出在原代码的列关联逻辑上——它应该默认把A列作为唯一键来匹配求和,所以当你直接用C列作为关键列时,代码找不到对应的D列数值关联,导致求和结果全为0。
下面是针对你的场景专门调整的代码,直接用C列(Corrected Order)作为去重键,对D列(Qty)求和,结果输出到F1:G40区域:
Sub RemoveDuplicatesAndSum() Dim ws As Worksheet Dim lastRow As Long Dim dict As Object Dim key As Variant Dim outputRow As Long ' 指定工作表,可替换为你的目标表名,比如Sheets("SalesData") Set ws = ActiveSheet ' 创建字典对象,用来存储唯一值和对应求和结果 Set dict = CreateObject("Scripting.Dictionary") ' 获取C列最后一行的行号(避免遍历空行) lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row ' 遍历数据源,填充字典:C列值为键,D列值累加求和 For i = 2 To lastRow ' 假设第一行是表头,若数据从第一行开始则改为i=1 key = ws.Cells(i, "C").Value ' 处理空值(可选,避免空单元格被当作唯一键) If key <> "" Then If Not dict.Exists(key) Then dict(key) = ws.Cells(i, "D").Value Else dict(key) = dict(key) + ws.Cells(i, "D").Value End If End If Next i ' 清空输出区域,避免旧数据干扰 ws.Range("F1:G40").ClearContents ' 写入表头(如果不需要可删除这两行) ws.Range("F1").Value = "Corrected Order" ws.Range("G1").Value = "Total Qty" outputRow = 2 ' 从第二行开始写入结果 ' 将字典中的数据输出到F、G列,不超过G40的范围 For Each key In dict.Keys If outputRow > 40 Then Exit For ' 超出指定范围就停止 ws.Cells(outputRow, "F").Value = key ws.Cells(outputRow, "G").Value = dict(key) outputRow = outputRow + 1 Next key ' 释放对象,避免内存占用 Set dict = Nothing Set ws = Nothing MsgBox "去重求和完成!", vbInformation End Sub
关键调整说明:
- 用字典替代默认列关联:字典可以直接把C列的每个值作为唯一键,绑定对应D列的求和结果,彻底摆脱对A列的依赖。
- 精准指定列范围:所有数据读取都明确指向C列和D列,不会因为列位置变化出错。
- 边界控制:加入了
outputRow > 40的判断,确保结果不会超出你指定的F1:G40区域。 - 空值处理:额外添加了空值判断,避免C列的空单元格被当作有效键处理。
使用小提示:
- 如果你的数据没有表头(第一行就是数据),把
For i = 2 To lastRow改成For i = 1 To lastRow。 - 如果目标工作表不是当前活动表,把
Set ws = ActiveSheet替换成Set ws = Sheets("你的工作表名称")。
内容的提问来源于stack exchange,提问作者Donnie Neylon
相关产品推荐
相关产品推荐

