Obsah

[1.1Lekce 0 – Úvod do VBA 4](#_Toc143805597)

[1.1.1Karta vývojáře 4](#_Toc143805598)

[1.1.2Visual Basic Editor 6](#_Toc143805599)

[1.1.3Rozložení projektu 7](#_Toc143805600)

[1.1.4Úkoly k procvičení 7](#_Toc143805601)

[1.2Lekce 1 – Procedury 8](#_Toc143805602)

[1.2.1Makro 8](#_Toc143805603)

[1.2.2Záznam makra 9](#_Toc143805604)

[1.2.3Ukládání sešitu 10](#_Toc143805605)

[1.2.4Funkce 11](#_Toc143805606)

[1.2.5Úkoly k procvičení 12](#_Toc143805607)

[1.3Lekce 2 – Proměnné, datové typy a výpočty 13](#_Toc143805608)

[1.3.1Proměnné 13](#_Toc143805609)

[1.3.2Datové typy 13](#_Toc143805610)

[1.3.3Operátory při práci s proměnnými 15](#_Toc143805611)

[1.3.4Převody mezi datovými typy 16](#_Toc143805612)

[1.3.5Úkoly k procvičení 17](#_Toc143805613)

[1.4Lekce 3 – Větvení a podmíněné příkazy 18](#_Toc143805614)

[1.4.1Příkazy If, Else, Else If 18](#_Toc143805615)

[1.4.2Porovnávací operátory 19](#_Toc143805616)

[1.4.3Logické operátory 20](#_Toc143805617)

[1.4.4Příkaz Select Case 20](#_Toc143805618)

[1.4.5Podmíněné funkce 21](#_Toc143805619)

[1.4.6Úkoly k procvičení 23](#_Toc143805620)

[1.5Lekce 4 – Kalendářní a časové hodnoty 24](#_Toc143805621)

[1.5.1Kalendářní hodnoty 24](#_Toc143805622)

[1.5.2Časové hodnoty 24](#_Toc143805623)

[1.5.3Práce s kalendářem a časem 25](#_Toc143805624)

[1.5.4Úkoly k procvičení 28](#_Toc143805625)

[1.6Lekce 5 – Opakování, cykly a pole 29](#_Toc143805626)

[1.6.1Cyklus While 29](#_Toc143805627)

[1.6.2Cyklus For 29](#_Toc143805628)

[1.6.3Cyklus Do 30](#_Toc143805629)

[1.6.4Vnořené cykly 31](#_Toc143805630)

[1.6.5Rekurzivní funkce 32](#_Toc143805631)

[1.6.6Pole a matice 32](#_Toc143805632)

[1.6.7Cyklus For Each 34](#_Toc143805633)

[1.6.8Úkoly k procvičení 35](#_Toc143805634)

[1.7Lekce 6 – Práce s oblastmi výběru 36](#_Toc143805635)

[1.7.1Aktivní označení 36](#_Toc143805636)

[1.7.2Pasivní přístup 37](#_Toc143805637)

[1.7.3Řádky a sloupce sešitu 39](#_Toc143805638)

[1.7.4Úkoly k procvičení 40](#_Toc143805639)

[1.8Lekce 7 – Stylování textu a buněk 41](#_Toc143805640)

[1.8.1Přístup pomocí příkazu With 41](#_Toc143805641)

[1.8.2Výška a šířka buňky 41](#_Toc143805642)

[1.8.3Ohraničení buňky 42](#_Toc143805643)

[1.8.4Slučování buněk 43](#_Toc143805644)

[1.8.5Barva a text buňky 43](#_Toc143805645)

[1.8.6Formátování buněk 45](#_Toc143805646)

[1.8.7Uzamknutí buňky 46](#_Toc143805647)

[1.8.8Úkoly k procvičení 46](#_Toc143805648)

[1.9Lekce 8 – Práce se sešitem 47](#_Toc143805649)

[1.9.1Vybrání konkrétního listu sešitu 47](#_Toc143805650)

[1.9.2Zamykání a odemykání listů 47](#_Toc143805651)

[1.9.3Zobrazení listů 48](#_Toc143805652)

[1.9.4Přidání a odebrání listů 49](#_Toc143805653)

[1.9.5Kopírování a přesunování listů 49](#_Toc143805654)

[1.9.6Události v listu 50](#_Toc143805655)

[1.9.7Úkoly k procvičení 51](#_Toc143805656)

[1.10Lekce 9 – Práce s grafy 52](#_Toc143805657)

[1.10.1Vytvoření grafu 52](#_Toc143805658)

[1.10.2Zobrazení grafu 53](#_Toc143805659)

[1.10.3Prvky grafu 53](#_Toc143805660)

[1.10.4List grafu 56](#_Toc143805661)

[1.10.5Úkoly k procvičení 56](#_Toc143805662)

[1.11Lekce 10 – Třídy a objekty 57](#_Toc143805663)

[1.11.1Práce s objekty 58](#_Toc143805664)

[1.11.2Vytvoření objektu 58](#_Toc143805665)

[1.11.3Události objektu 58](#_Toc143805666)

[1.11.4Kolekce 58](#_Toc143805667)

[1.11.5Vlastnosti a metody 59](#_Toc143805668)

[1.11.6Příkaz Let 59](#_Toc143805669)

[1.11.7Příkaz Set 60](#_Toc143805670)

[1.11.8Úkoly k procvičení 60](#_Toc143805671)

[1.12Lekce 11 – Práce s kontingenčními tabulkami 61](#_Toc143805672)

[1.12.1Úkoly k procvičení 61](#_Toc143805673)

[1.13Lekce 12 – Práce s uživatelskými dialogy a formuláři 62](#_Toc143805674)

[1.13.1Prvek MsgBox 62](#_Toc143805675)

[1.13.2Prvek InputBox 62](#_Toc143805676)

[1.13.3Ovládací prvky 62](#_Toc143805677)

[1.13.4Design formulář 62](#_Toc143805678)

[1.13.5Úkoly k procvičení 62](#_Toc143805679)

[1.14Lekce 13 – Práce s textovými soubory 63](#_Toc143805680)

[1.14.1Zjištění souboru nebo adresáře 63](#_Toc143805681)

[1.14.2Otevření souboru 63](#_Toc143805682)

[1.14.3Smazání souboru 63](#_Toc143805683)

[1.14.4Export souboru 63](#_Toc143805684)

[1.14.5Uložit soubor 63](#_Toc143805685)

[1.14.6Souborový systém 63](#_Toc143805686)

[1.14.7Úkoly k procvičení 63](#_Toc143805687)

## 1.1Lekce 0 – Úvod do VBA

Visual Basic pro Aplikace (VBA) je programovací jazyk, který umožňuje rozšířit funkce aplikací v balíku kancelářského softwaru Microsoft 365 (dříve označován jako balík Microsoft Office nebo Office 365). Mezi tyto aplikace patří například Excel, Access, PowerPoint, Word a další. Jedná se o objektově orientovaný programovací jazyk, který je zároveň v kódu řízen různými událostmi.

Microsoft s pomocí VBA umožňuje uživatelům zautomatizovat jakoukoliv operaci, kterou lze provést pomocí myši nebo klávesnice. Cílem je usnadnit práci, kterou uživatelé v těchto programech opakují neustále dokola. VBA dovoluje i propojení mezi jednotlivými kancelářskými aplikacemi, například lze převést kontakty z aplikace Outlook přímo do tabulky v aplikaci Excel. Mezi další cíle jazyka patří pro vývojáře jednoduše pochopitelná syntaxe (vycházející z anglického jazyka) a udržení dlouhodobé podpory pro aplikace vytvořené v tomto jazyce.

Pod pojmem Visual Basic se v rámci historie objevila řada několika programovacích jazyků. Při programování s VBA je nutné rozlišovat tyto jazyky, protože některé z nich mohou mít velmi podobnou syntaxi, každopádně nemusí zaručovat obdobnou funkci. Jedná se například o Classic Visual Basic (VB 6.0), .NET Visual Basic (VB.NET) či Visual Basic Script (VBScript).

I když VBA není pouze pro platformu operačního systému Windows, součásti jako uživatelské formuláře a další jsou na platformě Mac výrazně omezeny. Microsoft představil tzv. Office Scripts, které jsou založené na programovacím jazyce JavaScript. Přestože tento jazyk neumožňuje stejné množství funkcí jako VBA, nahrazuje tyto funkce možností multiplatformního vývoje např. i pro prohlížečovou verzi programu Excel. Rozvoj v této oblasti by se mohl jevit jako jedna z možností budoucí automatizace Office.

Programátorské prostředí pro vývoj ve VBA je implementováno přímo ve většině aplikací balíčku 365 a stačí jej v aplikaci pouze spustit.

### 1.1.1Karta vývojáře

Pro spuštění vývojářského prostředí je nejdříve potřeba zobrazit kartu Vývojář v aplikaci Excel. Ta při prvním spuštění programu není v nabídce karet zobrazena. Pro zobrazení karty stačí kliknout na _Soubor_ a ve spodní části levého menu vybrat tlačítko _Možnosti_. Otevře se nové okno _Možnosti aplikace_. Z nabídky postranního menu je potřebné zvolit Přizpůsobit pás karet a následně vybrat volbu _Vývojář_. Nové nastavení se potvrzuje tlačítkem _Ok_.

![](RackMultipart20230825-1-dom2ev_html_c932ee73bb7a84a5.png)

Obrázek 1 – Okno Možnosti aplikace Excel s výběrem zobrazení karty vývojáře

Karta _Vývojář_ se skládá z více skupin, kde každá představuje jinou část možného vývoje softwaru pro aplikaci Excel. Vývoj s jazykem VBA se převážně vyskytuje ve skupině _Kód_ a ve skupině _Ovládací prvky_, která obsahuje možnost vkládat ovládací prvky přímo do sešitu Excelu.

![](RackMultipart20230825-1-dom2ev_html_71c4dbd6ecbc29c.png)

Obrázek 2 – Karta Vývojář

Skupina _Doplňky_ se zabývá převážně vývojem externích doplňků pro aplikaci Excel a skupina _XML_ se zabývá práci s daty ve stejnojmenném formátu.

### 1.1.2Visual Basic Editor

Pro spuštění vývojářského prostředí editoru stačí na kartě _Vývojář_ zvolit ve skupině _Kód_ tlačítko _Visual Basic_.

![](RackMultipart20230825-1-dom2ev_html_fa3f75c67ed0b21d.png)

Obrázek 3 – Tlačítko _Visual Basic_ pro spuštění VBE

Visual Basic Editor (VBE) je integrované vývojové prostředí pro tvorbu maker. To znamená, že uživatelům umožňuje vytvářet, upravovat a ladit kód VBA. Editor zahrnuje barevné zvýrazňování jazyka, editor pro uživatelské rozhraní a možnost práce se strukturou projektu. Dovednosti VBE budou postupně rozvedeny v rámci tohoto průvodce.

![](RackMultipart20230825-1-dom2ev_html_18bb96ef9f6d8ce4.png)

Obrázek 4 – Visual Basic Editor

### 1.1.3Rozložení projektu

Projekt VBA je skoro vždy vázán na konkrétní sešit Excelu a makra se ukládají přímo do tohoto sešitu v binární podobě. Základní strukturu projektu lze vidět v levé části po otevření VBE, kde se nachází všechny soubory celého projektu, popř. dalších projektů.

![](RackMultipart20230825-1-dom2ev_html_752e7933ad5127bd.png)

Obrázek 5 – Struktura projektu VBA

V postranním menu, které zobrazuje strukturu projektu, jsou zobrazeny složky _Microsoft Excel Objects_, _Forms_, _Modules_ a _Class Modules_. Tyto složky představují rozložení jednotlivých uživatelských kódů dle použití a pomáhají s přehlednou organizací.

Složka _Microsoft Excel Objects_ převážně obsahuje objekt právě otevřeného sešitu a pak jednotlivé objekty listů sešitu. Dvoj kliknutí na jeden z objektů zobrazí nové podokno ve VBE, kde lze psát kód k příslušnému objektu. Složka je výchozí pro Excel VBA projekt a jako jediná v novém projektu zobrazená.

Ostatní složky se zobrazí až po přidání nových objektů do projektu dle jejich požadovaného typu. Pokud projekt není ve stromové struktuře, ale zobrazuje všechny soubory kódu najednou, stačí stisknout tlačítko _Toggle Folders_ s ikonou složky na strukturou projektu.

![](RackMultipart20230825-1-dom2ev_html_5a4736b6425edb2.png)

Obrázek 6 – Tlačítko přepínání typu zobrazení struktury projektu

### 1.1.4Úkoly k procvičení

1. Spusťte VBE a vytvořte nový VBA projekt v sešitě.
2. Přejmenujte projekt na _MujPrvniVBAProjekt_ a přidejte vlastní popis k projektu.
3. Uložte sešit a projekt VBA ve formátu .xlsm, aby uložený sešit obsahoval makra.

## 1.2Lekce 1 – Procedury

Při používání programu Excel může jeho uživatel rozšířit funkčnost svého sešitu nebo listu pomocí dvou hlavních procedur, do kterých může zapsat nebo nahrát kód. Jedná se o procedury makro a funkce. Rozdíly mezi nimi jsou vysvětleny v následujících podkapitolách.

### 1.2.1Makro

Makrem je označována každá procedura, která je definována v kódu pomocí klíčového slova _Sub_ (vychází z anglického názvu _subroutine_ – v češtině subrutina, podprogram nebo makro). Makro představuje sadu instrukcí, které se počítač při spuštění daného makra pokusí splnit. K úspěšnému dosažení konce makra, označeného pomocí klíčového slova _End Sub_, musí být všechny instrukce správně syntakticky zapsány, jinak dojde k chybě při běhu programu.

![](RackMultipart20230825-1-dom2ev_html_3c4a3fdb695366e6.png)

Obrázek 7 – Syntaktická ukázka kódu makra

Vytvořit makro lze několika způsoby. Jedním ze způsobu je pomocí karty _Vývojář_ a tlačítka _Makra_ ve skupině _Kód_.

![](RackMultipart20230825-1-dom2ev_html_c872e3303adc5c68.png)

Obrázek 8 – Tlačítko Makra pro otevření podokna s organizací maker

Po kliknutí na tlačítko se zobrazí nové menší podokno, které zobrazuje všechny doposud vytvořená makra. Uživatel musí zapsat název svého makra bez mezer, čísel a diakritiky. Pokud název již neexistuje, mělo by se zpřístupnit tlačítko _Vytvořit_. Stiskem tohoto tlačítka se otevře Visual Basic Editor s vytvořenou kostrou makra.

![](RackMultipart20230825-1-dom2ev_html_b1f92e137e8ae9db.png)

Obrázek 9 – Podokno s organizací maker v sešitech

Po doplnění kódu, který by měla procedura splnit, lze makro spustit ve stejném podokně, akorát s označením daného makra a s pomocí tlačítka _Spustit_. Makro lze přímo spustit i z editoru pomocí zelené šipky v liště pod nabídkou menu, v menu pomocí _Run Sub/User Form_ nebo pomocí klávesy _F5_. Pomocí lišty lze makro i pozastavit či kompletně zastavit.

![](RackMultipart20230825-1-dom2ev_html_d871513cab952910.png)

Obrázek 10 – Lišta s často používanými funkcemi, i pro ladění kódu

### 1.2.2Záznam makra

Pro urychlení a ulehčení vývojářům psaní kódu VBA existuje možnost zaznamenat kód přímo v aplikaci Excel. To znamená, že pokud vývojář stiskne nahrávání, veškeré jeho akce, které v programu Excel provede se zapíši do kódu VBA, dokud nahrávání neukončí.

Nahrávání makra se spouští na kartě _Vývojář_ pomocí tlačítka _Zaznamenat makro_ ve skupině _Kód_. Po kliknutí na tlačítko se zobrazí nové podokno, které vyžaduje zadat název nově zaznamenávaného makra, klávesovou zkratku pro rychlé spuštění, informaci o místě uložení makra a popis makra.

![](RackMultipart20230825-1-dom2ev_html_3e10c38e66fb74dd.png)

Obrázek 11 – Podokno se záznamem makra

Po potvrzení údajů pomocí tlačítka _OK_ se spustí nahrávání makra. Každá změna v sešitě se nyní zaznamená do VBA jako instrukce v subrutině. Záznam se zastaví pomocí tlačítka _Zastavit záznam_ na kartě _Vývojář_.

![](RackMultipart20230825-1-dom2ev_html_8673a3cd2928ee0e.png)

Obrázek 12 – Tlačítko zastavení záznamu makra

Po dokončení nahrávání lze ve VBE nahrané makro upravit dle potřeb vývojáře. Makro lze najít v podokně maker a upravit tlačítkem _Upravit_, které otevře VBE na místě, kde se zaznamenané makro nachází.

V rámci nahrávání makra může uživatel vybrat možnost _Použít relativní odkazy_. Při vybrání této možnosti se makro bude nahrávat s odsazením od aktuálně vybrané buňky, místo toho, aby si zapisovalo vybrané souřadnice buňky.

### 1.2.3Ukládání sešitu

Ukládání souboru do normálního excel dokumentu _Sešit Excelu_ (koncovka .xlsx) způsobí, že vytvořená makra se v souboru neuloží. K uložení dokumentu včetně maker je potřeba soubor uložit jako typ _Sešit Excelu s podporou maker_ (.xlsm).

![](RackMultipart20230825-1-dom2ev_html_181a099cb687854e.png)

Obrázek 13 – Ukázka možnosti uložení sešitu s podporou maker

### 1.2.4Funkce

Procedury typu funkce na rozdíl od maker vracejí tzv. návratovou hodnotu, jinými slovy nějaký finální výsledek, ke kterému během svého chodu dospěli. Tento výsledek může být výsledek výpočtu, hláška, datum atd.

Funkci lze zavolat v kódu a její výsledek uložit do proměnné nebo ji lze použít přímo v sešitě Excel. Návratová hodnota se v takovém případě objeví v buňce, ze které funkce byla volána.

Před použitím funkce je potřebné prvně danou funkci definovat. Definice funkce probíhá klíčovým slovem _Function_, které je následované názvem. Název funkce musí být v rámci dokumentu jedinečný, aby nedošlo ke kolizi funkcí. Konec funkce je obdobně jako u makra označen klíčovými slovy _End Function_. Před ukončením funkce se v určitém momentu měla uložit návratová hodnota. Tento proces proběhne přiřazením dané hodnoty názvu funkce pomocí operátoru rovná se. V případě nepřiřazení funkce nebude vracet žádnou hodnotu.

![](RackMultipart20230825-1-dom2ev_html_8c2487b4b00061bb.png)

Obrázek 14 - Syntaktická ukázka kódu funkce

V rámci kódu je možné funkci opustit příkazem _Exit Function_, který ukončí kód v místě použití. Klíčové slovo _End_ tedy označuje pouze konec definice subrutiny, zatímco _Exit_ ji opouští s tím, že nebude pokračovat ve vykonávání dalšího kódu.

Předtím zmíněné definice funkce by neustále vracely stejnou hodnotu a jejich užitek by byl poměrně malý. Z tohoto důvodu lze funkcím přiřadit vstupní parametry, které ovlivňují dosažený výsledek funkce. Vstupní parametry funkce, lze nadefinovat ve funkci do závorek po uvedení názvu funkce. Množství vstupních parametrů není nijak omezeno.

![](RackMultipart20230825-1-dom2ev_html_cb6023c38ac05479.png)

Obrázek 15 – Ukázka funkce _ObsahCtverce_ s parametrem _stranaA_

Pro příklad řekněme, že existuje funkce pojmenovaná _ObsahCtverce_. Jelikož nechceme pokaždé upravovat funkci pro výpočet obsahu čtverce s tím, že v ní změníme číslo s velikostí strany, musí tato funkce obsahovat vstupní parametr. Ten by se měl měnit dle potřeb případu použití funkce. Pro výpočet obsahu čtverce je potřeba znát délku jeho strany, kterou lze označit například _stranaA_. Z toho vyplývá, že _stranaA_ bude vstupním parametrem pro tuto funkci. Návratová hodnota funkce bude obsahovat výpočet za použití tohoto vstupního parametru, v tomto případě _stranaA \* stranaA._

Některé parametry funkcí mohou být volitelné (uživatel funkce je nemusí zadávat k tomu, aby funkce fungovala v pořádku). Ve VBA se takový parametr označuje klíčovým slovem _Optional._ Pokud je potřeba přiřadit tomuto parametru výchozí hodnotu, přiřadí se pomocí znaku rovná se.

![](RackMultipart20230825-1-dom2ev_html_7f9ca7ac7605d067.png)

Obrázek 16 – Ukázka funkce s volitelným parametrem s výchozí hodnotou

### 1.2.5Úkoly k procvičení

1. Vytvořte makro _Pozdrav_, které zobrazí zprávu „Pozdrav z UTB".
2. Nahrajte makro _NovyList_, které vytvoří nový list v sešitě.
3. Vytvořte funkci _MojeJmeno_, která po použití zobrazí v dané buňce Vaše jméno.
4. Vytvořte v dokumentu _osoby.xlsm_ nový modul a novou funkci _CeleJmeno_, která bude mít vstupní parametry (povinný) _Jmeno_, (povinný) _Prijmeni_, (volitelný) _TitulPred_ a (volitelný) _TitulZa_. Výstupem této funkce bude kompletní jméno včetně titulů, pokud jsou zadány. Doplňte pomocí funkce sloupec _Celé Jméno_ v daném sešitě. Bonus: Odstraňte všechny mezery navíc před a za celými jmény.

## 1.3Lekce 2 – Proměnné, datové typy a výpočty

### 1.3.1Proměnné

Při vytváření procedur je občas zapotřebí ukládat určité hodnoty, výsledky výpočtů a jiná data, které algoritmus zapsaný v kódu potřebuje. K tomuto účelu slouží proměnné, které alokují místo v paměti počítače a uloží do něj tyto potřebné hodnoty.

Deklarace proměnných ve VBA proběhne, pokud se dříve nepoužitému názvu (názvu proměnné) přiřadí požadovaná hodnota. Přiřazení hodnoty probíhá napsáním názvu proměnné následovaného znakem rovná se a hodnotou, kterou chce programátor do proměnné uložit.

Pro přečtení hodnoty z proměnné se na místo v kódu napíše název proměnné. Při běhu kódu pak počítač na toto místo vloží hodnotu proměnné, kterou má uloženou v paměti. Jedná se o podobný princip jako při používání parametrů ve funkcích.

Proměnná a její hodnota je v paměti počítače, dokud běh programu nedosáhne klíčového slova _End_. Pokud je proměnná deklarována mimo procedury, její platnost vyprší až s uzavřením celého programu.

### 1.3.2Datové typy

Kontext hodnot v proměnných je udržován pomocí datových typů. V paměti počítače jsou tyto hodnoty zapsány pomocí jedniček a nul a bez kontextu se nedá určit, jestli je tato kombinace číslo, text, datum nebo něco kompletně odlišného. Pro vývojáře i počítač zároveň značí, jak s těmito hodnotami zacházet (alokovat místo v paměti, používání určitých
 funkcí, ...).

| **Binární číslo v paměti** | **0100 0001 0100 0000** |
| --- | --- |
| **Číslo (desítková soustava)** | 16 704 |
| **Text (UTF-16; znak)** | A _(U+0041)_ |
| **Datum** | 24.09.1945 |

Tabulka 1 – Ukázka příkladu reprezentace dat a kontextu

Pokud je proměnná definována implicitně bez datového typu, přiřadí se ji automaticky datový typ _Variant_, který se přizpůsobuje na základě vložené hodnoty. To vyžaduje vyšší náklady na paměť a řízení práce s proměnou. V dnešní době jsou tyto vyšší náklady při vyšších výkonech počítačů a větších kapacit pamětí zanedbatelné, ale v minulosti mohly značit problémy. Datový typ _Variant_ zároveň umožňuje vývojářům představit v chodu programu chyby v podobě načtení dat jiného datového typu do proměnné, než je potřeba.

Z těchto důvodu se většinou vývojáři v jazyce VBA snaží implicitní deklaraci vyvarovat a místo ní použít deklaraci explicitní, která zaručí, že v deklarované proměnné může být pouze jeden datový typ. Při přidělení jiného datového typu do takto deklarované proměnné program ohlásí chybu.

Vývojář si může nastavit tvrdé vyžadování explicitní deklarace pomocí klíčového spojení _Option Explicit_, které by se mělo uvádět na začátku každého modulu. Toto nastavení omezí implicitní deklaraci pro celý modul a nutí vývojáře uvádět datové typy. Při spuštění procedury s implicitní deklarací se zobrazí chyba kompilátoru s hláškou „_Proměnná není definována._"

| **Datový typ** | **Význam** | **Hodnoty** |
| --- | --- | --- |
| **Boolean** | Logická hodnota | True / False (Pravda / Nepravda) |
| **Integer** | Celé číslo | -32 768 až 32 767 |
| **String** | Text (řetězec znaků) | 0 až 232 |
| **Double** | Desetinné číslo | -1,79769313486231E308 až
 -4,94065645841247E-324 pro záporná čísla
 4,94065645841247E-324 až 1.79769313486232E308 pro kladná čísla |
| **Date** | Datum | 1. ledna 100 až 31. prosince 9999 |
| **Currency** | Měna | -922 337 203 685 477,5808 až
 922 337 203 685 477,5808 |
| Long | Celé číslo | -2 147 483 648 až 2 147 483 647 |
| LongLong | Celé číslo | -9 223 372 036 854 775 808 až
 9 223 372 036 854 775 807 |
| Byte | Bajt | 0 až 255 |
| Single | Desetinné číslo | -3.402823E38 až -1.401298E-45 |
| **Variant** | Automaticky přizpůsobitelný datový typ | Podle přiřazené hodnoty |
| **Object** | Objekt | Podle vlastností objektu |
| Type | Uživatelsky definovaný
 datový typ | Libovolné (dle použitých typů) |

Tabulka 2 – Tabulka důležitých datových typů a jejich význam a hodnoty

Datový typ _Boolean_ je vhodné použít v případě, pokud je potřeba vyjádřit v logice programu stav o nějakém předmětu – například zapnuto a vypnuto, nebo platí a neplatí. Ostatní použití datových typů (_Integer_, _Double_, _Date_, _String_, _Currency_, …) v logice algoritmu je poměrně odvoditelné od jejich významu.

### 1.3.3Operátory při práci s proměnnými

Do proměnných lze ukládat i výsledky výpočtu, které lze provést pomocí aritmetických operátorů, jiných proměnných a konstant. Číselné konstanty mohou být celá nebo desetinná čísla, která se ovšem musí vždy psát s desetinnou tečkou a nikoliv čárkou.

| **Operátor** | **Popis** |
| --- | --- |
| + | Sečte dvě čísla (na levé a pravé straně) |
| - | Odečte od levého čísla pravé číslo |
| \* | Vynásobí dvě čísla (na levé a pravé straně) |
| / | Podělí číslo na levé straně pravým číslem |
| Mod | Modulo, zjistí celočíselný zbytek po dělení levého čísla pravým číslem |
| ^ | Umocní levé číslo pravým číslem |

Tabulka 3 – Tabulka aritmetických operátorů ve VBA

Výpočet může obsahovat závorky pro nejvyšší přednost ve výpočtu. Počítač nadále vypočítá veškerá umocnění ve výpočtu. Pokud jich je v příkladu více, postupuje z levé strany na stranu pravou. Po umocnění následuje násobení, dělení a modulo vše v pořadí zleva doprava. Na závěr počítač provede veškerá sčítání a odečítání opět ve stejném pořadí z levé strany.

![](RackMultipart20230825-1-dom2ev_html_53877997f05a00d7.png)

Obrázek 17 – Ukázka kódu s příkladem priorit výpočtu

Pro práci s řetězci znaků v proměnných existují pouze dva operátory, které řetězce spojují. Ostatní funkce pro práci s textem nelze provádět pomocí operátorů a musí být použity specializované funkce o kterých bude zmínka později.

| **Operátor** | **Popis** |
| --- | --- |
| + | Spojí řetězec znaků na levé straně s řetězcem na straně pravé |
| & | Spojí řetězec znaků na levé straně s řetězcem na straně pravé |

Tabulka 4 – Tabulka spojovacích operátorů ve VBA

![](RackMultipart20230825-1-dom2ev_html_e603780a867ce9a8.png)

Obrázek 18 – Ukázka kódu s použitím spojovacího operátoru

### 1.3.4Převody mezi datovými typy

Pro případy, kdy je například potřeba převést řetězec obsahující číslo na číselnou hodnotu, se kterou lze počítat existují tzv. Funkce převodu typů (anglicky _Type conversion functions_). Tyto funkce se ze vstupního argumentu (přijímané hodnoty) pokusí vytvořit hodnotu s požadovaným datovým typem. Název funkce tvoří velké písmeno C (z anglického _convert_) následované zkratkou potřebného návratového datového typu.

| **Název funkce** | **Návratový datový typ** | **Přijímané hodnoty** |
| --- | --- | --- |
| **CBool()** | Boolean | Validní textová nebo číselná hodnota. |
| **CByte()** | Byte | 0 až 255. |
| **CCur()** | Currency | -922 337 203 685 477,5808 až
 922 337 203 685 477,5808. |
| **CDate()** | Date | Validní datum. |
| **CDbl()** | Double | -1,79769313486231E308 až
 -4,94065645841247E-324 pro záporná čísla
 4,94065645841247E-324 až 1.79769313486232E308 pro kladná čísla. |
| **CInt()** | Integer | -32 768 až 32 767 (zaokrouhluje desetinná). |
| **CLng()** | Long | -2 147 483 648 až 2 147 483 647. |
| **CLngLng()** | LongLong | -9 223 372 036 854 775 808 až
 9 223 372 036 854 775 807. |
| **CSng()** | Single | -3.402823E38 až -1.401298E-45. |
| **CStr()** | String | Různé, většinou z nich vyjadřuje vstup převedený na text. |
| **CVar()** | Variant | Podle typu. |

Tabulka 5 – Tabulka funkcí převodu datových typů pro proměnné

### 1.3.5Úkoly k procvičení

1. Vytvořte funkce _palecNaCm_ a _cmNaPalec_, které budou převádět mezi jednotkami palec a centimetry. (1 palec = 2,54 cm).
2. Vytvořte funkci _obvodObdelniku_, která vypočítá obvod obdélníku na základě vložených parametrů _stranaA_ a _stranaB_.
3. Vytvořte funkci _prevodNaCela_, která bude převádět desetinná čísla na celá.
4. Vytvořte funkci _jeSude_, která vrátí _PRAVDA_ nebo _NEPRAVDA_ podle toho, jestli je vstupní číslo sudé nebo ne. Použijte operátory pro výpočet a funkce pro převod datových typů. Otestujte funkci v sešitě Excel na několika číslech.
5. Vytvořte funkci _obsahKruhu_, která vypočítá obsah kruhu na základě argumentu poloměru _r_. Pro přesnější π použijte funkci _WorksheetFunction.Pi()_.

## 1.4Lekce 3 – Větvení a podmíněné příkazy

Při tvorbě algoritmů vývojář narazí na místo v toku programu, kde je potřeba kód rozdělit na dvě a více možných cest. Rozdělení probíhá na základě určitých podmínek, které v rámci programu v dané situaci nastali. Pokud je podmínka pro danou větev splněna, program se rozhodne tuto větev následovat a ostatní větve jsou ignorovány, dokud se větve opět nesloučí.

![](RackMultipart20230825-1-dom2ev_html_4e65520c72e08e80.png)

Obrázek 19 – Diagram příkladu více toků v algoritmu

Pro příklad, pokud bude venku pršet, uživatel si položí otázku, zda chce zmoknout? Pokud ne, musí si vzít deštník, což vyžaduje jinou činnost, než pokud by se deštník nevzal. V tomto bodě se kód větví dle informace na existující otázku.

Ve VBA existují dva hlavní způsoby pro vypořádání se s větvením algoritmu – Příkazy
_If_, _Else_ a _Else__If_ nebo příkaz _Select Case_.

### 1.4.1Příkazy If, Else, Else If

Příkaz _If_ lze použít samostatně, a to v případě, kdy je potřeba provést kód pouze pokud platí podmínka a není potřeba řešit nic jiného. Podmínka musí být datového typu _Boolean_, a pokud nabývá hodnoty _PRAVDA_, provede se příslušný kód. Tento blok kódu začíná na novém řádku po klíčovém slově _Then_ a je ukončen klíčovými slovy _End If_.

![](RackMultipart20230825-1-dom2ev_html_20e0aee31bee739.png)

Obrázek 20 – Struktura jednoduchého podmíněného příkazu

Příkaz _ElseIf_ přidává další možnost větvení kódu, pokud první podmínka (u příkazu _If_) obsahuje hodnotu _NEPRAVDA_. Blok pod _ElseIf_ se spustí v případě, že jeho podmínka je opět _PRAVDA_. Tento příkaz s bloky kódu se může opakovat v libovolném množství a může se vyzkoušet stejné libovolné množství podmínek. Konečný příkaz _Else_ již nepotřebuje žádnou podmínku, protože kód se spustí vždy, pokud žádný z předchozích příkazů _If_ a _ElseIf_ nebyl _PRAVDA_.

![](RackMultipart20230825-1-dom2ev_html_c0c1affb4f76b712.png)

Obrázek 21 – Struktura příkazu _If_, _ElseIf_ a _Else_, ukázka větvení

### 1.4.2Porovnávací operátory

Kromě proměnných lze v příkazech _If_, _ElseIf_ a _Else_ použít porovnávací operátory, k dosažení logické (_Boolean_) hodnoty pro správné spuštění kódu. Porovnávací operátory lze použít, pokud se snažíme získat logickou hodnotu i na jiných místech, například při ukládání do proměnné nebo při získání návratové hodnoty z funkce.

| **Operátor** | **Popis** |
| --- | --- |
| = | Pokud je levá strana rovna pravé straně,
 vrátí _PRAVDA_ (_True_), jinak _NEPRAVDA_ (_False_). |
| \< | Pokud je levá strana menší než pravá strana,
 vrátí _PRAVDA_ (_True_), jinak _NEPRAVDA_ (_False_). |
| \> | Pokud je levá strana větší než pravá strana,
 vrátí _PRAVDA_ (_True_), jinak _NEPRAVDA_ (_False_). |
| \<= | Pokud je levá strana menší než pravá strana nebo rovna pravé straně,
 vrátí _PRAVDA_ (_True_), jinak _NEPRAVDA_ (_False_). |
| =\> | Pokud je levá strana větší než pravá strana nebo rovna pravé straně,
 vrátí _PRAVDA_ (_True_), jinak _NEPRAVDA_ (_False_). |
| \<\> | Pokud není levá strana rovna pravé straně,
 vrátí _PRAVDA_ (_True_), jinak (pokud se rovnají) _NEPRAVDA_ (_False_). |

Tabulka 6 – Tabulka porovnávacích operátorů a jejich popis činnosti

Pro příklad, uživatel má vstupní číslo, u kterého je potřeba zjistit, zda je záporné, kladné, nebo nula. Problém je možné vyřešit pomocí příkazu _If_, který rozdělí cestu algoritmu dle potřeby. Potřebné jsou k tomu ovšem podmínky, které splňují určená pravidla. K získání těchto podmínek je možné použít správně dosazené porovnávací operátory do porovnání čísla společně s číslem nula.

![](RackMultipart20230825-1-dom2ev_html_ec264c1f25bb1f95.png)

Obrázek 22 – Ukázka kódu použití porovnávacích operátorů

### 1.4.3Logické operátory

Využití logických operátorů nastává v případě, kdy je potřeba použít více podmínek dohromady a přidat k nim další možnou rozšiřující logiku.

| **Operátor** | **Popis** |
| --- | --- |
| AND | Pokud je levá strana _PRAVDA_ (_True_) a pravá strana je _PRAVDA_ (_True_),
 vrátí _PRAVDA_ (_True_), jinak _NEPRAVDA_ (_False_). |
| OR | Pokud je levá strana _PRAVDA_ (_True_) nebo pravá strana _PRAVDA_ (_True_),
 vrátí _PRAVDA_ (_True_), jinak _NEPRAVDA_ (_False_). |
| XOR | Pokud je levá strana _PRAVDA_ (_True_) a pravá strana _NEPRAVDA_ (_False_) nebo
 pokud je levá strana _NEPRAVDA_ (_False_) a pravá strana _PRAVDA_ (_True_)
 vrátí _PRAVDA_ (_True_), jinak pokud jsou obě strany _PRAVDA_ (_True_) nebo _NEPRAVDA_ (_False_),
 vrátí _NEPRAVDA_ (_False_) |
| NOT | Pokud je hodnota na pravé straně _PRAVDA_ (_True_),
 vrátí _NEPRAVDA_ (_False_).Pokud je hodnota na pravé straně _NEPRAVDA_ (_False_),
 vrátí _PRAVDA_ (_True_). |

Tabulka 7 – Tabulka logických operátorů ve VBA

### 1.4.4Příkaz Select Case

Alternativou k příkazům _If, ElseIf_ a _Else_ je příkaz _Select Case_, který jako vstup příjme hodnotu (většinou z proměnné), kterou se následně snaží přirovnat ke všem možnostem, které má nadefinované. Možnosti jsou nadefinované pomocí klíčového slova _Case_ následované možnou hodnotou. Pokud žádná hodnota nevyhovuje, lze nadefinovat možnost _Case Else_, která bude výchozí možností, pokud nebudou odpovídat možnosti jiné.

![](RackMultipart20230825-1-dom2ev_html_9b1b0440dfc5f56e.png)

Obrázek 23 – Ukázka kódu použití příkazu _Select_

V rámci jedné možnosti lze nadefinovat i více hodnot, které stačí oddělit pomocí čárky. Blok kódu pod takovou možností se spustí, pokud bude platit jedna z nadefinovaných variant. V rámci možnosti _Case_ lze použít i porovnávací operátor vůči porovnávané hodnotě. Takový případ vyžaduje použít klíčové slovo _Is_ následované operátorem a hodnotou.

![](RackMultipart20230825-1-dom2ev_html_47de3240c47d4faf.png)

Obrázek 24 – Ukázka kódu použití příkazů _Select, To_ a _Is_

Pokud je potřeba vytvořit možnost pro řadu čísel, lze použít příkaz _To_. Například, pokud chceme, aby možnost byla spustitelná pro čísla od 0 po 10, použije se _Case 0 To 10_, které zajistí tuto hranici.

### 1.4.5Podmíněné funkce

Psaní příkazů _If_ a _Switch_ je poměrně textově rozsáhlé, a ne vždy vývojář potřebuje takové množství řádků. K dosažení jednoduchých podmiňovacích příkazů lze i za pomocí podmiňovacích funkcí _Switch_, _IIf_ a _Choose_.

Funkce _IIf_vrací jednu ze dvou definovaných hodnot na základě podmínky, která je v prvním parametru funkce. Dochází ke zjednodušení zápisu příkazů _If_ a _Else_, pokud vývojář potřebuje určit pouze jednu hodnotu, na základě nějaké podmínky. Výstup funkce je ovšem omezen pouze na jednu ze dvou možností a více možností s touto funkcí nelze použít.

![](RackMultipart20230825-1-dom2ev_html_b1612102fab3a0bc.png)

Obrázek 25 – Ukázka kódu použití funkce _IIf_

Funkce _Switch_ zjednodušuje formát příkazu _Select Case_ a definici jeho možností, pokud je potřeba vrátit pouze jednu hodnotu a nepoužít celý blok kódu. Funkce má neomezené množství parametrů a vždy se střída podmínka, která pro hodnotu musí platit, a hodnota, která se navrátí, pokud podmínka platí.

![](RackMultipart20230825-1-dom2ev_html_a81777ae99c787f8.png)

Obrázek 26 – Ukázka kódu použití funkce _Switch_

Průchod podmínek probíhá od první k poslední a jakmile je určitá podmínka splněna, vrátí její návratovou hodnotu a dále nepokračuje. To znamená, že i když platí více podmínek, návratová hodnota funkce bude mít hodnotu první, která je _PRAVDA_.

Princip funkce _Choose_ spočívá ve vybírání z možností. Prvním parametrem funkce je hodnota typu kladného čísla. Tato hodnota dle pořadí určuje, která z hodnot se použije. První hodnota (druhý parametr funkce) je pod indexem 1 a ostatní (další parametry funkce) se po jedné navyšují.

![](RackMultipart20230825-1-dom2ev_html_9f22aefe8423b8c9.png)

Obrázek 27 – Ukázka kódu použití funkce _Choose_

### 1.4.6Úkoly k procvičení

1. Vytvořte funkci _JePrestupnyRok_ s číselným parametrem _rok_, která vrátí hodnotu _PRAVDA_ pokud je rok přestupný a hodnotu _NEPRAVDA_, pokud rok přestupný není.
2. Vytvořte funkce _DenVTydnu_ s parametrem _den_, který bude představovat pořadí dne v týdnu. Návratová hodnota funkce bude vracet (text) řetězec s názvem daného dne anebo řetězec _„__CHYBA"_, pokud vstup nebude odpovídat danému dni.
3. Vytvořte funkci _Prospel_, která bude vracet text „Prospěl" nebo „Neprospěl" v sešitě zaci.xlsx. Pro úspěšné hodnocení musí mít žák alespoň 250 bodů a maximálně 3 absence.
4. Vytvořte funkci _KvadratickaRovnice_ pro výpočet kořenů kvadratické rovnice. Parametry funkce budou _a_, _b_, _c_. Funkce bude vracet hodnoty „_Nemá reálné kořeny_." nebo dvě hodnoty spojené v řetězci pomocí „ _a_ ".

## 1.5Lekce 4 – Kalendářní a časové hodnoty

I když by bylo možné v předtím jmenovaných datových typech udržovat hodnoty pro čas a kalendář, z vývojářského a uživatelského pohledu by tato akce byla příliš nepraktická. Z tohoto důvodu VBA nabízí možnost práce s časem jiným (jednodušším) způsobem.

### 1.5.1Kalendářní hodnoty

Do proměnné lze uložit pevnou kalendářní hodnotu pomocí zápisu ve tvaru _#měsíc/den/rok__#_, který vychází z anglického formátování kalendářního data. Mřížky v zápise označují, že se jedná o celek jako datum, jinak by bylo provedeno dělení se zapsanými čísly.

![](RackMultipart20230825-1-dom2ev_html_875fc2546b9b7804.png)

Obrázek 28 – Ukázka kódu práce s kalendářními hodnotami

Od kalendářních hodnot lze přičítat a odečítat počet dní obdobně jako při počítání příkladů. VBA umí pracovat i s přičtením a odečtením pevně zapsaných kalendářních hodnot. Aktuální datum lze zjistit pomocí funkce _Date_, která navrátí aktuální den v kalendáři.

### 1.5.2Časové hodnoty

Podobně jako v případě kalendářních hodnot se pro proměnné zapisují hodnoty času ve tvaru _#hodiny:minuty:sekundy#_. Mřížky opět označují, že se jedná o celek ve formátu času. Editor VBA uzpůsobí zapsaný formát vloženého času do anglického formátu.

![](RackMultipart20230825-1-dom2ev_html_ac173d7c450868e.png)

Obrázek 29 – Ukázka kódu práce s časovými hodnotami

U časových hodnot nelze přičítat ani odečítat samostatná čísla, ale pouze vždy časové hodnoty. Aktuální čas lze získat funkcí _Time_.

### 1.5.3Práce s kalendářem a časem

Mezi další funkce pro práci s časem patří funkce _Now_, která navrátí aktuální datum a čas spojené v jedné hodnotě. Hodnota data a času lze zapsat společně ve tvaru _#měsíc/den/rok hodiny/minuty/sekundy AM/PM#_.

Funkce _Weekday_ vrátí na základě vloženého data (první parametr), číselnou hodnotu dne v týdnu. Druhý parametr určuje, který den v týdnu je jako první. Výchozí hodnota je nastavena na neděli (hodnota _vbSunday_, vychází z anglicky mluvících zemí). Pro českou lokalizaci je nutné uvést hodnotu _vbMonday_ (pondělí), aby pro nás funkce fungovala správně.

Mezi ostatní funkce, které navrátí číselnou hodnotu z parametru datumu patří:

- _Day_ – Navrátí číselnou hodnotu dne datumu
- _Month_ – Navrátí číselnou hodnotu měsíce datumu
- _Year_ – Navrátí číselnou hodnotu roku datumu
- _WorksheetFunction.WeekNum_ – Navrátí číselnou hodnotu týdne v roce datumu (začínající v pondělí, pokud je druhý parametr _vbMonday_)
- _Hour_ – Navrátí číselnou hodnotu hodin datumu
- _Minute_ – Navrátí číselnou hodnotu minut datumu
- _Second_ – Navrátí číselnou hodnotu sekund datumu

![](RackMultipart20230825-1-dom2ev_html_4bb4a81e11301e5e.png)

Obrázek 30 – Ukázka použití funkcí pro práci s datumem

Opakem funkcí pro převod určité informace z datumů je funkce _DateSerial_, která z drobných informací je schopna vytvořit kompletní datum. Funkci je vhodné použít při kombinování rozložených dat. Funkce přijímá celočíselné parametry _rok, měsíc_ a _den_ v daném pořadí.

![](RackMultipart20230825-1-dom2ev_html_e106e5a482d84268.png)

Obrázek 31 – Ukázka kódu použité funkce _DateSerial_

Pro pomoc s počítáním nových dat od předem zadaného data existuje funkce _DateAdd_. Funkce na základě prvního parametru _interval_ zjistí, jakou jednotku času má přičítat/odečítat. Jednotky jsou zadávány do řetězce dle tabulky nastavení. Druhý parametr _number_ určuje, kolik jednotek se má k datu přičíst nebo odečíst. Třetí parametr funkce _date_ je pro datum, které určuje časový bod, od kterého se nové datum bude počítat.

![](RackMultipart20230825-1-dom2ev_html_50f027797b7e4320.png)

Obrázek 32 – Ukázka kódu použité funkce _DateAdd_

| **Nastavení** | **Popis** |
| --- | --- |
| yyyy | Rok |
| q | Čtvrtletí |
| m | Měsíc |
| y | Pořadové číslo v roce |
| d | Den měsíce |
| w | Den v týdnu |
| ww | Týden |
| h | Hodina |
| n | Minuta |
| s | Sekunda |

Tabulka 8 – Nastavení pro parametr _interval_ v _DateAdd_, _DateDiff_, _DatePart_

Pro měření časových intervalů (čtvrtletí, týdnů, měsíců, čtvrtků atd.) mezi dvěma datumy je možné použít funkci _DateDiff_. Funkce obsahuje 3 povinné parametry a 2 nepovinné. První parametrem _interval_ se vyjadřuje, v jaké jednotce času bude funkce měřit. Druhý a třetí parametr (_date1_, _date2_) jsou datumy, které ohraničují měřený úsek. Čtvrtý parametr _firstdayofweek_ určuje, který den v týdnu je jako první – pro Českou republiku by zde měla být nastavena hodnota _vbMonday_.

Poslední parametr _firstweekofyear_ určuje, jakým způsobem se má započítat první týden v novém roce. Výchozím nastavením je týden, ve kterém se objeví datum 1. ledna (hodnota _vbFirstJan1_). Kromě výchozího nastavení existují nastavení _vbFirstFourDays_ (první týden je ten, který má v sobě alespoň 4 dny v novém roce) a _vbFirstFullWeek_ (první týden je ten, který má celý týden v novém roce).

![](RackMultipart20230825-1-dom2ev_html_d8035a72e42bf32f.png)

Obrázek 33 – Ukázka kódu použité funkce _DateDiff_

Funkce _DatePart_ vrací ze vstupní kalendářní hodnoty část, která je specifikovaná v parametru _interval_. Jedná se o podobnou funkčnost jako mají funkce _Year, Month, Day, Hour, Minute_ a _Second_. Parametry funkce jsou obdobné funkci _DateDiff._

### 1.5.4Úkoly k procvičení

1. Vytvořte makro _OdRoku2000_, které po spuštění oznámí uživateli informaci o počtu dní, které uběhli od 1. ledna 2000.
2. Vytvořte makro _ZaStoLet_, které po spuštění oznámí uživateli, jaký den v týdnu bude za 100 let od dnešního dne.
3. Vytvořte funkci _DoJeziska_, která zobrazí počet hodin do nejbližšího vánočního dne. Ověřte, zda bude funkce fungovat i v příštích letech.
4. Upravte funkci _DenVTydnu_, aby jako argument přijala datum místo pořadí dne v týdnu a navrátila textovou hodnotu dne v týdnu, podle tohoto data.
5. Vytvořte makro _Nejblizsi29_, které uživateli vypíše datum nejbližšího 29. února společně s dobou, která do tohoto data uplyne.

## 1.6Lekce 5 – Opakování, cykly a pole

V programování (nejen) VBA kódu je občas počítači nutné říct, aby vykonal určitou činnost několikrát. Jedná se například o případy, kdy je potřeba projít několik podobných dat nebo je potřeba zopakovat určitou činnost, dokud není dosaženo požadovaného výsledku.

Jedním ze způsobů implementace opakování jsou cykly. Cykly jsou příkazy, které opakují svůj vnitřní blok kódu, dokud není dosaženo nějaké podmínky. Ve VBA jsou celkově 3 základní cykly: _While_, _For_ a _Do_ (ve variantách _Until_ a _While_).

### 1.6.1Cyklus While

Definice cyklu _While_ začíná klíčovým slovem _While_ a končí klíčovým slovem _Wend_. Za příkaz _While_ následně patří podmínka, která bude celý cyklus řídit. Pokud má daná podmínka hodnotu _PRAVDA_, cyklus se bude opakovat_._ Ke kontrole podmínky dochází vždy při začátku cyklu a pokud její hodnota bude _NEPRAVDA_, cyklus bude v daném místě ukončen.

![](RackMultipart20230825-1-dom2ev_html_891f435b0243e665.png)

Obrázek 34 – Ukázka kódu _While_ cyklu

### 1.6.2Cyklus For

Na rozdíl od cyklu _While_ se cyklus _For_ snaží mít proměnou, která se posunuje k určitému cíli. Může se jednat o číselný index nebo jinou hodnotu. Při cyklu _For_ se ve výchozím stavu nekontroluje žádná ukončovací podmínka. Cyklus se vždy posune o další běh, dokud nedosáhne svého posledního běhu.

![](RackMultipart20230825-1-dom2ev_html_43fef22f6540e817.png)

Obrázek 35 – Ukázka kódu _For_ cyklu

Při deklaraci cyklu _For_ se definuje proměnná cyklu a přidělí se ji počáteční celočíselná hodnota. Hodnota je následována klíčovým slovem _To_, které označuje cílovou hodnotu, které cyklus musí dosáhnout k jeho ukončení. Po konečné hodnotě může příkaz pokračovat klíčovým slovem _Step_, které určuje velikost kroku, o který se proměnná po doběhnutí cyklu zvýší.

![](RackMultipart20230825-1-dom2ev_html_76d1b97b5abe4be3.png)

Obrázek 36 – Ukázka kódu _For_ cyklu se zvýšeným krokem

Krok cyklu je zakončen klíčovým slovem _Next_, které označuje konec bloku kódu, který se opakuje. Příkaz _Next_ zároveň provede potřebný posun proměnné cyklu dle určené velikosti kroku. Tento příkaz by měl vždy být následován názvem proměnné cyklu, aby bylo v kódu určeno, kterou proměnnou má posunovat – více v podkapitole „Vnořené cykly."

### 1.6.3Cyklus Do

U příkazu cyklu _Do_ existují dvě varianty jeho implementace. První z nich je možnost použít klíčové slovo _While_, které zajistí stejnou funkcionalitu cyklu s podmínkou, jako předem jmenovaný cyklus _While_. Obě varianty cyklu jsou vždy ukončeny klíčovým slovem _Loop_, které označuje konec opakujícího se bloku.

![](RackMultipart20230825-1-dom2ev_html_b8346f7f4289c417.png)

Obrázek 37 – Ukázka kódu _Do While_ cyklu

Druhou variantou je cyklus _Do Until_, který na první pohled vypadá obdobně jako cyklus _Do_ While. Rozdíl je v tom, že cyklus pokračuje, když je podmínka hodnoty _NEPRAVDA_ a ukončí se v momentě, kdy je kontrolní podmínka hodnoty _PRAVDA_.

![](RackMultipart20230825-1-dom2ev_html_bf047bc427fde1f3.png)

Obrázek 38 – Ukázka kódu _Do Until_ cyklu

### 1.6.4Vnořené cykly

V rámci programování ve VBA je možné použít i více cyklů vnořených do sebe, klidně i pomocí jiných příkazů. Jednotlivé cykly lze předčasně ukončit pomocí klíčového slova _Exit_ následované názvem příkazu cyklu k ukončení (_Exit For_, _Exit Do_, _Exit While_). Opuštění cyklu bývá doprovázeno určitou podmínkou, která určuje situaci, ve které se má cyklus ukončit.

![](RackMultipart20230825-1-dom2ev_html_6f75d9782e5960f4.png)

Obrázek 39 – Ukázka kódu s předčasným ukončením cyklu

Při použití více cyklů příkazu _For_ je nutné přiřadit správné proměnné cyklu pomocí příkazu _Next_. Jinak by mohlo dojít v chybě logiky nebo kompilátoru při spuštění špatně napsaného příkazu.

![](RackMultipart20230825-1-dom2ev_html_b30cfd533e904bd4.png)

Obrázek 40 – Ukázka kódu s vnořeným cyklem _For_

Ve VB.NET je v rámci cyklů používán příkaz _Continue (Do | While | For)_, který pokračuje s další iterací cyklu v momentě, kde byl použit. Jinými slovy příkaz ukončuje běh aktuálního bloku kódu a spouští cyklus znovu, jako by byl celý blok kódu dokončen. VBA tuto funkci postrádá a vývojář musí psát logiku svých cyklů bez potřeby této funkce.

### 1.6.5Rekurzivní funkce

Dalším způsobem opakování jsou rekurzivní volání funkce. V principu jde o volání dané funkce uvnitř bloku kódu této funkce. Volání by vždy mělo mít určitou ukončovací podmínku, která zamezí nekonečnému volání funkce. Kdyby volání nebylo ukončeno, program by vyčerpal veškerou paměť, kterou by měl k dispozici, a nakonec by spadl.

![](RackMultipart20230825-1-dom2ev_html_758f99dc73dea302.png)

Obrázek 41 – Ukázka kódu rekurzivní funkce (faktoriál) rekurzivním způsobem

### 1.6.6Pole a matice

Občas je potřeba zapsat hodnoty podobného charakteru do několika proměnných. Například řekněme, že existují data, která určují vzdálenost od jednotlivých míst trasy. Museli by se tvořit číselné proměnné _vzdalenost12, vzdalenost23, vzdalenost34_ atd. Vytvářet tolik proměnných by ovšem bylo nepraktické, z tohoto důvodu existují pole (_array_).

Pole představuje jednu proměnnou určitého datového typu, která ukládá více hodnot. Hodnoty jsou indexovány od 0 do hodnoty o jedna menší, než je velikost pole. Pomocí indexu lze k určité hodnotě v poli přistoupit a přečíst ji nebo přepsat.

| **Ukázka indexování pole o velikosti 10 prvků** |
| --- |
| **Index prvku** | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| **Pořadí prvku** | 1. | 2. | 3. | 4. | 5. | 6. | 7. | 8. | 9. | 10. |

Tabulka 9 – Ukázka indexování pole

V našem případě by se pole mohlo jmenovat _vzdalenosti_ a pod indexem 0, by mohla být vzdálenost ze startu k prvnímu bodu, v indexu 1 by mohla být vzdálenost od prvního bodu k druhému bodu atd.

![](RackMultipart20230825-1-dom2ev_html_70273a61c4019db.png)

Obrázek 42 – Ukázka deklarace statického a dynamického pole

Pole se převážně zapisují a čtou pomocí _For_ a jiných cyklů, protože čtení z pole je opakující se činnost, která potřebuje iterační proměnnou. Statické pole má omezené množství prvků podle jeho deklarace. Množství je omezeno celý číslem v závorce deklarovaného pole. Dynamické pole se deklaruje bez čísel a nemá omezené množství.

![](RackMultipart20230825-1-dom2ev_html_56cc8b9660f4692d.png)

Obrázek 43 – Ukázka součtu všech prvků v poli pomocí cyklu _For_

Kromě jedno rozměrových polí existují vícedimenzionální pole. Pro jednoduchou představu lze říct, že dvourozměrné pole (matice) má pro každý svůj prvek další vlastní jednodimenzionální pole. Dvoudimenzionální pole mají dva indexy pro určení hodnoty, představující souřadnice – podobně jako je řádek a sloupec v tabulce. Pro procházení matic je potřeba použít vnořené cykly.

![](RackMultipart20230825-1-dom2ev_html_4252a54f4363e924.png)

Obrázek 44 – Ukázka kódu vytvoření matice

### 1.6.7Cyklus For Each

V poli a jiných kolekcích, které lze procházet, lze použít _For_ cyklus s příkazem _Each_, které místo počítání s proměnou cyklu postupně přebere prvky v určité řadě a přiřadí je do proměnné pro dané kolo cyklu. Tímto způsobem projde všechny prvky v kolekci a aplikuje pro ně naprogramovaný blok kódu. Vývojář se nemusí starat o indexy jednotlivých prvků a všechny je může projít a použít dle vhodného uvážení.

![](RackMultipart20230825-1-dom2ev_html_dfe9c9d5e0d30ffe.png)

Obrázek 45 – Ukázka kódu použití cyklu _For Each_

### 1.6.8Úkoly k procvičení

1. Vytvořte funkci _Pyramida_ s vnořený cyklem _For_, které pomocí znaku #, vytvoří ze symbolů 5 patrovou pyramidu v buňce sešitu.

#

###

#####

#######

#########

1. Vytvořte makro _Nasobilka_ s dvoudimenzionálním polem, o rozměrech 10x10, které bude obsahovat hodnoty násobilky malých čísel od 1x1 až 10x10. Obsah matice vypište pomocí jedné zprávy.
2. Zkopírujte makro _Nasobilka_ a přejmenujte ho na _NasobilkaObracene_. Upravte cyklus makra, tak aby vznikla nová matice otočená přes stoupající diagonálu s využitím cyklů.

## 1.7Lekce 6 – Práce s oblastmi výběru

V rámci předchozích lekcí se rozebírala převážně témata ohledně programovacího jazyku VBA a jak jej použít. Důležitou součástí je i propojení tohoto jazyka s programem Microsoft Excel. Propojení zatím bylo znázorněno ohledně funkcí a maker, ale nikoliv ohledně dat, se kterými tabulkový software pracuje.

### 1.7.1Aktivní označení

První možná manipulace s listem je skrz objekt _ActiveCell_. Jedná se o odkaz na buňku, která je v listu sešitu aktuálně označena. Přes tento odkaz lze číst hodnotu buňky pomocí _ActiveCell.Value_ a zapisovat nové hodnoty pomocí přiřazení k objektu pomocí znaku rovná se. Při zápisu se přepíše původní hodnota buňky.

![](RackMultipart20230825-1-dom2ev_html_678988d2770dab22.png)

Obrázek 46 – Ukázka kódu se zápisem a čtením z označené buňky

Do buňky lze vložit i funkce, které se nacházejí samostatně v Excelu. Název funkce musí být v angličtině, nikoliv v češtině – např. SUMA musí být SUM. Do označené buňky se musí funkce vložit přes odkaz _ActiveCell.Formula_.

![](RackMultipart20230825-1-dom2ev_html_e852381f00f57810.png)

Obrázek 47 – Ukázka kódu pro vložení funkce do buňky

V rámci tabulky Excelu lze vybrat více buněk najednou, které by se dali označit za „aktivní". Objekt _ActiveCell_ odkazuje pouze na označenou buňku bez šedého podkresu, a nikoliv na celý výběr. K odkazu na celý výběr se používá objekt _Selection_.

![](RackMultipart20230825-1-dom2ev_html_fcced3db6593873b.png)

Obrázek 48 – Vybraná oblast (_Selection_) a označená buňka (bílá, _ActiveCell_)

Do vybrané oblasti _Selection_ lze zapisovat stejným způsobem jako do _ActiveCell._ Nová hodnota přepíše všechny hodnoty v označené oblasti. Čtení oblasti pomocí _Selection.Value_ navrátí pole datového typu _Variant_, které v označených dimenzích postupně obsahuje hodnoty jednotlivých buněk.

### 1.7.2Pasivní přístup

Pasivní přístup k datům listu sešitu dovoluje přístup k celému sešitu bez nutnosti označení uživatelem. Nejčastěji se k datům přistupuje za pomoci objektu _Range_, která díky souřadnicovému systému Excelu je schopna vybrat konkrétní buňku nebo celou oblast buněk.

Souřadnice sešitu tvoří písmeno(a) pro sloupce a číslo pro řádky. Pokud je potřeba vybrat oblast pomocí souřadnic, použije se znak dvojtečky mezi souřadnicemi buněk protilehlých rohů vybírané oblasti. Pokud se vybíraná buňka nebo oblast vyskytuje na specifickém listu sešitu, přidá se před souřadnice název daného sešitu a znak vykřičníku. Čtení a zapisování do vybraných buněk přes objekt _Range_ probíhá obdobně jako u objektů _ActiveCell_ a _Selection_.

![](RackMultipart20230825-1-dom2ev_html_5eae3cf195facde5.png)

Obrázek 49 – Ukázka kódu užití souřadnic s objektem _Range_

Pomocí objektu _Range_ lze přečíst data přímo do pole, se kterým se dá nadále v kódu VBA pracovat. Čtení hodnot do pole lze provést i z více pozic najednou pomocí _Array._ Zapisování hodnot jde taktéž ulehčit pomocí zápisu s _Array_.

![](RackMultipart20230825-1-dom2ev_html_df46d2a779cad557.png)

Obrázek 50 – Ukázka kódu získání dat jako pole

Alternativním přístupem k datům buněk v listě sešitu Excel je použít vlastnost _Cells_. Tato vlastnost používá systém číselných souřadnic, přesněji pořadí řádků a sloupců. To znamená, že souřadnice ke konkrétní buňce v _Range_ „A1" odpovídá _Cells(1, 1)._

V rámci výběru oblasti _Range_ lze zřetězit i vlastnost _Cells_, která následně nevybírá buňku z celého sešitu, ale z oblasti vybrané pomocí _Range_. To umožňuje používat klasické _For_ cykly s iterační proměnnou k procházení jednotlivých buněk a měnění jejich vlastností.

![](RackMultipart20230825-1-dom2ev_html_3e3ca6cf3e1a9503.png)

Obrázek 51 – Ukázka kódu použití _Cells_ v _Range_

Objekt _Range_ a vlastnost _Cells_ lze použít i k posunutí objektů _ActiveCell_ a _Selection_. Po označení buňky nebo oblasti stačí zřetězit příkaz pomocí _Activate_ nebo pomocí _Select_. Příkazem bude označena pouze jedna oblast, pro vybrání více oblastí je nutné upravit parametr _Range_ a vepsat do něj obě oblasti oddělené středníkem. Po použití příkazu se vybraná oblast posune na specifikovanou oblast pomocí _Range_ nebo _Cells_.

![](RackMultipart20230825-1-dom2ev_html_cf2027ef9511e806.png)

Obrázek 52 – Ukázka kódu posunutí označené oblasti

Pokud je potřeba vybrat buňku s odsazením, která se nachází od určitého výběru, lze použít _Offset_. Odsazení má číselnou hodnotu řádku a sloupce, která určuje o kolik se má výběr posunout.

![](RackMultipart20230825-1-dom2ev_html_d4c8bc62850e7282.png)

Obrázek 53 – Ukázka kódu odsazení výběru pomocí _Offset_

Kromě _Offset_ lze použít _Resize_, který naopak rozšiřuje vybranou oblast o počet buněk určeným směrem. Vývojář tak nemusí udržovat přehled o souřadnicích, na kterých se nachází, ale může se v kódu dynamicky posouvat od uvedeného výběru.

### 1.7.3Řádky a sloupce sešitu

Obdobně jako _Cells_ fungují _Columns_ a _Rows_, které na základě uvedeného čísla řádku nebo sloupce pracují s daty celého sloupce.

![](RackMultipart20230825-1-dom2ev_html_e9e1774740b29a9f.png)

Obrázek 54 – Ukázka kódu použití objektů _Columns_ a _Rows_

Vlastnost _EntireColumn_ přistupuje ve vybrané oblasti k celému sloupci a umožňuje sloupce odebrat, vymazat, přidat nebo skrýt. Sloupce je možné odebrat pomocí _Delete_, vymazat pomocí _Clear_, přidat pomocí _Clear_ a skrýt pomocí nastavení vlastnosti _Hidden_ na hodnotu _PRAVDA_ (_True)_. Sloupec se znovu zobrazí po změnění této hodnoty zpět na _NEPRAVDA_ (_False_).

![](RackMultipart20230825-1-dom2ev_html_e382e03d7f833c5.png)

Obrázek 55 – Ukázka kódu využití _EntireColumn_

Obdobně jako _EntireColumn_ funguje vlastnost _EntireRow_, která místo sloupců umožňuje obdobné řešení pro řádky v sešitu.

### 1.7.4Úkoly k procvičení

1. Vytvořte makro _PridatCtyriRadky_, které přidá do sešitu k aktuální pozici 4 nové řádky
2. V sešitě _bludiste.xlsx_ vytvořte ovládací makra, které budou posouvat aktivní buňku o jednu pozici dle směru kliknutí tlačítka. V buňce se bude mazat a zapisovat znak tečky (•), který bude společně s aktivní buňkou označovat polohu v bludišti.
3. V sešitě mena.xlsx vytvořte novým makrem _NaEuro_ nový sloupec vedle CZK, který vytvoří sloupec s cenami v EUR. Použijte aktuálně dostupný kurz.

## 1.8Lekce 7 – Stylování textu a buněk

Buňky v sešitě Excel jde stylovat různými barvami textu, pozadí, tloušťkou ohraničení a dalšími vlastnostmi, které buňky mají. Tyto vlastnosti jsou přístupné i z programovacího jazyka VBA.

### 1.8.1Přístup pomocí příkazu With

Pro ulehčení práce se změnami několika vlastností vybrané oblasti buněk je možné použít příkaz _With_, který označuje následně zapsaný objekt (např. výběr _Range, Cells_, _Coulumns_, _Selection,_ …) pro editaci jeho vlastností.

![](RackMultipart20230825-1-dom2ev_html_a4f2d236245fef2f.png)

Obrázek 56 – Ukázka kódu použití _With_

Tímto způsobem se nemusí znovu opisovat jméno nebo přístup k objektu neustále dokola a může se přímo přistupovat k jeho vlastnostem. Blok kódu, kde jsou určeny vlastnosti musí být ukončen příkazem _End With_. Používání klauzule _With_ usnadňuje práci a přehlednost kódu, proto je vhodné ji využívat.

### 1.8.2Výška a šířka buňky

Nastavení výšky buňky se dělá pomocí číselné vlastnosti _RowHeight_. Pokud je potřebné změnit výšku na všech řádcích, je vhodné přistoupit k řádkům pomocí _Cells.Rows.RowHeight_. Pokud je potřebné změnit výšku pouze jednoho řádku nebo jedné buňky, je vhodné přistupovat pomocí _Range_. Automatická výška řádku podle velikosti textu v buňkách se nastaví pomocí _Cells.Rows.AutoFit_.

![](RackMultipart20230825-1-dom2ev_html_57dad5a593ee6b56.png)

Obrázek 57 – Ukázka kódu použití _RowHeight_

Obdobně jako u řádků lze všechny činnosti provést se sloupci a jejich šířkou. Vlastnost nebude _RowHeight_, ale nově _ColumnWidth_. Automatická šířka podle textu se opět nastaví pomocí _Cells.Columns.AutoFit_.

![](RackMultipart20230825-1-dom2ev_html_33317d36cede4c4d.png)

Obrázek 58 – Ukázka kódu použití _ColumnWidth_

Šířka řádku může být ovlivněna zalomením textu v buňce. Tato vlastnost se nastavuje pomocí _WrapText_ a může nabývat hodnoty _PRAVDA_ nebo _NEPRAVDA_, představující zapnuté a vypnuté zalamování textu.

![](RackMultipart20230825-1-dom2ev_html_a8b6b034e07bd3b8.png)

Obrázek 59 – Ukázka kódu se zalomením textu

### 1.8.3Ohraničení buňky

K ohraničení buněk v listu je prvně nutné buňky vybrat (např. pomocí Range) a následně se použije metoda _Borders._ Parametr v metodě určuje, kterou stranou ohraničení se budou vlastnosti ohraničení určovat. Může nabývat hodnot _xlEdgeTop_ (horní ohraničení)_, xlEdgeLeft_ (levé ohraničení)_, xlEdgeRight_ (pravé ohraničení), _xlEdgeBottom_ (dolní ohraničení)_, xlDiagonalDown_ (diagonála z levého horního rohu k pravému dolnímu)_, xlDiagonalUp_ (diagonála z levého dolního rohu k pravému hornímu)_, xlInsideVertical_ (vnitřní vertikální ohraničení)_, xlInsideHorizontal_ (vnitřní horizontální ohraničení).

![](RackMultipart20230825-1-dom2ev_html_b454eaa99d60bff8.png)

Obrázek 60 – Ukázka kódu použití ohraničení buňky

Každé ohraničení _Borders_ má pak vlastnosti _LineStyle_ (styl čáry), _Weight_ (tloušťka čáry) a _ColorIndex_ (barevný index). Tloušťka čáry může nabývat hodnot _xlHairline_ (tenká čára), _xlMedium_ (střední tloušťka)_, xlThick_ (tlustá čára) a _xlThin_ (tenčí čára). Vlastnost stylu čáry může nabývat hodnot _xlContinuous, xlDash, xlDashDot, xlDashDotDot, xlDot, xlDouble, xlLineStyleNone, xlSlantDashNot._

Pokud je potřeba z buňky všechny ohraničení odstranit, je nutné nastavit pro všechny strany ohraničení vlastnost _LineStyle_ na hodnotu _xlNone_. Hromadně lze tato nastavení aplikovat pomocí _Borders_ bez zadaného parametru.

![](RackMultipart20230825-1-dom2ev_html_581c9c40a8592428.png)

Obrázek 61 – Ukázka kódu kompletního odstranění ohraničení buňky

### 1.8.4Slučování buněk

Vybraná oblast buněk (např. pomocí _Range_) lze sloučit příkazem _Merge_ a rozdělit pomocí příkazu _UnMerge._ Slučování buněk může zapříčinit ztrátu hodnot ve slučovaných buňkách, obvykle zůstává pouze hodnota, v buňce, která se nachází nejvíce vlevo.

![](RackMultipart20230825-1-dom2ev_html_d17445ca050a7047.png)

Obrázek 62 – Ukázka kódu sloučení a rozdělení buněk

### 1.8.5Barva a text buňky

Barvy buněk lze měnit pomocí objektu _Interior_ a jeho vlastnosti _ColorIndexu_, který určuje barvu z předdefinovaných pomocí čísla, nebo pomocí vlastnosti _Color_, kde je potřeba zadat přes _RGB_ funkci barevné hodnoty pro červenou, zelenou a modrou barvu. Pro odstranění barvy musí mít _ColorIndex_ přiřazenou hodnotu _xlNone_.

![](RackMultipart20230825-1-dom2ev_html_499d856d79f00ec3.png)

Obrázek 63 – Ukázka kódu nastavení barvy pozadí v buňce

![](RackMultipart20230825-1-dom2ev_html_5b5bd0f690cad5d0.gif)

Obrázek 64 – Hodnoty barev _ColorIndex_. Zdroj: _https://learn.microsoft.com/en-us/office/vba/api/excel.colorindex_

Obdobně jako u pozadí buňky se mění barva fontu buňky. Místo objektu _Interior_ se přistupuje k vlastnosti _Font_ v buňce. Vlastnosti _Color_ a _ColorIndex_ zůstavají stejné.

![](RackMultipart20230825-1-dom2ev_html_77a6049111873ffb.png)

Obrázek 65 – Ukázka kódu změny barvy písma

Přes vlastnost _Font_ lze měnit i kurzívu a tučnost textu. Vlastnosti _Bold_ (tučnost) a _Italic_ (kurzíva) nabývají hodnot PRAVDA a NEPRAVDA, které odpovídají zapnutí nebo vypnutí vlastnosti. Další číselná vlastnost _Size_ slouží pro zvětšení textu. Rodina fontu lze změnit pomocí _Font.Name_ následovaná řetězcem s názvem nového fontu.

![](RackMultipart20230825-1-dom2ev_html_ffa8755f1d75aed0.png)

Obrázek 66 – Ukázka kódu nastavení vlastností Fontu

V buňkách listu je možné zarovnávat text vertikálně a horizontálně. Obě vlastnosti jsou přístupné z výběru buňky, _HorizontalAlignment_ pro horizontální a _VerticalAlignment_ pro vertikální. Vlastnost může nabývat hodnot _xlBottom_, _xlCenter_, _xlDistributed_, _xlJustify_ a _xlTop._ Text jde otočit pomocí číselné vlastnosti _Orientation_, např. o 90° nastavením hodnoty 90. Limity otáčení jsou omezeny na minimální hodnotu -90 a maximální hodnotu +90 a pokud jsou překročeny, akce skončí chybou programu.

![](RackMultipart20230825-1-dom2ev_html_1d5fa27d33ecf2d9.png)

Obrázek 67 – Ukázka kódu využití vlastností zarovnání textu v buňce

### 1.8.6Formátování buněk

Pro vhodnější reprezentaci dat v buňkách tabulek Excelu je potřeba data formátovat. Formátování upravuje zobrazení dat pro lepší čitelnost a prezentaci.

Vlastnost buněk _NumberFormat_ umožňuje zadat ve VBA vlastní formát buňky. Obdobně je to v Excelu možné v záložce _Domů_, ve skupině _Číslo_ a z nabídky _Formát buněk_ vybrat možnost _Vlastní_. Například řetězec „#,##0.00" by v buňce odděloval tisíce a zároveň dvě desetinná čísla. Pokud je potřeba nastavit v buňce obecný tvar, použije se hodnota _General._

![](RackMultipart20230825-1-dom2ev_html_d124bc86f5c3aa54.png)

Obrázek 68 – Ukázka použití vlastnosti buněk _NumberFormat_

Obdobnou funkci zajišťuje funkce _Format_, která místo nastavení formátu na buňku, převádí ve VBA vložené hodnoty do řetězce podle zadaného formátu v parametru.

![](RackMultipart20230825-1-dom2ev_html_86263d43f9354cac.png)

Obrázek 69 – Ukázka vytvoření naformátovaného řetězce

![](RackMultipart20230825-1-dom2ev_html_3600919f946202b.png)

Obrázek 70 – Ukázka rozdílu mezi formátem buňky a funkcí _Format_

### 1.8.7Uzamknutí buňky

K uzamčení určitých buněk v listu sešitu se po jejich vybrání (např. pomocí _Range_) může použít vlastnost _Locked_, která může nabývat hodnot _PRAVDA_ a _NEPRAVDA_ odpovídající uzamčení a odemčení buněk. Obdobně lze i skrýt vzorce v buňkách pomocí vlastnosti _FormulaHidden_, například ke skrytí výpočetního firemního tajemství.

![](RackMultipart20230825-1-dom2ev_html_e684229d46f732c6.png)

Obrázek 71 – Ukázka kódu zamknutí buněk

K tomu, aby bylo možné vlastnosti zamykání a skrývání buněk využít, je potřeba, aby byl list ve stavu _Protected_. Bez této vlastnosti funkce nebudou fungovat.

### 1.8.8Úkoly k procvičení

1. V sešitě _omalovanka.xlsm_ doplňte makra pro tlačítka k vytvoření možnosti pomocí maker vybarvit obrázek.
2. V sešitě _omalovanka.xlsm_ vytvořte makro, které upraví nadpis na font Comic Sans a otočí jej o 5 stupňů.
3. Vytvořte makro _MujFormat_, které aktivně vybrané buňce nastaví formát s oddělenými mezerami po tisíci.
4. Vytvořte makro, které nastaví Vámi zvolené barevné ohraničení u Vámi zvolené oblasti

## 1.9Lekce 8 – Práce se sešitem

Kromě manipulace buněk v rámci listů je v Excelu možné přistupovat k celému sešitu. V programovacím jazyce VBA je manipulování celý sešitem primárně řešeno objekty _Worksheets_ a _Sheets_, o kterých bude primární řeč v této lekci.

### 1.9.1Vybrání konkrétního listu sešitu

Přistoupit ke konkrétnímu objektu listu sešitu lze pomocí objektu _Sheets_. Vývojář může jako argument vložit index listu nebo celý název listu jako řetězec. Vybírání sešitu probíhá pomocí funkce _Select_, která po zavolání zobrazí vybraný list uživateli v Excelu.

![](RackMultipart20230825-1-dom2ev_html_9c7be908745dab23.png)

Obrázek 72 – Ukázka kódu objektu _Sheets_ a funkce _Select_

Objekt _Sheets_ lze procházet jako pole pomocí _For Each_ cyklu, například jde zobrazit nebo vypsat všechny názvy listů v sešitě pomocí vlastnosti _Name_. Objekt _Sheets_ zahrnuje i listy s grafy, na rozdíl od objektu _Worksheets_.

![](RackMultipart20230825-1-dom2ev_html_d4f7fbd9edbba51e.png)

Obrázek 73 – Ukázka procházení objektu _Sheets_

\<poznámka ohledně aktivování kódu pomocí _Activate_\>

### 1.9.2Zamykání a odemykání listů

V objektu _Sheets_ je dostupná metoda _Protect_, která uzamkne vybraný list sešitu. Metoda má několik nepovinných parametrů. Nejdůležitějším parametrem je _password_, který uzamkne sešit společně se zadaným heslem. Ostatní parametry nastavují možnosti práce s listem, jak jej po zamknutí lze upravovat.

![](RackMultipart20230825-1-dom2ev_html_c48ec039b8e2502.png)

Obrázek 74 – Ukázka kódu uzamknutí listu

Odemykání listu probíhá podobnou procedurou _Unprotect_, která má volitelný parametr _Password_ se stejnou funkcí jako u procedury _Protect_.

![](RackMultipart20230825-1-dom2ev_html_2491bafe02bc6b91.png)

Obrázek 75 – Ukázka kódu odemknutí sešitu

### 1.9.3Zobrazení listů

Listy lze zobrazit a skrýt pomocí vlastnosti objektu _Sheets_ pojmenované _Visible_. Pokud má vlastnost hodnotu _PRAVDA_, list je zobrazený a viditelný v sešitě. Naopak s hodnotou _NEPRAVDA_ je list skryt.

![](RackMultipart20230825-1-dom2ev_html_d93e7c26253b3dbb.png)

Obrázek 76 – Ukázka kódu skrytí a zobrazení sešitu v listě

Alternativně lze použít předdefinované hodnoty _xlSheetHidden, xlSheetVeryHidden_ a _xlSheetVisible_. Hodnota _xlSheetVeryHidden_ nastaví list skrytý bez možnosti obnovit jeho viditelnost uživatelem v Excelu. Vždy je nutné takový list zviditelnit pomocí makra.

### 1.9.4Přidání a odebrání listů

Přidání listů do sešitu probíhá pomocí metody _Add_, která může obsahovat dva parametry o nové pozici listu. Parametr _Before_ určuje pozici před zmíněným sešitem, kde se nový sešit vloží. Parametr _After_ zase pozici po určeném sešitě, kde se nový sešit objeví.

![](RackMultipart20230825-1-dom2ev_html_1c64e93ec78cd2e9.png)

Obrázek 77 – Ukázka kódu přidání listu do sešitu

Odstranění listu probíhá jeho výběrem a zavoláním metody _Delete_. Smazaný list a jeho data nelze zpětně obnovit. Při odstraňování se Excel zeptá, zda chcete sešit opravdu odstranit.

![](RackMultipart20230825-1-dom2ev_html_901d82c1087f5138.png)

Obrázek 78 – Ukázka kódu odebrání listu ze sešitu

### 1.9.5Kopírování a přesunování listů

V rámci objektu _Worksheets_ je dostupná metoda _Copy,_ která bez uvedeného parametru zkopíruje vybraný list aktivního sešitu a vloží jej do sešitu nového. Zkopírovaný list v novém sešitě bude mít stejný název jako měl předtím.

![](RackMultipart20230825-1-dom2ev_html_fa269a2aac464a90.png)

Obrázek 79 – Ukázka kódu kopírování listu v sešitě

Vývojář ovšem ve většině případů nepotřebuje nakopírovat listy do nového sešitu. Metoda _Copy_ má z tohoto důvodu dva parametry _After_ a _Before_. Parametry označují nové místo pro kopírovaný list sešitu.

Pokud je potřeba novou kopii sešitu přejmenovat, stačí upravit vlastnost _Name_ objektu _ActiveSheet_ novým řetězcem s požadovaným názvem. Po kopírování by vždy měla nastat situace, že se zkopírovaný list zobrazí a stane se aktivním (objektem _ActiveSheet_).

![](RackMultipart20230825-1-dom2ev_html_ac1b3336072d955d.png)

Obrázek 80 – Ukázka kódu s kopírováním více listů zároveň

Pro kopii více sešitů zároveň, existuje výběr _SelectedSheets_ v objektu _ActiveWindow_, který odkazuje na všechny právě vybrané listy. Označení více listů probíhá pomocí _Select_ s přidaným parametrem _False_, díky kterému se neodznačí předchozí vybrané listy.

### 1.9.6Události v listu

V sešitě mohou existovat předdefinovaná makra, která se automaticky spustí při nějaké akci spuštěné uživatelem (události). Akcí může být relativně cokoliv, od jednoduché změny hodnoty v listu až po dvoj kliknutí na buňku v listě.

![](RackMultipart20230825-1-dom2ev_html_e09c07531cb957a4.png)

Obrázek 81 – Ukázka kódu události _SelectionChange_

Všechen kód metod událostí musí být v objektu listu, a nikoliv Modulu jako u předchozích případů. Ve vybraném objektu se vybere objekt _Worksheet_ a z druhé nabídky procedur událost, pro kterou je potřeba vytvořit kód, který se vždy při vzniknutí takové události spustí.

![](RackMultipart20230825-1-dom2ev_html_6817bab43c810b0d.png)

Obrázek 82 – Ukázka přidání makra události ke konkrétnímu listu

Jednotlivé typy událostí je vhodné řádně prostudovat v rámci dokumentace VBA, např. na adrese [https://learn.microsoft.com/en-us/office/vba/excel/concepts/events-worksheetfunctions-shapes/worksheet-object-events](https://learn.microsoft.com/en-us/office/vba/excel/concepts/events-worksheetfunctions-shapes/worksheet-object-events).

![](RackMultipart20230825-1-dom2ev_html_e3241bdd99f8244f.png)

Obrázek 83 – Ukázka kódu jiné události _BeforeDoubleClick_

### 1.9.7Úkoly k procvičení

1. Vytvořte makro _Zamek_, které zamkne a odemkne list sešitu dle vašeho hesla
2. Vytvořte nové makro _NovaTabulka_, které založí nový list s hlavičkou tabulky: Typ paliva, množství (v l), cena celkem.
3. Pomocí dalšího makra _SkrytNoveMakro_ skryjte nově vytvořený list.
4. Vytvořte kód, který při změně vybraného listu ohlásí název vybraného listu.

## 1.10Lekce 9 – Práce s grafy

Neodmyslitelnou součástí programu Excel jsou grafy pro data, které se vyskytují na listech v tabulkách. Pomocí programovacího jazyka VBA lze tuto tvorbu grafů zautomatizovat a měnit jejich vlastnosti.

### 1.10.1Vytvoření grafu

Grafy jsou přidávány do sešitu pomocí přidání nového grafu do tvarů listu, pomocí metody _AddChart_. Graf je následně přejmenován, aby se na něj bez potřeb objektového programování dalo odkazovat. Pomocí _Select_ dochází k výběru požadovaného grafu do objektu _ActiveChart_, kde lze přistupovat k jeho vlastnostem a měnit je. Je vybrán typ grafu pomocí vlastnosti _ChartType_ a nakonec jsou do něj přidány data pomocí metody _SetSourceData_ s odkazem na umístění v listě _DataGrafu_. Vznikne velmi jednoduchý graf, jak lze vidět na obrázku níže.

![](RackMultipart20230825-1-dom2ev_html_3fd3657912ef82e2.png)

Obrázek 84 – Ukázka kódu vytvoření jednoduchého grafu s daty

![](RackMultipart20230825-1-dom2ev_html_ed8452ee46f62be2.png)

Obrázek 85 – Výsledný graf z ukázky kódu

### 1.10.2Zobrazení grafu

Graf může být viditelný a neviditelný, vše ovlivňuje jeho vlastnost _Visible_ stejně jak je to u ostatní podobných prvků.

![](RackMultipart20230825-1-dom2ev_html_755d58096b636f58.png)

Obrázek 86 – Zobrazení a skrytí grafu

### 1.10.3Prvky grafu

Mezi prvky grafu patří například nadpis, popisy os, legendy, datové tabulky a další. Každý prvek grafu má většinou vlastnost _HasTitle_ nebo _HasDatatable,_ která odkazuje na informaci, zda má graf tento prvek zapnutý a viditelný. Ostatní prvky se nastavují podle jejich vlastností: nadpis například _ChartTitle_, atd.

![](RackMultipart20230825-1-dom2ev_html_c579ba685d1bd825.png)

Obrázek 87 – Ukázka kódu přidání nadpisu grafu s červenou barvou

![](RackMultipart20230825-1-dom2ev_html_1767379804cc74d7.png)

Obrázek 88 – Ukázka kódu odebrání nadpisu grafu

![](RackMultipart20230825-1-dom2ev_html_c975720cb6523864.png)

Obrázek 89 – Ukázka kódu přidání popisu os

![](RackMultipart20230825-1-dom2ev_html_e8793a3a22a5f40b.png)

Obrázek 90 – Ukázka kódu odstranění popisu os

![](RackMultipart20230825-1-dom2ev_html_d41da0d796086445.png)

Obrázek 91 – Zobrazení legendy grafu

![](RackMultipart20230825-1-dom2ev_html_1df3a6d4dd6aac7.png)

Obrázek 92 – Skrytí legendy

Všechny grafové typy jsou dostupné ze stránek [https://learn.microsoft.com/en-us/office/vba/api/excel.xlcharttype](https://learn.microsoft.com/en-us/office/vba/api/excel.xlcharttype). Vývojář si může najít svůj přesně specifický a ten používat.

![](RackMultipart20230825-1-dom2ev_html_2e31f4c06e851017.png)

Obrázek 93 – Zobrazení tabulky dat v grafu

![](RackMultipart20230825-1-dom2ev_html_eda4227cebe674c.png)

Obrázek 94 – Skrytí tabulky dat v grafu

### 1.10.4List grafu

List grafu představuje list sešitu, který je plně zaměřen na jeden graf. Informace tak vynikají na rozdíl od použitých grafů v normálním listě. Grafový list sešitu se přidává metodou _Sheets.Add_ s typem _xlChart_.

![](RackMultipart20230825-1-dom2ev_html_9df0ec574e4ec415.png)

Obrázek 95 – Přidání listu grafu

### 1.10.5Úkoly k procvičení

1. Vytvořte nové makro _SloupcovyGraf_, které vytvoří sloupcový graf z dostupných dat v sešitě brouci.xlsx.
2. Přidejte k vytvořenému grafu nadpis s textem „Výskyt brouků" pomocí kódu ve VBA.
3. Vytvořte nové makro _GrafSinusCosinus_ a na základě hodnot v sešitě matematika.xlsx vytvořte bodový graf zobrazující funkce _Sinus_ a _Cosinus_.
4. Přidejte k vytvořenému grafu pomocí VBA legendu a tabulku zobrazených dat.
5. Vytvořený graf překopírujte na novou stránku sešitu jako samostatný objekt na listě.

## 1.11Lekce 10 – Třídy a objekty

Pojem objekt můžeme chápat jako ucelenou kombinaci kódu a dat, která může být určitou částí aplikace, jako například ovládací prvek nebo okno formuláře. V principu může být i celá aplikace praktickým objektem. Při programování ve VBA se pracuje s objekty neustále, i když to na první pohled nemusí být zřejmé.

Každý objekt je ve VBA definován třídou, která popisuje proměnné, vlastnosti, procedury a události v objektu. Před použitím těchto prvků je potřeba vytvořit danou instanci třídy, tedy objekt. Přes vy-tvořený objekt pak lze přistupovat k jednotlivým metodám a vlastnostem.

![](RackMultipart20230825-1-dom2ev_html_6e1424ef477e531a.png)

Obrázek 96 – Ukázka schématu objektu

Pro příklad, řekněme, že máme naprogramovanou třídu _Vozidlo_, která popisuje metody a vlastnosti všech možných vozidel. Konkrétními objekty je pak například _motorka_ nebo _auto_. Řekněme, že tato třída má vlastnost počet kol u vozidla a metodu zastavit.

![](RackMultipart20230825-1-dom2ev_html_f3b08955057d915.png)

Obrázek 97 – Schéma aplikované na příklad

Z jiného úhlu pohledu by se dalo říct, že třída určuje, jaké vlastnosti a metody mají mít její objekty, jistým smyslem je utváří a formuje, zatímco objekty jsou již hodnoty, které se řídí určenou formou.

### 1.11.1Práce s objekty a příkaz Set

Příkaz Set je ve VBA používán k přiřazení reference na objekt do proměnné. Objekty jsou ve VBA pracovány pomocí referencí, což znamená, že proměnná neuchovává samotný objekt, ale pouze odkaz na něj. Tímto způsobem lze manipulovat s objekty a provádět s nimi různé akce.

![](RackMultipart20230825-1-dom2ev_html_ea5eb7965d6b6e6a.png)

Obrázek 98 – Uchovávání referencí na třídy

### 1.11.2Vytvoření objektu

Metoda konstruktoru tříd je speciální funkce v objektově orientovaném programování, která je volána při vytváření nové instance třídy. Tato metoda slouží k inicializaci členů objektu a provádění počátečních operací, které jsou potřebné při vytváření instance.

![](RackMultipart20230825-1-dom2ev_html_fec9a64e46c9d884.png)

Obrázek 99 – Konstruktor třídy

V jazyce VBA, konkrétně při definování třídy, můžete vytvořit konstruktor pomocí procedury se stejným názvem jako třída. Tím umožníte, aby se při vytváření instance této třídy automaticky zavolala tato konstrukční procedura, což umožňuje inicializovat výchozí hodnoty a nastavení objektu.

![](RackMultipart20230825-1-dom2ev_html_22e21cad3479c2df.png)

Obrázek 100 – Vytváření objektů s pomocí konstruktoru

### 1.11.3Kolekce

V jednoduchý polích je poměrně složité měnit rozměry pole, přidávat a odebírat prvky do pole a pracovat s těmito prvky, např. řadit prvky nebo hledat určité prvky.

Kolekce může obsahovat objekty různých tříd a lze k nim přistupovat pomocí klíče nebo indexu. Klíč je unikátní identifikátor, kterým lze objekty v kolekci identifikovat a vyhledávat. Index je číslo určující pozici objektu v kolekci.

![](RackMultipart20230825-1-dom2ev_html_5f99fe40804e6899.png)

Obrázek 101 – Založení nové kolekce s objekty

![](RackMultipart20230825-1-dom2ev_html_38570092eb1d03f5.png)

Obrázek 102 – Přidání objektu do kolekce

![](RackMultipart20230825-1-dom2ev_html_46da83071facdab4.png)

Obrázek 103 – Procházení objektů v kolekci

### 1.11.4Vlastnosti a metody

Vlastnosti jsou charakteristiky objektu, které popisují jeho stav, vlastnosti nebo atributy. Jsou často reprezentovány pomocí proměnných, které jsou spjaty s daným objektem. Například u objektu reprezentujícího buňku v tabulce Excelu by mohla být vlastnost _Value_ reprezentující hodnotu buňky.

![](RackMultipart20230825-1-dom2ev_html_530428161c64a39a.png)

Obrázek 104 – Vlastnosti třídy

Metody jsou funkce, které jsou spojovány s objektem a umožňují provádět akce nebo operace s tímto objektem. Metody definují chování objektu a mohou být volány až po konkrétním objektu.

![](RackMultipart20230825-1-dom2ev_html_b7f1a5ca549e2e43.png)

Obrázek 105 – Metoda třídy

![](RackMultipart20230825-1-dom2ev_html_96c6a5bc64b92701.png)

Obrázek 106 – Ukázka užití metody ve třídě

### 1.11.5Úkoly k procvičení

1. Vytvořte nové makro, které vytvoří nový objekt Worksheet.
2. Vytvořte vlastní třídu Ovoce
3. Přidejte do této třídy vlastnosti jako Název, Hmotnost a datum expirace
4. Přidejte do této třídy metodu JePoExpiraci, která bude vracet ano, pokud je dnešní den po datumu expirace
5. Vytvořte ovocný košík v podobě kolekce objektů ovoce a použijte jej

###


## 1.12Lekce 11 – Práce s uživatelskými dialogy a formuláři

### 1.12.1Prvek MsgBox

MsgBox (Message Box) je vestavěná funkce ve Visual Basic for Applications (VBA) a také v dalších jazycích jako je Visual Basic, která umožňuje zobrazit dialogové okno s zprávou pro uživatele. Toto dialogové okno může obsahovat textovou zprávu, tlačítka a ikonu, a slouží k zobrazení důležitých informací uživateli nebo k získání jeho reakce

### 1.12.2Prvek InputBox

InputBox je vestavěná funkce ve Visual Basic for Applications (VBA) a také v jazyce Visual Basic, která umožňuje zobrazit dialogové okno, kde uživatel může zadat textový vstup. Tato funkce je užitečná pro získání vstupních údajů od uživatele, jako jsou jména, čísla, hesla apod.

### 1.12.3Prvky formuláře

![](RackMultipart20230825-1-dom2ev_html_4f6af7211c9af968.png)

Obrázek 107 – Jednoduchý formulář s prvky textových boxů a tlačítka

![](RackMultipart20230825-1-dom2ev_html_fe633f41b492f937.png)

Obrázek 108 – _Toolbox_ pro přidávání prvků do Formu

### 1.12.4Propojení formuláře s kódem

Všechny přidané prvky jde primárně propojit do kódu pomocí dvoj kliknutí na prvek. Tento klik vás zavede přímo na funkci, kterou formulář použije, pokud například nastane událost s kliknutím na tlačítko. Výběr události je velmi podobný tomu, jako u listů.

### 1.12.5Úkoly k procvičení

1. Vytvořte nové makro s využitím MsgBox a použitím rozhodnutí uživatele ano/ne.
2. Vytvořte nové makro s využitím InputBox, které bude představovat jednoduchou kalkulačku, kde uživatel zadá matematický výraz a input box jej vyhodnotí.
3. Vytvořte nový formulář, který přidá nový záznam zákazníků (Jméno, Příjmení, Datum narození)

## 1.13Lekce 12 – Práce s textovými soubory

### 1.13.1Export souboru

![](RackMultipart20230825-1-dom2ev_html_f8852ae3d4cd4577.png)

### 1.13.2Smazat soubor

![](RackMultipart20230825-1-dom2ev_html_610d24099146ac04.png)