VYSOKÁ ŠKOLA BÁŇSKÁ - TECHNICKÁ UNIVERZITA OSTRAVA

Základy MS Basic

Doprovodný text pro distanční výuku předmětu Programování

doc. Dr. Vladimír Homola, Ph.D.

 

 

 

 

 

Ostrava Březen 2023

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Úvod - předpokládané znalosti

U posluchačů se předpokládá dobrá znalosti těchto pojmů: bit, byte, zápis čísel ve dvojkové soustavě a operace s nimi, zápis čísel v šestnáctkové soustavě a operace s nimi, little Endians, big Endians. Dále se předpokládá znalost principů programování ve vyšších programovacích jazycích, pojmů syntaxe a sémantika, a pojmů překladač a interpret. Tyto pojmy jsou detailněji rozvedeny v samostatné publikaci Základy programování.

Jazyk Basic

Programovací jazyk Basic se od svého vzniku pro potřeby tehdejších prvních mikropočítačů sice podstatně změnil, ale pořád si zachovává charakter přehledného, lehce naučitelného jazyka. Jeho zápis je, pravda, trochu rozvláčnější. Pokud slyšíme od rádoby „skutečných“ programátorů charakteristiku Basicu jako „jazyka pro důchodce a ženy v domácnosti", pak je to spíše pochvala jeho jednoduchosti a absence neprůzračných konstrukcí.

Dnes lze u něj vidět totožné vlastnosti jako u jiných, šířeji používaných jazyků - především množinu základních jazykových konstrukcí, množinu datových typů, orientaci na objektové programování, součinnost se systémovými nástroji využitím systémových knihoven a další.

První jazykově stabilní verze byla realizována uvedením MS Visual Studia 6. Stejná verze jazyka pak byla použita v nově vytvořeném interpretu tohoto jazyka ve formě virtuálního stroje. Dalším počinem Microsoftu bylo uvolnění samostatné aplikace, kterou může spustit víceméně kterýkoliv jiný běžící program jakožto svého „hosta“. Tato aplikace obsahuje kompletní vývojářské prostředí (IDE), ve kterém lze připravit text programu a uchovat ho v hostitelském programu, předkompilovat text programu do mezikódu (též pseudokódu) a předložit ho virtuálnímu stroji k vykonání. Zmíněná aplikace je dostupná z hostitelských programů většinou jako Visual Basic Editor (VBE).

Protože tento VBE dramaticky rozšiřuje možnosti hostitelského programu s minimem námahy programátora, lze dnes vidět možnost použití VBE téměř u všech programů, které si činí ambice na komerční úspěšnost. Především jde samozřejmě o aplikace samotného Microsoftu (Word, Excel, Access atd.). Ke spuštění je nabízen z prostředí grafických programů (Corel ap.), geostatistických (Surfer) a dalších; za běhu jednoho programu lze doplňovat jeho data z dat formátu zcela jiného typu aplikace. Úsměvný je poznatek z renomované firmy Autodesk: léta jsme v jejím produktu AutoCad programovali v naprosto úžasném, seznamově orientovaném jazyce Lisp označovaném jako AutoLisp. Čas běžel a ejhle - dnes už používáme AutoCad Basic, což je samozřejmě VBA ve VBE.

Čas však běží dál a s novými verzemi vývojářského prostředí MS (především známého Visual Studia obsahující mj. překladače) je vidět především snaha o maximální přiblížení jednotlivých jazyků. To samozřejmě nejde syntakticky, právě svou syntaxí je každý jazyk tím čím je. Jde ovšem změnit to, co nepodléhá syntaxi a minimálně se dotkne sémantiky: jde změnit samotný proces tvorby výsledné spustitelné aplikace. Princip je známý a používaný už léta, jenže jeho realizace byla různými autory různých firem různá. V dostatečně velké firmě, jakou je MS, to šlo sjednotit: překladače (různých jazyků, a tedy různých autorů) generují nikoliv přímo instrukce výsledné spustitelné aplikace, ale firmou přesně definovaný jednotný „mezikód“. Teprve v dalším kroku se celkem jednoduchým „překladačem“ převede tento mezikód do tvaru skutečně spustitelné aplikace. Tento postup je - zvláště při tvorbě rozsáhlých aplikací - výhodný:

 

 

Na druhé straně zmíněné přibližování jazyků ve vyšších verzích Visual Studia přeci jen nese riziko zásahů do jazyků jako takových. V případě jazyku Basic jsou syntaktické změny minimální, většinou automatizovaně řešitelné. Podstatnější jsou změny sémantické, tu a tam mající za důsledek změnu logiky dílčích částí algoritmu (a tedy nutnost přeprogramování). Tou nejméně příjemnou je povinnost indexovat všechny dimenze všech polí od nuly (tj. dolní mez = lower bound každé dimenze je povinně nula). Občas pozlobí nové pokrytí všech hardwarových číselných typů (zhruba těch, které umí procesor zpracovat jedinou instrukcí) změnou významu identifikátoru typu. Např. dřívější 2bytový typ integer nově znamená dřívější 4bytový long, naopak nyní long označuje nově 8bytové celé číslo se znaménkem, které dřív pokryto nebylo.

U jiných jazyků takovéto změny většinou moc nevadí; prostě se jednorázově změní text zdrojového programu, znovu přeloží a je to. U jazyku Basic je to však nešikovné, protože Basic ve Studiu doznal hlavně v oblasti objektového programování podstatných a velmi příjemných změn, ovšem Basic v interpretu (tj. ve verzi VBA) je pořád stejný. Pokud třeba naprogramuju pro kolegu podporu pro zpracování jeho dat přímo v jeho sešitu Excelu (tedy pomocí VBE ve VBA jako tzv. „makra“), bude mu všechno v pořádku chodit. Pokud ale mám já jako autor stejné postupy naprogramované v nějaké samostatné aplikaci vytvořené v Basicu ve Studiu, nemůžu bohužel použít obvyklého Ctrl/C + Ctrl/V. Teda můžu, ale často pak nutné úpravy textu pro VBA jsou delší než to udělat úplně znovu.

Opačný postup - zdroj ve VBA uplatněný v programu ve Studiu - je daleko méně problematický, ale zase je škoda nevyužít nových možností Studia.

Připomeňme ještě schematicky rozdíl mezi interpretovaným programem (VBA) a kompilovaným (Visual Studio):

 

 

 

Co se týče vstupního textu psaného v jazyku Basic: je v interpretovaném případě uložen v projektu hostitelské aplikace (v sešitu Excelu, ve výkresu Corelu atd., lze však také importovat resp. exportovat). V kompilovaném případě je vstupní text v samostatných textových souborech umístěných a pojmenovaných dle úvahy programátora (v konvencích tzv. projektu resp. řešení Visual Studia).

Editační prostředí

Editor v Basicu 6 (syntaxe VBA)

Program VBE (Visual Basic Editor) spustí programátor nástroji hostitelské aplikace (Excelu, Wordu, Corelu ...). Je-li touto aplikací některá z aplikací MS Office, pak postupnou aktivací

Hlavní menu Vývojář / Karta Kód / Položka Visual Basic

Ve většině aplikací (nejen MS) spouští VBE rovněž kombinace kláves

ALT + F11

Poznámka 1: Po instalaci MS Office většinou není položka Vývojář v hlavním menu zobrazena. Je nutno použít

Hlavní menu Soubor / Možnosti / Přizpůsobit pás karet

a v pravém seznamu Hlavní karty zaškrtnout položku Vývojář.

Poznámka 2: Spuštěním VBE se aktivním oknem stává jeho návrhové prostředí, ale činnost hostitelské aplikace se neukončuje. Je-li hostitelská aplikace prezentována aktivním formulářem („oknem“), pak lze mezi aplikací a VBE libovolně přepínat. Ukončením VBE dojde k uložení vytvořených nebo upravených komponent ve VBA do otevřeného souboru hostitelské aplikace, ta pokračuje v činnosti, a je možno začít v ní využívat vlastní vytvořenou programovou podporu.

Poznámka 3: Aby se komponenty vytvořené nebo upravené dle předchozí poznámky „neztratily“, nesmí pochopitelně programátor před ukončením hostitelské aplikace zapomenout uložit její otevřený soubor J

Spuštěný VBE je pak vizuálně představován svým grafickým návrhovým prostředím:

 

 

