Introduktion
Microsoft Access innehåller ett antal funktioner som gör det möjligt för databasutvecklare att skapa datainmatningsformulär, rapporter och frågor som kan vägleda användare att söka efter befintlig data i databasen och ange ny data. Olika frågebyggare och guideverktyg underlättar denna utvecklingsprocess. Även med dessa verktyg kan det dock finnas situationer där utvecklaren skulle vilja lägga till ännu mer funktionalitet som inte redan tillhandahålls av MS Access-utvecklingsverktygen. Till exempel kan utvecklaren vilja automatiskt korrigera felaktig data innan den sparas i databasen, visa en varning om en affärsregel överträds, hjälpa användaren att navigera från ett datainmatningsformulär till ett annat eller starta en rapport med några anpassade filter. Sättet att åstadkomma sådan anpassning är genom att lägga till kod med hjälp av programmeringsspråket Visual Basic for Applications.
Visual Basic for Applications (VBA) är det programmeringsspråk som används i Microsoft Office-familjen av programvaruprodukter som Excel och Access. VBA-språket kommer från "Basic"-språket som uppfanns 1964 och som blev populärt på persondatorer på 1970-talet. Den "visuella" delen av namnet lades till av Microsoft för att återspegla användningen av det grundläggande programmeringsspråket i Microsoft Windows.
Det finns många tutorials som introducerar grundläggande programmering. Denna handledning kommer att fokusera på en liten delmängd av funktioner i VBA-språket som används i MS Access.
Innehåll
- Händelser i Microsoft Access
- VBA-kodexempel:Se till att namnen är korrekta
- VBA-språket – Deklarera och tilldela variabler, villkorliga uttalanden och kommentarer
- VBA-språket – funktioner, metoder och exempel
- VBA-språket – egenskaper
- VBA-kodningsövningar
- Hantera fel i VBA
- Köra anpassade SQL-frågor i VBA
Nästa sida introducerar händelser i Microsoft Access.
Händelser i Microsoft Access
I Access bifogas VBA-programmeringskod till formulär och rapporter och kan ställas in för att köras vid en specifik tidpunkt eller som reaktion på en specifik händelse. Denna programmeringsstil kallas ibland för "händelsebaserad" programmering, vilket betyder att koden utvecklaren skriver kommer att köras som svar på någon händelse .
När ett formulär visas i formulärvyn kommer det i allmänhet att fråga efter befintliga data från de underliggande tabellerna och sedan bara sitta där på tomgång tills användaren gör något. Användaren kan till exempel klicka på en av navigeringsknapparna för att flytta till nästa post, de kan klicka i en textruta och börja skriva in lite ny data eller så kan de klicka på knappen Stäng för att stänga formuläret. Var och en av dessa åtgärder resulterar i en Event händer i formen. Varje klick med musen eller tangentbordet hanteras som en händelse.
För det mesta har händelser ett standardbeteende. Genom att klicka på navigeringsknappen "nästa post" rullar formuläret till nästa datapost. Att skriva bokstaven "C" när markören är i en textruta gör att bokstaven "C" visas i textrutan. Att trycka på TAB-tangenten gör att markören hoppar till nästa textruta (eller kontroll) i formuläret och så vidare. En programmerare kan åsidosätta eller förbättra detta standardbeteende och infoga sin egen kod som ska köras som svar på händelsen.
VBA-programmering på åtkomstformulär och rapporter är huvudsakligen inriktat på att skriva kod för att svara på olika händelser.
Innan du dyker in i händelsernas detaljer kan det vara lärorikt att implementera ett enkelt exempel. För att se lite kod i praktiken ger nästa avsnitt av den här handledningen en genomgång för att lägga till VBA-kod i ett datainmatningsformulär.
VBA-kodexempel:Se till att namnen är korrekta
Vad som följer är ett relativt kortfattat och enkelt exempel på att lägga till VBA-kod till ett datainmatningsformulär i MS Access. Flera detaljer kommer att hoppas över för korthets skull. Efter det här exemplet kommer resten av den här handledningen att fylla i dessa detaljer.
Det här exemplet använder Kund datainmatningsformulär som anpassades i självstudiekursen Advanced MS Access Forms. Du kanske vill slutföra den självstudien (eller åtminstone de delar som handlar om formuläret för kunddatainmatning) innan du fortsätter.
Vid inmatning av ny kundinformation vill vi försäkra oss om att kundens namn skrivs in i "korrekt skiftläge". Det vill säga att den första bokstaven i namnet ska vara en stor bokstav och resten av namnet ska vara med gemener. Om användaren anger:"Joe" vill vi att formuläret automatiskt korrigerar detta till versaler:"Joe".
När det gäller Events kommer vi att lägga till kod som är kopplad till After Update-händelsen för fältet Förnamn på kundformuläret. Det betyder att efter något har ändrats (uppdaterat ) i fältet Förnamn kommer händelsen Efter uppdatering att utlösas och sedan kommer koden vi skriver att träda i kraft för att säkerställa att det namn som än skrevs omvandlas till versaler.
Följande steg sätter den här koden på plats.
- Öppna kunddataposten i designläge.
- Högerklicka på Förnamn textrutan och välj Egenskaper från popup-menyn.
- När Egenskapsbladet visas klickar du på fliken Händelse. Detta visas i figuren nedan:
Notera listan över händelser som visas. Var och en kan programmeras att svara på den specifika händelse som händer med Förnamn textruta.
- Skapa en ny händelsehanterare genom att klicka på de tre prickarna till höger om händelsen Efter uppdatering.
- Choose Builder fönstret visas. Välj Code Builder och klicka sedan på OK knapp.
- Fönstret för VBA-kodredigering visas. Observera att Access redan har skapat subrutinsubben som börjar med orden Private Sub och slutar med orden End Sub.
Namnet på subrutinen skapas med namnet på formulärkontrollen (FirstName) och namnet på Händelse som denna subrutin kommer att svara på (AfterUpdate).Raden End Sub är där den här subrutinen slutar.
- Lägg till följande kod på den tomma raden mellan Private Sub och End Sub.:
FirstName = StrConv(FirstName, vbProperCase)
När den är klar visas koden enligt följande:
Denna nya kodrad gör följande:
StrConv är en funktion som tar in innehållet i textrutan FirstName och konverterar den enligt den andra parametern som ges som är vbProperCase i detta exempel. Efter att denna omvandling är klar kommer resultatet att tilldelas (med likhetstecknet) tillbaka till textrutan Förnamn. Detta kommer att skriva över allt som för närvarande finns i textrutan Förnamn. Den här funktionen tar till exempel "sally", konverterar den till "Sally" och lägger sedan in "Sally" i textrutan Förnamn.
- Spara den här nya koden genom att dra ned Fil menyn och välj Spara .
- Testa den nya koden. Växla tillbaka till skärmen Microsoft Access Design Mode. Ändra vyn till Formulärvy.
- Navigera till en tom post. Klicka på fältet Förnamn och skriv in ett namn med alla små bokstäver:
- Tryck på fliken för att gå till nästa textruta. Joes namn bör ändras till "Joe" som visas nedan:
- Om du får ett fel, växla tillbaka till VBA-kodredigeraren och se till att du har stavat alla delar av koden korrekt. Du kan behöva dra ned Kör menyn och välj Återställ för att stoppa VBA-koden från att köras.
Ovanstående exempel gav en snabb titt på hur man kan anpassa beteendet hos ett formulär för att hjälpa användaren att ange snyggt formaterad data i databasen. Flera detaljer hoppades över under det här exemplet och dessa detaljer kommer att diskuteras i resten av denna handledning.
VBA-språket
Detta avsnitt introducerar kortfattat huvuddelarna av VBA-språket som det används i MS Access. En omfattande översikt av VBA ligger utanför den här handledningen. Referenser till mer omfattande böcker och material finns i slutet av denna handledning.
Deklarera variabler
En variabel är ett namn som ges till en platshållare där programmeraren kan lagra vissa data. Till exempel kan en variabel användas för att lagra ett tal medan vi utför vissa matematiska operationer på det eller jämföra dess värde med andra variabler. Variabler kan deklareras för att hålla värden av en specifik datatyp som heltal, strängar eller datum. För att deklarera en ny variabel, använd Dim-satsen. Till exempel för att deklarera en ny variabel med namnet Mitt Namn och ställ in den för att hålla en sträng (tecken), gör följande:
Dim strMyName As String
För att deklarera en ny variabel med namnet "AccountBalance" och ställa in den för att lagra ett tal med en decimal, använd följande:
Dim dblAccountBalance As Double
Tilldela värden
Ett värde kan tilldelas en variabel eller till en kontroll på formuläret med hjälp av likhetstecknet. För att till exempel lagra namnet "Alex" i variabeln MyName använder du följande:
strMyName =“Alex”
För att kopiera innehållet i textrutan Förnamn till variabeln MyName, använd:
strMyName =[FirstName]
Värden kan också beräknas innan de tilldelas. Till exempel tar följande uttryck den aktuella kundens kontosaldo från textrutan [Saldo], lägger till 1 % ränta (genom att multiplicera saldot med 1,01) och minskar sedan resultatet med 10 USD. Slutligen tilldelas resultatet till variabeln AccountBalance.
dblAccountBalance =( [Saldo] * 1,01 ) – 10,00
Villkorliga uttalanden
En villkorssats använder ett logiskt test för att avgöra vilka rader kod som ska köras härnäst. Den villkorliga satsen If … Then används ganska ofta. Till exempel:
If AccountBalance < 1000 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
Det logiska uttrycket AccountBalance <1000 utvärderas. Om detta uttryck är sant (till exempel om AccountBalance är $400) körs nästa rad efter Then. I det här exemplet är månadsavgift =10.
Om detta uttryck är falskt körs raden efter Else.
Det logiska uttrycket kan innehålla flera delar som är sammankopplade med de booleska operatorerna OR, AND och NOT. En mer grundlig diskussion om booleska uttryck kan hittas i denna programmeringshandledning. Anta till exempel att vi avstår från månadsavgiften om kontot är mindre än ett år gammalt. Anta att vi har kontoålder som kontots ålder i månader. Då skulle koden vara:
If AccountBalance < 1000 AND AccountAge > 12 Then MonthlyFee = 10 Else MonthlyFee = 0 End If
Mer än en kodrad kan köras i If … Then-satsen och If … Then-satserna kan kapslas in i varandra.
Kommentarer
När du programmerar på vilket programmeringsspråk som helst, är det bra att inkludera kommentarer som beskriver koden. I VBA kan en kommentar inkluderas genom att börja med ett enda citat. Om vi tar ovanstående som exempel kan vi lägga till följande kommentarer:
Fler delar av VBA-språket diskuteras på nästa sida.
VBA-språk – fortsättning
Funktioner
VBA-språket har ett stort antal inbyggda funktioner och metoder som kan användas för att utföra olika uppgifter såsom matematiska funktioner (sin, cos, tan), strängfunktioner och många andra. Funktioner har vanligtvis en eller flera ingångsparametrar som används av funktionen. Till exempel, i funktionen Cos(45) är "45" den ingångsvinkel som cosinusfunktionen kommer att fungera på. StrConv-funktionen kräver två indataparametrar:strängen som ska konverteras och konverteringsstilen:
StrConv(FirstName, vbProperCase)
Några praktiska funktioner inkluderar:
MsgBox( prompt, knappar, titel) | Visa en popup-meddelanderuta med texten, knapparna och rubriken |
StrConv( uttryck, stil ) | Konvertera stränguttrycket till versaler, gemener eller riktiga bokstäver |
Vänster( uttryck, tecken ) | Ta bort tecknen längst till vänster från stränguttrycket |
Mid(uttryck, start, tecken ) | Ta den mittersta uppsättningen av tecken från stränguttrycket från början |
IsNull( uttryck ) | Testa om stränguttrycket (eller textrutan) inte har något innehåll (är null) |
Nz( uttryck, värde_om_null ) | Om uttrycket är null, fyll i ett standardvärde |
Now() | Returnerar aktuellt datum och tid |
Runda(uttryck, decimaler ) | Avrundar det numeriska uttrycket till ett visst antal decimaler |
RGB( röd, grön, blå ) | Returnerar färgheltalet baserat på en kombination av rött, grönt och blått |
Metoder
Metoder i VBA är som funktioner men de är kopplade till en kontroll eller annat objekt på ett formulär eller en rapport.
Några praktiska metoder inkluderar:
DoCmd.CancelEvent | Avbryter den aktuella händelsen som hanteras |
DoCmd.Close | Stäng det aktuella formuläret (eller databasen) |
DoCmd.OpenForm | Öppnar ett nytt formulär |
DoCmd.OpenReport | Kör ett MS Access-kommando som att spara nya eller uppdaterade data, ångra en ändring eller avsluta ett formulär |
.SetFocus | Sätt fokus på kontrollen på formuläret |
.Ångra | Ångra den senaste ändringen eller kommandot |
.Uppdatera | Uppdaterar all data som ligger bakom ett formulär |
.Förfrågan | Begär data som tillhandahålls till ett formulär |
. Måla om | Målar om alla kontroller på ett formulär |
Många fler funktioner och metoder listas på denna Microsoft-webbplats.
Följande exempel använder sig av olika funktioner och metoder i olika kombinationer.
Exempel
Visa användaren en varning om kontosaldot är under $1 000
If AccountBalance < 1000 Then MsgBox("Warning: The Account Balance is now less than $1,000.") End If
Om textrutan Förnamn i formuläret innehåller något, konvertera det till versaler
If Not IsNull( [FirstName] ) Then FirstName = StrConv( [FirstName], vbProperCase ) End If
nästa sida introducerar egenskaper för olika objekt.
Egenskaper
Varje element i ett datainmatningsformulär eller en rapport har en uppsättning egenskaper förknippas med det. Egenskaper styr placering, färg, teckensnitt, bakgrund och andra utseende och formateringsattribut för varje kontroll. Till exempel, några av de många egenskaperna hos en TextBox inkluderar:
Synlig | Avgör om textrutan är synlig i formuläret |
Låst | Avgör om data i textrutan kan ändras |
Flikindex | Ordningen av varje kontroll när användaren navigerar i formuläret genom att trycka på Tab |
Etikett | Identifierar namnet på etiketten som är kopplad till textrutan |
Bredd, höjd, topp- och bottenposition | Indikerar den relativa positionen och storleken på textrutan |
Bakgrundsstil och färg | Ställer in bakgrundsstil och färg för textrutan |
Kantstil och färg | Ställer in stil och färg på kanten runt textrutan |
Teckenstorlek, vikt, understrykning, kursiv stil, färg och justering | Ställer in teckensnitt och stil |
Marginaler och utfyllnadsavstånd – Anger marginaler och utfyllnad runt insidan av textrutan |
Egenskaper kan ställas in med hjälp av designvyn och sparas med formuläret eller rapporten. Egenskaper kan också ändras med VBA-kod när formuläret körs. För att komma åt en egenskap i VBA, använd namnet på kontrollen, sedan en punkt och sedan namnet på egenskapen. Till exempel ändrar följande kod teckensnittsfärgen i textrutan CustomerID till Röd:
CustomerID.ForeColor =vbRed
Avsnitten som följer ger några övningar som kombinerar olika delar av VBA-programmeringsspråket för att anpassa beteendet hos olika datainmatningsformulär.
VBA-kodövningar
Prova följande övningar som anpassar formulär. Se de tidigare avsnitten för exempel på kod som kan anpassas för att passa den aktuella övningen.
Övning 1
Ändra CustomerDataEntry-formuläret för att lägga till två AfterUpdate-händelsehanterare som konverterar förnamn och efternamn till versaler (Skapa en separat AfterUpdate-hanterare för varje textruta). Skriv kod för att först kontrollera att textrutan inte är null innan du försöker konvertera texten.
Övning 2
Ändra AccountsDataEntry-formuläret för att lägga till en AfterUpdate-händelsehanterare som visar en varningsruta om kontosaldot är under $5 000. Gör också teckensnittsfärgen i textrutan Balans till röd.
Övning 3
Ändra kunddatainmatningsformuläret. Skapa en vid förlorat fokus-underrutin som gör etiketten för textrutan Förnamn röd (vbRed) om användaren lämnar textrutan Förnamn utan att skriva något. Ställ in etiketten på blå (vbBlue) om det finns något i textrutan. I exemplet nedan skrevs ingenting i textrutan FirstName och sedan flikades användaren till nästa textruta vilket gjorde att FirstName-etiketten blev röd.
Nästa sida i denna handledning diskuterar hur man hanterar fel i VBA-kod.
Hantera fel i VBA
Ibland kommer VBA-kod att stöta på ett fel. Till exempel, om en textruta är tom och vi försöker konvertera innehållet i textrutan till versaler, kommer StrCnv-funktionen att misslyckas. Ett annat exempel är när division med noll sker. Utan felhantering kan dessa problem få VBA-programmet att krascha. När ett fel uppstår kan specialkod komma igång för att hantera felet och fortsätta bearbeta VBA-koden.
De två huvudsakliga felhanteringsfunktionerna i VBA är On Error Goto-satsen och Resume Next-satsen. Dessa två VBA-kodsatser arbetar tillsammans för att förhindra att VBA kraschar programmet.
På Error Goto-satsen informerar VBA om vad som ska göras när ett fel uppstår i en subrutin. Goto-delen av uttalandet refererar till en etikett någon annanstans i koden där VBA kommer att fortsätta att fungera. När VBA-programmet kommer till etiketten kommer alla fel att dyka upp i ett objekt som heter Err. Egenskapen Err.Description kommer att innehålla en textbeskrivning av det senaste felet. Resume Next-satsen gör att VBA-programmet fortsätter att köras från punkten efter att felet uppstod.
Följande exempel utökar rutinen FirstName_AfterUpdate som introducerades i början av denna handledning. Nu kan VBA-programmet hantera eventuella fel som kan uppstå i programmet.
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
nästa avsnitt i denna handledning diskuterar hur man inkluderar SQL-kod i VBA.
Köra anpassade SQL-frågor i VBA
Structured Query Language (SQL) är programmeringsspråket som används i relationsdatabaser som MS Access, SQL Server, Oracle och många andra. SQL-satser kan användas för att infoga, uppdatera, ta bort och hämta (välja) dataposter från tabeller (bland många andra funktioner). Ett enkelt exempel på en SQL-sats skulle vara:
SELECT customerid, firstname, lastname FROM customer
SQL-kod kan skrivas i VBA och köras vid lämplig tidpunkt. Till exempel kan en VBA-subrutin skrivas för att fråga i kundtabellen för att hitta det högsta kund-ID. Sedan kan vi lägga till 1 till det här numret för att få ett nytt oanvänt kund-ID för ett nytt rekord.
De allmänna stegen för att utföra denna typ av uppgift är:
Skapa en SQL-sats
Kör SQL-satsen med den öppna databasanslutningen (som heter CurrentDb i VBA)
Hämta de resulterande posterna och använd den hämtade datan
För att skapa denna VBA-subrutin, öppna CustomerDataEntry-formuläret och hämta egenskaperna för CustomerID-fältet. Under händelsefliken klickar du på de tre prickarna till höger om händelsen On Dbl Click. Välj Kodbyggare så skapas stubben enligt följande:
Private Sub CustomerID_DblClick(Cancel As Integer) End Sub
Lägg till följande kod:
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
Koden kommer att se ut så här när allt är på plats:
Spara filen och se sedan CustomerDataEntry-formuläret. Navigera till en ny post och dubbelklicka sedan i fältet Kund-ID. Ett nytt kund-ID bör skapas automatiskt.