VBA: Uzlabojiet ātrumu un citu labāko praksi

Šajā apmācībā tiks apspriests, kā paātrināt VBA makro un citu VBA labāko praksi.

Iestatījumi VBA koda paātrināšanai

Zemāk atradīsit vairākus padomus, kā paātrināt VBA kodu. Padomi ir brīvi sakārtoti pēc svarīguma.

Vienkāršākais veids, kā uzlabot VBA koda ātrumu, ir atspējot ekrāna atjaunināšanu un atspējot automātiskos aprēķinus. Šie iestatījumi ir jāatspējo visās lielajās procedūrās.

Atspējot ekrāna atjaunināšanu

Pēc noklusējuma programma Excel parāda darbgrāmatas (-u) izmaiņas reāllaikā, kad darbojas VBA kods. Tas izraisa milzīgu apstrādes ātruma palēnināšanos, jo Excel visbiežāk interpretē un parāda izmaiņas katrai koda rindai.

Lai izslēgtu ekrāna atjaunināšanu:

1 Application.ScreenUpdating = Nepareizi

Makro beigās jums vajadzētu atkal ieslēgt ekrāna atjaunināšanu:

1 Application.ScreenUpdating = Patiess

Kamēr jūsu kods darbojas, iespējams, būs nepieciešams “atsvaidzināt” ekrānu. Nav komandas “atsvaidzināt”. Tā vietā jums būs jāieslēdz ekrāna atjaunināšana un jāatspējo vēlreiz.

Iestatiet Aprēķini uz Manuāli

Ikreiz, kad tiek mainīta šūnas vērtība, programmai Excel jāievēro “aprēķina koks”, lai pārrēķinātu visas atkarīgās šūnas. Turklāt, mainot formulu, programmai Excel papildus visu atkarīgo šūnu pārrēķināšanai būs jāatjaunina “aprēķina koks”. Atkarībā no darbgrāmatas lieluma šie pārrēķini var izraisīt makro makro nepamatoti lēnu darbību.

Lai aprēķinus iestatītu uz Manuāli:

1 Lietojumprogramma. Aprēķins = xlManual

Lai manuāli pārrēķinātu visu darbgrāmatu:

1 Aprēķināt

Ņemiet vērā, ka, lai uzlabotu ātrumu, varat aprēķināt arī tikai lapu, diapazonu vai atsevišķu šūnu.

Lai atjaunotu automātiskos aprēķinus (procedūras beigās):

1 Pielietojums. Aprēķins = xl Automātisks

Svarīgs! Šis ir Excel iestatījums. Ja nemainīsit aprēķinus uz automātisko, darbgrāmata netiks pārrēķināta, kamēr to nebūsiet norādījis.

Jūs redzēsit lielākos uzlabojumus no iepriekš minētajiem iestatījumiem, taču ir vairāki citi iestatījumi, kas var mainīt:

Atspējot notikumus

Notikumi ir “izraisītāji”, kas izraisa īpašu pasākuma procedūras skriet. Piemēri: kad mainās jebkura darblapas šūna, kad darblapa ir aktivizēta, atverot darbgrāmatu, pirms tiek saglabāta darbgrāmata utt.

Notikumu atspējošana var izraisīt nelielus ātruma uzlabojumus, izpildot visus makro, taču ātruma uzlabojums var būt daudz lielāks, ja darbgrāmatā tiek izmantoti notikumi. Un dažos gadījumos notikumu atspējošana ir nepieciešama, lai neradītu nebeidzamas cilpas.

Lai atspējotu notikumus:

1 Application.EnableEvents = Nepareizi

Lai atkal ieslēgtu notikumus:

1 Application.EnableEvents = Patiess

Atspējot PageBreaks

PageBreaks atspējošana var palīdzēt noteiktās situācijās:

  • Iepriekš attiecīgajai darblapai esat iestatījis rekvizītu PageSetup un jūsu VBA procedūra maina daudzu rindu vai kolonnu rekvizītus
  • VAI Jūsu VBA procedūra liek Excel aprēķināt lappušu pārtraukumus (parādot drukas priekšskatījumu vai mainot visus PageSetup rekvizītus).

Lai atspējotu PageBreaks:

1 ActiveSheet.DisplayPageBreaks = Nepareizi