Editor v Basicu 2019 (syntaxe Studio)

Příslušná verze Studia (zde „Visual Studia 2019“) je pro programátora představována vývojářským prostředím (Developer Environment) reprezentované programem devenv.exe ze složky Common7\IDE\. Po jeho spuštění je předložen MDI formulář (Multi-document Interface, lidově zvaný „okno“). Ideální je nakonfigurovat Studio tak, aby po spuštění bylo toto prostředí prázdné - spouštění je pak nejrychlejší. Další popis bude předpokládat právě tento start s prázdným prostředím.

Vlastní práce programátora pak začíná aktivací hlavního menu Soubor. Podle zamýšlené činnosti se pak volí především položka Otevřít projekt nebo Nový projekt (slovo Projekt zahrnuje i Řešení). V případě prací na novém projektu resp. řešení následuje ještě dotaz na upřesnění typu projektu resp. řešení a na jeho umístění v adresářové struktuře programátorova systému.

Po inicializaci projektu resp. řešení je pak Editor vizuálně představován svým grafickým návrhovým prostředím - všimněte si převratné inovace oproti VBE: panely nejsou vlevo, ale vpravo J:

 

 

Práce v editorech

Prostředí editorů je komplexní vývojové prostředí zabezpečující všechny programátory vyžadované funkce. Je tedy rozsáhlé a značně členité; jeho popis přesahuje záměr této úvodní publikace. Proto jen dvě základní akce: přidání nové komponenty a editace dané komponenty.

Ačkoliv pro naznačené činnosti jsou připraveny položky v příslušných menu a pod-menu, je nejjednodušší použít myš v Průzkumníku projektu.

Přidání komponenty

VBE: Pravý klik (rClick) do prázdné spodní části Průzkumníka projektu zobrazí kontextové menu. V něm se volí položka Insert a poté jedna z nabízených možností: Uživatelský formulář (UserForm), Modul (Module) nebo Modul objektové třídy (Class Module).

Visual Studio: Pravý klik (rClick) do prázdné spodní části Průzkumníka projektu při označeném projektu zobrazí kontextové menu. V něm se volí položka Přidat a poté nejčastěji Modul nebo Třída nebo Formulář. Možnosti Modul a Třída se liší jen tím, zárodek čeho (zda Module nebo Class) bude jako zatím jediná konstrukce do vzniklého textového souboru s příponou .vb generována. Obsah lze pak kdykoliv jakkoliv změnit: velmi často mívám v jednom souboru jeden nebo více modulů a jednu nebo více tříd (teda tak, aby to nebylo nepřehledné).

V obou případech se nově vzniklá komponenta v Průzkumníku projektu označí a dále se pracuje s jejími vlastnostmi v Panelu vlastností (především se pojmenuje programátorem vhodně zvoleným identifikátorem).

Editace komponenty

Dvojklik (DblClick) na zvolenou komponentu označenou v Průzkumníku projektu ji otevře v Editoru kódu, kde je možno zapisovat nebo upravovat text programu. V případě, že komponentou je návrh formuláře, otevře se návrh v grafickém návrhovém prostředí; tam je možno dnes již celkem standardními postupy vizuální podobu upravovat. Přidávat další visual ovládací prvky lze výběrem z Panelu nástrojů (hlavní menu Zobrazit).

Struktura zdrojového textu programu

Projekt (Project) ve VBA

Poznámka: Na pořadí komponent v níže uvedených schématech - má-li na ně programátor vliv a není-li explicitně popsáno jinak - nezáleží:

 

Visual Basic Editor volaný z nějaké hostitelské aplikace udržuje v souboru touto aplikací otevřeném (v sešitu otevřeného Excelem, dokumentu otevřeného Wordem atd.) programové komponenty vytvářené programátorem nějaké nadstavbové aplikace (nějaké nestandardní nebo automatizované zpracování: dat v sešitu Excelu, textu nebo obrázků v dokumentu Wordu apod.). Tyto komponenty, programátorovi označené jako VBA-Projekt, jsou tvořeny až třemi kolekcemi:
VBA projekt
 
Forms
kolekce návrhů formulářů
 
Modules
kolekce modulů
 
Class Modules
kolekce definic objektových tříd
 

 

Každý modul sestává z kódu na úrovni modulu a z kódu jednotlivých programových jednotek, kterými jsou definice podprogramu (Subroutine, odtud Sub) a (nebo) definice funkce (Function):

Poznámka: Kód na úrovni modulu musí být vždy na začátku modulu, na pořadí podprogramů a funkcí nezáleží.
Modul
 
Úroveň modulu
 
Sub/Function 1
 
Sub/Function 2
 
...
 

 

Každý modul objektové třídy má zcela stejnou strukturu jako „normální“ modul: sestává z kódu na úrovni modulu a z kódu jednotlivých programových jednotek, kterými jsou definice podprogramu (Subroutine, odtud Sub) a (nebo) definice funkce (Function):

Poznámka 1: Kód na úrovni modulu musí být vždy na začátku modulu, na pořadí podprogramů a funkcí nezáleží.

Poznámka 2: Jeden modul objektové třídy definuje vždy jedinou objektovou třídu, která pak slouží k deklaraci proměnných této třídy. „Typ“ takové proměnné je pak roven vlastnosti name, který programátor modulu této objektové třídy přidělil - je to vlastně klíč této definice do kolekce definic objektových tříd.
Modul objektové třídy
 
Úroveň modulu
 
Sub/Function 1
 
Sub/Function 2
 
...
 

 

Každý návrh formuláře sestává jednak z vlastního grafického návrhu přístupného v grafickém editoru, jednak z programového kódu připraveného programátorem především pro reakce na události a zajištění dalších funkcí (např. pro vazby na volající programové jednotky). Kód formuláře má stejnou strukturu jako modul:

Poznámka: Formulář se svým kódem je de facto nová objektová třída, jejíž identifikátor určuje programátor vlastností name - což je vlastně klíč návrhu tohoto formuláře v kolekci formulářů.
Kód formuláře
 
Úroveň modulu
 
Sub/Function 1
 
Sub/Function 2
 
...
 

 

Řešení (Solution) ve Visual Studiu

Protože celé Visual Studio je koncipované pro vytváření i těch nejrozsáhlejších aplikací, předpokládá se zapojení celé řady autorů jednotlivých částí. Realizaci takového předpokladu však odpovídá relativní složitost zdrojových textů. Následující schémata velmi hrubě naznačují celou hierarchii.

Poznámka: Na pořadí komponent v níže uvedených schématech - má-li na ně programátor vliv a není-li explicitně určeno jinak - nezáleží.

 

Jako vrcholový objekt, ze kterého vznikne požadovaná aplikace (spustitelný program, použitelná knihovna), umístili autoři Studia tzv. řešení (solution). To sestává z jednoho nebo více projektů:
Řešení
 
Projekt 1
 
Projekt 2
 
...
 

 

Každý projekt sestává z jednoho nebo více souborů s kódem a (nebo) návrhů formulářů:
Projekt
 
Kód/Formulář 1
 
Kód/Formulář 2
 
...
 

 

Každý soubor s kódem sestává z jednoho nebo více modulů (modules) a (nebo) definic objektových tříd:
Soubor s kódem
 
Modul/Objekt 1
 
Modul/Objekt 2
 
...
 

 

Každý modul sestává z klíčového slova Module, pak programátorem zvoleného jedinečného identifikátoru tohoto modulu, kódu na úrovni modulu, a z kódu jednotlivých programových jednotek, kterými jsou definice podprogramu (Subroutine, odtud Sub) a (nebo) definice funkce (Function):

Poznámka: Kód na úrovni modulu musí být vždy na začátku modulu; na pořadí podprogramů a funkcí nezáleží, jako poslední musí být uvedena dvě klíčová slova End Module.
Modul
 
Module IdentifikátorModulu

Úroveň modulu
 
Sub/Function 1
 
Sub/Function 2
 
...
 
End Module
 

 

Každá definice objektové třídy má formálně stejnou strukturu jako modul (viz výše). Liší se úvodním klíčovým slovem Class a tímtéž závěrečným klíčovým slovem:
Definice objektové třídy
 
Class IdentifikátorObjektovéTřídy

Úroveň modulu
 
Sub/Function 1
 
Sub/Function 2
 
...
 
End Class
 

 

Definice programové jednotky

