10 načina da ubrzate svoje makronaredbe

Kako vaše Excel makronaredbe postaju sve robusnije i složenije, možda ćete otkriti da gube performanse. Kada se govori o makronaredbama, riječ performanse obično je sinonim za brzinu . Brzina je koliko brzo vaše VBA procedure izvode svoje predviđene zadatke. Slijedi deset načina za održavanje vaših Excel makronaredbi na njihovoj optimalnoj razini performansi.

Zaustavljanje proračuna listova

Jeste li znali da svaki put kada se promijeni ili manipulira ćelija koja utječe na bilo koju formulu u vašoj proračunskoj tablici, Excel ponovno izračuna cijeli radni list? U radnim listovima koji imaju veliku količinu formula, ovo ponašanje može drastično usporiti vaše makronaredbe.

Možete koristiti svojstvo Application.Calculation da kažete Excelu da se prebaci na način ručnog izračuna. Kada je radna knjiga u načinu ručnog izračuna, radna knjiga se neće ponovno izračunati sve dok izričito ne pokrenete izračun pritiskom na tipku F9.

Stavite Excel u način ručnog izračuna, pokrenite svoj kod, a zatim se vratite na automatski način izračuna.

Podmakro1()
Application.Calculation = xlCalculationManual
 'Ovdje stavite svoj makro kod
Aplikacija.Izračun = xlCalculationAutomatic
Kraj Sub

Vraćanje načina izračuna na xlCalculationAutomatic automatski će pokrenuti ponovni izračun radnog lista, tako da nema potrebe pritiskati tipku F9 nakon što se makro pokrene.

Onemogućavanje ažuriranja zaslona lista

Možda ćete primijetiti da kada se vaše makronaredbe pokrenu, vaš zaslon prilično treperi. Ovo treperenje je Excel koji pokušava ponovno nacrtati zaslon kako bi prikazao trenutno stanje radnog lista. Nažalost, svaki put kada Excel ponovno iscrtava zaslon, zauzima memorijske resurse.

Možete koristiti svojstvo Application.ScreenUpdating da onemogućite ažuriranja zaslona dok se makronaredba ne dovrši. Onemogućavanje ažuriranja zaslona štedi vrijeme i resurse, omogućujući vašoj makronaredbi da radi malo brže. Nakon što se vaš makro kod završi s radom, možete ponovno uključiti ažuriranje zaslona.

Podmakro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
 'Ovdje stavite svoj makro kod
Aplikacija.Izračun = xlCalculationAutomatic
Application.ScreenUpdating = Točno
Kraj Sub

Nakon što svojstvo ScreenUpdating vratite na True, Excel će automatski pokrenuti ponovno iscrtavanje zaslona.

Isključivanje ažuriranja statusne trake

Statusna traka programa Excel, koja se pojavljuje na dnu prozora programa Excel, obično prikazuje napredak određenih radnji u Excelu. Ako vaša makronaredba radi s puno podataka, statusna traka će zauzeti neke resurse.

Važno je napomenuti da je isključivanje ažuriranja zaslona odvojeno od isključivanja prikaza statusne trake. Statusna traka nastavit će se ažurirati čak i ako onemogućite ažuriranje zaslona. Možete koristiti svojstvo Application.DisplayStatusBar da privremeno onemogućite ažuriranja statusne trake, dodatno poboljšavajući izvedbu svoje makronaredbe:

Podmakro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
 'Ovdje stavite svoj makro kod
Aplikacija.Izračun = xlCalculationAutomatic
Application.ScreenUpdating = Točno
Application.DisplayStatusBar = Istina
Kraj Sub

Reći Excelu da ignorira događaje

Možete implementirati makronaredbe kao procedure događaja, govoreći Excelu da pokrene određeni kod kada se radni list ili radna knjiga promijeni.

Ponekad standardne makronaredbe unose promjene koje će pokrenuti proceduru događaja. Na primjer, ako imate standardnu ​​makronaredbu koja manipulira s nekoliko ćelija na Sheet1, svaki put kada se promijeni ćelija na tom listu, vaša se makronaredba mora pauzirati dok se radi događaj Worksheet_Change.

