在Excel VBA中计算性能下降
问题描述:
我目前正在计算股票投资回报。我有大约10年的历史数据,而我构建自己职能的方式需要很长时间才能完成。例如,我有11列和2872行来计算每一天的收益。在Excel VBA中计算性能下降
my Function
Public Sub CalcROI(ByVal ColPick As Integer, ByVal ColPrint As Integer)
Dim irow As Integer
Dim iCol As Integer
For irow = 4 To 2873
'Calculating ROI
Cells(irow + 1, ColPrint).Value = (Cells(irow + 1, ColPick).Value - Cells(irow, ColPick).Value)/Cells(irow, ColPick).Value
Next irow
End Sub
和程序的执行是
CalcROI ColPick:=4, ColPrint:=17
ColPick - 从哪里值需要选择为计算
ColPrint - 在列其需要打印输出
答
我我不知道这是否可行,只是想测试我昨天在另一个问题上看到的情况。如果您测试它,请在工作簿的副本中运行以防万一它发生可怕的错误!
更新
我测试过它(只是使用随机数> 0的列)和它的工作。
Public Sub CalcROI(ByVal ColPick As Integer, ByVal ColPrint As Integer)
Dim rgPick As Range
Dim vaPick As Variant
Dim rgPrint As Range
Dim vaPrint As Variant
Dim Row As Integer
Set rgPick = Range(Cells(4, ColPick), Cells(2873 + 1, ColPick))
vaPick = rgPick.Value
Set rgPrint = Range(Cells(4, ColPrint), Cells(2873 + 1, ColPrint))
vaPrint = rgPrint.Value
For Row = LBound(vaPick) To UBound(vaPick) - 1
vaPrint(Row + 1, 1) = (vaPick(Row + 1, 1) - vaPick(Row, 1))/vaPick(Row, 1)
Next Row
rgPrint = vaPrint
End Sub
Answer我引用。
+0
你是明星人......它的工作原理......非常感谢你 – 2013-03-16 14:04:56
答
如果您不想更改当前的代码,则利用Application.ScreenUpdating
将有助于实现此目的(以及使将来几乎所有将来的Excel VBA代码运行得更快)。
Public Sub CalcROI(ByVal ColPick As Integer, ByVal ColPrint As Integer)
'this stops Excel from updating the screen after every single iteration in your loop
'in the future, this is an EASY way to speed up the majority of Excel macros
Application.screenupdating = false
Dim irow As Integer
Dim iCol As Integer
For irow = 4 To 2873
'Calculating ROI
Cells(irow + 1, ColPrint).Value = (Cells(irow + 1, ColPick).Value - Cells(irow, ColPick).Value)/Cells(irow, ColPick).Value
Next irow
'this isn't strictly speaking necessary, but will help
application.screenupdating = true
End Sub
没有在你的问题的问题!我想你想加快速度。您可以在计算中取出+1,并将For参数更改为5至2784,但为何不将公式放入电子表格中? – grahamj42 2013-03-16 13:21:07
因为我想用VBA菜单驱动的程序动态执行操作......我基本上是在计算价值风险 - 该表中的历史方法和股票信息来自彭博终端......以上是VaR caclulation – 2013-03-16 13:50:43
您可以通过在开始时添加Application.Screenupdating = false来显着提高当前代码的速度。 – enderland 2013-03-16 21:55:16