
## Funkce v jazyce VBA

Funkce ve VBA jsou bloky kódu, které vrací po svém provedení `Návratovou hodnotu`. Tímto primárním principem se odlišují od dříve použitých maker. Funkce nelze zavolat ze seznamu maker, ale volají se přímo z buňky Excelu (stejně jako funkce Excelu, například funkce `SUMA()`), nebo z jiné funkce/makra ve VBA Editoru.

![Alt text](media/01-03-funkce-diagram_funkce.png)

<p class="text-center"> Diagram funkce ve VBA</p>

Před použitím funkce v Excelu nebo kódu jiné funkce či makra je potřeba danou funkci prvně definovat. Funkce se definuje obdobně jako Makro. Funkce musí mít jedinečný název v rámci excelu, aby nedocházelo ke kolizím mezi názvy v rámci sešitu Excel. Toto zahrnuje i česky a anglicky definované základní funkce Excelu.

V uvedeném kódu je zobrazena standardní kostra funkce ve VBA. Definování funkce probíhá klíčovým slovem `Function`, které následuje názvem funkce a kulatými závorkami. Konec funkce je označen pomocí příkazu `End Function`.

```
'Ukázka kódu nadefinované funkce
Function <nazev_funkce>(<parametr_1>, <parametr_2>, ... , <parametr_n>)
    'Kód funkce

    'Návratová hodnota funkce
    <nazev_funkce> = <navratova_hodnota>
End Function
```

### Návratová hodnota

Každá funkce musí vrátit `Návratovou hodnotu`. Náratová hodnota funkce se vrátí pomocí přiřazení názvu funkce hodnotou nebo proměnnou, která obsahuje hodnotu. Ve většině případů se návratová hodnota přiřazuje až na konci funkce.

```
'Přiřazení návratové hodnoty funkce
<nazev_funkce> = <navratova_hodnota>
```

Pokud se ovšem funkce větví, může nastat případ, kdy se návratová hodnota může vrátit před dokončením všech řádků funkce. Pro předčasné ukončení funkce nebo makra použijte příkaz `Exit Function` nebo `Exit Sub`. Návratová hodnota se musí přiřadit před tímto příkazem, protože po provedení tohoto příkazu je funkce ukončena a hodnota se již nepřiřadí.

```
'Přiřazení návratové hodnoty funkce s předčasným ukončením funkce
<nazev_funkce> = <navratova_hodnota>
Exit Function
```

>   Při ukončování funkce je nutná obezřetnost, protože příkazy `End Function` a `Exit Function` nemají stejnou funkci. Příkaz `End Function` označuje konec kódu funkce, zatímco příkaz `Exit Function` ukončuje provádění funkce v daném bodě.

### Vstupní parametry funkce

Vstupní parametry funkce jsou proměnné s hodnotami, které funkce potřebuje k dosažení svého potřebného výsledku.. Hodnoty těchto parametrů zadává ten, kdo funkci volá. Funkce může mít *0* až *n* vstupních parametrů. Parametry funkcí potom v rámci funkce vystupují jako proměnné.

### Nepovinné vstupní parametry

Při psaní funkcí ve VBA se může stát, že je zapotřebí použít parametr, který není povinný pro uživatele funkce definovat, ale pokud jej uživatel má, může se do postupu zakomponovat. Když jej uživatel nemá, může se přiřadit výchozí hodnota. Tento parametr je nazýván jako `Volitený parametr`. V hlavičce funkce je tento parametr označen pomocí klíčového slova `Optional`.

```
'Ukázka kódu užití volitelného parametru, který má výchozí hodnotu číslo 0
Function funkceSVolitelnymParametrem(Optional parametr = 0)
    'Kód funkce
    funkceSVolitelnymParametrem = parametr
End Function
```

V příkladu funkce `funkceSVolitelnymParametrem` je parametr s názvem `parametr`. Funkce po zavolání vrátí hodnotu parametru. Když uživatel nevloží žádný parametr, funkce vrátí nulu. Pokud uživatel vloží jiný parametr, funkce mu vrátí tento parametr.

### [Příklad] Vlastní funkce
*Zadání: * Vytvořte funkci s názvem "MojeFunkce". Funkce bude přijímat minimálně jeden parametr pojmenovaný "Jmeno" a volitelný druhý parametr s názvem "Prijmeni". Pokud volitelný parametr nebude zadán, vyplní se hodnotou "ve VBA". Výstupní hodnota této funkce bude kombinace Jmena a Prijmeni.

*Řešení:*

```
'Nadefinovana funkce s názvem "MojeFunkce"
Function MojeFunkce(Jmeno, Optional Prijmeni = "ve VBA")
    'Návratová hodnota funkce - Vrátí vložené jméno a příjmení, pokud bylo vloženo
    MojeFunkce = Jmeno & " " & Prijmeni
End Function
```

*Výsledek:*