VBA – 6# Lekce – Textové funkce

V dnešní lekci se podíváme na práci s textem. Bude se jednat o úpravy textu vyhledávání znaků zjišťování délky řetězce pomocí zabudovaných funkcí, které nalezneme ve VBA. Abychom mohli efektivně pracovat s textovými řetězci, potřebujeme znát právě tyto funkce. Aby se nám lépe demonstrovaly jednotlivé funkce, uvažujme, že máme proměnnou txt, ve které máme uložen text ‚abeceda je veda‘. V kódu zapsáno takto txt=‘abeceda je veda‘. Nyní se již vrhněme na jednotlivé funkce

Funkce Len

nám zjistí počet znaků v textu. Jako jediný parametr požaduje právě text, který má spočítat. Text může být reprezentován jak proměnnou, tak samotným textem v uvozovkách.

Ukázka syntaxe:

Delka=len(txt)
Msgbox(len(txt))

V prvním řádku jde o uložení délky proměnné txt do proměnné délka. Na druhém řádku, dojde k vypsání délky v naše případě se vypíše číslo 15. Je nutné mít na paměti, že do délky textového řetězce se započítávají jak mezery, tak znaménka tak čísla. K lepšímu zapamatování této funkce uvedu, že len je zkrácenina slova length, které v překladu z angličtiny znamená délka ;).

Instr

jedná se o vyhledávací funkci. Zde už se setkáváme s mírně složitějším zapsáním.  Tato fůnkce vyžaduje hned tři parametry, ale není se čeho bát, všechny tři vyplývají z logiky této funkce. Nejdříve tedy musíme zadat startovní pozici to je pozice, na které se začne vyhledávat, jako druhý argument zadáme, kde se má hledat, čili v jakém textovém řetězci v našem modelovém příkladu to bude proměnná txt, jako poslední chce funkce znát hledaný řetězec, který musí být uveden v uvozovkách, hledat můžeme jak jednotlivé znaky, tak i více znaku najednou ba do konce i celé věty podmínka je však, že musí být ohraničeno uvozovkami.

Ukázka syntaxe

Msgbox Instr(1,txt,“j“)

Vidíme tedy, že funkce bude vyhledávat od první pozice v proměnné txt a bude hledat znak „j“.  V našem případě, tedy vrátí hodnotu 9. Pokud bychom hledali více znaků, funkce vrátí vždy pozici, na které hledaný řetězec začíná. Pokud bychom hledali slovní spojení „je“ funkce vrátí opět 9.

Left

Při použití této funkce dojde k vrácení jenom určité části textu. Konkretně vrací zadaný počet znaků od začátku námi zvoleného textového řetězce. Z čeho vyplývá, že požaduje dva parametry textový řetězec odkud bude vracet znaky a počet znaků.

Ukázka syntaxe

Msgbox left(txt,7)
Kus_textu=left(text,7)

S takto zadanou funkcí dostaneme na výsledku slovo „abeceda“. Na druhém řádku se nic nevypisuje, pouze uložíme výstup z funkce do nové proměnné. Je třeba si uvědomit, že funkce nic nemění, pouze vypisuje pokud tedy chceme pracovat jen s určitou části, musíme si ji uložit do jiné proměnné, jako jsem naznačil na druhém řádku.

Right 

tato funkce je zcela totožná jako výše uvedená left jediné co se mění je, že tato funkce zobrazuje znaky zprava nebo chcete-li od konce textového řetězce syntaxe je zcela stejná. Pomocí této funkce můžeme zjistit také velice jednoduše poslední znak v textu.

Ukázka syntaxe

Msgbox right(txt,7)

Toto nám vypíše retězec „je veda“

Mid

nám umožní zobrazit určitou část textu. Vyžaduje k tomu tři parametry, první z nich je jak už jste si asi zvykli, textový řetězec odkud budeme část vybírat v našem případě tedy opět txt. Jako druhý parametr chce funkce znát číslo, které reprezentuje pozici, odkud má začít brát znaky a jako poslední chce číslo, které zastupuje počet zobrazených znaků.

Ukázka syntaxe

Msgbox mid(txt,9,2)

