2013-03-16 72 views
1

我目前正在计算股票投资回报。我有大约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

没有在你的问题的问题!我想你想加快速度。您可以在计算中取出+1,并将For参数更改为5至2784,但为何不将公式放入电子表格中? – grahamj42 2013-03-16 13:21:07

+0

因为我想用VBA菜单驱动的程序动态执行操作......我基本上是在计算价值风险 - 该表中的历史方法和股票信息来自彭博终端......以上是VaR caclulation – 2013-03-16 13:50:43

+0

您可以通过在开始时添加Application.Screenupdating = false来显着提高当前代码的速度。 – enderland 2013-03-16 21:55:16

回答

1

我我不知道这是否可行,只是想测试我昨天在另一个问题上看到的情况。如果您测试它,请在工作簿的副本中运行以防万一它发生可怕的错误!

更新

我测试过它(只是使用随机数> 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

0

如果您不想更改当前的代码,则利用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