我正在尝试为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在模拟方面远非最佳工具。但是,这是将要使用此方法的人们的唯一选择。