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

LÖST Körtidsproblem

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?

Dela detta inlägg


Länk till inlägg
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.

Dela detta inlägg


Länk till inlägg
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

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×
×
  • Skapa nytt...