VBA: Javítani kell a sebességet és más bevált gyakorlatokat

Ez az oktatóanyag megvitatja, hogyan lehet felgyorsítani a VBA makrókat és más VBA bevált gyakorlatokat.

A VBA -kód felgyorsításának beállításai

Az alábbiakban néhány tippet talál a VBA -kód felgyorsításához. A tippek lazán szerveződnek fontosság szerint.

A legegyszerűbb módja a VBA -kód gyorsításának a képernyőfrissítés letiltásával és az automatikus számítások letiltásával. Ezeket a beállításokat le kell tiltani minden nagy eljárásban.

A képernyőfrissítés letiltása

Alapértelmezés szerint az Excel valós időben jeleníti meg a munkafüzet (ek) változásait, amint a VBA-kód fut. Ez nagymértékben lassítja a feldolgozási sebességet, mivel az Excel a legtöbb kódot értelmezi és megjeleníti az egyes kódsorok változásait.

A képernyőfrissítés kikapcsolása:

1 Application.ScreenUpdating = Hamis

A makró végén vissza kell kapcsolnia a képernyőfrissítést:

1 Application.ScreenUpdating = Igaz

Amíg a kód fut, előfordulhat, hogy frissítenie kell a képernyőt. Nincs „frissítés” parancs. Ehelyett vissza kell kapcsolnia a képernyőfrissítést, és újra le kell tiltania.

Állítsa a Számításokat kézi értékre

Amikor egy cellaértéket megváltoztat, az Excelnek követnie kell a „számítási fát” az összes függő cella újraszámításához. Továbbá, amikor egy képletet módosítanak, az Excelnek frissítenie kell a „számítási fát” az összes függő cella újraszámítása mellett. A munkafüzet méretétől függően ezek az újraszámítások a makrók indokolatlan lefutását okozhatják.

A számítások manuális beállításához:

1 Application.Calculation = xlManual

A teljes munkafüzet kézi újraszámításához:

1 Kiszámítja

Megjegyzés: a sebesség növelése érdekében szükség esetén csak egy lapot, tartományt vagy egyedi cellát is kiszámíthat.

Az automatikus számítások visszaállítása (az eljárás végén):

1 Alkalmazás. Számítás = xlAutomatikus

Fontos! Ez egy Excel beállítás. Ha nem állítja vissza a számításokat automatikusra, akkor a munkafüzet addig nem számítja újra, amíg nem mondja meg.

Látni fogja a legnagyobb fejlesztéseket a fenti beállításokból, de számos más beállítás is változtathat:

Események letiltása

Az események különleges kiváltó okok rendezvényi eljárások futni. Példák: ha a munkalap bármely cellája megváltozik, amikor egy munkalap aktiválva van, amikor megnyit egy munkafüzetet, mielőtt ment egy munkafüzetet, stb.

Az események letiltása kisebb sebességnövekedést okozhat bármely makró futtatásakor, de a sebességnövekedés sokkal nagyobb lehet, ha a munkafüzet eseményeket használ. És bizonyos esetekben az események letiltása szükséges a végtelen ciklusok létrehozásának elkerülése érdekében.

Az események letiltása:

1 Application.EnableEvents = Hamis

Az események visszakapcsolásához:

1 Application.EnableEvents = Igaz

A PageBreaks letiltása

A PageBreaks letiltása bizonyos helyzetekben segíthet:

  • Korábban beállított egy PageSetup tulajdonságot a megfelelő munkalaphoz és a VBA eljárás sok sor vagy oszlop tulajdonságait módosítja
  • VAGY A VBA eljárás kényszeríti az Excel -t az oldaltörések kiszámítására (a Nyomtatási előnézet megjelenítése vagy a PageSetup tulajdonságainak módosítása).

A PageBreaks letiltása:

1 ActiveSheet.DisplayPageBreaks = Hamis

A PageBreaks újbóli engedélyezése:

1 ActiveSheet.DisplayPageBreaks = Igaz

Bevált módszerek a VBA sebességének javítására

Kerülje az aktiválást és a kiválasztást

Makró rögzítésekor számos aktiválási és kiválasztási módot láthat:

12345678 Sub Slow_Example ()Táblázatok ("Sheet2"). Válassza a lehetőségetTartomány ("D9"). Válassza kiActiveCell.FormulaR1C1 = "példa"Tartomány ("D12"). Válassza kiActiveCell.FormulaR1C1 = "demo"Tartomány ("D13"). Válassza kiEnd Sub

Az objektumok aktiválása és kiválasztása általában felesleges, rendetlenséget adnak a kódhoz, és nagyon időigényesek. Ha lehetséges, kerülje ezeket a módszereket.

Javított példa:

1234 Gyors_Example ()Táblázatok ("Sheet2"). Tartomány ("D9"). FormulaR1C1 = "example"Táblázatok ("Sheet2"). Tartomány ("D12"). FormulaR1C1 = "demo"End Sub

Kerülje a másolást és beillesztést

A másolás jelentős memóriát igényel. Sajnos nem mondhatja a VBA -nak, hogy törölje a belső memóriát. Ehelyett az Excel (látszólag) meghatározott időközönként törli belső memóriáját. Tehát ha sok másolási és beillesztési műveletet hajt végre, akkor fennáll annak a veszélye, hogy túl sok memóriát húz be, ami drasztikusan lelassíthatja a kódot, vagy akár összeomolhat az Excel.

Másolás és beillesztés helyett fontolja meg a cellák értéktulajdonságainak beállítását.

123456789 Sub CopyPaste ()- LassabbanTartomány ("a1: a1000"). Másolási tartomány ("b1: b1000")- GyorsabbanTartomány ("b1: b1000"). Érték = Tartomány ("a1: a1000"). ÉrtékEnd Sub

Használja a For For hurkok helyett For For hurkok

Amikor objektumokon keresztül hurkol, a For For hurok gyorsabb, mint a For Loop. Példa:

Ez a hurokhoz:

123456 1. alhurok ()dim i mint RangeI = 1 és 100 közöttSejtek (i, 1). Érték = 1Következő iEnd Sub
Minden huroknál lassabb:
123456 2. ciklus ()Homályos cella mint tartományA tartomány minden cellájához ("a1: a100")cella.Érték = 1Következő cellaEnd Sub

Változók deklarálása / Explicit opció használata

A VBA nem írja elő a változók deklarálását, hacsak nem adja hozzá az Explicit opciót a modul tetejéhez:
1 Explicit lehetőség
Az Option Explicit hozzáadása a legjobb kódolási gyakorlat, mivel csökkenti a hibák valószínűségét. Emellett kényszeríti a változók deklarálására, ami kissé megnöveli a kód sebességét (az előnyök annál észrevehetőbbek, minél többet használnak változót).Hogyan akadályozza meg az Option Explicit a hibákat?Az Option Explicit legnagyobb előnye, hogy segít a változónév helyesírási hibáinak észlelésében. Például a következő példában beállítottunk egy „var1” nevű változót, de később a „varl” nevű változóra hivatkozunk. A „varl” változót nem határozták meg, ezért üres, váratlan eredményeket okozva.
1234 Sub OptionExplicit ()var1 = 10MsgBox varlEnd Sub

Használja - Vége a nyilatkozatokkal

