10 módszer a makrók felgyorsítására

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 .

Leave a Comment

Lábjegyzetek és végjegyzetek létrehozása a Word 2013-ban

Lábjegyzetek és végjegyzetek létrehozása a Word 2013-ban

Lábjegyzetek és végjegyzetek létrehozása a Word 2013-ban. Részletes útmutató, hogyan készíthet különféle stílusú jegyzeteket bibliográfiai információkhoz vagy magyarázó megjegyzésekhez.

Hogyan lehet kiemelni a statisztikailag kiugró értékeket az Excelben

Hogyan lehet kiemelni a statisztikailag kiugró értékeket az Excelben

Tudjon meg mindent arról, hogyan lehet az Excelben kiemelni a statisztikailag kiugró értékeket, mégpedig egyszerű eszközökkel és módszerekkel. Kiemelt figyelmet fordítunk a kiugró értékek azonosítására és kezelésére.

Hogyan lehet mintát venni az adatokból Excelben

Hogyan lehet mintát venni az adatokból Excelben

Az Excel Mintavételi eszközével véletlenszerűen kiválaszthat elemeket egy adatkészletből vagy választhat minden n-edik elemet. Ismerje meg, hogyan használhatja ezt a hasznos funkciót az adatelemzéshez!

10 klassz trükk a Microsoft Word 2019 programmal

10 klassz trükk a Microsoft Word 2019 programmal

Fedezze fel a Microsoft Word 2019 legjobb trükkjeit, amelyek segítenek a hatékonyabb munkavégzésben. Tudd meg, hogyan használhatod ki a program funkcióit!

Bekezdések igazítása és behúzása a Word 2019-ben

Bekezdések igazítása és behúzása a Word 2019-ben

A Word 2019-ben a bekezdések igazítása és behúzása kulcsfontosságú a dokumentumok megfelelő megjelenítéséhez. Ismerje meg a formázási lehetőségeket és tippeket a hatékonyabb munkához.

Az Excel 2019 Solver használata

Az Excel 2019 Solver használata

Fedezze fel, hogyan használhatja az Excel 2019 Solver bővítményt a komplex problémák megoldására. A célcella, változócellák és kényszerek beállítása lépésről lépésre.

Dinamikus elemek hozzáadásához használja a Word 2019 mezőit

Dinamikus elemek hozzáadásához használja a Word 2019 mezőit

A Word lehetővé teszi dinamikus elemek hozzáadását a dokumentumhoz. Fedezze fel, hogyan lehet különböző mezőket használni a Word programban a dinamikus tartalom létrehozásához.

Oszloptípusok a SharePoint 2010-ben

Oszloptípusok a SharePoint 2010-ben

A SharePoint 2010 oszlopai az adatok tárolására szolgálnak. Fedezze fel a különböző oszlop típusokat és azok alkalmazását a SharePoint rendszeren belül.

A nem kívánt szöveg eltávolítása a Word 2013-ban

A nem kívánt szöveg eltávolítása a Word 2013-ban

A Word 2013 szövegtörlésének képessége kulcsfontosságú, legyen szó szövegalkotásról vagy törlésről. Ismerje meg a hatékony szövegtörlési módszereket!

Hogyan készítsünk fotóalbumot a PowerPoint 2016-ban

Hogyan készítsünk fotóalbumot a PowerPoint 2016-ban

A fotóalbum funkció a PowerPoint 2016-ban lehetővé teszi, hogy egyszerre több fényképet illesszen be egy prezentációba, megkönnyítve ezzel a többszörös képek kezelését.