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 zaměříme na Watch příkaz.
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-11 Ladeni_programu.xlsm z odkazu na konci článku. Sešit otevřete. Uvidíte zhruba toto:
V ladění jsme zatím využili krokování pomocí <F8> a <Shift+F8>, Breakpoint a příkaz Debug.Print ve spojení s okénkem Immediate.
Dnes si doplníme ladící prostředky o Watch. Představme si, že začátek makra máme zkontrolován, ale nějak nás zlobí nalezení slova „celkem“. Ačkoli máme jistotu, že v databázi takové slovo vidíme, makro svou práci neprovede.
Abychom si to demonstrovali na reálné situaci, zadejte v Excelu hledání slova Karel, ale zvolte podrobnosti a vyberte volbu „Pouze celé buňky“ – viz obrázek:
Necháme Najít další a dialogové okno zavřeme. Nyní spustíme makro a shledáme, že řádek 6 s ID 50 není červený, ačkoli obsahuje slovo „Celkem“.
Nyní se pokusíme nastrojit past, kterou odchytíme, v čem je chyba. Pro zjednodušení prvního pokusu si chceme počíhat na dění na řádku 6.
Otevřeme VBE a zobrazíme rutinu, kde se pracuje s hledáním slova „celkem“. Viz obrázek:
Využijeme schopností VBE, a předem selektujeme výraz „ActiveCell.Row“. Pak vyvoláme menu Debug a v něm „Add Watch“. (Podobně lze využít pravé tlačítko myši na selektovaném textu). Zobrazí se:
Hodnoty nabízené v dialogu již obsahují důležité podrobnosti, především „ActiveCell.Row“ a název procedury „ZjistiCelkem“. K tomu, aby nám „kukátko“ zastavilo na řádku 6, upravíme výraz a zvolíme „Break When Value Is True“:
Nyní se vrátíme do Excelu a spustíme např. pomocí Alt+F8 makro
Makro proběhne plnou rychlostí až do místa, kam jsme nastavili Watch, a zde se zastaví a čeká na naši akci:
Možná si kladete otázku, proč se nezastavilo už při přesunutí selektoru ve volající rutině? Protože Watch je nastaven tak, aby reagoval jen v proceduře „ZjistiCelkem“. Ale hned při vstupu do ní zjistí, že už je selektor nastaven na 6.řádku, což je mimo…