Avatar billede zjat Nybegynder
05. juli 2010 - 10:19 Der er 14 kommentarer og
1 løsning

VBA: Timer på hvor lang tid kode tager?

Hej Alle sammen

Jeg arbejder med en VBA kode, som jeg gerne vil vide hvor lang tid den tager at udføre (så jeg kan se effekten af optimeret kode)

Men hvordan laver man en simpel timer af sin kode?

Har  prøvet den her:

http://www.ozgrid.com/forum/showthread.php?t=18446

Men det resulterer bare i at der kommer 3 msgboxes op efter hinanden med forskellige tal (ikke gennemskuelig og mistænker det er fordi at beregningerne ikke er færdig)
Avatar billede Slettet bruger
05. juli 2010 - 11:15 #1
http://msdn.microsoft.com/en-us/library/aa730921(office.12).aspx#Office2007excelPerf_CalculatingWorkbooksWorksheetsRanges

Her finder du blandt meget andet:
FullcalcTimer
RangeTimer
RecalcTimer og
SheetTimer
Avatar billede newbieatphp Nybegynder
05. juli 2010 - 11:15 #2
hvis du har kopieret den direkte fra den, så er det fordi første linie er mangler lidt.

Sub tid()
    Dim StartTime As Date, EndTime As Date
    StartTime = timer
    'alt andet kode
    EndTime = timer
    MsgBox Format(EndTime - StartTime, "0.0")
End Sub

starttimer blev ikke sat ordenligt til date, derfor blev det nogle mærkelige tal som output
Avatar billede newbieatphp Nybegynder
05. juli 2010 - 11:17 #3
Men hvis du får 3 bokse frem, så må du enten lave et loop eller kalder flere funktion, hvor du har den kode i?
Avatar billede newbieatphp Nybegynder
05. juli 2010 - 11:21 #4
Eller også er der bare noget helt galt med den timer.

starter med at være 01-06-2011 22:35:37 og slut 07-06-2011 08:54:22

:)
Avatar billede newbieatphp Nybegynder
05. juli 2010 - 11:24 #5
Den her fik jeg til at virker.... viser tiden i TT:MM:SS

Sub tid()
    Dim StartTime As Date, EndTime As Date
    StartTime = Now()
    'alt andet kode
    EndTime = Now()
    MsgBox Format(EndTime - StartTime, "hh:mm:ss")
End Sub
Avatar billede zjat Nybegynder
05. juli 2010 - 15:19 #6
hmmm... ja, koden hjalp - men nu får jeg bare klokkeslet i første popup og i næste popup får jeg så tiden i sekunder, dog inkl. den tid der tager mig og trykke OK til første Popup.

Det jeg helt specifikt gerne vil have er en funktion - som i sekunder og hundrededele sekunder fortæller hvor lang tid det tager og køre en given funktion. Dvs. et slags spedometer for en tilfældig kode :)
Avatar billede Slettet bruger
05. juli 2010 - 16:14 #7
Kan du ikke læse engelsk, eller hvad er grunden til at du tilsyneladende ikke interesserer dig for det link jeg angav i "2?
Avatar billede zjat Nybegynder
06. juli 2010 - 19:24 #8
Hej dkhanknu

Jeg takker for din indlæg :) desværre kan jeg ikke se en løsning på min problem :(

Der ser mere ud til du bare har givet mig manualen til VBA og bedt mig om at løse opgaven selv :)
Avatar billede zjat Nybegynder
06. juli 2010 - 19:47 #9
Nu fik jeg din (newbieatphp) kode til at virke - problemet er at jeg nok skal bruge en som kan måle under et sekund. Men hvis der ikke kommer andre løsninger får du pointene :)

Har fundet disse muligheder for løsninger:
http://stackoverflow.com/questions/198409/how-do-you-test-running-time-of-vba-code

Dog så kan jeg ikke få den nøjagtige løsning til at virke. For ved ikke hvad det specifikt menes med "call it CTimer say, then you can make an instance somewhere global and just call .StartCounter and .TimeElapsed" og nej det er ikke fordi jeg ikke forstår engelsk :)
Avatar billede Slettet bruger
06. juli 2010 - 20:41 #10
Jeg håber ikke det er ulovligt det her, men nu gør jeg det altså, nemlig kopierer koden fra den artikel jeg linkede til. Det havde jeg regnet med du selv kunne have fundet ud af.


Sub RangeTimer()
    DoCalcTimer 1
End Sub
Sub SheetTimer()
    DoCalcTimer 2
End Sub
Sub RecalcTimer()
    DoCalcTimer 3
End Sub
Sub FullcalcTimer()
    DoCalcTimer 4
End Sub

Sub DoCalcTimer(jMethod As Long)
    Dim dTime As Double
    Dim dOvhd As Double
    Dim oRng As Range
    Dim oCell As Range
    Dim oArrRange As Range
    Dim sCalcType As String
    Dim lCalcSave As Long
    Dim bIterSave As Boolean
    '
    On Error GoTo Errhandl

