2017-10-29 132 views
0

我在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是“间隔”。

现在,如果有更好的方法来做到这一点,我都在船上!

回答

0

如果我理解正确的你:

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 
  1. 运作的?
  2. 它做你想做的?

对不起,缩进,用手机写。

另外,非VBA的办法可能是使用工作表函数:OFFSET()

0

正如你所发现的,间接的功能是挥发性的,它会重新计算,这意味着在每一个细胞的变化,在功能上不仅细胞范围内,但任何地方。

除非需要评估一串TEXT,否则应该避免使用INDIRECT。当您的输入是数字时,您可以使用INDEX功能,因为它不是易失性的:

=IF(COUNT($C$3:$C3)>intAve, AVERAGE(INDEX($C:$C, ROW()-intAve+1):INDEX($C:$C, ROW())), "N/A")