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 .


Jak zablokovat aplikaci Microsoft Word v otevírání souborů v režimu pouze pro čtení v systému Windows

Jak zablokovat aplikaci Microsoft Word v otevírání souborů v režimu pouze pro čtení v systému Windows

Jak zablokovat aplikaci Microsoft Word v otevírání souborů v režimu pouze pro čtení v systému Windows Aplikace Microsoft Word otevírá soubory v režimu pouze pro čtení, takže je nelze upravovat? Nebojte se, metody jsou uvedeny níže

Jak opravit nesprávný tisk dokumentů Microsoft Word

Jak opravit nesprávný tisk dokumentů Microsoft Word

Jak opravit chyby při tisku nesprávných dokumentů Microsoft Word Chyby při tisku dokumentů Word se změněným písmem, chaotickými odstavci, chybějícím textem nebo ztraceným obsahem jsou poměrně časté. Nicméně ne

Vymažte kresby perem a zvýrazňovačem na snímcích PowerPoint

Vymažte kresby perem a zvýrazňovačem na snímcích PowerPoint

Pokud jste použili pero nebo zvýrazňovač ke kreslení na snímky aplikace PowerPoint během prezentace, můžete kresby uložit pro další prezentaci nebo je vymazat, takže až ji příště ukážete, začnete s čistými snímky aplikace PowerPoint. Chcete-li vymazat kresby perem a zvýrazňovačem, postupujte podle těchto pokynů: Mazání čar jedna na […]

Obsah knihovny stylů v SharePointu 2010

Obsah knihovny stylů v SharePointu 2010

Knihovna stylů obsahuje soubory CSS, soubory XSL (Extensible Stylesheet Language) a obrázky používané předdefinovanými vzorovými stránkami, rozvržení stránek a ovládací prvky v SharePointu 2010. Chcete-li najít soubory CSS v knihovně stylů webu pro publikování: Vyberte Akce webu→ Zobrazit Veškerý obsah webu. Zobrazí se obsah webu. Knihovna stylů se nachází v […]

Formátování čísel v tisících a milionech v sestavách Excel

Formátování čísel v tisících a milionech v sestavách Excel

Nezahlcujte své publikum gargantuovskými čísly. V aplikaci Microsoft Excel můžete zlepšit čitelnost řídicích panelů a sestav formátováním čísel tak, aby se zobrazovaly v tisících nebo milionech.

Jak sdílet a sledovat weby SharePoint

Jak sdílet a sledovat weby SharePoint

Naučte se používat nástroje sociálních sítí SharePoints, které umožňují jednotlivcům a skupinám komunikovat, spolupracovat, sdílet a propojovat se.

Jak převést data do juliánských formátů v aplikaci Excel

Jak převést data do juliánských formátů v aplikaci Excel

Juliánská data se často používají ve výrobním prostředí jako časové razítko a rychlý odkaz pro číslo šarže. Tento typ kódování data umožňuje maloobchodníkům, spotřebitelům a servisním zástupcům identifikovat, kdy byl produkt vyroben, a tím i stáří produktu. Juliánská data se také používají v programování, armádě a astronomii. Odlišný […]

Jak vytvořit webovou aplikaci Access

Jak vytvořit webovou aplikaci Access

Webovou aplikaci můžete vytvořit v Accessu 2016. Co je tedy vlastně webová aplikace? Web znamená, že je online, a aplikace je jen zkratka pro „aplikaci“. Vlastní webová aplikace je online databázová aplikace přístupná z cloudu pomocí prohlížeče. Webovou aplikaci vytváříte a udržujete ve verzi pro počítače […]

Panel rychlého spuštění v SharePointu 2010

Panel rychlého spuštění v SharePointu 2010

Většina stránek v SharePointu 2010 zobrazuje seznam navigačních odkazů na panelu Snadné spuštění na levé straně stránky. Panel Snadné spuštění zobrazuje odkazy na doporučený obsah webu, jako jsou seznamy, knihovny, weby a stránky publikování. Panel Snadné spuštění obsahuje dva velmi důležité odkazy: Odkaz na veškerý obsah webu: […]

Co znamenají chybové zprávy Řešitel v Excelu?

Co znamenají chybové zprávy Řešitel v Excelu?

U jednoduchých problémů Řešitel v Excelu obvykle rychle najde optimální hodnoty proměnné Řešitel pro účelovou funkci. Ale v některých případech má Řešitel problém najít hodnoty proměnné Řešitel, které optimalizují účelovou funkci. V těchto případech Řešitel obvykle zobrazí zprávu nebo chybovou zprávu, která popisuje nebo popisuje problém, který […]