You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Excel VBA代码中实现按月份计算多列平均值(无需按周数除法)

解答:如何在VBA中计算各年月数据的平均值(无需按周数除法)

你现在的代码里是直接把每条记录的值除以固定的9再累加,这显然不是平均值的逻辑。要实现按年月分组计算平均值,我们需要先分别统计每个月的数据总和和记录条数,最后用总和除以条数得到平均值,完全不用依赖固定的周数。

关键修改点和插入位置:

  1. 首先需要定义两个数组,用来存储每个月的总和和记录数(在变量声明部分添加)
  2. 在遍历每条记录的循环里,只做累加总和和计数的操作(替换你原来的直接累加除以9的代码)
  3. 等所有记录遍历完成后,再循环计算每个月的平均值并填入目标单元格(在关闭记录集之后添加这段逻辑)

修改后的完整代码

Private Sub CALCULATE_BTN_Click()
    Dim DBS As Database
    Dim RST As Recordset
    Dim SQL_TXT As String
    Dim monthlySum(1 To 12) As Double ' 存储12个月的数值总和
    Dim monthlyCount(1 To 12) As Integer ' 存储12个月的有效记录数
    Dim i As Integer
    
    Range("AA9:BV10").Select
    Selection.Clear
    
    ' 初始化数组为0,避免残留旧数据
    For i = 1 To 12
        monthlySum(i) = 0
        monthlyCount(i) = 0
    Next i
    
    If OPEN_DBS(DBS, FUEL_DB) Then
        SQL_TXT = "SELECT * FROM FUEL_DATA"
        If OPEN_RST(DBS, RST, SQL_TXT) Then
            While Not RST.EOF
                For i = 1 To 12
                    ' 匹配当前记录的年月与表头单元格的年月
                    If Month(RST![FUELDATA_DATE]) = Month(Cells(8, 26 + i).Value) And _
                       Year(RST![FUELDATA_DATE]) = Year(Cells(8, 26 + i).Value) Then
                        ' 累加该月的数值(保留/1000的单位转换,若不需要可移除)
                        monthlySum(i) = monthlySum(i) + RST![FUELDATA_AUTOMOTIVE] / 1000
                        ' 该月的记录数+1
                        monthlyCount(i) = monthlyCount(i) + 1
                        Exit For ' 匹配到对应月份后跳出循环,提升运行效率
                    End If
                Next i
                RST.MoveNext
            Wend
            RST.Close
            
            ' 【核心:计算平均值并填入单元格】
            ' 这部分就是你需要插入的平均值计算逻辑,放在遍历完所有记录之后
            For i = 1 To 12
                If monthlyCount(i) > 0 Then ' 避免除以0的运行错误
                    Cells(9, 26 + i).Value = monthlySum(i) / monthlyCount(i)
                Else
                    Cells(9, 26 + i).Value = Empty ' 没有数据时留空,也可以设为0
                End If
            Next i
        End If
        DBS.Close
    End If
End Sub

代码说明:

  • 新增的monthlySum和monthlyCount数组,分别负责存储每个月的数值总和和有效记录条数
  • 去掉了原来固定的/9,完全根据实际记录数计算平均值
  • 添加Exit For减少不必要的循环,提升代码运行效率
  • 增加了除以0的判断,避免出现运行时错误
  • 平均值计算逻辑放在所有记录遍历完成后,确保统计的是该年月的所有数据

内容的提问来源于stack exchange,提问作者Aimé

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:59:50