Just nu i M3-nätverket
Gå till innehåll

Körtidsproblem


short

Rekommendera Poster

Jag har två körtidsproblem:

1. Följande kod genomlöps tre ggr (tre olika flikar där citerad kod är för den första fliken)

For c = 58 To 2298 Step 56
            Range(Range("AnslagJan").Cells(c, 1), Range("AnslagJan").Cells(c + 7, 12)) = 0
            Range(Range("AnslagJan").Cells(c + 9, 1), Range("AnslagJan").Cells(c + 9, 12)) = 0
            Range(Range("AnslagJan").Cells(c + 11, 1), Range("AnslagJan").Cells(c + 13, 12)) = 0
            Range(Range("AnslagJan").Cells(c + 15, 1), Range("AnslagJan").Cells(c + 17, 12)) = 0
            Range(Range("AnslagJan").Cells(c + 19, 1), Range("AnslagJan").Cells(c + 24, 12)) = 0
            Range(Range("AnslagJan").Cells(c + 26, 1), Range("AnslagJan").Cells(c + 30, 12)) = 0
            Range(Range("AnslagJan").Cells(c + 32, 1), Range("AnslagJan").Cells(c + 34, 12)) = 0
            Range(Range("AnslagJan").Cells(c + 36, 1), Range("AnslagJan").Cells(c + 39, 12)) = 0
            Range(Range("AnslagJan").Cells(c + 42, 1), Range("AnslagJan").Cells(c + 47, 12)) = 0
        Next c

Det är alltså 4560 rader där 12 celler på varje rad ska nollas. Det tar ca 24 sek eller 8 sek per fik..

 

2. Följande kod genomlöps en gång:

For rad = 171 To 2355 Step 56
        For månad = 13 - Z To 12
            Sheets("Avgifter").Cells(rad, månad + 16) = _
            Sheets("Avgifter").Cells(rad - 27, månad + 16) * Sheets("Avgifter").Cells(rad - 48, 13)
            Sheets("Bidrag").Cells(rad, månad + 16) = _
            Sheets("Bidrag").Cells(rad - 27, månad + 16) * Sheets("Bidrag").Cells(rad - 48, 13)
        Next månad
    Next rad

Det är alltså två flikar med vardera 80 rader där som mest 12 celler ska beräknas (Z står för antal månader som väljs och kan variera mellan 12 - 1. Det maximala antalet är alltså 160 rader med 12 celler vardera. Körtiden är i max-fallet 20 sek.

 

Finns det någon smartare kod som ger samma resultat i fall 1 respektive fall 2 på kortare tid?

Länk till kommentar
Dela på andra webbplatser

Grundtips ett:

 

Lägg in

Application.Calculation = xlCalculationManual

i början av koden och

Application.Calculation = xlCalculationAutomatic

i slutet av koden. Gärna inom felhantera så att den sista raden ALLTID körs. Även om fel.

 

Du kan även testa med

Application.Screenupdating  = False

i början av koden.

 

 

Ett annat sätt att optimera kod 1 på är att klumpa ihop skrivningarna, att lägga in alla områden som ska nollas i ett Range-objekt som tilldelas värdet noll. Kanske fungerar men pröva de två ovan först. Borde kapa ned tiden till en tiondel av vad du har nu.

Länk till kommentar
Dela på andra webbplatser

ScreenUpdating hade jag redan men CalculationManual gjorde revolution. Körtiden i fall 1 gick från 24 sek till 1,5 sek och i fall 2 från 20 sek till 1 sek. :D

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...