9. VBA: gestructureerd programmeren

Visual Basic for Applications is een objectgeoriënteerde programmeertaal: een programma is opgebouwd uit objecten met elk hun eigenschappen en methoden.

9.1. Objecten en gebeurtenissen

VBA-code bestaat uit statements, regels met uitvoerbare code. Op zo'n regel staan objecten en worden hun eigenschappen gebruikt, hun methoden uitgevoerd en/of hun gebeurtenissen aangeroepen.

Access bevat bv. objecten in de vorm van tabellen, query's, formulieren en rapporten. Je roept de objectenbibliotheek, object library van Access aan door in de VBA-editor op F2 te drukken.

Je past een objecteigenschap aan met een instructie van de vorm objectnaam.eigenschap = waarde en je roept een methode aan met objectnaam.methode.
Als in de objectnaam een spatie voorkomt, moet die naam tussen vierkante haken [ ] staan.

De standaardnaam van een subroutine is van de vorm objectnaam_gebeurtenis.

De gebeurtenissen werden besproken bij de macro's (zie 7.2.1.); hieronder nogmaals de meest gebruikte.

9.1.1. Formuliergebeurtenissen

  • On Open: gebruikt om de recordset aan te passen voor het formulier werkelijk geladen wordt
  • On Load: gebruikt om berekeningen te maken, standaardwaarden in te stellen en visuele elementen aan te passen vooraleer de recordset getoond wordt
  • Before Update: validatie van de ingegeven data, vooraleer ze opgeslagen worden en vooraleer een nieuw record in de tabel toegevoegd wordt.
  • On Double Click: treedt op als de gebruiker op de recordselector (grijze pijl links) dubbelklikt. Gebruikt om detailgegevens te tonen.
  • On Unload: de gebruiker klikte op het kruisje om het formulier (of Access) te sluiten. Kan gebruikt worden om de gebruiker een laatste vraag te stellen voor het sluiten.
  • On Current: treedt op als een record "current" wordt, de focus krijgt. Handig om knoppen te in- of uit te schakelen afhankelijk van de inhoud van het record. Treedt op telkens er van record gewisseld wordt, dus gebruik het niet teveel.
  • On Delete: gebruikt samen met Before Delete Confirm om de gebruiker te vragen of hij zeker is dat het record gewist mag worden.
  • On Activate: treedt op net na On Load en telkens een formulier opnieuw de focus krijgt. Gebruikt om de gegevens te vernieuwen.

Behalve gebeurtenissen op het formulier zelf, zijn er ook veelgebruikte events op besturingselementen:

  • On Click: de gebruiker klikte op het element, bv. een knop.
  • Before Update: om de nieuwe of gewijzigde inhoud te valideren. Je kan de gebruiker vragen of hij zeker is van de nieuwe waarde en zonodig Cancel = True zetten.
  • After Update: gebaseerd op de nieuwe waarde kan je andere elementen op het formulier aanpassen
  • On Double Click: gebruiker verwacht detailgegevens te zien als hij dubbelklikt op een element

9.1.2. Rapportgebeurtenissen

Je kan de inhoud en opmaak van een rapport via gebeurtenissen aanpassen, afhankelijk van de situatie:

  • On Open: mogelijkheid om de recordset aan te passen voor het rapport werkelijk opgesteld wordt
  • On Load: de gegevens van het eerste record zijn beschikbaar en de opmaak kan aangepast worden
  • On Activate: treedt op net na On Load. Kan bv. gebruikt worden om het afdrukvoorbeeld te maximaliseren.
  • On Close: bij het sluiten van het rapport kan je bv. het Accessvenster terug het vorig formaat geven: DoCmd.Restore
  • On No Data: treedt op na On Open. Laat toe om een bericht te tonen dat er geen gegevens zijn en het rapport te sluiten met Cancel=True

9.2. Variabelen en constanten

Variabelen zijn elementen met een unieke naam waarin je tijdens de uitvoering van het programma gegevens kan bewaren.

