VBA: Forbedre hastighet og andre gode fremgangsmåter

Denne opplæringen vil diskutere hvordan du kan få fart på VBA -makroer og andre gode fremgangsmåter for VBA.

Innstillinger for å få fart på VBA -koden

Nedenfor finner du flere tips for å få fart på VBA -koden din. Tipsene er løst organisert etter viktighet.

Den enkleste måten å forbedre hastigheten på VBA -koden din er ved å deaktivere ScreenUpdating og deaktivere automatiske beregninger. Disse innstillingene bør deaktiveres i alle store prosedyrer.

Deaktiver skjermoppdatering

Som standard vil Excel vise endringer i arbeidsboken (e) i sanntid når VBA-koden kjøres. Dette forårsaker en massiv nedgang i behandlingshastigheten ettersom Excel mest tolker og viser endringer for hver kodelinje.

Slik slår du av skjermoppdatering:

1 Application.ScreenUpdating = Falsk

På slutten av makroen bør du slå på skjermoppdatering igjen:

1 Application.ScreenUpdating = True

Mens koden din kjører, må du kanskje "oppdatere" skjermen. Det er ingen "refresh" -kommando. I stedet må du slå på Skjermoppdatering igjen og deaktivere den igjen.

Sett beregninger til Manuell

Når en celleverdi endres, må Excel følge "beregningstreet" for å beregne alle avhengige celler på nytt. I tillegg, når en formel endres, må Excel oppdatere "beregningstreet" i tillegg til å beregne alle avhengige celler på nytt. Avhengig av arbeidsbokstørrelsen, kan disse nyberegningene føre til at makroene dine går urimelig sakte.

Slik setter du beregninger til manuell:

1 Application.Calculation = xlManual

Slik beregner du hele arbeidsboken manuelt:

1 Regne ut

Merk at du også kan beregne bare et ark, område eller individuell celle, om nødvendig for forbedret hastighet.

For å gjenopprette automatiske beregninger (på slutten av prosedyren):

1 Application.Calculation = xlAutomatic

Viktig! Dette er en Excel -innstilling. Hvis du ikke setter ut beregninger til automatisk, vil regnboken ikke beregne på nytt før du har fortalt det til det.

Du vil se de største forbedringene fra innstillingene ovenfor, men det er flere andre innstillinger som kan gjøre en forskjell:

Deaktiver hendelser

Hendelser er "utløsere" som forårsaker spesielle hendelsesprosedyrer å løpe. Eksempler inkluderer: når en celle i et regneark endres, når et regneark aktiveres, når en arbeidsbok åpnes, før en arbeidsbok blir lagret, etc.

Deaktivering av hendelser kan føre til mindre hastighetsforbedringer når noen makroer kjøres, men hastighetsforbedringen kan være mye større hvis arbeidsboken din bruker hendelser. Og i noen tilfeller er det nødvendig å deaktivere hendelser for å unngå å lage endeløse sløyfer.

Slik deaktiverer du hendelser:

1 Application.EnableEvents = Falsk

Slik slår du hendelser på igjen:

1 Application.EnableEvents = True

Deaktiver sideskift

Deaktivering av PageBreaks kan hjelpe i visse situasjoner:

  • Du har tidligere angitt en PageSetup -egenskap for det relevante regnearket og din VBA -prosedyre endrer egenskapene til mange rader eller kolonner
  • ELLER VBA -prosedyren din tvinger Excel til å beregne sidebryter (viser forhåndsvisning av utskrift eller endrer egenskapene til PageSetup).

Slik deaktiverer du sidebryter:

1 ActiveSheet.DisplayPageBreaks = Falsk

Slik aktiverer du SideBreaks på nytt:

1 ActiveSheet.DisplayPageBreaks = True

Beste fremgangsmåter for å forbedre VBA -hastigheten

Unngå å aktivere og velge

Når du spiller inn en makro, vil du se mange metoder for aktivering og valg:

12345678 Sub Slow_Example ()Ark ("Ark2"). VelgOmråde ("D9"). VelgActiveCell.FormulaR1C1 = "eksempel"Område ("D12"). VelgActiveCell.FormulaR1C1 = "demo"Område ("D13"). VelgSlutt Sub

Å aktivere og velge objekter er vanligvis unødvendig, de legger rot i koden din, og de er veldig tidkrevende. Du bør unngå disse metodene når det er mulig.

Forbedret eksempel:

1234 Sub Fast_Example ()Ark ("Ark2"). Område ("D9"). FormulaR1C1 = "eksempel"Ark ("Ark2"). Område ("D12"). FormulaR1C1 = "demo"Slutt Sub

Unngå kopiering og liming

Kopiering krever betydelig hukommelse. Dessverre kan du ikke be VBA om å slette internminnet. I stedet sletter Excel det interne minnet med (tilsynelatende) spesifikke intervaller. Så hvis du utfører mange kopier og lim inn -operasjoner, risikerer du å tappe for mye minne, noe som kan redusere koden din drastisk eller til og med krasje Excel.

I stedet for å kopiere og lime inn, bør du vurdere å angi verdiegenskapene til celler.

123456789 Sub CopyPaste ()'SaktereOmråde ("a1: a1000"). Kopier område ("b1: b1000")'RaskereOmråde ("b1: b1000"). Verdi = Område ("a1: a1000"). VerdiSlutt Sub

