Úvod
Microsoft Access obsahuje řadu funkcí, které umožňují vývojářům databází vytvářet formuláře pro zadávání dat, sestavy a dotazy, které mohou uživatele vést při dotazování na existující data v databázi a zadávání nových dat. Různé nástroje pro tvorbu dotazů a průvodce usnadňují tento vývojový proces. I s těmito nástroji však mohou nastat situace, kdy by vývojář chtěl přidat ještě více funkcí, které zatím vývojové nástroje MS Access neposkytují. Vývojář si například může přát automaticky opravit špatná data před jejich uložením do databáze, zobrazit upozornění, pokud je porušeno obchodní pravidlo, pomoci uživateli přejít z jednoho formuláře pro zadávání dat do druhého nebo spustit sestavu s některými vlastními filtry. Způsob, jak dosáhnout takového přizpůsobení, je přidat kód pomocí programovacího jazyka Visual Basic for Applications.
Visual Basic for Applications (VBA) je programovací jazyk používaný v řadě softwarových produktů Microsoft Office, jako jsou Excel a Access. Jazyk VBA je odvozen z jazyka „Basic“ vynalezeného v roce 1964, který se stal populárním na osobních počítačích v 70. Část názvu „Visual“ byla přidána společností Microsoft, aby odrážela použití základního programovacího jazyka v systému Microsoft Windows.
Existuje mnoho výukových programů, které představují základní programování. Tento tutoriál se zaměří na malou podmnožinu funkcí jazyka VBA používaného v MS Access.
Obsah
- Události v aplikaci Microsoft Access
- Příklad kódu VBA:Zajištění, že názvy jsou ve správném případě
- Jazyk VBA – deklarování a přiřazování proměnných, podmíněných příkazů a komentářů
- Jazyk VBA – funkce, metody a příklady
- Jazyk VBA – vlastnosti
- Cvičení kódování VBA
- Ošetření chyb ve VBA
- Spouštění vlastních dotazů SQL ve VBA
Další stránka představuje události v aplikaci Microsoft Access.
Události v aplikaci Microsoft Access
V Accessu je programovací kód VBA připojen k formulářům a sestavám a lze jej nastavit tak, aby se spouštěl v určitou dobu nebo v reakci na konkrétní událost. Tento styl programování je někdy označován jako programování „založené na událostech“, což znamená, že kód, který vývojář napíše, se spustí v reakci na nějakou událost .
Když je formulář zobrazen ve formulářovém zobrazení, bude se obecně dotazovat na všechna existující data z podkladových tabulek a pak tam bude jen nečinně sedět, dokud uživatel něco neudělá. Uživatel může například kliknout na jedno z navigačních tlačítek a přesunout se na další záznam, může kliknout do textového pole a začít zadávat nová data nebo může kliknout na tlačítko Zavřít pro uzavření formuláře. Každá z těchto akcí vyústí v Událost děje ve formě. Každé kliknutí myší nebo tah na klávesnici se považuje za událost.
Události mají většinou výchozí chování. Kliknutím na navigační tlačítko „další záznam“ se formulář posune na další datový záznam. Zadáním písmene „C“, když je kurzor v textovém poli, se v textovém poli objeví písmeno „C“. Stisknutí klávesy TAB způsobí, že kurzor přeskočí na další textové pole (nebo ovládací prvek) ve formuláři a tak dále. Programátor může toto výchozí chování přepsat nebo vylepšit a vložit svůj vlastní kód, který se má spustit v reakci na událost.
Programování VBA pro Access Forms and Reports se zaměřuje hlavně na psaní kódu, který reaguje na různé události.
Než se ponoříme do podrobností událostí, může být poučné implementovat jednoduchý příklad. Chcete-li vidět nějaký kód v akci, další část tohoto tutoriálu poskytuje návod, jak přidat kód VBA do formuláře pro zadávání dat.
Příklad kódu VBA:Zajištění, aby jména byla ve správných písmenech
Následuje poměrně stručný a jednoduchý příklad přidání kódu VBA do formuláře pro zadávání dat v MS Access. Některé detaily budou kvůli stručnosti přeskočeny. Po tomto příkladu tyto podrobnosti vyplní zbytek tohoto kurzu.
Tento příklad používá Zákazník formulář pro zadávání dat, který byl přizpůsoben v kurzu Advanced MS Access Forms. Než budete pokračovat, možná budete chtít dokončit tento tutoriál (nebo alespoň části týkající se formuláře pro zadání údajů o zákazníkovi).
Při zadávání nových údajů o zákaznících bychom se rádi ubezpečili, že jména Zákazníka jsou zadána ve „správném případě“. To znamená, že první písmeno jména by mělo být velké písmeno a zbytek jména by měl být malými písmeny. Pokud uživatel zadá:„Joe“, chtěli bychom, aby to formulář automaticky opravil na správný případ:„Joe“.
Pokud jde o události, přidáme kód, který je spojen s událostí Po aktualizaci pro pole Jméno na formuláři zákazníka. To znamená, že po něco se změnilo (aktualizováno ) v poli First Name (Křestní jméno) se spustí událost After Update a poté kód, který napíšeme, začne fungovat, aby se zajistilo, že jakékoli zadané jméno bude převedeno na správná velká a malá písmena.
Následující kroky zavedou tento kód.
- Otevřete položku Zákaznická data pro v režimu návrhu.
- Klikněte pravým tlačítkem na Jméno textového pole a vyberte Vlastnosti z vyskakovací nabídky.
- Když se zobrazí Tabulka vlastností klikněte na kartu Událost. To je znázorněno na obrázku níže:
Všimněte si seznamu událostí, které jsou zobrazeny. Každý z nich lze naprogramovat tak, aby reagoval na konkrétní událost, která se stane s Jméno textové pole.
- Vytvořte novou obsluhu události kliknutím na tři tečky napravo od události Po aktualizaci.
- Položka Vybrat tvůrce objeví se okno. Vyberte Tvůrce kódu a poté klikněte na OK knoflík.
- Zobrazí se okno pro úpravu kódu VBA. Všimněte si, že Access již vytvořil útržek podprogramu, který začíná slovy Private Sub a končí slovy End Sub.
Název podprogramu je vytvořen pomocí názvu ovládacího prvku formulářů (FirstName) a názvu Událost, na kterou bude tento podprogram reagovat (AfterUpdate).Řádek End Sub je místo, kde tento konkrétní podprogram skončí.
- Na prázdný řádek mezi Private Sub a End Sub přidejte následující kód:
FirstName = StrConv(FirstName, vbProperCase)
Po dokončení se kód zobrazí takto:
Tento nový řádek kódu dělá následující:
StrConv je funkce, která přebírá obsah textového pole Jméno a převádí jej podle druhého daného parametru, kterým je v tomto příkladu vbProperCase. Po dokončení tohoto převodu bude výsledek přiřazen (pomocí rovnítka) zpět do textového pole Jméno. Tím se přepíše vše, co je aktuálně v textovém poli Jméno. Tato funkce například vezme „sally“, převede jej na „Sally“ a poté vloží „Sally“ do textového pole Jméno.
- Uložte tento nový kód stažením Soubor dolů a výběrem možnosti Uložit .
- Otestujte nový kód. Přepněte zpět na obrazovku Microsoft Access Design Mode. Změňte zobrazení na Form View.
- Přejděte na prázdný záznam. Klikněte na pole Jméno a zadejte jméno malými písmeny:
- Stiskněte Tab pro přesun do dalšího textového pole. Jméno Joe by se mělo změnit na „Joe“, jak je uvedeno níže:
- Pokud se zobrazí chyba, přepněte zpět do editoru kódu VBA a ujistěte se, že jste všechny části kódu napsali správně. Možná budete muset stáhnout Spustit a vyberte Resetovat za účelem zastavení spouštění kódu VBA.
Výše uvedený příklad poskytl rychlý pohled na to, jak lze přizpůsobit chování formuláře, aby pomohl uživateli zadávat do databáze pěkně naformátovaná data. Během tohoto příkladu bylo přeskočeno několik podrobností a tyto podrobnosti budou probrány ve zbytku tohoto tutoriálu.
Jazyk VBA
Tato část stručně představí hlavní části jazyka VBA, jak se používá v MS Access. Komplexní přehled VBA přesahuje rámec tohoto tutoriálu. Odkazy na obsáhlejší knihy a materiály jsou uvedeny na konci tohoto návodu.
Deklarování proměnných
proměnná je název daný zástupnému symbolu, kam může programátor uložit nějaká data. Proměnná může být například použita k uložení čísla, zatímco s ní provádíme nějaké matematické operace nebo porovnáváme její hodnotu s jinými proměnnými. Proměnné lze deklarovat tak, aby obsahovaly hodnoty určitého datového typu jako jsou celá čísla, řetězce nebo data. Chcete-li deklarovat novou proměnnou, použijte příkaz Dim. Chcete-li například deklarovat novou proměnnou s názvem MyName a nastavte jej tak, aby obsahoval řetězec (znaky), proveďte následující:
Dim strMyName As String
Chcete-li deklarovat novou proměnnou s názvem „AccountBalance“ a nastavit ji tak, aby ukládala číslo s desetinnou čárkou, použijte následující:
Dim dblAccountBalance As Double
Přiřazení hodnot
Hodnotu lze přiřadit proměnné nebo ovládacímu prvku ve formuláři pomocí znaménka rovná se. Například pro uložení jména „Alex“ do proměnné MyName použijte následující:
strMyName =“Alex”
Chcete-li zkopírovat obsah textového pole Jméno do proměnné MojeJméno, použijte:
strMyName =[FirstName]
Hodnoty lze také vypočítat před přiřazením. Například následující výraz převezme zůstatek účtu aktuálního zákazníka z textového pole [Zůstatek], přidá 1% úrok (vynásobením zůstatku krát 1,01) a poté sníží výsledek o 10 $. Nakonec je výsledek přiřazen k proměnné AccountBalance.
dblAccountBalance =( [Zůstatek] * 1,01 ) – 10,00
Podmíněné příkazy
Podmíněný příkaz používá logický test k určení, které řádky kódu se mají spustit jako další. Podmíněný příkaz If … Then se používá poměrně často. Například:
If AccountBalance < 1000 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
Vyhodnocuje se logický výraz AccountBalance <1000. Pokud je tento výraz pravdivý (například je-li AccountBalance 400 $), spustí se další řádek za Potom. V tomto příkladu je měsíční poplatek =10.
Pokud je tento výraz False, pak se spustí řádek za Else.
Logický výraz může obsahovat několik částí, které jsou spojeny booleovskými operátory OR, AND a NOT. Důkladnější diskusi o booleovských výrazech lze nalézt v tomto tutoriálu o programování. Předpokládejme například, že upustíme od měsíčního poplatku, pokud je účet mladší než rok. Předpokládejme, že máme AccountAge jako stáří účtu v měsících. Pak by kód byl:
If AccountBalance < 1000 AND AccountAge > 12 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
V příkazu If … Then a If … Then lze spustit více než jeden řádek kódu.
Komentáře
Při programování v jakémkoli programovacím jazyce je dobrou praxí zahrnout komentáře, které kód popisují. Ve VBA lze komentář zahrnout tak, že začnete jedinou uvozovkou. Vezmeme-li výše uvedené jako příklad, můžeme přidat následující komentáře:
Další části jazyka VBA jsou popsány na další stránce.
Jazyk VBA – pokračování
Funkce
Jazyk VBA má velké množství vestavěných funkcí a metod, které lze použít k provádění různých úloh, jako jsou matematické funkce (sin, cos, tan), funkce řetězců a mnoho dalších. Funkce mají obvykle jeden nebo více vstupních parametrů, které funkce používá. Například ve funkci Cos(45) je „45“ vstupní úhel, se kterým bude fungovat funkce kosinus. Funkce StrConv vyžaduje dva vstupní parametry:Řetězec k převodu a styl převodu:
StrConv(Jméno, vbProperCase)
Mezi užitečné funkce patří:
MsgBox( prompt, buttons, title) | Zobrazte vyskakovací okno se zprávou s textem výzvy, tlačítky a názvem |
StrConv( výraz, styl ) | Převeďte řetězcový výraz na velká, malá nebo správná písmena |
Vlevo( výraz, znaky ) | Vezměte z řetězcového výrazu znaky nejvíce vlevo |
Střed (výraz, začátek, znaky ) | Vezměte střední sadu znaků z řetězcového výrazu začínajícího na začátku |
JeNull( výraz ) | Otestujte, zda řetězcový výraz (nebo textové pole) nemá žádný obsah (je null) |
Nz( výraz, hodnota_if_null ) | Pokud je výraz null, vyplňte výchozí hodnotu |
Nyní() | Vrátí aktuální datum a čas |
Zaokrouhleno(výraz, desetinná místa ) | Zaokrouhlí číselný výraz na určitý počet desetinných míst |
RGB( červená, zelená, modrá ) | Vrátí barevné celé číslo na základě kombinace červené, zelené a modré |
Metody
Metody ve VBA jsou jako funkce, ale jsou spojeny s ovládacím prvkem nebo jiným objektem ve formuláři nebo sestavě.
Mezi užitečné metody patří:
DoCmd.CancelEvent | Zruší aktuální událost, která je zpracovávána |
DoCmd.Close | Zavřete aktuální formulář (nebo databázi) |
DoCmd.OpenForm | Otevře nový formulář |
DoCmd.OpenReport | Spusťte příkaz MS Access, jako je uložení nových nebo aktualizovaných dat, vrácení změny nebo ukončení formuláře |
.SetFocus | Nastavte fokus na ovládací prvek ve formuláři |
. Zpět | Vrátí zpět poslední změnu nebo příkaz |
. Obnovit | Aktualizuje všechna data tvořící základ formuláře |
.Vyžádat dotaz | Vyžádá si data zadaná do formuláře |
. Překreslit | Překreslí všechny ovládací prvky ve formuláři |
Mnoho dalších funkcí a metod je uvedeno na tomto webu společnosti Microsoft.
Následující sada příkladů využívá různé funkce a metody v různých kombinacích.
Příklady
Ukažte uživateli varování, pokud je zůstatek na účtu nižší než 1 000 $
If AccountBalance < 1000 Then MsgBox("Warning: The Account Balance is now less than $1,000.") End If
Pokud textové pole Jméno ve formuláři něco obsahuje, převeďte jej na správná velká a malá písmena
If Not IsNull( [FirstName] ) Then FirstName = StrConv( [FirstName], vbProperCase ) End If
další stránka představuje Vlastnosti různých objektů.
Vlastnosti
Každý prvek ve formuláři pro zadávání dat nebo sestavě má sadu vlastností s tím spojené. Vlastnosti řídí umístění, barvu, písmo, pozadí a další atributy vzhledu a formátování každého ovládacího prvku. Například některé z mnoha vlastností textového pole zahrnují:
Viditelné | Určuje, zda je textové pole ve formuláři viditelné |
Zamčeno | Určuje, zda lze data v textovém poli změnit |
Index karty | Pořadí každého ovládacího prvku podle toho, jak se uživatel pohybuje ve formuláři stisknutím klávesy Tab |
Štítek | Identifikuje název štítku spojeného s textovým polem |
Šířka, výška, poloha nahoře a dole | Označuje relativní polohu a velikost textového pole |
Styl a barva pozadí | Nastaví styl pozadí a barvu textového pole |
Styl a barva ohraničení | Nastaví styl a barvu okraje kolem textového pole |
Velikost písma, váha, podtržení, kurzíva, barva a zarovnání | Nastaví písmo a styl |
Okraje a mezery odsazení – Nastaví okraje a odsazení kolem vnitřní části textového pole |
Vlastnosti lze nastavit pomocí návrhového zobrazení a uložit s formulářem nebo sestavou. Vlastnosti lze také změnit pomocí kódu VBA během běhu formuláře. Chcete-li získat přístup k vlastnosti ve VBA, použijte název ovládacího prvku, poté tečku a poté název vlastnosti. Například následující kód změní barvu písma textového pole KódZákazníka na červenou:
CustomerID.ForeColor =vbRed
Následující části obsahují některá cvičení, která kombinují různé části programovacího jazyka VBA za účelem přizpůsobení chování různých formulářů pro zadávání dat.
Cvičení kódu VBA
Vyzkoušejte následující cvičení, která přizpůsobí formuláře. Vraťte se zpět do předchozích sekcí pro příklady kódu, který lze upravit tak, aby odpovídal aktuálnímu cvičení.
Cvičení 1
Upravte formulář CustomerDataEntry a přidejte dva obslužné rutiny události AfterUpdate, které převedou křestní jméno a příjmení na správná velká a malá písmena (vytvořte samostatnou obslužnou rutinu AfterUpdate pro každé textové pole). Před pokusem o převod textu nejprve zapište kód, abyste se ujistili, že textové pole není prázdné.
Cvičení 2
Upravte formulář AccountsDataEntry a přidejte obslužnou rutinu události AfterUpdate, která zobrazí okno s upozorněním, pokud je zůstatek účtu nižší než 5 000 $. Také změňte barvu písma textového pole Balance na červenou.
Cvičení 3
Upravte formulář pro zadání zákaznických dat. Vytvořte podprogram On Lost Focus, který změní popisek pro textové pole Jméno na červenou (vbRed), pokud uživatel opustí textové pole Jméno, aniž by cokoli napsal. Pokud je něco v textovém poli, nastavte štítek na modrý (vbBlue). V níže uvedeném příkladu nebylo nic zapsáno do textového pole Jméno a poté uživatel přešel na další textové pole, což způsobilo, že štítek Jméno zčervenal.
Další stránka tohoto kurzu pojednává o tom, jak zacházet s chybami v kódu VBA.
Ošetření chyb ve VBA
Kód VBA občas narazí na chybu. Pokud je například textové pole prázdné a my se pokusíme převést obsah textového pole na správná velká a malá písmena, funkce StrCnv selže. Dalším příkladem je dělení nulou. Bez ošetření chyb mohou tyto problémy způsobit selhání programu VBA. Když dojde k chybě, speciální kód může začít pracovat, aby chybu zpracoval a pokračoval ve zpracování kódu VBA.
Dvě hlavní funkce zpracování chyb VBA jsou příkaz On Error Goto a příkaz Resume Next. Tyto dva příkazy kódu VBA spolupracují, aby zabránily VBA zhroucení aplikace.
Příkaz On Error Goto informuje VBA o tom, co dělat, když v podprogramu dojde k chybě. Část příkazu Goto odkazuje na štítek jinde v kódu, kde bude VBA pokračovat v práci. Jakmile se program VBA dostane na štítek, jakákoli chyba se zobrazí v objektu nazvaném Err. Vlastnost Err.Description bude obsahovat textový popis poslední zjištěné chyby. Příkaz Resume Next způsobí, že program VBA bude pokračovat v běhu od okamžiku, kdy došlo k chybě.
Následující příklad rozšiřuje rutinu FirstName_AfterUpdate představenou na začátku tohoto kurzu. Nyní si program VBA dokáže poradit se všemi chybami, které se mohou v programu vyskytnout.
Private Sub FirstName_AfterUpdate ' Subroutine to convert the FirstName of the customer to Proper Case On Error Goto FirstName_AfterUpdate_Error_Handler FirstName = StrConv(FirstName, vbProperCase) ' If the conversion was successful, exit this subroutine Exit Sub FirstName_AfterUpdate_Error_Handler: ' If there is an error show the description of the error MsgBox Err.Description ' Resume with the next statement In the subroutine Resume Next End Sub
další část tohoto kurzu pojednává o tom, jak zahrnout kód SQL do jazyka VBA.
Spouštění vlastních dotazů SQL ve VBA
Structured Query Language (SQL) je programovací jazyk používaný v relačních databázích, jako jsou MS Access, SQL Server, Oracle a mnoho dalších. Příkazy SQL lze použít k vkládání, aktualizaci, mazání a načítání (výběru) datových záznamů z tabulek (mimo jiné). Jednoduchý příklad příkazu SQL by byl:
SELECT customerid, firstname, lastname FROM customer
SQL kód lze napsat v rámci VBA a spustit ve vhodnou dobu. Například lze zapsat podprogram VBA, aby se dotazoval na tabulku Customer a našel nejvyšší CustomerID. Pak bychom k tomuto číslu mohli přidat 1, abychom získali nové, nepoužité, CustomerID pro nový záznam.
Obecné kroky pro provedení tohoto typu úlohy jsou:
Vytvořte příkaz SQL
Spusťte příkaz SQL pomocí připojení k otevřené databázi (pojmenované ve VBA CurrentDb)
Získejte výsledné záznamy a použijte získaná data
Chcete-li vytvořit tento podprogram VBA, otevřete formulář CustomerDataEntry a získejte vlastnosti pole KódZákazníka. Na kartě události klikněte na tři tečky napravo od události On Dbl Click. Vyberte Tvůrce kódu a útržek se vytvoří následovně:
Private Sub CustomerID_DblClick(Cancel As Integer) End Sub
Přidejte následující kód:
Private Sub CustomerID_DblClick(Cancel As Integer) ' Create a new CustomerID when user double-clicks in the CustomerID field On Error GoTo ErrorHandler Dim rstResults As Recordset ' This will hold the set of result records Dim strSQL As String ' This variable will hold the text of the SQL Statement ' If there is nothing in the CustomerID text box If IsNull(CustomerID) Then ' Make the SQL statement strSQL = "SELECT MAX(customerid) + 1 AS NewID FROM customer" ' Run the SQL query against the current database Set rstResults = CurrentDb.OpenRecordset(strSQL) ' If at least 1 record is returned If rstResults.EOF = False Then ' Assign the NewID to the CustomerID field CustomerID = rstResults!NewID End If rstResults.Close ' Close up the result set Set rstResults = Nothing ' Empty out the result set End If Exit Sub ErrorHandler: Set rstResults = Nothing End Sub
Jakmile bude vše na svém místě, bude kód vypadat takto:
Uložte soubor a zobrazte formulář CustomerDataEntry. Přejděte na nový záznam a poté poklepejte na pole KódZákazníka. Nové CustomerID by mělo být vytvořeno automaticky.