10 způsobů, jak urychlit vaše makra

Jak jsou vaše makra Excelu stále robustnější a složitější, můžete zjistit, že ztrácejí výkon. Když se mluví o makrech, slovo výkon je obvykle synonymem pro rychlost . Rychlost udává, jak rychle vaše procedury VBA provádějí zamýšlené úkoly. Následuje deset způsobů, jak udržet vaše makra Excel spuštěná na optimální úrovni výkonu.

Zastavení výpočtů listů

Věděli jste, že pokaždé, když je buňka, která ovlivňuje jakýkoli vzorec v tabulce, změněna nebo manipulována, Excel přepočítá celý list? V listech, které obsahují velké množství vzorců, může toto chování výrazně zpomalit vaše makra.

Vlastnost Application.Calculation můžete použít k tomu, aby Excel přepnul do režimu ručního výpočtu. Když je sešit v režimu ručního výpočtu, sešit se nepřepočítá, dokud explicitně nespustíte výpočet stisknutím klávesy F9.

Umístěte Excel do režimu ručního výpočtu, spusťte kód a poté se přepněte zpět do režimu automatického výpočtu.

Dílčí makro1()
Application.Calculation = xlCalculationManual
 „Sem vložte kód makra
Application.Calculation = xlCalculationAutomatic
End Sub

Nastavení režimu výpočtu zpět na xlCalculationAutomatic automaticky spustí přepočet listu, takže po spuštění makra není nutné mačkat klávesu F9.

Zakázání aktualizace obrazovky listu

Můžete si všimnout, že když vaše makra běží, vaše obrazovka docela bliká. Toto blikání se Excel pokouší překreslit obrazovku tak, aby ukazovala aktuální stav listu. Bohužel pokaždé, když Excel překreslí obrazovku, zabere paměťové prostředky.

Pomocí vlastnosti Application.ScreenUpdating můžete zakázat aktualizace obrazovky, dokud nebude vaše makro dokončeno. Vypnutí aktualizace obrazovky šetří čas a zdroje a umožňuje, aby vaše makro běželo o něco rychleji. Po dokončení běhu kódu makra můžete aktualizaci obrazovky znovu zapnout.

Dílčí makro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
 „Sem vložte kód makra
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

Po nastavení vlastnosti ScreenUpdating zpět na True Excel automaticky spustí překreslení obrazovky.

Vypnutí aktualizací stavového řádku

Stavový řádek aplikace Excel, který se zobrazuje ve spodní části okna aplikace Excel, obvykle zobrazuje průběh určitých akcí v aplikaci Excel. Pokud vaše makro pracuje s velkým množstvím dat, stavový řádek zabere určité prostředky.

Je důležité si uvědomit, že vypnutí aktualizace obrazovky je oddělené od vypnutí zobrazení stavového řádku. Stavový řádek se bude nadále aktualizovat, i když aktualizaci obrazovky zakážete. Vlastnost Application.DisplayStatusBar můžete použít k dočasnému zakázání všech aktualizací stavového řádku a dále zlepšit výkon vašeho makra:

Dílčí makro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
 „Sem vložte kód makra
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
End Sub

Řekněte Excelu, aby ignoroval události

Makra můžete implementovat jako procedury událostí, které sdělují Excelu, aby spustil určitý kód, když se změní list nebo sešit.

Někdy standardní makra provedou změny, které spustí proceduru události. Pokud máte například standardní makro, které manipuluje s několika buňkami na List1, pokaždé, když se buňka na tomto listu změní, musí se vaše makro pozastavit, dokud se spustí událost Worksheet_Change.

Další úroveň zvýšení výkonu můžete přidat pomocí vlastnosti EnableEvents, která Excelu řekne, aby ignoroval události, když je vaše makro spuštěno.

Před spuštěním makra nastavte vlastnost EnableEvents na hodnotu False. Po dokončení vašeho kódu makra můžete nastavit vlastnost EnableEvents zpět na hodnotu True.

Dílčí makro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
 „Sem vložte kód makra
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
End Sub

Skrytí konců stránek

Pokaždé, když vaše makro upraví počet řádků, upraví počet sloupců nebo změní nastavení stránky listu, Excel je nucen přepočítat konce stránek zobrazené na listu.

