V předcházejících článcích jsme si vytvořili příklad, na kterém jsme se začali seznamovat s ladícími prostředky VBE. Dnes budeme tento nesmírně důležitý nástroj dále zkoumat a pozornost ještě ponecháme na Watch příkazu, s nímž jsme se seznámili v předchozím díle.
Podkladová úloha: V dílu 1 jsme strojili makro, které ladíme. Zvolili jsme si jednoduchou úlohu, kde na listu jsou řádky, a pokud se v kterékoli buňce v řádku objeví slovo „Celkem“, tak buňku v tomto řádku a sloupci naformátujeme tučnou červenou kurzívou. A naopak, pokud tam nikde „Celkem“ nebude, makro zajistilo, aby nebyla ani tučně ani kurzívou, a byla černě.
Stáhněte si sešit 2011-12 Ladeni_programu.xlsm z odkazu na konci článku. Sešit otevřete. Uvidíte zhruba toto:
Minule jsme poprvé použili příkaz Watch. Rozdíl oproti BreakPointu spočíval především v tom, že místo, kde se program zastaví, je nastaveno z pohledu VBA, nikoli naším přímým rozkazem „Tady zastav!“. Asi tak, že řekneme VBA například: „Až bude tahle proměnná větší než 42, tak přeruš, abych se na to mohl podívat!“.
Posledně jsme nastrojili nastavení dialogovém okně „Hledat“ tak, že vyhledával jen při shodě celé buňky s hledaným textem. A protože je dialogové okno Hledat v Excelu jen jedno, pamatuje si nastavení, dokud ho někde nezměníme. V tom spočívala zrada původní verze programu. Opravili jsme to doplněním parametru LookIn:=XlPart do metody „Find“.
Vadné místo jsme našli tak, že jsme si nastavili Watch s podmínkou ActiveCell.row=5.
Tentokrát si nachystáme chybu jiného typu. Nejprve zobecníme naše makro tak, aby hledalo ne zrovna slovo „celkem“, ale slovo, které uživatel zadá. (Může zadat i „celkem“). A budeme chtít, aby si Excel to slovo pamatoval i po uzavření souboru.
Vytvoříme tedy nový list s názvem „Param“ a v něm sestrojíme pojmenovanou buňku „Hledane_slovo“. Viz obrázek:
Nyní budeme předpokládat, že poučený uživatel při potřebě hledat jiné slovo, např. slovo „vypůjčen“ přepne na list Param, a hodnotu změní. My si nejprve doprogramujeme práci s novým uspořádáním.
'Set pomRng = Rows(ActiveCell.Row).Find("celkem", LookAt:=xlPart) 'stará verze
Set pomRng = Rows(ActiveCell.Row).Find(Range("Hledane_slovo").Value, LookAt:=xlPart)
Řekněme, že jste tohle vylepšené makro „pustili do světa“, a někdo vám volá, že to nefunguje. Že to barví všechny řádky na červeno. Podíváte se na list „Param“ v jeho souboru a tam vidíte, že je vše správně:
Ještě se ujistíte, že za slovem „celkem“ náhodou není nějaká mezera navíc, ale prostě vám to nedává smysl. Jak je možné, že to obarvuje všechno?
Použijeme tedy Watch, a chceme sledovat proměnnou „pomRng“. Nastavíme kursor na „pomRng“ a zvolíme Debug->Add Watch. A aby nám to zastavovalo na podmínce, doplníme „is nothing“ a zvolíme „Break When…