VBA: Forbedre hastighed og andre bedste fremgangsmåder

Denne vejledning vil diskutere, hvordan du fremskynder VBA -makroer og andre bedste praksis fra VBA.

Indstillinger for at fremskynde VBA -koden

Nedenfor finder du flere tips til at fremskynde din VBA -kode. Tipene er løst organiseret efter betydning.

Den nemmeste måde at forbedre hastigheden på din VBA -kode er ved at deaktivere ScreenUpdating og deaktivere automatiske beregninger. Disse indstillinger bør deaktiveres i alle store procedurer.

Deaktiver skærmopdatering

Som standard viser Excel ændringer til projektmapper i realtid, når VBA-koden kører. Dette medfører en massiv nedgang i behandlingshastigheden, da Excel mest fortolker og viser ændringer for hver kodelinje.

Sådan deaktiveres skærmopdatering:

1 Application.ScreenUpdating = Falsk

I slutningen af ​​din makro skal du tænde for skærmopdatering igen:

1 Application.ScreenUpdating = True

Mens din kode kører, skal du muligvis "opdatere" skærmen. Der er ingen kommando "opdater". I stedet skal du tænde for skærmopdatering igen og deaktivere den igen.

Indstil beregninger til Manuel

Når en celleværdi ændres, skal Excel følge "beregningstræet" for at genberegne alle afhængige celler. Når en formel ændres, skal Excel derudover opdatere "beregningstræet" ud over at genberegne alle afhængige celler. Afhængigt af din projektmappes størrelse kan disse genberegninger få dine makroer til at køre urimeligt langsomt.

Sådan indstilles beregninger til Manuel:

1 Application.Calculation = xlManual

Sådan beregner du hele projektmappen manuelt igen:

1 Beregn

Bemærk, at du også kun kan beregne et ark, område eller individuel celle, hvis det er nødvendigt for forbedret hastighed.

Sådan gendannes automatiske beregninger (ved afslutningen af ​​din procedure):

1 Beregning = xlAutomatisk

Vigtig! Dette er en Excel -indstilling. Hvis du ikke genindstiller beregninger til automatisk, genberegnes din projektmappe ikke, før du fortæller den til.

Du kan se de største forbedringer fra ovenstående indstillinger, men der er flere andre indstillinger, der kan gøre en forskel:

Deaktiver begivenheder

Begivenheder er "udløsere", der forårsager særlige hændelsesprocedurer at løbe. Eksempler omfatter: når en celle i et regneark ændres, når et regneark aktiveres, når en projektmappe åbnes, før en projektmappe gemmes osv.

Deaktivering af hændelser kan forårsage mindre hastighedsforbedringer, når der køres nogen makroer, men hastighedsforbedringen kan være meget større, hvis din projektmappe bruger begivenheder. Og i nogle tilfælde er det nødvendigt at deaktivere begivenheder for at undgå at skabe uendelige sløjfer.

Sådan deaktiverer du begivenheder:

1 Application.EnableEvents = Falsk

Sådan slår du begivenheder til igen:

1 Application.EnableEvents = True

Deaktiver sideskift

Deaktivering af PageBreaks kan hjælpe i visse situationer:

  • Du har tidligere angivet en PageSetup -ejendom til det relevante regneark og din VBA -procedure ændrer egenskaberne for mange rækker eller kolonner
  • ELLER Din VBA -procedure tvinger Excel til at beregne sidebrydninger (viser udskriftseksempel eller ændrer egenskaber for PageSetup).

Sådan deaktiverer du SideBreaks:

1 ActiveSheet.DisplayPageBreaks = Falsk

Sådan genaktiverer du SideBreaks:

1 ActiveSheet.DisplayPageBreaks = True

Bedste fremgangsmåder til at forbedre VBA -hastigheden

Undgå at aktivere og vælge

Når du optager en makro, ser du mange aktiverings- og vælgmetoder:

12345678 Sub Slow_Example ()Ark ("Ark2"). VælgOmråde ("D9"). VælgActiveCell.FormulaR1C1 = "eksempel"Område ("D12"). VælgActiveCell.FormulaR1C1 = "demo"Område ("D13"). VælgAfslut Sub

Aktivering og markering af objekter er normalt unødvendig, de tilføjer rod til din kode, og de er meget tidskrævende. Du bør undgå disse metoder, når det er muligt.

Forbedret eksempel:

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

Undgå at kopiere og indsætte

Kopiering kræver betydelig hukommelse. Desværre kan du ikke fortælle VBA at rydde intern hukommelse. I stedet vil Excel rydde sin interne hukommelse med (tilsyneladende) specifikke intervaller. Så hvis du udfører mange kopierings- og indsætningsoperationer, risikerer du at hugge for meget hukommelse, hvilket drastisk kan bremse din kode eller endda gå ned i Excel.

I stedet for at kopiere og indsætte kan du overveje at angive værdierne for celler.

123456789 Sub CopyPaste ()'LangsommereOmråde ("a1: a1000"). Kopieringsområde ("b1: b1000")'HurtigereOmråde ("b1: b1000"). Værdi = Område ("a1: a1000"). VærdiAfslut Sub

Brug For hver sløjfer i stedet for For sløjfer

Når man går gennem objekter, er For hver loop hurtigere end For Loop. Eksempel:

Dette til sløjfe:

123456 Sub Loop1 ()dim i som RangeFor i = 1 til 100Celler (i, 1). Værdi = 1Næste iAfslut Sub
Er langsommere end dette for hver sløjfe:
123456 Sub Loop2 ()Dim celle som områdeFor hver celle i området ("a1: a100")celle.Værdi = 1Næste celleAfslut Sub

Angiv variabler / brug option eksplicit

VBA kræver ikke, at du erklærer dine variabler, medmindre du tilføjer Option Explicit til toppen af ​​dit modul:
1 Mulighed eksplicit
Tilføjelse af valgmuligheder eksplicit er en kodning af bedste praksis, da det reducerer sandsynligheden for fejl. Det tvinger dig også til at deklarere dine variabler, hvilket øger hastigheden på din kode lidt (fordele er mere mærkbare, jo mere en variabel bruges).Hvordan forhindrer Option Explicit fejl?Den største fordel ved Option Explicit er, at det vil hjælpe dig med at fange stavefejl med variabel navn. For eksempel har vi i det følgende eksempel angivet en variabel med navnet 'var1', men senere henviser vi til variabel med navnet 'varl'. Variablen 'varl' er ikke blevet defineret, så den er blank, hvilket forårsager uventede resultater.
1234 Sub OptionExplicit ()var1 = 10MsgBox varlAfslut Sub

Brug med - slut med erklæringer

Hvis du refererer til de samme objekter flere gange (f.eks. Intervaller, regneark, arbejdsbøger), kan du overveje at bruge With -erklæringen. Det er hurtigere at behandle, kan gøre din kode lettere at læse og forenkler din kode.Med udsagnseksempel:
12345678 Sub hurtigere_eksempel ()Med ark ("Sheet2").Range ("D9"). FormulaR1C1 = "eksempel".Range ("D12"). FormulaR1C1 = "demo".Range ("D9"). Font.Bold = True.Range ("D12"). Font.Bold = TrueAfslut medAfslut Sub
Er hurtigere end:
123456 Sub Slow_Example ()Ark ("Ark2"). Område ("D9"). FormulaR1C1 = "eksempel"Ark ("Sheet2"). Område ("D12"). FormulaR1C1 = "demo"Sheets ("Sheet2"). Range ("D9"). Font.Bold = TrueSheets ("Sheet2"). Range ("D12"). Font.Bold = TrueAfslut Sub

Avancerede tips til bedste praksis

Beskyt kun UserInterface

Det er god praksis at beskytte dine regneark mod at redigere ubeskyttede celler for at forhindre slutbrugeren (eller dig!) I at ødelægge projektmappen ved et uheld. Dette vil imidlertid også beskytte regnearket / regnearkene mod at tillade VBA at foretage ændringer. Så du skal afbeskytte og genbeskytte regneark, hvilket er meget tidskrævende, når det udføres på mange ark.

12345 Sub UnProtectSheet ()Ark ("ark1"). Fjern beskyttelsen af ​​"adgangskode"'Rediger ark 1Ark ("ark1"). Beskyt "adgangskode"Afslut Sub

I stedet kan du beskytte ark ved at indstille UserInterfaceOnly: = True. Dette gør det muligt for VBA at foretage ændringer af ark, mens det stadig beskyttes mod brugeren.

1 Ark ("ark1"). Beskyt adgangskode: = "password", UserInterFaceOnly: = True

Vigtig! UserInterFaceOnly nulstilles til Falsk, hver gang projektmappen åbnes. Så for at bruge denne fantastiske funktion skal du bruge hændelserne Workbook_Open eller Auto_Open til at indstille indstillingen hver gang projektmappen åbnes.

Placer denne kode i Thisworkbook -modulet:

123456 Private Sub Workbook_Open ()Dim ws Som regnearkFor hver gang i regnearkws.Protect Password: = "password", UserInterFaceOnly: = TrueNæste wsAfslut Sub

eller denne kode i ethvert almindeligt modul:

123456 Privat sub Auto_Open ()Dim ws Som regnearkFor hver gang i regnearkws.Protect Password: = "password", UserInterFaceOnly: = TrueNæste wsAfslut Sub

Brug arrays til at redigere store intervaller

Det kan være meget tidskrævende at manipulere store celleområder (eks. 100.000+). I stedet for at sløjfe gennem celleområder, manipulere hver celle, kan du indlæse cellerne i et array, behandle hvert element i arrayet og derefter sende arrayet tilbage til deres originale celler. Indlæsning af cellerne i arrays til manipulation kan være meget hurtigere.

1234567891011121314151617181920212223242526272829303132 Sub LoopRange ()Dim celle som områdeDim tStart som dobbelttStart = TimerFor hver celle i området ("A1: A100000")cell.Value = cell.Value * 100Næste celleDebug.Print (Timer - tStart) & "sekunder"Afslut SubSub LoopArray ()Dim arr Som variantDim element Som variantDim tStart som dobbelttStart = Timerarr = Område ("A1: A100000"). VærdiFor hver vare i arrelement = element * 100Næste elementOmråde ("A1: A100000"). Værdi = arrDebug.Print (Timer - tStart) & "sekunder"Afslut Sub

Du vil bidrage til udviklingen af ​​hjemmesiden, at dele siden med dine venner

wave wave wave wave wave