Более медленное выполнение расчетов в 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