Takto zapsaný řádek nám vypíše pomocí msgboxu prostřední část našeho textu tedy „je“ funkce tedy vrací námi zadaný interval znaku pomoci počáteční pozice a počtu znaků.

Ucase

tato funkce převádí zadaný textový řetězec na velká písmena, vyžaduje pouze jeden parametr a to řetězec, který chceme převést.

Ukázka syntaxe

Ucase(„ahoj“)

Toto vrátí  „AHOJ“.

Lcase

je pravý opak Ucase znamená to tedy, že převede textový řetězec na malé znaky.

vbCrlF

Nejde o funkci spíš o jakousi konstantu, která nám v kódu nahrazuje funkci enter. Jedná se tedy o zalomení řádku. Používá se například při výpisu v Msgboxu pro zpřehlednění informace. Nebo v komentáři u inputboxu. Ukážeme si použití.

Ukázka syntaxe

Msgbox(„Textový řetězec  1“ & vbcrlf & „Textový řetězec 2“ & vbcrlf & „Textový retězec 3“)
Inputbox(„Textový řetězec  1“ & vbcrlf & „Textový řetězec 2“)

U inputboxu se nám řádky zalamují na místě pro popis, je možné tedy přehledně stylovat zprávy pro uživatele jaká data má zadávat.

Příklad 1. Zde si pouze ukážeme vše co jsme si výše popsali.

Sub priklad1()

txt = "abeceda je věda"

MsgBox ("délka je (funkce len) " & vbCrLf & Len(txt))
MsgBox ("hledaný řetězec je na pozici (funkce Instr) " & vbCrLf & InStr(1, txt, "j"))
MsgBox ("funkce left " & vbCrLf & Left(txt, 4))
MsgBox ("funkce right " & vbCrLf & Right(txt, 7))
MsgBox ("funkce mid " & vbCrLf & Mid(txt, 9, 2))
MsgBox ("Vše na velké (funkce Ucase) " & vbCrLf & UCase(txt))

End Sub 

Příklad 2. Nyní si ukažme trošku těžší avšak z mého pohledu velmi praktický příklad.

Uživatel zadá textový řetězec a následně bude dotázán na hledaný znak. Program vypíše, kolikrát se znak v řetězci objevuje a na jakých pozicích.

Sub priklad1b()
    Dim Text As String
    Dim hledany As String
    Dim kde As String
    Dim pozice As Integer
    Dim Cetnost As Integer
    Dim pocatek As Integer
    
    Text = InputBox("zadej text")
    hledany = InputBox("zadej hledany text")
    
    pocatek = 1
    Do
        pozice = InStr(pocatek, Text, hledany)
        If pozice > 0 Then
            Cetnost = Cetnost + 1
            kde = kde + Str(pozice) + ","
            pocatek = pozice + 1
        End If
    Loop Until pozice = 0
    
    MsgBox ("cetnost:" + Str(Cetnost) + ";  " + "pozice:" + kde)


End Sub

Popis kódu již snad není nutný. Hlavní funkcí pro tento příklad je InStr. Pokud by však někomu dělalo potíže porozumět, doporučuji pustit si program debugem a projít si jednotlivé kroky a podívat se co se kam načítá a co se s kódem děje.

Závěr

To bude pro dnešek vše. Příště se podíváme na skládání textových funkcí a zadáme si nějaké komplexnější příklady na procvičení těchto funkci. Příklady budou podobného typu dnešního 2. příkladu budou tedy i trochu prakticky využitelné 😉 máte se tedy na co těšit.

VBA – 5# Lekce – Debug proces

Ještě než se pustíme do slibovaného příkazu „Select Case“ chtěl bych Vám ukázat tzv. Debug v MS Excel. Je to nástroj, který prochází krok po kroku námi napsaný kód. Je to dobré, pokud máme delší kód a někde máme chybu. Nebo také k lepšímu pochopení chodu programu.

Debug