De naam van een variabele moet beginnen met een letter, mag enkel letters, cijfers en het onderstrepingsteken bevatten, is maximaal 255 karakters lang en mag geen sleutelwoord zijn, d.w.z. een term die al een betekenis heeft in VBA (zoals de naam van een commando of eigenschap).

Hoewel variabelen verschillende waarden kunnen krijgen tijdens de uitvoering van een programma, behoren deze waarden normaal tot hetzelfde gegevenstype.

GegevenstypeMogelijke waardenGrootte
Bytegeheel getal tussen 0 en 2551 byte
Booleanlogische variabele, kan alleen de waarde TRUE (verschillend van 0) of FALSE (0) bevatten2 bytes
Integergeheel getal tussen -32.768 en 32.7672 bytes
Longgeheel getal tussen -2.147.483.648 en 2.147.483.6474 bytes
Singlekommagetal van ongeveer -3,4E38 tot 3,4E38, met een precisie van 7 cijfers4 bytes
Doublekommagetal van ongeveer -1,8E308 tot 4,9E324, met een precisie van 15 cijfers8 bytes
Currencyvaluta met 4 cijfers na de komma8 bytes
Datedatum en tijd, van middernacht 0:00:00 op 1 januari 100 tot 23:59:59 op 31 december 99998 bytes
Objecteen willekeurig object4 bytes
Stringtekst, alle alfanumerieke waarden; de waarde wordt tussen aanhalingstekens geplaatstvariabele lengte
Variantwillekeurig type; neemt meestal 22 bytes in beslag en er is geen type-controle op.variabele lengte

Aan het begin van een procedure of functie vertel je VBA welke variabelen je wil gebruiken, d.w.z. je declareert de variabelen.
Meestal gebruik je daarvoor het commande DIM: Dim [varnaam] As [vartype]
Declareer je geen type, dan wordt het een variant - wat het programma vertraagt en onnodig geheugen in beslag neemt.

Behalve DIM kan je ook de commando's PUBLIC, PRIVATE en STATIC gebruiken.

In VBA is het niet noodzakelijk om variabelen expliciet te declareren, maar je doet het beter wel, dan heb je meer overzicht en structuur in je programma.
Je kan die declaratie ook afdwingen, door als eerste regel in het moduleblad Option Explicit te typen ofwel door VBA dat automatisch te laten doen: open de VBA-Editor en kies in menu Extra – Opties. Activeer daar de optie Variabelen Declareren Vereist.

Een constante is een variabele waarvan de waarde nooit verandert. Volgens de programmeerconventie is de naam van een constante in hoofdletters.
Een constante krijgt bij de declaratie haar waarde toegekend, bv: Dim STARTDATUM as Date = #01/01/2017#

VBA heeft ook ingebouwde constanten, die beginnen allemaal met vb, bv in een messagebox: vbOkOnly

9.3. Basis programmeerstructuren

Als een programma goed gestructureerd is, is het gemakkelijk leesbaar en onderhoudbaar.
En om gestructureerde programma's op te stellen, maak je gebruik van 3 basisstructuren:

VBA kent de volgende selectie-instructies:

En de loopinstructies:
Do While voorwaarde
  ...
Loop

Of:
For teller = startwaarde To eindwaarde [Step stapwaarde]
  ...
Next

Een gegevensreeks (array) kan je aflopen met
For Each element In groep
  ...
Next

9.4. Foutafhandeling

In elke subroutine incorporeer je best de eenvoudige foutopvang hieronder:
Public Sub subroutineNaam
On Error GoTo Foutafhandeling
  'hier komt de uit te voeren code
ExitSubroutine:
  'opruiming: objecten sluiten of op Nothing zetten
  Exit Sub
Foutafhandeling:
  MsgBox "Er is een fout opgetreden." _
  &vbCrLf & "Fout nummer " & Err.Number & ": " & Err.Description, vbCritical
  Resume ExitSubroutine
End Sub

Nog handiger: zet de boodschap in een aparte publieke subroutine en roep ze telkens aan bij de foutafhandeling.