如何用Excel VBA按相同代码汇总金额?附报错代码求助
解决Excel宏汇总指定Code对应金额的问题
我看了你写的宏代码,发现几个导致它无法正常运行的问题,接下来我会帮你一一修正,同时给你解释每一步的调整逻辑:
原代码的核心问题
- 语法错误:
Application.ws2Function是完全错误的写法,Excel里调用工作表函数应该用Application.WorksheetFunction,而且Sum函数直接返回数值,不需要加.Value。 - 逻辑偏差:你现在的代码每次找到符合条件的行,就会把AK1:AK2000的总和赋值给G22,这不是筛选后的数据汇总,而且循环会重复覆盖G22的值,最后得到的是整个区域的总和,不是符合条件的行的总和。
- 变量问题:
i没有提前声明,建议开启Option Explicit(在模块顶部添加),强制所有变量必须声明,能避免很多低级错误。 - 循环范围错误:
For i = 0 To table1Rows会让行号从1跑到table1Rows+1,可能超出你的实际数据范围,应该从1开始遍历数据行(如果第1行是表头,就从第2行开始)。
修正后的代码(针对筛选指定Code并汇总)
假设你要筛选**A列(Code列)等于"AACMPMHRO"**的行,汇总对应的AK列金额到Sheet2的G22单元格,修正后的代码如下:
Option Explicit ' 强制变量声明,避免错误 Sub BTester() Dim ws1 As Worksheet Dim ws2 As Worksheet Dim table1Rows As Long ' 用Long代替Integer,避免行数超过32767时溢出 Dim totalAmount As Double Dim i As Long ' 定义工作表对象 Set ws1 = Worksheets("Feuil1") Set ws2 = Worksheets("Feuil2") ' 获取Feuil1的有效数据行数 table1Rows = ws1.UsedRange.Rows.Count ' 初始化总金额为0 totalAmount = 0 ' 遍历所有数据行(从第2行开始,假设第1行是表头) For i = 2 To table1Rows ' 判断A列的Code是否等于目标值 If ws1.Cells(i, 1).Value = "AACMPMHRO" Then ' 累加AK列(第37列)的金额 totalAmount = totalAmount + ws1.Cells(i, 37).Value End If Next i ' 将汇总结果写入Feuil2的G22 ws2.Range("G22").Value = totalAmount End Sub
如果你的目标Code不是在A列,而是原代码里的第11列(K列),只需要把ws1.Cells(i, 1)改成ws1.Cells(i, 11)即可。
进阶版:用SumIf函数简化代码
其实不需要循环遍历,Excel的SumIf函数可以直接实现“符合条件的单元格求和”,代码会更简洁高效,尤其是数据量很大的时候:
Option Explicit Sub BTester_SumIf() Dim ws1 As Worksheet Dim ws2 As Worksheet Dim sumRange As Range Dim criteriaRange As Range Set ws1 = Worksheets("Feuil1") Set ws2 = Worksheets("Feuil2") ' 定义条件范围(A列Code)和求和范围(AK列金额) Set criteriaRange = ws1.Range("A2:A" & ws1.UsedRange.Rows.Count) Set sumRange = ws1.Range("AK2:AK" & ws1.UsedRange.Rows.Count) ' 用SumIf直接计算符合条件的总和,写入G22 ws2.Range("G22").Value = Application.WorksheetFunction.SumIf(criteriaRange, "AACMPMHRO", sumRange) End Sub
内容的提问来源于stack exchange,提问作者yassine zagliz