Bruk For hver sløyfe i stedet for For sløyfer

Når du går gjennom objekter, er For Hver sløyfe raskere enn For Loop. Eksempel:

This For Loop:

123456 Sub Loop1 ()dim i som RangeFor i = 1 til 100Celler (i, 1). Verdi = 1Neste jegSlutt Sub
Er tregere enn dette for hver løkke:
123456 Sub Loop2 ()Dim cell As RangeFor hver celle i området ("a1: a100")celle.Value = 1Neste celleSlutt Sub

Deklarere variabler / bruk alternativ eksplisitt

VBA krever ikke at du deklarerer variablene dine, med mindre du legger til Option Explicit øverst i modulen:
1 Alternativ Eksplisitt
Å legge til Option Explicit er en god praksis for koding, ettersom det reduserer sannsynligheten for feil. Det tvinger deg også til å deklarere variablene dine, noe som øker hastigheten på koden din litt (fordelene er mer merkbare jo mer en variabel brukes).Hvordan forhindrer Option Explicit feil?Den største fordelen med Option Explicit er at den vil hjelpe deg med å fange stavefeil med variabel navn. For eksempel har vi i det følgende eksemplet angitt en variabel som heter 'var1', men senere refererer vi til variabelen som heter 'varl'. Variabelen 'varl' er ikke definert, så den er blank og forårsaker uventede resultater.
1234 Sub OptionExplicit ()var1 = 10MsgBox varlSlutt Sub

Bruk med - avslutt med utsagn

Hvis du refererer til de samme objektene flere ganger (f.eks. Områder, regneark, arbeidsbøker), bør du vurdere å bruke With -setningen. Den er raskere å behandle, kan gjøre koden lettere å lese og forenkle koden.Med uttalelseseksempel:
12345678 Sub Raskere_Eksempel ()Med ark ("Sheet2").Range ("D9"). FormulaR1C1 = "eksempel".Range ("D12"). FormulaR1C1 = "demo".Range ("D9"). Font.Bold = True.Range ("D12"). Font.Bold = TrueSlutt medSlutt Sub
Er raskere enn:
123456 Sub Slow_Example ()Ark ("Ark2"). Område ("D9"). FormulaR1C1 = "eksempel"Ark ("Ark2"). Område ("D12"). FormulaR1C1 = "demo"Ark ("Ark2"). Område ("D9"). Font.Bold = TrueArk ("Ark2"). Område ("D12"). Font.Bold = TrueSlutt Sub

Avanserte tips for beste praksis

Beskytt kun UserInterface

Det er god praksis å beskytte regnearkene dine mot å redigere ubeskyttede celler for å forhindre at sluttbrukeren (eller deg!) Ved et uhell ødelegger arbeidsboken. Dette vil imidlertid også beskytte regnearket (e) mot at VBA kan gjøre endringer. Så du må fjerne og beskytte regneark, noe som er veldig tidkrevende når det gjøres på mange ark.

12345 Sub UnProtectSheet ()Ark ("ark1"). Fjern beskyttelsen av "passord"'Rediger ark 1Ark ("ark1"). Beskytt "passord"Slutt Sub

I stedet kan du beskytte ark med innstillingen UserInterfaceOnly: = True. Dette gjør at VBA kan gjøre endringer i ark, samtidig som de beskytter dem mot brukeren.

1 Ark ("ark1"). Beskytt passord: = "passord", UserInterFaceOnly: = True

Viktig! UserInterFaceOnly tilbakestilles til Falsk hver gang arbeidsboken åpnes. Så for å bruke denne fantastiske funksjonen, må du bruke Workbook_Open eller Auto_Open -hendelsene for å angi innstillingen hver gang arbeidsboken åpnes.

Plasser denne koden i Thisworkbook -modulen:

123456 Private Sub Workbook_Open ()Dim ws Som regnearkFor hver uke i regnearkws.Protect Password: = "password", UserInterFaceOnly: = TrueNeste wsSlutt Sub

eller denne koden i en vanlig modul:

123456 Privat sub Auto_Open ()Dim ws Som regnearkFor hver uke i regnearkws.Protect Password: = "password", UserInterFaceOnly: = TrueNeste wsSlutt Sub

Bruk matriser til å redigere store områder

Det kan være svært tidkrevende å manipulere store celleområder (eks. 100 000+). I stedet for å sløyfe gjennom celleområder, manipulere hver celle, kan du laste cellene inn i en matrise, behandle hvert element i matrisen og deretter sende matrisen tilbake til de opprinnelige cellene. Lasting av cellene i matriser for manipulasjon kan være mye raskere.

1234567891011121314151617181920212223242526272829303132 Sub LoopRange ()Dim cell As RangeDim tStart as DoubletStart = TimerFor hver celle i området ("A1: A100000")cell.Value = cell.Value * 100Neste celleDebug.Print (Timer - tStart) og "sekunder"Slutt SubSub LoopArray ()Dim arr Som variantDim element Som variantDim tStart as DoubletStart = Timerarr = Område ("A1: A100000"). VerdiFor hvert element i arrelement = element * 100Neste elementOmråde ("A1: A100000"). Verdi = arrDebug.Print (Timer - tStart) og "sekunder"Slutt Sub

Du vil bidra til utvikling av området, dele siden med vennene dine

wave wave wave wave wave