2017-12-25 1 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에서 상태 표시 줄을 업데이트 할 수있는 가장 좋은 방법입니다 알고 자동 업데이트. 또 다른 시간 절약 방법은 내부 루프 내에서 100 번째 또는 1000 번째 메시지 만 표시하는 것입니다.

1

진행 표시 줄 또는 상태 표시 줄을 수행 할 때 현명하게 사용해야합니다.

기본적으로 진행 정보는 0.1 초마다 새로 고쳐야합니다.

최대 루프 수와 소요 시간을 알면 루프를 100 회 반복한다고 가정 할 때마다 정보를 업데이트 할 수 있습니다.

는 다음과 같이 수행됩니다 application.statusbar 후 J의 모드 (100) = 0 = "..."경우 : doevents

보통 나는 심지어 내 진행 막대보다 적은 doevents를 사용하여 더 나아가 (초 J의 모드 경우) .

+0

하지만 모든 반복에서 실행 시간이 느려질 필요가있는'j MOD 100 = 0'을 확인하지 않겠습니까? – Ans

+0

doevents는 더 간단한 방법으로 속도를 줄입니다 if –

관련 문제