如何在VBA中设置数据表子区域计算简单移动平均线?(含报错代码)
修正VBA移动平均计算代码错误
原代码存在的问题
- 行索引越界:当
Row + xHeti超过namedRange的总行数时,lCell会引用无效单元格,导致AvgRng范围错误,触发WorksheetFunction.Average计算失败。 - 未指定工作表的Range引用:
Range(fCell, lCell)默认指向当前活动工作表,若活动工作表不是Skandi,会导致范围引用错误。 - 输出逻辑冗余:原循环覆盖所有行,但后半部分行无法取到完整的移动平均数据,会产生无效计算结果。
修正后的代码
Sub movingaverage() Dim MovAvg As Worksheet: Set MovAvg = Sheets("MovAvg") Dim Skandi As Worksheet: Set Skandi = Sheets("Skandi") Dim xHeti As Long: xHeti = 6 ' 移动平均的时间跨度(共xHeti+1个数据点) Dim sz As Long: sz = 35 ' 数据表的列数 Dim Col As Long Dim Row As Long Dim totalRows As Long: totalRows = Skandi.Range("namedRange").Rows.Count ' 清空目标区域旧数据(可选,避免残留值干扰) MovAvg.Range(MovAvg.Cells(7, 1), MovAvg.Cells(7 + totalRows - xHeti, sz)).ClearContents For Col = 1 To sz ' 仅循环到能完整取到xHeti+1个数据的行 For Row = 1 To totalRows - xHeti ' 用Resize直接定义移动平均范围,避免越界 Dim AvgRng As Range: Set AvgRng = Skandi.Range("namedRange").Cells(Row, Col).Resize(xHeti + 1, 1) ' 将结果写入MovAvg的对应位置 MovAvg.Cells(7 + Row - 1, Col) = WorksheetFunction.Average(AvgRng) Next Row Next Col End Sub
关键修改说明
- 新增
totalRows变量存储总行数,既避免重复计算,又限制循环终止行,确保移动平均范围不会超出数据边界。 - 用
Resize替代手动计算结束单元格,简洁高效,彻底解决行索引越界问题。 - 明确指定
Skandi工作表的Range引用,消除对活动工作表的依赖。 - 调整输出行索引,保证第一个计算结果从原代码预期的第7行开始写入。
内容的提问来源于stack exchange,提问作者A Pofta Tapofta
相关产品推荐
相关产品推荐

