VBA til Excel 2016 er hurtig, men den er ikke altid hurtig nok. (Computerprogrammer er aldrig hurtige nok.) Fortsæt med at læse for at finde nogle programmeringseksempler, du kan bruge til at fremskynde dine makroer.
Slår skærmopdatering fra
Når du udfører en makro, kan du læne dig tilbage og se al den handling på skærmen, der sker i makroen. Selvom det kan være lærerigt at gøre dette, efter at du har fået makroen til at fungere korrekt, er det ofte irriterende og kan bremse ydeevnen af din makro betydeligt. Heldigvis kan du deaktivere den skærmopdatering, der normalt sker, når du udfører en makro. For at deaktivere skærmopdatering skal du bruge følgende erklæring:
Application.ScreenUpdating = Falsk
Hvis du ønsker, at brugeren skal se, hvad der sker på et hvilket som helst tidspunkt under makroen, skal du bruge følgende erklæring til at slå skærmopdatering til igen:
Application.ScreenUpdating = Sand
For at demonstrere forskellen i hastighed skal du udføre denne simple makro, som udfylder et område med tal:
Sub FillRange()
Dim r som lang, c så lang
Dim nummer så langt
Tal = 0
For r = 1 til 50
For c = 1 til 50
Tal = Tal + 1
Celler(r, c). Vælg
Celler(r, c).Værdi = Antal
Næste c
Næste r
Slut Sub
Du ser, at hver celle bliver valgt, og værdien indtastes i cellerne. Indsæt nu følgende sætning i begyndelsen af proceduren og udfør den igen:
Application.ScreenUpdating = Falsk
Området udfyldes meget hurtigere, og du ser ikke resultatet før makroen er færdig med at køre og skærmopdatering er (automatisk) sat til True.
Når du fejlfinder kode, slutter programkørsel nogle gange et sted i midten, uden at du har slået skærmopdatering til igen. Dette får nogle gange Excel's programvindue til at blive fuldstændig uresponsive. Vejen ud af denne frosne tilstand er enkel: Gå tilbage til VBE, og udfør følgende sætning i vinduet Umiddelbart:
Application.ScreenUpdating = Sand
Deaktivering af automatisk beregning
Hvis du har et regneark med mange komplekse formler, kan du opleve, at du kan fremskynde tingene betydeligt ved at indstille beregningstilstanden til manuel, mens din makro udføres. Når makroen er færdig, skal du indstille beregningstilstanden tilbage til automatisk.
Følgende erklæring indstiller Excel-beregningstilstanden til manuel:
Application.Calculation = xlCalculationManual
Udfør den næste sætning for at indstille beregningstilstanden til automatisk:
Application.Calculation = xlCalculationAutomatic
Hvis din kode bruger celler med formelresultater, betyder det at slå beregning fra, at cellerne ikke bliver genberegnet, medmindre du udtrykkeligt beder Excel om at gøre det!
Fjernelse af disse irriterende advarselsmeddelelser
Som du ved, kan en makro automatisk udføre en række handlinger. I mange tilfælde kan du starte en makro og så hænge ud i pauserummet, mens Excel gør sit. Nogle Excel-handlinger viser dog meddelelser, der kræver et menneskeligt svar. Disse typer meddelelser betyder, at du ikke kan efterlade Excel uden opsyn, mens den udfører din makro - medmindre du kender det hemmelige trick.
Du kan instruere Excel til ikke at vise disse typer advarsler, mens du kører en makro.
Det hemmelige trick til at undgå disse advarselsmeddelelser er at indsætte følgende VBA-sætning i din makro:
Application.DisplayAlerts = Falsk
Excel udfører standardhandlingen for disse typer meddelelser. I tilfælde af sletning af et ark er standardhandlingen Slet. Hvis du ikke er sikker på, hvad standardhandlingen er, skal du udføre en test for at se, hvad der sker.
Når proceduren afsluttes, nulstiller Excel automatisk egenskaben DisplayAlerts til True. Hvis du har brug for at slå advarslerne til igen, før proceduren slutter, skal du bruge denne erklæring:
Application.DisplayAlerts = Sand
Forenkling af objektreferencer
Som du sikkert allerede ved, kan referencer til objekter blive meget lange. For eksempel kan en fuldt kvalificeret reference til et Range-objekt se sådan ud:
Workbooks(“MyBook.xlsx”).Worksheets(“Sheet1”) _
.Range(“Rente”)
Hvis din makro ofte bruger dette område, vil du måske oprette en objektvariabel ved at bruge kommandoen Set. For eksempel tildeler følgende sætning dette Range-objekt til en objektvariabel ved navn Rate:
Set Rate = Workbooks(“MyBook.xlsx”) _
.Worksheets(“Sheet1”).Range(“Rente”)
Efter at have defineret denne objektvariabel, kan du bruge variablen Rate i stedet for den lange reference. For eksempel kan du ændre værdien af cellen med navnet RenteRate:
Sats.Værdi = 0,085
Dette er meget nemmere at skrive end følgende udsagn:
Arbejdsbøger ("MyBook.xlsx"). Arbejdsark ("Ark1"). _
Range(“Rente”) = .085
Ud over at forenkle din kodning, fremskynder brugen af objektvariable dine makroer betydeligt.
Erklæring af variabeltyper
Du behøver normalt ikke bekymre dig om den type data, du tildeler en variabel. Excel håndterer alle detaljerne for dig bag kulisserne. For eksempel, hvis du har en variabel ved navn MyVar, kan du tildele et nummer af enhver type til den variabel. Du kan endda tildele en tekststreng til den senere i proceduren.
Hvis du ønsker, at dine procedurer skal udføres så hurtigt som muligt, skal du fortælle Excel, hvilken type data der vil blive tildelt hver af dine variabler. Dette er kendt som at erklære en variabels type.
Generelt bør du bruge den datatype, der kræver det mindste antal bytes, men stadig kan håndtere alle de data, der er tildelt den. Når VBA arbejder med data, afhænger eksekveringshastigheden af antallet af bytes VBA har til rådighed. Med andre ord, jo færre bytes data bruger, jo hurtigere kan VBA få adgang til og manipulere dataene. En undtagelse fra dette er datatypen heltal. Hvis hastigheden er kritisk, skal du bruge datatypen Lang i stedet.
Hvis du bruger en objektvariabel, kan du erklære variablen som en bestemt objekttype. Her er et eksempel:
Dæmp rate som rækkevidde
Set Rate = Workbooks(“MyBook.xlsx”) _
.Worksheets(“Sheet1”).Range(“Rente”)
Brug af With-End With-strukturen
Skal du indstille et antal egenskaber for et objekt? Din kode kører hurtigere, hvis du bruger With-End With-strukturen. En yderligere fordel er, at din kode kan være lettere at læse.
Følgende kode bruger ikke With-End With:
Selection.Horizontal Alignment = xlCenter
Selection.VerticalAlignment = xlCenter
Selection.WrapText = Sand
Selection.Orientation = 0
Selection.ShrinkToFit = Falsk
Selection.MergeCells = Falsk
Her er den samme kode, omskrevet til at bruge With-End With:
Med Udvalg
.Horizontal Alignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = Sand
.Orientering = 0
.ShrinkToFit = Falsk
.MergeCells = Falsk
Slut med
Når du bruger With-End With, skal du sørge for, at hver sætning begynder med en prik.