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

Excel VBA根据单元格值动态调整公式计算用户自定义简单移动平均

自定义周期SMA计算VBA实现方案

以下是修改后的可动态适配周期的完整代码:

Sub 自定义周期SMA计算()
    Dim period As Integer
    Dim startRow As Integer
    Dim lastRow As Integer
    
    ' 读取D1单元格的周期值
    On Error Resume Next
    period = Range("D1").Value
    On Error GoTo 0
    
    ' 校验输入合法性
    If period < 1 Or Not IsNumeric(Range("D1").Value) Then
        MsgBox "请在D1单元格输入大于0的正整数作为周期", vbExclamation
        Exit Sub
    End If
    
    ' 计算SMA起始行:周期为n时,第一个可计算的行是n+1(前n行历史数据不足)
    startRow = period + 1
    ' 动态获取B列最后一个有数据的行,适配不同长度的数据源
    lastRow = Cells(Rows.Count, "B").End(xlUp).Row
    
    ' 避免起始行超过数据最大行
    If startRow > lastRow Then
        MsgBox "周期大于现有数据量,请调小周期或补充数据", vbExclamation
        Exit Sub
    End If
    
    ' 写入第一个SMA公式,偏移量随周期自动调整
    Cells(startRow, "C").FormulaR1C1 = "=AVERAGE(R[-" & (period - 1) & "]C[-1]:RC[-1])"
    ' 自动填充到数据最后一行
    Cells(startRow, "C").AutoFill Destination:=Range(Cells(startRow, "C"), Cells(lastRow, "C"))
    
    ' 选中生成的SMA区域,匹配原操作习惯
    Range(Cells(startRow, "C"), Cells(lastRow, "C")).Select
End Sub

功能说明

  • 动态读取D1单元格的周期值,支持任意正整数周期,无需修改代码硬编码参数
  • 自带输入合法性校验,避免非数字、周期过小/过大导致的公式报错
  • 自动适配数据源长度,不需要手动修改填充终止行,B列新增数据后重新运行即可自动扩展计算范围
  • 公式逻辑自动适配周期:比如输入周期50时,公式自动变为=AVERAGE(R[-49]C[-1]:RC[-1]),起始计算单元格自动定位到C51,完全匹配需求

进阶优化

如果需要实现修改D1数值后自动计算、无需手动运行宏,可以在当前工作表的代码模块中加入如下事件触发代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    ' 只有修改D1单元格时触发计算
    If Not Intersect(Target, Range("D1")) Is Nothing Then
        Call 自定义周期SMA计算
    End If
End Sub

内容的提问来源于stack exchange,提问作者Asha Malviya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:18:02