Možete dodati još jednu razinu povećanja performansi korištenjem svojstva EnableEvents kako biste rekli Excelu da ignorira događaje dok se makronaredba izvodi.

Postavite svojstvo EnableEvents na False prije pokretanja makronaredbe. Nakon što se vaš makro kod završi s izvođenjem, svojstvo EnableEvents možete vratiti na True.

Podmakro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
 'Ovdje stavite svoj makro kod
Aplikacija.Izračun = xlCalculationAutomatic
Application.ScreenUpdating = Točno
Application.DisplayStatusBar = Istina
Application.EnableEvents = Točno
Kraj Sub

Skrivanje prijeloma stranica

Svaki put kada makronaredba izmijeni broj redaka, broj stupaca ili promijeni postavku stranice radnog lista, Excel je prisiljen odvojiti vrijeme za ponovno izračunavanje prijeloma stranica prikazanih na listu.

Ovo ponašanje možete izbjeći jednostavnim skrivanjem prijeloma stranica prije pokretanja makronaredbe.

Postavite svojstvo lista DisplayPageBreaks na False da biste sakrili prijelome stranica. Ako želite nastaviti prikazivati ​​prijelome stranica nakon pokretanja makronaredbe, vratite svojstvo lista DisplayPageBreaks na True.

Podmakro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
Activesheet.DisplayPageBreaks = False
 'Ovdje stavite svoj makro kod
Aplikacija.Izračun = xlCalculationAutomatic
Application.ScreenUpdating = Točno
Application.DisplayStatusBar = Istina
Application.EnableEvents = Točno
Activesheet.DisplayPageBreaks = Točno
Kraj Sub

Obustavljanje ažuriranja zaokretne tablice

Ako vaša makronaredba manipulira zaokretnim tablicama koje sadrže velike izvore podataka, možda ćete imati lošu izvedbu kada radite stvari poput dinamičkog dodavanja ili premještanja zaokretnih polja.

Možete poboljšati performanse svoje makronaredbe obustavljanjem ponovnog izračuna zaokretne tablice dok se ne izvrše sve promjene zaokretnog polja. Jednostavno postavite svojstvo PivotTable.ManualUpdate na True da odgodite ponovno izračunavanje, pokrenite svoj makro kod, a zatim vratite svojstvo PivotTable.ManualUpdate na False kako biste pokrenuli ponovno izračun.

Podmakro1()
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=True
 'Ovdje stavite svoj makro kod
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=False
Kraj Sub

Izbjegavanje kopiranja i lijepljenja

Važno je zapamtiti da iako Macro Recorder štedi vrijeme pisanjem VBA koda umjesto vas, ne piše uvijek najučinkovitiji kod. Najbolji primjer je kako Macro Recorder bilježi svaku radnju kopiranja i lijepljenja koju izvodite tijekom snimanja.

Svojim makronaredbama možete dati blagi poticaj izrezivanjem posrednika i izvođenjem izravnog kopiranja iz jedne ćelije u odredišnu. Ovaj alternativni kod koristi argument Destination da zaobiđe međuspremnik i kopira sadržaj ćelije A1 izravno u ćeliju B1.

Raspon("A1").Odredište kopiranja:=Raspon("B1")

Ako trebate kopirati samo vrijednosti (ne formatiranje ili formule), možete još više poboljšati performanse izbjegavanjem metode kopiranja zajedno. Jednostavno postavite vrijednost odredišne ​​ćelije na istu vrijednost koja se nalazi u izvornoj ćeliji. Ova metoda je otprilike 25 puta brža od korištenja metode kopiranja:

Raspon("B1").Vrijednost = Raspon("A1").Vrijednost

Ako trebate kopirati samo formule iz jedne ćelije u drugu (ne vrijednosti ili oblikovanje), možete postaviti formulu odredišne ​​ćelije na istu formulu koja se nalazi u izvornoj ćeliji:

