更改循环以更有效地运行

时间:2015-03-26 12:53:35

标签: excel-vba vba excel

我有一个非常基本的循环,我用来运行一些随机场景。在我的一个工作表中,我使用=Rand()函数为我的工作簿生成随机数/方案。我正在尝试编程的是一个宏刷新工作簿(和随机数字组),然后每次运行场景时将我的结果存入我的工作表。最终,我希望能够运行/生成100,000个随机场景并存储结果。这是我到目前为止编码的内容:

Sub Run()

    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False   

    Dim wksInput As Worksheet, i As Integer

    Set wksInput = Sheets("Input")

        For i = 2 To 102

            Application.Calculate

            With wksInput                
                .Range("P" & i).Value = .Range("J35").Value
                .Range("Q" & i).Value = .Range("K35").Value
                .Range("R" & i).Value = .Range("L35").Value
                .Range("S" & i).Value = .Range("G32").Value
            End With              
        Next i    

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True

End Sub

我在这里工作得很好,除了运行100个场景需要23秒。基于我的计算,需要超过6小时的运行时间来获得我的100,000个随机场景。

我的问题是,是否有人知道一种聪明的方法,可以更改代码以更有效地运行或优化我已有的代码。我完成了所有基本的操作,例如将计算转为手动并关闭屏幕更新。

感谢您的想法。

1 个答案:

答案 0 :(得分:5)

问题在于这一行:

Application.Calculate

因为它位于For i = 2 To 102内,这意味着对于您添加所有的每一行,都会重新计算电子表格的=rand()函数。

我建议您使用VBA的Rnd()内置函数在代码中生成随机数。像这样,您只需生成随机输入,避免生成N-1其他输入,在Next循环再次调用Application.Calculate时,您将重新生成这些输入。

可能是什么样的?

这是逻辑(我不能具体告诉你,因为你没有显示你的整个代码/电子表格,也没有显示这个随机生成背后的逻辑):假设你在单元格A1中有三个随机数, A2A3。它们都是在单元格内用函数=Rand()计算的。

现在,使用您的代码,您希望在B1B2B3中存在A + 1中随机数的总和。

Excel解决方案(即Excel使用函数=Rand()计算随机输入):

For j = 1 To 3
    Application.Calculate '<-- this re-calculates 3 =rand(), but you need only the one you're going to use right after (==j)
    Range("B" & j) = Range("A" & j) + 1
Next j    

VBA解决方案(即随机数不在Excel电子表格中,而是通过VBA计算):

Randomize
For j = 1 To 3
    Range("A" & j) = Rnd() '<-- you insert the random value in A1, A2...
    Range("B" & j) = Range("A" & j) + 1 '<-- you use it
Next j

Excel解决方案计算3次随机函数3次,即9次迭代。 VBA解决方案计算3次随机函数3次,即3次迭代。

我让你想象100,000个场景的乘法,每个场景有100个数据。