VBA: Îmbunătățiți viteza și alte bune practici

Acest tutorial va discuta despre cum să accelerați macro-urile VBA și alte bune practici VBA.

Setări pentru a accelera codul VBA

Mai jos veți găsi mai multe sfaturi pentru a vă accelera codul VBA. Sfaturile sunt organizate în funcție de importanță.

Cel mai simplu mod de a îmbunătăți viteza codului VBA este dezactivând ScreenUpdating și dezactivând Calculele automate. Aceste setări ar trebui să fie dezactivate în toate procedurile mari.

Dezactivați actualizarea ecranului

În mod implicit, Excel va afișa modificările cărților de lucru în timp real, pe măsură ce rulează codul VBA. Acest lucru determină o încetinire masivă a vitezei de procesare, deoarece Excel interpretează și afișează modificările pentru fiecare linie de cod.

Pentru a dezactiva Actualizarea ecranului:

1 Application.ScreenUpdating = Fals

La sfârșitul macro-ului dvs., ar trebui să activați din nou Actualizarea ecranului:

1 Application.ScreenUpdating = Adevărat

În timp ce codul dvs. rulează, poate fi necesar să „reîmprospătați” ecranul. Nu există o comandă de „reîmprospătare”. În schimb, va trebui să reporniți Actualizarea ecranului și să o dezactivați din nou.

Setați Calcule la Manual

Ori de câte ori se schimbă valoarea unei celule, Excel trebuie să urmeze „arborele de calcul” pentru a recalcula toate celulele dependente. În plus, ori de câte ori se modifică o formulă, Excel va trebui să actualizeze „arborele de calcul” în plus față de recalcularea tuturor celulelor dependente. În funcție de dimensiunea registrului de lucru, aceste recalculări pot face ca macro-urile dvs. să ruleze nerezonabil de lent.

Pentru a seta Calculele la Manual:

1 Application.Calculation = xlManual

Pentru a recalcula manual întregul registru de lucru:

1 calculati

Rețineți că, de asemenea, puteți calcula doar o foaie, un interval sau o celulă individuală, dacă este necesar pentru o viteză îmbunătățită.

Pentru a restabili calculele automate (la sfârșitul procedurii):

1 Aplicație.Calcul = xlAutomatic

Important! Aceasta este o setare Excel. Dacă nu restabiliți calculele la automat, registrul dvs. de lucru nu se va recalcula până nu îi spuneți acest lucru.

Veți vedea cele mai mari îmbunătățiri din setările de mai sus, dar există mai multe alte setări care pot face diferența:

Dezactivați evenimentele

Evenimentele sunt „declanșatoare” care cauzează specialități procedurile evenimentului a alerga. Exemplele includ: când se schimbă orice celulă dintr-o foaie de lucru, când este activată o foaie de lucru, când este deschis un registru de lucru, înainte de salvarea unui registru de lucru etc.

Dezactivarea evenimentelor poate provoca îmbunătățiri minore ale vitezei atunci când se execută orice macrocomenzi, dar îmbunătățirea vitezei poate fi mult mai mare dacă registrul dvs. de lucru folosește evenimente. Și, în unele cazuri, dezactivarea evenimentelor este necesară pentru a evita crearea de bucle interminabile.

Pentru a dezactiva evenimentele:

1 Application.EnableEvents = Fals

Pentru a reactiva evenimentele:

1 Application.EnableEvents = Adevărat

Dezactivați PageBreaks

Dezactivarea PageBreaks poate ajuta în anumite situații:

  • Ați setat anterior o proprietate PageSetup pentru foaia de lucru relevantă și procedura VBA modifică proprietățile multor rânduri sau coloane
  • SAU Procedura dvs. VBA forțează Excel să calculeze pagini (afișarea Print Preview sau modificarea oricăror proprietăți ale PageSetup).

Pentru a dezactiva PageBreaks:

1 ActiveSheet.DisplayPageBreaks = Fals

Pentru a reactiva PageBreaks:

1 ActiveSheet.DisplayPageBreaks = Adevărat

Cele mai bune practici pentru a îmbunătăți viteza VBA

Evitați activarea și selectarea

Când înregistrați o macro, veți vedea multe metode de activare și selectare:

12345678 Sub Slow_Example ()Foi („Sheet2”). SelectațiRange ("D9"). SelectațiActiveCell.FormulaR1C1 = "exemplu"Range ("D12"). SelectațiActiveCell.FormulaR1C1 = "demo"Range ("D13"). SelectațiSfârșitul Sub

Activarea și selectarea obiectelor este de obicei inutilă, acestea adaugă dezordine în codul dvs. și consumă foarte mult timp. Ar trebui să evitați aceste metode atunci când este posibil.

Exemplu îmbunătățit:

1234 Sub Rapid_Exemplu ()Foi ("Sheet2"). Interval ("D9"). FormulaR1C1 = "exemplu"Foi ("Sheet2"). Interval ("D12"). FormulaR1C1 = "demo"Sfârșitul Sub

Evitați copierea și lipirea

Copierea necesită memorie semnificativă. Din păcate, nu îi puteți spune VBA să șteargă memoria internă. În schimb, Excel va șterge memoria internă la intervale (aparent) specifice. Deci, dacă efectuați multe operații de copiere și lipire, aveți riscul de a prinde prea multă memorie, ceea ce vă poate încetini drastic codul sau chiar bloca Excel.

În loc să copiați și să lipiți, luați în considerare setarea proprietăților valorice ale celulelor.

123456789 Sub CopyPaste ()'Mai lentGama ("a1: a1000"). Gama de copiere ("b1: b1000")'Mai repedeInterval ("b1: b1000"). Valoare = Interval ("a1: a1000"). ValoareSfârșitul Sub

Utilizați buclele pentru fiecare în loc de buclele

