vba - Excel vba : setting a long variable for each object class dramatically increases execution time

标签 vba performance excel memory

我有一个使用 Client 类的主子程序:使用 100 000 Clients 创建一个数组,并在该数组上循环 100 次,每次为每个 Client 设置不同的随机数。

Sub start()
    Application.ScreenUpdating = False

    Dim j As Long

    Dim clientsColl() As Client
    ReDim clientsColl(1 To 100000) As Client

    For j = 1 To 100000
        Set clientsColl(j) = New Client

        clientsColl(j).setClientName = "Client_" & j
    Next

    Dim clientCopy As Variant

    MsgBox ("simulations start")
    Dim i As Long
    For i = 1 To 100
        For Each clientCopy In clientsColl
            clientCopy.setSimulationCount = 100
            clientCopy.generateRandom
        Next
    Next

    Application.StatusBar = False
    Application.ScreenUpdating = True

    MsgBox ("done")
End Sub

但是,此代码的运行时间会有所不同,具体取决于 clientCopy.setSimulationCount = 100 行是否被注释掉。如果将此行注释掉,则 simulations start 之后的代码 MsgBox 需要 16 秒 才能运行。但是,如果该行未注释掉并执行,则第二个循环需要 2 分 35 秒 才能运行。

这是 Client 类的内部,使用的 Let 属性:

Private simulationCount As Long

Public Property Let setSimulationCount(value As Double)
    simulationCount = value
End Property

Private randomNumber As Double

Public Sub generateRandom()
    randomNumber = Rnd()
End Sub

所以它只是将数字100放入每个客户端中。为什么它会使执行时间增加九倍?

最佳答案

您已将 clientCopy 定义为 Variant,必须在每次方法调用的运行时解析它。请更改为 Client 类型并重新运行计时。

好的,我已经重新阅读了问题和评论,以加快循环速度,因此进行更改

Option Explicit

Sub start()
    Application.ScreenUpdating = False

    Dim j As Long

    Dim clientsColl() As Client
    ReDim clientsColl(1 To 100000) As Client

    For j = 1 To 100000
        Set clientsColl(j) = New Client

        clientsColl(j).setClientName = "Client_" & j
    Next

    'Dim clientCopy As Variant
    Dim clientCopy As Client

    MsgBox ("simulations start")
    Dim i As Long
    For i = 1 To 100
        Dim lClientLoop As Long
        For lClientLoop = LBound(clientsColl) To UBound(clientsColl)
        'For Each clientCopy In clientsColl
            Set clientCopy = clientsColl(lClientLoop)
            clientCopy.setSimulationCount = 100
            clientCopy.generateRandom
        Next
    Next

    Application.StatusBar = False
    Application.ScreenUpdating = True

    MsgBox ("done")
End Sub

关于vba - Excel vba : setting a long variable for each object class dramatically increases execution time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47993190/

相关文章:

excel - 将变量数组转换为字符串

c# - 是否可以从 C# COM 互操作对象写入 VBA 立即窗口?

excel - 在多行Excel单元格中的特殊字符后提取文本

c++ - 使 excel 在单个打印作业中打印多个工作表

vba - excel工作表比较两个不同的列,如果匹配,则将其接下来的两个单元格复制到新列中

vba - 如何使用 R for 循环定义范围来创建图形

javascript - 突出显示和编辑长字符串中的文本

sql - 对复合索引和 FFS 感到困惑

Android xml vs java 布局性能

python - 有没有办法使用 openpyxl 读取没有工作簿的 Excel 文件?