Lai atkārtoti iespējotu PageBreaks:

1 ActiveSheet.DisplayPageBreaks = Patiesa

Labākā prakse VBA ātruma uzlabošanai

Izvairieties no aktivizēšanas un izvēles

Ierakstot makro, jūs redzēsit daudzas aktivizēšanas un atlasīšanas metodes:

12345678 Sub Slow_Example ()Izklājlapas ("Sheet2"). AtlasietDiapazons ("D9"). AtlasietActiveCell.FormulaR1C1 = "piemērs"Diapazons ("D12"). AtlasietActiveCell.FormulaR1C1 = "demonstrācija"Diapazons ("D13"). AtlasietBeigu apakš

Objektu aktivizēšana un atlase parasti nav nepieciešama, tie papildina jūsu kodu un rada daudz laika. Ja iespējams, jums vajadzētu izvairīties no šīm metodēm.

Uzlabots piemērs:

1234 Ātrs_piemērs ()Izklājlapas ("2. lapa"). Diapazons ("D9"). FormulaR1C1 = "piemērs"Izklājlapas ("Sheet2"). Diapazons ("D12"). FormulaR1C1 = "demonstrācija"Beigu apakš

Izvairieties no kopēšanas un ielīmēšanas

Kopēšanai nepieciešama ievērojama atmiņa. Diemžēl jūs nevarat likt VBA iztīrīt iekšējo atmiņu. Tā vietā Excel (šķietami) noteiktos intervālos notīrīs iekšējo atmiņu. Tātad, ja veicat daudzas kopēšanas un ielīmēšanas darbības, jūs riskējat pārāk daudz atmiņas, kas var krasi palēnināt jūsu koda darbību vai pat sabojāt programmu Excel.

Kopēšanas un ielīmēšanas vietā apsveriet iespēju iestatīt šūnu vērtību īpašības.

123456789 Sub CopyPaste ()'LēnākDiapazons ("a1: a1000"). Kopēt diapazonu ("b1: b1000")'ĀtrākDiapazons ("b1: b1000"). Vērtība = diapazons ("a1: a1000"). VērtībaBeigu apakš

Izmantojiet cilpas katrai cilpai, nevis cilpām

Veicot cilpu pa objektiem, cilpa katrai ir ātrāka nekā cilpa. Piemērs:

Šī cilpa:

123456 Apakšcilpa1 ()dim i kā DiapazonsJa i = 1 līdz 100Šūnas (i, 1). Vērtība = 1Tālāk iBeigu apakš
Katrai cilpai tas ir lēnāks:
123456 2. cilpa ()Dim šūna kā diapazonsKatrai diapazona šūnai ("a1: a100")šūna. Vērtība = 1Nākamā šūnaBeigu apakš

Mainīt mainīgos / izmantot opciju Explicit

VBA neprasa deklarēt mainīgos, ja vien moduļa augšdaļai neesat pievienojis opciju Explicit:
1 Skaidrs variants
Opcijas Explicit pievienošana ir labākā kodēšanas prakse, jo tā samazina kļūdu iespējamību. Tas arī liek jums deklarēt mainīgos, kas nedaudz palielina jūsu koda ātrumu (priekšrocības ir pamanāmākas, jo vairāk tiek izmantots mainīgais).Kā Option Explicit novērš kļūdas?Opcijas Explicit lielākais ieguvums ir tas, ka tas palīdzēs noteikt mainīgo nosaukumu pareizrakstības kļūdas. Piemēram, nākamajā piemērā mēs esam iestatījuši mainīgo ar nosaukumu “var1”, bet vēlāk mēs atsaucamies uz mainīgo ar nosaukumu “varl”. Mainīgais “varl” nav definēts, tāpēc tas ir tukšs, izraisot negaidītus rezultātus.
1234 Sub OptionExplicit ()var1 = 10MsgBox varlBeigu apakš

Izmantot ar - Beigt ar paziņojumiem

