O jazyce Visual Basic -2- Aplikační software na PC Visual Basic for Applications RNDr. Jan Preclík preclik@ksvi.mff.cuni.cz Nerozlišuje malá/velká písmena Komentář: text za znakem ' (apostrof) až do konce řádku Přiřazovací příkaz = Jeden příkaz na jednom řádku pokračovací řádky, řádek končí dvojicí znaků mezera+podtržítko ActiveCell.FormulaR1C1 = _ "*" -3- -4- Podmíněný příkaz Podmíněný příkaz vnořování Neúplný nebo Úplný nebo If <podmínka> Then <příkaz> If <podmínka> Then End If If <podmínka> Then <příkaz> Else <příkaz> If <podmínka> Then Else End If If <podmínka> Then ElseIf <podmínka> Then Else End If Podmíněný příkaz Select Case Cyklus s předem známým počtem průchodů -5- -6- SelectCase <testovaný výraz> Case <seznam možností 1> 'odděl."," <příkazy 1> Case <seznam možností 2> <příkazy 2>... Case Else End Select SelectCase Vstup Case 1, 5 Vystup = 11 Case 3, 8 Vystup = 33 Case Else Vystup = 99 End Select For i=<počátek> To <konec> [Step <krok>] Next i For Each <prvek> In <skupina_prvků> Next <prvek> 1
-7- -8- Cyklus s podmínkou na začátku Cyklus s podmínkou na konci While <podmínka> WEnd Do Loop Until <podmínka> Do While <podmínka> ' stejné jako While..Wend Loop Do Until <podmínka> ' dokud neplatí podmínka Loop Do Loop While <podmínka> -9- - 10 - Proměnné ve VB Jednoduché datové typy Proměnné není nutné deklarovat Vynucení deklarací Option Explicit Deklarace klíčové slovo Dim Dim <proměnná> As <typ> Lze je deklarovat v podstatě kdekoliv (tj. nejen na začátku bloku) Pokud proměnná nemá uveden typ, je typu Variant Datový typ Boolean Integer Long Rozsah hodnot True, False -32 768.. 32 767-2 147 483 648.. 2 147 483 647 Paměťová náročnost 2 byty 2 byty 4 byty Dim A, B As Integer 'A je typu Variant, B je typu Integer - 11 - - 12 - Jednoduché datové typy Jednoduché datové typy Datový typ Single Double Currency Rozsah hodnot -3,042823*10 38.. 1,401298 *10-45 0 1,401298 *10-45.. 3,042823*10 38-1,79769313486*10 308.. 4,94065645841 *10-324 0 4,94065645841 *10-324.. 1,79769313486*10 308-922 337 203 687 477,5808.. 922 337 203 687 477,5808 Pam. náročn. 4 byty 8 bytů 8 bytů Datový typ Date Object String Variant Rozsah hodnot 1.1.100..31.12.9999 ukazatel na objekt záleží na operačním systému obecný typ, může reprezentovat libovolný VBA typ Paměťová náročnost 8 bytů 4 byty 1byte na 1znak 16 bytů+1byte na 1 znak (pokud hodnota obsahuje řetězec) 2
Proměnné ve VB rozsah platnosti - 13 - Deklarace konstant - 14 - <platnost>/dim <proměnná> As <typ> Modifikátory platnosti: Dim (resp. na úrovni modulu i Private) platnost v podprogramu nebo v modulu Public deklarace na úrovni modulu, platnost v celém projektu Static platnost pouze v podprogramu, ale uchová si hodnotu i do příštího spuštění Modifikátory Private, Public nelze použít v podprogramu Dim Soukroma As Integer Private Soukroma_2 As Integer Public Verejna As Integer [<platnost>] Const <jméno> As <typ> = <hodnota> Const Max As Integer = 15 Deklarace vlastních typů - 15 - Pole statické - 16 - Deklarace na úrovni modulu (ne v podprogramu!) [<platnost>] Type <jméno> <položka1> As <typ> <položka2> As <typ>... End Type Přístup k položkám tečková notace Private Type TOsoba Jmeno As String Vek As Integer End Type Dim Ja As TOsoba Ja.Jmeno = "Jan Preclik" Ja.Vek = 27 Deklarace pole Dim Pole(15) As Integer Dim Matice(10,20) As Boolean Indexy polí od 0 (default) nebo 1 Option Base 0 => Pole má 16 prvků nebo Option Base 1 => Pole má 15 prvků Indexy z daného intervalu Dim Policko(5 To 20) As Integer Pole dynamické - 17 - Objekty - 18 - Deklarace pole Dim Dynamicke_Pole() As Integer Velikost pole nastavuji před prvním použitím ReDim Dynamicke_Pole(10) Dynamicke_Pole(10) = 1 'lze Dynamicke_Pole(15) = 1 'chyba ReDim Dynamicke_Pole(12 To 18) Dynamicke_Pole(15) = 1 'lze Na rozdíl od jednoduchých proměnných je nutno pro přiřazení použít příkaz Set Set <prom.typu objekt> = <objekt> Dim Oblast As Object... Set Oblast = Range("A1:B3") 3
Podprogramy - 19 - Podprogramy Procedury [<platnost>] [Static] Sub <jméno> [(param.)] <příkazy v těle> Lze je nahrát makrokamerou Sub Ukazka() 'pro Excel 'do aktivní buňky přiřadí hodnotu 13 ActiveCell.FormulaR1C1 = "13" Funkce [<platnost> [Static] Function <jméno> [(param.)] [As <typ funkce>] <příkazy v těle> <jméno> = <hodnota fce> [Exit Function] Nelze je nahrát Lze je použít např. v buňce na listu Excelu Function Soucet(A As Integer, B As _ Integer) As Integer Soucet = A + B Procedur Volání podprogramů Bez parametrů <jméno proc.> S parametry: <jméno proc.> <hodn.par1>, <hodn.par2>,... Funkcí Parametry se píší do závorek pouze pokud má funkce vracet hodnotu Není nutno dodržovat pořadí parametrů: <jméno proc.> <název par1>:=<hodn.par1>,... -21 - Volání podprogramů Sub Bez_parametru() MsgBox "ahoj" Sub S_parametry(Par1 As String, Par2 As String) MsgBox Par1 + Par2 Function Vynasob(A As Integer, B As Integer) _ As Integer Vynasob = A * B Bez_parametru S_parametry "mff ", "uk" S_parametry Par2:="uk", Par1:="mff " Vynasob 4, 5 'lze, ale nic to nevrátí V = Vynasob(4, 5) 'do V dosadí 20 Předávání parametrů Předávání parametrů -20- -22- -23- -24- Odkazem Standardně, případně klíčové slovo ByRef Odkazem lze předat i konstantu!?!?!?!?!?! (její hodnota se ale naštěstí nezmění ) Hodnotou Nutno explicitně specifikovat klíčovým slovem ByVal Sub Soucet(ByVal A As Integer, ByVal B As _ Integer, ByRef Vysledek As Integer) Vysledek = A + B Const K As Integer = 7 Dim V As Integer Soucet 2, 3, V 'do V dosadí 5 Soucet 2, 3, 4 'lze, nic nedosadí nikam Soucet 2, 3, K 'lze, hodnota K se nezmění 4
Nepovinné parametry Nepovinné parametry Klíčové slovo Optional Musí být typu Variant Při volání zbytek parametrů mohu vynechat Nepovinné parametry musí být až na konci seznamu parametrů Function Soucet_rady(Pocatek As Integer, Konec _ As Integer, Optional Krok = 1) As Integer Dim I As Integer, Soucet As Integer Soucet = 0 For I = Pocatek To Konec Step Krok Soucet = Soucet + I Next I Soucet_rady = Soucet MsgBox Soucet_rady(1, 5, 1) 'vypíše 15 MsgBox Soucet_rady(1, 5) 'vypíše také 15 Nepovinné parametry Function Soucet_rady(Pocatek As Integer, Konec _ As Integer, Optional Krok) As Integer Function Soucet_rady(Pocatek As Integer, Konec _ As DimInteger, I As Integer, Optional Soucet Krok As= 1) Integer As Integer DimIfI As IsMissing(Krok) Integer, Soucet Then AsKrok Integer = 1 Soucet = 0 For I = Pocatek To Konec Step Krok Soucet = Soucet + I Next I Soucet_rady = Soucet MsgBox Soucet_rady(1, 5, 1) 'vypíše 15 MsgBox Soucet_rady(1, 5) 'vypíše také 15 Fce VBA matematické Abs(výraz) absolutní hodnota výrazu Fix(výraz) celá část Int(výraz) nejbližší nižší celé číslo, pro záporná čísla se liší od Fix() Sgn(výraz) signum (znaménko +1, 0, -1) Sqr(výraz) druhá odmocnina Exp(výraz) e umocněno na výraz Log(výraz) přirozený logaritmus Cos(výraz), Sin(výraz), Tan(výraz) Atn(výraz) arcustangens Rnd(typ) náhodné číslo z intervalu <0;1) Randomize(seed) inicializuje generátor pseudonáhodných čísel -25- -26- -27- -28- -29- -30- & (binární operátor) spojení dvou řetězců Len(řetězec) vrací počet znaků řetězce LCase(řetězcový_výraz): String převede řetězec na řetězec zapsaný malými písmeny UCase(řetězcový_výraz): String převede řetězec na řetězec zapsaný velkými písmeny Format(výraz, formát): String výraz je zformátován podle parametru formát, což je uživatelsky definovaný formát Space(n): String vytvoří řetězec n mezer String(n, z): String vytvoří řetězec délky n opakováním prvního znaku ze z RTrim(řetězcový_výraz): String vrací kopii řetězce bez koncových mezer Trim(řetězcový_výraz): String vrací kopii řetězce bez úvodních a koncových mezer InStr(start, S1, S2, typ porovnání): Boolean zjistí zda řetězec S2 se vyskytuje v řetězci S1, prohledávání v řetězci S1 začíná na pozici start Mid(řetězcový_výraz, start, délka): String vrací podřetězec zadaného řetězce začínající na pozici start o délce délka 5
-31 - Porovnání řetězců Operátory =, <>, <, >, <=, >= Operátor Like Fce StrComp(řet1, řet2, [volba]) řet1 = řet2 => 0 řet1 < řet2 => -1 řet1 > řet2 => 1 Operátor Like? * # [charlist] [!charlist] [A-C] lib.jednoduchý znak žádný znak nebo lib. počet znaků číslice (0 9). lib. jednoduchý znak v seznamu lib. jednoduchý znak, který není v seznamu seznam A, B, C If Not(Retezec Like "*[!0-9]*") Then 'obsahuje Retezec pouze číslice? Left(řetězcový_výraz, n): String vrací prvních n znaků od začátku řetězce Right(řetězcový_výraz, n): String vrací prvních n znaků od konce řetězce Chr(kód_znaku): String vrací řetězec obsahující znak odpovídající kódu znaku Asc(string): Integer vrací kód prvního znaku řetězce AscW(string): Integer vrací kód Unicode prvního znaku řetězce Str(výraz): String převede číslo nebo číselný výraz na řetězec Val(řetězcový výraz): Double převede řetězec nebo jeho část na číslo přípustný oddělovač desetin pouze desetinná tečka!!! Fce VBA konverzní Fce VBA datum a čas -32- -33- -34- -35- -36- Převede výraz na uvedený typ CBool(výraz) CByte(výraz) CCur(výraz) CDate(výraz) CDbl(výraz) CDec(výraz) CInt(výraz) CLng(výraz) CSng(výraz) CVar(výraz) CStr(výraz) Date(): Variant vrátí aktuální systémové datum Time(): Variant vrátí aktuální systémový čas Now(): Variant vrátí aktuální systémové datum a čas 6
Fce VBA datum a čas Fce VBA datum a čas Day(datum) z datumu určí pořadí dne v měsíci, číslo 1-31 Weekday(datum) z datumu určí pořadí dne v týdnu, počínaje nedělí, číslo 1-7 analogicky Month, Year Second(čas) číslo 0-59, představující počet sekund vuvedeném časovém údaji analogicky Minute, Hour DateSerial(rok, měsíc, den): Date vrátí hodnotu odpovídající zadanému datumu TimeSerial(hodina, minuta, sekunda): Date vrátí hodnotu odpovídající zadanému času DateValue(řetězec): Date řetězec musí mít tvar platného datumu, pak vrátí odpovídající hodnotu typu Date TimeValue(řetězec): Date řetězec musí mít tvar platného časového údaje, pak vrátí odpovídající hodnotu typu Date Fce VBA kontroly typu -37- -38- -39- TypeName(proměnná): string vrací název typu proměnné IsDate(výraz): boolean říká zda výraz může být převeden na datum IsEmpty(proměnná): boolean zjišťuje zda proměnná je inicializovaná nebo zda ji nebyla přiřazena hodnota Empty 7