Tak a teď jak na to. Nejdříve si spustíme námi napsaný prográmek třeba z minulé lekce s podmínkami IF. Jak jsme již zvyklí, přepneme se do vývojového prostředí. Debug pustíme tlačítkem F8 nebo také v záložce Debug -> položka Step Into. Aby vše fungovalo, musíme mít kurzor nakliknutý v jakékoliv části námi napsaného programu. Postupným mačkáním F8 debug prochází jednotlivé řádky našeho kódu aktuálně „projížděný“ řádek je podbarven žlutě. Pokud potřebujeme vědět, jaké data se nám aktuálně načetly do proměnné, stačí najet kurzorem na danou proměnnou a zobrazí se nám, co obsahuje. Toto platí pro všechny proměnné v kódu ne jenom na tu podbarvenou.

Závěr

S tímto nástrojem jsem Vás chtěl seznámit zejména kvůli pochopení chodu programu. Aby jste viděli, co se kam kdy načítá a měli tak větší kontakt s napsaným kódem a uměli si vše líp představit. Závěrem si dáme úkol projít všechny námi doposud napsané programy tímto postupem a znovu se zamyslet jak program funguje zejména pak programy z minulé lekce kde jsme se poprvé setkali s IF.

VBA – 4# Lekce – Podmínky IF

V této lekci se podíváme na větvení programu pomoci podmínek IF (do češtiny přeloženo KDYŽ). Podmínky jsou nedílnou součástí každého programu pomáhají nám ošetřovat různé možnosti na základě podmínek. Pomocí těchto příkazu jsme potom schopni větvit program v závislosti na vstupních okolnostech.

Obecná syntaxe podmínky

Syntaxe podmínek if vypadá takto.

IF podmínka Then

Blok příkazů VBA

ElseIf

Blok příkazů

End If

Tento příklad ukazuje jenom samostatný blok podmínek a po zkopírování vám nebude fungovat. Kompletní příklady si ukážeme později v této lekci.

If volba = "a" Then
MsgBox "ahoj", vbOKOnly + vbInformation, "Zpráva" 
ElseIf volba = "b" Then MsgBox "nazdar", vbOKOnly + vbInformation, "Zpráva"
Else MsgBox "končím program", vbOKOnly + vbInformation, "Zpráva"
end
End If

Teď si tento kód rozebereme : První řádek by se dal přečíst takto. Pokud (if)  jakákoliv proměnná ( volba) se rovná ( = )  “a“  potom vykonej (then). Pokud tato podmínka nenastane program přeskočí řádky pod ní a zastaví se u řádku elseif . Elseif je obdoba if ale v podmínce ho můžeme využít kolikrát chceme kdežto if se dává jenom na začátek dané podmínky. Z toho vyplývá že třetí řádek se čte úplně stejně jako první. Else značí něco jako „cokoliv jiného“. Takže pokud se volba bude rovnat cokoliv jiného než „a“ nebo „b“ program vykoná řádky pod else. V Tomto případe vykoná příkaz end, který ukončí celý program. Podmínky nemusí vždy obsahovat else nebo elseif. Každý podmínkový blok ale musí být ukončen řádkem End If. A teď již pár slibovaných kompletních příkladů na procvičení podmínek.

Příklady


Sub cisla()
Dim Cislo As Double
Dim Vysledek As String
Cislo = InputBox("zadej číslo")

If Cislo > 0 Then
        Vysledek = "kadné"
    ElseIf Cislo < 0 Then
        Vysledek = "záporné"
    Else  Vysledek = "nula"
End If
MsgBox "Číslo je " + Vysledek
End Sub

Sub porovnání()
Dim a As Double
Dim b As String
a = InputBox("zadej číslo a")
b = InputBox("zadej číslo b")

If a > b Then
      Vysledek = "a je vetší než b"
   ElseIf b > a Then
      Vysledek = "b je vetší než a"
   Else Vysledek = "a = b"
End If

MsgBox Vysledek
End Sub

U tohoto příkladu je v podmínce použitý textový řetězec proto podmínka vypadá if heslo=“vba“(každý textový řetězec se ohraničuje uvozovkami) kdyby to nebylo v uvozovkách program by to bral jako proměnnou. Zkuste si dát zadat do inputboxu textový řetězec vba a potom cokoliv jiného.


