VBA

24
1 DB&SQL8- VBA Visual Basics for Applications: eigen Office versie vanaf 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

description

VBA. Visual Basics for Applications: eigen Office versie vanaf 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 - PowerPoint PPT Presentation

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

24DB&SQL8-

For .... Next/ For EachFor range-of-values-of-var

statementsNext value-of-var

Dim intArray(1 To 10) As IntegerDim i As IntegerDim varIdx As Variant

For i = 1 to 10intArray(i) = i

Next i

For Each varIdx In intArrayDebug.Print 2 * varIdx

Next varIdx

verplicht typevoor For Each!