V předchozích dílech jsme pokračovali v projektu, kde postupně zdokonalujeme práci s uživatelskými funkcemi. Minule jsme začali tvořit funkci Zodiac, která vyhodnocuje vztah uchazeče ke znamením zvěrokruhu, jak požadoval předseda klubu. Nicméně funkce nám vrátila výsledek #HODNOTA!. Dnes to musíme rozluštit.
Podkladová úloha: Pracujeme se sešitem, v němž je formulář, jejž je třeba vyplňovat. Posledně nás předseda klubu překvapil požadavkem, že chce posuzovat znamení zvěrokruhu, v němž se uchazeč narodil. Stáhněte si sešit 2012-13 UD-funkce.xlsm z odkazu na konci článku. Sešit otevřete. Uvidíte zhruba toto:
Předně si ujasněme, že známé hlášky z ladění programu ve VBA při zapojení kódu, jako uživatelské funkce, se nemusejí konat. Místo toho funkce při nárazu na neošetřenou chybu jednoduše skončí svou činnost a vrátí chybovou hodnotu. Pak především nevíme, v čem vlastně Excel vidí problém, a to ani při krokování pomocí <F8>. Proto si raději sestavíme ladící subrutinu, z níž funkci zavoláme:
Sub test_Zodiak()
Debug.Print Zodiak(Range("B8").Value, Range("zodiak"), "Kozoroh")
End Sub
Po jejím spuštění uvidíme toto:
První podezření padá na to, zda funkce při stejných parametrech, vyvolaná z Excelu, nevrátí rovněž chybu. To jste měli posledně za domácí úkol. Proveďme si to:
Takže to nevypadá jako chyba v logice vyhledávácí funkce.
Zde přichází na řadu občasné trochu rozdílné vnímání hodnot na straně Excelu a na straně VBA. Protože 3 argumenty jsou u POZVYHLEDAT(co;prohledat;[shoda]), a „prohledat“ je Range, a „shoda“ je konstanta, padá podezření na „co“, které je typu Variant. “Co“ předáváme z VBA jako proměnnou typu Date, avšak datum se možná konvertuje do Variant jinak, než očekáváme. Zkusíme tedy hledané datum konvertovat…