VBA: Poboljšajte brzinu i druge najbolje prakse

Ovaj vodič će raspravljati o tome kako ubrzati VBA makronaredbe i druge VBA najbolje prakse.

Postavke za ubrzavanje VBA koda

U nastavku ćete pronaći nekoliko savjeta za ubrzanje vašeg VBA koda. Savjeti su labavo organizirani prema važnosti.

Najjednostavniji način za poboljšanje brzine vašeg VBA koda je onemogućavanje ažuriranja zaslona i onemogućavanje automatskih izračuna. Ove postavke trebaju biti onemogućene u svim velikim postupcima.

Onemogućite ažuriranje zaslona

Prema zadanim postavkama, Excel će prikazati promjene u radnoj knjizi u stvarnom vremenu tijekom izvođenja VBA koda. To uzrokuje veliko usporavanje brzine obrade jer Excel većina tumači i prikazuje promjene za svaki redak koda.

Da biste isključili ažuriranje zaslona:

1 Application.ScreenUpdating = Netačno

Na kraju makronaredbe trebate ponovno uključiti ažuriranje zaslona:

1 Application.ScreenUpdating = Istina

Dok je kôd pokrenut, možda ćete morati "osvježiti" zaslon. Nema naredbe "osvježi". Umjesto toga, morat ćete ponovo uključiti ažuriranje zaslona i ponovo ga onemogućiti.

Postavite Izračune na Ručno

Kad god se promijeni vrijednost ćelije, Excel mora slijediti "stablo izračuna" kako bi ponovno izračunao sve ovisne ćelije. Osim toga, kad god se promijeni formula, Excel će morati ažurirati "stablo izračuna" uz ponovno izračunavanje svih ovisnih ćelija. Ovisno o veličini vaše radne bilježnice, ova ponovna izračunavanja mogu uzrokovati da vaše makronaredbe rade nerazumno sporo.

Za postavljanje izračuna na ručno:

1 Primjena.Izračun = xlPriručnik

Da biste ručno ponovno izračunali cijelu radnu knjigu:

1 Izračunati

Imajte na umu da također možete izračunati samo list, raspon ili pojedinačnu ćeliju, ako je potrebno za poboljšanu brzinu.

Za vraćanje automatskih izračuna (na kraju postupka):

1 Primjena.Izračun = xlAutomatski

Važno! Ovo je postavka programa Excel. Ako izračune ne postavite na automatsko, radna se knjiga neće ponovno izračunati sve dok joj to ne kažete.

Vidjet ćete najveća poboljšanja iz gornjih postavki, ali postoji nekoliko drugih postavki koje mogu promijeniti:

Onemogući događaje

Događaji su "okidači" koji uzrokuju posebne postupci događaja trčati. Primjeri uključuju: kada se bilo koja ćelija na radnom listu promijeni, kada se radni list aktivira, kada se radna knjiga otvori, prije spremanja radne knjige itd.

Onemogućavanje događaja može uzrokovati manja poboljšanja brzine pri pokretanju bilo kojih makronaredbi, ali poboljšanje brzine može biti znatno veće ako vaša radna knjiga koristi događaje. U nekim je slučajevima onemogućavanje događaja potrebno kako bi se izbjeglo stvaranje beskonačnih petlji.

Da biste onemogućili događaje:

1 Application.EnableEvents = Netačno

Za ponovno uključivanje događaja:

1 Application.EnableEvents = Istina

Onemogućite prelome stranica

Onemogućavanje prijeloma stranica može pomoći u određenim situacijama:

  • Prethodno ste za relevantni radni list postavili svojstvo PageSetup i vaš VBA postupak mijenja svojstva mnogih redaka ili stupaca
  • ILI Vaš postupak VBA tjera Excel da izračuna prijelome stranica (prikaz Pretpregleda ispisa ili mijenjanje bilo kojih svojstava postavke stranice).

Da biste onemogućili prelome stranica:

1 ActiveSheet.DisplayPageBreaks = Netačno

Za ponovno omogućavanje prijeloma stranica:

1 ActiveSheet.DisplayPageBreaks = Istina

Najbolje prakse za poboljšanje VBA brzine

Izbjegavajte aktiviranje i odabir

Kad snimite makronaredbu, vidjet ćete mnoge metode aktiviranja i odabira:

12345678 Pod Slow_Example ()Listovi ("List 2"). OdaberiteRaspon ("D9"). OdaberiteActiveCell.FormulaR1C1 = "primjer"Raspon ("D12"). OdaberiteActiveCell.FormulaR1C1 = "demo"Raspon ("D13"). OdaberiteKraj podm

Aktiviranje i odabir objekata obično nije potrebno, dodaju nered u vaš kôd i vrlo dugo oduzimaju vrijeme. Trebali biste izbjegavati ove metode kad god je to moguće.

Poboljšani primjer:

1234 Podbrzi_primjer ()Listovi ("List2"). Raspon ("D9"). FormulaR1C1 = "primjer"Listovi ("List2"). Raspon ("D12"). FormulaR1C1 = "demo"Kraj podm

Izbjegavajte kopiranje i lijepljenje

Kopiranje zahtijeva značajnu memoriju. Nažalost, ne možete reći VBA da očisti internu memoriju. Umjesto toga Excel će očistiti svoju internu memoriju u (naizgled) određenim intervalima. Dakle, ako izvodite mnoge operacije kopiranja i lijepljenja, riskirate da zauzmete previše memorije, što može drastično usporiti vaš kôd ili čak srušiti Excel.

Umjesto kopiranja i lijepljenja, razmislite o postavljanju svojstava vrijednosti ćelija.

123456789 Sub CopyPaste ()'SporijeRaspon ("a1: a1000"). Kopiraj raspon ("b1: b1000")'BržeRaspon ("b1: b1000"). Vrijednost = Raspon ("a1: a1000"). VrijednostKraj podm

Koristite petlje za svaku umjesto petlji za

Prilikom prolaska kroz objekte, petlja Za svaki je brža od For petlje. Primjer:

Ovo za petlju:

123456 Pod petlja1 ()dim i kao RasponZa i = 1 do 100Stanice (i, 1). Vrijednost = 1Sljedeći iKraj podm
Sporije je od ovoga za svaku petlju:
123456 Pod petlja 2 ()Prigušena ćelija kao rasponZa svaku ćeliju u rasponu ("a1: a100")ćelija.Vrijednost = 1Sljedeća ćelijaKraj podm

Deklarirajte varijable / Upotrijebite opciju eksplicitno

VBA ne zahtijeva da deklarirate svoje varijable, osim ako ne dodate Option Explicit na vrh vašeg modula:
1 Opcija Eksplicitno
Dodavanje opcije Explicit najbolja je praksa kodiranja jer smanjuje vjerojatnost pogrešaka. Također vas tjera da deklarirate svoje varijable, što malo povećava brzinu vašeg koda (prednosti su uočljivije što se više varijabla koristi).Kako Opcija Explicit sprječava pogreške?Najveća prednost Opcije Explicit je što će vam pomoći uhvatiti pravopisne pogreške naziva varijabli. Na primjer, u sljedećem primjeru postavili smo varijablu pod nazivom 'var1', ali kasnije referenciramo varijablu s imenom 'varl'. Varijabla "varl" nije definirana pa je prazna, što uzrokuje neočekivane rezultate.
1234 Pod OptionExplicit ()var1 = 10MsgBox varlKraj podm

Koristi s - završi s izjavama

