VBA:平滑数据
问题描述:
我在excel中创建了一种方法,通过改变单元格的值(间隔),我可以通过“移动平均值”来平滑数据,并在图形中实时查看更改,而不是每次都必须点击数据分析 - 移动平均数等。问题在于,我发现Excel的显示速度很慢,因为它似乎是每次在同一张表格中“计算”移动平均值(或别的东西)。当我在同一个文件中有很多数据时,情况会变得很糟糕。 这是我目前做的方式:我复制下面的E3公式 然后我拖累了相同数量的占用的行中C.VBA:平滑数据
=IF(COUNT($C$3:C3)>IntAve, AVERAGE(INDIRECT("C"&(ROW()-IntAve+1)):INDIRECT("C"&ROW())),"N/A")
其中C列包含我要平滑数据而“IntAve”是包含移动平均窗口中调用的平均单元数或“间隔”的单元格。
我想用VBA做什么,如果可能的话,就是创建一个宏,它将读取C中所有占用的行,读取单元格“IntAve”中的值,最后执行与上面相同的计算,但只是粘贴E列中的值,这样工作表就没有计算了。
当我录制宏在做数据分析,移动平均线的路线,这是我看到
Application.Run "ATPVBAEN.XLAM!Moveavg", ActiveSheet.Range("$B$1:$B$74662") _
, ActiveSheet.Range("$D:$D"), 45, False, False, False
但我不知道如何利用上述宏做要我要。 btw 45是“间隔”。
现在,如果有更好的方法来做到这一点,我都在船上!
答
如果我理解正确的你:
Option explicit
Sub MovingAverages()
With activesheet
Dim MovingAveragePeriod as long
MovingAveragePeriod = .range("IntAve").value2
Dim LastRowInColumnC as long
LastRowInColumnC = .cells(.rows.count,"C").end(xlup).row
Dim ColumnC as range
' I assume values begin from cell C1'
Set ColumnC = .range("C1:C" & LastRowInColumnC)
With .range("E1:E" & (lastrowincolumnc - movingaverageperiod +1))
'IF YOU HAVE VALUES LOWER DOWN IN COLUMN E below the averages that you do not want to clear, comment/get rid of this line below.'
.entirecolumn.clearcontents
.formula = "=average(C1:C" & movingaverageperiod & ")" ' check the last formula in column E to make sure it has copied down correctly and refers to the correct cells in column C'
.calculate ' I think this will only calculate the newly added averages.'
.value2 = .value2 ' hopefully this replaces formulas with values'
End With
End Sub
- 运作的?
- 它做你想做的?
对不起,缩进,用手机写。
另外,非VBA的办法可能是使用工作表函数:OFFSET()
答
正如你所发现的,间接的功能是挥发性的,它会重新计算,这意味着在每一个细胞的变化,在功能上不仅细胞范围内,但任何地方。
除非需要评估一串TEXT,否则应该避免使用INDIRECT。当您的输入是数字时,您可以使用INDEX功能,因为它不是易失性的:
=IF(COUNT($C$3:$C3)>intAve, AVERAGE(INDEX($C:$C, ROW()-intAve+1):INDEX($C:$C, ROW())), "N/A")