更改循环以更有效地运行

Chr*_*015 0 excel vba excel-vba

我有一个非常基本的循环,我用来运行一些随机的场景.在我的一个工作表中,我使用该=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
Run Code Online (Sandbox Code Playgroud)

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

我的问题是,是否有人知道一种聪明的方法,可以更改代码以更有效地运行或优化我已有的代码.我做了所有基本的事情,比如将计算转到手动并关闭屏幕更新.

谢谢你的想法.

Mat*_*NNZ 5

问题是这一行:

Application.Calculate
Run Code Online (Sandbox Code Playgroud)

因为它是置于其内For i = 2 To 102,这意味着,每行添加所有=rand()电子表格的功能被重新计算.

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

可能是什么样的?

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

现在,使用您的代码,您需要它B1,B2并且B3A + 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    
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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