Я пытаюсь создать «общий / стандартизированный» макрос для моделирования Монте-Карло в VBA / Excel. Мне удалось написать довольно эффективный код, который хорошо работает в простых случаях, когда весь расчет / формула записывается в одной ячейке (с входными данными из других ячеек). Однако я изо всех сил пытаюсь найти способ написать эффективный код для более сложных вычислений.
Всякий раз, когда я работаю с симуляцией в VBA / Excel, я всегда стараюсь выполнять все вычисления в VBA и получать только ввод / вывод в Excel - чтобы максимально увеличить скорость симуляции. К сожалению, для «сложных» вычислений (читай: несколько вычислений, в конечном итоге приводящих к одному результату), например анализ дисконтированных денежных потоков, где результат представляет собой сумму приведенной стоимости прогнозируемых денежных потоков за несколько лет вперед, а денежный поток за каждый год основан на нескольких допущениях, это довольно трудоемкий и почти невозможный процесс записи всех расчеты в VBA. Единственный способ выполнить моделирование по методу Монте-Карло в таких моделях, о которых я только мог подумать, - это написать цикл, в котором я заменяю желаемую входную переменную на случайное извлечение из соответствующего распределения и пересчитываю рабочую книгу для каждого прогона цикла и сохранить результат каждого прогона в выходной лист. Вот очень грубый пример кода:
Sub MCDCF()
Dim i As Long, iterations As Long
Dim target As Range, variable As Range
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
iterations = Cells(5, 17).Value
Set target = Cells(28, 3)
Set variable = Cells(47, 3)
For i = 1 To iterations
variable.Value = Application.WorksheetFunction.NormInv(Rnd(), Cells(7, 17).Value, Cells(8, 17).Value)
ActiveSheet.Calculate
Cells(5 + i, 19).Value = target.Value
Next
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
End Sub
Вышеуказанный подход слишком медленный. У кого-нибудь есть предложения по альтернативному подходу?
Дополнительная информация. Под «общим / стандартизированным» макросом я подразумеваю, что я создам пользовательскую форму с входными данными RefEdit для выходной ячейки, ячейкой, содержащей переменную, которую необходимо смоделировать, и числом итераций - с целью применения макроса. к нескольким различным моделям Excel.
И да, я знаю, что VBA / Excel - далеко не лучший инструмент для моделирования. Тем не менее, это единственная альтернатива для людей, которые будут использовать это.