Tomuto chování se můžete vyhnout tak, že před spuštěním makra jednoduše skryjete konce stránek.

Chcete-li skrýt konce stránek, nastavte vlastnost listu DisplayPageBreaks na hodnotu False. Pokud chcete po spuštění makra nadále zobrazovat konce stránek, nastavte vlastnost listu DisplayPageBreaks zpět na hodnotu True.

Dílčí makro1()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
Activesheet.DisplayPageBreaks = False
 „Sem vložte kód makra
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
Activesheet.DisplayPageBreaks = True
End Sub

Pozastavení aktualizací kontingenční tabulky

Pokud vaše makro manipuluje s kontingenčními tabulkami, které obsahují velké zdroje dat, můžete zaznamenat slabý výkon při provádění věcí, jako je dynamické přidávání nebo přesouvání kontingenčních polí.

Výkon makra můžete zlepšit pozastavením přepočítávání kontingenční tabulky, dokud nebudou provedeny všechny změny kontingenčního pole. Jednoduše nastavte vlastnost PivotTable.ManualUpdate na hodnotu True, abyste odložili přepočet, spusťte kód makra a poté nastavte vlastnost PivotTable.ManualUpdate zpět na hodnotu False, aby se spustil přepočet.

Dílčí makro1()
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=True
 „Sem vložte kód makra
ActiveSheet.PivotTables("PivotTable1").ManualUpdate=Nepravda
End Sub

Vyhněte se kopírování a vkládání

Je důležité si pamatovat, že ačkoli Macro Recorder šetří čas tím, že za vás píše kód VBA, ne vždy píše nejefektivnější kód. Ukázkovým příkladem je, jak Macro Recorder zachytí jakoukoli akci kopírování a vkládání, kterou provádíte během nahrávání.

Svá makra můžete mírně posílit vyříznutím prostředníka a provedením přímého kopírování z jedné buňky do cílové buňky. Tento alternativní kód používá argument Cíl k vynechání schránky a zkopírování obsahu buňky A1 přímo do buňky B1.

Range("A1"). Kopírovat cíl:=Range("B1")

Pokud potřebujete kopírovat pouze hodnoty (nikoli formátování nebo vzorce), můžete výkon ještě zlepšit tím, že se vyhnete metodě Kopírovat dohromady. Jednoduše nastavte hodnotu cílové buňky na stejnou hodnotu jako ve zdrojové buňce. Tato metoda je přibližně 25krát rychlejší než použití metody kopírování:

Rozsah("B1").Hodnota = Rozsah("A1").Hodnota

Pokud potřebujete zkopírovat pouze vzorce z jedné buňky do druhé (nikoli hodnoty nebo formátování), můžete nastavit vzorec cílové buňky na stejný vzorec obsažený ve zdrojové buňce:

Rozsah("B1").Vzorec = Rozsah("A1").Vzorec

Použití příkazu With

Při nahrávání maker budete často manipulovat se stejným objektem vícekrát. Můžete ušetřit čas a zlepšit výkon použitím příkazu With k provedení několika akcí s daným objektem v jednom záběru.

Příkaz With použitý v následujícím příkladu říká Excelu, aby použil všechny změny formátování najednou:

    S rozsahem("A1").Písmo
    .Tučné = pravda
    .Italic = pravda
    .Underline = xlUnderlineStyleSingle
    Konec s

Když si zvyknete rozdělovat akce do příkazů With, vaše makra budou nejen rychlejší, ale také bude snazší číst váš kód makra.

Vyhýbejte se metodě Select

Macro Recorder s oblibou používá metodu Select k explicitnímu výběru objektů před provedením akcí. Obecně není potřeba objekty před prací s nimi vybírat. Ve skutečnosti můžete výrazně zlepšit výkon maker tím, že nepoužíváte metodu Select.

Po nahrání maker si zvykněte změnit vygenerovaný kód, abyste odstranili metody Select. V tomto případě by optimalizovaný kód vypadal takto:

    Sheets("Sheet1").Range("A1").FormulaR1C1 = "1000"
    Sheets("Sheet2").Range("A1").FormulaR1C1 = "1000"
    Sheets("Sheet3").Range("A1").FormulaR1C1 = "1000"

Všimněte si, že se vybírá nic. Kód jednoduše používá hierarchii objektů k použití potřebných akcí.

