我有一个程序可以创建类100 000
的{{1}}个对象,将它们放入数组然后经过该数组Client
次,每次分配每个100
个通过Client
函数的不同随机数:
主要分:
Rnd()
Sub start()
Dim i As Long
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
Application.StatusBar = "Getting client " & j
DoEvents
Next
Dim tempCount As Long
Dim clientCopy As Variant
For i = 1 To 100
tempCount = 0
For Each clientCopy In clientsColl
tempCount = tempCount + 1
clientCopy.generateRandom
'Application.StatusBar = "Calculating " & i & ": " & tempCount & "/" & 100000 '(1)
'DoEvents
Next
Application.StatusBar = "Calculating " & i
DoEvents
Next
MsgBox ("done")
End Sub
上课:
Client
问题是,执行时间取决于行Option Explicit
Dim clientName As String
Dim randomNumber As Double
Public Sub generateRandom()
randomNumber = Rnd()
End Sub
Public Property Get getClientName()
getClientName = clientName
End Property
Public Property Let setClientName(value As String)
clientName = value
End Property
是否被注释掉。如果它被执行,状态栏将被更新,但执行时间非常慢。如果它没有被执行,程序就会很快完成。
为什么会这样?
答案 0 :(得分:1)
只要你呆在里面,VBA就够快了。每当你转向Excel时,它可能会变得更慢,因为Excel每次控制时都会进行数千次操作。您可以考虑关闭一些Excel服务,就像我在我的应用程序中那样:
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
...据我所知,当您关闭自动更新时,DoEvents是使Excel更新状态栏的最佳方式。 另一个省时的解决方法是只显示内循环内的每100或1000条消息。
答案 1 :(得分:1)
在执行进度条或状态栏时,您需要明智地使用它。
基本上,进度信息只需每0.1秒左右刷新一次。
知道你的最大循环次数和所花费的时间,你可能只想每次(在你的情况下)更新信息,比方说,循环的100次迭代。
这样做:如果j mod 100 = 0则application.statusbar =“...”:doevents
通常我甚至会使用少于我的进度条的doevents(如果是j mod则使用第二个)。