Ako se više puta pozivate na iste objekte (npr. Rasponi, Radni listovi, Radne knjige), razmislite o upotrebi Izjave With. Brže se obrađuje, može olakšati čitanje koda i pojednostavljuje ga.S primjerom izjave:
12345678 Podbrži_primjer ()S listovima ("List 2").Range ("D9"). FormulaR1C1 = "primjer".Range ("D12"). FormulaR1C1 = "demo".Range ("D9"). Font.Bold = True.Range ("D12"). Font.Bold = TrueZavrši sKraj podm
Brži je od:
123456 Pod Sporo_primjer ()Listovi ("List2"). Raspon ("D9"). FormulaR1C1 = "primjer"Listovi ("List2"). Raspon ("D12"). FormulaR1C1 = "demo"Listovi ("List 2"). Raspon ("D9"). Font.Bold = TačnoListovi ("List 2"). Raspon ("D12"). Font.Bold = TačnoKraj podm

Napredni savjeti o najboljoj praksi

Zaštitite samo korisničko sučelje

Dobra je praksa zaštititi svoje radne listove od uređivanja nezaštićenih ćelija kako biste spriječili krajnjeg korisnika (ili vas!) Da slučajno ne pokvare radnu knjigu. Međutim, to će također zaštititi radni list (eve) od dopuštanja VBA da vrši izmjene. Stoga morate skinuti zaštitu i ponovno zaštititi radne listove, što je vrlo dugotrajno kada se radi na mnogim listovima.

12345 Sub UnProtectSheet ()Tablice ("list1"). Ukloni zaštitu "lozinka"'Uređivanje lista1Tablice ("list1"). Zaštitite "lozinku"Kraj podm

Umjesto toga, možete zaštititi listove postavljanjem UserInterfaceOnly: = True. To omogućuje VBA -u da vrši izmjene na listovima, a da ih i dalje štiti od korisnika.

1 Tablice ("list1"). Zaštita lozinke: = "lozinka", UserInterFaceOnly: = Istina

Važno! UserInterFaceOnly vraća se na False svaki put kada se radna knjiga otvori. Dakle, da biste koristili ovu sjajnu značajku, morat ćete koristiti događaje Workbook_Open ili Auto_Open za postavljanje postavke svaki put kada se radna knjiga otvori.

Umetnite ovaj kôd u modul ove radne knjige:

123456 Privatna pomoćna radna knjiga_Open ()Zatamni kao radni listZa svaki ws u radnim listovimaws.Zaštita lozinke: = "lozinka", UserInterFaceOnly: = IstinaSljedeći wsKraj podm

ili ovaj kod u bilo kojem redovitom modulu:

123456 Privatno pod Auto Auto_Open ()Zatamni kao radni listZa svaki ws u radnim listovimaws.Zaštita lozinke: = "lozinka", UserInterFaceOnly: = IstinaSljedeći wsKraj podm

Koristite nizove za uređivanje velikih raspona

Manipuliranje velikim rasponom stanica (npr. 100.000+) može oduzeti mnogo vremena. Umjesto ponavljanja kroz raspone ćelija, manipuliranja svakom ćelijom, možete učitati ćelije u niz, obraditi svaku stavku u nizu, a zatim niz poslati natrag u izvorne ćelije. Učitavanje ćelija u nizove za manipulaciju može biti puno brže.

1234567891011121314151617181920212223242526272829303132 Podopterećenje petlje ()Prigušena ćelija kao rasponZatamnite tStart As DoubletStart = Mjerač vremenaZa svaku ćeliju u rasponu ("A1: A100000")ćelija.Vrijednost = ćelija.Vrijednost * 100Sljedeća ćelijaDebug.Print (Timer - tStart) & "seconds"Kraj podmSub LoopArray ()Dim arr As VariantPriguši stavku kao varijantuZatamnite tStart As DoubletStart = Mjerač vremenaarr = Raspon ("A1: A100000"). VrijednostZa svaku stavku U dolstavka = stavka * 100Sljedeća stavkaRaspon ("A1: A100000"). Vrijednost = arrDebug.Print (Timer - tStart) & "seconds"Kraj podm

Vi ćete pomoći u razvoju web stranice, dijeljenje stranicu sa svojim prijateljima

wave wave wave wave wave