' Initialize
    dTime = MicroTimer             

    ' Save calculation settings.
    lCalcSave = Application.Calculation
    bIterSave = Application.Iteration
    If Application.Calculation <> xlCalculationManual Then
        Application.Calculation = xlCalculationManual
    End If
    Select Case jMethod
    Case 1

        ' Switch off iteration.

        If Application.Iteration <> False Then
            Application.Iteration = False
        End if
       
        ' Max is used range.

        If Selection.Count > 1000 Then
            Set oRng = Intersect(Selection, Selection.Parent.UsedRange)
        Else
            Set oRng = Selection
        End If

        ' Include array cells outside selection.

        For Each oCell In oRng
            If oCell.HasArray Then
                If oArrRange Is Nothing Then
                    Set oArrRange = oCell.CurrentArray
                End If
                If Intersect(oCell, oArrRange) Is Nothing Then
                    Set oArrRange = oCell.CurrentArray
                    Set oRng = Union(oRng, oArrRange)
                End If
            End If
        Next oCell

        sCalcType = "Calculate " & CStr(oRng.Count) & _
            " Cell(s) in Selected Range: "
    Case 2
        sCalcType = "Recalculate Sheet " & ActiveSheet.Name & ": "
    Case 3
        sCalcType = "Recalculate open workbooks: "
    Case 4
        sCalcType = "Full Calculate open workbooks: "
    End Select

' Get start time.
    dTime = MicroTimer
    Select Case jMethod
    Case 1
        If Val(Application.Version) >= 12 Then
            oRng.CalculateRowMajorOrder
        Else
            oRng.Calculate
        End If
    Case 2
        ActiveSheet.Calculate
    Case 3
        Application.Calculate
    Case 4
        Application.CalculateFull
    End Select

' Calc duration.
    dTime = MicroTimer - dTime
    On Error GoTo 0

    dTime = Round(dTime, 5)
    MsgBox sCalcType & " " & CStr(dTime) & " Seconds", _
        vbOKOnly + vbInformation, "CalcTimer"

Finish:

    ' Restore calculation settings.
    If Application.Calculation <> lCalcSave Then
        Application.Calculation = lCalcSave
    End If
    If Application.Iteration <> bIterSave Then
        Application.Calculation = bIterSave
    End If
    Exit Sub
Errhandl:
    On Error GoTo 0
    MsgBox "Unable to Calculate " & sCalcType, _
        vbOKOnly + vbCritical, "CalcTimer"
    GoTo Finish
End Sub


To find bottlenecks using the drill-down approach
1.Ensure that you have only one workbook open and no other tasks are running.

2.Set calculation to manual.

3.Make a backup copy of the workbook.

4.Open the workbook that contains the Calculation Timers macros, or add them to the workbook.

5.Check the used range by pressing CTRL+END on each worksheet in turn.

This shows where the last used cell is. If this is beyond where you expect it to be, consider deleting the excess columns and rows and saving the workbook. For more information, see the Minimizing the Used Range section of this article.

6.Run the FullCalcTimer macro.

The time to calculate all the formulas in the workbook is usually the worst-case time.

7.Run the RecalcTimer macro.

A recalculation immediately after a full calculation usually gives you the best-case time.

8.Calculate workbook volatility as the ratio of recalculation time to full calculation time.

This measures the extent to which volatile formulas and the evaluation of the calculation chain are bottlenecks.

9.Run the SheetTimer macro on each worksheet in turn.

Because you just recalculated the workbook, this gives you the recalculate time for each worksheet. This should enable you to determine which ones are the problem worksheets.

10.Run the RangeTimer macro on selected blocks of formulas.

1.For each problem worksheet, divide the columns or rows into a small number of blocks.


2.Select each block in turn, and then run the RangeTimer macro on the block.


3.If necessary, drill down further by subdividing each block into a smaller number of blocks.


11.Prioritize the bottlenecks.
Avatar billede zjat Nybegynder
06. juli 2010 - 20:52 #11
Tak for det :)

Men vil den funktion ikke bare finde tiden for en beregning? ikke en kørsel af en kode.

Selvom mit engelske er godt er mit VBA ikke godt :)
Avatar billede Slettet bruger
07. juli 2010 - 06:34 #12
Det har du ret i. Men når du har brug for nøjagtigheder mindre end ét sekund og du ikke er god til VBA, så jeg ved jeg ikke rigtig hvad der kan være til hjælp. Du kan eventuelt prøve at se her:

http://support.microsoft.com/default.aspx?scid=kb;en-us;172338

Bemærk at VBA.Timer's resolution is 1 second.

http://vb.mvps.org/samples/StopWatch/
Avatar billede zjat Nybegynder
15. juli 2010 - 16:10 #13
Hej dkhanknu

Jeg giver dig point - tak for den gode hjælp...jeg vil prøve mig frem :)
Avatar billede zjat Nybegynder
28. juli 2010 - 21:04 #14
Hej dkhanknu

Håber du skriver et svar så jeg kan lukke spørgsmålet og takke for din indsats :)

Ellers bliver jeg nok nød til at lukke den selv :(
Avatar billede zjat Nybegynder
27. september 2010 - 14:23 #15
jeg lukker :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester