SlideShare uma empresa Scribd logo
1 de 22
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á 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
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
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.
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.
Subrutiny
a argumenty
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
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
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
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
Systémové funkce VBA
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)
Ř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)
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
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
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]
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
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
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
??? 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í?
352 - Katedra automatizační techniky a řízení




Ing. David Fojtík, Ph.D.
     A922, kl. 4193

Mais conteúdo relacionado

Mais procurados

KST/ICSHP - 3. a 4. přednáška
KST/ICSHP - 3. a 4. přednáškaKST/ICSHP - 3. a 4. přednáška
KST/ICSHP - 3. a 4. přednáškaJan Hřídel
 
Pokročilé techniky programování .NET a C#
Pokročilé techniky programování .NET a C#Pokročilé techniky programování .NET a C#
Pokročilé techniky programování .NET a C#Jan Hřídel
 
KST/ICSHP - 2. přednáška
KST/ICSHP - 2. přednáškaKST/ICSHP - 2. přednáška
KST/ICSHP - 2. přednáškaJan Hřídel
 
KST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáškaKST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáškaJan Hřídel
 
KST/ICSHP - 5. a 6. přednáška
KST/ICSHP - 5. a 6. přednáškaKST/ICSHP - 5. a 6. přednáška
KST/ICSHP - 5. a 6. přednáškaJan Hřídel
 
Databazove systemy5
Databazove systemy5Databazove systemy5
Databazove systemy5olc_user
 
Java – Annotations
Java – AnnotationsJava – Annotations
Java – AnnotationsMartin Majlis
 

Mais procurados (9)

KST/ICSHP - 3. a 4. přednáška
KST/ICSHP - 3. a 4. přednáškaKST/ICSHP - 3. a 4. přednáška
KST/ICSHP - 3. a 4. přednáška
 
Pokročilé techniky programování .NET a C#
Pokročilé techniky programování .NET a C#Pokročilé techniky programování .NET a C#
Pokročilé techniky programování .NET a C#
 
KST/ICSHP - 2. přednáška
KST/ICSHP - 2. přednáškaKST/ICSHP - 2. přednáška
KST/ICSHP - 2. přednáška
 
KST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáškaKST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáška
 
KST/ICSHP - 5. a 6. přednáška
KST/ICSHP - 5. a 6. přednáškaKST/ICSHP - 5. a 6. přednáška
KST/ICSHP - 5. a 6. přednáška
 
Linq
LinqLinq
Linq
 
Databazove systemy5
Databazove systemy5Databazove systemy5
Databazove systemy5
 
Java – Annotations
Java – AnnotationsJava – Annotations
Java – Annotations
 
PR2021
PR2021PR2021
PR2021
 

Mais de 352

Ověření dat, maticové funkce, kontingenční tabulky
Ověření dat, maticové funkce, kontingenční tabulkyOvěření dat, maticové funkce, kontingenční tabulky
Ověření dat, maticové funkce, kontingenční tabulky352
 
Grafy, zobrazení, vzorce
Grafy, zobrazení, vzorceGrafy, zobrazení, vzorce
Grafy, zobrazení, vzorce352
 
Práce v prostředí aplikace MS Excel
Práce v prostředí aplikace MS ExcelPráce v prostředí aplikace MS Excel
Práce v prostředí aplikace MS Excel352
 
Tv 13
Tv 13Tv 13
Tv 13352
 
TV kombinovane studium
TV kombinovane studiumTV kombinovane studium
TV kombinovane studium352
 
Tv 04 2011
Tv 04 2011Tv 04 2011
Tv 04 2011352
 
TV 02 2011
TV 02 2011TV 02 2011
TV 02 2011352
 

Mais de 352 (7)

Ověření dat, maticové funkce, kontingenční tabulky
Ověření dat, maticové funkce, kontingenční tabulkyOvěření dat, maticové funkce, kontingenční tabulky
Ověření dat, maticové funkce, kontingenční tabulky
 
Grafy, zobrazení, vzorce
Grafy, zobrazení, vzorceGrafy, zobrazení, vzorce
Grafy, zobrazení, vzorce
 
Práce v prostředí aplikace MS Excel
Práce v prostředí aplikace MS ExcelPráce v prostředí aplikace MS Excel
Práce v prostředí aplikace MS Excel
 
Tv 13
Tv 13Tv 13
Tv 13
 
TV kombinovane studium
TV kombinovane studiumTV kombinovane studium
TV kombinovane studium
 
Tv 04 2011
Tv 04 2011Tv 04 2011
Tv 04 2011
 
TV 02 2011
TV 02 2011TV 02 2011
TV 02 2011
 

Tv 09

  • 1. 352 - Katedra automatizační techniky a řízení Technické výpočty Ing. David Fojtík, Ph.D. A922, kl. 4193
  • 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