Kun Excel-makroistasi tulee yhä vankempia ja monimutkaisempia, saatat huomata, että niiden suorituskyky heikkenee. Kun puhutaan makroista, sana suorituskyky on yleensä synonyymi nopeudelle . Nopeus tarkoittaa, kuinka nopeasti VBA-menettelysi suorittavat niille aiotut tehtävät. Seuraavassa on kymmenen tapaa auttaa pitämään Excel-makrosi käynnissä optimaalisella suorituskyvyllä.
Arkkilaskelmien pysäyttäminen
Tiesitkö, että Excel laskee koko laskentataulukon uudelleen aina, kun solua, joka vaikuttaa mihin tahansa laskentataulukon kaavaan, muutetaan tai käsitellään? Työtaulukoissa, joissa on suuri määrä kaavoja, tämä toiminta voi hidastaa makroja huomattavasti.
Application.Calculation-ominaisuuden avulla voit käskeä Exceliä siirtymään manuaaliseen laskentatilaan. Kun työkirja on manuaalisessa laskentatilassa, työkirja ei laske uudelleen ennen kuin käynnistät laskutoimituksen painamalla F9-näppäintä.
Aseta Excel manuaaliseen laskentatilaan, suorita koodisi ja vaihda sitten takaisin automaattiseen laskentatilaan.
Alamakro1()
Application.Calculation = xlCalculationManual
'Aseta makrokoodisi tähän
Application.Calculation = xlCalculationAutomatic
Lopeta ala
Laskentatilan palauttaminen xlCalculationAutomatic käynnistää automaattisesti laskentataulukon uudelleenlaskennan, joten sinun ei tarvitse painaa F9-näppäintä makron suorittamisen jälkeen.
Poistetaan taulukon näytön päivitys käytöstä
Saatat huomata, että kun makrosi suoritetaan, näyttösi vilkkuu melkoisesti. Tämä välkkyminen tarkoittaa, että Excel yrittää piirtää näytön uudelleen näyttämään laskentataulukon nykyisen tilan. Valitettavasti joka kerta, kun Excel piirtää näytön uudelleen, se vie muistiresursseja.
Application.ScreenUpdating-ominaisuuden avulla voit poistaa näytön päivitykset käytöstä, kunnes makrosi on valmis. Näytön päivityksen poistaminen käytöstä säästää aikaa ja resursseja, jolloin makrosi toimii hieman nopeammin. Kun makrokoodisi on suoritettu, voit ottaa näytön päivityksen takaisin käyttöön.
Alamakro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
'Aseta makrokoodisi tähän
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Totta
Lopeta ala
Kun olet asettanut ScreenUpdating-ominaisuuden takaisin arvoon True, Excel käynnistää automaattisesti näytön uudelleenpiirtämisen.
Tilapalkin päivitysten poistaminen käytöstä
Excelin tilapalkki, joka näkyy Excel-ikkunan alaosassa, näyttää yleensä tiettyjen toimintojen edistymisen Excelissä. Jos makrosi toimii paljon datan kanssa, tilapalkki vie resursseja.
On tärkeää huomata, että näytön päivityksen sammuttaminen on eri asia kuin tilapalkin näytön sammuttaminen. Tilarivin päivitys jatkuu, vaikka poistaisit näytön päivityksen käytöstä. Application.DisplayStatusBar-ominaisuuden avulla voit tilapäisesti poistaa tilapalkin päivitykset käytöstä ja parantaa näin makrosi suorituskykyä:
Alamakro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
'Aseta makrokoodisi tähän
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Totta
Application.DisplayStatusBar = Tosi
Lopeta ala
Excelin käskeminen ohittaa tapahtumat
Voit ottaa makroja käyttöön tapahtumaproseduureina ja käskeä Exceliä suorittamaan tietyn koodin, kun laskentataulukko tai työkirja muuttuu.
Joskus vakiomakrot tekevät muutoksia, jotka käynnistävät tapahtumamenettelyn. Jos sinulla on esimerkiksi vakiomakro, joka käsittelee useita Sheet1:n soluja, makrosi on keskeytettävä joka kerta, kun taulukon solua muutetaan, kun Worksheet_Change -tapahtuma suoritetaan.
Voit lisätä toisen tason suorituskyvyn tehostamiseen käyttämällä EnableEvents-ominaisuutta ja käskeä Exceliä ohittamaan tapahtumat makron suorittamisen aikana.
Aseta EnableEvents-ominaisuuden arvoksi False ennen makron suorittamista. Kun makrokoodisi on suoritettu, voit asettaa EnableEvents-ominaisuuden takaisin arvoon True.
Alamakro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
'Aseta makrokoodisi tähän
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Totta
Application.DisplayStatusBar = Tosi
Application.EnableEvents = Tosi
Lopeta ala
Sivunvaihtojen piilottaminen
Aina kun makrosi muuttaa rivien määrää, sarakkeiden määrää tai muuttaa laskentataulukon sivuasetuksia, Excelin on pakko ottaa aikaa laskeakseen uudelleen taulukossa näkyvät sivunvaihdot.
Voit välttää tämän toiminnan yksinkertaisesti piilottamalla sivunvaihdot ennen makron käynnistämistä.
Aseta DisplayPageBreaks-taulukkoominaisuuden arvoksi False piilottaaksesi sivunvaihdot. Jos haluat jatkaa sivunvaihtojen näyttämistä makron suorittamisen jälkeen, aseta DisplayPageBreaks-taulukkoominaisuuden arvoksi takaisin True.
Alamakro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
Activesheet.DisplayPageBreaks = Väärin
'Aseta makrokoodisi tähän
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Totta
Application.DisplayStatusBar = Tosi
Application.EnableEvents = Tosi
Activesheet.DisplayPageBreaks = Tosi
Lopeta ala
Keskeytetään pivot-taulukon päivityksiä
Jos makrosi käsittelee pivot-taulukoita, jotka sisältävät suuria tietolähteitä, saatat kokea huonoja tuloksia, kun teet esimerkiksi pivot-kenttien lisäämistä tai siirtämistä dynaamisesti.
Voit parantaa makrosi suorituskykyä keskeyttämällä pivot-taulukon uudelleenlaskennan, kunnes kaikki pivot-kenttien muutokset on tehty. Aseta vain PivotTable.ManualUpdate-ominaisuuden arvoksi True, jos haluat lykätä uudelleenlaskentaa, suorita makrokoodisi ja aseta sitten PivotTable.ManualUpdate-ominaisuuden arvoksi False uudelleenlaskennan käynnistämiseksi.
Alamakro1()
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=True
'Aseta makrokoodisi tähän
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=False
Lopeta ala
Vältä kopioimista ja liittämistä
On tärkeää muistaa, että vaikka Macro Recorder säästää aikaa kirjoittamalla VBA-koodin puolestasi, se ei aina kirjoita tehokkainta koodia. Hyvä esimerkki on, kuinka Macro Recorder tallentaa kaikki kopiointi ja liitä -toiminnot, joita suoritat tallennuksen aikana.
Voit antaa makrojasi hieman tehostamalla leikkaamalla välimiehen ja suorittamalla suoran kopion yhdestä solusta kohdesoluun. Tämä vaihtoehtoinen koodi käyttää Destination-argumenttia ohittamaan leikepöydän ja kopioimaan solun A1 sisällön suoraan soluun B1.
Alue("A1").Kopioi kohde:=Alue("B1")
Jos haluat kopioida vain arvoja (ei muotoilua tai kaavoja), voit parantaa suorituskykyä entisestään välttämällä kopiointimenetelmää. Aseta vain kohdesolun arvo samaan arvoon, joka löytyy lähdesolusta. Tämä menetelmä on noin 25 kertaa nopeampi kuin kopiointimenetelmä:
Alue("B1").Arvo = Alue("A1").Arvo
Jos sinun on kopioitava vain kaavoja yhdestä solusta toiseen (ei arvoja tai muotoilua), voit asettaa kohdesolun kaavan samaan kaavaan, joka sisältyy lähdesoluun:
Alue("B1").Kaava = Alue("A1").Kaava
With-lausekkeen käyttäminen
Kun tallennat makroja, käsittelet usein samaa objektia useammin kuin kerran. Voit säästää aikaa ja parantaa suorituskykyä käyttämällä With-lausetta suorittaaksesi useita toimintoja tietylle objektille yhdellä otoksella.
Seuraavassa esimerkissä käytetty With-lause kehottaa Exceliä käyttämään kaikkia muotoilumuutoksia kerralla:
Kanssa Range("A1").Font
.Lihavoitu = Totta
.Italic = Totta
.Underline = xlUnderlineStyleSingle
Lopeta kanssa
Kun totut toimintojen jakamiseen With-lausekkeisiin, makrot toimivat nopeammin, mutta myös makrokoodisi lukeminen on helpompaa.
Vältä Select-menetelmää
Macro Recorder haluaa käyttää Select-menetelmää objektien nimenomaiseen valitsemiseen ennen niiden suorittamista. Objekteja ei yleensä tarvitse valita ennen niiden käsittelyä. Itse asiassa voit parantaa makron suorituskykyä dramaattisesti, jos et käytä Select-menetelmää.
Kun olet tallentanut makrosi, ota tapaksesi muuttaa luotua koodia Select-menetelmien poistamiseksi. Tässä tapauksessa optimoitu koodi näyttäisi tältä:
Sheets("Sheet1").Alue("A1").KaavaR1C1 = "1000"
Sheets("Sheet2").Alue("A1").KaavaR1C1 = "1000"
Sheets("Sheet3").Alue("A1").KaavaR1C1 = "1000"
Huomaa, että mitään valitaan. Koodi käyttää vain objektihierarkiaa tarvittavien toimien toteuttamiseen.
Matkojen rajoittaminen laskentataulukkoon
Toinen tapa nopeuttaa makroja on rajoittaa sitä, kuinka monta kertaa viittaat laskentataulukon tietoihin koodissasi. Tietojen hakeminen laskentataulukosta on aina tehottomampaa kuin muistista. Toisin sanoen makrosi toimivat paljon nopeammin, jos niiden ei tarvitse toistuvasti olla vuorovaikutuksessa laskentataulukon kanssa.
Esimerkiksi seuraava yksinkertainen koodi pakottaa VBA:n palaamaan jatkuvasti Sheets("Sheet1").Alue("A1") saadakseen If-käskyssä suoritettavaan vertailuun tarvittavan luvun:
Raporttikuukaudelle = 1–12
If Range("A1").Arvo = RaporttiKuukausi Sitten
Viestilaatikko 1000000 / Raporttikuukausi
Loppu Jos
Seuraava raporttikuukausi
Paljon tehokkaampi tapa on tallentaa arvo Sheets("Sheet1").Alue("A1") muuttujaan nimeltä MyMonth. Tällä tavalla koodi viittaa MyMonth-muuttujaan laskentataulukon sijaan:
Dim MyMonth kokonaislukuna
Omakuukausi = Väli("A1").Arvo
Raporttikuukaudelle = 1–12
Jos Omakuukausi = RaporttiKuukausi Sitten
Viestilaatikko 1000000 / Raporttikuukausi
Loppu Jos
Seuraava raporttikuukausi
Harkitse muuttujien hyödyntämistä muistissa olevien tietojen kanssa sen sijaan, että viittaisit suoraan laskentataulukoihin.
Vältä liiallista viittausta
Kun objektin menetelmää tai ominaisuutta kutsutaan, sen on käytävä läpi OLE-komponentin IDispatch-liittymä. Kutsut näihin OLE-komponentteihin vievät aikaa, joten OLE-komponenttien viittausten määrän vähentäminen voi parantaa makrokoodin nopeutta.
Objektin ominaisuuksien tai menetelmien kutsumiseen käytetään yleensä Object.Methodin esitystapaa , eli "." symbolia käytetään ominaisuuksien ja menetelmien kutsumiseen.
Siksi menetelmä- tai ominaisuuskutsujen lukumäärä voidaan arvioida symbolien "." lukumäärän mukaan. Mitä vähemmän "." symboli, sitä nopeammin koodi suoritetaan.
Esimerkiksi seuraava lause sisältää 3 symbolia ".".
ThisWorkbook.Sheet1.Range("A1").Value = 100
Seuraavassa lauseessa on vain yksi symboli ".".
Activewindow.Top = 100
Tässä on joitain temppuja symbolien "" määrän vähentämiseksi. juoksemaan nopeammin.
Ensinnäkin, kun sinun on viitattava samaan objektiin toistuvasti, voit asettaa objektin muuttujaksi puheluiden määrän vähentämiseksi. Esimerkiksi seuraava koodi vaatii kaksi puhelua linjaa kohden.
ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = 100
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = 200
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = 300
Koska Sheets("Sheet1")- objektiin on viitattava toistuvasti, se voidaan asettaa ensin muuttujaksi sht , jolloin kutakin koodia tarvitsee kutsua vain kerran.
Set sht = ThisWorkbook.Sheets("Sheet1")
sht.Cells(1, 1) = 100
sht.Cells(2, 1) = 200
sht.Cells(3, 1) = 300
Toiseksi, jos et halua ilmoittaa väliaikaista muuttujaa sht, voit käyttää myös aiemmin mainittua With -lausetta. Kuten seuraavassa esimerkissä näkyy:
With ThisWorkbook.Sheets("Sheet1")
.Cells(1, 1) = 100
.Cells(2, 1) = 200
.Cells(3, 1) = 300
End With
Kolmanneksi, kun silmukoita on paljon, yritä pitää ominaisuudet ja menetelmät silmukan ulkopuolella. Kun käytät uudelleen saman objektin ominaisuusarvoa silmukassa, voit ensin määrittää ominaisuuden arvon määritetylle muuttujalle silmukan ulkopuolella ja sitten käyttää silmukassa olevaa muuttujaa, mikä voi saavuttaa nopeamman nopeuden. Kuten seuraavassa esimerkissä näkyy:
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
Jokainen silmukka tässä esimerkissä saa solun Solut(1,2) Arvo-ominaisuuden. Jos määrität Cells(1.2):n Arvo-ominaisuuden muuttujalle ennen silmukan alkamista, saat nopeamman ajon. Kuten seuraavassa esimerkissä näkyy:
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
Yllä oleva koodi kutsuu ThisWorkbook.Sheets("Sheet1") aina silmukan yhteydessä. Voit tehdä tämän nopeammin käyttämällä With -käskyä siirtääksesi kutsun ThisWorkbook.Sheets("Sheet1") silmukan ulkopuolelle. Kuten seuraavassa esimerkissä näkyy:
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
Vältä muunnelmatyyppien käyttöä
Aloittelijat käyttävät yleensä mieluummin Variant-tyyppisiä muuttujia, joiden etuna on se, että ne ovat vähemmän monimutkaisia, koska minkä tahansa tyyppistä dataa voidaan käyttää ilman muistin ylivuoto-ongelmaa, jos tiedot ovat liian suuria Integer- tai Long-tietotyypeille. Varienmt-tyyppiset tiedot vaativat kuitenkin enemmän ylimääräistä muistitilaa kuin muut määritetyt tyypit (2 tavua kokonaislukutiedoille, 4 tavua pitkille tiedoille ja 16 tavua Variant-tiedoille), VBA vaatii enemmän aikaa Variant-tyyppisten tietojen käsittelyyn kuin muut määritetyt tyypit. tiedoista. Kuten seuraava esimerkki osoittaa.
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
Yllä olevassa koodissa rivit 8-13 tekevät 1 miljoonan muunnelmamuuttujien yhteen-, vähennys-, kerto- ja jakooperaatiota ja rivit 17-22 tekevät 1 miljoonan kokonaislukumuuttujien yhteen-, vähennys-, kerto- ja jakooperaation. Tietokoneellani Variant-muuttujan toiminta kesti noin 0,09375 sekuntia, kun taas Kokonaisluku-muuttujan toiminta noin 0,03125 sekuntia. Tulokset voivat vaihdella tietokoneittain, mutta Variant-muuttujat ovat huomattavasti hitaampia kuin kokonaislukumuuttujat .
Tästä syystä on suositeltavaa välttää Variant-muuttujien käyttöä, kun voit käyttää nimenomaisesti määritettyä tietotyyppiä .