2013-03-16 76 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