2017-12-25 4 views
0

IクラスClient100 000オブジェクトを作成するプログラムは、各Client異なる乱数を割り当てるたびに100回を配列に入れますし、その配列を経由する必要がありエクセルVBA:プログラムは、ステータスバーが更新された場合には時間がかかる

メインサブ:

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 
スルー機能

問題は、実行時間が行(1)がコメントアウトされているかどうかによって異なります。実行された場合、ステータスバーは更新されますが、実行時間は非常に遅いです。それが実行されない場合、プログラムは本当に速く完了します。

どうしてですか?

+0

あなたは 'Application.ScreenUpdating'と' Application.StatusBar' 'Application'プロパティに精通していますか? – AntiDrondert

+0

@AntiDrondert 'Application.ScreenUpdating = False'マクロを' start'マクロに追加しようとしましたが、速く動作しているようですが、内部ステータスバーが更新されるとマクロが遅くなるという根本的な問題があります。 – Ans

+0

"基本的な問題:内部のステータスバーが更新されても、マクロはまだ遅いです":ステータスバーの更新に必要な時間は0になると思いますか?確かに0にすることはできません。 –

答えて

1

あなたが滞在している限り、VBAは十分速いです。 Excelに切り替えるたびに、Excelが制御を得るたびに何千もの操作が行われるため、処理速度が大幅に低下することがあります。

Application.Calculation = xlCalculationManual 
Application.ScreenUpdating = False 
Application.DisplayStatusBar = False 
Application.EnableEvents = False 
ActiveSheet.DisplayPageBreaks = False 

...と私の知る限りDoEvents関数を知っているあなたはオフにしたときにExcelがステータスバーを更新させるための最善の方法である:私は私のアプリケーションで行うようにエクセルのいくつかのより多くのサービスをオフにすることを検討して自動更新。 もう1つの時間を浪費する回避策は、内側のループ内から100番目または1000番目のメッセージごとにのみ表示することができます。

1

プログレスバーまたはステータスバーを実行する場合は、それを賢明に使用する必要があります。

基本的には、進行状況情報は0.1秒ごとに更新する必要があります。

ループの最大数とそれにかかる時間が分かれば、ループの100回の反復とみなして、毎回(場合によっては)情報を更新することができます。

これは、次のように行われます。if J MOD 100 = 0、その後application.statusbar = "...":DoEvents関数

通常、私も私のプログレスバー未満DoEvents関数を使用することにより、さらに行く(第2 jをmodの場合) 。

+0

しかし、実行時間を遅くするたびに繰り返される必要がある 'j MOD 100 = 0'をチェックするのではないでしょうか? – Ans

+0

doeventsは単純なifよりも遅くなります –

関連する問題