Eftir því sem Excel fjölvi þín verða sífellt öflugri og flóknari gætirðu fundið fyrir því að þau tapi afköstum. Þegar rætt er um fjölva er orðið árangur venjulega samheiti yfir hraða . Hraði er hversu fljótt VBA aðferðir þínar framkvæma fyrirhuguð verkefni. Eftirfarandi eru tíu leiðir til að hjálpa til við að halda Excel fjölvunum þínum í gangi á besta frammistöðustigi.
Stöðvun blaðaútreikninga
Vissir þú að í hvert sinn sem reiti sem hefur áhrif á hvaða formúlu sem er í töflureikninum þínum er breytt eða meðhöndlað, endurreikur Excel allt vinnublaðið? Í vinnublöðum sem hafa mikið magn af formúlum getur þessi hegðun dregið verulega úr fjölvunum þínum.
Þú getur notað eiginleikann Application.Calculation til að segja Excel að skipta yfir í handvirka útreikningsham. Þegar vinnubók er í handvirkri útreikningsham mun vinnubókin ekki endurreikna fyrr en þú kveikir beinlínis á útreikningi með því að ýta á F9 takkann.
Settu Excel í handvirka útreikningsham, keyrðu kóðann þinn og skiptu síðan aftur í sjálfvirkan útreikningsham.
Sub Macro1()
Application.Calculation = xlCalculationManual
'Settu makrókóðann þinn hér
Application.Calculation = xlCalculationAutomatic
End Sub
Ef útreikningshamurinn er stilltur aftur á xlCalculationAutomatic mun sjálfkrafa koma af stað endurútreikningi á vinnublaðinu, svo það er engin þörf á að ýta á F9 takkann eftir að makróið þitt er keyrt.
Slökkva á uppfærslu blaðsskjás
Þú gætir tekið eftir því að þegar fjölvi keyra, flöktir skjárinn þinn nokkuð mikið. Þetta flöktandi er Excel að reyna að endurteikna skjáinn til að sýna núverandi stöðu vinnublaðsins. Því miður, í hvert sinn sem Excel teiknar skjáinn aftur, tekur það upp minnisauðlindir.
Þú getur notað eiginleikann Application.ScreenUpdating til að slökkva á skjáuppfærslum þar til fjölvi er lokið. Að slökkva á skjáuppfærslu sparar tíma og fjármagn, sem gerir fjölvi kleift að keyra aðeins hraðar. Eftir að makrókóði hefur lokið við að keyra geturðu kveikt aftur á skjáuppfærslu.
Sub Macro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
'Settu makrókóðann þinn hér
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Eftir að þú stillir ScreenUpdating eignina aftur á True, mun Excel sjálfkrafa kveikja á endurteikningu á skjánum.
Slökkt á uppfærslum á stöðustiku
Excel stöðustikan, sem birtist neðst í Excel glugganum, sýnir venjulega framvindu ákveðinna aðgerða í Excel. Ef fjölvi þinn vinnur með fullt af gögnum mun stöðustikan taka upp nokkur úrræði.
Það er mikilvægt að hafa í huga að það að slökkva á skjáuppfærslu er aðskilið frá því að slökkva á stöðustikunni. Stöðustikan mun halda áfram að vera uppfærð jafnvel þótt þú slökktir á skjáuppfærslu. Þú getur notað Application.DisplayStatusBar eignina til að slökkva tímabundið á öllum uppfærslum á stöðustiku, sem bætir enn frekar afköst fjölva þinnar:
Sub Macro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
'Settu makrókóðann þinn hér
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
End Sub
Að segja Excel að hunsa atburði
Þú getur útfært fjölvi sem atburðarferli, sem segir Excel að keyra ákveðinn kóða þegar vinnublað eða vinnubók breytist.
Stundum gera staðlaðar fjölvi breytingar sem kalla á atburðarferli. Til dæmis, ef þú ert með venjulegt fjölvi sem vinnur með nokkra hólfa á blaði 1, í hvert skipti sem hólf á því blaði er breytt, þarf fjölva þinn að gera hlé á meðan Worksheet_Change atburðurinn keyrir.
Þú getur bætt við öðru stigi frammistöðuaukningar með því að nota EnableEvents eignina til að segja Excel að hunsa atburði á meðan fjölvi keyrir.
Stilltu EnableEvents eignina á False áður en þú keyrir fjölvi. Eftir að makrókóði þinn er búinn að keyra geturðu stillt EnableEvents eignina aftur á True.
Sub Macro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
'Settu makrókóðann þinn hér
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
End Sub
Að fela síðuskil
Í hvert skipti sem makróið þitt breytir fjölda lína, breytir fjölda dálka eða breytir síðuuppsetningu vinnublaðs, neyðist Excel til að taka tíma til að endurreikna blaðsíðuskilin sem sýnd eru á blaðinu.
Þú getur forðast þessa hegðun með því einfaldlega að fela síðuskil áður en þú byrjar á fjölvi.
Stilltu DisplayPageBreaks blaðeiginleikann á False til að fela síðuskil. Ef þú vilt halda áfram að sýna blaðsíðuskil eftir að fjölvi er keyrt skaltu stilla DisplayPageBreaks blaðeiginleikann aftur á True.
Sub Macro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
Activesheet.DisplayPageBreaks = False
'Settu makrókóðann þinn hér
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
Activesheet.DisplayPageBreaks = True
End Sub
Fresta uppfærslur á snúningstöflu
Ef makróið þitt vinnur með snúningstöflum sem innihalda stóra gagnagjafa gætirðu fundið fyrir lélegri frammistöðu þegar þú gerir hluti eins og að bæta við eða færa snúningsreiti á virkan hátt.
Þú getur bætt afköst fjölvi þinnar með því að fresta endurútreikningi snúningstöflunnar þar til allar breytingar á snúningsreit hafa verið gerðar. Stilltu einfaldlega PivotTable.ManualUpdate eignina á True til að fresta endurútreikningi, keyrðu makrókóðann þinn og stilltu síðan PivotTable.ManualUpdate eignina aftur á False til að kveikja á endurútreikningnum.
Sub Macro1()
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=True
'Settu makrókóðann þinn hér
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=False
End Sub
Stýrir ekki af copy og paste
Það er mikilvægt að muna að þó Macro Recorder sparar tíma með því að skrifa VBA kóða fyrir þig, þá skrifar hann ekki alltaf skilvirkasta kóðann. Gott dæmi er hvernig Macro Recorder fangar allar afrita-og-líma-aðgerðir sem þú framkvæmir meðan þú tekur upp.
Þú getur gefið fjölvi örlítið uppörvun með því að klippa út milliliðinn og framkvæma beint afrit úr einni reit yfir í áfangastað. Þessi varakóði notar Destination argumentið til að komast framhjá klemmuspjaldinu og afrita innihald reits A1 beint í reit B1.
Range("A1").Copy Destination:=Range("B1")
Ef þú þarft að afrita aðeins gildi (ekki snið eða formúlur), geturðu bætt árangur enn meira með því að forðast afritaaðferðina allt saman. Stilltu einfaldlega gildi áfangahólfsins á sama gildi og fannst í frumhólfinu. Þessi aðferð er um það bil 25 sinnum hraðari en að nota Copy aðferðina:
Range("B1").Value = Range("A1").Value
Ef þú þarft að afrita aðeins formúlur úr einni reit í annan (ekki gildi eða snið), geturðu stillt formúlu áfangahólfisins á sömu formúlu og er í frumhólfinu:
Range("B1").Formula = Range("A1").Formula
Að nota With yfirlýsinguna
Þegar þú tekur upp fjölvi muntu oft vinna með sama hlutinn oftar en einu sinni. Þú getur sparað tíma og bætt frammistöðu með því að nota With yfirlýsinguna til að framkvæma nokkrar aðgerðir á tiltekinn hlut í einu skoti.
Með yfirlýsingunni sem notuð er í eftirfarandi dæmi segir Excel að beita öllum sniðbreytingum í einu:
Með Range("A1"). Leturgerð
.Bold = True
.Skáletraður = Satt
.Underline = xlUnderlineStyleSingle
Enda með
Að venjast því að setja aðgerðir í With-yfirlýsingar mun ekki aðeins halda fjölvunum þínum hraðari heldur einnig auðveldara að lesa fjölkóðann þinn.
Forðastu að velja aðferðina
Macro Recorder er hrifinn af því að nota Select aðferðina til að velja sérstaklega hluti áður en gripið er til aðgerða á þá. Almennt er engin þörf á að velja hluti áður en unnið er með þá. Reyndar geturðu bætt makróafköst verulega með því að nota ekki Select aðferðina.
Eftir að þú hefur skráð fjölva þína skaltu venja þig á að breyta kóðanum sem myndast til að fjarlægja Select aðferðirnar. Í þessu tilviki myndi bjartsýni kóðinn líta svona út:
Sheets("Sheet1").Range("A1").FormulaR1C1 = "1000"
Sheets("Sheet2").Range("A1").FormulaR1C1 = "1000"
Sheets("Sheet3").Range("A1").FormulaR1C1 = "1000"
Athugaðu að ekkert er valið. Kóðinn notar einfaldlega hlutastigveldið til að beita nauðsynlegum aðgerðum.
Takmarka ferðir á vinnublaðið
Önnur leið til að flýta fyrir fjölvunum þínum er að takmarka fjölda skipta sem þú vísar til vinnublaðsgagna í kóðanum þínum. Það er alltaf óhagkvæmara að grípa gögn úr vinnublaðinu en úr minni. Það er að segja, fjölvi þín munu keyra miklu hraðar ef þau þurfa ekki að hafa endurtekið samskipti við vinnublaðið.
Til dæmis, eftirfarandi einfaldi kóði neyðir VBA til að fara stöðugt aftur í Sheets(“Sheet1“). Range(“A1“) til að fá númerið sem þarf til að bera saman samanburðinn í If-yfirlýsingunni:
Fyrir skýrslumánuð = 1 til 12
If Range("A1").Value = ReportMonth Then
MsgBox 1000000 / ReportMonth
End If
Næsti skýrslumánuður
Mun skilvirkari aðferð er að vista gildið í Sheets(“Sheet1“). Range(“A1“) í breytu sem kallast MyMonth. Þannig vísar kóðinn til MyMonth breytunnar í stað vinnublaðsins:
Dimma MyMonth sem heiltala
MyMonth = Range("A1").Value
Fyrir skýrslumánuð = 1 til 12
Ef MyMonth = ReportMonth Þá
MsgBox 1000000 / ReportMonth
End If
Næsti skýrslumánuður
Íhugaðu að nýta breytur til að vinna með gögn í minni í stað þess að vísa beint til vinnublaða.
Forðastu of mikla tilvísun
Þegar hringt er í aðferð eða eiginleika hlutar þarf hann að fara í gegnum IDispatch tengi OLE íhlutsins. Símtölin í þessa OLE íhluti taka tíma, svo að fækka tilvísunum í OLE íhluti getur bætt hraða makrókóðans.
Til að kalla fram eiginleika eða aðferðir hlutar er framsetningaraðferð Object.Method almennt notuð, það er "." tákn er notað til að kalla fram eiginleika og aðferðir.
Þess vegna er hægt að dæma fjölda aðferða- eða eiginleikakalla eftir fjölda tákna ".". Því minna sem "." tákn, því hraðar sem kóðinn keyrir.
Til dæmis inniheldur eftirfarandi fullyrðing 3 tákn ".".
ThisWorkbook.Sheet1.Range("A1").Value = 100
Eftirfarandi fullyrðing hefur aðeins eitt tákn ".".
Activewindow.Top = 100
Hér eru nokkur bragðarefur til að fækka táknum "." að hlaupa hraðar.
Í fyrsta lagi, þegar þú þarft að vísa í sama hlutinn ítrekað, geturðu stillt hlutinn á breytu til að fækka símtölum. Til dæmis þarf eftirfarandi kóði að hringja í hverja línu.
ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = 100
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = 200
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = 300
Vegna þess að Sheets("Sheet1") hlutinn þarf að vísa ítrekað, er hægt að stilla hann á breytu sht fyrst, þannig að hvern kóða þarf aðeins að kalla einu sinni.
Set sht = ThisWorkbook.Sheets("Sheet1")
sht.Cells(1, 1) = 100
sht.Cells(2, 1) = 200
sht.Cells(3, 1) = 300
Í öðru lagi, ef þú vilt ekki lýsa yfir tímabundinni breytu sht, geturðu líka notað With setninguna sem nefnd var áðan. Eins og sýnt er í eftirfarandi dæmi:
With ThisWorkbook.Sheets("Sheet1")
.Cells(1, 1) = 100
.Cells(2, 1) = 200
.Cells(3, 1) = 300
End With
Í þriðja lagi, þegar það er mikið af lykkjum, reyndu að halda eiginleikum og aðferðum utan lykkjunnar. Þegar eignargildi sama hluts er endurnotað í lykkju er fyrst hægt að úthluta eignagildinu til tiltekinnar breytu utan lykkjunnar og síðan nota breytuna í lykkjunni, sem getur náð meiri hraða. Eins og sýnt er í eftirfarandi dæmi:
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
Hver lykkja í þessu dæmi fær Value eiginleika frumunnar Cells(1,2). Ef þú úthlutar Value eiginleikanum Cells(1.2) á breytu áður en lykkjan byrjar, færðu hraðari keyrslu. Eins og sýnt er í eftirfarandi dæmi:
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
Ofangreindur kóði kallar ThisWorkbook.Sheets("Sheet1") í hvert skipti sem hann fer í lykkjur. Þú getur gert þetta hraðar með því að nota With yfirlýsinguna til að færa símtalið á ThisWorkbook.Sheets("Sheet1") utan lykkjunnar. Eins og sýnt er í eftirfarandi dæmi:
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
Forðastu að nota afbrigðisgerðir
Byrjendur kjósa venjulega að nota Variant gerð breytur, sem hefur þann kost að vera minna flókið vegna þess að hægt er að nota hvaða tegund af gögnum sem er án vandamála með minni flæði ef gögnin eru of stór fyrir heiltölu eða langa gagnategundina. Hins vegar, Varienmt gerð gögn krefjast meira auka minnisrýmis en aðrar tilgreindar tegundir (2 bæti fyrir heiltölugögn, 4 bæti fyrir löng gögn og 16 bæti fyrir afbrigðisgögn), VBA þarf lengri tíma til að vinna úr afbrigðisgögnum en aðrar tilgreindar gerðir af gögnum. Eins og eftirfarandi dæmi sýnir.
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
Í ofangreindum kóða gera línur 8 til 13 1 milljón samlagningar-, frádráttar-, margföldunar- og deilingaraðgerða afbrigðabreyta og línur 17 til 22 gera 1 milljón samlagningar-, frádráttar-, margföldunar- og deilingaraðgerða á heiltölubreytum. Í tölvunni minni tók aðgerð Variant breytu um 0,09375 sekúndur á meðan aðgerð heiltala breytu tók um 0,03125 sekúndur. Niðurstöðurnar geta verið mismunandi eftir tölvum, en afbrigðisbreytur eru verulega hægari en heiltölubreytur .
Af þessum sökum er mælt með því að forðast að nota Variant breytur þegar þú getur beinlínis notað tilgreinda gagnategund .