Pravidla programátora VBA
- Zapněte volbu Option Explicit - V editoru VBE -Tools - Options - Editor - require variable declaration
- Rozdělte procedury do oddělených logických celků a používejte příkazy Call nebo Run, když je budete potřebovat
- Pište dobře použitelné funkce, tak aby mohli být volány když budou potřeba s proměnným množstvím argumentů
- Pište & udržujte všechny příbuzné procedury v jednom modulu. Excel kompiluje každý modul jako proceduru v modulu kde je kód vykonáván
- Jen zřídka kdy musíte použít metodu Select pro výběr objektů, abyste změnili jeho vlastnosti.Když už jej MUSÍTE vybrat použijte příkaz GoTo.
- Používejte kódové jméno listu, místo názvu nebo indexového čísla listu.
- Vyhněte se cyklům. Uděláte lépe když použijete rychlejší alternativy jako jsou metody Find, AutoFilter, AdvancedFilter, SpecialCells atd.
- Cykly přes kolekcí objektů For Each ... Next jsou podstatně rychlejší než ostatní cykly.
- Někdy není kód potřebný. Funkce na listu jsou rychlejší a efektivnější.
- Vyhněte se použivání uživatelských funkcí, když můžete použit WorksheetFunction
- Vyhněte se kódu, které mažou řádky, sloupce nebo buňky. Používejte raději AutoFilter, AdvancedFilter, Sort
- Vypněte přepočet listu pro pomalé makra. Nezapomeňte pokud bude ve Vašem kódu chyba - jakákoliv - musíte zajistit zapnutí přepočtu! Vypněte také aktualizaci obrazovky
- Používejte vbNullString namísto znaku ""
- Vypněte zpracovávaní události na úrovní sešitu/listu pokud je nepotřebujete.Nikdy nezapomeňte vrátit zapnutí události. Pro vypnutí události používejte Application.EnableEvents = False a pro zapnutí Application.EnableEvents = True.
- Používejte konstrukci With Objekt ... End With při práci s objekty.
- Příkaz Select Case je často rychlejší než více kriteriální If ElseIf Then.
- Funkce Iff je pomalejší než If Then
- Používejte logické hodnoty než příkaz If Then.Např. bYesNo = Range("MyValue") = 5.
- Používejte pojmenované buňky místo přímé adresace
- Používejte smysluplné názvy procedur, proměnných apod. Např. lngRowCount místo názvu jako y, y, z
- Já bych ještě dopsal Komentujte svůj kód.
No co k tomu napsat, když jsem se já začínal učit VBA, měl jsem knihu Excel 97 Visual Basic krok za krokem od Reed Jacobson, on se tam sice o této volbě zmínil, ale nějak jí moc nepropagoval. Takže já se naučil psát kód bez této volby, dnes bych to doporučil začátečníkům, alespoň budou muset deklarovat proměnné a nebudou mít všechno ve Variant , ale já už jsem si zvyknul psát kód bez této volby. Hodně se mi stává, že píšu kód a když ho zkouším tak zjistím, že si musím něco uložit do proměnné a udělám to hned a pak proměnnou nedeklarují, s volbou Option Explicit bych musel kód pozastavit. Já vím jde o mou lenost ...
Tohle běžně dělám aniž bych to musel někde číst, ale vzpomínám si na jednu knihu, kterou vlastním a tam autorka, Christine Solomon psala, jak se moc podivovala nad zvýšením rychlosti svých kódu, poté co zrušila oddělení procedur a udělala co nejméně oddělených části.Já to nikdy nezkoušel, ale třeba ...
Tohle jsem nevěděl a vlastně nám to říká, že pokud voláme z nějaké procedury jinou, měla by být volaná procedura umístěna v tom samém modulu. Což já často nedodržuji, protože si oddělují procedury např. na řadicí a výkonové, zobrazovací apod. abych potom věděl kde co opravit, když budu chtít zasáhnout do způsobu řazení.
Tady nás Dave nabádá k tomu, abychom místo příkazu Sheets("Nazdar").Select nebo Sheets(1).Select použili raději jeho kódového jména, které zjistíme v editoru VBE ( To je když rozbalíte nabídku pro daný projekt v Microsoft Excel Objects ) a raději máme napsat příkaz List1.Select, kde už nejsme závislí na jménu ani pozici listu, který byl původně listem 1. Přiznám se, že toto někdy používám, ale většinou zůstávám u názvu listu, který si třeba skryjí.
Ano většinou jsou rychlejší, ale stejně raději používám cykly, protože psaní kódu okolo výše popsaných metod je celkem zdlouhavé a většinou nehledám jeden výsledek ale více a ty si pak ukládám do pole, kde s nima dále pracuji a kdybych použil např. AdvancedFilter a požadoval zapsaní jen některých položek do polí, tak bych musel taky udělat smyčku a vyfiltrované záznamy zpracovat. Ale pozor, metodu AdvancedFilter jako i ostatní používám i já, prostě se musíte rozhodnout kdy je který přístup lepší.
To je samozřejmě pravda a minimálně je to jednodušší než to dělat přes jiné cykly. I když výjimky se najdou.
Tak tady není co řešit, to asi ví každý.
Bezpodmínečně musíte zajistit opětovné zapnutí. Tzn. používejte chybové návěstí On Error Goto ....
Já dlouho psal uvozovky, teď používám tento zápis, ale ne proto, že by to bylo rychlejší, ale jeví se mi to přehlednější.
Platí to co jsem psal u zapnutí/vypnutí přepočtu.
Použití doporučuji, je to rychlejší a přehlednější.
Tohle jsem četl už hodněkrát, popravdě řečeno nevím jak je to s tou rychlostí, ale minimálně je to přehlednější a lépe se to píše, než moc podmínek If Else. Myslím, že jsem nikdy nepsal více než 3 podmínky If Else.
Nevím, funkci Iff sem nikdy v kódu nepoužil, nelíbí se mi.
Záleží na programátorovi, já to takhle píšu, je to pomalejší při vytvoření kódu, ale podle mě přehlednější.
Ale komentujte smysluplně. Komentář, který říká - ukládám si hodnotu do proměnné - je bezcenný, možná i pro začátečníky. Mám ve zvyku psát ve 2-3 řádcích co která procedura dělá, pokud je odněkud volaná tak odkud a pokud má argumenty, tak co znamenají. Popsat si co dělají cykly a proč a různé chuťovky v kódu.
Komentáře
Přehled komentářů
Valuable forum posts. Many thanks!
the perfect college essay https://customthesiswritingservice.com medical writing services https://buyanessayscheaponline.com
Poznámka
(Jan Kuře, 6. 11. 2008 7:47)
Podle mého názoru pravidlo č. 11 není opodstatněné (Vyhněte se kódu, které mažou řádky, sloupce nebo buňky. Používejte raději AutoFilter, AdvancedFilter, Sort). Jestli se autor pravidla obává nevratné ztráty dat (jiný důvod k napsání tohoto pravidla mě nenapadá), existují způsoby jak tomu zabránit. Nebo jaký je jiný důvod?
Jinak ostatní pravidla jsou myslím přínosná a podnětná.
select case vs. if elseif then
(Peter Pisár, 22. 2. 2011 10:20)testoval som, čo je rýchlejšie, a vyšlo mi, že rýchlejšie je if elseif then. Takže ak by ste chceli mať jednoznačnú istotu, aby váš kód pracoval čo najrýchlejšie použite it elseif then. Pri časoch spracovania pod 10 s nie je z časového hľadiska medzi týmito 2 spôsobmi rozdiel.
Re: Poznámka
(Premek, 6. 11. 2008 16:48)
Tady jde spise o rychlost zpracovani. Pravidlo je (podle me) urceno tem programatorum, kteri napr. mazou data podle toho jestli je napr. v sloupci A = 1 a zaroven ve sloupci D je cislo vetsi nez 40 a jeste k tomu sloupec Iv nesmi byt prazdny. A pokud radek vsechny pravidla splni tak je kodem smazou a tak postupne jedou radek po radku. Tady je samozrejme daleko efektivnejsi pouzit AutoFilter nebo SQL dotaz nad tabulkou a data najednou smazat porp. prenest na jiny list.
Osobne data mazu tak ze si zjistim cisla radku ktere chci smazat, pridavam je Union do oblsti a tu pak najednou mazu. Ovsem jsou i specificke ukoly kdy jdu radek po radku.
cheap dissertation b469ei
(Gregorylag, 6. 4. 2023 17:04)