Programová jednotka tvoří elementární kontejner kódu programu v jazyku Basic. Níže jsou schémata obou typů programových jednotek bez podrobnějšího popisu jednotlivých konstrukcí - tyto detaily jsou vlastním obsahem výuky.

Terminologie a použitá označení:

 

 

Specifikace proměnných a parametrů

Specifikace typu

Specifikací typu se rozumí jedna z konstrukcí typu

    Typ
    Typ()

pro parametry, nebo

    Typ
    Typ()
    Typ(Specifikace_Mezí)

pro proměnné.

Typ je jeden z identifikátorů typu podle tabulek níže, nebo identifikátor objektové třídy - ať už definované programátorem nebo definované v odkazované knihovně.

Specifikace proměnné

Specifikací proměnné oznamuje programátor překladači resp. interpretu, jak velké paměťové oblasti bude jím budovaná aplikace potřebovat pro umístění dat, a jakým identifikátorem budou v programu jednotlivé oblasti označovány. Úkolem překladače je pak udržovat v paměti „pořádek“ a přiřadit jednotlivým identifikátorům adresy v paměti tak, aby např. paměť přidělená překladačem jednomu identifikátoru nekolidovala s pamětí přidělené současně používaným jiným identifikátorem.

Specifikace proměnné má tvar

Ident As Spec_Typu

kde Spec_Typu je specifikace typu proměnné. Příklady:

    Alfa As Byte                ' Proměnná na 1 bytu
    Beta() As String            ' Dynamické pole znakových řetězců
    Gama(0 To 20) As Double     ' Statické pole 21 hodnot po 8mi bytech
    Lidi() as File              ' Dynamické pole instancí třídy File

Specifikace (formálního) parametru

Specifikací formálního parametru oznamuje programátor překladači resp. interpretu, jaké hodnoty jakého typu budou stát na jednotlivých místech aktuálních parametrů při volání (použití) dané programové jednotky, a jakými identifikátory jsou tyto hodnoty označeny v těle (= „uvnitř“) programové jednotky. Překladač pak zajistí v programové jednotce pro každý parametr vyhrazení příslušného paměťového prostoru, a jeho naplnění hodnotami aktuálních parametrů ještě předtím, než je započato s prováděním instrukcí dané programové jednotky.

Specifikace formálního parametru má tvar

Ident As Spec_Typu

kde Spec_Typu je specifikace typu parametru. Příklady:

    Alfa As Byte                ' Parametrem je hodnota na 1 bytu
    Beta() As String            ' Parametrem je adresa pole znakových řetězců
    Lidi() as File              ' Parametrem je adresa pole instancí třídy File

Specifikace typu (vlastní) funkce

Specifikací typu vlastní funkce sděluje programátor překladači, jakého typu bude výsledek předaný do volající programové jednotky z volané, programátorem definované programové jednotky typu Funkce.

Specifikace typu funkce má tvar

As Spec_Typu

kde Spec_Typu je specifikace typu parametru. Příklady:

    Function XY (...) As Byte        ' Výsledkem volání funkce XY je hodnota na 1 bytu
    Function TU (...) As String()    ' Výsledkem volání funkce TU je adresa pole znakových řetězců
    Function PQ (...) As File()      ' Výsledkem volání funkce PQ je adresa pole instancí třídy File

Programová jednotka Sub

Sub IdentJednotky (Seznam_Formálních_Parametrů)
   Příkaz_Dim
   Příkaz_Dim
   ...
   Příkaz
   Příkaz
   ...
End Sub

Komentář:

 

 

Programová jednotka Function

Function IdentJednotky (Seznam_Formálních_Parametrů) As Typ_Výsledku
   Příkaz_Dim
   Příkaz_Dim
   ...
   Příkaz
   Příkaz
   ...
   Ident_Jednotky = Výraz_typu_Typ_Výsledku
End Function

Komentář:

 

                Return Výraz_typu_Typ_Výsledku

 

 

Rozlišení programových jednotek

Definice programových jednotek jsou uvedeny v jednotlivých modulech resp. definicích objektových tříd. Je-li v jednom modulu (tj. na stejné úrovni) uvedeno několik takových definic, je zřejmé, že musí být navzájem rozlišitelné. Nabízí se pak otázka: Kdy by překladač považoval dvě jednotky za shodně definované - a tedy by nebyl schopen je rozlišit?

VBA: V syntaxi VBA jsou dvě jednotky považované za shodně definované, mají-li stejné jméno (jsou označeny stejným identifikátorem). Jednotky na stejné úrovni (např. v jednom modulu) musí mít různá jména.

Studio: V syntaxi Visual Studia jsou dvě jednotky považované za shodně definované, mají-li stejné jméno (jsou označeny stejným identifikátorem), a stejný počet a typ parametrů. Pro tuto trojici

[Jméno, Počet parametrů, Typ parametrů]

se používá pojem Signatura programové jednotky. Jednotky na stejné úrovni (např. v jednom modulu) musí tedy mít různé signatury.

Poznámka 1: V definicích programových jednotek ve Studiu se nebere ohled na jména formálních parametrů, rozlišují se skutečně jen podle typu.

Poznámka 2: Totéž vlastně vidíme i u operací: dvě operace jsou považovány za stejné, mají-li stejné operační znaménko a stejný počet a typ operandů.

Datové typy v Basicu

Datové typy v Basicu 6 (VBA)

 

Identifikátor typu Obsazení paměti Rozsah
Byte 1 byte 0 až 255
Boolean 2 byty True (hexadec. FFFF) nebo False (hexadec. 0000)
Integer 2 byty -32,768 až 32,767
Long (dlouhý celočíselný) 4 byty -2,147,483,648 až 2,147,483,647
Single (jednodchá přesnost, pohyblivá řádová čárka) 4 byty -3.402823E38 až -1.401298E-45 pro záporné hodnoty;
1.401298E-45 až 3.402823E38 pro kladné hodnoty
Double (dvojnásobná přesnost, pohyblivá řádová čárka) 8 bytů -1.79769313486231E308 až -4.94065645841247E-324 pro záporné hodnoty;
4.94065645841247E-324 až 1.79769313486232E308 pro kladné hodnoty
Currency 8 bytů -922,337,203,685,477.5808 až 922,337,203,685,477.5807,
vždy 15 cifer před a 4 cifry za desetinnou tečkou.
Decimal 14 bytů +/-79,228,162,514,264,337,593,543,950,335 bez desetinné tečky;
+/-7.9228162514264337593543950335 s až 28 místy po desetinné tečce;
nejmenší nenulové číslo je +/-0.0000000000000000000000000001
Date 8 bytů 1. ledna 100 až 31. prosince 9999
Object 4 byty Jakýkoliv odkaz na proměnnou typu Object
String (proměnná délka) 10 bytů + délka řetězce 0 až přibližně 2 miliardy
String (pevná délka) Délka řetězce 1 až  65,534
Variant (číselný) 16 bytů Jakákoliv numerická hodnota až do rozsahu typu Double
Variant (znakový) 22 bytů + délka řetězce Stejný rozsah jako String proměnné délky

 

Datové typy v Basicu 2019

 

Identifikátor typu CLR Paměť [bytů] Rozsah
Boolean Boolean Záleží na implementaci False (nula) nebo True (nenula)
Byte Byte 1 <0; 255>
Char Char 2 <0; 65535>
Date DateTime 8 <0:00:00 (půlnoc) 1/1/0001; 23:59:59 (před půlnocí) 31/12/9999>
Decimal Decimal 16 <0; +/-79,228,162,514,264,337,593,543,950,335 bez deset. míst
<0; +/-7.9228162514264337593543950335 s 28 deset. místy
nejmenší nenulové číslo je +/-0.0000000000000000000000000001
Double Double 8 <-1.79769313486231570E+308; -4.94065645841246544E-324> pro záporné
<4.94065645841246544E-324; 1.79769313486231570E+308> pro kladné
Integer Int32 4 <-2,147,483,648; 2,147,483,647>
Long Int64 8 <-9,223,372,036,854,775,808; 9,223,372,036,854,775,807>
Object Object 4 (32bit systémy)
8 (64bit systémy)
V proměnné typu Objekt může být uložen odkaz na jakýkoliv datový typ
nebo instanci jakékoliv objektové třídy.
SByte SByte 1 <-128; 127>
Short Int16 2 <-32 768; 32 767>
Single Single 4 <-3.4028235E+38; -1.401298E-45> pro záporné
<1.401298E-45; 3.4028235E+38> pro kladné
String String Záleží na implementaci až do cca 2 miliard znaků Unicode
UInteger UInt32 4 <0; 4,294,967,295>
ULong UInt64 8 <0; 18,446,744,073,709,551,615>
UShort UInt16 2 <0; 65,535>

 

 

 