Omezení výletů do pracovního listu

Dalším způsobem, jak urychlit makra, je omezit počet odkazů na data listu v kódu. Vždy je méně efektivní získávat data z listu než z paměti. To znamená, že vaše makra poběží mnohem rychleji, pokud nebudou muset opakovaně interagovat s listem.

Například následující jednoduchý kód nutí VBA, aby se neustále vracelo do Sheets(“Sheet1”).Range(”A1”), aby získalo číslo potřebné pro porovnání prováděné v příkazu If:

Pro měsíc přehledu = 1 až 12
     If Range("A1").Value = ReportMonth Then
     MsgBox 1000000 / měsíc sestav
End If
Další měsíc přehledů

Mnohem efektivnější metodou je uložit hodnotu do Sheets(“Sheet1”).Range(”A1”) do proměnné s názvem MyMonth. Tímto způsobem kód odkazuje na proměnnou MyMonth namísto listu:

Dim MyMonth jako Integer
Můj měsíc = Rozsah("A1").Hodnota
Pro měsíc přehledu = 1 až 12
If MyMonth = ReportMonth Then
MsgBox 1000000 / měsíc sestav
End If
Další měsíc přehledů

Zvažte využití proměnných pro práci s daty v paměti na rozdíl od přímého odkazování na listy.

Vyhněte se nadměrnému odkazování

Při volání metody nebo vlastnosti objektu potřebuje projít rozhraním IDispatch součásti OLE. Volání těchto komponent OLE nějakou dobu trvá, takže snížení počtu odkazů na komponenty OLE může zlepšit rychlost kódu makra.

Pro vyvolání vlastností nebo metod objektu se obecně používá metoda reprezentace Object.Method  ,  tedy "." symbol se používá k vyvolání vlastností a metod.

Proto lze počet volání metody nebo vlastnosti posuzovat podle počtu symbolů ".". Čím méně "." tím rychleji kód běží.

Například následující příkaz obsahuje 3 symboly ".".

ThisWorkbook.Sheet1.Range("A1").Value = 100

Následující příkaz má pouze jeden symbol ".".

Activewindow.Top = 100

Zde je několik triků, jak snížit počet symbolů "." běžet rychleji.

Za prvé, když potřebujete opakovaně odkazovat na stejný objekt, můžete objekt nastavit na proměnnou, abyste snížili počet volání. Například následující kód vyžaduje dvě volání na řádek.

ThisWorkbook.Sheets("Sheet1").Cells(1, 1) = 100
ThisWorkbook.Sheets("Sheet1").Cells(2, 1) = 200
ThisWorkbook.Sheets("Sheet1").Cells(3, 1) = 300

Protože  na objekt Sheets("Sheet1")  je třeba odkazovat opakovaně, lze jej nejprve nastavit na proměnnou  sht  , takže každý kód stačí zavolat pouze jednou.

Set sht = ThisWorkbook.Sheets("Sheet1")
sht.Cells(1, 1) = 100
sht.Cells(2, 1) = 200
sht.Cells(3, 1) = 300

Za druhé, pokud nechcete deklarovat dočasnou proměnnou sht, můžete také použít   výše zmíněný příkaz With . Jak ukazuje následující příklad:

With ThisWorkbook.Sheets("Sheet1")
    .Cells(1, 1) = 100
    .Cells(2, 1) = 200
    .Cells(3, 1) = 300
End With

Za třetí,  když je mnoho smyček, snažte se ponechat vlastnosti a metody mimo smyčku.  Při opětovném použití hodnoty vlastnosti stejného objektu ve smyčce můžete nejprve přiřadit hodnotu vlastnosti zadané proměnné mimo smyčku a poté použít proměnnou ve smyčce, což může dosáhnout vyšší rychlosti. Jak ukazuje následující příklad:

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

Každá smyčka v tomto příkladu získá vlastnost Value buňky Cells(1,2). Pokud přiřadíte vlastnost Value Cells(1.2) proměnné před spuštěním smyčky, získáte rychlejší běh. Jak ukazuje následující příklad:

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

Výše uvedený kód volá  ThisWorkbook.Sheets("Sheet1")  při každém opakování. Můžete to provést rychleji pomocí  příkazu With  k přesunutí volání  ThisWorkbook.Sheets("Sheet1")  mimo smyčku. Jak ukazuje následující příklad:

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

