Hej!
Du kan i koden skriva:
Debug.Print "Metoden X började: " & time
Debug.Print "Metoden X slutade: " & time
På så vis kan du se vilka metoder som tar längst tid.
Men de vanligaste två skälen till att beräkningar tar tid är att man
a) arbetar för mycket mot kalkylbladen direkt
b) har en massa andra beräkningar som uppdateras parallellt när man uppdaterar något annat
Det enklaste att rätta till är b. Du skriver då i din kod när en metod börjar:
Application.Calculation = xlManual
När metoden är klar skriver du
Application.Calculation = xlAutomatic
Du bör även ha en skrivning
On Error Goto catch:
och skriva
catch:
Application.Calculation = xlAutomatic
så att du vid eventuellt fel inte råkar ut för att kalkyleringen är avstängd.
Med kalkyleringen avstängd kommer du inte att få en massa parallella uppdateringar som slöar ned det hela utan allt görs i ett svep på slutet.
Problem a) är om du skriver till cell efter cell... Det är jätteslött men det är så många gör... Det rätta är att skriva till ett helt område direkt. Man arbetar då med en matris och hämtar in data från ett område till matrisen, bearbetar matrisen och skriver sedan ut matrisen till kalkylbladetet i en enda skrivning.
Koden nedan visar hur jag hämtar data från ett område i Blad1 till en matris. Området är från början tomt och varje cell får ett värde som är radnummer + kolumnnummer.
Koden avslutas med att jag till cell D2 skriver ut matrisen. Jag använder mig av resize för att göra om rangen D2 till det område som är lika högt och brett som min matris.
Vid första körningen får cellerna värde enligt formeln radnummer + kolumnnummer.
Vid andra körninen kommer cellernas värde att räknas upp med 1 jämfört med första körningens resultat.
Public Sub Test()
Dim varMatris As Variant
Dim iRad As Integer
Dim iKolumn As Integer
varMatris = Blad1.Range("D2:F10").Value
For iRad = 1 To UBound(varMatris, 1)
For iKolumn = 1 To UBound(varMatris, 2)
If varMatris(iRad, iKolumn) = "" Then
varMatris(iRad, iKolumn) = iRad + iKolumn
Else
varMatris(iRad, iKolumn) = varMatris(iRad, iKolumn) + 1
End If
Next
Next
Blad1.Range("D2").Resize(UBound(varMatris, 1), UBound(varMatris, 2)).Value = varMatris
End Sub
mvh
/Kihlman