VBA - Visual Basic for Applications
- programovací jazyk
- pokud něco chybí v MS Office, můžeme si to vytvořit
- je to součást Office (ne jen)
- otevřená platforma - také v Corel DRAW (vektor), Auto CAD
- makra - zautomatizované činnosti
- objektově orientované programování - objekt má - vlastnosti (properties) - jméno, velikost…
- metody (methods) - to co umí
- události (events) - kdy já myší najedu na okno, klik… -
aby byla zrealizována nějaká metoda
- makra se spouštějí - Ctrl + E, J, M, L, Q, T, Y
- Ctrl + Shift + kromě A, F, O, P
- makro začíná a končí Sub
- symbol apostrofu - komentář
- Algoritmus -> (vývojoví diagram ! = grafické znázornění algoritmu) ->Programovací jazyk -> kód = program =
posloupnost instrukcí
- Programovací jazyk - nízko úrovňové - základné, strojové, Assembler (jsou bližší počítačům (HW úroveň))
- vyšší program. jazyky - VB(A), C, C+, C++, C# (sharp), Java, PHP, Pascal, Fortram,
Python //paiton// …
- Programování - imperativní (příkazové) = procedurální - data jdou na vstup (1) procedury ta je zkracuje
(formou příkazů) a dostanu 1 výstup
- objektově orientované programování - používá objekty které mohou mít více vstupů a
výstupů a které zdržují data a funkce v jeden celek
- Algoritmus - je přesný postup kterým řešíme určitý jednoznačně definovaný problém (úlohu)
- musí být: 1. konečný (musí mít začátek a konec) (problém nekonečného zacyklení)
2. jednoznačný - v každém kroku musí být jasné jaký je další krok
3. věcně správný - chyba v zápisu
4. obecný
5. opakovatelný - deterministický - při stejných vstupech musí být vždy stejný výstup
6. srozumitelný* - rozumí mu nejen autor ale i ostatní -> použití normalizovaných
způsobů zápisu a komentářů
- grafické znázornění algoritmu = vývojový diagram
- UDF - Uživatelsky definované fce - 1. vytvořit modul - 2. tlačítko
- 2. musí začínat - Function a končit - End function
Function ObvodObdelnika(Sirka, Vyska)
ObvodObdelnika = 2 * (Sirka + Vyska)
End Function
- FCE vrací výsledek do buňky
- Makra - dají se nahrát
- nahrávaní
- editace
- dopisování
- Proměnná - je to pojmenovaný prostor v paměti
- proměnné jsou datového typu - Integer - celé číslo - číslový
- Byte - 1B - číslový/datový
- Single - reálné číslo,, desetinná čísla s tečkou !!! - číslový
- String - znakový řetězec - datový typ - vše v "" - když je to číslo tak
už se nedá počítat!! - např. PSČ
- Bolean - ano/ne - logický
- Variant - vše - všechny data, zabírá nejvíc v paměti
- Date - datový typ čistě pro datum
- deklarace proměnné - DIM Pocet As Integer
- DIM Slovo As String
- DIM Znamka As Byte
- Function ObjemKrychle (Strana As Single As Single)
- Function ZnamkaSlovne (Znamka As Byte As String)
Pravidla pro psaní kódu VBA, PROMĚNNÉ,
VÝRAZY
- Klíčová slova Sub …End Sub; Function….End Function
Odsazování
- Pište malými písmeny
- Názvy proměnných - maďarská notace
- Příznak pokračovacího řádku _
- Datové typy pro VBA
PROMĚNNÉ A PRÁCE S NIMI
Proměnné slouží k uložení dočasných, proměnlivých hodnot, které vznikají při běhu procedury
DEKLARACE PROMĚNNÉ
- slouží k pojmenování proměnné a určení jejího typu
- měla by být provedena dříve, než je proměnná poprvé použita – explicitní deklarace – proto
deklaraci proměnných standardně umisťujeme na začátek procedury.
POZN: Pokud v kódu použijeme proměnnou, která není deklarována, přiřadí ji VBA typ podle
hodnoty, kterou do ní vložíme – implicitní deklarace.
- název musí začínat písmenem, max. 255 znaků, nesmí to být některé z klíčových slov
(název příkazu…) a nesmí obsahovat mezeru nebo znaky @ # $ ! . % & . Nezáleží na velikosti znaků.
Deklaraci provedeme příkazem DIM (Dimension)
Př.: Dim A As Integer
Dim iSoučet As Integer
Dim Součet#
VÝRAZY
- provádějí operace a poskytují výsledky
-
jsou tvořeny:
-
Operandy: proměnné, konstanty, literály (= čísla a znakové řetězce – ty se
píšou v uvozovkách) - Operátory: symboly, které určují jaké operace se budou provádět s operandy
-
Operandy: proměnné, konstanty, literály (= čísla a znakové řetězce – ty se
Operátor přiřazení: =
Aritmetické operátory: +
-
*
/
\ celočíselné dělení (Alt 92)
^ mocnění (Alt 94)
Mod modulo – zbytek po celočíselném dělení
Operátor řetězení: & (Alt 38)
Operátory porovnání: =
> (Alt 62)
< (Alt 60)
>=
<=
<>
Like - shoduje se s ( je možno používat * konv.)
Is - slouží pro porovnání dvou objektů
Logické operátory: And
Or
Eqv
Imp
Xor
Not
-
Funkcemi: VBA disponuje řadou zabudovaných funkcí, často odpovídají funkcím Excelu, zadávají se však v angl. formě - využij Nápovědy:
Matematické funkce:
Finanční funkce:
Řetězcové funkce:
Funkce data a času:
Součástí výrazu mohou být samozřejmě i uživatelsky definované fce -
Závorkami: - mění pořadí provádění operací
- závorky si musí odpovídat – stejný počet levých a pravých závorek ve výrazu, jinak
se vypíše chybové hlášení Expected: )
! Operandy musí být kompatibilních datových typů. (Nelze kombinovat např. Integer a String)
! Operátory musí odpovídat datovému typu operandu (Nelze násobit dva textové řetězce String)
! Datový typ proměnné, do které ukládám výsledek, musí odpovídat datovému typu výsledku,
který obdržím:
Dim A as Integer, B as Integer, C as Single
B = 1
C = 1,5
A = B * C Výsledek bude 2! Zdroj špatně odstranitelných chyb – nejsme varováni
žádným hlášením
PŘÍKAZ MSGBOX & INPUTBOX
MsgBox – umožňuje zobrazení zprávy v dialogovém okně
Syntaxe: MsgBox výzva, tlačítka, titulek
výzva – znakový řetězec v uvozovkách, nebo proměnná typu string
tlačítka – parametr definující tlačítka, pokud jej neuvedu -> bude zobrazeno jen tlačítko OK
titulek – znakový řetězec v uvozovkách, nebo proměnná typu string; zobrazuje se v záhlaví dialog. okna, pokud jej neuvedu -> zobrazí se název aktuální aplikace (Word, Excel...)
Příklad: podívejte se v tomto wordovském dokumentu na makro DialogMsgBox a spusť je.
Sub DialogMsgBox()
MsgBox "Toto je text v parametru VÝZVA", , "Můj titulek"
End Sub
Sqr - odmocnina
InputBox – umožňuje zobrazit okno, které slouží k zadání vstupních hodnot procedury, nebo funkce
Syntaxe: InputBox(výzva, titulek)
výzva – znakový řetězec v uvozovkách, nebo proměnná typu string
titulek – znakový řetězec v uvozovkách, nebo proměnná typu string; zobrazuje se v záhlaví dialog.
okna, pokud jej neuvedu -> zobrazí se název aktuální aplikace (Word, Excel...)
Příklad: podívejte se v tomto wordovském dokumentu na makro ZadejČíslo a spusť je.
Sub ZadejČíslo()
Dim Číslo As Integer
Číslo = InputBox("Zadejte, prosím, libovolné přirozené číslo", "Můj titulek pro InputBox")
MsgBox "Vámi zadané číslo je rovno" & Číslo, , "Můj titulek pro MsgBox"
End Sub
Použít relativní odkazy - používá relativní odkazy od míst kde jsme je spustili
SMYČKY A CYKLY
Modulární programování – delší programový kód je členěn na jednotlivé procedury a funkce,
které vytvoříme pouze jednou a v případě potřeby je můžeme volat a spouštět kolikrát bude zapotřebí.
Šetříme čas při psaní kódu a je to výhodné i při změnách a úpravách kódu.
(Pozn.: Pokud bych psal kód za sebou, i několikanásobně opakovně, pak bude dlouhý, hůře
čitelný a upravovatelný, ale rychlejší než kód vytvořený formou modulárního programování!)
Struktura DO … LOOP
Používá se v případech kdy neznáme přesný počet opakování cyklu.
Čtyři možné tvary syntaxe:
A) Do While podmínka
[příkazy]
Loop
!Podmínka je vyhodnocována před vstupem do smyčky a příkazy jsou provedeny jen pokud
je podmínka True!
B) Do
[příkazy]
Loop While podmínka
!Podmínka je vyhodnocována na konci smyčky a pokud je True pak se provedou příkazy!
C) Do Untile podmínka
[příkazy]
Loop
!Podmínka je vyhodnocována před vstupem do smyčky a příkazy jsou provedeny, jen pokud
je podmínka False!
D) Do
[příkazy]
Loop Untile podmínka
!Podmínka je vyhodnocována na konci smyčky a pokud je False pak se znovu provedou příkazy!
Struktura FOR … NEXT
Používá se v případech kdy známe přesný počet opakování cyklu.
For čítač = start To konec [Step přírůstek]
[příkazy]
Next [čítač]
Čítač – číselná proměnná použitá jako počitadlo průchodů smyčkou (v praxi často písmena I až N)
start – počáteční hodnota čítače, většinou = 1, může to být i číselný výraz
konec – Konečná hodnota čítače pro kterou jsou příkazy ještě provedeny
přírůstek – volitelná hodnota, pokud není uvedena = 1, může to být i číselný výraz, může být záporná!
!Konec nesmí být menší než start (v případě kladného přírůstku)! Konec nesmí být větší než start
(v případě záporného přírůstku)! Pokud tomu tak je - cyklus se přeskočí!
!Je-li konec = start provede se cyklus jedenkrát!
Pro rychlejší provádění cyklu je vhodné neuvádět za příkazem Next název proměnné čítače.
Příkaz EXIT DO, Příkaz EXIT FOR
Používají se pro předčasné ukončení cyklu; dříve než by odpovídalo normálnímu průběhu.
Program pak pokračuje příkazy za klíčovými slovy Loop (While, Untile) resp. Next.
Funkce VBA, o kterých bych měl vědět:
Trim(řetězec) – zbaví znakový řetězec všech znaků mezera před a za znakovým řetězcem
Len(řetězec) - vrací číslo = počet znaků znakového řetězce retezec
Mid(řetězec,startznak,početznaků) – vrací znakový řetězec: tolik znaků kolik je početznaků ze znakového
řetězce řetězec počínaje znakem který je v pořadí startznak
(Alternativy: Left(řetězec, délka); Right(řetězec, délka)
IsNumeric(výraz) – logická funkce => vrací pravdu x nepravdu (True x False) v závislosti na tom zda výraz
je či není číslo
IsDate(výraz)
IsEmpty(výraz)
IsNull(výraz)
! The Null value indicates that the Variant contains no valid data. Null is not the same as Empty, which indicates that
a variable has not yet been initialized. It is also not the same as a zero-length string (""), which is sometimes referred
to as a null string!
Chci-li jednoduše volat nápovědu k nějaké funkci, pak zapíšu její název do vyhledávacího pole nápovědy
–> ve výsledcích hledání použiju odkaz na článek (article) týkající se mé funkce.
Neznám-li přesný název funkce, pak zapíšu do vyhledávacího pole nápovědy klíčové slovo functions.
Tip: Chci-li zobrazit přehled funkcí dostupných ve VBA, pak do vyhledávacího pole zapíšu název libovolné
mně známé funkce a v článku týkajícího se mé funkce použiju v horní drobečkové navigační liště odkaz Functions.
VBA - Práce s oblastmi v Excelu
Označení oblasti:
Pokud nahrávám makro, používá VBA metodu (metoda = …) Range se syntaxí, kde oblast buněk je zapsána
jako text: Range("E4:H9").Select (pro jednu buňku: Range("E4").Select)
Pozn! Pokud bych chtěl pro označení oblasti použít proměnné, musel bych postupovat třeba takto:
Dim LevyHorni As String, PravyDolni As String, Oblast As String
LevyHorni = InputBox("Zadej adresu levého horního rohu")
PravyDolni = InputBox("Zadej adresu pravého dolního rohu")
Oblast = LevyHorni & ":" & PravyDolni
Range(Oblast).Select
Při ručním psaní kódu je asi výhodnější použít jinou možnou syntaxi: Range("E4", "H9").Select
-
V tomto případě metoda Range pracuje se dvěma argumenty oddělenými čárkou
(pro jednu buňku: Range("E4", "E4").Select)
Pozn! Předcházející kód by pak vypadal následovně:
Dim LevyHorni As String, PravyDolni As String
LevyHorni = InputBox("Zadej adresu levého horního rohu")
PravyDolni = InputBox("Zadej adresu pravého dolního rohu")
Range(LevyHorni, PravyDolni).Select
Příklad: Napište proceduru, která si od uživatele vyžádá souřadnice oblasti a vyplní ji obsahem,
který si také vyžádá od uživatele.
Sub Vypln()
Dim LevyHorni As String, PravyDolni As String, Obsah As String
LevyHorni = InputBox("Zadej adresu kde mám začít")
PravyDolni = InputBox("Zadej adresu kde mám skončit")
Obsah = InputBox("Zadej čím mám plnit")
Range(LevyHorni, PravyDolni).Value = Obsah
End Sub
V tomto příkladě je použita vlastnost Value objektu Range, pomocí které je do každé buňky oblasti
zapsána hodnota uložená v proměnné Obsah.
Úkoly:
Zjistěte (pomocí nahrávky makra) jaký kód používá VBA pro:
- generování datové řady (posloupnosti)
- kopírování (vyjmutí) a vložení oblasti dat
- vymazání oblasti dat
- odstranění sloupce, řádku
Tipy:
Označená oblast se označuje jako objekt Selection
Odstranění formátování v označené oblasti: Selection.ClearFormats
Objekt aktivní buňka: ActiveCell
Vlastnosti: ActiveCell.FormulaR1C1 = "1"
ActiveCell.Value = "1"
ActiveCell.Offset(1, 2).Select - znamená posun o 1 řádek dolů a 2 sloupce doprava
ActiveCell.EntireRow.Select - znamená výběr celého řádku, v kterém je aktivní buňka
ActiveCell.EntireColumn.Select - znamená výběr celého sloupce, v kterém je aktiv. buňka
ActiveCell.EntireColumn.Clear - výmaz veškerého obsahu sloupce
ActiveCell.EntireColumn.Delete - odstranění sloupce
DU: vytvořte makro VBA s názvem 100krát ktoré si vyzžáda od uživatele vstupmní hodnotu
(string) a touto vstupní hodnotou vyplní akttivní bunku a dalsších 99 buněk směre dolů. CTRL + Q
Sub stokrat()
'
' stokrat Makro
'
' Klávesová skratka: Ctrl+q
'
Dim Hodnota As String
Hodnota = InputBox("Zadaj hodnotu", "Hodnota")
MsgBox "Vami zadaná hodnota je: " & Hodnota, , "Informacia"
For sprav = 1 To 100
ActiveCell.FormulaR1C1 = Hodnota
ActiveCell.Offset(1, 0).Select
Next
MsgBox "Koniec"
End Sub
V rámci cyklu For Each
Normal.dot/dotm - základní stavba wordu - výchozí šablona