Jdi na obsah Jdi na menu
Reklama
Založte webové stránky zdarma - eStránky.cz
 


Pravidla programátora VBA

26. 12. 2007
VBA Code Golden Rules
při procházení excelovských stránek v předvánočním shonu jsem narazil na téma "VBA Code Golden Rules" neboli Zlatá pravidla programátora ve VBA. Podobné nebo stejné pravidla jsem četl už několikrát a můžu říct, že se některými řídím a tak sem se rozhodl, že je napíšu včetně vysvětlení a mého praktického pohledu na ně. ( který se samozřejmě může lišit od toho vašeho ). V podobě jakou Vám tyto pravidla předkládám já, sepsal Dave Hawley. na jeho stránce. ( Koukněte na odkaz, jsou tam pravidla také pro Excelovské sešity )

 

  • Zapněte volbu Option Explicit - V editoru VBE -Tools - Options - Editor - require variable declaration

  • 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 ...

  • Rozdělte procedury do oddělených logických celků a používejte příkazy Call nebo Run, když je budete potřebovat

  • 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 ...

  • 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

  • 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í.

  • 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.

  • 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í.

  • Vyhněte se cyklům. Uděláte lépe když použijete rychlejší alternativy jako jsou metody Find, AutoFilter, AdvancedFilter, SpecialCells atd.

  • 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ší.

  • Cykly přes kolekcí objektů For Each ... Next jsou podstatně rychlejší než ostatní cykly.

  • 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.

  • 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

  • Tak tady není co řešit, to asi ví každý.

  • 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

  • Bezpodmínečně musíte zajistit opětovné zapnutí. Tzn. používejte chybové návěstí On Error Goto ....

  • Používejte vbNullString namísto znaku ""

  • 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ší.

  • 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.

  • Platí to co jsem psal u zapnutí/vypnutí přepočtu.

  • Používejte konstrukci With Objekt ... End With při práci s objekty.

  • Použití doporučuji, je to rychlejší a přehlednější.

  • Příkaz Select Case je často rychlejší než více kriteriální If ElseIf Then.

  • 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.

  • Funkce Iff je pomalejší než If Then

  • Nevím, funkci Iff sem nikdy v kódu nepoužil, nelíbí se mi.

  • 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

  • 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ší.

  • Já bych ještě dopsal Komentujte svůj kód.

  • 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.
Máte ještě nějaké pravidla, které tady chybí, popř. máte nějaké komentáře k těmto pravidlům? Vyjádřete se v komentářích.

 

Komentáře

Přidat komentář

Přehled komentářů

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á.

Re: Poznámka

(mil, 17. 12. 2014 15:26)

jde o rychlost zpracování ...

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.