Ha többször hivatkozik ugyanazokra az objektumokra (például tartományok, munkalapok, munkafüzetek), fontolja meg a With Statement használatát. Gyorsabb a feldolgozása, megkönnyíti a kód olvasását és egyszerűsíti a kódot.Kijelentési példával:
12345678 Gyorsabb alpélda ()Táblákkal ("Sheet2").Range ("D9"). KépletR1C1 = "példa".Range ("D12"). FormulaR1C1 = "demo".Tartomány ("D9"). Betűtípus. Félkövér = Igaz.Tartomány ("D12"). Betűtípus. Félkövér = IgazVége ezzelEnd Sub
Gyorsabb, mint:
123456 Sub Slow_Example ()Táblázatok ("Sheet2"). Tartomány ("D9"). FormulaR1C1 = "example"Táblázatok ("Sheet2"). Tartomány ("D12"). FormulaR1C1 = "demo"Táblázatok ("Sheet2"). Tartomány ("D9"). Font.Bold = IgazTáblázatok ("Sheet2"). Tartomány ("D12"). Font.Bold = IgazEnd Sub

Fejlett legjobb gyakorlatok

A UserInterfaceOnly védelme

Jó gyakorlat, ha megvédi a munkalapjait a nem védett cellák szerkesztésétől, nehogy a végfelhasználó (vagy Ön!) Véletlenül megrongálja a munkafüzetet. Ez azonban megvédi a munkalapokat is attól, hogy a VBA változtatásokat hajtson végre. Ezért fel kell oldania a munkalapok védelmét, és újra meg kell védenie őket, ami nagyon sok időt vesz igénybe, ha sok lapon történik.

12345 Védelem allapja ()Táblázatok („1. lap”). A „jelszó védelmének megszüntetése”„Lap szerkesztése1Táblázatok („1. lap”). Védje a „jelszót”End Sub

Ehelyett megvédheti a lapokat a UserInterfaceOnly: = True beállítással. Ez lehetővé teszi, hogy a VBA módosítsa a lapokat, miközben megvédi őket a felhasználóktól.

1 Táblázatok („sheet1”). Protect Password: = "password", UserInterFaceOnly: = True

Fontos! A UserInterFaceOnly minden alkalommal, amikor a munkafüzet megnyílik, visszaáll False értékre. Tehát ennek a fantasztikus funkciónak a használatához a Workbook_Open vagy az Auto_Open eseményeket kell használnia a beállítás beállításához a munkafüzet minden megnyitásakor.

Helyezze be ezt a kódot a Thisbookbook modulba:

123456 Privát almunkafüzet_nyitva ()Dim ws munkalapkéntMinden egyes munkalaphozws.Protect Jelszó: = "jelszó", UserInterFaceOnly: = IgazKövetkező wsEnd Sub

vagy ezt a kódot bármely normál modulban:

123456 Privát al Auto_Open ()Dim ws munkalapkéntMinden egyes munkalaphozws.Protect Jelszó: = "jelszó", UserInterFaceOnly: = IgazKövetkező wsEnd Sub

A tömbök segítségével nagy tartományokat szerkeszthet

Nagyon időigényes lehet a sejtek nagy tartományainak manipulálása (pl. 100 000+). Ahelyett, hogy ciklusok között ciklusozna, minden cellát manipulálna, betöltheti a cellákat egy tömbbe, feldolgozhatja a tömb minden elemét, majd visszaadhatja a tömböt az eredeti cellákba. A cellák betöltése tömbökbe manipuláció céljából sokkal gyorsabb lehet.

1234567891011121314151617181920212223242526272829303132 Sub LoopRange ()Homályos cella mint tartományDim tStart As DoubletStart = IdőzítőA tartomány minden cellájához ("A1: A100000")cella.Érték = cella.Érték * 100Következő cellaHibakeresési nyomtatás (időzítő - tStart) és "másodperc"End SubSub LoopArray ()Dim arr mint változatDim item As VariantDim tStart As DoubletStart = Időzítőarr = Tartomány ("A1: A100000"). ÉrtékMinden egyes tételhez Megéritem = item * 100Következő elemTartomány ("A1: A100000"). Érték = arrHibakeresési nyomtatás (időzítő - tStart) és "másodperc"End Sub

Segít a fejlesztés a helyszínen, megosztva az oldalt a barátaiddal

wave wave wave wave wave