Sub heslo()
Dim heslo As String
heslo = InputBox("zadej heslo")
If heslo = "vba" Then
        MsgBox "Zobrazení přísně tajné zrávy :D", vbOKOnly + vbInformation, "TOP sectret"
    Else
        MsgBox "spatně zadané heslo", vbOKOnly + vbInformation, "Smůla"
End If
End Sub

Toto je jenom obdoba předešlého příkladu. Chybí zde příkaz else. Sami se podívejte na rozdíl mezi oběma příklady


Sub heslo_update()
Dim heslo As String
heslo = InputBox("zadej heslo")
If heslo = "vba" Then
        MsgBox "Zobrazení přísně tajné zrávy :D", vbOKOnly + vbInformation, "TOP sectret"
End If
End Sub

Závěr

Tím naše lekce končí podmínky jsou velmi důležitou součástí programování takže jestli něčemu nerozumíte klidně se ptejte v komentářích pod článkem. V příští lekci se podíváme na další možnosti dělení programu pomocí příkazu Select Case.

VBA – 4# Lekce – Zadání vstupních dat – Inputbox

V této lekci si představíme další příkaz Windows. Jedná se o Inputbox, který se využíváme k tomu abychom mohli číst vstupní data od uživatele. Jelikož nejde o nic těžkého pojďme rovnou na příklad.

Příklad:

Sub scitani ()
Dim a as integer
Dim b as integer
Dim vysledek as integer
a = inputbox(“zadej číslo a “)
b = inputbox(“zadej číslo b “)
vysledek= a +b
MsgBox vysledek, vbOKOnly + vbInformation, "Vysledek"
End sub

Teď vysvětlení kódu jediné s čím jsme se zatím nesetkali, je tento řádek:

a = inputbox(“zadej číslo a “)   

areprezentuje proměnnou kam se zadané data uloží.

inputbox– je zavoláni windows příkazu stejně jako msgbox.

(“zadej číslo a “) – toto je popisek uvedený při zobrazení inputbox okna aby uživatel věděl co má zadávat.

