Более медленное выполнение расчетов в Excel VBA

В настоящее время я рассчитываю доходность инвестиций в акции. У меня есть исторические данные примерно за 10 лет, и способ, которым я построил свою функцию, занимает много времени, чтобы выполнить работу. Например, у меня есть 11 столбцов и 2872 строки для расчета доходности за каждый день.

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 - на колонке нужно выводить вывод

2 ответа

Решение

Я понятия не имею, сработает ли это, просто хотел протестировать то, что видел вчера по другому вопросу. Если вы проверяете его, запустите его в своей рабочей книге на случай, если все пойдет не так!

Обновить

Я проверил это (просто используя столбец случайных чисел> 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

Ответ, на который я ссылался.

Если вы не хотите менять свой текущий код, используя 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
Другие вопросы по тегам