Când faceți o buclă prin obiecte, bucla Pentru fiecare este mai rapidă decât Bucla For. Exemplu:

Acest lucru pentru buclă:

123456 Sub Buclă1 ()dim i ca RangePentru i = 1 până la 100Celule (i, 1). Valoare = 1Apoi euSfârșitul Sub
Este mai lent decât acesta pentru fiecare buclă:
123456 Sub Loop2 ()Dim celula ca intervalPentru fiecare celulă din interval ("a1: a100")cell.Value = 1Următoarea celulăSfârșitul Sub

Declarați variabilele / Opțiunea de utilizare explicită

VBA nu necesită declararea variabilelor, decât dacă adăugați opțiunea explicită în partea de sus a modulului:
1 Opțiune explicită
Adăugarea opțiunii explicite este o bună practică de codificare, deoarece scade probabilitatea de erori. De asemenea, vă obligă să vă declarați variabilele, ceea ce crește ușor viteza codului (beneficiile sunt mai vizibile cu cât este utilizată mai mult o variabilă).Cum previne Option Explicit erori?Cel mai mare beneficiu pentru Option Explicit este că vă va ajuta să prindeți erori de ortografie cu nume variabil. De exemplu, în exemplul următor am setat o variabilă numită „var1”, dar mai târziu facem referire la variabila numită „varl”. Variabila „varl” nu a fost definită, deci este necompletată, provocând rezultate neașteptate.
1234 Sub OptionExplicit ()var1 = 10MsgBox varlSfârșitul Sub

Folosiți cu - Încheiați cu declarații

Dacă faceți referire la aceleași obiecte de mai multe ori (de ex. Gamele, foile de lucru, registrele de lucru), luați în considerare utilizarea instrucțiunii With. Procesarea este mai rapidă, vă poate ușura citirea codului și vă simplifică codul.Cu exemplu de declarație:
12345678 Sub Faster_Example ()Cu foi („Sheet2”).Range ("D9"). FormulaR1C1 = "exemplu".Range ("D12"). FormulaR1C1 = "demo".Range ("D9"). Font.Bold = Adevărat.Range ("D12"). Font.Bold = TrueSe termina cuSfârșitul Sub
Este mai rapid decât:
123456 Sub Slow_Example ()Foi ("Sheet2"). Interval ("D9"). FormulaR1C1 = "exemplu"Foi ("Sheet2"). Interval ("D12"). FormulaR1C1 = "demo"Foi ("Sheet2"). Range ("D9"). Font.Bold = TrueFoi ("Sheet2"). Range ("D12"). Font.Bold = TrueSfârșitul Sub

Sfaturi avansate despre cele mai bune practici

Protejați UserInterfaceOnly

Este o bună practică să vă protejați foile de lucru de la editarea celulelor neprotejate pentru a împiedica utilizatorul final (sau dvs.!) Să corupă accidental registrul de lucru. Cu toate acestea, acest lucru va proteja, de asemenea, foaia (foile) de lucru de a permite VBA să facă modificări. Deci, trebuie să neprotejați și să protejați din nou foile de lucru, ceea ce consumă foarte mult timp când faceți pe multe foi.

12345 Sub UnProtectSheet ()Foi de calcul („foaia1”). Anulați protecția „parolei”'Editați foaia1Foi de calcul („foaia1”). Protejați „parola”Sfârșitul Sub

În schimb, puteți proteja foile cu setarea UserInterfaceOnly: = True. Acest lucru permite VBA să facă modificări în coli, protejându-le totuși de utilizator.

1 Foi de calcul („sheet1”). Protejați parola: = "parolă", UserInterFaceOnly: = True

Important! UserInterFaceOnly se resetează la False de fiecare dată când se deschide registrul de lucru. Deci, pentru a utiliza această caracteristică minunată, va trebui să utilizați evenimentele Workbook_Open sau Auto_Open pentru a seta setarea de fiecare dată când se deschide registrul de lucru.

Plasați acest cod în modulul Thisworkbook:

123456 Private Sub Workbook_Open ()Dim ws Ca foaie de lucruPentru fiecare ws din foi de lucruws.Protect Password: = "parolă", UserInterFaceOnly: = AdevăratUrmătorul wsSfârșitul Sub

sau acest cod în orice modul obișnuit:

123456 Private Sub Auto_Open ()Dim ws Ca foaie de lucruPentru fiecare ws din foi de lucruws.Protect Password: = "parolă", UserInterFaceOnly: = AdevăratUrmătorul wsSfârșitul Sub

Utilizați matrice pentru a edita game mari

Poate fi nevoie de mult timp pentru a manipula game mari de celule (ex. 100.000+). În loc să parcurgeți intervalul de celule, să manipulați fiecare celulă, puteți încărca celulele într-o matrice, puteți procesa fiecare element din matrice și apoi puteți scoate matricea înapoi în celulele lor originale. Încărcarea celulelor în tablouri pentru manipulare poate fi mult mai rapidă.

1234567891011121314151617181920212223242526272829303132 Sub LoopRange ()Dim celula ca intervalDim t Începeți ca dublutStart = TimerPentru fiecare celulă din interval ("A1: A100000")cell.Value = celula.Valoare * 100Următoarea celulăDebug.Print (Timer - tStart) & „secunde”Sfârșitul SubSub LoopArray ()Dim arr As VariantReduceți elementul ca variantăDim t Începeți ca dublutStart = Timerarr = Range ("A1: A100000"). ValoarePentru fiecare articol În aritem = item * 100Următorul elementGama ("A1: A100000"). Valoare = arrDebug.Print (Timer - tStart) & „secunde”Sfârșitul Sub

Vei ajuta la dezvoltarea site-ului, partajarea pagina cu prietenii

wave wave wave wave wave