Raspon("B1").Formula = Raspon("A1").Formula

Korištenje izjave With

Prilikom snimanja makronaredbi, često ćete istim objektom manipulirati više puta. Možete uštedjeti vrijeme i poboljšati performanse korištenjem naredbe With za izvođenje nekoliko radnji na danom objektu u jednom kadru.

Naredba With korištena u sljedećem primjeru govori Excelu da primijeni sve promjene oblikovanja odjednom:

    S rasponom("A1").Font
    .Podebljano = Istina
    .Italic = Istina
    .Podcrtani = xlPodcrtaniStilSingle
    Završi s

Stjecanje navike razdvajanja radnji u With naredbe ne samo da će vaše makronaredbe raditi brže nego će i olakšati čitanje koda makronaredbe.

Izbjegavanje metode Select

Macro Recorder voli koristiti metodu Select za eksplicitno odabiranje objekata prije poduzimanja radnji na njima. Općenito nema potrebe za odabirom objekata prije rada s njima. Zapravo, možete dramatično poboljšati performanse makronaredbi ako ne koristite metodu Select.

Nakon snimanja makronaredbi, neka vam postane navika mijenjati generirani kod kako biste uklonili metode Select. U ovom slučaju, optimizirani kod bi izgledao ovako:

    Sheets("Sheet1").Raspon("A1").FormulaR1C1 = "1000"
    Sheets("Sheet2").Raspon("A1").FormulaR1C1 = "1000"
    Sheets("Sheet3").Raspon("A1").FormulaR1C1 = "1000"

Imajte na umu da se ništa ne odabire. Kod jednostavno koristi hijerarhiju objekata za primjenu potrebnih radnji.

Ograničavanje putovanja na radni list

Drugi način da ubrzate svoje makronaredbe je ograničavanje broja pozivanja na podatke radnog lista u svom kodu. Uvijek je manje učinkovito preuzimati podatke s radnog lista nego iz memorije. To znači da će vaše makronaredbe raditi mnogo brže ako ne moraju više puta komunicirati s radnim listom.

Na primjer, sljedeći jednostavan kod prisiljava VBA da se kontinuirano vraća na Sheets(“Sheet1”).Range(“A1”) kako bi dobio broj potreban za usporedbu koja se izvodi u naredbi If:

Za mjesec izvješća = 1 do 12
     If Range("A1").Vrijednost = ReportMonth Zatim
     MsgBox 1000000 / IzvještajMjesec
Završi ako
Sljedeći mjesec izvješća

Mnogo učinkovitija metoda je spremanje vrijednosti u Sheets(“Sheet1”).Range(“A1”) u varijablu pod nazivom MyMonth. Na ovaj način, kod upućuje na varijablu MyMonth umjesto na radni list:

Dim MyMonth kao cijeli broj
MojMjesec = Raspon ("A1").Vrijednost
Za mjesec izvješća = 1 do 12
Ako je MyMonth = ReportMonth Onda
MsgBox 1000000 / IzvještajMjesec
Završi ako
Sljedeći mjesec izvješća

Razmislite o korištenju varijabli za rad s podacima u memoriji za razliku od izravnog upućivanja na radne listove.

Izbjegavajte pretjerano spominjanje

Prilikom pozivanja metode ili svojstva objekta potrebno je proći kroz IDispatch sučelje OLE komponente. Za pozive ovim OLE komponentama potrebno je vrijeme, tako da smanjenje broja referenci na OLE komponente može poboljšati brzinu makro koda.

Za pozivanje svojstava ili metoda objekta općenito se koristi metoda predstavljanja Object.Method  ,  to jest "." simbol se koristi za pozivanje svojstava i metoda.

Stoga se broj poziva metoda ili svojstava može procijeniti prema broju simbola ".". Što je manje "." simbola, kod se brže izvodi.

Na primjer, sljedeća izjava uključuje 3 simbola ".".

