VBA
-
Upload
carter-sampson -
Category
Documents
-
view
18 -
download
0
description
Transcript of VBA
1DB&SQL8-
VBA
Visual Basics for Applications: eigen Office versievanaf Office2000 gelijk voor alle applicaties
Programmeren onder meer nodig voor• Het schrijven van eigen functies om invoer te controleren, categorieën te vormen of waarden te berekenen• Eventafhandeling• Een directe toegang tot de databaseobjecten
Access kent ook macro’s als tussenvorm. Deze worden waarschijnlijk in volgende versies niet meer ondersteund, we zullen er daarom niet mee werken.
2DB&SQL8-
Waar staan je functies/procedures?
VBA code kan staan in een class-module:in het codeblok behorend bij een formulierin het codeblok behorend bij een rapport
te vinden via het icoon Code op de taakbalk bij het betreffende tabblad of in Design View
VBA code kan ook staan in een algemene modulevoor procedures en functies die vanuit de gehele database toegankelijk zijn
te vinden/ maken onder het tabblad Modules
3DB&SQL8-
Programmeren in VBA
Algemene syntaxregels VBA:
Statements beeindig je via ENTER-toets
Als een te lang statement naar de volgende regel moet doorlopen, geef je dat aan met _ (spatie + underscore)
Een ' geeft aan dat de rest van de regel commentaar is
Practicum regels:Gebruik Option ExplicitGeef je variabelen een prefix mee met datatypeGeef voldoende commentaar bij je programma (met ' )
4DB&SQL8-
Datatypering
Expliciete datatypering: goede programmeerstijlIn de Access Modules wordt dit afgedwongen via OPTION EXPLICIT (default) bovenin
Datatypering variabelen:
Public intBookCount As Integer (public var.)Dim strTitle As String (local var.)
Naast variabelen kun je ook constanten definiëren:
Const OurCompany = “The Greatest”Const MaxSalary = 100.000
5DB&SQL8-
Datatypen in VBA (wat voorbeelden)
prefix Var Type Size Range of values
bln Boolean 1 byte True or False
int Integer 2 bytes -32.768 -
+32.767
lng Long 4 bytes ± 2.147.483.647
dbl Double 8 bytes ± 3.4E38
cur Currency 8 bytes scaled integer(4dec)
dtm Date/Time 8 bytes 1/1/100-12/31/9999
str String var: 10 + lng <= 2 billion char
fixed: lng up to 65.400 char
var Variant 16 bytes Number: as Double
22 b + lng String: as String
6DB&SQL8-
Functies en procedures schrijven
Je schrijft eigen functies/procedures dus in algemene modules of in class modules.
De editor biedt hulp door het aanbieden van mogelijke invullingen (keuzelijsten: OK, klik Tab) en het melden van fouten.
Na elk statement geef je een ENTER Met spatie + underscore ( _) geef je aan dat een statement nog doorloopt op de volgende regel
In het Debug Window (onder View) kun je je functie of procedure direct testen. Access 2000: Immediate Window.
7DB&SQL8-
Functie - Subroutine
Function <functienaam> (argumenten met datatype) As <datatype van resultaat>
code, (evt.) leidend tot <functienaam> = …..End function
Functies kunnen een waarde als resultaat geven
Sub <procedurenaam> (argumenten met datatype)code
End Sub
Subroutines regelen acties
Functies en subroutines kunnen vanuit andere functies of sub procedures worden aangeroepen
8DB&SQL8-
Voorbeeld van een functie
Function intOppervlak (intLengte As Integer, intBreedte _ As Integer) As Integer
intOppervlak = intLengte * intBreedteEnd Function
Dus: datatypering van argumenten en resultaatresultaat in de variable <functienaam>
Statements eindigen door een RETURN, een spatie + underscore is het teken dat een statement doorloopt naar de volgende regel
9DB&SQL8-
Voorbeeld van sub procedures
Sub Welkom()Debug.Print "Hallo! Welkom!"
End Sub
Sub Welkom(strNaam As String)Debug.Print "Hallo " & strNaam & "!"
End Sub
Datatypering van eventuele argumentenGeen waarde als uitvoer, maar acties.
NB Debug.Print is geen ‘normale’ opdracht voor in een applicatie, maar kun je gebruiken om je code te testen!
10DB&SQL8-
Testen van functies en procedures
Functie: in het Debug-Window aan te roepen:
? <functienaam> (arg1, arg2) vraagteken+ haakjes
Sub:zonder argumenten: door cursor in code te zetten en Run:Go te klikken
met argumenten: in Debug-Window:
<sub naam> arg1, arg2 zonder meer!of Call <sub naam> (arg1, arg2)
11DB&SQL8-
HELP
Als je een VBA functie of constante in hebt getikt en de cursor erop staat krijg je via F1 direct informatie
NB: Help in practicumzalen werkt niet altijd!
Als je een bestaande functie of procedure aan het intikken bent in module zelf of in Debug (Immediate) Window krijg je direct informatie over de parameters
Via de Object Browser kun je allerlei informatie vinden
12DB&SQL8-
If ... ThenIf Condition Then
statementsElseIf AnotherCondition Then
statements (meerdere ElseIf mogelijk)Else
statementsEnd If
Sub testIfThen (intCijfer As Integer)If intCijfer >= 7 Then
Debug.Print “Prima”ElseIf intCijfer >= 5 Then
Debug.Print “Kon beter”Else
Debug.Print “Overnieuw!”End If
End Sub
13DB&SQL8-
Case statementSyntax Voorbeeld
Select Case VarName Select Case intLeeftijdCase Value1 Case Is < 12
Statements strCat=“kind”Case Value2 To Value4 Case 12 To 17
Statements strCat=“puber”Case Is <Vergelijkingsexp> Case 18
Statements strCat=“grens”Case Else Case 19 To 64
Statements strCat=“volw”End Select Case Else
strCat=“oudere”End Select
14DB&SQL8-
Een categoriseringsfunctie (b.v. voor in SQL!)
Function strCat(intLeeftijd As Integer) As StringSelect Case intLeeftijd
Case Is < 12strCat=“kind”
Case 12 To 17strCat=“puber”
Case 18strCat=“grens”
Case ElsestrCat=“volwassene”
End SelectEnd Function
SQL: SELECT naam, strCat(Leeftijd)
FROM Personen
15DB&SQL8-
Do while / Do until
Do {While | Until} Conditionstatements
Loop
(test vóór de eerste uitvoering van statements)
Dostatements
Loop {While | Until} Condition
(test na de eerste uitvoering van statements)
OF
16DB&SQL8-
Voorbeeld van Do While (1)
Sub Tafelvan3()
Dim intTeller As IntegerintTeller = 1
Do While intTeller <= 10 Debug.Print intTeller; " x 3 = ” ; intTeller * 3 intTeller = intTeller + 1Loop
End Sub
Kun je nu ook een gevraagde tafel (parameter) af laten drukken?En alle tafels laten afdraaien?
concatenatie:je kunt
hierkiezentussen& of ;
17DB&SQL8-
Voorbeeld van Do While (2)
Sub Wachten()
Dim d1 As DateDim d2 As Date
d1 = Now()d2 = Now()Debug.Print "Even pauze.."
Do While DateDiff("s", d1, d2) < 5d2 = Now()
Loop
Debug.Print "Ga maar verder!"End Sub
18DB&SQL8-
MsgBox
MsgBox Messagestring
Dim StrName AS StringstrName = “Margreet”
MsgBox (“Goedemorgen “ & strName & “!”)
of
MsgBox “Goedemorgen “ & strName & “!”
19DB&SQL8-
MsgBox met andere knoppenDefault heeft een MsgBox alleen een OK knop (vbOKOnly), maar zijn meer mogelijkheden:
MsgBox(Prompt, Icon + Buttons, Titel)door drukken van een button krijg je een resultaat!
Sub ShowMesBox(StrName) If MsgBox("Ben jij " & StrName & "?", vbYesNo + _ vbQuestion, "Naamcontrole") = vbYes Then MsgBox "OK" End IfEnd Sub
+ vbQuestion, vb Exclamation icoon+ vbYesNO, vbRetryCancel knoppen
20DB&SQL8-
InputboxInputBox Messagestring: een functie met een resultaat!
Sub testInputBox()Dim strResponse As String, strMsg As String
strMsg = “Tik hier je naam”strResponse = Inputbox(strMsg)
If strResponse <> “” ThenMsgBox “Goedemorgen “ & strResponse & “!”
End If
End Sub
21DB&SQL8-
Inputbox 2
Meer mogelijkheden met InputBox:
InputBox(prompt, title, default)
InputBox(“Hoe heet je?”, Naam, strDefaultnaam)
strDefaultnaam: bijvoorbeeld degene die het laatst het programma gebruikt heeft
22DB&SQL8-
For .... Next
For range-of-values-of-varstatements
Next value-of-var
Voorbeeld:
Dim intTeller As IntegerFor intTeller = 1 To 10
Debug.Print intTellerNext intTeller
en nu de tafels?
23DB&SQL8-
For .... Next toepassing
Sub PrintTafels()
Dim intTeller1 As IntegerDim intTeller2 As IntegerFor intTeller1 = 1 To 10 Debug.Print "Tafel van " & intTeller1 For intTeller2 = 1 To 10 Debug.Print intTeller2 & " x " & intTeller1 & " = " & intTeller2 * intTeller1 Next intTeller2Next intTeller1End Sub