První pracovní verze Jak na VBA v Excelu – příručka od A do Z Pavel Lasák, MVP Vytvořeno 08 / 2021 1 / 12 https://office.lasakovi.com/ 1 Základní dialogová okna MsgBox InputBox  V této kapitole se podíváte na:  Dialogové okno MsgBox  Vstupní textové dialogové okno InputBox  Debug.Print pro kontrolu  V programování se neobejdete bez iterace s uživatelem, v základu je nejjednodušší využít dialogová okna, která kromě základního tlačítka OK, mohou mít i tlačítka Ano, Ne, kdy uživatel má možnost volby (ano, ne, klik na křížek naštěstí možný není). Případně pro zadaní vstupních údajů, můžete využít Vstupní dialogové okno InputBox, kde uživatel zadá požadovaný údaj, nevýhodou je, že vstup uživatele se z mého pohledu komplikovaněji kontroluje oproti formulářům (nebo použití Application.InputBox). V této kapitole se podíváte: • MsgBox dialogové okno a jeho možnosti o Tlačítka o Obrázky • InputBox a možnosti dialogového okna pro vstup dat o Application • Jak využít Dabug.Print místo MsgBox a klikat na OK Materiály: Materiály ke kapitole stahujte na: v přípravě 1.1 Dialogové okno MsgBox Jak na dialogové okno. Možná z jiných programovacích jazyku znáte dialog „Ahoj světe.“ Ani v této kapitole nebude jinak a pozdrav „Ahoj světe.“ Si naprogramujete. 1.1.1 Syntaxe Ač na první pohled vypadá MsgBox velice jednoduše jeho možnosti jsou obrovské. MsgBox (prompt [, buttons] [, title] [, helpfile, context]) Argumenty: • prompt - Povinné. Výraz zobrazený jako zpráva v dialogu. Délka max. 1024 znaků • buttons - Nepovinné. Číslo - je součtem čísel udávající zobrazená tlačítka, ikonu a předvoleného tlačítka. Nebo lze použít konstantu udávající typ tlačítka. Výchozí hodnota 0. • title Nepovinné. Záhlaví dialogu. Pokud není uveden je v záhlaví název aplikace. • helpfile - Nepovinné. Název souboru s nápovědou. Povinné pokud je uveden context • context - Nepovinné. Číslo kontextové nápovědy přiřazené odpovídajícímu heslu. Pouze v případě, že je uveden helpfile. První pracovní verze Jak na VBA v Excelu – příručka od A do Z Pavel Lasák, MVP Vytvořeno 08 / 2021 2 / 12 https://office.lasakovi.com/ 1.1.1.1 Konstanty pro tlačítka Konstanta Popis Hodnota vbOKOnly Zobrazí pouze tlačítko OK. Platí i v případě pokud neuvedeme žádnou hodnotu. (viz příklad níže) 0 VbOKCancel Zobrazí tlačítka OK a Storno. 1 VbAbortRetryIgnore Zobrazí tlačítka Zpět, Znovu a Ignorovat. 2 VbYesNoCancel Zobrazí tlačítka Ano, Ne a Storno. 3 VbYesNo Zobrazí tlačítka Ano a Ne. 4 VbRetryCancel Zobrazí tlačítka Znovu a Storno. 5 1.1.1.2 Konstanty pro ikony Konstanta Popis Hodnota VbCritical Zobrazí ikonu Kritická zpráva. 16 VbQuestion Zobrazí ikonu Varovný dotaz. 32 VbExclamation Zobrazí ikonu Varovná zpráva. 48 VbInformation Zobrazí ikonu Informační zpráva 64 1.1.1.3 Konstanty pro výchozí tlačítko Konstanta Popis Hodnota VbDefaultButton1 Výchozí je první tlačítko 0 VbDefaultButton2 Výchozí je druhé tlačítko. 256 VbDefaultButton3 Výchozí je třetí tlačítko 512 VbDefaultButton4 Výchozí je čtvrté tlačítko 768 1.1.1.4 Režim Konstanta Popis Hodnota VbApplicationModal Aplikační režim; uživatel musí před pokračováním další práce ve zvolené aplikaci odpovědět na zprávu 0 VbSystemModal Systémový režim; všechny aplikace jsou pozastaveny, dokud uživatel neodpoví na zobrazenou zprávu 4096 1.1.1.5 Návratové hodnoty Konstanta Co bylo stisknuto Hodnota vbOK OK 1 vbCancel Storno 2 vbAbort Zpět 3 vbRetry Znovu 4 vbIgnore Ignorovat 5 vbYes Ano 6 vbNo Ne 7 title Buttons - icon Buttons - buton Prompt První pracovní verze Jak na VBA v Excelu – příručka od A do Z Pavel Lasák, MVP Vytvořeno 08 / 2021 3 / 12 https://office.lasakovi.com/ 1.1.2 Praktické použití Jak na praktické použití dialogového okna 1.1.2.1 Jako první začnete s pozdravem ahoj světe Neboli potřebuji zobrazit pozdrav ahoj světe. Stačí jednoduše využít MsgBox, který například vložíte do tlačítka, které máte na listu. MsgBox ("Ahoj světe.") Druhou možností je použít MsgBox bez závorek. MsgBox "Ahoj světe." Třetí možností přímo vypsat argument prompt a přiřadit := MsgBox Prompt:="Create Excel VBA MsgBox" 1.1.2.2 Dialogové okno s titulkem Někdy se může hodit mít dialogové okno s titulkem i = MsgBox("Ahoj světe.", , "POZDRAV") Bez proměnné i nezafunguje i = MsgBox("Ahoj světe.", , "POZDRAV") Druhou možností využít názvy argumentu, kdy nemusí být využita proměnná jako v předchozím případě. MsgBox Prompt:="Ahoj světe", Title:="POZDRAV" 1.1.2.3 MsgBox s jinými tlačítky než OK Při tvorbě dialogových oken s tlačítky nesmíte zapomenout, že dialogové okno vraci příslušnou hodnotu, za základě zvoleného tlačítka, proto se musí obsah tlačítka vložit do proměnné. Zároveň si můžete vypsat co klik na zvolené tlačítko (Ano/Ne) v angličtině (Yes/No) vrátí. i = MsgBox("Chcete větši plat?", vbYesNo, "Plat") MsgBox (i) Pokud jste dobře prošli syntaxi tak víte, že při kliku na ano se vrací konstanta vbYes (kontrolou pomocí MsgBoxu uvidíte pouze číslo 6) a při kliku na Ne se vrací konstanta vbNo (při kontrole dialogovým oknem uvidíte pouze číslo 7) Na zvolenou odpověď můžete reagovat využitím syntaxe If Then, nebo i = MsgBox("Chcete větši plat?", vbYesNo, "Plat") If i = vbYes Then MsgBox ("Chce větší plat") Else MsgBox ("Nechce větší plat.") End If Nebo Select Case i = MsgBox("Chcete větši plat?", vbYesNo, "Plat") Select Case i Case vbYes ' Is = vbYes MsgBox ("Klik na Ano.") Case vbNo ' Is = vbNo MsgBox ("Klik na Ne.") End Select První pracovní verze Jak na VBA v Excelu – příručka od A do Z Pavel Lasák, MVP Vytvořeno 08 / 2021 4 / 12 https://office.lasakovi.com/ Tlačítkem můžete spustit kód nebo ukončit běh s využitím Exit sub nResult = MsgBox( "Spustit makro", vbYesNo) If nResult = vbNo Then Exit Sub Else Call Makro End If 1.1.2.4 Dialogové okno s více řádky Pokud v dialogovém okně potřebujete mít více samostatných řádku MsgBox "První řádek" & vbCrLf & "Druhý řádek" & vbCrLf & "Třetí řádek" 1.1.2.5 Různá tlačítka v dialogovém boxu V dialogovém okně můžete mít jiná tlačítka. i = MsgBox("Co chceš udělat ?") ' Pouze OK i = MsgBox("Co chceš udělat ?", vbOKOnly) i = MsgBox("Co chceš udělat ?", vbOKCancel) i = MsgBox("Co chceš udělat ?", vbAbortRetryIgnore) i = MsgBox("Co chceš udělat ?", vbYesNoCancel) i = MsgBox("Co chceš udělat ?", vbYesNo) i = MsgBox("Co chceš udělat ?", vbRetryCancel) 1.1.2.6 Předvybrané jiné tlačítko než první První pracovní verze Jak na VBA v Excelu – příručka od A do Z Pavel Lasák, MVP Vytvořeno 08 / 2021 5 / 12 https://office.lasakovi.com/ i = MsgBox("Co chceš udělat ?", vbAbortRetryIgnore + vbDefaultButton2, "Menu text") i = MsgBox("Co chceš udělat ?", vbAbortRetryIgnore + vbDefaultButton3, "Menu text") 1.1.2.7 Ikony v dialogovém boxu Potřebujete-li dialogový box doplnit o ikony. i = MsgBox("Ahoj", vbOKOnly + vbCritical) i = MsgBox("Ahoj", vbOKOnly + vbQuestion) i = MsgBox("Ahoj", vbOKOnly + vbExclamation) i = MsgBox("Ahoj", vbOKOnly + vbInformation) 1.1.2.8 Využití dialogového okna MsgBox na kontrolu operátoru Pro testování operátoru a zadaných hodnot, kromě dialogového okna můžete využít i Debug.Print v následující kapitole ' Pozor na texty čísla a operátory Hodnota1 = 10 Hodnota2 = 10 MsgBox (Hodnota1 + Hodnota2) MsgBox (Hodnota1 & Hodnota2) Hodnota3 = "10" Hodnota4 = "10" MsgBox (Hodnota3 + Hodnota4) MsgBox (Hodnota3 & Hodnota4) 1.1.2.9 Tvorba dynamických textů V dialogovém okně můžete spojovat statické i dynamické texty z proměnných, kdy potřebujete spojit statický text „Výsledek je:“ s hodnotou v proměnné Hodnota1. Hodnota1 = 10 MsgBox ("Výsledek je: " & Hodnota1) 1.1.2.10 Vytvořit dialogové okno pomocí proměnných V jednotlivých proměných máte uloženy texty a titulky pro dialogové okno, jaké tlačítka a ikony potřebujete. Dim Zprava, Styl, Titulek, Help, Ctxt, i Zprava = "Máte se excelentně ?" Styl = vbYesNo + vbCritical + vbDefaultButton2 Titulek = " Titulek dialogového okna" Help = "DEMO.HLP" ' Je-li k dispozici První pracovní verze Jak na VBA v Excelu – příručka od A do Z Pavel Lasák, MVP Vytvořeno 08 / 2021 6 / 12 https://office.lasakovi.com/ Ctxt = 1000 ' Část helpu ' Výsledná zpráva i = MsgBox(Zprava, Styl, Titulek, Help, Ctxt) 1.1.2.11 Dialogové okno sčítání požadavků V dialogovém okně můžete požadavek na tlačítka, ikony a vybrané tlačítko sčítat. i = MsgBox("Tak co jdeme na pivo ?", vbYesNo + 256 + vbQuestion, "PIVO") 1.1.2.12 Více řádku v dialogovém okně V dialogovém okně můžete mít i více řádků. MsgBox ("První řádek" & vbCrLf & "Druhý řádek" & vbCrLf & "Třetí řádek") Doplnit dialogové okno o ikonky a tlačítka jistě již zvládnete sami. 1.2 Input Box V této kapitole se podíváte jak na zadávací okno, tkový dialogový box s polem (TextBox) pro zadání jedné hodnoty (být, číslo, text, datum, atd.). 1.2.1 Syntaxe InputBox InputBox můžete volat dvojím způsobem: • InputBox • Application.InputBox 1.2.1.1 InputBox InputBox(Zpráva, Titulek_dialogu, Výchozí_hodnota, Posice_X , Posice_Y, Help, Context, Type) Argumenty: • Zpráva - povinné - text zprávy zobrazení v dialogu • Titulek_dialogu - nepovinné - text v titulku dialogu • Výchozí_hodnota - nepovinné - pokud je požadavek na výchozí hodnotu • Posice_X - nepovinné - pozice okna x • Posice_Y - nepovinné - pozice okna y • Help - nepovinné - odkaz na soubor s nápovědou • Context - nepovinné - Číslo tématu nápovědy ze souboru nápovědy - musí být zadán Help. 1.2.1.2 Application.InputBox Application.InputBox (Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type) Argumenty: První pracovní verze Jak na VBA v Excelu – příručka od A do Z Pavel Lasák, MVP Vytvořeno 08 / 2021 7 / 12 https://office.lasakovi.com/ • Prompt - povinné - text zprávy zobrazení v dialogu • Title - nepovinné - text v titulku dialogu • Default - nepovinné - pokud je požadavek na výchozí hodnotu • Left - nepovinné - pozice okna x • Top - nepovinné - pozice okna y • HelpFile - nepovinné - odkaz na soubor s nápovědou • HelpContextID - nepovinné - Číslo tématu nápovědy ze souboru nápovědy - musí být zadán Help. • Type – nepoviné – specifikuje co se má vrátit (může být i součet 1+2) o 0 Vzorec o 1 Číslo o 2 Text (String) o 4 Logická hodnota (True or False) o 8 Odkaz na buňku (Range object) o 16 Chybová hodnota o 32 Není definováno – asi rezerva pro budoucí použití o 64 Pole 1.2.2 Praktické použití InputBoxu V této kapitole se podíváte na praktické ukázky při práci s InputBox. 1.2.2.1 Základní použití InputBox Potřebuji po uživateli vložit hodnotu do InputBox a tu zobrazit: Promena = InputBox("Zadej číslo") MsgBox (Promena) Případně doplnit o titulek zadávací dialogové okno Promena = InputBox("Zadej číslo:", "Titulek_dialogového_okna") MsgBox (Promena) Nebo doplnit o pozici od horního a levého okraje a o přednastavené číslo První pracovní verze Jak na VBA v Excelu – příručka od A do Z Pavel Lasák, MVP Vytvořeno 08 / 2021 8 / 12 https://office.lasakovi.com/ Promena = InputBox("Zadej číslo:", "Titulek_dialogového_okna", 10, 500, 400) MsgBox (Promena) 1.2.2.2 Vytvoření InputBox využitím argumentů InputBox můžete vytvořit i použitím názvu argumentu a přiřazením hodnoty. i = InputBox(Prompt:="Vlož text", Title:="Titulek", Default:="Automaticky text.") 1.2.2.3 InputBox vs Application.InputBox InputBox můžete volat i z Application, výsledkem mírně odlišný design. ' Rozdíl mezi InputBoxem a InputBoxem z Application i = Application.InputBox(Prompt:="Vlož text") i = InputBox(Prompt:="Vlož text") 1.2.2.4 Výpočet plochy čtverce Potřebujete vypočítat plochu čtverce po zadání strany a, kterou zadáte do vstupního dialogového okna. Kdy po zadání se plocha vypíše do dialogového okna. Samozřejmě nekontrolujete zda bylo zadáno skutečně číslo, předpokládáte, že uživatel ho zadá. StranaA = InputBox("Zadej stranu a:", "Výpočet plochy čtverce") Plocha = StranaA * StranaA MsgBox (Plocha) Potažmo budete chtít vylepšit o text v dialogovém okně: StranaA = InputBox("Zadej stranu a (m):", "Výpočet plochy čtverce") Plocha = StranaA * StranaA MsgBox ("Plocha čtverce o straně " & StranaA & " m je " & Plocha & "m2") 1.2.2.5 Výpočet obdélníků Potřebujete vypočíst plochu obdélníku, po zadání strany a a strany b. ZpravaA = "Zadejte stranu A" ZpravaB = "Zadejte stranu B" Titulek_dialogu = "Vstupní dialog pro vypočet obdelníku" Vychozi_hodnota = 0 Posice_X = 100 Posice_Y = 200 StranaA = InputBox(ZpravaA, Titulek_dialogu, Vychozi_hodnota, Posice_X, Posice_Y) StranaB = InputBox(ZpravaB, Titulek_dialogu, Vychozi_hodnota, Posice_X, Posice_Y) První pracovní verze Jak na VBA v Excelu – příručka od A do Z Pavel Lasák, MVP Vytvořeno 08 / 2021 9 / 12 https://office.lasakovi.com/ Plocha = StranaA * StranaB MsgBox (Plocha) Další vylepšení výstupního dialogového okna již zvládnete sami. 1.2.2.6 Ošetření ať je opravdu číslo Využitím smyčky Do Until, můžete kontrolovat, zda uživatel opravdu zadal číslo. Zde ale může dojit k zacyklení pokud bude stále psát „pět“. Kód ho nepustí dále dokud skutečně nezadá číslo (Cancel, ani křížek na dialogovém okně nepomůže) ZadanoSpravne = False Do 'dokud nebude cislo ZadaneCislo = InputBox("zadej číslo:", "Kontrola") If IsNumeric(ZadaneCislo) Then ' Pripadne další podmínky (sude, vetsí než atd) ZadanoSpravne = True Else ZadanoSpravne = False MsgBox ("Opravdu zadejte číslo!") End If Loop Until ZadanoSpravne = True MsgBox ("super číslo: " & ZadaneCislo) Můžete tedy ještě počítat počet průchodu. A povolit třeba 5. Zde využijete Goto, k ošetření „chyby“. Pruchod = 0 ZadanoSpravne = False Do 'dokud nebude cislo ZadaneCislo = InputBox("zadej číslo:", "Kontrola") Pruchod = Pruchod + 1 If IsNumeric(ZadaneCislo) Then ' Pripadne další podmínky (sude, vetsí než atd) ZadanoSpravne = True Else If Pruchod = 5 Then GoTo Vyskoceni End If ZadanoSpravne = False MsgBox ("Opravdu zadejte číslo!") End If Loop Until ZadanoSpravne = True MsgBox ("super číslo: " & ZadaneCislo) Exit Sub Vyskoceni: MsgBox ("Protože jsi nezadal číslo bylo ukončeno!") 1.2.2.7 Ošetření využitím Application.Input box Ošetřit zadání můžete i využitím Application: i = Application.InputBox(prompt:="Zadej číslo:", Type:=1) Případně bez názvu argumentů: i = Application.InputBox("Zadej číslo:", ,,,,,,1) Při nesprávném zadání rovnou obdržíte okno o chybě, obě okna klidně můžete křížkem zavřít. První pracovní verze Jak na VBA v Excelu – příručka od A do Z Pavel Lasák, MVP Vytvořeno 08 / 2021 10 / 12 https://office.lasakovi.com/ 1.2.2.8 Klik na storno, křížek Oproti MsgBox máte u InputBox možnost kliknout na křížek nebo Zrušit (Cancel). Otázkou je co se má stát když na něj někdo klikne. V ukázce se jen zobrazí text: "Storno/Cancel nebo křížek". StranaA = InputBox("Strana a", "Výpočet plochy čtverce") If StrPtr(StranaA) = 0 Then MsgBox ("Storno/Cancel nebo křížek") End If Pro Application.InputBox i = Application.InputBox("Zadej číslo:", , , , , , , 1) If i = False Then MsgBox ("krizek") End If 1.3 Okno Immediate a Debug.Print Aneb využití možnosti pro kontrolu, více v sekci věnující se odlaďování kódu 1.3.1 Zobrazení okna Immediate Pro použití musíte mít ve VBA zobrazené okno Immediate. Jeho zobrazení provedete v VBA v menu View klik na Immediate Window, nebo využitím klávesové zkratky (Ctrl + G). 1.3.2 Prakticke použití Debug.Print a okna Immediate Praktické použití. 1.3.2.1 Výpočty přímo v okně Okno Immediate můžete využívat přímo k výpočtů, stačí zadat otazník a co potřebujete, například sečíst 1+1 ? 1+1 Obdržíte číslo 2. Podobně můžete spočítat počet listů: První pracovní verze Jak na VBA v Excelu – příručka od A do Z Pavel Lasák, MVP Vytvořeno 08 / 2021 11 / 12 https://office.lasakovi.com/ ? Sheets.Count 1.3.2.2 Odkazování se do Debug.Print Druhou možností je výstup do okna Immediate přímo ve VBA kódu. V ukázce je potřeba vypsat čísla 1 až 3 For i = 1 To 3 Debug.Print i Next i Další tipy • Regeps – regulární výrazy 2 Obsah 1 ZÁKLADNÍ DIALOGOVÁ OKNA MSGBOX INPUTBOX 1 1.1 Dialogové okno MsgBox 1 1.1.1 Syntaxe 1 1.1.1.1 Konstanty pro tlačítka 2 1.1.1.2 Konstanty pro ikony 2 1.1.1.3 Konstanty pro výchozí tlačítko 2 1.1.1.4 Režim 2 1.1.1.5 Návratové hodnoty 2 1.1.2 Praktické použití 3 1.1.2.1 Jako první začnete s pozdravem ahoj světe 3 1.1.2.2 Dialogové okno s titulkem 3 První pracovní verze Jak na VBA v Excelu – příručka od A do Z Pavel Lasák, MVP Vytvořeno 08 / 2021 12 / 12 https://office.lasakovi.com/ 1.1.2.3 MsgBox s jinými tlačítky než OK 3 1.1.2.4 Dialogové okno s více řádky 4 1.1.2.5 Různá tlačítka v dialogovém boxu 4 1.1.2.6 Předvybrané jiné tlačítko než první 4 1.1.2.7 Ikony v dialogovém boxu 5 1.1.2.8 Využití dialogového okna MsgBox na kontrolu operátoru 5 1.1.2.9 Tvorba dynamických textů 5 1.1.2.10 Vytvořit dialogové okno pomocí proměnných 5 1.1.2.11 Dialogové okno sčítání požadavků 6 1.1.2.12 Více řádku v dialogovém okně 6 1.2 Input Box 6 1.2.1 Syntaxe InputBox 6 1.2.1.1 InputBox 6 1.2.1.2 Application.InputBox 6 1.2.2 Praktické použití InputBoxu 7 1.2.2.1 Základní použití InputBox 7 1.2.2.2 Vytvoření InputBox využitím argumentů 8 1.2.2.3 InputBox vs Application.InputBox 8 1.2.2.4 Výpočet plochy čtverce 8 1.2.2.5 Výpočet obdélníků 8 1.2.2.6 Ošetření ať je opravdu číslo 9 1.2.2.7 Ošetření využitím Application.Input box 9 1.2.2.8 Klik na storno, křížek 10 1.3 Okno Immediate a Debug.Print 10 1.3.1 Zobrazení okna Immediate 10 1.3.2 Prakticke použití Debug.Print a okna Immediate 10 1.3.2.1 Výpočty přímo v okně 10 1.3.2.2 Odkazování se do Debug.Print 11 2 OBSAH 11