3. Definice Funkcí
• Syntaxe
Function Název([Argument As Typ][, …]) As TypFunkce
[Kód funkce]
Název = [návratová hodnota]
End Function
– Název funkce (identifikátor-platí obecná pravidla tvorby
identifikátoru) je současně proměnná přes, kterou funkce vrací
výsledek (návratovou hodnotu funkce)
– Není-li explicitně uveden typ funkce, funkce vrací variant.
– Počet argumentů není omezen (oddělují se čárkami)
Option Explicit
Function Pozdrav() As String
If Time < #9:00:00 AM# Then
Pozdrav = "Dobré ráno"
ElseIf Time >= #6:00:00 PM# Then
Pozdrav = "Dobrý večer"
Else
Pozdrav = "Dobrý den"
End If
End Function
Function ObsahObdelniku(StranaA As Double, StranaB As Double) As Double
ObsahObdelniku = StranaA * StranaB
End Function
4. Volání funkcí v kódu VB
• Pozičně zadané argumenty
Dim Hodnota As Typ, Arg1 As Typ, Arg2 As Typ
Hodnota = Funkce([Arg1][, Arg2][, 3])
– Argumenty se uvádějí pozičně podle definice funkce
– Oddělují se čárkami
– Je-li návratová hodnota čtena musí být uzavřeny v závorkách
Sub Test()
Dim Obsah As Double, A As Double: A = 5
Obsah = ObsahObdelniku(A, 5)
End Sub
• Zadání argumentů podle názvu
Dim Hodnota As Typ, Arg1 As Typ, Arg2 As Typ
Hodnota = Funkce([ArgA:=Arg1][, ArgC:=3][, ArgB:=Arg2])
– Nejprve se uvede název argumentu funkce pak := a hodnota
– Na pořadí zadání argumentů nezáleží
Sub Test()
Dim Obsah As Double, A As Double: A = 5
Obsah = ObsahObdelniku(StranaA:=A, StranaB:=5)
End Sub
5. Volání funkcí v buňkách MS Excelu
• Zápis do buňky
= Funkce([Arg1][; Arg2][; 3])
– Funkce může pouze vypočítat hodnotu - nesmí provádět
změnu formátování buňky nebo libovolnou modifikaci dat.
– Argumenty se uvádějí pozičně podle definice funkce,
– oddělují se středníkem a jsou vždy v závorkách.
6. Ladění funkcí
• Při volání z buněk
– Ladění se zahájí prostřednictvím zarážky na hlavičce funkce
a vložením do listu nebo vyvoláním přepočtu sešitu popřípadě
listu (F9, Shift + F9).
• Při volání v kódu
– Step Into (F8) krok vnoření do, ladění pokračuje v těle funkce.
– Step Over (Shift + F8) krok vykoná funkci jako jeden příkaz, do
funkce se vnoří pouze při vzniku chyby nebo existenci zarážky.
– Step Out (Ctrl + Shift + F8) Provede dokončení a vyskočení
z právě krokované funkce a pozastaví se na následujícím příkazu.
– Okno Call Stack zobrazuje kaskádu volání funkcí a umožňuje
zobrazit místo odkud byla funkce volána.
8. Subrutiny s argumenty
• Definice
Sub Název([Argument As Typ][, …])
[Kód subrutiny]
End Sub
– Subrutiny nemají návratovou hodnotu, tudíž název nemá
druhotný význam a neuvádí se jeho datový typ.
• Volání
Název [Arg1][, Arg2][, 3]
– Argumenty se uvádějí pozičně nebo podle názvu a oddělují
se čárkou stejně jako u funkcí.
– Argumenty se nesmí uzavírat do závorek.
Sub ZamenitHodnoty(A As Double, B As Double)
Dim Pomocna As Double
Pomocna = A Sub Main()
A = B Dim Hodnota1 As Double, Hodnota2 As Double
B = Pomocna Hodnota1 = 11.1
End Sub Hodnota2 = 22.2
ZamenitHodnoty Hodnota1, Hodnota2
MsgBox "Hodnota 1 = " & Hodnota1 & vbNewLine & _
"Hodnota 2 = " & Hodnota2
End Sub
9. Globální proměnné
• Globální proměnné
– Syntaxe: Private|Public Název As Typ
– Jsou deklarovány mimo těla funkcí a subrutin.
– Private jsou sdíleny všemi subrutinami a funkcemi téhož
modulu.
– Public jsou sdíleny všemi subrutinami a funkcemi celého
projektu.
Option Explicit
Private Hodnota1 As Double, Hodnota2 As Double
Sub ZamenitHodnoty()
Dim Pomocna As Double
Pomocna = Hodnota1
Hodnota1 = Hodnota2
Hodnota2 = Pomocna
End Sub
Sub Main()
Hodnota1 = 11.1
Hodnota2 = 22.2
ZamenitHodnoty
MsgBox "Hodnota 1 = " & Hodnota1 & vbNewLine & _
"Hodnota 2 = " & Hodnota2
End Sub
10. Obousměrné předávání argumentů
• Argumenty funkcí/subrutin se mohou předávat dvěma
způsoby: hodnotou (ByVal) nebo odkazem (ByRef):
– ByVal funkce/subrutina obdrží kopii hodnoty => změna
neovlivní hodnotu původní proměnné
– ByRef (implicitní) funkce/subrutina si zapůjčí předávané
proměnné => změna hodnoty ovlivní původní proměnnou.
Sub ZamenitHodnoty(ByVal A As Double, _ Sub ZamenitHodnoty(ByRef A As Double, _
ByVal B As Double) ByRef B As Double)
Dim Pomocna As Double Dim Pomocna As Double
Pomocna = A Pomocna = A
A = B A = B
B = Pomocna B = Pomocna
End Sub End Sub
Sub Main()
Dim Pomocna As Double
Dim Hodnota1 As Double, Hodnota2 As Double
Hodnota1 = 11.1
Hodnota2 = 22.2
ZamenitHodnoty Hodnota1, Hodnota2
MsgBox "Hodnota 1 = " & Hodnota1 & vbNewLine & _
"Hodnota 2 = " & Hodnota2
End Sub
11. Buňka a oblast jako argument funkce
• V prostředí MS Excelu je často požadováno
do funkcí předávat buňky nebo oblasti buněk
• Vše zajistí datový typ Range:
– Excel automaticky předá buňku nebo skupinu buněk.
– Funkce tak obdrží buď kolekci nebo jedinou buňku –
podle zadání uživatele. To lze rozpoznat přes vlastnost
Count. Například Oblast.Count.
– Pro procházení oblasti se vždy volí cyklus For Each
Function PocetSudychHodnot(Oblast As Range) As Long
Dim B As Range
Dim Pocet As Long
For Each B In Oblast
If B.Value Mod 2 = 0 Then Pocet = Pocet + 1
Next
PocetSudychHodnot = Pocet
End Function
13. Matematické funkce
• Standardní matematické funkce
Abs(double)- abslolutní hodnota
Exp(double)- ex
Rnd(double)- náhodné číslo 0..1
Sgn(double)- znaménko čísla (0/-1)
Sqr(double)- druhá odmocnina
Log(double)- přirozený logaritmus
• Goniometrické funkce
Atn(double)
Sin(double)
Tan(double)
Cos(double)
• Speciální funkce
Fix(double)- vrací celou část reálného čísla
Int(double)- zaokrouhluje dolů
• Určení hodnoty π
π = 4*Atn(1)
Log10 = Log(X) / Log(10#)
RndAB = Int((B – A + 1) * Rnd + A)
14. Řetězcové funkce
• Porovnání řetězců
StrComp(string1, string2[, compare])
• Transformace řetězců
StrConv(string, conversion, LCID)
• Změna velikosti písma řetězce na malé a velké,
LCase(string); Ucase(string)
• Vytvoření řetězce opakováním mezer a znaků
Space(number); String(number, character)
• Délka řetězce
Len(string)
• Formátovaný převod hodnot na řetězce
Format(expression[, format])
• Vyhledání řetězce v řetězci
InStr([start,] string1, string2 [,compare])
InstrRev(strcheck, strmatch[, start[, compare]])
• Vystřižení řetězce zleva, zprava a z libovolné pozice
Left(string, length); Right(string, length);
Mid(string, start[, length])
• Ořezání řetězce od mezer zleva, zprava a z obou stran
LTrim(string);RTrim(string);Trim(string)
• Záměna řetězce v řetězci
Replace(expression, find, replace)
15. Příklady řetězcových funkcí
Sub Main()
Dim CeleJmeno As String, Jmeno As String, Prijmeni As String
CeleJmeno = InputBox("Zadej jméno a příjmení (na velikosti písmen nezáleží)")
CeleJmeno = Trim(CeleJmeno) 'Odstranění mezer na začátku a konci
Dim i As Integer
i = InStrRev(CeleJmeno, " ") 'Vyhledání mezery mezi slovy
If i > 0 Then
Jmeno = Left(CeleJmeno, i - 1) 'První slovo zleva
'První písmeno na velké, zbytek na malé
Jmeno = UCase(Left(Trim(Jmeno), 1)) & LCase(Mid(Trim(Jmeno), 2))
Prijmeni = Mid(CeleJmeno, i + 1)
Prijmeni = UCase(Left(Trim(Prijmeni), 1)) & LCase(Mid(Trim(Prijmeni), 2))
End If
CeleJmeno = Jmeno & " " & Prijmeni
MsgBox "Jméno: " & Jmeno & vbNewLine & _
"Příjmení: " & Prijmeni, , CeleJmeno
End Sub
16. Datumové funkce
• Aktuální (systémový) datum, čas a okamžik
Date(); Time(); Now()
• Datum po přičtení časových jednotek
DateAdd(interval, number, date)
• Zjištění kolik časových jednotek uplynulo mezi daty
DateDiff(interval, date1, date2)
• Číselné vyjádření části data (dne, týdne, měsíce, roku apod.)
DatePart(interval, date)
• Datum na základě čísla roku, měsíce a dne
DateSerial(year, month, day)
• Číselně vyjádření kalendářního dne, roku, měsíce
Day(date),Year(date), Month(date)
Sub DatumCas()
Dim Dnes As Date, Nyni As Date, ZaTyden As Date, Za12hodin As Date
Dim PoradovyDenTydnu As Integer, PocetHodinOdZacatkuRoku As Integer
Dnes = Date: Nyni = Now
ZaTyden = DateAdd("ww", 1, Date)
Za12hodin = DateAdd("h", 12, Now)
PoradovyDenTydnu = DatePart("w", Date, vbMonday)
PocetHodinOdZacatkuRoku = DateDiff("h", DateSerial(Year(Date), 1, 1), Now)
MsgBox "Dnes je " & Format(Dnes, "dddd - dd.mm.yyyy") & _
" to je " & PoradovyDenTydnu & ". den v týdnu" & vbNewLine & _
"Za týden bude " & Format(ZaTyden, "dddd - dd.mm.yyyy") & vbNewLine & _
"Za 12 hodin bude " & Format(Za12hodin, "dddd - dd.mm.yyyy HH:NN") & vbNewLine & _
"Počet uplynulých hodin od začátku roku " & PocetHodinOdZacatkuRoku, , Nyni
End Sub
17. Souborové funkce a příkazy
• Název aktuální složky a její nastavení, změna jednotky
CurDir[(drive)]; ChDir path; ChDrive drive
• Jméno souboru nebo složky vyhovující masce
Dir[(pathname[, attributes])]
• Velikost souboru v bajtech
FileLen(pathname)
• Datum a čas aktualizace souboru
FileDateTime(pathname)
• Atributy souboru
GetAttr(pathname); SetAttr pathname, attributes
• Přejmenování souboru
Name oldpathname As newpathname
• Smazání souboru nebo složky
RmDir path
• Kopírování souboru
FileCopy source, destination
• Otevření souboru
Open pathname For mode As [#]filenumber
• Uzavření souboru a další
Close [filenumberlist]
18. Příklady souborových funkcí
Sub SeznamSouboru()
Dim AdresarMaska As String
Dim Soubor As String
Dim SeznamSouboru As String
'Určení adresáře a masky souborů
AdresarMaska = CurDir() & "*.xls?"
AdresarMaska = InputBox("Prohledávaný adresář a maska souborů", _
"Adresář", AdresarMaska)
Soubor = Dir(AdresarMaska) 'Nalezení prvního souboru
Do While Soubor <> ""
If Len(SeznamSouboru) > 0 Then
SeznamSouboru = SeznamSouboru & vbCrLf & Soubor & _
" (" & FileDateTime(Soubor) & ")"
Else
SeznamSouboru = Soubor & " (" & FileDateTime(Soubor) & ")"
End If
Soubor = Dir() 'Nalezení dalšího (podruhé se umístění neuvádí)
Loop
MsgBox SeznamSouboru, vbInformation, AdresarMaska
End Sub
19. Konverzní funkce
Cbool(value) – převod na Booolean
CByte(value) – převod na Byte
CCur(value) – převod na Currency
CDate(value) – převod na Date
CDec(value) – převod na Decimal
CDbl(value) – převod na Double
CInt(value) – převod na Integer
CLng(value) – převod na Long
CSng(value) – převod na Single
CStr(value) – převod na String
CVar(value) – převod na Variant
Chr(charcode) – na základě ASCI kódu generuje znak
Asc(char) – na základě znaku generuje ASCI kód
Hex(number) – šestnáctková reprezentace hodnoty
Oct(number) – osmičková reprezentace hodnoty
20. Výběr dalších funkcí
• Zpřístupnění funkcí MS Excelu ve VBA
Application.WorksheetFunction
Například: Application.WorksheetFunction.Pi()
• Funkce pro práci s registry Windows
GetSetting(appname,section,key[,default]) – Vrátí záznam z registru
SaveSetting appname, section, key, setting – Uloží záznam do registru
GetAllSetting(appname, section) – Vrátí pole záznamů z registru
DeleteSetting appname, section[, key] – Smaže záznam z registru
• Funkce pro práci s procesy
Shell(pathname[,windowstyle]) – Provede příkaz systému (spustí aplikaci)
SendKeys string[, wait] – Provede simulaci stisku kláves
CreateObject(class,[servername]) – Spustí DCOM aplikaci
GetObject([pathname] [, class]) – Připojí se k aktivní DCOM aplikaci
• Finanční funkce
FV(Úrok, PočetPeriod, VýšeVkladů[, PočátečníVklad[, typ]]) – Jaká
bude částka na účtu za určité období při známem úroku a pravidelných vkladech.
Další finanční funkce
FV(…); DDB(…); IPmt();MIRR(…);Nper(…);NPV(…);Pmt(…)
PPmt(…);PV(…);Rate(…);SLN(…); SYD(…)
• Další funkce
RGB(red, green, blue) – Vytvoří hodnotu reprezentující barvu v RGB
DoEvents() – odevzdá časové kvantum vlákna – vhodné při čekání na událost
21. ??? kontrolní otázky ???
• Existují nějaká pravidla/omezení pro názvy funkcí?
• Kdy se argumenty volaného podprogramu uzavírají do
závorek a kdy ne?
• Jaký je oddělovač argumentů funkcí v buňce Excelu?
• Jaký je rozdíl mezi pozičním a jmenným předáváním
argumentů funkcí/subrutin?
• Jaký je rozdíl mezi globální prom. Public a Private?
• Jak zahájit ladění funkce volané v buňce MS Excelu?
• Jak lze funkci předat oblast buněk?
• Jaký je rozdíl mezi argumentem typu ByRef a ByVal?
• Jak zjistíme délku textu v proměnné Název?
• V proměnné Jméno máme celé jméno osoby – jak z něj
získat pouze příjmení velkými písmeny?
• Jak snadno odstranit všechny mezery v textu?
• Jakým způsobem zjistíme datum, které bude za 14 dní?
22. 352 - Katedra automatizační techniky a řízení
Ing. David Fojtík, Ph.D.
A922, kl. 4193