Vyhněte se používání typů variant

Začátečníci obvykle preferují použití proměnných typu Variant, což má tu výhodu, že je méně komplikované, protože lze použít jakýkoli typ dat bez problému s přetečením paměti, pokud jsou data příliš velká pro datové typy Integer nebo Long. Data typu Varienmt však vyžadují více místa v paměti než ostatní specifikované typy (2 bajty pro data typu Integer, 4 bajty pro data Long a 16 bajtů pro data Variant), VBA vyžaduje více času na zpracování dat typu Variant než jiné specifikované typy. dat. Jak ukazuje následující příklad.

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

Ve výše uvedeném kódu řádky 8 až 13 provádějí 1 milion operací sčítání, odčítání, násobení a dělení proměnných Variant a řádky 17 až 22 provádějí 1 milion operací sčítání, odčítání, násobení a dělení proměnných typu Integer. Na mém počítači trvala operace proměnné Variant asi  0,09375  sekundy, zatímco operace proměnné Integer asi  0,03125  sekundy. Výsledky se mohou lišit počítač od počítače, ale  proměnné Variant jsou výrazně pomalejší než proměnné Integer .

Z tohoto důvodu  se doporučuje vyhnout se použití proměnných Variant, když můžete explicitně použít zadaný datový typ .

Leave a Comment

Jak používat příkazy Znovu a Opakovat ve Wordu 2016

Jak používat příkazy Znovu a Opakovat ve Wordu 2016

Objevte, jak efektivně využívat příkazy Znovu a Opakovat ve Wordu 2016 pro opravy dokumentů a zlepšení pracovního toku.

Jak změnit zamčené a skryté formátování buněk

Jak změnit zamčené a skryté formátování buněk

Naučte se, jak efektivně změnit stav buněk v Excelu 2010 z uzamčených na odemčené nebo z neskrytého na skrytý s naším podrobným průvodcem.

Jak přeložit text v cizím jazyce ve Wordu 2016

Jak přeložit text v cizím jazyce ve Wordu 2016

Zjistěte, jak efektivně využít překladové nástroje v Office 2016 pro překlad slov a frází. Překlad Gizmo vám pomůže překládat text s lehkostí.

Jak používat šablony ve Wordu 2013

Jak používat šablony ve Wordu 2013

Šablona ve Wordu šetří čas a usnadňuje vytváření dokumentů. Zjistěte, jak efektivně používat šablony ve Wordu 2013.

Jak vytvořit e-mailová upozornění pro skupinu SharePointu

Jak vytvořit e-mailová upozornění pro skupinu SharePointu

Zjistěte, jak si vytvořit e-mailová upozornění ve SharePointu a zůstat informováni o změnách v dokumentech a položkách.

Obsah SharePoint Online a typy obsahu

Obsah SharePoint Online a typy obsahu

Objevte skvělé funkce SharePoint Online, včetně tvorby a sdílení dokumentů a typů obsahu pro efektivnější správu dat.

Výpočet fiskálního čtvrtletí pro datum v Excelu

Výpočet fiskálního čtvrtletí pro datum v Excelu

Zjistěte, jak vypočítat fiskální čtvrtletí v Excelu pro různá data s použitím funkce CHOOSE.

Jak vytvořit hypertextový odkaz na jiný snímek v aplikaci PowerPoint 2007

Jak vytvořit hypertextový odkaz na jiný snímek v aplikaci PowerPoint 2007

Zjistěte, jak vytvořit hypertextový odkaz v PowerPointu, který vám umožní pohodlně navigovat mezi snímky. Použijte náš návod na efektivní prezentace.

Zobrazit starší verzi dokumentu aplikace Word 2016

Zobrazit starší verzi dokumentu aplikace Word 2016

Uložili jste nedávno svůj dokument? Náš návod vám ukáže, jak zobrazit starší verze dokumentu v aplikaci Word 2016.

Jak přiřadit makra pásu karet a panelu nástrojů Rychlý přístup v Excelu 2013

Jak přiřadit makra pásu karet a panelu nástrojů Rychlý přístup v Excelu 2013

Jak přiřadit makra vlastní kartě na pásu karet nebo tlačítku na panelu nástrojů Rychlý přístup. Návod pro Excel 2013.