Basic jako programovací jazyk

Většina klasických programovacích jazyků rozeznává tři základní syntaktické kategorie:

 

 

Deklaracemi programátor „deklaruje“ (sděluje překladači), které proměnné a další objekty bude jeho aplikace potřebovat, jakým symbolickým jménem je bude označovat a jakého datového typu jednotlivé objekty jsou. Deklarace se jako jazyková kategorie ve většině jazyků uvádějí celkem pochopitelně před příkazy.

V jazyku Basic jsou nahrazeny deklarace příkazy Dim. Příkaz Dim jako příkaz je možno v textu programu uvádět „zamíchané“ mezi ostatními příkazy. Vřele se však doporučuje uvádět všechny příkazy Dim v programové jednotce hned jako její první příkazy. Jednak příkaz Dim zavádějící např. proměnnou X musí být povinně vykonán nejpozději před prvním použitím proměnné X. A jednak - ověřeno praxí: až se za rok budu muset k takovému programu vracet, abych pak nemusel sáhodlouze hledat, co jsem vlastně nějakým identifikátorem myslel; to mně nejlépe řekne jeho deklarace.

Výrazy jsou jediným nositelem hodnoty víceméně ve všech programovacích jazycích. Relativně obecná definice výrazu je uvedena hned následně.

Příkazy jsou „výkonnými“ elementy programu. Stejně jako výrazy jsou podkladem pro generování instrukcí, které posléze vykonává procesor (ať už přímo nebo prostřednictvím interpretu). Zatímco však příkazy jsou samostatnými komponentami textu programu, v jazyku Basic jsou výrazy vždy součástmi nějakého příkazu.

Příkazům je pak věnována kapitola bezprostředně po výrazech.

Výrazy

Formální jazyky (programovací, dotazovací a jiné) slouží jako nástroj pro vytvoření programu, který je realizací algoritmu zpracovávajícího data (třeba řeší kvadratickou rovnici). Algoritmus pracuje s nějakými daty, které mají hodnotu a typ (např. hodnotu 27 a typ Celé číslo). Právě výraz je ve formálních jazycích jediným nositelem hodnoty. Jde o konstrukci, která se při provádění algoritmu vyhodnotí a odevzdá do dalšího zpracování nějakou hodnotu nějakého typu. Příklad:

Výraz Alfa+4 (má-li Alfa celočíselnou hodnotu 27) odevzdá při zpracování hodnotu 31 typu Celé číslo.

Je zřejmé, že pro zápis výrazu ve formálních jazycích musí existovat přesná pravidla s přesným stanovením významu jeho jednotlivých částí. Tomu je věnována tato kapitola.

Definice pojmu Výraz

Pravidla pro zápis výrazu budou zvlášť sympatická uživatelům Excelu resp. obdobných tabulkových procesorů. Tzv. "vzorec" v Excelu má tvar =VÝRAZ, kdežto v návrhovém prostředí dotazu má tvar NÁZEV : VÝRAZ. Přitom VÝRAZ má v Excelu, v databázích a koneckonců i ve většině formálních jazyků stejnou syntaxi (stejná pravidla) i stejnou sémantiku (stejný význam). Drobná odchylka je v tom, že Excel může použít kromě jména buňky také adresu buňky. Pokud by částka nějaké zálohy byla v buňce v C14, pak analogický vzorec pro výpočet 15% DPH ze zálohy by v Excelu byl =15*C14/100. Pokud by však uživatel buňku C14 pojmenoval identifikátorem ZÁLOHA, pak i v Excelu by byl vzorec totožný: =15*ZÁLOHA/100.

Ve vzorcích je tedy základním pojmem výše zmíněný Výraz. Výraz V je tvořen jedním (a právě jedním) z následujících pojmů:

 

  Tvar Příklad Poznámka
(1) zápis konstanty 234.12 Neceločíselné vždy s deset. tečkou - viz dále
(2) identifikátor Alfa nebo Beta(12) (proměnné, datového pole ...) nebo indexovaná proměnná
(3) operace 3 * Alfa Obecně V ⊗ V kde ⊗ je operační znaménko.
(4) volání funkce sin (Alfa) Obecně Fce (V, V, ... , V), kde Fce je identifikátor funkce.
(5) (V) (3 * sin (Alfa - 1)) / 5 Obecně jakýkoliv výraz uzavřený v kulatých závorkách.

 

Tabulka definuje pojem Výraz sice exaktně, ale pro mnohé čtenáře nezvykle. Jde totiž o tzv. rekurzivní definici: v definici jako takové už se používá přímo definovaný pojem. Protože naprosto vyčerpávající definice jednotlivých pojmů (1) až (5) je mimo zaměření těchto textů, jsou níže v jednotlivých odstavcích uvedeny jen nejnutnější poznámky vztahující se k výrazům v dotazech.

Příklad na rozmyšlenou

Na počáteční procvičení tento příklad: následující zápis:

3 + Alfa * 4 - sin(Beta / 2)

Tento zápis výrazem JE nebo NENÍ ?

Většina po krátkém přemýšlení odpoví, že to výraz JE. Ale pozor: pokud to skutečně je výraz, pak který: (1), (2), (3), (4) nebo (5)? Rozhodně to nemůže být i to i to i to!

Není to tak složité. Vylučovací metodou: Není to (1) = zápis konstanty. Ono to sice obsahuje zápis konstanty, ale jako celek to konstanta není. Analogicky (2) a (4). Pokud by to tedy měl být výraz, musí to být (3) = operace. Ale která?

I když mnozí protestují a chtějí začít operací sčítání +, začněme naschvál operací násobení *. Vyznačme to barevně:

3 + Alfa * 4 - sin(Beta / 2)

Ovšem měla-li by to být tato operace - viz (3) - pak musí být

3 + Alfa

výraz a

4 - sin(Beta / 2)

musí být rovněž výraz. Měla-li být konstrukce (opět vyznačme barevně)

3 + Alfa

výrazem (opět vylučovací metodou = operací), musí být

3

výrazem a rovněž

Alfa

musí být výrazem. Obě tyto konstrukce výrazy jsou: 3 je výraz ad (1) a Alfa je výraz ad (2).

Analogicky se dojde ke kladné odpovědi pro druhou část výchozího zápisu - doporučujeme dokončit samostatně.

Dále doporučujeme promyslet: začali jsme operací násobení. Ke stejnému kladnému výsledku (že zápis JE výrazem) bychom došli, kdybychom začali sčítáním nebo odečítáním. V definici výrazu se totiž nevyskytuje ani slovo o prioritě operací; priorita operací je totiž definována až při definici jednotlivých operací, které jsou dány operačním znaménkem a počtem a typem operandů. Stejné operační znaménko tedy může mít na různých typech operandů různou prioritu (protože jde o různé operace).

Zápis konstanty

Zápis číselné konstanty

Celočíselná konstanta se zapisuje běžným způsobem, avšak bez případných tisícových oddělovačů. Mohou se zapisovat i případné počáteční bezvýznamné nuly.

Pro zápis konstanty s desetinnou částí platí stejná pravidla, navíc jedno důležité: zásadně se používá desetinná tečka, nikoliv desetinná čárka!

 

Správně Chybně Poznámka
27    
-09627   Znaménko se zapisuje těsně před první cifrou
  21 700 Obsahuje mezeru
15.28    
15.28e-3   = 15.28 x 10-3 = 0.0153
  15,28 Obsahuje čárku
  1 545.283 759 Obsahuje mezery

 

Zápis textové konstanty

Znaky textu jsou uvozeny znakem " (uvozovky) a stejný znak stojí za posledním znakem textu. V databázových výrazech (přesněji v dotazovacím jazyku SQL) lze místo uvozovek použít i znak ' (apostrof). V obou případech ale platí: jakým znakem je text uvozen, takovým musí být zakončen.

