You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动