vba,模拟和数组

时间:2017-01-17 23:29:02

标签: vba performance multidimensional-array

我对编程很新,我正在尝试确定以下模拟在VBA中是否可行:蒙特卡罗模拟涉及36个时间段,每个周期20个模拟变量,每个模拟最多5000个模拟期。然后,对每个周期聚合模拟结果,以创建36个分布(每个周期一个)。这似乎是一个3d数组,必须存储变量,需要循环...等。我担心计算时间。这似乎对于vba来说可能太过分了,所以我想得到一些反馈。提前谢谢。

1 个答案:

答案 0 :(得分:2)

是的,这很可行。我一直这样做。

15 - 20年前,当我第一次开始使用VBA时,性能通常是个问题,对某些事情来说仍然是一个问题。但是凭借Moore's law的魔力,我2岁以上的笔记本电脑上的VBA与20年前编译的C的速度相匹配:

Sub quick()
    Dim i As Long, sum As Long
    Dim start As Double, elapsed As Double
    start = Timer
    For i = 1 To 100000000
        sum = sum + 1
    Next i
    elapsed = Timer - start
    Debug.Print "Sum of " & sum & " computed in " & elapsed & " seconds"
End Sub

输出:

Sum of 100000000 computed in 0.765625 seconds

在不到一秒的时间内,有1亿人通过循环。即使模拟需要数十亿的浮点运算,它也可能在不到一分钟的时间内运行。除非您的5000个单独模拟步骤中的每个步骤都需要数以亿计的计算,否则您应该没问题。

所以 - 开始编码。如果你遇到困难,请发布另一个问题。

警告:VBA很快。 Excel本身很快。链接两者的桥(Excel对象模型)很慢。要获得可接受的速度,您应该最小化工作表和VBA之间的数据传输。常见的初学者错误是将电子表格本身用作数据结构。将模拟本身写入纯VBA中,与电子表格交互主要限于在模拟开始时读取初始值,并在最后将输出写入电子表格。