Vlastní funkce, předávání parametrů
Vlastní funkce vytvořené pod VBA násobí hodnotu aplikace. Ne vždy jsou ale vhodné, obzvlášť, pokud existuje schůdné řešení s pomocí funkcí listu. Vestavěné funkce jsou totiž prakticky vždy rychlejší. Výjimku, kdy vlastní funkce spotřebují kratší čas pro vyřešení úkolu, tvoří část problematiky třídění dat a specifické vyhledávací funkce. Pamatujte, že každá striktní deklarace proměnných ve funkci může výrazně urychlit zpracování těla funkce. Pozn. Obecně při tvorbě algoritmů sledujeme ještě další parametr kromě času - paměťovou náročnost.
Co je třeba si uvědomit
Deklarace funkcíFunkce se deklarují prakticky stejně jako klasické procedury. Uvozují se rovněž slůvkyPrivate, Public nebo Static (viz rozsah dostupnosti), následuje slovo Function (namísto Sub ), název funkce, dále případně očekávané parametry a typ výstupu (úplný výpis viz nápověda - klíčové slovo Function Statement). Takový zápis jednoduché, veřejně dostupné funkce, neočekávající žádný vstup, může vypadat
Function MAFUNKCE() ... MAFUNKCE = ... End Function Smyslem funkcí je ale zpracovávat určitý vstup a na jeho základě vracet hodnotu (hodnoty). K tomu je nutné si něco říci o předávání parametrů. Předávání parametrů obecněZatím jste se setkali například se zápisem Sub Zadani() Dim A As Integer A = 5 'voláme procedury Ctverec1 a Ctverec2, předáváme proměnnou A 'slovíčko Call je nepovinné Call Ctverec1(A) Call Ctverec2(A) End Sub Sub Ctverec1(ByVal X) 'klíčové slůvko ByVal 'procedura ukládá kopii původní proměnné do proměnné X (X=A) X = X ^ 2 End Sub Sub Ctverec2(ByRef X) 'klíčové slůvko ByRef nebo bez uvedení 'procedura provede substituci X za předávanou proměnnou A (A=X) X = X ^ 2 End Sub Slovní doprovod (krokování začíná v proceduře Zadani):
Poznámka č. 1: Předávání parametrů odkazem má stejný význam jako použití proměnné na úrovni modulu. Poznámka č. 2: Předávání parametrů hodnotou neovlivní ani proměnnou deklarovanou na úrovni modulu (přestože jsou názvy proměnných shodné). ![]() ![]() Dodatek: U přebíraných proměnných je možné nastavovat i datový typ (např. A nyní pojďme rovnou k příkladům funkcí. Funkce neočekávající parametrFunction TYPDNE()
'pořadové číslo dne v týdnu (pondělí = 1)
DenTydne = Weekday(Now, vbMonday)
If DenTydne > 5 Then
TYPDNE = "volný den"
Else
TYPDNE = "pracovní den"
End If
End Function
Funkce očekávající jeden parametrFunction TYPCISLA(Cislo) If Cislo Mod 2 = 0 Then TYPCISLA = "sudé" Else TYPCISLA = "liché" End If End Function V příkladu výše funkce očekává jeden povinný parametr pojmenovaný ![]() ![]() Funkce s volitelným parametremFunkce mohou obsahovat i volitelné parametry, uvozené slovem Function UMOCNENI(Cislo, Optional Mocnina)
'kontrola přítomnosti volitelného parametru Mocnina
If IsMissing(Mocnina) Then
'není-li parametr zadán, je bráno Mocnina = 2
UMOCNENI = Cislo ^ 2
Else
UMOCNENI = Cislo ^ Mocnina
End If
End Function
![]() ![]() Funkce využívající funkci listuNe pro všechno musíme vytvářet vlastní funkce. Některé standardní obsahuje přímo model VBA, některé jsou dostupné z katalogu funkcí pro list. Obecně platí, že pokud je funkce dostupná ve VBA, není k dispozici při výběru z katalogu listu (bohužel překrytí není úplně korektní). V příkladu níže funkce očekává zadaný poloměr typu Function OBSAHKRUHU(Polomer As Single) OBSAHKRUHU = WorksheetFunction.Pi() * Polomer ^ 2 End Function Pozn. Na funkce se zde odkazuje anglickým názvem, jak je znázorněno dále. Nemusíte hledat překlady v literatuře, přehled najdete v příloze. ![]() ![]() Funkce očekávající pole hodnotFunkce také může zpracovávat pole hodnot. V tom případě v zápisu funkce uvedeme klíčove slovo Function SLOVO(ParamArray Pismena() As Variant) As String For Each Znak In Pismena SLOVO = SLOVO & Znak Next Znak End Function Je zde ještě jeden zádrhel. Taková funkce neumí zpracovat oblast (např. A1:A5), ale pouze seznam oddělených hodnot (A1, A2, A3, A4, A5). Pozn. Porovnejte vestavěné funkce SUMA a třeba CONCATENATE. I na nich je vidět rozdíl v chování. ![]() ![]() Funkce vracející pole hodnotFunkce nejenže umí zpracovávat pole, ony jej umí i vracet. Takové funkce fungují stejně jako maticové vzorce a zadávají se v listu stiskem Ctrl+Shift+Enter. Tady je nutné si uvědomit, že standardně má pole řádkový (horizontální) charakter, to znamená, že je představováno položkami v řádku. Pokud si přejeme navracet položky ve sloupci, je nutné použít vestavěnou funkci Transpose, jak ukazuje spodní část kódu. Function PRACDNY() Dim Dny() Dny = Array("po", "út", "stř", "čt", "pá") 'vodorovné pole PRACDNY = Dny 'svislé pole 'PRACDNY = WorksheetFunction.Transpose(Dny) End Function ![]() Tip. Při zadávání takových funkcí je prakticky nutné znát předem počet položek pole. Proto do nich doporučuji vkládat nepovinný parametr, při jehož uvedení funkce nevrátí samotné položky, ale jejich počet. Nejčastější otázkyJak je to se zobrazováním vlastních funkcí v dialogu Vložit funkci? ![]() Je možné změnit kategorii pro umístění funkce a přidat nápovědu nebo alespoň popis? Private Sub Workbook_Open() 'vložení funkce TypCisla do kategorie 3 (Matematické) Application.MacroOptions Macro:="TypCisla", _ Category:=3, _ Description:="Vrátí typ čísla (liché, sudé)." 'popis funkce End Sub Vybraná čísla kategorií:
![]() Nápověda je dána parametry HelpFile (cesta k souboru nápovědy) a HelpContextID (identifikátor hesla). Private Sub Workbook_Open() Application.MacroOptions Macro:="TypCisla", _ Category:=3, _ Description:="Vrátí typ čísla (liché, sudé).", _ HelpFile:=ThisWorkbook.Path & "\MojeFunkce.hlp", _ HelpContextID:=1000 End SubPozn. Soubory nápovědy je možné vytvářet například v programech HTML Help Workshop, WinCHM či RoboHelp. Použitelné jsou přípony souborů .CHM či starší .HLP. Jak se správně odkazovat na funkce? Vlastní funkce se mi nepřepočítávají. Chci funkci používat jen pro své vnitřní účely. Funkce nejdou samostatně testovat. ![]() Jsou funkce citlivé na velikost písmen a jak je to s diakritikou? |
Officír pro časopis CHIP.