VBA för Excel 2016 är snabbt, men det är inte alltid tillräckligt snabbt. (Datorprogram är aldrig tillräckligt snabba.) Fortsätt läsa för att upptäcka några programmeringsexempel som du kan använda för att snabba upp dina makron.
Stänger av skärmuppdatering
När du kör ett makro kan du luta dig tillbaka och titta på alla åtgärder på skärmen som sker i makrot. Även om det kan vara lärorikt att göra detta, är det ofta irriterande efter att du fått makrot att fungera ordentligt och kan sakta ner prestandan för ditt makro avsevärt. Lyckligtvis kan du inaktivera skärmuppdateringen som normalt sker när du kör ett makro. För att stänga av skärmuppdatering, använd följande uttalande:
Application.ScreenUpdating = Falskt
Om du vill att användaren ska se vad som händer när som helst under makrot, använd följande uttalande för att aktivera skärmuppdateringen igen:
Application.ScreenUpdating = Sant
För att visa skillnaden i hastighet, kör detta enkla makro, som fyller ett intervall med siffror:
Sub FillRange()
Dim r som lång, c så lång
Dim nummer lika lång
Tal = 0
För r = 1 till 50
För c = 1 till 50
Nummer = siffra + 1
Celler(r, c). Välj
Celler(r, c).Värde = Antal
Nästa c
Nästa r
Avsluta Sub
Du ser att varje cell markeras och värdet skrivs in i cellerna. Infoga nu följande sats i början av proceduren och kör den igen:
Application.ScreenUpdating = Falskt
Området fylls mycket snabbare och du ser inte resultatet förrän makrot är klart och skärmuppdateringen är (automatiskt) inställd på True.
När du felsöker kod slutar programkörningen ibland någonstans i mitten utan att du har aktiverat skärmuppdatering igen. Detta gör ibland att Excels programfönster inte svarar helt. Vägen ut ur detta frusna tillstånd är enkel: Gå tillbaka till VBE och kör följande sats i fönstret Immediate:
Application.ScreenUpdating = Sant
Stänger av automatisk beräkning
Om du har ett kalkylblad med många komplexa formler kan du upptäcka att du kan påskynda saker och ting avsevärt genom att ställa in beräkningsläget till manuellt medan ditt makro körs. När makrot är klart, ställ tillbaka beräkningsläget till automatiskt.
Följande sats ställer in Excel-beräkningsläget till manuellt:
Application.Calculation = xlCalculationManual
Kör nästa programsats för att ställa in beräkningsläget till automatiskt:
Application.Calculation = xlCalculationAutomatic
Om din kod använder celler med formelresultat, innebär det att stänga av beräkning att cellerna inte kommer att räknas om om du inte uttryckligen säger åt Excel att göra det!
Eliminera dessa irriterande varningsmeddelanden
Som du vet kan ett makro automatiskt utföra en rad åtgärder. I många fall kan du starta ett makro och sedan gå och hänga i pausrummet medan Excel gör sitt. Vissa Excel-operationer visar dock meddelanden som kräver ett mänskligt svar. Dessa typer av meddelanden innebär att du inte kan lämna Excel obevakad medan det kör ditt makro - om du inte känner till det hemliga tricket.

Du kan instruera Excel att inte visa dessa typer av varningar när du kör ett makro.
Det hemliga tricket för att undvika dessa varningsmeddelanden är att infoga följande VBA-uttalande i ditt makro:
Application.DisplayAlerts = False
Excel kör standardoperationen för dessa typer av meddelanden. Vid radering av ett ark är standardåtgärden Ta bort. Om du inte är säker på vad standardåtgärden är, utför ett test för att se vad som händer.
När proceduren avslutas återställer Excel automatiskt egenskapen DisplayAlerts till True. Om du behöver aktivera varningarna igen innan proceduren avslutas, använd detta uttalande:
Application.DisplayAlerts = Sant
Förenkla objektreferenser
Som du säkert redan vet kan referenser till föremål bli mycket långa. Till exempel kan en fullt kvalificerad referens till ett Range-objekt se ut så här:
Arbetsböcker(“MyBook.xlsx”).Arbetsblad(“Sheet1”) _
.Range(“Räntesats”)
Om ditt makro ofta använder detta intervall, kanske du vill skapa en objektvariabel genom att använda kommandot Set. Till exempel tilldelar följande sats detta Range-objekt till en objektvariabel med namnet Rate:
Set Rate = Workbooks(“MyBook.xlsx”) _
.Worksheets(“Sheet1”).Range(“Räntesats”)
Efter att ha definierat denna objektvariabel kan du använda variabeln Rate snarare än den långa referensen. Du kan till exempel ändra värdet på cellen som heter InterestRate:
Rate.Value = 0,085
Detta är mycket lättare att skriva än följande påstående:
Arbetsböcker(“MyBook.xlsx”).Arbetsblad(“Sheet1”). _
Range(“Räntesats”) = .085
Förutom att förenkla din kodning, snabbar du upp dina makron avsevärt genom att använda objektvariabler.
Deklarera variabeltyper
Du behöver vanligtvis inte oroa dig för vilken typ av data du tilldelar en variabel. Excel hanterar alla detaljer för dig bakom kulisserna. Till exempel, om du har en variabel som heter MyVar, kan du tilldela ett nummer av vilken typ som helst till den variabeln. Du kan till och med tilldela en textsträng till den senare i proceduren.
Om du vill att dina procedurer ska köras så snabbt som möjligt, berätta för Excel vilken typ av data som kommer att tilldelas var och en av dina variabler. Detta är känt som att deklarera en variabels typ.
I allmänhet bör du använda den datatyp som kräver det minsta antalet byte men ändå kan hantera all data som tilldelats den. När VBA arbetar med data beror exekveringshastigheten på antalet byte VBA har till sitt förfogande. Med andra ord, ju färre byte data använder, desto snabbare kan VBA komma åt och manipulera data. Ett undantag från detta är datatypen heltal. Om hastigheten är kritisk, använd datatypen Lång istället.
Om du använder en objektvariabel kan du deklarera variabeln som en viss objekttyp. Här är ett exempel:
Dimhastighet som intervall
Set Rate = Workbooks(“MyBook.xlsx”) _
.Worksheets(“Sheet1”).Range(“Räntesats”)
Använda With-End With-strukturen
Behöver du ställa in ett antal egenskaper för ett objekt? Din kod körs snabbare om du använder strukturen With-End With. En ytterligare fördel är att din kod kan vara lättare att läsa.
Följande kod använder inte With-End With:
Selection.Horizontal Alignment = xlCenter
Selection.VerticalAlignment = xlCenter
Selection.WrapText = Sant
Urval. Orientering = 0
Selection.ShrinkToFit = Falskt
Selection.MergeCells = False
Här är samma kod, omskriven för att använda With-End With:
Med urval
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = Sant
.Orientering = 0
.ShrinkToFit = Falskt
.MergeCells = Falskt
Sluta med
När du använder With-End With, se till att varje påstående börjar med en prick.