Je-li text textové konstanty uvozen (a tedy i zakončen) uvozovkami a je-li zapotřebí mít jako jeden z vnitřních znaků textu také uvozovky, pak se tyto "vnitřní" uvozovky zdvojí - zapisují se dvě hned vedle sebe. Stejné platí o znaku apostrof.

 

Správně Chybně Poznámka
"Jan Novák"    
"Jan ""Ringo"" Novák"   Jan "Ringo" Novák
  "Jan Novák' Nekončí tím čím začíná
  #Jan Novák# Nezačíná ani " ani '

 

Zápis konstanty typu datum a čas

Mezi dva znaky s kódem 35 (znak #, angl. Hash) se zapíše nejprve datum bez mezer ve tvaru MM/DD/YYYY - pozor na americké pořadí, pak mezera, a nakonec čas bez mezer ve tvaru HH:MM:SS.

Část s časem může chybět (ale ne datum), pak se nezapisuje ani mezera za datem. Část s datem může chybět (ale ne čas), pak se nezapisuje ani mezera před časem.

Tato pravidla akceptuje většina dostupných databázových systémů. V různých systémech mohou být dílčí (ne však uvedená pravidla omezující) variace. Může např. chybět část s vteřinami a dvojtečka před ní; není to omezení, protože 10:25 je to samé jako 10:25:00. Některé systémy povolují zadat čas s větší přesností, tj. časovou část např. ve tvaru HH:MM:SS.SSS (vždy ovšem s desetinnou tečkou).

U různých systémů je však vhodné se seznámit s interpretací chybějící časové resp. datumové části. Co je např. výsledkem, chybí-li v zadávané konstantě čas? Většinou to bývá půlnoc ...

 

Správně Chybně Poznámka
#01/02/2020#   2. ledna 2020
#1/2/2020#   2. ledna 2020
#02/17/2020 10:30:00#   Konec druhé dvouhodinovky v PO 17. února
  #20/1/2020# 20. měsíc není
  #1.1.2020# Obecně nemusí přijmout všechny systémy

 

Zápis logické konstanty

Tento datový typ je v různých jazycích nazýván různě (v jazyky Basic klíčovým slovem Boolean). Vždy však tuto množinu tvoří dvě "protikladné" hodnoty.

Zápisem konstanty tohoto typu je jedno ze dvou slov: True a False ve smyslu, který skutečně je významem těchto slov: Pravda a Nepravda. Negací pravdy je nepravda, negací nepravdy je pravda.

Při zápisu těchto slov se v jazyku Basic (je Case-nonsensitive) nebere ohled na velikost písmen (True = true = TRUE).

 

Správně Chybně Poznámka
TRUE   Pravda, Ano, logická 1
FaLse   Nepravda, Ne, logická 0
  Nepravda Není to jedno ze dvou vyhrazených slov

 

Identifikátor

Identifikátor je autorem aplikace vymyšlené označení pro datovou hodnotu, která je předmětem zpracování a která je uložena na nějakém paměťovém mediu (operační paměť, disk ...). Obecně jde o symbolické označení adresy paměti, kde se daná hodnota nachází.

Definice identifikátoru je následující:

Identifikátor je posloupnost písmen a číslic začínající písmenem.

V jazyku Basic nezáleží na velikosti písmen. To si lze představit např. tak, jako by je překladač všechna považoval za velká.

Znakem identifikátoru však nesmí být zvláště mezera. Identifikátorem proto nemůže být např. Cena zájezdu (obsahuje mezeru). Protože mnohdy je vhodné nějak opticky oddělit některé znaky identifikátoru, rozšiřuje většina jazyků množinu číslic ještě o znak "_" (podtržítko).

 

Správně Chybně Poznámka
Alfa   = alfa = ALFA
aLfA   = alfa = ALFA
Cena_Zajezdu   Obsahuje povolené podtržítko
Beta_12   = beta_12 = BETA_12
  12_Beta Nezačíná písmenem

 

Poznámka 1: Některé jazyky (např. C), povolující jako znak identifikátoru podtržítko, jej považují nikoliv za číslici, ale za písmeno. Znamená to, že v takovém případě může identifikátor podtržítkem začínat. Basic podtržítko na začátku nepovoluje, považuje ho za číslici.

Poznámka 2: Identifikátory se používají při programování na každém kroku - jako jména proměnných, parametrů, programových jednotek atd. Na druhé straně jsou texty programů svými dnes už mezinárodními definicemi vhodným prostředkem pro vskutku mezinárodní výměnu algoritmů. Tam však zhusta nastává problém. Projeví-li o naše programy zájem v zahraničí, dopředu nevíme, jaký národní systém u nich používají a jak se vyrovnává se znaky národních abeced v identifikátorech (třeba ů není pro Anglány ani Amíky písmeno). Proto autoři našich programů v případě, že by mohly být zasílány do zahraničí, nepoužívají v identifikátorech diakritiku.

Poznámka 3: Závěr předchozí poznámky o diakritice netýká obsahu dat (např. typu String), pouze identifikátorů použitých jako jména jednotlivých komponent programu.

Operace

Konkrétní operace jakožto část výrazu zajišťuje provedení konkrétního algoritmu na jistých operandech a vrácení výsledku provedeného algoritmu. Např. zápis 2+3 zajistí provedení známého algoritmu (viz 1. ročník ZŠ) a vrátí hodnotu 5. Ovšem zápis "Jan_"+"Novák" zajistí provedení už méně známého algoritmu a vrátí hodnotu "Jan_Novák". Přitom obě operace mají stejné operační znaménko, liší se typem operandů.

Dále: Je-li hodnota B rovna 5 (slovy pětka), pak operace B-2 vrátí hodnotu 3, kdežto operace -B vrátí hodnotu "záporná pětka". Přitom obě operace mají stejné operační znaménko, liší se počtem operandů.

Operace tedy mohou mít zejména různý počet operandů. Operace s jedním operandem se nazývají unární, se dvěmi operandy binární, se třemi operandy ternární atd. Operace s nulovým počtem operandů je nulární - není nesmyslná, jak by se zdálo; může vracet při každém provedení svého algoritmu např. aktuální čas.

Poznámka: Protože textový zápis operací je lineární, nastává problém s operačními znaménky. Problém celkem není s binárními operacemi (až na omezený počet typografických znaků pro znaménka). Unární operace používají v databázových systémech prefixovou notaci (znaménko stojí před operandem) a také s nimi není problém. Už je však problém s operacemi ternárními, obecně s větším počtem operandů. V editoru lineárního textu nejde zapsat znaménko a pravidelně plošně kolem něj jednotlivé operandy. Proto jsou požadavky na provedení algoritmu operací s větším počtem operandů realizovány nikoliv výrazy typu (3) = operace, ale výrazy typu (4) = volání funkce.

Z uvedeného vyplývá existence celé řady operací se stejným operačním znaménkem, ale různým typem operandů. Pro účely databází se omezme na unární a binární operace a uveďme jen některé z nich.

 

Typ levého
operandu L
Operační
znaménko
Typ pravého
operandu P
Výsledek Typ
výsledku
Poznámka
číslo + číslo Součet L+P číslo Typ čísla je vyšší z typů L a P
číslo - číslo Rozdíl L-P číslo Typ čísla je vyšší z typů L a P
číslo * číslo Součin L*P číslo Typ čísla je vyšší z typů L a P
číslo / číslo Podíl L/P racionální číslo  
číslo \ číslo Celočíselné dělení L a P celé číslo L a P se nejdříve případně zaokrouhlí
číslo mod číslo Zbytek po dělení L a P celé číslo L a P se nejdříve případně zaokrouhlí: 7 mod 2
číslo ^ číslo Umocnění L P číslo Realizováno vztahem L P = e P . ln(L)
datum/čas + Číslo Pozdější datum/čas Okamžik o P "dní" dále za L (VBA)
Číslo + datum/čas Pozdější datum/čas Okamžik o L "dní" dále za P (VBA)
datum/čas - Číslo Dřívější datum/čas Okamžik o P "dní" dříve před  (VBA)L
datum/čas - datum/čas Interval Číslo Kolik "dní"uplynulo od P k L (VBA)
text + text spojení P za L text "Jan_" + "Novák" = "Jan_Novák"
Ano/Ne and Boolean logický součin Boolean viz binární aritmetika: L and P
Ano/Ne or Boolean logický součet Boolean viz binární aritmetika: L or P

 

Operace + a - definované pro typ datum/čas se týkají jazyku Basic v syntaxi VBA. Interní uložení tohoto datového typu je totiž ve tvaru racionálního čísla Double, přičemž celá část tohoto čísla je pořadové číslo dne počínaje nějakým počátkem (u Microsoftu je den 0 stanoven u většiny jejich produktů na 31. prosince 1899), a necelá část tohoto čísla de facto určuje čas v tomto dni. Jinak řečeno, jednotkou určující datum (a čas) je jeden den. Racionální hodnota 1.75 (tedy 1 ¾) chápána jako datum a čas je 1. ledna 1900 18:00 hod. Den číslo 1 je 1.1.1900 a 0.75 = 3/4 dne, tedy 6 hodin odpoledne.

V syntaxi Visual Studia je typ Date realizován jako objektová třída, nelze tedy přímo použít zápis operace typy Dnes+3. Třída Date má však metody (ToOAdate a FromOAdate) pro převod instance konkrétního datumu na a z hodnoty typu Double. O těchto hodnotách pak platí tvrzení předchozího odstavce.

Volání funkce

Volání funkce jakožto část výrazu zajišťuje provedení konkrétního algoritmu na jistých operandech a vrácení výsledku provedeného algoritmu. Pro programátora v jazyku Basic viz shora „Programová jednotka Funkce“.

Výraz typu (V)

Závorky (vždy kulaté) se používají především ke změně priorit při vyhodnocování výrazů. Při volání programových jednotek s parametry mohou ovlivnit způsob předání aktuálního parametru do volané jednotky. Je-li Alfa identifikátor proměnné např. typu Byte, pak uvedení (Alfa), tedy výrazu typu (5) jakožto aktuálního parametru předá hodnotu bytu, kdežto Alfa jako výraz typu (2) může předat jeho adresu.

Příkazy

Použitá symbolika

V následujících popisech příkazů je použita následující symbolika:

 

 

Pravidla pro zápis

Pro zápis textu programu platí následující pravidla:

 

 

Přiřazovací příkaz

Přiřazovací příkaz má tvar

Cíl = Výraz

Je přitom:

Cíl

Identifikátor nebo prvek pole; musí jít o konstrukci, kterou překladač dokáže vyhodnotit jako adresu v paměti, a z jejíhož typu dovede odvodit velikost paměti počínaje touto adresou.

Výraz

Po vyhodnocení bude jeho hodnota zapsána počínaje adresou cíle. Typ této hodnoty musí být převoditelný na typ cíle (např. Byte na Long).

Poznámka: Je dobré si zvyknout číst text tohoto příkazu takto:

Cíl přiřaď Výraz

nikoliv jak mnozí začátečníci činí

Cíl rovná se Výraz

To první čtení je totiž skutečně příkaz: Přiřaď! Kdežto to druhé je sám o sobě logický výraz: buď se Cíl rovná Výrazu nebo se mu nerovná. Jinak řečeno, nezaměňovat - byť jenom verbálně - znak přiřazovacího příkazu = za binární operátor porovnání (který je bohužel reprezentován stejným symbolem).

Podmíněné příkazy

Příkaz IF

Podmínečné provedení jedné ze skupiny příkazů závisející na hodnotě logického výrazu.

Syntaxe:

If podmínka Then [příkazy][Else elsepříkazy]

Je také možno možné použít syntaxi blokového zápisu:

If podmínka Then
   [příkazy]
[ElseIf podmínka-n Then
   [elseifpříkazy]
    ...
[Else
  [elsepříkazy]]
End If

Příkaz If...Then...Else se skládá z těchto částí:

podmínka

Povinné. Jeden nebo více ze dvou následujících typů výrazů:

-   Logický výraz, který lze vyhodnotit jako True nebo False. Obsahuje-li podmínka hodnotu Null, je vyhodnocena jako False.

-   Výraz tvaru TypeOf jméno_objektu Is typ_objektu. Jméno_objektu je odkaz na instanci objektové třídy a typ_objektu je platná objektová třída. Výraz je True, pokud jméno_objektu označuje platnou instanci stejné objektové třídy, která je určena typem_objektu; jinak je False.

příkazy

Volitelné při použití blokového zápisu; povinné v jednořádkovém tvaru, který nemá klauzuli Else. Jeden nebo více příkazů oddělených dvojtečkami; vykonají se, když je podmínka vyhodnocena jako True.

podmínka-n

Volitelné. Stejné jako podmínka.

elseifpříkazy

Volitelné. Jeden nebo více příkazů, které budou provedeny, je-li příslušná podmínka-n True.

elsepříkazy

Volitelné. Jeden nebo více příkazů, které se provedou v případě, kdy žádný předchozí výraz podmínka nebo podmínka-n není vyhodnocen jako True.

Poznámky:

Tip: Při vyhodnocení jednoho výrazu, pro který je definováno více možných akcí, je vhodnější použití příkazu Select Case. Klauzule TypeOf jméno_objektu Is typ_objektu není možné použít v příkazu Select Case.

Příkaz SELECT CASE

 Vykoná jednu z několika skupin příkazů podle hodnoty výrazu.

Syntaxe:

Select Case testovaný_výraz
   [Case seznam_výrazů-n
      [příkazy-n]] ...
   [Case Else
      [elsepříkazy]]
End Select

Příkaz Select Case se skládá z těchto částí:

testovaný_výraz

Povinné. Libovolný číselný nebo řetězcový výraz.

seznam_výrazů-n

Povinné, vyskytne-li se Case. Oddělený seznam položek v následujícím formátu: výraz, výraz To výraz, Is výraz s operátory_porovnání. Klíčové slovo To určuje rozsah hodnot. Použijeme-li klíčové slovo To, menší hodnota musí být uvedena před To. Klíčové slovo Is s operátory porovnání (kromě Is a Like) lze použít pro určení rozsahu hodnot. Není-li uvedeno, je klíčové slovo Is vloženo automaticky.

příkazy-n

Volitelné. Jeden nebo více příkazů vykonaných, jestliže testovaný_výraz odpovídá libovolné části ze seznamu_příkazů-n.

elsepříkazy

Volitelné. Jeden nebo více příkazů vykonaných, jestliže testovaný_výraz neodpovídá žádné klauzuli z Case.

Poznámky:

Příkazy cyklu

Příkaz cyklu řízený parametrem

Opakuje skupinu příkazů podle zadaného počtu opakování.

Syntaxe:

For čítač = začátek To konec [Step krok]
   [příkazy]
[Exit For]
   [příkazy]
Next

Příkaz For ... Next se skládá z těchto částí:

čítač

Povinné. Číselná proměnná používaná jako čítač cyklů. Proměnná nemůže být typu Boolean nebo prvek pole.

začátek

Povinné. Počáteční hodnota čítače.

konec

Povinné. Koncová hodnota čítače.

krok

Volitelné. Hodnota, o kterou je čítač změněn po každém průchodu cyklem. Není-li uvedeno, nastaví se krok na 1.

příkazy

Volitelné. Jeden nebo více příkazů mezi For a Next, které jsou opakovaně vykonávány podle následujícího popisu. Obvykle se označují jako tělo cyklu.

Poznámky:

Argument krok může být jak kladný, tak záporný. Hodnota argumentu krok určuje způsob zpracování cyklu:

Po vstupu do příkazu cyklu For se jako první přiřadí do proměnné ve funkci čítače počáteční hodnota. Teprve pak začíná práce vlastního těla cyklu.

Na začátku se otestuje podmínka provedení podle předchozí poznámky. Je zcela normální, že podmínka není splněna hned na začátku, v tom případě se neprovede nic a příkaz končí. Jinak se začnou poprvé provádět příkazy těla cyklu.

Po vykonání všech příkazů v těle cyklu se hodnota kroku přičte k čítači. V tomto okamžiku se buď příkazy v těle cyklu provedou znovu (na základě stejného testu, podle kterého se cyklus vykonal i původně) nebo se cyklus ukončí a běh pokračuje příkazem následujícím za klíčovým slovem Next.

Tip: Změna hodnoty čítače uvnitř cyklu může způsobit obtížnější čtení a ladění kódu.

Pro předčasné ukončení může být v cyklu umístěn libovolný počet příkazů Exit For. Příkaz Exit For se často používá po vyhodnocení nějaké podmínky, například If ... Then, a předá řízení příkazu následujícímu za příslušným klíčovým slovem Next.

Jednotlivé cykly For...Next můžeme vnořovat, a to umístěním jednoho cyklu For...Next do druhého. Je nutné čítač každého cyklu jednoznačně pojmenovat. Následující konstrukce je správná:

For I = 1 To 10
   For J = 1 To 10
      For K = 1 To 10
         ...
      Next
   Next
Next

 

Příkaz cyklu řízený podmínkou

Opakuje určitý blok příkazů, dokud je podmínka vyhodnocena jako True (v případě použití klíčového slova While), nebo dokud podmínka není True (v případě použití klíčového slova Until).

Syntaxe 1:

Do [{While | Until} podmínka]
   [příkazy]
[Exit Do]
   [příkazy]
Loop

Lze rovněž použít tuto syntaxi 2:

Do
   [příkazy]
[Exit Do]
   [příkazy]
Loop [{While | Until} podmínka]

Syntaxe příkazu Do Loop se skládá z těchto částí:

podmínka

Volitelné. Logický výraz, který je vyhodnocen jako True nebo False. Je-li podmínka Null, pak je vyhodnocena jako False.

příkazy

Jeden nebo více příkazů, které jsou opakovány, dokud je (While) nebo dokud není (Until) podmínka True.

Poznámky:

Příkaz cyklu FOR EACH

Pro každý prvek pole nebo kolekce opakuje uvedenou skupinu příkazů.

Syntaxe:

For Each prvek In skupina
   [příkazy]
[Exit For]
   [příkazy]
Next

Příkaz For...Each...Next se skládá z těchto částí:

prvek

Povinné. Proměnná používaná pro opakování přes prvky kolekce nebo pole. Pro kolekci může být prvek pouze proměnná typu Variant, generická objektová proměnná nebo určitá objektová proměnná. Pro pole může být prvek pouze proměnná typu Variant.

skupina

Povinné. Název kolekce objektů nebo pole (s výjimkou pole uživatelem definovaných typů).

příkazy

Volitelné. Jeden nebo více příkazů, které jsou vykonávány pro každý prvek skupiny.

Poznámky:

Některé další příkazy

Přiřazení adres, ve VBA s klíčovým slovem SET

Přiřazovací příkaz pro přiřazování adres, především instancí objektových tříd. Ve Visual Studiu má totožnou funkci, ale už není vyžadováno klíčové slovo Set (tedy má tvar jako „normální“ přiřazovací příkaz).

Syntaxe:

Set objectvar = {[New] objectexpression | Nothing} ' VBA
objectvar = {[New] objectexpression | Nothing} ' Studio

Příkaz Set má tyto části:

objectvar

Povinná. Název proměnné nebo vlastnosti; musí být v souladu se standardními pravidly pro pojmenování proměnných.

New

Volitelná. Klíčové slovo New se obvykle používá během deklarování, aby se umožnilo implicitní vytvoření instance objektové třídy při prvním použití objectvar. Když se klíčové slovo New použije s příkazem Set, vytvoří se nová instance dané třídy. Jestliže argument objectvar obsahoval odkaz na instanci objektové třídy, tento odkaz se zruší, když bude přiřazen odkaz na jinou instanci objektové třídy. Klíčové slovo New nemůže být použito k vytvoření nové instance žádného vnitřního datového typu ani k vytváření závislých objektů.

Objectexpression

Povinná. Výraz skládající se z názvu objektové třídy, jiné deklarované proměnné stejné objektové třídy, nebo funkce nebo metody, která vrací instanci stejného objektové třídy.

Nothing

Volitelná. Zruší spojení proměnné objectvar s určitým objektem. Přiřazení hodnoty Nothing k proměnné objectvar uvolní všechny systémové a paměťové prostředky, spojené s předešlými odkazy na objekt, v případě, že na něj neodkazuje žádná jiná proměnná.

Poznámky:

Následující příklad ukazuje použití příkazu Dim k deklaraci pole typu Form1. Ve skutečnosti dosud ještě neexistuje žádný exemplář typu Form1. Příkaz Set potom přiřadí odkaz na nový exemplář typu Form1 k proměnné myChildForms. Takový programový kód může být použit pro vytvoření dceřiných forem v aplikaci MDI.

Dim myChildForms(1 to 4) As Form1
Set myChildForms(1) = New Form1
Set myChildForms(2) = New Form1
Set myChildForms(3) = New Form1
Set myChildForms(4) = New Form1

Obecně platí, že když se příkazem Set přiřadí proměnné odkaz na objekt, nevytvoří se pro tuto proměnnou žádná kopie objektu. Místo toho se vytvoří odkaz na objekt. Na stejný objekt může odkazovat více než jedna objektová proměnná. Protože takové proměnné jsou jen odkazy na objekt a ne kopie objektu, jakákoli změna v objektu se odrazí ve všech proměnných, které na něj odkazují. Avšak při použití klíčového slova New v příkazu Set se skutečně vytvoří exemplář (kopie) objektu.

Příkaz WITH

Vykonává posloupnost příkazů pro jednu instanci objektové třídy.

Syntaxe:

With objekt
   [příkazy]
End With

Syntaxe příkazu With se skládá z těchto částí:

objekt

Povinné. Instance objektové třídy. Může to být libovolný výraz, odevzdávající adresu instance.

příkazy

Volitelné. Jeden nebo více příkazů, které se vykonávají pro zadanou instanci.

Poznámky:

Příkaz With dovoluje provést pro zadaný objekt posloupnost příkazů bez opakovaného uvádění názvu objektu. Například pro změnu několika různých vlastností jednoho objektu umístěte příkazy přiřazující nové hodnoty vlastnostem objektu dovnitř řídicí struktury With. Na objekt se odkazujeme pouze jednou, namísto zadání názvu objektu v každém příkazu přiřazení pro každou upravovanou vlastnost. Následující příklad ukazuje použití příkazu With pro přiřazení hodnot více vlastnostem stejného objektu.

With MujPopisek
   .Height = 2000
   .Width = 2000
   .Caption = "To je MůjPopisek"
End With

Poznámka: Jakmile se jednou vstoupí do bloku With, nemůže být objekt změněn. Proto nelze použít jeden příkaz With pro změnu vlastností různých objektů.

Příkazy With můžeme vnořovat umístěním jednoho bloku With do jiného. Avšak, protože vnitřní blok With zastíní vnější bloky With, je nutné pro každý člen objektu z vnějšího bloku With uvést odkaz na objekt.

Důležité: Nelze provádět skoky do nebo z bloků With. Jsou-li provedeny příkazy v bloku With, ale příkazy With nebo End With provedeny nejsou, mohou nastat chyby nebo nepředvídatelné chování celého programu.

Funkce InputBox a MsgBox

Při popisu těchto funkcí je použit zdrobnělý termín „okénko“. Tím vycházíme vstříc začátečníkům, kteří se teprve prokousávají taji programování. Ti pokročilí - např. účastníci skvělých rekvalifikačních kurzů - samozřejmě ví, že nejde o žádná okénka ke koukání, ale o úplně normální instance třídy Form, tedy o běžné formuláře. Proto nechť si pokročilí při čtení sami provedou substituci okénko formulář.

Funkce InputBox

Zobrazí dialogové okénko s textovou výzvou, umožní uživateli zadat jeden řádek textu a po stisknutí tlačítka uživatelem vrací uživatelem zadaný textový řetěz jako výsledek.

Syntaxe:

InputBox(prompt[, title] [, default] [, xpos] [, ypos] )

Parametry:

Funkce InputBox má následující pojmenované parametry:

 

Parametr Popis
prompt Povinný. Výraz typu String, který bude zobrazen jako výzva uživateli. Přibližná délka je asi 1024 znaků, závisí ale na šířce jednotlivých znaků proporcionálního fontu, který je pro zobrazení hlášení použit. Hlášení může obsahovat znak s kódem 10 nebo 13 nebo dva po sobě jdoucí znaky s kódy 13 a 10 - v tom případě se na místě tohoto znaku (dvou znaků) odřádkuje. Znaky s uvedenými kódy vrací funkce Chr(13) resp. Chr(10).
title Volitelný. Výraz typu String ve významu nadpisu v dialogovém okénku. Pokud chybí, bude v nadpisu okénka jméno aplikace, která ho aktivovala.
default Volitelný. Výraz typu String zobrazený jako implicitní text ve vstupním textovém poli. Uživatel ho může a nemusí přepsat. Není-li parametr uveden, obsahuje vstupní pole prázdný textový řetěz.
xpos Volitelný. Numerický výraz specifikující vodorovnou vzdálenost levého horního roku okénka od levého horního rohu obrazovky. Jednotky jsou twips-y (dvacetiny bodu). Chybí-li parametr, je okénko vodorovně centrováno.
ypos Volitelný. Numerický výraz specifikující svislou vzdálenost levého horního roku okénka od levého horního rohu obrazovky. Jednotky jsou twips-y (dvacetiny bodu). Chybí-li parametr, je okénko svisle centrováno.

 

V okénku InputBox je tlačítko Cancel svázáno s klávesou Esc  - stisknutí Esc na klávesnici nebo Cancel v okénku je jedno a to samé. Použitím Cancel vrací funkce prázdný textový řetězec, ať ve vstupním poli byla nebo nebyla zadána nějaká hodnota. Stejně tak je svázané tlačítko OK a klávesa Enter. Použitím OK se vrací plný textový obsah vstupního pole, a to včetně event. "neviditelných" koncových mezer!

Příklady:

Příkaz

Vysl = InputBox("Zadejte text:", "Důležité", "Implicitní text")

zobrazí bezprostředně po vyvolání  následující okénko:

Uživatel do něj nyní napíše nějaký text:

Po stisknutí OK se okénko zavře a proměnná Vysl bude mít hodnotu "Toto je můj právě psaný vstupní text". Kdyby však bylo stisknuto Cancel, proměnná Vysl by měla hodnotu "" (prázdný řetězec znaků).

 

 

Funkce MsgBox

Funkce zobrazí v dialogovém okénku hlášení, počká na stisknutí tlačítka uživatelem a vrací Enum hodnotu indikující, které tlačítko uživatel stisknul. V prostředí Visual Studia 2019 je celočíselnou návratovou hodnotou pojmenovaná konstanta typu Microsoft.VisualBasic.MsgBoxResult.

Syntaxe:

Var = MsgBox (prompt, [buttons], [title] )

Parametry:

Funkce MsgBox má následující pojmenované parametry:

 

Parametr Popis
prompt Povinný. Výraz typu String zobrazený jako hlášení. Přibližná délka je asi 1024 znaků, závisí ale na šířce jednotlivých znaků proporcionálního fontu, který je pro zobrazení hlášení použit. Hlášení může obsahovat znak s kódem 10 nebo 13 nebo dva po sobě jdoucí znaky s kódy 13 a 10 - v tom případě se na místě tohoto znaku (dvou znaků) odřádkuje. Znaky s uvedenými kódy vrací funkce Chr(13) resp. Chr(10).
buttons Volitelný. Numerický výraz (Long - viz níže), který je součtem upřesňujících požadavků na tlačítka, ikony apod. Viz níže. Pokud chybí, je jeho hodnotou nula.
title Volitelný. Výraz typu String ve významu nadpisu v dialogovém okénku. Pokud chybí, bude v nadpisu okénka jméno aplikace, která ho aktivovala.

 

Hodnoty použitelné pro vytvoření parametru buttons jsou následující:

 

Konstanta

Hodnota Popis
vbOKOnly 0 Zobrazí pouze tlačítko OK
vbOKCancel 1 Zobrazí tlačítka OK a Cancel
vbAbortRetryIgnore 2 Zobrazí tlačítka Abort, Retry a Ignore
vbYesNoCancel 3 Zobrazí tlačítka Yes, No a Cancel
vbYesNo 4 Zobrazí tlačítka Yes a No
vbRetryCancel 5 Zobrazí tlačítka Retry a Cancel
vbCritical 16 Zobrazí ikonu Critical Message (často Stop)
vbQuestion 32 Zobrazí ikonu Warning Query (často otazník)
vbExclamation 48 Zobrazí ikonu Warning Message (často vykřičník)
vbInformation 64 Zobrazí ikonu Information Message (často písmeno i)
vbDefaultButton1 0 Implicitní je první tlačítko
vbDefaultButton2 256 Implicitní je druhé tlačítko
vbDefaultButton3 512 Implicitní je třetí tlačítko
vbApplicationModal 0 Okénko hlášení je modální v aplikaci: uživatel musí reagovat, než bude aktuální aplikace - která okénko otevřela - pokračovat (standardní chování).
vbSystemModal 4096 Okénko hlášení je modální v systému: všechny aplikace jsou pozastaveny, než uživatel na okénko reaguje.
vbMsgBoxHelpButton 16384 Přidá do okénka tlačítko Help.
VbMsgBoxSetForeground 65536 Určuje okénko hlášení jako okno na popředí.
vbMsgBoxRight 524288 Text hlášení je zarovnaný doprava (standardně doleva)
vbMsgBoxRtlReading 1048576 Určuje, že se text hlášení objeví psaný zprava doleva pro Hebrejské a Arabské systémy.

 

V prostředí Visual Studia 2019 jsou definovány jako pojmenované konstanty typu Microsoft.VisualBasic.MsgBoxStyle. Jde přitom o klasické bitové indikátory čtyřbytového pole (= typ Long):

Poznámka: Popisy tlačítek jsou v národních prostředích ekvivalentní uvedeným Cancel apod.

Návratové hodnoty

Funkce MsgBox vrací v návaznosti na reakci uživatele následující hodnoty:

 

Konstanta Hodnota Uživatel ukončil stisknutím
vbOK 1 OK
vbCancel 2 Cancel
vbAbort 3 Abort
vbRetry 4 Retry
vbIgnore 5 Ignore
vbYes 6 Yes
vbNo 7 No

  

Poznámka: Uvedené konstanty jsou deklarovány v modulu Basic For Application (Basic 6) nebo v Microsoft.VisualBasic.MsgBoxResult (Basic 2019); programátor je používá k testu, kterým tlačítkem uživatel uzavřel okénko s hlášením.

Pokud v okénku MsgBox je zobrazeno tlačítko Cancel, pak je klávesa Esc svázána s tímto tlačítkem - stisknutí Esc na klávesnici nebo Cancel v okénku je jedno a to samé.

Příklady:

Příkaz

MsgBox "Nějaké hlášení"

zobrazí následující okénko:

Příkaz

Vysl = MsgBox("Nějaké hlášení", vbYesNo + vbCritical, "Pozor!")

zobrazí následující okénko:

a do Vysl vloží buď  vbYes nebo vbNo podle toho, kterým tlačítkem uživatel uzavřel okénko. Příkaz

Vysl = MsgBox("Nějaké hlášení", vbRetryAbortIgnore + vbInformation, "Pozor!")

zobrazí následující okénko:

a do Vysl vloží buď  vbAbort nebo vbRetry nebo vbIgnore podle toho, kterým tlačítkem uživatel uzavřel okénko.

 

 

 

 

 

 

 

 

 

 

 

Literatura a další doporučené zdroje

[1] BRANDEJS, M.: Mikroprocesory Intel Pentium [online]. Fakulta informatiky, Masarykova univerzita, Brno. 2010. [cit. 2.1.2021]. Dostupné z: https://www.fi.muni.cz/usr/brandejs/Brandejs_Mikroprocesory_Intel_Pentium_2010.pdf

[3] Informatika. In: Wikipedie: Otevřená encyklopedie [online]. Wikimedia Foundation, 2003. [cit. 4.6.2017]. Dostupné z: https://cs.wikipedia.org/wiki/Informatika

[4] Endianness in: TANNENBAUM, A. S., AUSTIN, T.: Structured Computer Organization. 6th edition. Boston: Pearson, 2013. ISBN 9780132916523.

[5] International System of Units (SI): Prefixes for binary multiples. National Institute of Science and Technology. [cit. 4.10.2017]. Dostupné z: https://physics.nist.gov/cuu/Units/binary.html

[6] GOLDBERG, D.: What Every Computer Scientist Should Know About Floating-Point Arithmetic. ACM Computing Surveys. March 1991. p: 5–48. doi: 10.1145/103162.103163.

[6] Institute of Electrical and Electronics Engineers: IEEE Standard 754-1985 for Binary Floating-Point Arithmetic, IEEE 1987. Reprinted in SIGPLAN 22, 2, 9-25.