Newsgroup: it.comp.lang.visual-basic
Titolo: Macro per Excel: cronometro

Ciao a tutti,
ho scritto una macro per excel e vorrei sapere quanto tempo ci mette per
essere eseguita: è possibile introdurre un controllo che alla fine della
macro mi resituisca il tempo di cpu?
non mi interessa che sia preciso al centesimo di secondo, mi basta che
indici minuti e secondi impiegati. l'importante è che non rallenti la macro
stessa! Visto che di VB ne capisco abbastanza poco potreste indicarmi il
listato da inserire?
Grazie
Carlo


ti riposto una mia mail di un po' di tempo fa...
Ciao
Faber
trascritta dal libro di Jason Book "Visual Basic 6 Win32 API Tutorial"
il codice va messo in un modulo di classe
Option Explicit
Private Declare Function QueryPerformanceFrequency Lib "kernel32"
(lpFrequency As LARGE_INTEGER) As Long
Private Declare Function QueryPerformanceCounter Lib "kernel32"
(lpPerformanceCount As LARGE_INTEGER) As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Type LARGE_INTEGER
    lowpart As Long
    highpart As Long
End Type
Private Const HIGH_32_BITS As Double = 2 ^ 32
Private Const MS_CONVERSION As Double = 1000
Private m_blnRunning As Boolean
Private m_enmQuality As ClockQuality
Private m_lngEnd As Long
Private m_lngStart As Long
Private m_udtEnd As LARGE_INTEGER
Private m_udtFreq As LARGE_INTEGER
Private m_udtStart As LARGE_INTEGER
Public Enum ClockQuality
    High
    Low
End Enum
Public Sub StartClock()
    m_blnRunning = True
    If m_enmQuality = High Then
        QueryPerformanceCounter m_udtStart
    Else
        m_lngStart = GetTickCount
    End If
End Sub
Public Sub StopClock()
    m_blnRunning = False
    If m_enmQuality = High Then
        QueryPerformanceCounter m_udtEnd
    Else
        m_lngEnd = GetTickCount
    End If
End Sub
Public Sub ResetClock()
    m_blnRunning = False
    If m_enmQuality = High Then
        m_udtStart.highpart = 0
        m_udtStart.lowpart = 0
        m_udtEnd.highpart = 0
        m_udtEnd.lowpart = 0
    Else
        m_lngStart = 0
        m_lngEnd = 0
    End If
End Sub
Public Function View() As Double
    Dim dblDiff As Double
    Dim lngCurrent As Long
    Dim udtCurrent As LARGE_INTEGER
    If m_blnRunning Then
        If m_enmQuality = High Then
            QueryPerformanceCounter udtCurrent
            dblDiff = ConvertLIToDouble(udtCurrent) - _
                ConvertLIToDouble(m_udtStart)
            View = CDbl(lngCurrent - m_lngStart) / MS_CONVERSION
        Else
            lngCurrent = GetTickCount
            View = CDbl(lngCurrent - m_lngStart) / MS_CONVERSION
        End If
    Else
        If m_enmQuality = High Then
            dblDiff = ConvertLIToDouble(m_udtEnd) - _
                ConvertLIToDouble(m_udtStart)
            View = dblDiff / ConvertLIToDouble(m_udtFreq)
        Else
            View = CDbl(m_lngEnd - m_lngStart) / MS_CONVERSION
        End If
    End If
End Function
Public Property Get Quality() As ClockQuality
    Quality = m_enmQuality
End Property
Public Property Let Quality(Val As ClockQuality)
    m_enmQuality = Val
End Property
Private Function ConvertLIToDouble(LargeValue As LARGE_INTEGER) As Double
    With LargeValue
        ConvertLIToDouble = HIGH_32_BITS * CDbl(.highpart) + CDbl(.lowpart)
    End With
End Function
Private Sub Class_Initialize()
    Dim lngRet As Long
    lngRet = QueryPerformanceFrequency(m_udtFreq)
    If lngRet <> 0 Then
        m_enmQuality = High
    Else
        m_enmQuality = Low
    End If
End Sub
esempio di utilizzo:
    Dim Performance As clsPerformance
    Set Performance = New clsPerformance
    Performance.StartClock
    [serie di elaborazioni]
    Performance.StopClock
    MsgBox "Tempo di elaborazione: " & Performance.View & " secondi",
vbInformation
    Set Performance = Nothing

 non mi interessa che sia preciso al centesimo di secondo, mi
basta che indici minuti e secondi impiegati. l'importante č
che non rallenti la macro stessa! Visto che di VB ne capisco
abbastanza poco potreste indicarmi il listato da inserire?
Potresti fare cosi`:
    Dim dtmBegin  As Date
    Dim dtmEnd    As Date
    Let dtmBegin = Now
    Debug.Print "Inizio:", Format$(dtmBegin, "General Date")
    '
    ' ...
    '
    Let dtmEnd = Now
    Debug.Print "Fine:", Format$(dtmEnd, "General Date")
    Debug.Print _
        "Durata:" _
      ; DateDiff("y", dtmBegin, dtmEnd); "anni," _
      ; DateDiff("m", dtmBegin, dtmEnd); "mesi," _
      ; DateDiff("d", dtmBegin, dtmEnd); "giorni," _
      ; DateDiff("h", dtmBegin, dtmEnd); "ore," _
      ; DateDiff("m", dtmBegin, dtmEnd); "minuti," _
      ; DateDiff("s", dtmBegin, dtmEnd); "secondi."
--
Ciao.
Maurizio