Do inputboxu můžeme samozřejmě načítat i jiná data než čísla. Aby, jsme třeba mohli zadávat textová data, musíme proměnným změnit datový typ na string (Dim b as stringsamozřejmě s nimi pak nejde počítat tak jak jsme si ukázali v minulé lekci. Mohou se pouze sčítat logickým operátorem &.

Dnešní lekce byla poměrně krátká a proto si zadáme domácí úkol. Zkuste si přepsat všechny příklady, se kterými jsme se zatím setkali tak abyste v nich použili funkcionality inputboxu.

Závěr

Další lekce se bude zabývat větvením programu pomocí podmínkových příkazu IF.

VBA – #3 Lekce – Proměnné a datové typy

V této lekci se podíváme na proměnné (bez nichž by se neobešel žádný programovací jazyk) a jejich datové typy. Každý program potřebuje své mezi výpočty nebo již hotové výsledky někam ukládat aby s nimi později mohl jakkoliv dál pracovat například vypsat na obrazovku, znovu počítat nebo cokoliv jiného proto byly vymyšleny proměnné.

Proměnná

je dočasný prostor pro ukládání dat při chodu programu. Každá proměnná se musí deklarovat (chápej jako vyhradit prostor) .

Příklad explicitně deklarované proměnné:

Dim a as integer

  1. Dim – je klíčové slovo deklarace
  2. a – je název proměnné
  3. as integer – tímto programu určujeme jaká data se budou do proměnné ukládat (datový typ)

Datové typy

každé data mají svůj typ. Některá jsou celo číselná některá jsou necelo číselná a některé jsou textová. Žádné jiné data neexistují. Každý program potřebuje znát typ dat s jakými bude pracovat a proto je rozlišujeme do několika skupin. A už při deklaraci proměnné musíme uvést jaký typ dat do ní budeme ukládat. Toto je velice důležité.

Celočíselné datové typy

Pokud budeme chtít uložit celočíselná data, použijeme jednu z následujících tří variant:

Byte

  • zabírá v paměti 1 B
  • rozsah je 0 až 255
  • Používá se tam, kde uvedený rozsah stačí.

Integer

  • Zabírá v paměti 2 B
  • rozsah je od -32768 do 32767

Long

  • Zabírá v paměti 4 B
  • Rozsah je od –2 * 109 do –2 * 109
  • tyto datové typy by se daly použít v jednoduchém příkladu
Sub soucet()
 Dim a As Integer
 Dim b As Integer
 Dim c As Integer
 a = 5
 b = 2
 c = a + b
 MsgBox c, vbOKOnly + vbInformation, "Vysledek 
End Sub 

Prvními třemi řádky jsme si deklarovali proměnné a určili jejich datový typ další dva řádky zajistili načtení hodnot (dat) do proměnných další řádek zajistil jejich výpočet a jeho načtení do proměnné c další řádek zajistil jeho vypsání pomocí msgboxu. Msgbox zvládne také vypsání proměnné to se dělá bez uvozovek (MsgBox c).

Neceločíselné datové typy

Tyto datové typy využijeme, pokud budeme vědět, že data budou s desetinou čárkou

Single

  • Reálné celé číslo s plovoucí čárkou zabírající nejvýše čtyři bajty.

Double

  • Reálné kladné číslo s plovoucí čárkou zabírající nejvýše osm bajtů. Nabízí dvojnásobnou přesnost oproti Single a větší rozsah.

Currency

  • Reálné číslo se čtyřmi desetinnými místy zabírající nejvíce osm bajtů.

Zase si je vysvětlíme na jednoduchém příkladu:

Sub Podil() 
Dim a as integer
Dim b as integer
Dim c as double
a=5
b=3
c=a/b
MsgBox c, vbOKOnly + vbInformation, "Vysledek" 
End Sub

Tím, že jsme u třetího řádku nastavili proměnnou jako double si zajistíme, že se výsledek nezaokrouhlí (což by se stalo kdyby jsme použili datový typ integer) ale vypíše se i s desetinou čárkou.

Textové (řetězcové) datové typy

String

Používáme jej k uložení textových řetězců. Řetězec musí být uzavřen do uvozovek. Do textového řetězce můžeme napsat i čísla ale nebude s nimi možno počítat. Budou brány jako znak.

Příklad:

Sub zprava()
Dim zprava as string
zprava=“libovolný textový řetězec sdělující informace uživateli“ 
MsgBox zprava, vbOKOnly + vbInformation, "Zpráva" 
End Sub

Příklad čísla ve stringu:

Sub zajimavost()
Dim a as string
Dim b as string
Dim vysledek as string
a="2"
b="3"
Vysledek=a+b
MsgBox vysledek
End Sub

Sami budete překvapení, jaký bude výsledek. Pokud program pracuje s datovým typem string, nepoužívá plus k matematickým úlohám (3+2=5) ale pouze „postaví“ dva textové řetězce za sebe (slepí je dohromady (2+3=23).

poznámka: čísla v proměnných a , b by se daly zapsat i bez uvozovek ale pro pochopení, že se jedná o datový typ string jsem raději uvedl uvozovky.

Závěr

Toto je konec 2 lekce. Můžete si vyzkoušet různé kombinování s typy proměnných a sledovat změny v chodu programu. V příští lekci se podíváme na využití dalšího windows příkazu inputbox.

VBA – #2 Lekce – Výpis textu na obrazovku

V této lekci se naučíme používat msbgox. Jedná se o příkaz Windows a VBA ho pouze využívá. Msgbox využíváme pro zobrazení zprávy uživateli a jeho syntaxe je

MsgBox (prompt [, buttons + icons][ , title])

prompt (povinný) Zpráva zobrazená v okně hlášení

buttons (volitelný) Určuje tlačítka a ikony, které se v oknu hlášení objeví

upozornění windows

Tlačítka:

  • vbOKOnly
  • vbOKCancel
  • vbAbortRetryIgnore
  • vbYesNoCancel
  • vbYesNo
  • vbRetryCancel

Ikony:

  • vbCritical
  • vbQuestion
  • vbExclamation
  • vbInformation.

Pokud chceme buttons a title (obrázek viz ukázka vpravo) spojit dáme mezi ně + (tak jako je to použito v následujícím příkladu vbQuestion + vbOKOnly title se ukáže otazník a button bude vbOKOnly)

title (volitelný) Text, který se zobrazí v záhlaví okna hlášení. Standardní text je Microsoft Excel.

Příklad

Nejlépe si to vysvětlíme na jednoduchém příkladu:

Sub hello_world ()
MsgBox "Hello World", vbQuestion + vbOKOnly, "Tvůj první script"
End sub

Tento skript spustíme kliknutím v run > run macro nebo také f5. Po spuštění se vám vyskočí okno se zprávou hello world.

Vysvětlení kódu je jednoduché.

  1. Sub – v prvním řádku znamená že se jedna o subrutinu.
  2. Hello_world je název této subrutiny (v názvu nesmějí být mezery)
  3. MsgBox –příkaz který jsme si vyvolali
  4. „Hello World“, – zpráva (prompt)
  5.  vbQuestion + vbOKOnly , –to první je ikonka otazníku, a to druhé je tlačítko „ok“
  6.  „Tvůj první script“ – toto je zpráva v záhlaví bez toho by tam bylo „Microsoft Excel“
  7. End sub – nám ukazuje kde daná subrutina končí.

Závěr

Tímto končí  i naše první lekce sami si vyzkoušejte různé podoby msgboxu zkuste nakombinovat tlačítka a ikony a různé záhlaví okna. Příště se podíváme na proměnné a jejich datové typy.

VBA – 1# Úvod do kurzu

    VBA je programovací jazyk se kterým se můžete setkat v prostředí Microsoft Office. My si budeme ukazovat jeho užití v Excelu . Tento tutoriál je určen i naprostým laikům a jeho cíl je naučit každého základním a pokročilým znalostem VBA. Takže ať už jste začínající programátor který hledá něco lehkého do začátku nebo každodenní uživatel balíku MS Office především Excelu je tento tutoriál pro Vás přesně to pravé. Budeme postupovat po malých krůčcích pro lepší pochopeni chodu jednotlivých úkonů.

Jak jsem již zmínil VBA můžeme psát i v obyčejném Excelu, který se v dnešní době vyskytuje na většině PC to je jeho nesporná výhoda protože drtivá většina ostatních programovacích jazyků vyžaduje své vlastní vývojové prostředí, které je většinou zpoplatněno (Microsoft Visual Studio).

Do editoru VBA se v Excelu dostaneme pouhým stisknutím kombinace alt + f11 a nebo na kartě vývojář > visual basic (je možné, že se Vám karta vývojář nezobrazuje v tomto případě je nutné jít do nastavení přes soubor > možnosti > přizpusobit kartu a tam zakliknout vývojář) pokud ještě stále používáte Excel ve verzi 2003 tak editor najdete  nástroje > makra > editor jazyka visual basic. Při prvním spuštění editoru VBA si musíme ověřit že je naše nastavení v excelu neblokuje a to provedeme v kartě vývojář > zabezpečení maker > a zatrhneme povolit vše v případe Excel 2003 musíme povolit v nástroje makra > zabezpečení > a vybereme volbu nízké. Když tento krok provedeme musíme excel vypnout a znova zapnout, aby se změny projevily

Při spuštění editoru visual basicu se nám objeví okno editoru vlevo najdeme „projekt explorer“ tedy prohlížeč projektů (moduly, class moduly, formuláře…) v dáném sešitu. Pod tímto oknem nalezneme okno properities, které nás bude zajímat hlavně při tvorbě formulářu a kterým se zatím nemusíme zabývat. Nahoře pak najdeme klasické panely nástrojů kde nás bude na začátku každého projektu zajímat především druhé tlačítko zleva. Abychom mohli napsat naše první makro musíme kliknout na malou šipku vedle tohoto tlačítka a vybrat module. V této chvíli nám vyskočí třetí a hlavní okno do kterého budeme psát samotná makra.

To je pro zatím vše, už víme jak se dostat do editoru, jak ho správně nastavit a kde budeme psát samotný kód takže jsme již připraveni vrhnout se na náš první prográmek.