VBA pro Excel 2016 je rychlý, ale není vždy dostatečně rychlý. (Počítačové programy nejsou nikdy dost rychlé.) Pokračujte ve čtení a objevte příklady programování, které můžete použít k urychlení maker.
Vypínání aktualizace obrazovky
Při provádění makra můžete sedět a sledovat všechny akce na obrazovce, které se v makru vyskytují. Ačkoli to může být poučné, po správném fungování makra je to často nepříjemné a může to výrazně zpomalit výkon vašeho makra. Naštěstí můžete zakázat aktualizaci obrazovky, ke které normálně dochází při spuštění makra. Chcete-li vypnout aktualizaci obrazovky, použijte následující prohlášení:
Application.ScreenUpdating = False
Pokud chcete, aby uživatel viděl, co se děje v kterémkoli okamžiku makra, použijte následující příkaz k opětovnému zapnutí aktualizace obrazovky:
Application.ScreenUpdating = True
Chcete-li demonstrovat rozdíl v rychlosti, spusťte toto jednoduché makro, které vyplní rozsah čísly:
Sub FillRange()
Dim r as Long, c As Long
Ztlumené číslo jako dlouhé
Číslo = 0
Pro r = 1 až 50
Pro c = 1 až 50
Číslo = Číslo + 1
Cells(r, c).Vyberte
Cells(r, c).Hodnota = číslo
Další c
Další r
End Sub
Vidíte, že každá buňka je vybrána a hodnota se zadává do buněk. Nyní vložte následující příkaz na začátek procedury a proveďte jej znovu:
Application.ScreenUpdating = False
Rozsah se plní mnohem rychleji a výsledek nevidíte, dokud není makro spuštěno a aktualizace obrazovky není (automaticky) nastavena na True.
Když ladíte kód, provádění programu někdy skončí někde uprostřed, aniž byste znovu zapnuli aktualizaci obrazovky. To někdy způsobí, že okno aplikace Excelu zcela přestane reagovat. Cesta ven z tohoto zmrazeného stavu je jednoduchá: Vraťte se zpět do VBE a proveďte následující příkaz v okně Immediate:
Application.ScreenUpdating = True
Vypnutí automatického výpočtu
Pokud máte list s mnoha složitými vzorci, možná zjistíte, že můžete věci značně urychlit nastavením režimu výpočtu na ruční během provádění makra. Po dokončení makra nastavte režim výpočtu zpět na automatický.
Následující příkaz nastaví režim výpočtu Excel na ruční:
Application.Calculation = xlCalculationManual
Provedením následujícího příkazu nastavte režim výpočtu na automatický:
Application.Calculation = xlCalculationAutomatic
Pokud váš kód používá buňky s výsledky vzorců, vypnutí výpočtu znamená, že buňky nebudou přepočítány, pokud Excel výslovně nepřikážete, aby to udělal!
Odstranění těch otravných výstražných zpráv
Jak víte, makro může automaticky provádět řadu akcí. V mnoha případech můžete spustit makro a pak jít do odpočinkové místnosti, zatímco Excel dělá svou věc. Některé operace aplikace Excel však zobrazují zprávy, které vyžadují lidskou reakci. Tyto typy zpráv znamenají, že nemůžete nechat Excel bez dozoru, když provádí vaše makro – pokud neznáte tajný trik.
Můžete aplikaci Excel přikázat, aby při spuštění makra nezobrazovala tyto typy výstrah.
Tajným trikem, jak se těmto výstražným zprávám vyhnout, je vložení následujícího příkazu VBA do makra:
Application.DisplayAlerts = False
Excel provede výchozí operaci pro tyto typy zpráv. V případě odstranění listu je výchozí operací Odstranit. Pokud si nejste jisti, jaká je výchozí operace, proveďte test, abyste viděli, co se stane.
Po ukončení procedury Excel automaticky obnoví vlastnost DisplayAlerts na hodnotu True. Pokud potřebujete výstrahy znovu zapnout před ukončením procedury, použijte toto prohlášení:
Application.DisplayAlerts = True
Zjednodušení odkazů na objekty
Jak už asi víte, odkazy na objekty mohou být velmi zdlouhavé. Plně kvalifikovaný odkaz na objekt Range může například vypadat takto:
Sešity („MyBook.xlsx“). Pracovní listy („List1“) _
.Rozsah (“úroková sazba”)
Pokud vaše makro často používá tento rozsah, můžete vytvořit proměnnou objektu pomocí příkazu Set. Například následující příkaz přiřadí tento objekt Range k proměnné objektu s názvem Rate:
Nastavit sazbu = sešity(“MyBook.xlsx”) _
.Worksheets(“List1”).Rozsah(”Úroková sazba”)
Po definování této proměnné objektu můžete místo dlouhého odkazu použít proměnnou Rate. Můžete například změnit hodnotu buňky s názvem Úroková míra:
Rate.Value = 0,085
Toto je mnohem jednodušší napsat než následující prohlášení:
Sešity („MyBook.xlsx“). Pracovní listy („List1“). _
Rozsah („Úroková sazba“) = 0,085
Kromě zjednodušení kódování použití objektových proměnných značně urychlí vaše makra.
Deklarování typů proměnných
Obvykle se nemusíte starat o typ dat, která proměnné přiřadíte. Excel za vás vyřídí všechny detaily v zákulisí. Pokud máte například proměnnou s názvem MyVar, můžete této proměnné přiřadit číslo libovolného typu. Později v postupu mu můžete dokonce přiřadit textový řetězec.
Pokud chcete, aby se vaše procedury spouštěly co nejrychleji, sdělte Excelu, jaký typ dat bude přiřazen každé z vašich proměnných. Toto je známé jako deklarování typu proměnné.
Obecně byste měli používat datový typ, který vyžaduje nejmenší počet bajtů, přesto dokáže zpracovat všechna data, která jsou mu přiřazena. Když VBA pracuje s daty, rychlost provádění závisí na počtu bajtů, které má VBA k dispozici. Jinými slovy, čím méně bajtů data používají, tím rychleji může VBA přistupovat a manipulovat s daty. Výjimkou je datový typ Integer. Pokud je rychlost kritická, použijte místo toho datový typ Long.
Pokud používáte proměnnou objektu, můžete proměnnou deklarovat jako konkrétní typ objektu. Zde je příklad:
Míra ztlumení jako rozsah
Nastavit sazbu = sešity(“MyBook.xlsx”) _
.Worksheets(“List1”).Rozsah(”Úroková sazba”)
Použití struktury With-End With
Potřebujete pro objekt nastavit řadu vlastností? Pokud použijete strukturu With-End With, váš kód běží rychleji. Další výhodou je, že váš kód může být snadněji čitelný.
Následující kód nepoužívá With-End With:
Selection.HorizontalAlignment = xlCenter
Selection.VerticalAlignment = xlCenter
Selection.WrapText = True
Výběr. Orientace = 0
Selection.ShrinkToFit = False
Selection.MergeCells = False
Zde je stejný kód, přepsaný tak, aby používal With-End With:
S výběrem
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = Pravda
.Orientace = 0
.ShrinkToFit = False
.MergeCells = False
Konec s
Když použijete With-End With, ujistěte se, že každý příkaz začíná tečkou.