2013-06-12 2 views
0

많은 루프가있는 "큰"vba-programm가 있습니다. 이제는 각 단계마다 해당 프로그램을 계산할 때마다 계산을 시작하므로 실제로 루프를 찾을 수는 있습니다. . 나는 여러 단계의 실행을 원한다.프로그램 단계 계산

이제는 어떻게 작동하는지 아는 사람이 있습니까? 아니면 Excel2010에 이미 allready 일부 기능이 존재합니까?

Thx. 나는 나의 위그 힘이별로 좋지 않다는 것을 안다. >. <

편집 06.14.13 지금 내가

Sub DoStuff() 
Dim sw As New Stopwatch 
sw.Start 
Call pranlesen.plan_gen 
sw.Pause 
Debug.Print "SomeFunction took " & format(sw.Elapsed * 1000, "0.000000") & " milliseconds" 
End Sub 

클래스가 바로 내가 결함이 무엇인지 알 수 스톱워치로 불린다 내 모듈에이를 수 있도록 작성합니다.

답변

2

"프로세서 명령어 수를 계산하라"는 뜻이라면 그럴 수 없습니다. 그러나 경과 시간을 매우 정확하게 측정 할 수 있습니다. Windows API 함수 QueryPerformanceCounter을 사용하여 VBA에서 매우 정확한 스톱워치를 생성하는 방법에 대한 자세한 설명은 내 문서 Accurate Performance Timers in VBA을 참조하십시오. 다음은 스톱워치 클래스의 전체 코드는 다음과 같습니다

Option Explicit 

Private Declare Function QueryPerformanceCounter Lib "kernel32" (_ 
    lpPerformanceCount As UINT64) As Long 
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (_ 
    lpFrequency As UINT64) As Long 

Private pFrequency As Double 
Private pStartTS As UINT64 
Private pEndTS As UINT64 
Private pElapsed As Double 
Private pRunning As Boolean 

Private Type UINT64 
    LowPart As Long 
    HighPart As Long 
End Type 

Private Const BSHIFT_32 = 4294967296# ' 2^32 

Private Function U64Dbl(U64 As UINT64) As Double 
    Dim lDbl As Double, hDbl As Double 
    lDbl = U64.LowPart 
    hDbl = U64.HighPart 
    If lDbl < 0 Then lDbl = lDbl + BSHIFT_32 
    If hDbl < 0 Then hDbl = hDbl + BSHIFT_32 
    U64Dbl = lDbl + BSHIFT_32 * hDbl 
End Function 

Private Sub Class_Initialize() 
    Dim PerfFrequency As UINT64 
    QueryPerformanceFrequency PerfFrequency 
    pFrequency = U64Dbl(PerfFrequency) 
End Sub 

Public Property Get Elapsed() As Double 
    If pRunning Then 
     Dim pNow As UINT64 
     QueryPerformanceCounter pNow 
     Elapsed = pElapsed + (U64Dbl(pNow) - U64Dbl(pStartTS))/pFrequency 
    Else 
     Elapsed = pElapsed 
    End If 
End Property 

Public Sub Start() 
    If Not pRunning Then 
     QueryPerformanceCounter pStartTS 
     pRunning = True 
    End If 
End Sub 

Public Sub Pause() 
    If pRunning Then 
     QueryPerformanceCounter pEndTS 
     pRunning = False 
     pElapsed = pElapsed + (U64Dbl(pEndTS) - U64Dbl(pStartTS))/pFrequency 
    End If 
End Sub 

Public Sub Reset() 
    pElapsed = 0 
    pRunning = False 
End Sub 

Public Sub Restart() 
    pElapsed = 0 
    QueryPerformanceCounter pStartTS 
    pRunning = True 
End Sub 

Public Property Get Running() As Boolean 
    Running = pRunning 
End Property 

새로운 클래스 모듈에서 위의 코드를 붙여 넣기하고 모듈 "스톱워치"의 이름을 지정합니다. 그렇다면 코드의 다른 곳에서 다음과 같이 할 수 있습니다.

Sub DoStuff 
    Dim sw As New Stopwatch 
    sw.Start 
    myResult = SomeFunction(A, B, C) 
    sw.Pause 
    Debug.Print "SomeFunction took " & Format(sw.Elapsed * 1000, "0.000000") & " milliseconds" 
End Sub 
+1

그 답변을 주셔서 감사합니다. –

+0

답해 주셔서 감사합니다, 유용 할 수도 있지만, 이해가 안되네요, SomeFunction은 뭐죠 ...? – Synoon

+0

내 mainfunction 거기에 쓸까요? – Synoon