Ja vairākas reizes atsaucaties uz tiem pašiem objektiem (piemēram, diapazoni, darblapas, darbgrāmatas), apsveriet iespēju izmantot paziņojumu. Tas ir ātrāk apstrādājams, var padarīt jūsu kodu vieglāk lasāmu un vienkāršo jūsu kodu.Ar paziņojuma piemēru:
12345678 Sub Faster_Example ()Ar izklājlapām ("Sheet2").Range ("D9"). FormulaR1C1 = "piemērs". Diapazons ("D12"). FormulaR1C1 = "demonstrācija".Range ("D9"). Fonts. Bold = patiesa.Range ("D12"). Fonts. Bold = patiesaBeigt arBeigu apakš
Ir ātrāks par:
123456 Sub Slow_Example ()Izklājlapas ("2. lapa"). Diapazons ("D9"). FormulaR1C1 = "piemērs"Izklājlapas ("Sheet2"). Diapazons ("D12"). FormulaR1C1 = "demonstrācija"Izklājlapas ("Sheet2"). Diapazons ("D9"). Fonts. Bold = patiesaIzklājlapas ("Sheet2"). Diapazons ("D12"). Fonts. Bold = PatiessBeigu apakš

Uzlaboti labākās prakses padomi

Aizsargājiet tikai lietotāja saskarni

Laba prakse ir aizsargāt savas darblapas no neaizsargātu šūnu rediģēšanas, lai gala lietotājs (vai jūs!) Nejauši nesabojātu darbgrāmatu. Tomēr tas arī pasargās darblapu (-as) no atļaujas VBA veikt izmaiņas. Tāpēc jums ir jāatceļ un jāaizsargā darblapas, kas ir ļoti laikietilpīgi, ja to veic uz daudzām lapām.

12345 Sub UnProtectSheet ()Izklājlapas (“lapa1”). Neaizsargāt paroli ”“Rediģēt lapu1Izklājlapas (“lapa1”). Aizsargājiet paroli ”Beigu apakš

Tā vietā jūs varat aizsargāt lapas, iestatot UserInterfaceOnly: = True. Tas ļauj VBA veikt izmaiņas lapās, vienlaikus aizsargājot tās no lietotāja.

1 Izklājlapas (“lapa1”). Aizsargāt paroli: = "parole", UserInterFaceOnly: = True

Svarīgs! UserInterFaceOnly katru reizi, atverot darbgrāmatu, tiek atiestatīts uz False. Tātad, lai izmantotu šo satriecošo funkciju, jums būs jāizmanto notikumi Workbook_Open vai Auto_Open, lai iestatītu iestatījumu katru reizi, kad tiek atvērta darbgrāmata.

Ievietojiet šo kodu šīs darbgrāmatas modulī:

123456 Privāta apakšdarbgrāmata_atvērt ()Dim ws kā darblapaPar katru ws darblapāsws.Protect Password: = "parole", UserInterFaceOnly: = TrueNākamais wsBeigu apakš

vai šo kodu jebkurā parastajā modulī:

123456 Privāta apakšautomātiskā atvēršana ()Dim ws kā darblapaPar katru ws darblapāsws.Protect Password: = "parole", UserInterFaceOnly: = TrueNākamais wsBeigu apakš

Izmantojiet masīvus, lai rediģētu lielus diapazonus

Tas var aizņemt daudz laika, lai manipulētu ar lieliem šūnu diapazoniem (piem., 100 000+). Tā vietā, lai pārvietotos pa šūnu diapazoniem, manipulējot ar katru šūnu, varat ielādēt šūnas masīvā, apstrādāt katru masīva vienumu un pēc tam izvadīt masīvu atpakaļ sākotnējās šūnās. Šūnu ielāde masīvos manipulācijām var būt daudz ātrāka.

1234567891011121314151617181920212223242526272829303132 Sub LoopRange ()Dim šūna kā diapazonsDim tStart As DoubletStart = taimerisKatrai diapazona šūnai ("A1: A100000")šūna. Vērtība = šūna. Vērtība * 100Nākamā šūnaDebug.Print (taimeris - tStart) un "sekundes"Beigu apakšSub LoopArray ()Dim arr Kā variantsIzgaismot vienumu kā variantuDim tStart As DoubletStart = taimerisarr = Diapazons ("A1: A100000"). VērtībaPar katru preci Ierašanāsvienums = vienums * 100Nākamais vienumsDiapazons ("A1: A100000"). Vērtība = arrDebug.Print (taimeris - tStart) un "sekundes"Beigu apakš

Jums palīdzēs attīstību vietā, daloties lapu ar draugiem

wave wave wave wave wave