ThisWorkbook.Sheet1.Range("A1").Value = 100

Sljedeća izjava ima samo jedan simbol ".".

Activewindow.Top = 100

Evo nekoliko trikova za smanjenje broja simbola "." trčati brže.

Prvo, kada trebate više puta referirati na isti objekt, možete postaviti objekt na varijablu kako biste smanjili broj poziva. Na primjer, sljedeći kod zahtijeva dva poziva po retku.

ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = 100
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = 200
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = 300

Budući da  se objekt Sheets("Sheet1")  mora više puta pozivati, može se prvo postaviti na varijablu  sht  , tako da svaki kôd treba pozvati samo jednom.

Set sht = ThisWorkbook.Sheets("Sheet1")
sht.Cells(1, 1) = 100
sht.Cells(2, 1) = 200
sht.Cells(3, 1) = 300

Drugo, ako ne želite deklarirati privremenu varijablu sht, također možete koristiti   ranije spomenutu naredbu With . Kao što je prikazano u sljedećem primjeru:

With ThisWorkbook.Sheets("Sheet1")
    .Cells(1, 1) = 100
    .Cells(2, 1) = 200
    .Cells(3, 1) = 300
End With

Treće,  kada postoji mnogo petlji, pokušajte zadržati svojstva i metode izvan petlje.  Prilikom ponovne upotrebe vrijednosti svojstva istog objekta u petlji, prvo možete dodijeliti vrijednost svojstva određenoj varijabli izvan petlje, a zatim koristiti varijablu u petlji, čime možete postići veću brzinu. Kao što je prikazano u sljedećem primjeru:

For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = Cells(1, 2).Value
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = Cells(1, 2).Value
Next i

Svaka petlja u ovom primjeru dobiva svojstvo Value ćelije Cells(1,2). Ako dodijelite svojstvo Value od Cells(1.2) varijabli prije početka petlje, dobit ćete brži rad. Kao što je prikazano u sljedećem primjeru:

tmp = Cells(1, 2).Value
For i = 1 To 1000
    ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = tmp
    ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = tmp
Next i

Gornji kod poziva  ThisWorkbook.Sheets("Sheet1")  svaki put kada se pokrene. To možete učiniti brže korištenjem  naredbe With  za premještanje poziva na  ThisWorkbook.Sheets("Sheet1")  izvan petlje. Kao što je prikazano u sljedećem primjeru:

tmp = Cells(1, 2).Value
With ThisWorkbook.Sheets("Sheet1")
    For i = 1 To 1000
        .Cells(1, 1) = tmp
        .Cells(2, 1) = tmp
        .Cells(3, 1) = tmp
    Next i
End With

Izbjegavajte korištenje vrsta varijanti

Početnici obično radije koriste varijable tipa Variant, čija je prednost što je manje komplicirana jer se može koristiti bilo koja vrsta podataka bez problema s prekoračenjem memorije ako su podaci preveliki za vrste podataka Integer ili Long. Međutim, podaci tipa Varienmt zahtijevaju više dodatnog memorijskog prostora od ostalih navedenih tipova (2 bajta za podatke Integer, 4 bajta za podatke Long i 16 bajtova za podatke tipa Variant), VBA zahtijeva više vremena za obradu podataka tipa Variant nego drugi navedeni tipovi podataka. Kao što pokazuje sljedeći primjer.

Sub VariantTest()
    Dim i As Long
    Dim ix As Integer, iy As Integer, iz As Integer
    Dim vx As Variant, vy As Variant, vz As Variant
    Dim tm As Date
    vx = 100: vy = 50
    tm = Timer
    For i = 1 To 1000000
        vz = vx * vy
        vz = vx + vy
        vz = vx - vy
        vz = vx / vy
    Next i
    Debug.Print "Variant types take " & Format((Timer - tm), "0.00000") & " seconds"
    ix = 100: iy = 50
    tm = Timer
    For i = 1 To 1000000
        iz = ix * iy
        iz = ix + iy
        iz = ix - iy
        iz = ix / iy
    Next i
    Debug.Print "Integer types take " & Format((Timer - tm), "0.00000") & " seconds"
