Ahogy az Excel makrók egyre robusztusabbá és összetettebbé válnak, azt tapasztalhatja, hogy veszítenek teljesítményükből. Amikor makrókról beszélünk, a teljesítmény szó általában a sebesség szinonimája . A sebesség az, hogy a VBA-eljárások milyen gyorsan hajtják végre a tervezett feladatokat. Az alábbiakban tíz módszert mutatunk be, amellyel az Excel-makrók optimális teljesítményszinten futhatnak.
Lapszámítások leállítása
Tudta, hogy minden alkalommal, amikor a táblázat bármely képletét befolyásoló cellát módosítanak vagy manipulálnak, az Excel újraszámolja a teljes munkalapot? A nagy mennyiségű képletet tartalmazó munkalapokon ez a viselkedés drasztikusan lelassíthatja a makrókat.
Az Application.Calculation tulajdonság segítségével az Excel kézi számítási módba váltásra utasíthatja. Ha egy munkafüzet kézi számítási módban van, a munkafüzet nem számít újra, amíg az F9 billentyű lenyomásával kifejezetten nem indítja el a számítást.
Helyezze az Excelt kézi számítási módba, futtassa a kódot, majd váltson vissza automatikus számítási módba.
Almakró1()
Application.Calculation = xlCalculationManual
„Helyezze ide a makrókódját
Application.Calculation = xlCalculationAutomatic
Vége Sub
Ha a számítási módot visszaállítja xlCalculationAutomatic-ra, akkor a munkalap újraszámítása automatikusan elindul, így a makró futtatása után nem kell megnyomnia az F9 billentyűt.
A munkalap képernyőfrissítésének letiltása
Észreveheti, hogy amikor a makrók futnak, a képernyő eléggé villog. Ez a villogás azt jelenti, hogy az Excel megpróbálja átrajzolni a képernyőt, hogy megjelenítse a munkalap aktuális állapotát. Sajnos minden alkalommal, amikor az Excel újrarajzolja a képernyőt, lefoglalja a memória erőforrásait.
Az Application.ScreenUpdating tulajdonság használatával letilthatja a képernyőfrissítéseket, amíg a makró be nem fejeződik. A képernyőfrissítés letiltása időt és erőforrásokat takarít meg, így a makró egy kicsit gyorsabban futhat. A makrókód futása után újra bekapcsolhatja a képernyőfrissítést.
Almakró1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Hamis
„Helyezze ide a makrókódját
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Igaz
Vége Sub
Miután visszaállította a ScreenUpdating tulajdonságot True értékre, az Excel automatikusan elindítja a képernyő újrarajzolását.
Az állapotsor frissítéseinek kikapcsolása
Az Excel állapotsora, amely az Excel ablakának alján jelenik meg, általában megjeleníti bizonyos műveletek előrehaladását az Excelben. Ha a makró sok adattal működik, az állapotsor bizonyos erőforrásokat foglal el.
Fontos megjegyezni, hogy a képernyőfrissítés kikapcsolása elkülönül az állapotsor megjelenítésének kikapcsolásától. Az állapotsor akkor is frissül, ha letiltja a képernyőfrissítést. Az Application.DisplayStatusBar tulajdonság segítségével ideiglenesen letilthatja az állapotsor frissítéseit, tovább javítva ezzel a makró teljesítményét:
Almakró1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Hamis
Application.DisplayStatusBar = False
„Helyezze ide a makrókódját
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Igaz
Application.DisplayStatusBar = Igaz
Vége Sub
Az Excel figyelmen kívül hagyása az eseményekről
A makrókat eseményeljárásként valósíthatja meg, és megmondja az Excelnek, hogy futtasson bizonyos kódot, amikor egy munkalap vagy munkafüzet megváltozik.
Néha a szabványos makrók olyan változtatásokat hajtanak végre, amelyek eseményeljárást indítanak el. Például, ha van egy szabványos makrója, amely több cellát is kezel az 1. munkalapon, minden egyes alkalommal, amikor egy cellát módosítanak azon a munkalapon, a makrónak szüneteltetnie kell, amíg a Worksheet_Change esemény fut.
Az EnableEvents tulajdonság használatával az Excel figyelmen kívül hagyja az eseményeket, miközben a makró fut, további teljesítménynövelési szintet adhat hozzá.
A makró futtatása előtt állítsa az EnableEvents tulajdonságot False értékre. A makrókód futtatása után az EnableEvents tulajdonságot visszaállíthatja True értékre.
Almakró1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Hamis
Application.DisplayStatusBar = False
Application.EnableEvents = False
„Helyezze ide a makrókódját
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Igaz
Application.DisplayStatusBar = Igaz
Application.EnableEvents = Igaz
Vége Sub
Az oldaltörések elrejtése
Minden alkalommal, amikor a makró módosítja a sorok számát, módosítja az oszlopok számát vagy módosítja a munkalap oldalbeállításait, az Excelnek időt kell szánnia a lapon megjelenő oldaltörések újraszámítására.
Ezt a viselkedést elkerülheti, ha egyszerűen elrejti az oldaltöréseket a makró elindítása előtt.
Az oldaltörések elrejtéséhez állítsa a DisplayPageBreaks laptulajdonságot False értékre. Ha továbbra is szeretné megjeleníteni az oldaltöréseket a makró futtatása után, állítsa vissza a DisplayPageBreaks laptulajdonságot True értékre.
Almakró1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = Hamis
Application.DisplayStatusBar = False
Application.EnableEvents = False
Activesheet.DisplayPageBreaks = Hamis
„Helyezze ide a makrókódját
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = Igaz
Application.DisplayStatusBar = Igaz
Application.EnableEvents = Igaz
Activesheet.DisplayPageBreaks = Igaz
Vége Sub
A kimutatástábla frissítéseinek felfüggesztése
Ha a makró nagy adatforrásokat tartalmazó pivot táblákat manipulál, gyenge teljesítményt tapasztalhat például pivot mezők dinamikus hozzáadása vagy mozgatása során.
Javíthatja a makró teljesítményét, ha felfüggeszti a pivot tábla újraszámítását mindaddig, amíg az összes pivot mező módosítást el nem végezte. Egyszerűen állítsa a PivotTable.ManualUpdate tulajdonságot True értékre az újraszámítás elhalasztásához, futtassa a makrókódot, majd állítsa vissza a PivotTable.ManualUpdate tulajdonságot False értékre az újraszámítás elindításához.
Almakró1()
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=True
„Helyezze ide a makrókódját
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=False
Vége Sub
Kerülje a másolást és beillesztést
Fontos megjegyezni, hogy bár a Macro Recorder időt takarít meg azzal, hogy VBA-kódot ír Önnek, nem mindig a leghatékonyabb kódot írja meg. Kiváló példa arra, hogy a Macro Recorder hogyan rögzít minden másolási és beillesztési műveletet, amelyet rögzítés közben hajt végre.
A makrókat enyhén felerősítheti, ha kivágja a közvetítőt, és közvetlenül másol egy cellát a célcellába. Ez az alternatív kód a Destination argumentumot használja a vágólap megkerülésére, és az A1 cella tartalmának közvetlenül a B1 cellába másolására.
Tartomány("A1").Cél másolása:=Tartomány("B1")
Ha csak értékeket kell másolnia (a formázást vagy a képleteket nem), a teljesítményt még jobban növelheti, ha elkerüli a Másolás módszert. Egyszerűen állítsa be a célcella értékét a forráscellában található értékre. Ez a módszer körülbelül 25-ször gyorsabb, mint a másolási módszer:
Tartomány("B1").Érték = Tartomány("A1").Érték
Ha csak képleteket kell átmásolnia egyik cellából a másikba (nem értékeket vagy formázást), beállíthatja a célcella képletét a forráscellában található képletre:
Tartomány("B1").Képlet = Tartomány("A1").Képlet
A With utasítás használatával
Makrók rögzítésekor gyakran többször is manipulálhatja ugyanazt az objektumot. Időt takaríthat meg és javíthatja a teljesítményt, ha a With utasítással több műveletet hajt végre egy adott objektumon egy felvételben.
A következő példában használt With utasítás arra utasítja az Excelt, hogy az összes formázási változtatást egyszerre alkalmazza:
Tartomány("A1").Font
.Bold = Igaz
.Dőlt = Igaz
.Aláhúzás = xlUnderlineStyleSingle
Vége ezzel
Ha megszokja, hogy a műveleteket a With utasításokba csoportosítsa, akkor nem csak gyorsabban futnak majd a makrók, hanem könnyebbé válik a makrókódok beolvasása is.
A Select módszer elkerülése
A Macro Recorder előszeretettel használja a Select metódust az objektumok explicit kijelölésére, mielőtt műveleteket hajtana végre rajtuk. Általában nincs szükség az objektumok kiválasztására, mielőtt velük dolgozna. Valójában drámaian javíthatja a makró teljesítményét, ha nem használja a Select módszert.
A makrók rögzítése után tegye szokássá, hogy módosítsa a generált kódot a Select metódusok eltávolítása érdekében. Ebben az esetben az optimalizált kód a következőképpen néz ki:
Sheets("Sheet1").Tartomány("A1").FormulaR1C1 = "1000"
Sheets("Sheet2").Tartomány("A1").FormulaR1C1 = "1000"
Sheets("Sheet3").Tartomány("A1").FormulaR1C1 = "1000"
Vegye figyelembe, hogy a semmi van kiválasztva. A kód egyszerűen az objektumhierarchiát használja a szükséges műveletek végrehajtásához.
Az utazások korlátozása a munkalapra
A makrók felgyorsításának másik módja az, hogy korlátozza a munkalapadatokra való hivatkozások számát a kódban. Mindig kevésbé hatékony az adatok lekérése a munkalapról, mint a memóriából. Ez azt jelenti, hogy a makrók sokkal gyorsabban futnak, ha nem kell többszörösen interakcióba lépniük a munkalappal.
Például a következő egyszerű kód arra kényszeríti a VBA-t, hogy folyamatosan visszatérjen a Sheets(“Sheet1”).Range(“A1”)-hez, hogy megkapja az If utasításban végrehajtandó összehasonlításhoz szükséges számot:
A jelentés hónapja esetén = 1-től 12-ig
Ha Tartomány("A1").Érték = ReportMonth Akkor
MsgBox 1000000 / JelentésHónap
Vége Ha
Következő jelentés hónap
Sokkal hatékonyabb módszer, ha az értéket a Sheets(“Sheet1”).Range(“A1”) mappába mentjük a MyMonth nevű változóba. Így a kód a MyMonth változóra hivatkozik a munkalap helyett:
Dim MyMonth egész számként
Saját hónap = Tartomány("A1").Érték
A jelentés hónapja esetén = 1-től 12-ig
Ha MyMonth = JelentésHónap Akkor
MsgBox 1000000 / JelentésHónap
Vége Ha
Következő jelentés hónap
Fontolja meg a változók kihasználását a memóriában lévő adatokkal való munkavégzéshez, a munkalapokra való közvetlen hivatkozás helyett.
Kerülje a túlzott hivatkozást
Egy objektum metódusának vagy tulajdonságának meghívásakor át kell mennie az OLE összetevő IDispatch felületén. Ezen OLE-összetevők hívása időt vesz igénybe, így az OLE-összetevőkre való hivatkozások számának csökkentése javíthatja a makrókód sebességét.
Az objektumtulajdonságok vagy metódusok meghívásához általában az Object.Method ábrázolási módszerét használják, azaz a "." szimbólum a tulajdonságok és metódusok meghívására szolgál.
Ezért a metódus- vagy tulajdonsághívások száma a "." szimbólumok száma alapján ítélhető meg. Minél kevesebb a "." szimbólum, annál gyorsabban fut a kód.
Például a következő utasítás 3 "." szimbólumot tartalmaz.
ThisWorkbook.Sheet1.Range("A1").Value = 100
A következő állításnak csak egy "." szimbóluma van.
Activewindow.Top = 100
Íme néhány trükk a "." szimbólumok számának csökkentésére. gyorsabban futni.
Először is, ha ismételten hivatkoznia kell ugyanarra az objektumra, beállíthatja az objektumot egy változóra a hívások számának csökkentése érdekében. Például a következő kód vonalonként két hívást igényel.
ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = 100
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = 200
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = 300
Mivel a Sheets("Sheet1") objektumra többször kell hivatkozni, először beállítható egy sht változóra , így minden kódot csak egyszer kell meghívni.
Set sht = ThisWorkbook.Sheets("Sheet1")
sht.Cells(1, 1) = 100
sht.Cells(2, 1) = 200
sht.Cells(3, 1) = 300
Másodszor, ha nem akarunk ideiglenes sht változót deklarálni, használhatjuk a korábban említett With utasítást is. A következő példában látható módon:
With ThisWorkbook.Sheets("Sheet1")
.Cells(1, 1) = 100
.Cells(2, 1) = 200
.Cells(3, 1) = 300
End With
Harmadszor, ha sok a ciklus, próbálja meg a tulajdonságokat és metódusokat a cikluson kívül tartani. Ha ugyanazon objektum egy tulajdonságértékét ismételten felhasználja egy hurokban, először hozzárendelheti a tulajdonság értékét egy megadott változóhoz a hurkon kívül, majd használhatja a hurokban lévő változót, amellyel gyorsabb sebesség érhető el. A következő példában látható módon:
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
Ebben a példában minden ciklus megkapja a Cells(1,2) cella Value tulajdonságát. Ha a Cells(1.2) Value tulajdonságát a ciklus megkezdése előtt hozzárendeli egy változóhoz, akkor gyorsabban fut. A következő példában látható módon:
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
A fenti kód a ThisWorkbook.Sheets("Sheet1") függvényt minden alkalommal meghívja, amikor ismétlődik. Ezt gyorsabban megteheti, ha a With utasítással a cikluson kívülre helyezi át a hívást a ThisWorkbook.Sheets("Sheet1") oldalra. A következő példában látható módon:
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
Kerülje a változattípusok használatát
A kezdők általában előnyben részesítik a Variant típusú változókat, aminek az az előnye, hogy kevésbé bonyolult, mivel bármilyen típusú adat felhasználható a memória túlcsordulási problémája nélkül, ha az adatok túl nagyok az Integer vagy Long adattípusokhoz. A Varienmt típusú adatok azonban több extra memóriaterületet igényelnek, mint a többi megadott típus (2 bájt egész adatokhoz, 4 bájt hosszú adatokhoz és 16 bájt Variant adatokhoz), a VBA több időt igényel a Variant típusú adatok feldolgozásához, mint a többi megadott típus. adatokból. Ahogy a következő példa mutatja.
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
A fenti kódban a 8-tól 13-ig terjedő sorok 1 millió összeadási, kivonási, szorzási és osztási műveletet hajtanak végre a Variant változók, a 17-22 sorok pedig 1 millió műveletet egész változók összeadására, kivonására, szorzására és osztására. Számítógépemen a Variant változó működése körülbelül 0,09375 másodpercig, míg az Integer változó működése körülbelül 0,03125 másodpercig tartott. Az eredmények számítógépenként változhatnak, de a Variant változók lényegesen lassabbak, mint az Integer változók .
Emiatt ajánlatos kerülni a Variant változók használatát, ha kifejezetten használhatja a megadott adattípust .