352 - Katedra automatizační         techniky a řízeníTechnické výpočty   Ing. David Fojtík, Ph.D.        A922, kl. 4193
Funkce
Definice Funkcí• Syntaxe  Function Název([Argument As Typ][, …]) As TypFunkce    [Kód funkce]    Název = [návratová hodnot...
Volání funkcí v kódu VB• Pozičně zadané argumenty  Dim Hodnota As Typ, Arg1 As Typ, Arg2 As Typ  Hodnota = Funkce([Arg1][,...
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 - ...
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 ...
Subrutinya argumenty
Subrutiny s argumenty   • Definice       Sub Název([Argument As Typ][, …])         [Kód subrutiny]       End Sub       – S...
Globální proměnné• Globální proměnné  – Syntaxe: Private|Public Název As Typ  – Jsou deklarovány mimo těla funkcí a subrut...
Obousměrné předávání argumentů   • Argumenty funkcí/subrutin se mohou předávat dvěma      způsoby: hodnotou (ByVal) nebo o...
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ě...
Systémové funkce VBA
Matematické funkce• Standardní matematické funkce  Abs(double)-   abslolutní hodnota  Exp(double)-   ex  Rnd(double)-   ná...
Řetězcové funkce• Porovnání řetězců  StrComp(string1, string2[, compare])• Transformace řetězců  StrConv(string, conversio...
Příklady řetězcových funkcíSub Main()  Dim CeleJmeno As String, Jmeno As String, Prijmeni As String  CeleJmeno = InputBox(...
Datumové funkce • Aktuální (systémový) datum, čas a okamžik   Date(); Time(); Now() • Datum po přičtení časových jednotek ...
Souborové funkce a příkazy• Název aktuální složky a její nastavení, změna jednotky  CurDir[(drive)]; ChDir path; ChDrive d...
Příklady souborových funkcíSub SeznamSouboru()    Dim AdresarMaska As String    Dim Soubor As String    Dim SeznamSouboru ...
Konverzní funkceCbool(value) – převod na BoooleanCByte(value) – převod na ByteCCur(value) – převod na CurrencyCDate(value)...
Výběr dalších funkcí• Zpřístupnění funkcí MS Excelu ve VBA  Application.WorksheetFunction  Například: Application.Workshee...
??? kontrolní otázky ???• Existují nějaká pravidla/omezení pro názvy funkcí?• Kdy se argumenty volaného podprogramu uzavír...
352 - Katedra automatizační techniky a řízeníIng. David Fojtík, Ph.D.     A922, kl. 4193
Upcoming SlideShare
Loading in...5
×

Tv 09

2,635
-1

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,635
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Tv 09

  1. 1. 352 - Katedra automatizační techniky a řízeníTechnické výpočty Ing. David Fojtík, Ph.D. A922, kl. 4193
  2. 2. Funkce
  3. 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. 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. 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. 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.
  7. 7. Subrutinya argumenty
  8. 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.1End Sub Hodnota2 = 22.2 ZamenitHodnoty Hodnota1, Hodnota2 MsgBox "Hodnota 1 = " & Hodnota1 & vbNewLine & _ "Hodnota 2 = " & Hodnota2 End Sub
  9. 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. 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 = PomocnaEnd 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. 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
  12. 12. Systémové funkce VBA
  13. 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. 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. 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, , CeleJmenoEnd Sub
  16. 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, , NyniEnd Sub
  17. 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. 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, AdresarMaskaEnd Sub
  19. 19. Konverzní funkceCbool(value) – převod na BoooleanCByte(value) – převod na ByteCCur(value) – převod na CurrencyCDate(value) – převod na DateCDec(value) – převod na DecimalCDbl(value) – převod na DoubleCInt(value) – převod na IntegerCLng(value) – převod na LongCSng(value) – převod na SingleCStr(value) – převod na StringCVar(value) – převod na VariantChr(charcode) – na základě ASCI kódu generuje znakAsc(char) – na základě znaku generuje ASCI kódHex(number) – šestnáctková reprezentace hodnotyOct(number) – osmičková reprezentace hodnoty
  20. 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. 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. 22. 352 - Katedra automatizační techniky a řízeníIng. David Fojtík, Ph.D. A922, kl. 4193

×