End Sub

U gornjem kodu, linije od 8 do 13 obavljaju 1 milijun operacija zbrajanja, oduzimanja, množenja i dijeljenja varijabli Variant, a linije od 17 do 22 obavljaju 1 milijun operacija zbrajanja, oduzimanja, množenja i dijeljenja varijabli Integer. Na mom računalu operacija varijable Variant trajala je oko  0,09375  sekundi, dok je operacija varijable Integer trajala oko  0,03125  sekundi. Rezultati se mogu razlikovati od računala do računala, ali  Variant varijable su značajno sporije od Integer varijabli .

Iz tog razloga,  preporuča se izbjegavati korištenje Variant varijabli kada možete eksplicitno koristiti navedeni tip podataka .

Leave a Comment

Kako postaviti upit u bazu podataka MS Access 2019

Kako postaviti upit u bazu podataka MS Access 2019

Naučite kako postaviti upite u Access bazi podataka uz jednostavne korake i savjete za učinkovito filtriranje i sortiranje podataka.

Osnove tabulatora u programu Word 2013

Osnove tabulatora u programu Word 2013

Tabulatori su oznake položaja u odlomku programa Word 2013 koje određuju kamo će se točka umetanja pomaknuti kada pritisnete tipku Tab. Otkrijte kako prilagoditi tabulatore i optimizirati svoj rad u Wordu.

Kako odabrati i poništiti odabir blokova teksta u Wordu 2010

Kako odabrati i poništiti odabir blokova teksta u Wordu 2010

Word 2010 nudi mnoge načine označavanja i poništavanja odabira teksta. Otkrijte kako koristiti tipkovnicu i miš za odabir blokova. Učinite svoj rad učinkovitijim!

Kako uvući pasus u Wordu 2013

Kako uvući pasus u Wordu 2013

Naučite kako pravilno postaviti uvlaku za odlomak u Wordu 2013 kako biste poboljšali izgled svog dokumenta.

Kako otvoriti i zatvoriti PowerPoint 2019 prezentacije

Kako otvoriti i zatvoriti PowerPoint 2019 prezentacije

Naučite kako jednostavno otvoriti i zatvoriti svoje Microsoft PowerPoint 2019 prezentacije s našim detaljnim vodičem. Pronađite korisne savjete i trikove!

Kako crtati jednostavne objekte u PowerPointu 2013

Kako crtati jednostavne objekte u PowerPointu 2013

Saznajte kako crtati jednostavne objekte u PowerPoint 2013 uz ove korisne upute. Uključuje crtanje linija, pravokutnika, krugova i više.

Kako filtrirati podatke u programu Access 2016

Kako filtrirati podatke u programu Access 2016

U ovom vodiču vam pokazujemo kako koristiti alat za filtriranje u programu Access 2016 kako biste lako prikazali zapise koji dijele zajedničke vrijednosti. Saznajte više o filtriranju podataka.

Formule za zaokruživanje brojeva u Excelu

Formule za zaokruživanje brojeva u Excelu

Saznajte kako koristiti Excelove funkcije zaokruživanja za prikaz čistih, okruglih brojeva, što može poboljšati čitljivost vaših izvješća.

Kako dizajnirati različita zaglavlja i podnožja za različite stranice u programu Word 2013

Kako dizajnirati različita zaglavlja i podnožja za različite stranice u programu Word 2013

Zaglavlje ili podnožje koje postavite isto je za svaku stranicu u vašem Word 2013 dokumentu. Otkrijte kako koristiti različita zaglavlja za parne i neparne stranice.

Excel izvješća: prilagođeno oblikovanje brojeva

Excel izvješća: prilagođeno oblikovanje brojeva

Poboljšajte čitljivost svojih Excel izvješća koristeći prilagođeno oblikovanje brojeva. U ovom članku naučite kako se to radi i koja su najbolja rješenja.