cursus VBA 2007
-
Upload
yanni-moralyanessiadis -
Category
Documents
-
view
255 -
download
24
description
Transcript of cursus VBA 2007
Programmeren met Excel 1
1 VBA-instructies vastleggen met de macro-recorder
1.1 Het tabblad ontwikkelaars toevoegen
Voor we macro’s kunnen gebruiken moet het tabblad ontwikkelaars toegevoegd worden.
Klik hiervoor op de “Office knop” en kies “Opties voor Excel”
Schakel vervolgens “Tabblad Ontwikkelaars op het lint weergeven” in.
Programmeren met Excel 2
1.2 Macrobeveiliging instellen
Indien je een office document ontvangt kan dit een macro bevatten die niet onschuldig is.
Stel daarom het beveiligingsniveau correct is.
1.3 Een macro opnemen
We willen een macro opnemen om de achtergrond van een cel rood te kleuren.
Kies in tabblad “Ontwikkelaars” voor “Marco opnemen”.
Programmeren met Excel 3
Er verschijnt een dialoogvenster waarin we de naam van de macro invullen.
De macro naam moet beginnen met een letter, en er zijn enkel letters, cijfers en het
onderstrepingsteken _ toegelaten. Spaties en punten zijn niet toegelaten. Afspraak: de
eerste letter van elk woord is een hoofdletter, de andere letters zijn kleine letters. De naam
van de macro moet logisch gekozen zijn.
We kiezen hier voor de naam KleurAchtergrondRood.
Wanneer een macro opgenomen wordt is de knop “Macro Opnemen” verandert in de knop
“Opname stoppen”.
Programmeren met Excel 4
Pas de achtergrondkleur van een cel aan naar rood terwijl de macro opname loopt.
Vervolgens stop je de opname. De verdere handelingen worden nu niet verder opgenomen.
1.4 Een macro uitvoeren
We zullen de macro KleurAchtergrondRood testen.
Selecteer de cel A3.
Klik op de knop “Macro’s weergeven” in het lint.
Een lijst met alle beschikbare macro’s (in dit geval is er slechts 1 macro) verschijnt.
Selecteer de uit te voeren macro en kies Uitvoeren of dubbelklik op de macronaam uit de
lijst.
Controleer of de cel A3 rood is gekleurd.
Bewaar de werkmap onder de naam Macro in “Mijn documenten\VBA”
Programmeren met Excel 5
1.5 Een macro verwijderen of verbeteren
Opmerking: Een macro verwijderen moet je slechts uitvoeren bij problemen!!
Werkt een macro niet zoals je had gehoopt, dan zijn er 2 mogelijkheden. Ofwel ga je hem
manueel verbeteren. Gaat het om een eenvoudige opdrachtmacro dan zal je vlugger
geholpen zijn om de verkeerde macro eerst te verwijderen. Neem de macro daarna opnieuw
op.
Een macro verbeteren kan wel handig zijn om er “overtollige broncode” uit te verwijderen.
De programmagenerator plaatst dikwijls overbodige code in de macro, wat de uitvoering
vertraagt.
Om een macro te verbeteren of te verwijderen ga je op dezelfde manier tewerk zoals in 1.4.
Je krijgt terug het venster met alle macro’s die beschikbaar zijn. Klik de gewenste macro aan
en klik op Verwijderen om de macro te verwijderen of op de knop Bewerken om hem aan te
passen.
De Visual Basic editor wordt opgestart. Je ziet de code van de macro. Je kunt nu alle
overtollige code verwijderen en de bestaande code eventueel aanpassen. We zullen dat
later uitgebreid bespreken.
1.6 Een document met een macro bewaren
Excel documenten die macro’s bevatten moeten bewaard worden met de extensie .xlsm in
plaats van de standaard .xlsx extensie.
Programmeren met Excel 6
1.7 Nog meer macro’s
1.7.1 Transparant maken
Neem een tweede macro op die de achtergrond van de actieve cel weer transparant maakt.
De naam van de macro is “VerwijderAchtergrondkleur. Test vervolgens deze macro uit op cel
A3 die normaal rood is.
1.7.2 Valutanotatie
Neem een macro Valutanotatie op waarmee je de getallen in de geselecteerde cellen met 2
decimalen en het valutasymbool € voor het getal laat weergeven.
Typ enkele getallen in de cellen B1,B2 en B3 en ontroleer of de notatie in de cellen B1, B2 en
B3 veranderd is in de valutanotatie.
Sla het bestand op onder dezelfde naam Macro.xlsm
1.8 De Visual Basic-editor
Om de code van macro’s te bekijken en te wijzigen gebruiken we een apart venster: de
Visual Basic-editor. Alle Office-toepassingen (Excel, Word, Access, …) gebruiken dezelfde
programmeeromgeving.
Je kunt de editor starten door te klikken op de Visual Basic-knop onder ontwikkelaars.
De Visual Basic-editor bevat een menubalk en enkele werkbalken met opdrachten eigen aan
de programmeeromgeving: bv. uitvoeren van een programma, foutopsporing,…
Daaronder vind je verschillende vensters met informatie. Je kunt deze vensters en de
werkbalken naar wens zichtbaar maken, verbergen en herschikken.
Programmeren met Excel 7
In het linkerdeel (het projectvenster is het bovenste venster) zie je de structuur van je
werkmap (bij ) en zie je de modules (bij )
Om het code-venster van een module te openen moet je op die module dubbelklikken.
Als je een macro opneemt, komt die automatisch in een nieuwe module terecht, met als
naam Module1. Bewaar je de werkmap en open je ze later opnieuw, dan zullen nieuwe
macro’s in de module Module2 komen, enz.
Als je niet oplet, vind je op de duur de juiste code niet meer terug. Je kunt procedures (dit is
de code die gegenereerd is door een macro) verplaatsen door te knippen en te plakken van
de ene module naar de andere. Een leeg moduleblad kunnen we verwijderen door er met de
rechtermuisknop op te klikken en in het snelmenu te kiezen voor module verwijderen.
We bekijken de code van de macro VerwijderAchtergrondkleur
Een procedure begint altijd met Sub en eindigt altijd met End Sub. Daarna volgen enkele
commentaarregels. Deze zijn te herkennen aan de groene kleur waarin ze worden
weergegeven. Als je deze regels verwijdert zal het programma nog altijd uitgevoerd kunnen
worden. We kunnen zulke regels zelf bijvoegen door de regel te beginnen met het
weglatingsteken ‘. In deze commentaar leggen we uit wat we met een bepaalde code
bedoelen en waarvoor de code juist dient. Een programma dat goed gedocumenteerd is, kan
achteraf veel eenvoudiger aangepast worden.
Programmeren met Excel 8
2 Gebruik van dialoogvensters
2.1 Berichtvensters
2.1.1 Bericht 1
Werk verder in het bestand Macro.xlsm
We hebben enkele macro’s opgenomen en we hebben de code van de procedures bekeken.
Nu zullen we zelf de code schrijven van de procedures.
De functie, die we nodig hebben om een bericht in een dialoogvenster weer te geven, is de
MsgBox-functie.
We zullen de berichten in een aparte module bewaren.
Open de Visual Basic editor in het Excel document
Kies Module in het menu Invoegen.
In het projectvenster zien we dat de nieuwe module Module2 is bijgevoegd.
Programmeren met Excel 9
Het code venster van Module2 is leeg. Als je het codevenster van een module wilt zien, moet
je dubbelklikken op de module.
We veranderen de naam van Module2 door in het eigenschappenvenster te dubbelklikken
op Module2 naast (Name) en de naam te veranderen in Berichten
Klik in het leeg codevenster.
Tik in: Sub Bericht1 en druk op Enter
Sub betekent voor de computer het begin van een procedure (een programma). Als je op
Enter drukt, voegt de computer na de naam nog () en op het einde End Sub toe. Alle code
moet tussen Sub en End Sub getypt worden.
Druk op TAB en tik verder: Msgbox “Hallo”
De code ziet er zo uit:
Test de procedure “Bericht1”.Je kunt dan die procedure op dezelfde manier starten zoals
een macro. Je kunt nog veel eenvoudiger de uitvoering aanvragen door de cursor in de
programmacode te plaatsen en dan op F5 te drukken.
Je eerste kleine programma werkt (ik hoop dat het gelukt is).
2.1.2 Bericht 2
Maak een berichtvenster met de tekst “Hallo”, een titel “Opgelet” en zowel een OK- als een
Annuleren-knop.
Plaats de cursor onder Bericht1 in de module berichten. Voeg eventueel een nieuwe
Alinea in.
Programmeren met Excel 10
Tik in: Sub Bericht2 en druk op Enter
Druk op TAB en tik verder: Msgbox “Hallo”,
Terwijl je “Hallo” intikt verschijnt een venster met informatie over de syntaxis (met uitleg
over de gebruikte functie).
Hier kun je zien in welke volgorde je de argumenten van de functie Msgbox moet intikken.
“Prompt” betekent de boodschap, vervolgens moet je de gewenste knoppen opgeven (zoals
de OK-knop), verder kun je een titel invullen enz., Het argument waarmee je bezig bent,
wordt vet gegeven, totdat je de komma typt waarmee de parameters wordt gescheiden van
de volgende parameter.
Tik verder: vbO Terwijl je de eerste letters aan het typen bent verschijnt er een uitklaplijst
waarin je zelf op het gewenste woord kan dubbelklikken of kan aanwijzen met de
pijltjestoetsen en bevestigen met ‘Tab’
Na vbOKCancel, (vergeet de komma niet na vbOKCancel) tik je verder de titel “Opgelet”
Test Bericht2.
Je kunt hetzelfde resultaat ook bereiken door de argumenten te benoemen.
Let op: benoemde argumenten worden altijd gevolgd door een dubbele punt en een
gelijkheidsteken. De code ziet er dan als volgt uit. Je hoeft de code niet in te tikken.
2.2 Invoervensters
Vraag aan de gebruiker om zijn voornaam in te voeren. Plaats de cursor onder de vorige
berichten in de module Berichten van de Visual Basic-editor.
Tik in Sub Invoer1 en druk op Enter
Programmeren met Excel 11
Druk op TAB en en tik verder:
Voornaam = InputBox (“Wat is je voornaam?”)
Deze regel vergt enige uitleg. De functie, die gebruikt wordt om een invoervenster op een
venster te tonen is InputBox. De argumenten van deze functie, zoals het bericht die op het
venster getoond wordt en de titel van het invoervenster, moeten altijd tussen haakjes
staan.
Via de InputBox kan je de uitvoering van een procedure pauzeren: de computer wacht tot de
gebruiker tekst of een getal invoert en bevestigt met Enter of een andere knop kiest.
Die invoer moet dan opgeslagen worden in het geheugen van de computer. Om de inhoud
van het geheugenvakje later te kunnen gebruiken moet je er een zinvolle naam aan geven.
Hier krijgt het geheugenvakje de naam Voornaam. De computer weet nu dat Voornaam de
naam is van een variabele. Om de inhoud van een variabele te veranderen gebruik je een
gelijkheidsteken. Meer uitleg over variabelen volgt in 2.3 Het gebruik van variabelen.
Opmerking: het bericht, dat op het venster wordt getoond is tekst en tekst moet altijd
tussen aanhalingstekens geplaatst worden.
Je kunt nu de gebruiker aanspreken met zijn voornaam via een berichtvenster.
Druk op Enter en typ verder:
Msgbox "Hallo " & Voornaam
Het eerste deel Msgbox “Hallo ” begrijp je al. Vergeet de spatie achter het woord Hallo en
voor het aanhalingsteken niet! Om delen van een boodschap met elkaar te verbinden
gebruik je het ampersand-teken (&).
OPGELET: voor en achter het ampersand-teken moet je altijd een spatie typen.
In het tweede deel van de boodschap vraag je aan de computer om de inhoud van de
variabele Voornaam te tonen.
Test Invoer1.
Plaats de cursor in de code en druk op F5 . Het invoervenster verschijnt op het scherm.
Bewaar de werkmap Macro.xlsm
Programmeren met Excel 12
2.3 Het gebruik van variabelen
Het is dikwijls nodig bepaalde gegevens tijdelijk op te slaan in het geheugen, omdat je ze pas
later nodig hebt. Met variabele bedoelt men een stukje van het werkgeheugen, waar je
tijdelijk iets kan opbergen.
Wanneer je een variabelenaam opgeeft, verbind je in feite een stukje geheugen met die
naam. Telkens je de variabelenaam vermeldt, verwijs je dan naar de informatie die in dat
deel van het geheugen opgeslagen is.
Zo’n naam moet met een letter starten en kan tot 255 tekens bevatten. Een spatie en de
tekens. ! # $ % & @ worden niet aanvaard.
Het gebruik van variabelen kan wel problemen opleveren als VBA (Visual Basic for
Applications) niet weet over welk type het gaat. Ieder type, zoals getallen, teksten, datums
en tijden, neemt een bepaalde hoeveelheid geheugen in en heeft bepaalde kenmerken. Het
is dus belangrijk met het juiste gegevenstype te werken.
De volgende tabel is enkel ter informatie. De meest gebruikte gegevenstypen zijn vet
gedrukt.
Gegevenstype Plaats in het geheugen Waarden
Byte 1 byte Getallen van 0 tot 255
Boolean 2 bytes Waar of Onwaar
Integer 2 bytes Gehele getallen van –32.768 tot 32.767
Long (long integer) 4 bytes Van – 2.147.483.648 tot 2.147.483.647
Single 4 bytes Positieve en negatieve rationale getallen.
Double 8 bytes
Zeer grote en kleine rationale getallen
(van –1,79769313486232E308 tot
+ 1,79769313486232E308)
Currency 8 bytes
Van – 922.337.203.685.477,5808
tot + 922.337.203.685.477,5807
(voor valuta bedragen)
String 1 byte = 1 teken Tekst
Date 8 bytes Data en tijden
Het opgeven van het juiste gegevenstype bij het gebruik van een variabele noemt men een
variabele declareren.
Programmeren met Excel 13
Declareren dat de variabele Voornaam van het type tekst is, gebeurt door de volgende
coderegel:
Dim Voornaam as string
Algemeen: Dim Variabelenaam as type
Toepassing: Maak een macro die de gebruiker vraagt een getal in te voeren, de
vierkantswortel van de ingevoerde waarde berekent en het resultaat in een berichtvenster
afdrukt op het scherm.
Plaats de cursor onder de procedure Invoer1 in de module Berichten.
Tik in Sub Wortel en druk op Enter
Druk op TAB en tik verder:
Dim Getal as Single
Dim Vwortel as Single
Zo weet VBA dat er twee stukjes uit het werkgeheugen moeten worden vrijgehouden, die de
naam Getal en Vwortel krijgen en die als waarde een rationaal getal kunnen bevatten
Druk op Enter en typ verder: Getal = Inputbox (“Vul een getal in:”)
Het getal, dat de gebruiker intikt, wordt opgeslagen in de variabele Getal.
Druk op Enter en typ verder: Vwortel = Getal ^ (1/2)
Zoals je wellicht weet uit de wiskundelessen is vierkantswortel uit een getal = dat getal
verheffen tot de macht ½. De uitkomst wordt opgeslagen in de variabele Vwortel.
Je kunt hier ook gebruik maken van de functie sqr. De code wordt dan:
Vwortel = sqr (Getal)
Nu moet je nog het bericht op het venster plaatsen met de wortel uit dat getal.
Druk op Enter en typ: Msgbox “Wortel: “ & Vwortel
Test het programma
2.4 Verfraaien van de dialoogvensters
De code van de procedure Invoer1 zullen we aanpassen
Kopieer de code van deze procedure in VBA en plak onder de vorige procedures in de
module Berichten.
Programmeren met Excel 14
Verander de naam van Invoer1 in Invoer2. Dit is heel belangrijk: VBA aanvaardt geen 2
procedures met dezelfde naam. Als je de naam vergeet te veranderen krijg je een
foutmelding bij het starten van de procedure.
Bij een InputBox kunnen we een aantal argumenten meegeven zoals:
Prompt: het bericht in het dialoogvenster is verplicht
Title: de titel van het venster. Als je de titel weglaat, krijgt het venster de titel
Microsoft Excel.
Default: de standaardtekst. Als je Default weglaat, blijft het invoervak leeg.
Gebruik deze argumenten om het invoervenster te verfraaien. De code kan als volgt
veranderen. Je mag zelf andere argumenten kiezen.
De code van het 1e deel van de procedure Invoer2 kan er als volgt uitzien:
Zoals je ziet kan je de tekst van een opdracht in een procedure uitsplitsen over meerdere
regels. Gebruik een spatie en het symbool ‘_’ om een langere programmaregel in meerdere
regels op te delen (max 10 regels). De spatie gevolgd door een onderstrepingsteken vormen
samen het vervolgteken. Doe dat nooit binnen een string.
Enkele van de argumenten van de MsgBox zijn (zie ook 2.1.2 Bericht2)
Prompt: de eigenlijke boodschap in het berichtvenster is verplicht
Buttons: bepaalt het pictogram en de knoppen. De mogelijkheden worden in de
volgende tabel ter informatie gegeven:
Constante Beschrijving
vbOKOnly De standaardinstelling: uitsluitend de knop OK weergeven
vbOKCancel De knoppen OK en Annuleren weergeven
vbAbortRetryIgnore De knoppen Afbreken, Nogmaals en Negeren weergeven.
vbYesNoCancel De knoppen Ja, Nee en Annuleren weergeven
vbYesNo De knoppen Ja en Nee weergeven
vbRetryCancel De knoppen Nogmaals en Annuleren weergeven
vbCritical Het pictogram weergeven (Critical Message)
vbQuestion Het pictogram weergeven (Warning Query)
Programmeren met Excel 15
vbExclamation Het pictogram weergeven (Warning Message)
vbInformation Het pictogram weergeven (Information Message)
Je gebruikt de constante vbNewLine om in een berichtvenster een nieuwe regel te
beginnen.
De code van de MsgBox kan er als volgt uitzien (je mag andere argumenten kiezen):
MsgBox Prompt:="Hallo, " & Voornaam & _
". Je ziet er vandaag niet al te best uit. " & vbNewLine _
& "Heb je slecht geslapen?", _
Title:="Je computer is bezorgd om jou!!", _
Buttons:=vbYesNo + vbQuestion
Je kunt de cursief gedrukte tekst weglaten; vergeet dan de komma niet na Voornaam,
gevolgd door een spatie en een onderstrepingsteken.
Bij het argument Buttons kun je een knop en een pictogram kiezen. Je moet de 2
argumenten verbinden met een “+” teken.
Bewaar het programma.
Test het programma.
Pas op dezelfde manier de procedure Wortel aan en noem de nieuwe procedure Wortel2.
Zorg voor een titel bij het invoervenster. Het berichtvenster moet er ongeveer als volgt
uitzien:
1. Maak zelf een procedure Dubbel: de gebruiker voert een getal in, je berekent het dubbel
en bewaart het in een variabele (gebruik voor de variabele een andere naam dan de
procedure). Het resultaat wordt in een berichtvenster weergegeven.
2. Zelfde opdracht voor een procedure Kwadraat.
3. Schrijf een procedure Berekeningen die de gebruiker in vier opeenvolgende
invoervensters vraagt een gehele waarde in te voeren. Daarna worden de vier getallen
afgedrukt, samen met hun som en hun gemiddelde.
Programmeren met Excel 16
Een mogelijke oplossing van opdracht 3 is
Sub Berekeningen()
Dim Getal1 As Integer, Getal2 As Integer, Getal3 As Integer
Dim Getal4 As Integer, Som As Integer
Dim Gemiddelde As Single
Getal1 = InputBox(prompt:="Geef het 1e getal", Title:="Berekeningen")
Getal2 = InputBox(prompt:="Geef het 2e getal", Title:="Berekeningen")
Getal3 = InputBox(prompt:="Geef het 3e getal", Title:="Berekeningen")
Getal4 = InputBox(prompt:="Geef het 4e getal", Title:="Berekeningen")
Som = Getal1 + Getal2 + Getal3 + Getal4
Gemiddelde = Som / 4
MsgBox "Getal 1 is " & Getal1 & vbNewLine & _
"Getal 2 is " & Getal2 & vbNewLine & _
"Getal 3 is " & Getal3 & vbNewLine & _
"Getal 4 is " & Getal3 & vbNewLine & _
"De som is " & Som & vbNewLine & _
"Het gemiddelde is " & Gemiddelde
End Sub
Vergeet niet alles op te slaan in het bestand Macro.xlsm
Programmeren met Excel 17
3 De opeenvolging als controlestructuur
3.1 De sequentie of opeenvolging
Programma’s worden opgebouwd met een aantal controlestructuren. Dit zijn hulpmiddelen
om onze oplossing te beschrijven. Een eerste controlestructuur die we ter beschikking
hebben is de sequentie.
Een sequentie of opeenvolging is een controlestructuur die ervoor zorgt dat opdrachten elk
één maal, in een opgegeven volgorde worden uitgevoerd.
Een sequentie bestaat altijd uit minstens 2 bevelen.
Controlestructuren kunnen grafisch voorgesteld worden met behulp van
Nassi-Shneiderman-diagrammen, kortweg structogrammen genaamd.
Het structogram voor de opeenvolging is:
Opdracht 1
Opdracht 2
Opdracht 3
De andere controlestructuren begrensde herhaling, keuze en de voorwaardelijke herhaling
komen in de volgende hoofdstukken aan bod.
3.1.1 De procedure StelWeergaveIn
Werk verder in het document Marco.xlsm
Controleer of module1 de macro’s KleurAchtergrondRood, VerwijderAchtergrondkleur
en Valutanotatie bevat.
Plaats de cursor op de eerste lijn na de laatste procedure in Module1
We willen dat de procedure StelWeergaveIn het getal in een cel op een rode achtergrond
plaatst en dat getal weergeeft met 2 decimalen en met de valutatekst €. De twee
deelopdrachten zijn reeds in een macro opgenomen.
Het structogram ziet er als volgt uit:
--StelWeergaveIn--
KleurAchtergrondRood
Valutanotatie
Programmeren met Excel 18
De procedure wordt:
Sub StelWeergaveIn ()
KleurAchtergrondRood
Valutanotatie
End Sub
Tik de bovenstaande procedure in en test ze uit.
Sla het bestand op onder dezelfde naam Macro.xlsm
3.1.2 De procedure StelWeergave2In
Plaats de cursor op de eerste lijn na de procedure StelWeergaveIn
We willen dat de procedure StelWeergave2In het getal in een cel op een lichtgele
achtergrond plaatst en dat getal weergeeft met blauwe cijfers, in het vet en met dubbele
rand omheen de cellen. Het getal wordt zonder cijfers na de komma getoond, maar de
cijfers worden wel per 3 gegroepeerd (vb. 1 236 741).
Het structogram ziet er als volgt uit:
--StelWeergave2In--
KleurAchtergrondGeel
BlauwVet
DubbeleRand
OpmaakGetal
De procedure wordt:
Opgelet: neem eerst de macro’s op en tik vervolgens de procedure in.
Programmeren met Excel 19
3.2 Een procedure aan een knop verbinden
Een procedure is maar efficiënt als hij gemakkelijk opgeroepen kan worden. Dat kan op
verschillende manieren gebeuren o.a. door een knop op het werkblad te voorzien, waarmee
de procedure kan opgestart worden.
Open zonodig het bestand Macro.xlsm
Maak het werkblad Blad1 van de werkmap Macro.xlsm actief.
Kies Invoegen onder Ontwikkelaars
We hebben maar juist de knop nodig.
Klik op deze knop en je ziet dat de muiscursor in een fijn kruis verandert.
Teken nu de knop op de gewenste plaats. Bij het loslaten van de muisknop krijg je een
venster met de beschikbare macro’s. Als je tijdens het tekenen van de knop de Alt-toets
ingedrukt houdt, zal de knop perfect op de randen van een cel komen.
Kies de macro of procedure StelWeergaveIn en klik op OK.
Programmeren met Excel 20
Verander de tekst van de knop in Rood en Valuta en klik daarna buiten de knop. Door op
ENTER te drukken neem je een nieuwe alinea binnen de knop. De tekst op de knop is
onafhankelijk van de macro. Het is enkel een hulpmiddel naar de gebruiker toe.
Selecteer een cel met als inhoud een getal en klik op de knop Rood en Valuta. Controleer
of de opmaak correct is ingesteld.
Verbind de procedure StelWeergave2In met een tweede knop. Bedenk zelf een zinvolle
naam. Test ook deze tweede knop.
Sla het bestand op onder dezelfde naam Macro.xlsm
Wil je achteraf de eigenschappen van de knop veranderen (ander lettertype, kleur, formaat,
andere plaats, tekst of macro…) dan volstaat het om de knop met de rechtermuisknop aan te
klikken. In het snelmenu kan je de eigenschappen veranderen, met de formaatgrepen kan je
de grootte aanpassen en je kunt kiezen voor
Programmeren met Excel 21
4 Werken met functies
4.1 Functies ontwerpen
We hebben tot nu toe gebruik gemaakt van procedures om programma’s te ontwerpen. Een
procedure voert één of meerdere acties uit op objecten van de Excel-omgeving. Indien je
met een macro werkt is het resultaat altijd een procedure. Een procedure wordt ook soms
subroutine genoemd, vandaar de sleutelwoorden Sub in het begin en End Sub op het einde
van een procedure.
Een functie daarentegen voert een “berekening” of een “bewerking” uit en geeft één enkele
waarde als resultaat, net zoals de gewone Excel-functies. Een functie aanvaardt gegevens (in
het vervolg spreken we van argumenten), bewerkt ze en geeft het resultaat in de vorm van
een getal, een tekst, …
Besluit: het verschil tussen een procedure en een functie zit in het resultaat. Een procedure
doet iets, terwijl een functie een antwoord op een vraag geeft.
Zijn de volgende opdrachten procedures of functies? Verklaar
TekenKader _________________________________________________
_________________________________________________
BepaalLeeftijd _________________________________________________
_________________________________________________
CentreerTitel _________________________________________________
_________________________________________________
GaNaarBegin _________________________________________________
_________________________________________________
TelOp _________________________________________________
_________________________________________________
BepaalVrijeSchijfruimte _________________________________________________
_________________________________________________
Programmeren met Excel 22
Iedere functie start met het sleutelwoord Function en eindigt met End Function
bv. Function nWortel(exponent,grondtal)
…
End Function
Na de functienaam worden (altijd tussen haakjes) de gegevens of (argumenten) vermeld die
nodig zijn voor het correct uitvoeren van de “berekening”. Deze gegevens worden
doorgegeven vanuit procedures of vanuit werkbladcellen.
De opdrachten van een functie moet je zelf invoeren. Je kan de macrorecorder niet
gebruiken.
4.2 Een eerste functie: nWortel
4.2.1 Het maken van de functie
We willen de n-de machtswortel van een getal berekenen, maar daar bestaat binnen Excel
geen functie voor. Daarom maken we er zelf een. De gegevens die we daarvoor nodig
hebben zijn de wortelexponent en het grondtal.
De functie zelf bestaat slechts uit één opdracht, namelijk de berekening van de wortel.
Uiteraard kan een functie, net als een procedure, uit een opeenvolging of sequentie van
opdrachten bestaan.
Om onderscheid te maken met gewone procedures spreken we af dat de naam van een
functie in drukletters wordt genoteerd. Een functienaam moet met een letter starten en kan
geen spaties of punten bevatten. Kies een naam die het resultaat van de functie beschrijft.
Het resultaat van nWortel(4,16) zal dus de vierdemachtswortel uit 16 zijn, of 2. Immers, de
4e macht van 2 is gelijk aan 16.
Maak een nieuwe werkmap Functies in Excel.
Open de Visual Basic-editor en maak een module functies aan.
Typ de code van de functie in:
Function NWORTEL(Exponent, Grondtal)
NWORTEL = Grondtal ^ (1 / Exponent)
End Function
Programmeren met Excel 23
4.2.2 Een zelfgemaakte functie gebruiken in je werkblad.
Selecteer een cel in het werkblad.
Klik op de knop Functie invoegen .
Het venster Functie invoegen verschijnt.
Kies in de Functiecategorie voor Door gebruiker gedefinieerd. Kies bij functienaam voor
NWORTEL
Klik op OK.
Programmeren met Excel 24
Vul een waarde in bij Exponent en Grondtal. Het resultaat wordt direct zichtbaar in het
venster.
Opdrachten:
Open zonodig het bestand Functies.xlsm en de Visual Basic-editor
1 Maak de functies DUBBEL, HELFT en KWADRAAT.
2 Maak de functies OMTRCIRKEL en OPPCIRKEL. Bereken hiermee de oppervlakte en de
omtrek van een cirkel als de straal gegeven is. Het getal PI kan opgeroepen worden via
WorksheetFunction.Pi()
Ter herinnering: de formules zijn:
Omtrek van een cirkel = 2..r
Oppervlakte van een cirkel = .r2 of = .r.r
4.2.3 Functies gebruiken in een procedure
Functies kunnen ook gebruikt worden in een procedure. Daarvoor moet je het resultaat van
deze functie toekennen aan een variabele.
We zullen de functies OPPCIRKEL en OMTRCIRKEL, die we gemaakt hebben in 4.2.2 nu
gebruiken in een procedure.
Je noemt de procedure OppervlakteEnOmtrek.
Het structogram kan er als volgt uitzien:
-- OppervlakteEnOmtrek --
Invoer van straal met invoervenster
Berekening van oppervlakte en omtrek met de functies
Meedelen van resultaten met berichtvenster(s)
Plaats de cursor op de eerste lijn na de laatste functie in de module Functies
Typ de broncode in: (opgelet: onderaan staat een korter versie van de Msgbox-code) Sub OppervlakteEnOmtrek()
Dim Straal as Single, Omtrek as Single, Oppervlakte as Single
Straal = Inputbox (“Wat is de lengte van de straal?”)
Omtrek = OMTRCIRKEL(Straal)
Oppervlakte = OPPCIRKEL(Straal)
Msgbox “De omtrek van een cirkel met straal “ & Straal & _
“ is gelijk aan “ & Omtrek & vbNewLine & _
Programmeren met Excel 25
"De oppervlakte van een cirkel met straal " & Straal & _
" is gelijk aan " & Oppervlakte
End Sub
Je kunt de code van het berichtvenster inkorten:
Msgbox “De omtrek van de cirkel is “ & Omtrek & vbNewLine & _
“De oppervlakte van de cirkel is “ & Oppervlakte
Ter herinnering: Gebruik een spatie en het symbool ‘_’ om een langere programmaregel in
meerdere regels op te delen. De constante vbNewLine wordt gebruikt om in een
berichtvenster een nieuwe regel te beginnen.
Opdrachten:
Open zonodig het bestand Functies.xlsm en de Visual Basic-editor
1 Maak zelf een procedure NdeMachtsWortel dat de wortelexponent en het grondtal
vraagt en hieruit de n-de machtswortel berekent. Het resultaat van deze berekening
wordt getoond in een berichtvenster. Gebruik de functie NWORTEL die je gemaakt hebt.
Een voorbeeld van een mogelijke procedure staat hieronder.
2 Maak eerst een functie VOLUMEBOL en maak dan een procedure die de straal vraagt aan
de gebruiker en hieruit dan het volume van de bol berekent. De formule hiervoor is:
Het volume van een bol = 3r..3
4 .
Programmeren met Excel 26
5 De keuze als controlestructuur
5.1 De selectie of keuze
Tot nu toe lagen alle opdrachten die in een procedure uitgevoerd zouden worden op
voorhand vast. Het kan nu ook zijn dat, afhankelijk van bijvoorbeeld de invoer, of afhankelijk
van de verkregen informatie, er andere opdrachten genomen moeten worden. Daarvoor
gebruiken we een nieuwe controlestructuur: de selectie of de keuze.
Veronderstel dat je de gebruiker wilt begroeten, maar de tekst van de berichtvenster hangt
af van de tijd: voor 12 uur zeg je “Goede morgen”, anders komt de tekst “Goede middag” op
het scherm.
Je kunt dat voorstellen met het volgende structogram:
-- Begroeting --
Systeemtijd voor 12 uur?
WAAR NIET WAAR
Groet = “Goede morgen!” Groet = “Goede middag!”
Het algemeen structogram voor een tweezijdige selectie is:
voorwaarde
WAAR NIET WAAR
Opdracht(en) 1 Opdracht(en) 2
Het structogram moet je als volgt lezen:
Als de VOORWAARDE WAAR is (=als aan de VOORWAARDE wordt voldaan), voer
Opdracht(en) 1 uit, anders voer Opdracht(en) 2 uit. Omdat het hier gaat om een keuze uit
twee mogelijkheden spreekt men over een TWEEZIJDIGE KEUZE.
De algemene formulering voor een TWEEZIJDIGE KEUZE:
If voorwaarde Then
opdracht(en) 1 uit te voeren als aan de voorwaarde
voldaan is
Programmeren met Excel 27
Else
opdracht(en) 2 uit te voeren als aan de voorwaarde
niet voldaan is
End If met End If wordt de keuzestructuur
afgesloten
Bij een EENZIJDIGE KEUZE moet je een opdracht uitvoeren als aan de opdracht voldaan is. Is
er niet aan de voorwaarde voldaan dan wordt er niets uitgevoerd.
De algemene formulering voor een EENZIJDIGE KEUZE:
If voorwaarde Then
opdracht(en) uit te voeren als aan de voorwaarde
voldaan is
End If
Het algemeen structogram voor een eenzijdige selectie is:
voorwaarde
WAAR NIET WAAR
Opdracht(en)
Maak een nieuwe werkmap Keuze in Excel.
Open de Visual Basic-editor en maak een module Keuze aan.
Typ de code in onder de procedure Begroeting (Vergeet niet te beginnen met Sub…)
If Time < 0.5 Then
Msgbox “Goedemorgen”
Else
Msgbox “Goedemiddag”
End If
Test de procedure.
Bewaar de werkmap onder de naam Keuze.xlsm.
Programmeren met Excel 28
Opdracht:
Vraag aan de gebruiker een willekeurig geheel getal in te voeren. Meld dan aan de gebruiker
of hij een positief of negatief getal heeft ingevoerd. Je rekent 0 bij de positieve getallen.
Dit programma mag in dezelfde map Keuze.xlsm bewaard worden.
Een mogelijke structuur van het programma.
Sub TekenGetal
Dim Getal as ___________________________________________
Getal = ________________________________________________
If _____________________________________________________
MsgBox _________________________________________
Else
MsgBox __________________________________________
End If __________________________________________________
End Sub
5.2 Meervoudige keuze
Veronderstel dat je de commentaar op een rapport automatisch moet laten invullen. De
commentaar hangt af van de behaalde uitslag. Je zult de commentaar voorlopig nog laten
verschijnen in een berichtvenster. De mogelijkheden worden getoond in een tabel.
Behaalde uitslag Commentaar
Meer dan 90 Schitterend gewerkt!
Van 80 tot (en met) 90 Zeer goed gewerkt!
Van 70 tot 80 Goed gewerkt!
Van 60 tot 70 Voldoende
Van 50 tot 60 Geslaagd
Minder dan 50 Onvoldoende
Daarvoor bestaan er in Excel 2 mogelijkheden.
Programmeren met Excel 29
5.2.1 De If…Then…ElseIf…Else…End If-blok
De eerste mogelijkheid is een uitbreiding van de tweezijdige keuze en de formulering is:
If voorwaarde1 Then
opdracht(en) 1 uit te voeren als aan voorwaarde1
voldaan is
ElseIf voorwaarde2 Then
opdracht(en) 2 uit te voeren als aan voorwaarde2
voldaan is
ElseIf voorwaarde3 Then
opdracht(en) 3 uit te voeren als aan voorwaarde3
voldaan is
…
Else
opdracht(en) uit te voeren als aan geen enkele
voorwaarde voldaan is
End If met End If wordt de keuzestructuur
afgesloten
Voer de code in (heb je inspiratie, dan mag je de commentaar wijzigen)
Sub RapportCommentaar()
Dim Uitslag As Byte
Dim Commentaar As String
Uitslag = InputBox("Geef je uitslag in percent:")
If Uitslag > 90 Then
Commentaar = "Schitterend gewerkt!"
ElseIf Uitslag > 80 Then
Commentaar = "Zeer goed gewerkt!"
ElseIf Uitslag > 70 Then
Commentaar = "Goed gewerkt!"
ElseIf Uitslag > 60 Then
Commentaar = "Voldoende"
ElseIf Uitslag > 50 Then
Commentaar = "Geslaagd"
Else
Commentaar = "Onvoldoende"
End If
MsgBox Commentaar
End Sub
Test het programma. Verbeter zonodig de fouten en bewaar onder de naam Keuze.xlsm.
Programmeren met Excel 30
5.2.2 De Select Case-opdracht:
Deze controlestructuur is interessant als je meer dan 3 mogelijke acties hebt. Soms is Select
Case eenvoudiger dan If Then omdat er minder in te typen is.
Sub Rapport2Commentaar()
Dim Uitslag As Byte
Dim Commentaar As String
Uitslag = InputBox("Geef je uitslag in percent:")
Select Case Uitslag
Case 90 To 100
Commentaar = "Schitterend gewerkt!"
Case 80 To 89
Commentaar = "Zeer goed gewerkt!"
Case 70 To 79
Commentaar = "Goed gewerkt!"
Case 60 To 69
Commentaar = "Voldoende"
Case 50 To 59
Commentaar = "Geslaagd"
Case Else
Commentaar = "Onvoldoende"
End Select
MsgBox Commentaar
End Sub
Test opnieuw uit en bewaar onder dezelfde naam Keuze.xlsm.
5.3 Oefeningen op de controlestructuur keuze
5.3.1 Berekening van de vierkantswortel uit een getal
Dit is een uitbreiding van de opgave van 2.3 Het gebruik van variabelen. Je kunt de code uit
die opgave gebruiken.
Maak een procedure die aan de gebruiker een getal vraagt. Als het ingevoerde getal negatief
is moet er een bericht getoond worden dat de vierkantswortel uit een negatief getal niet kan
berekend worden. Is het ingevoerde getal positief, dan worden zowel de positieve als de
negatieve vierkantswortel getoond. Opmerking: noem de procedure nu Wortel2 om
verwarring te vermijden met de bestaande procedure uit hoofdstuk 2.
Programmeren met Excel 31
Vul het structogram aan:
-- Wortel2 -- Invoervenster: vraag het getal
_____________________
WAAR NIET WAAR
__________________________
__________________________
__________________________
__________________________
Een mogelijke structuur van het programma.
Sub Wortel2()
Dim Getal As , Vwortel As ________________________
Getal= _____________________________________________________________________
If _______________________________________________________________ then
Vwortel = ________________________________________________________
Msgbox “De positieve vierkantswortel uit het getal “ & __________________ & _
“ is gelijk aan “ & _______________________ & vbNewLine & _
"De negatieve vierkantswortel uit het getal " & __________________ & _
" is gelijk aan -" & ________________________
Else
MsgBox
End If
End Sub
Voer de code in en test het programma uit. Verbeter zonodig de fouten.
Bewaar het bestand onder dezelfde naam Keuze.xlsm.
Programmeren met Excel 32
5.3.2 Oplossen van vierkantsvergelijkingen.
Schrijf een programma om een vierkantsvergelijking op te lossen. Ter herinnering: als de
vergelijking 0cxbxa 2 is dan is de discriminant ca4bd 2 . Als d > 0 dan zijn er 2
oplossingen: opl1=a2
db en opl2 =
a2
db . Als d = 0 dan is er 1 oplossing opl =
a2
b.
Is d < 0 dan zijn er geen oplossingen in R.
Vul het structogram aan:
-- LosVKVOp -- Invoervensters: vraag de parameters a, b en c van de vkv
Berekenen van de discrimant
_____________________
WAAR NIET WAAR
_______________
WAAR NIET WAAR
Een mogelijke structuur van het programma.
Sub LosVKVOp()
Dim a As , b As , c As , d As
Dim opl1 As , opl2 As , opl As
a = InputBox
b = InputBox
c = InputBox
d =
If Then
opl1 =
opl2 =
MsgBox "De twee oplossingen zijn: " & & " en " &
ElseIf Then
opl =
Programmeren met Excel 33
MsgBox "De oplossing is: " &
Else
MsgBox
End If
End Sub
Voer de code in en test het programma uit met waarden uit de volgende tabel. Verbeter
zonodig de fouten. Bewaar het bestand onder dezelfde naam Keuze.xlsm.
a b c aantal opl. opl1 opl2
1 5 6 2 2 3
1 2 1 1 1
1 2 3 0
3 9 6 2 1 2
2 11 18 0
4 4 1 1 0,5
Programmeren met Excel 34
6 De begrensde herhaling als controlestructuur
6.1 De begrensde herhaling of de iteratie
Tot nu toe hebben we alle opdrachten éénmaal uitgevoerd. Soms moet eenzelfde opdracht
een aantal maal uitgevoerd worden. Er bestaat een handige controlestructuur die speciaal
ontworpen werd om een opdracht of een procedure een vast aantal keren uit te voeren. We
noemen deze controlestructuur de begrensde herhaling, omdat het aantal herhalingen door
een gegeven getal begrensd is.
Veronderstel dat je een procedure wilt schrijven om de celcursor 5 cellen lager te plaatsen.
Je stelt deze opdracht voor met het volgende structogram:
-- Zak5Cellen --
CelOmlaag
CelOmlaag
CelOmlaag
CelOmlaag
CelOmlaag
Hierin zit in feite maar één enkele opdracht nl. CelOmlaag. Met de controlestructuur de
begrensde herhaling wordt het structogram:
-- Zak5Cellen --
Herhaal 5 keer
CelOmlaag
De computer begrijpt de opdracht CelOmlaag niet, maak daarom eerst een macro aan die
een cel omlaag gaat. Doe dit in een nieuwe werkmap. Zorg dat de relatieve adressering
ingeschakeld is. Lees de nodige uitleg in Excel.
Programmeren met Excel 35
Neem de macro CelOmlaag op.
De algemene formulering voor de BEGRENSDE HERHALING:
For Teller = beginwaarde To eindwaarde [Step stapwaarde]
opdrachten
Next Teller
Uitleg: teller is de naam van een variabele. Men gebruikt heel dikwijls de letter i om minder
te moeten typen. De beginwaarde is het eerste getal; dikwijls is dit het getal 1. De
eindwaarde is het tweede getal. De stapwaarde is niet verplicht en wordt later uitgelegd.
Het algemene structogram voor de BEGRENSDE HERHALING:
Voor Teller van beginwaarde tot eindwaarde met
stapwaarde
Opdracht(en)
Herhaal
Je kunt nu de code opstellen voor de procedure Zak5Cellen.
De formulering van de procedure Zak5Cellen:
Sub Zak5Cellen()
Dim Teller as Integer
For Teller = 1 To 5
CelOmlaag
Next Teller
End Sub
Hierbij zal de variabele Teller eerst de beginwaarde 1 krijgen en zal de opdracht uitgevoerd
worden. Vervolgens wordt de opdracht CelOmlaag uitgevoerd. Door de instructie
Next Teller wordt de waarde van de teller met 1 verhoogd of gelijkgesteld aan 2 en wordt in
For Teller = 1 To 5 nagegaan of de waarde van de variabele Teller (hier 2) de eindwaarde 5
nog niet overschreden heeft. Vervolgens wordt de opdracht CelOmlaag opnieuw uitgevoerd.
Dit blijft zo doorgaan tot Teller gelijk is aan 5 (To 5). Dan wordt de opdracht nog een laatste
maal uitgevoerd.
Voer de code van de procedure Zak5Cellen in.
Test de procedure. Bewaar de werkmap onder dezelfde naam Begrensde herhaling.xlsm
Programmeren met Excel 36
6.2 Oefeningen op begrensde herhaling
6.2.1 VulInTot15
Schrijf een procedure die de cellen A1 tot en met A15 opvult met de getallen 1 tot en met 15
Deze opdracht bestaat uit 2 delen:
1 Selecteer A1
2 Herhaal 15 maal de opdracht om een cel de waarde van een teller te geven waarbij de
waarbij de waarde van de teller telkens met 1 wordt verhoogd en beweeg de celcursor 1
cel omlaag.
Je kunt de opdracht om cel A1 te selecteren opnemen met een macro.
Neem de macro SelecteerA1 op. Opgelet: de vorige macro hebben we de relatieve
verwijzing gebruikt. Je moet nu de absolute verwijzing gebruiken
Je hebt de code nodig om een waarde aan een cel toe te kennen. Om bijvoorbeeld het
getal 5 in de geselecteerde cel in te voeren gebruik je de volgende code:
Activecell.Value = 5
De betekenis is: 5 wordt de waarde (of value) van de actieve cel.
Een mogelijke structuur van de procedure VulInTot15 is:
Sub VulInTot15()
Dim Teller As
S
For = To
ActiveCell.Value =
C
Next
End Sub
Vul zelf het structogram in
Programmeren met Excel 37
-- VulInTot15 --
Maak een knop op het werkblad Blad1 die je verbindt met de procedure VulInTot15 .
Test het programma uit en sla het bestand op onder dezelfde naam
Begrensde herhaling.xlsm
6.2.2 VulOnevenIn
Schrijf een procedure die de cellen vanaf B1 de cellen verticaal opvult met alle oneven
getallen vanaf 31 tot 50.
Je moet nu eerst B1 selecteren. Vervolgens ga je met de controlestructuur “begrensde
herhaling” de cellen een waarde toekennen van een teller die 31 als beginwaarde heeft en
die telkens met 2 verhoogd wordt (dit wordt de stapwaarde genoemd). De eindwaarde van
de teller mag 50 niet overschrijden.
Bekijk de code van de macro SelecteerA1:
Sub SelecteerA1()
Range("A1").Select
End Sub
Je kunt nu zelf de code schrijven om de cel B1 te selecteren:
Een mogelijke structuur van de procedure VulOnevenIn is:
Sub VulOnevenIn()
Dim Teller As
Programmeren met Excel 38
Range(“ “).S
For = To Step
ActiveCell.Value =
C
Next
End Sub
Vul zelf het structogram in
-- VulOnevenIn --
Maak een knop op het werkblad Blad1 die je verbindt met de procedure VulOnevenIn.
Test het programma uit en sla het bestand op onder dezelfde naam
Begrensde herhaling.xlsm
6.2.3 Rekenen
6.2.3.1 Versie 1
Schrijf een procedure Rekenen waarin je de gebruiker vraagt om 4 getallen in te voeren
(gebruik voor ieder getal hetzelfde invoervenster). Vervolgens deel je aan de gebruiker de
som en het gemiddelde van de 4 getallen in een berichtvenster mee.
Je hebt voor deze procedure 4 variabelen nodig: het getal dat de gebruiker telkens invoert,
de teller, de som en het gemiddelde. Je gebruikt hiervoor best logische namen zoals Getal,
Teller, Som en het Gemiddelde. De eerste 3 zijn gehele getallen (integers), het gemiddelde is
Programmeren met Excel 39
een rationaal getal (single). De moeilijkheid bij deze oefening is om de som en het
gemiddelde te berekenen. Je kunt de som bepalen met de code Som = Som + Getal.
Dat betekent dat telkens de lus doorlopen wordt, het ingevoerde getal bij de variabele som
wordt geteld. De 1e maal dat de lus wordt doorlopen is de som nog 0. Na het volledig
doorlopen van de lus is de waarde van de variabele Som ook de werkelijke som van de 4
ingevoerde getallen. Verder kun je het gemiddelde berekenen door de som te delen door 4.
Een mogelijke structuur voor de procedure Rekenen is:
Sub Rekenen()
Dim Teller As , Getal As
Dim Som As , Gemiddelde As
For = To
Getal = InputBox ( )
Som = +
Next
Gemiddelde =
Msgbox “De som van de getallen is “ & & vbNewLine & _
“Het gemiddelde bedraagt “ &
End Sub
Vul zelf het structogram in
-- Rekenen --
Programmeren met Excel 40
Maak een knop op het werkblad Blad1 die je verbindt met de procedure Rekenen.
Test het programma uit en sla het bestand op onder dezelfde naam Begrensde herhaling.
6.2.3.2 Versie 2
Zelfde oefening maar je vraagt eerst aan de gebruiker hoeveel getallen hij wil invoeren.
Je zult nog een variabele nodig hebben voor het aantal getallen dat de gebruiker wil
invoeren. Een logische naam hiervoor is Aantal. Deze variabele is van het type integer. Noem
deze procedure Rekenen2. Je kunt de som op dezelfde wijze berekenen als in Rekenen. Het
gemiddelde vind je door de som te delen door de variabele Aantal. Je moet de lus zoveel
maal doorlopen als de waarde van de variabele Aantal.
Kopieer de procedure Rekenen(). Plaats de cursor op de eerste lijn na deze procedure en
plak. Verander de naam van de gekopieerde procedure in Rekenen2
Een mogelijke structuur voor de procedure Rekenen2:
Sub Rekenen2()
Dim Teller As , Getal as
Dim Som As , Gemiddelde as
Dim Aantal As
Aantal = InputBox (" ")
For = To
Getal = InputBox ( )
Som = +
Next
Gemiddelde =
Msgbox “De som van de getallen is “ & & vbCrLf & _
“Het gemiddelde bedraagt “ &
End Sub
Programmeren met Excel 41
Vul zelf het structogram in
-- Rekenen2 --
Maak een knop op het werkblad Blad1 die je verbindt met de procedure Rekenen2.
Test het programma uit en sla het bestand op onder dezelfde naam
Begrensde herhaling.xlsm.
6.2.4 Tellen
Je vraagt aan de gebruiker hoeveel gehele getallen hij wil invoeren. Terwijl je aan de
gebruiker vraagt deze getallen in te voeren wordt het aantal positieve (0 inbegrepen) en het
aantal strikt negatieve getallen bijgehouden. In de cellen C1 en C2 wordt de tekst “Aantal
positief” en “Aantal negatief” automatisch ingevoerd. De breedte van de kolom C wordt
aangepast aan de inhoud. In de cellen D1 en D2 worden de resultaten getoond.
Je zult voor het oplossen van deze oefening eerst een macro opnemen om de tekst in de
cellen C1 en C2 in te voeren en de kolombreedte aan te passen aan de inhoud.
Neem de macro TekstEnBreedte op. Wis de tekst in de cellen C1 en C2 en verander de
kolombreedte. Test de macro. Wis nogmaals de tekst en herstel de kolombreedte.
Je hebt heel wat variabelen nodig: Aantal voor het aantal getallen dat de gebruiker wil
invoeren, Teller voor de lus, Getal voor het geheel getal dat de gebruiker telkens invoert,
Programmeren met Excel 42
Positief voor het aantal positieve getallen, Negatief voor het aantal negatieve getallen. Ter
herinnering: de code om bv de cel D1 te selecteren is Range(“D1”).Select en de code om het
getal 5 in een geselecteerde cel in te voeren is ActiveCell.Value = 5.
Een mogelijke structuur voor Tellen is:
Sub Tellen()
Dim Aantal As , Teller As
Dim Getal As , Positief As
Dim Negatief As
Aantal = InputBox
For = To
Getal = InputBox
If Then
Negatief = Negatief + 1
Else
End If
Next Teller
‘Start de macro
‘Selecteer de cel D1
ActiveCell.Value = Positief ‘Toon het aantal positieve getallen in D1
‘Selecteer de cel D2
‘Toon het aantal negatieve getallen in D2
End Sub
Vul zelf het structogram in
-- Tellen --
Programmeren met Excel 43
Maak een knop op het werkblad Blad1 die je verbindt met de procedure Tellen.
Test het programma uit en sla het bestand op onder dezelfde naam
Begrensde herhaling.xlsm
6.2.5 RijenKleuren
Schrijf een procedure om de oneven rijen van 1 t.e.m. 19 lichtgeel te kleuren.
De kleurindex voor lichtgeel is 19. De code om rij 5 te kleuren is Rows(5).Interior.Colorindex
=19. Uitleg: de kleurindex (colorindex) van de achtergrond (Interior) van rij 5 wordt 19.
De mogelijke code van de procedure RijenKleuren is:
Sub RijenKleuren()
Dim Teller As
For = To Step
Rows( ). Interior.ColorIndex = 19
Next
End Sub
Maak een knop op het werkblad Blad1 die je verbindt met de procedure RijenKleuren.
Test het programa uit en sla het bestand op onder de naam Begrensde herhaling.xlsm.
Hier volgt de procedure om alle rijen te ontkleuren.
Sub RijenOntkleuren()
Rows.Interior.Colorindex = 0
End Sub
Voer de code in en maak een knop die je verbindt met de procedure RijenOntkleuren.
Programmeren met Excel 44
Test het programa uit en sla het bestand op onder dezelfde naam
Begrensde herhaling.xlsm
6.2.6 KolommenKleuren
Schrijf een procedure om de even kolommen (B,D F,…) van 2 tot 20 lichtblauw
(kleurindex 20) te kleuren. Gebruik nu Columns i.p.v. Rows. Om de kolommen te
ontkleuren kun je de procedure RijenOntkleuren gebruiken. Maak een knop die je
verbindt met de procedure KolommenKleuren. Na het testen sla je het bestand op.
6.2.7 Berekenen van de faculteit van een natuurlijk getal
De faculteit is een begrip uit de statistiek en wordt genoteerd als n! = n.(n-1).(n-2). … .3.2.1
Voorbeelden: 4! = 4.3.2.1 = 24
7! = 7.6.5.4.3.2.1 = 5 040
10! = 10.9.8.7.6.5.4.3.2.1 = 3 628 800
Je kunt het berekenen van 4! beschouwen als een lus. Je vertrekt van het getal 1. Je
doorloopt de lus 4 maal. De 1e maal vermenigvuldig je met 1: het resultaat blijft 1. De 2e
maal vermenigvuldig je met 2: resultaat wordt 2. De 3e maal vermenigvuldig je met 3:
resultaat wordt 6. De 4e maal vermenigvuldig je met 4: het resultaat wordt 24. Je ziet dat je
voor het berekenen van faculteit zeer grote getallen nodig hebt. Gebruik daarvoor het
gegevenstype double i.p.v. integer.
Schrijf een procedure waarbij je vraagt aan de gebruiker van welk getal hij de faculteit wil
berekenen. Geef in een berichtvenster het antwoord.
Een mogelijke structuur van de procedure Faculteit is:
Sub FaculteitBerekenen()
Dim Getal As , Faculteit As Double
Dim Teller As
Getal = InputBox
Faculteit = 1 ‘Als je dit weglaat start Faculteit met de waarde 0
For = To
Programmeren met Excel 45
Faculteit =
Next
MsgBox
End Sub
Vul het structogram in
-- FaculteitBerekenen --
Maak een knop op het werkblad Blad1 die je verbindt met de procedure Faculteit.
Test het programma uit en sla het bestand op onder dezelfde naam
Begrensde herhaling.xlsm
Vergelijk je werkblad Blad1 met de volgende schermafdruk.
Programmeren met Excel 46
7 De voorwaardelijke herhaling als controlestructuur
Indien je precies weet hoeveel keer een codeblok moet uitgevoerd worden, dan wordt de
begrensde herhaling gebruikt. Indien je niet weet hoe dikwijls er moet herhaald worden,
hangt het stoppen af van een voorwaarde. Dan gebruik je de voorwaardelijke herhaling.
7.1 De voorwaardelijke herhaling
De voorwaardelijke herhaling kan in VBA 4 gedaantes aannemen.
Syntax Betekenis
Wanneer
testen?
Wordt mins-
tens 1 maal
uitgevoerd
Do
opdrachten
Loop While voorwaarde
Voert de opdrachten uit zolang aan
de voorwaarde voldaan is Einde Ja
Do While voorwaarde
opdrachten
Loop
Zolang aan de voorwaarde voldaan
is moeten de opdrachten uitgevoerd
worden.
Begin Neen
Do
opdrachten
Loop Until voorwaarde
Voert de opdrachten uit totdat aan
de voorwaarde voldaan is Einde Ja
Do Until voorwaarde
opdrachten
Loop
Totdat aan de voorwaarde voldaan
is moeten de opdrachten uitgevoerd
worden.
Begin Neen
Opmerkingen:
Je kunt de voorwaarde controleren voor het uitvoeren van de lusacties of na het
uitvoeren van de lusacties. Als je vooraf controleert is het mogelijk dat de opdrachten
nooit uitgevoerd worden. Controleer je achteraf, dan worden de opdrachten minstens 1
maal uitgevoerd.
Als je While gebruikt, worden de opdrachten uitgevoerd zolang de voorwaarde waar is.
Als je Until gebruikt, worden de opdrachten uitgevoerd zolang de voorwaarde onwaar is.
Het is mogelijk bij While dat de voorwaarde altijd waar is of dat bij Until de voorwaarde
altijd onwaar is. Dan krijg je een oneindige lus. Een oneindige lus kun je meestal
onderbreken met Escape of Ctrl-Break. In sommige gevallen zit er niets anders op dan
Programmeren met Excel 47
Excel af te sluiten of als je in een vorige versie van Excel werkt je computer opnieuw op
te starten.
Zorg ervoor dat je je werk bewaart elke keer voor je je programma test.
Algemene structogrammen van de voorwaardelijke herhalingen :
1 Do … Loop While
opdracht(en)
Zolang voorwaarde
2 Do While …Loop
Zolang voorwaarde
opdracht(en)
3 Do … Loop Until
opdracht(en)
Totdat voorwaarde
4 Do Until … Loop
Totdat voorwaarde
opdracht(en)
7.2 Oefeningen op voorwaardelijke herhaling
7.1.1 Wachtwoord
Je vraagt aan de gebruiker met om het juiste wachtwoord in te vullen. De lus wordt
herhaald tot de gebruiker “olva” heeft ingetypt.
Je kunt de 4 mogelijkheden van de voorwaardelijke herhaling gebruiken:
Programmeren met Excel 48
1 Do … Loop While
-- Wachtwoord --
Vraag het wachtwoord
Zolang het ingevoerde woord verschilt van olva
2 Do While …Loop
-- Wachtwoord --
Zolang het ingevoerde woord verschilt van olva
Vraag het wachtwoord
3 Do … Loop Until
-- Wachtwoord --
Vraag het wachtwoord
Totdat het ingevoerde woord gelijk is aan olva
4 Do Until … Loop
-- Wachtwoord --
Totdat het ingevoerde woord gelijk is aan olva
Vraag het wachtwoord
Je gebruikt hier best de 1e of de 3e mogelijkheid omdat de opdracht “Vraag het wachtwoord”
minstens 1 maal moet worden uitgevoerd.
Open een nieuwe werkmap en de Visual Basic-editor. Bewaar de werkmap onder de
naam Voorwaardelijke herhaling.xlsm.
Programmeren met Excel 49
Voeg eerst een module in en voer de code van de procedure Wachtwoord in:
Sub Wachtwoord()
Dim Woord As String
Do
Woord = InputBox("Vul het juiste wachtwoord in")
Loop Until Woord = "olva"
End Sub
Je kunt in de code Loop Until Woord = ”olva” vervangen door
Loop While Woord <> ”olva”
Maak een knop op het werkblad Blad1 die je verbindt met de procedure Wachtwoord.
Sla eerst het bestand op en test het programma uit.
7.1.2 InvoerDatum
Je vraagt de gebruiker om nieuwe invoer, zolang geen datum wordt ingevoerd. De naam van
de functie om te onderzoeken of een variabele een datum is IsDate.
Een mogelijke structuur voor de procedure InvoerDatum is:
Sub InvoerDatum()
Dim Datum
Do
Datum = InputBox
Loop Until IsDate(Datum)
End Sub
De lus wordt herhaald tot de invoer als datum herkend wordt.
Maak een knop op het werkblad Blad1 die je verbindt met de procedure InvoerDatum..
Sla eerst het bestand op en test het programma uit.
Programmeren met Excel 50
7.1.3 InvoerB
Je vraagt de gebruiker om nieuwe invoer, zolang de invoer niet met met de letter B
of b begint.
Je hebt een functie nodig om de eerste letter van een tekst (of in computertaal een string) te
bepalen. Dit kan met de functie Left.
Voorbeelden:
Left(“Hallo allemaal”,1) = “H”
Left(“Hallo allemaal”,7) = “Hallo a”
Left(“Hallo allemaal”,14) = “Hallo allemaal”
Je hebt tot nu toe gebruik gemaakt van controlestructuren die slechts 1 voorwaarde
bevatten. In deze toepassing moet je werken met een samengestelde voorwaarde.
Voorwaarden kunnen samengesteld worden met de logische operatoren EN en OF (in het
Engels AND en OR). De voorwaarde is: de invoer begint met de letter B OF de invoer begint
met de letter b. In code: Left(Invoer,1) = “B” OR Left (Invoer,1) = “b”.
Vul de code van de procedure InvoerB aan en typ dan de code in.
Sub InvoerB()
Dim
Do
Invoer = InputBox
Loop Until
End Sub
De lus wordt herhaald tot de invoer met de letter B of b begint.
Maak een knop op het werkblad Blad1 die je verbindt met de procedure InvoerB.
Sla het bestand op en test het programma uit.
7.1.4 Zesvoud
Je vraagt de gebruiker om nieuwe invoer tot hij een zesvoud tussen 50 en 80 invoert.
Je hebt een functie nodig om te onderzoeken of een getal deelbaar is door 6. Deze functie
bestaat niet in VBA. Er bestaat wel een functie om de rest te bepalen. In Excel is de naam
van de functie Rest; in VBA is de naam Mod.
Programmeren met Excel 51
Voorbeelden:
28 Mod 5 = 3 Betekenis: de rest bij deling van 28 door 5 is 3
67 Mod 12 = 7 Betekenis: de rest bij deling van 67 door 12 is 7
66 Mod 6 = 0 Betekenis: 66 is deelbaar door 6 of de rest bij deling door 6 is 0
Je moet opnieuw een samengestelde voorwaarde formuleren: het getal dat de gebruiker
invoer moet deelbaar zijn door 6 en het moet groter zijn dan 50 en het moet kleiner zijn dan
80. In code: Getal Mod 6 = 0 And Getal > 50 And Getal < 80.
Een mogelijke structuur voor de procedure Zesvoud is:
Sub Zesvoud()
Dim Getal as Integer
Do
Loop Until
End Sub
Maak een knop op het werkblad Blad1 die je verbindt met de procedure Zesvoud.
Sla het bestand op en test het programma uit.
7.1.5 StopDrievoud
Vul als voorbereiding van deze oefening de cellen A1 tot A12 van het werkblad Blad1 met
willekeurige getallen.
Schrijf een procedure waarbij alle cellen van de actieve kolom vanaf de actieve cel, één voor
één geselecteerd worden. Op het ogenblik dat de celwaarde een drievoud is of als de cel
leeg is stopt de procedure.
Je hebt in 6.1 De begrensde herhaling een macro opgenomen om de celcursor 1 cel lager te
plaatsen. Je kunt dit hier opnieuw doen. Let er wel op dat je kiest voor Relatieve verwijzing
en dat je achteraf de Absolute verwijzing terug activeert. Je kunt anderszijds de code
gebruiken om de cursor 1 cel lager te plaatsen en die bestaat uit slechts 1 regel.
Code: ActiveCell.Offset(1,0).Select
Om te onderzoeken of een cel leeg is, kijk je de waarde van de actieve cel (ActiveCell.Value)
een lege string is (“”). De waarde van een cel is een drievoud als de rest bij deling door 3
gelijk is aan 0 (ActiveCell.Value Mod 3 = 0).
Programmeren met Excel 52
De voorwaarde moet nu bij het begin van de procedure geformuleerd worden want als de
waarde van de cel een drievoud is of leeg is mag de opdracht nooit uitgevoerd worden.
Een mogelijke structuur voor de procedure StopDrievoud is
Sub StopDrievoud()
Do Until or = “”
Loop
End Sub
Maak een knop op het werkblad Blad1 die je verbindt met de procedure StopDrievoud.
Sla het bestand op en test het programma uit.
7.1.6 KleineGetallen
Je vraagt aan de gebruiker om willekeurige getallen in te vullen maar liefst niet te groot. De
procedure stopt als de gebruiker 3 getallen groter dan 100 heeft ingevuld.
Je hebt in feite alles gezien om deze oefening op te lossen. Je hebt 2 lussen nodig: de
binnenste lus is een voorwaardelijke herhaling: je vraagt aan de gebruiker om een getal in te
voeren tot er een getal boven de honderd is ingevoerd. Deze lus moet drie maal worden
herhaald. Dit is een begrensde herhaling.
Een mogelijke structuur voor de procedure KleineGetallen is:
Sub KleineGetallen()
Dim Getal As Integer, Teller As Integer
For
Do
Getal =
Loop
Next
End Sub
Maak een knop op het werkblad Blad1 die je verbindt met de procedure KleineGetallen..
Sla het bestand op en test het programma uit.
Programmeren met Excel 53
Vul het structogram in van de procedure KleineGetallen.
-- KleineGetallen --
Vergelijk je werkblad Blad1 met de volgende schermafdruk.
Programmeren met Excel 54
8 Getal raden
8.1 Getal raden: versie 1
Probleemstelling:
De computer genereert een willekeurig getal vanaf 1 tot en met 10. De speler probeert het
getal te raden. Als het door de speler ingevoerde getal juist is, zegt de computer “Juist”.
Anders meldt de computer “Verkeerd”
Laat de computer eerst een willekeurig getal bepalen tussen 1 en 10 bij het starten van het
programma en opslaan in een variabele. Dit is een functie want als resultaat van dit stukje
programma krijg je een getal tussen 1 en 10.
Een functie maak je best zo algemeen mogelijk. Bij een functie heb je altijd minstens 1
parameter nodig. Een parameter is een gegeven dat je nodig hebt om met deze functie te
kunnen werken. In dit geval zijn dat de getallen 1 en 10 die je algemeen de Benedengrens en
de Bovengrens zult noemen. De naam van de functie wordt
GENEREERGETAL (Benedengrens , Bovengrens). De enige functie in VBA om een willekeurig
getal te genereren is Rnd. De Rnd-functie geeft een willekeurig getal tussen 0 en 1, beide
grenzen niet inbegrepen. Wil je echter een willekeurig getal tussen 0 en 10 dan wordt de
code Rnd * 10. Het resultaat is echter een decimaal getal. Wil je de decimale cijfers laten
wegvallen dan heb je de functie Int. De code Int (Rnd * 10) geeft als resultaat een willekeurig
getal tussen 0 en 9, beide getallen inbegrepen. Wil je getallen tussen 1 en 10 dan moet je er
1 bijtellen. De code Int (Rnd*10+1) geeft ons een getal tussen 1 en10.
Nu moet je de code Int (Rnd*10+1) nog algemener maken met bovengrens (i.p.v. 10) en
benedengrens (i.p.v. 1). Het getal 10, waarmee Rnd moeten vermenigvuldigen bekomen we
algemeen door de bewerking Bovengrens – Benedengrens +1. Het resultaat hiervan
bewaren we in de variabele AantalGetallen. Besluit: de code om een willekeurig getal
tussen een benedengrens en een bovengrens te genereren is:
AantalGetallen = Bovengrens – Benedengrens +1
GENEREERGETAL = (Rnd * AantalGetallen + Benedengrens)
Nu is er nog 1 probleem: de computer geeft je telkens als je die functie gebruikt hetzelfde
getal als resultaat, omdat steeds eenzelfde aanvangswaarde gebruikt wordt. Wil je steeds
een verschillende aanvangswaarde, dan moet je bovenaan de functie de opdracht
Randomize plaatsen
Maak een nieuw Excel document GetalRaden1 aan. Je plaatst de declaratie van de
variabelen van alle functies en procedures van deze oefening helemaal bovenaan de
module.
Programmeren met Excel 55
Een mogelijke structuur van de code is:
Dim AantalGetallen as
Dim Bovengrens as , Benedengrens as
Function GENEREERGETAL(Benedengrens, Bovengrens)
Randomize
AantalGetallen = Bovengrens - Benedengrens + 1
GENEREERGETAL = Int(Rnd * AantalGetallen + Benedengrens)
End Function
Test deze functie in je werkblad. Zie hiervoor hoofdstuk 4 Een zelfgemaakte functie
gebruiken in je werkblad.
Nu kun je beginnen met de eigenlijke procedure GetalRaden.
Het structogram van de procedure ziet er als volgt uit:
-- GetalRaden--
Genereer een willekeurig getal
Laat getal raden
Controleer getal
Je hebt nog 2 variabelen nodig: TeRadenGetal voor het willekeurig getal en Getal voor het
getal dat de gebruiker invoert.
Vul bovenaan je module de declaratie van de variabelen aan:
Dim Getal as , TeRadenGetal as
Vul de code van de procedure GetalRaden aan en typ dan de code in.
Sub GetalRaden()
TeRadenGetal = GENEREERGETAL ( , )
Getal = Inputbox
ControleerGetal
End Sub
Als je deze procedure test, krijg je een foutmelding omdat de computer ControleerGetal niet
herkent. Je kunt deze code tijdelijk uitschakelen door er een aanhalingsteken ‘ voor te
plaatsen. VBA beschouwt deze zin dan als commentaar. Bij het testen zie je dat er gevraagd
Programmeren met Excel 56
wordt om een getal in te voeren. Verder gebeurt er niets. Vergeet niet het aanhalingsteken
na het testen te verwijderen.
Je moet nog de code van de procedure ControleerGetal invoeren.
Dit is het structogram:
-- ControleerGetal --
Getal = TeRadenGetal
WAAR NIET WAAR
Bericht = “Juist. ” Bericht = “Verkeerd. ”
Bericht = Bericht & “Het te raden getal was “ & TeRadenGetal
MsgBox Bericht
Vul bovenaan je module de declaratie van de variabelen aan:
Dim Bericht as String
Vul de code van de procedure ControleerGetal aan en typ dan de code in.
Sub ControleerGetal()
If Then
Else
End If
Bericht =
MsgBox
End Sub
Maak een knop op het werkblad Blad1 die je verbindt met de procedure GetalRaden.
Test het programma uit en sla het bestand op onder dezelfde naam GetalRaden1.
Programmeren met Excel 57
8.2 Getal raden: versie 2
Nieuwe probleemstelling:
De computer genereert een willekeurig getal vanaf 1 tot en met 10. De speler probeert het
getal te raden. Als het door de speler ingevoerde getal juist is, zegt de computer “Juist”.
Anders meldt de computer “Verkeerd” en vraagt of de speler nog eens wil raden. Als het
antwoord bevestigend is, mag de speler nog eens raden. Als de speler niet meer wil spelen
wordt het juiste getal getoond. Dit wordt herhaald tot de speler het juiste getal heeft
geraden of niet meer wil spelen.
Analyse: als het door de speler ingevoerde getal verkeerd is moet je een berichtvenster
tonen met de vraag of de speler nog eens wil raden. Dit berichtvenster moet de 2 knoppen
Ja en Nee bevatten. Dit kan je bekomen met het argument vbYesNo (zie 2.4 Verfraaien van
dialoogvensters). Als de gebruiker klikt op de knop Ja, dan moet je een invoervenster tonen
om hem opnieuw te laten raden. Als de gebruiker klikt op de knop Nee, dan moet je in een
berichtvenster het juiste getal tonen. Om te weten op welke knop de gebruiker geklikt heeft
moet je het resultaat van het berichtvenster gelijkstellen aan een variabele. Gebruik
daarvoor de variabele NogEens. Declareer deze variabele als een byte.
De code hiervoor is: NogEens = MsgBox (“Wil je nog eens proberen?” , vbYesNo)
Als de gebruiker op de knop Ja geklikt heeft dan is de waarde van de variabele NogEens
gelijk aan vbYes. In het andere geval is de waarde van NogEens gelijk aan vbNo. In feite kun
je vbYes vervangen door het getal 6 en vbNo door het getal 7 maar de meeste mensen
kunnen vbYes veel gemakkelijker onthouden dan 6. Daarom gebruik je best vbYes en vbNo.
Wil je meer uitleg over vbYes en vbNo, dan moet je er in VBA op dubbelklikken.
Je zult de procedure ControleerGetal moeten laten herhalen tot de speler het juiste getal
heeft geraden of tot de speler niet meer verder wil spelen. Dit gebeurt best in een nieuwe
procedure Controle. In GetalRaden vervangen we ControleerGetal door Controle. Je hebt
een nieuwe variabele Geraden (tekst) nodig. Deze variabele is gelijk aan “Nee” bij de start
van het programma en wordt gelijk aan “Ja” als het getal geraden wordt.
Programmeren met Excel 58
Dit is het nieuwe structogram:
-- GetalRaden--
Genereer een willekeurig getal
Laat getal raden
Controle
-- Controle --
ControleerGetal
Totdat het getal geraden is of de speler niet
meer wil spelen
-- ControleerGetal --
Getal = TeRadenGetal
WAAR NIET WAAR
Bericht = “Juist. ” Bericht = “Verkeerd. ”
Bericht = Bericht & “Het te
raden getal was “ &
TeRadenGetal
Bericht = Bericht & “Wil je nog eens proberen?
MsgBox Bericht
Geraden = “Ja”
NogEens = MsgBox (Bericht , vbYesNo)
NogEens = vbYes
WAAR NIET WAAR
Laat getal raden Meld wat het te raden
getal was
Maak een nieuw Excel document GetalRaden2 aan. De geschreven code uit GetalRaden1
kan je hergebruiken.
Vul bovenaan je module de declaratie van NogEens aan:
Dim NogEens as Byte, Geraden as String
Programmeren met Excel 59
Vul de code van de procedures GetalRaden, Controle en ControleerGetal aan en typ dan
de code in.
Sub GetalRaden()
Geraden = "Nee"
Getal =
TeRadenGetal =
Controle
End Sub
Sub Controle()
Do
Loop Until Geraden = "Ja" Or NogEens = vbNo
End Sub
Sub ControleerGetal()
If Getal = TeRadenGetal Then
Bericht =
Bericht =
MsgBox
Geraden = “Ja”
Else
Bericht =
Bericht =
NogEens =
If NogEens = vbYes Then
Getal = InputBox
Else
Bericht = "Het te raden getal was " & TeRadenGetal
MsgBox Bericht
End If
End If
Programmeren met Excel 60
End Sub
Test het programma uit en sla het bestand op onder de naam GetalRaden2. Voorzie
eveneens een knop op het werkblad.
8.3 Getal raden: versie 3
Nieuwe probleemstelling:
De computer genereert een willekeurig getal vanaf 1 tot en met 10. De speler probeert het
getal te raden. Als het door de speler ingevoerde getal juist is, zegt de computer “Juist”.
Anders meldt de computer “Verkeerd” en vraagt of de speler nog eens wil raden. Als de
speler verder wil spelen, zegt de computer of het te raden getal hoger of lager is dan het
getal dat de speler had ingevoerd en mag de speler nog eens raden. Als de speler niet meer
wil spelen wordt het juiste getal getoond.
Analyse: als de speler verder wil raden, geeft de computer een hint: hij zegt of het te raden
getal (variabele TeRadenGetal) hoger dan wel lager is dan het het getal (variabele Getal) dat
de speler heeft ingevoerd. Dat is opnieuw een KEUZE-structuur: als het te raden getal groter
is dan het ingevoerde getal, dan is het bericht “Het te raden getal is hoger!”, anders is het
bericht “Het te raden getal is lager!”.
Opmerking: de procedures GetalRaden en Controle blijven onveranderd.
Dit is het nieuwe structogram:
-- ControleerGetal --
Getal = TeRadenGetal
WAAR NIET WAAR
Bericht = “Juist. ” Bericht = “Verkeerd. ”
Bericht = Bericht & “Het te
raden getal was “ &
TeRadenGetal
Bericht = Bericht & “Wil je nog eens proberen?
MsgBox Bericht
NogEens = MsgBox (Bericht , vbYesNo)
Programmeren met Excel 61
MsgBox Bericht
Geraden = “Ja”
NogEens = vbYes
WAAR NIET WAAR
TeRadenGetal >
Getal
WAAR NIET WAAR
Bericht = "Het te raden
getal was " &
TeRadenGetal
Bericht=
“Hoger”
Bericht=
“Lager”
MsgBox Bericht Msgbox Bericht
Getal = InputBox("Raad
een getal vanaf 1 tot en
met 10")
Maak een nieuw Excel document GetalRaden3 aan. De geschreven code uit GetalRaden2
kan je hergebruiken.
Sub ControleerGetal()
If Getal = TeRadenGetal Then
Bericht =
Bericht =
MsgBox
Geraden =
Else
Bericht =
Bericht =
NogEens =
If NogEens = vbYes Then
If TeRadenGetal > Getal Then
Bericht = "Het te raden getal is groter dan " & Getal
Else
Bericht =
End If
MsgBox Bericht
Programmeren met Excel 62
Getal = InputBox
Else
Bericht = "Het te raden getal was " & TeRadenGetal
MsgBox
End If
End If
End Sub
Test het programma uit en sla het bestand op onder de naam GetalRaden3. Voorzie
eveneens een knop op het werkblad.
8.4 Getal raden: versie 4
Nieuwe probleemstelling:
De computer genereert een willekeurig getal vanaf 1 tot en met 10. De speler probeert het
getal te raden. Als het door de speler ingevoerde getal juist is, zegt de computer “Juist”.
Anders meldt de computer “Verkeerd” en vraagt of de speler nog eens wil raden. Als de
speler verder wil spelen, zegt de computer of het te raden getal hoger of lager is dan het
getal dat de speler had ingevoerd en mag de speler nog eens raden. Als de speler niet meer
wil spelen wordt het juiste getal getoond. Op het moment dat de speler stopt of de juiste
oplossing heeft gevonden wordt er gemeld hoeveel pogingen er ondernomen zijn.
Het zou mooi zijn als in het berichtvenster dat weergegeven wordt als de speler het getal
geraden heeft, gemeld wordt in hoeveel pogingen de speler het getal geraden heeft.
Analyse: je gebruikt een variabele om de computer tekst, getallen… te laten bijhouden. Om
je script voor jezelf leesbaar te houden, kies je voor variabelen best toepasselijke namen:
namen die zeggen wat je in die variabele wilt laten bijhouden. B.v. de variabele waarin je
het aantal pogingen laat bijhouden, zou je AantalPogingen kunnen noemen. Je declareert
AantalPogingen als een Integer omdat die variabele getallen bijhoudt.
Telkens de gebruiker een nieuwe poging doet om het getal te raden, moet de waarde van
AantalPogingen met 1 verhoogd worden. De code daarvoor is:
AantalPogingen = AantalPogingen + 1.
Als programmeur moet je weten waar deze code moet bijgevoegd worden. Wanneer moet
het aantal pogingen met 1 verhoogd worden? Dit moet gebeuren telkens het ingevoerde
getal gecontroleerd wordt. De code wordt best bovenaan de procedure ControleerGetal
geplaatst.
Programmeren met Excel 63
Verder moet je ervoor zorgen dat telkens het programma wordt gestart, de waarde van de
variabele AantalPogingen gelijk wordt gesteld aan 0. Zoniet wordt er gestart met het aantal
pogingen van de vorige keer dat het programma werd gebruikt. Dit doe je best bovenaan de
procedure GetalRaden.
Maak een nieuw Excel document GetalRaden4 aan. De geschreven code uit GetalRaden3
kan je hergebruiken.
Hierna de volledige aangepaste code.
De wijzigingen, die je moet aanbrengen zijn in het vet gedrukt.
Dim AantalGetallen As Integer
Dim Bovengrens As Integer, Benedengrens As Integer
Dim Getal As Integer, TeRadenGetal As Integer
Dim Bericht As String, NogEens As Byte
Dim Geraden as string,AantalPogingen As Integer
Function GENEREERGETAL(Benedengrens, Bovengrens)
Randomize
AantalGetallen = Bovengrens - Benedengrens + 1
GENEREERGETAL = Int(Rnd * AantalGetallen + Benedengrens)
End Function
Sub GetalRaden()
AantalPogingen = 0
Geraden = “Nee”
Getal = InputBox("Raad een getal vanaf 1 tot en met 10")
TeRadenGetal = GENEREERGETAL(1, 10)
Controleer
End Sub
Sub Controle()
Do
ControleerGetal
Loop Until Geraden = "Ja" Or NogEens = vbNo
End Sub
Sub ControleerGetal()
AantalPogingen = AantalPogingen + 1
If Getal = TeRadenGetal Then
Bericht = "Juist. "
Bericht = Bericht & "Het te raden getal was " & TeRadenGetal
Bericht = Bericht & vbCrLf & "Geraden na " & AantalPogingen &
" pogingen."
MsgBox Bericht
Programmeren met Excel 64
Geraden = "Ja"
Else
Bericht = "Verkeerd. "
Bericht = Bericht & "Wil je nog eens proberen?"
NogEens = MsgBox(Bericht, vbYesNo)
If NogEens = vbYes Then
If TeRadenGetal > Getal Then
Bericht = "Het te raden getal is groter dan " & Getal
Else
Bericht = "Het te raden getal is kleiner dan " & Getal
End If
MsgBox Bericht
Getal = InputBox("Raad een getal vanaf 1 tot en met 10")
Else
Bericht = "Het te raden getal was " & TeRadenGetal &
vbNewLine
Bericht = Bericht & "Niet geraden na " & AantalPogingen & "
pogingen."
MsgBox Bericht
End If
End If
End Sub
Test het programma uit en sla het bestand op onder de naam GetalRaden4. Voorzie
eveneens een knop op het werkblad.
8.5 Getal raden: versie 5
Als je een programma schrijft, moet je steeds proberen een zo algemeen mogelijke
oplossing te ontwerpen. Een oplossing die niet alleen werkt in een bepaald geval, maar in
zoveel mogelijk gevallen.
Wat betekent dat voor onze toepassing?
Onze toepassing is: een getal raden. De oplossing zoals die er nu uitziet, laat enkel toe te
raden naar een getal tussen 1 en 10. De oplossing zou veel waardevoller zijn, als ze zou
toelaten te raden naar een getal tussen om het even welke getallen.
In de procedure GetalRaden vraag je aan de gebruiker eerst vanaf welk getal hij wil raden.
De code is:
Benedengrens = InputBox ("Vanaf welk getal wil je raden? ", "Bepalen benedengrens", 1)
Programmeren met Excel 65
De argumenten van dit invoervenster zijn achtereenvolgens: de tekst die getoond wordt, de
titel van het venster en tenslotte de standaardwaarde. Een standaardwaarde is een getal die
getoond wordt en die gebruikt wordt als de gebruiker niets invult.
Vervolgens vraag je aan de gebruiker tot welk getal hij wil raden.
De code is:
Bovengrens = InputBox ("Tot welk getal wil je raden? ", "Bepalen bovengrens", 10)
De code in de procedure GetalRaden om de gebruiker een getal te laten raden wordt:
Getal = InputBox("Raad een getal vanaf " & Benedengrens & " tot en met " & Bovengrens, "Poging 1")
De code in de procedure ControleerGetal om de gebruiker een getal te laten raden wordt:
Getal = InputBox("Raad een getal vanaf " & Benedengrens & _
" tot en met " & Bovengrens, "Poging " & Aantal pogingen)
Maak een nieuw Excel document GetalRaden5 aan. De geschreven code uit GetalRaden4
kan je hergebruiken.
Vul de code van de procedures GetalRaden en ControleerGetal aan en typ dan de code in.
Het nieuwe deel is in het vet getypt. De procedure Controleer is onveranderd.
Sub GetalRaden()
AantalPogingen = 0
Geraden = "Nee"
Benedengrens = InputBox
Bovengrens = InputBox
Getal = InputBox
TeRadenGetal = GENEREERGETAL(Benedengrens, Bovengrens)
Controleer
End Sub
Sub ControleerGetal()
AantalPogingen = AantalPogingen + 1
If Getal = TeRadenGetal Then
Bericht = "Juist. "
Bericht = Bericht & "Het te raden getal was " & TeRadenGetal
Bericht = Bericht & vbCrLf & "Geraden na " & AantalPogingen &
" pogingen."
MsgBox Bericht
Geraden = "Ja"
Programmeren met Excel 66
Else
Bericht = "Verkeerd. "
Bericht = Bericht & "Wil je nog eens proberen?"
NogEens = MsgBox(Bericht, vbYesNo)
If NogEens = vbYes Then
If TeRadenGetal > Getal Then
Bericht = "Het te raden getal is groter dan " & Getal
Else
Bericht = "Het te raden getal is kleiner dan " & Getal
End If
MsgBox Bericht
Getal = InputBox("Raad een getal vanaf " & Benedengrens & _
" tot en met " & Bovengrens, "Poging " & AantalPogingen)
Else
Bericht = "Het te raden getal was " & TeRadenGetal &
vbNewLine
Bericht = Bericht & "Niet geraden na " & AantalPogingen & "
pogingen."
MsgBox Bericht
End If
End If
End Sub
Test het programma uit en sla het bestand op onder de naam GetalRaden5. Voorzie
eveneens een knop op het werkblad.
8.6 Getal raden: versie 6
Start de procedure Getalraden (versie 5). Je ziet het invoervenster “Bepalen
benedengrens”, waarbij je wordt gevraagd vanaf welk getal je wil raden.
Klik op de knop Annuleren. Het programma wordt onderbroken en er verschijnt een
berichtvenster met een foutmelding: Fout 13 tijdens uitvoering. Typen komen niet met
elkaar overeen.
Programmeren met Excel 67
Als je wilt weten waar de fout juist gebeurd is klik je op Foutopsporing.
Er verschijnt links van de code een geel pijltje en de code waarin de
fout gebeurd is, krijgt als achtergrondkleur geel.
Klik op de knop Beginwaarden om het programma te stoppen.
Als je op de knop Annuleren klikt krijgt de variabele Benedengrens als waarde een lege tekst,
terwijl in de declaratie Benedengrens gekend is als Integer of als geheel getal.
Je kunt die fout voorkomen door Benedengrens nog niet als geheel getal te declareren maar
het type nog open te laten (men noemt dit ook het Varianttype). Dit kan gebeuren met de
code Dim Benedengrens zonder meer. Een ander manier is de formulering: Dim
Benedengrens as Variant. Verder moet het invoervenster getoond worden tot de
gebruiker iets heeft ingevuld. Dit kan met de controlestructuur de voorwaardelijke
herhaling.
De code hiervoor is:
Do
Benedengrens = InputBox("Vanaf welk getal wil je raden? ", _
"Bepalen benedengrens", 1)
Loop Until Benedengrens <> ""
Je moet ook de variabelen Bovengrens en Getal declareren als Variant en het invoervenster
van de Bovengrens en het Getal blijven vragen tot de gebruiker iets heeft ingevuld.
Als je het programma een 2de maal runt, blijven de geheugenvariabelen Benedengrens,
Bovengrens en Getal hun waarde behouden. Het is beter deze variabelen leeg te maken.
Men noemt dit “initialiseren van de variabelen”. Dit gebeurt bovenaan de procedure
GetalRaden met de code: Benedengrens = ””, Bovengrens = “”, Getal = “”
Maak een nieuw Excel document GetalRaden6 aan. De geschreven code uit GetalRaden5
kan je hergebruiken.
Programmeren met Excel 68
Hierna volgt nog eens de volledige code van het programma. Pas je code aan.
Dim AantalGetallen As Integer
Dim Bovengrens, Benedengrens
Dim Getal, TeRadenGetal As Integer
Dim Bericht As String,Geraden as string
Dim NogEens As Byte
Dim AantalPogingen As Integer
Function GENEREERGETAL(Benedengrens, Bovengrens)
Randomize
AantalGetallen = Bovengrens - Benedengrens + 1
GENEREERGETAL = Int(Rnd * AantalGetallen + Benedengrens)
End Function
Sub GetalRaden()
AantalPogingen = 0
Geraden = "Nee"
Bovengrens = “”
Benedengrens = “”
Getal = “”
Do
Benedengrens = InputBox("Vanaf welk getal wil je raden? ", _
"Bepalen benedengrens", 1)
Loop Until Benedengrens <> ""
Do
Bovengrens = InputBox("Tot welk getal wil je raden? ", _
"Bepalen bovengrens", 10)
Loop Until Bovengrens <> ""
Do
Getal = InputBox("Raad een getal vanaf " & Benedengrens & _
" tot en met " & Bovengrens, "Poging 1")
Loop Until Getal <> ""
TeRadenGetal = GENEREERGETAL(Benedengrens, Bovengrens)
Controle
End Sub
Programmeren met Excel 69
Sub Controle()
Do
ControleerGetal
Loop Until Geraden = "Ja" Or NogEens = vbNo
End Sub
Sub ControleerGetal()
AantalPogingen = AantalPogingen + 1
If Getal = TeRadenGetal Then
Bericht = "Juist. "
Bericht = Bericht & "Het te raden getal was " & TeRadenGetal
Bericht = Bericht & vbNewLine & "Geraden na " & _
AantalPogingen & " pogingen."
MsgBox Bericht
Geraden = "Ja"
Else
Bericht = "Verkeerd. "
Bericht = Bericht & "Wil je nog eens proberen?"
NogEens = MsgBox(Bericht, vbYesNo)
If NogEens = vbYes Then
If TeRadenGetal > Getal Then
Bericht = "Het te raden getal is groter dan " & Getal
Else
Bericht = "Het te raden getal is kleiner dan " & Getal
End If
MsgBox Bericht
Getal = InputBox("Raad een getal vanaf " & Benedengrens & _
" tot en met " & Bovengrens, "Poging " & AantalPogingen)
Else
Bericht = "Het te raden getal was " & TeRadenGetal
Bericht = Bericht & vbNewLine & "Niet geraden na " & _
AantalPogingen & " pogingen."
MsgBox Bericht
End If
End If
End Sub
Test het programma uit en sla het bestand op onder de naam GetalRaden6. Voorzie
eveneens een knop op het werkblad.
Programmeren met Excel 70
9 Zelf dialoogvensters maken
9.1 Verbruik van een auto berekenen
Maak een nieuw Excel document aan met de naam Dialoogvenster.
Tot nu toe heb je gebruik gemaakt van de 2 ingebouwde dialoogvensters. Vanaf nu zul je
zelf vensters ontwerpen.
Kies UserForm in het menu Invoegen van de Visual Basic-editor. Een nieuw
dialoogvenster wordt aan het project toegevoegd. Op hetzelfde moment verschijnt
automatisch een Werkset Besturingselementen.
Een dialoogvenster bevat elementen waardoor de gebruiker kan reageren op Excel.
Drie van de meest gebruikte besturingselementen die ingevoegd worden op
dialoogvensters, zijn een bijschrift (of label), een tekstvak (of textbox) en een opdrachtknop
(of commandbutton).
Naam Gebruikt
Bijschrift Om tekst te tonen, die de gebruiker niet kan bewerken
Tekstvak Om de gebruiker tekst of getallen te laten invoeren
Opdrachtknop Om een actie te starten als de gebruiker erop klikt
Het dialoogvenster krijgt automatisch de naam UserForm1, een bijschrift de naam Label1
enz. Als je deze namen onveranderd laat, wordt de code heel moeilijk te lezen en te
veranderen. Je verandert best onmiddellijk de naam volgens de methode van Leszynski. De
naam van een UserForm of dialoogvenster begint altijd met de letters frm. Het voorvoegsel
van een tekstvak is txt en van een opdrachtknop is cmd.
Programmeren met Excel 71
Verander de naam van het dialoogvenster in frmVerbruik
In de titelbalk van het dialoogvenster zie je UserForm1. Je kunt dit opschrift veranderen. De
naam in de titelbalk is de eigenschap Caption.
Verander de eigenschap Caption van UserForm1 in Berekening van het verbruik
Je kunt de grootte van het dialoogvenster veranderen door de formaatgrepen te
gebruiken
Je zult nu besturingselementen (ook controls genoemd) op het lege dialoogvenster (een
andere naam is formulier) plaatsen. Om een besturingselement op een formulier te
plaatsen moet de Werkset Besturingselementen zichtbaar zijn. Normaal wordt deze
werkset zichtbaar als je op het formulier klik. Als je de werkset onopzettelijk gesloten hebt,
kun je hem terug zichtbaar maken door in het menu Beeld te kiezen voor Werkset
Als je een besturingselement wilt toevoegen aan een formulier klik je op de Werkset de
corresponderende knop aan en klik je vervolgens in het dialoogvenster. Het
besturingselement verschijnt in de standaardvorm. Als je meerdere gelijke
besturingselementen wilt toevoegen dubbelklik je op de Werkset op de corresponderende
knop en klik je daarna in het dialoogvenster voor elk besturingselement dat je wilt maken.
Om te eindigen klik je nogmaals op datzelfde besturingselement op de Werkset.
Programmeren met Excel 72
Plaats 9 bijschriften op het dialoogvenster “Berekening van het verbruik”
Dubbelklik op het besturingselement Bijschrift op de werkset
Klik negenmaal in het dialoogvenster, klik tenslotte terug op de knop bijschrift
op de Werkset en vergelijk met het volgende resultaat.
Geef elk bijschrift een naam:
Label1 lblAantalKm, Label2 lblBedrag, Label3 lblPrijsPerLiter, Label4
lblTekstHoeveelheid, Label5 lblTekstVerbruik, Label6 lblTekstPrijs, Label7
lblGetalHoeveelheid, Label8 lblGetalVerbruik, Label9 lblGetalPrijs (Zie uitleg op de
volgende pagina)
Om een bijschrift van naam te veranderen moet je eerst het bijschrift selecteren door
erop te klikken.
Vervolgens verander de eigenschap Name van het bijschrift Label1 in lblAantalkm
Doe hetzelfde voor de andere bijschriften (Label2 t.e.m. Label9)
Verander de tekst van de bijschriften: dit is de eigenschap Caption van het bijschrift.
Label1 Aantal kilometer, Label2 Bedrag, Label3 Prijs per liter, Label4 Aantal liter,
Label5 Verbruik per 100 km, Label6 Prijs per kilometer. De tekst van de bijschriften
Label7, Label8 en Label9 mag je verwijderen.
Selecteer het bijschrift van lblAantalKm
Programmeren met Excel 73
Verander de eigenschap Caption van het bijschrift van Label1 in Aantal kilometer
Doe hetzelfde voor de bijschriften Label2 t.e.m. Label6. Verwijder de tekst van de
eigenschap Caption van de Label7 8 en 9. De tekst van deze bijschriften zal tijdens het
programma ingevuld worden. Vergelijk met onderstaande schermafdruk.
Plaats 3 tekstvakken op het dialoogvenster.
Dubbelklik op het besturingselement Tekstvak op de Werkset
Klik driemaal in het dialoogvenster, klik tenslotte terug op de knop Tekstvak.
op de Werkset en vergelijk met het volgende resultaat.
Programmeren met Excel 74
Verander de eigenschap Name van de 3 tekstvakken: TextBox1 txtAantalKm, TextBox2
txtBedrag, TextBox3 txtPrijsPerLiter.
Voeg tenslotte 2 opdrachtknoppen (commandbuttons) aan het dialoogvenster toe.
De eigenschap Name pas je aan: CommandButton1 cmdBerekenen en
CommandButton2 cmdOK.
Je wijzigt ook de eigenschap Caption (de tekst op de opdrachtknop):
CommandButton1 Berekenen
CommandButton2 OK
Vergelijk de wijzigingen met de schermafdruk
Het ontwerp van het dialoogvenster is klaar. Nu kun je beginnen met de code. Het is de
bedoeling dat de gebruiker de tekstvakken Aantal kilometer, Bedrag en Prijs per liter invult
en dat de computer het Aantal liter, Verbruik per 100 km en de Prijs per kilometer uitrekent
en toont als de gebruiker op de knop Berekenen klikt. Het programma eindigt als de
gebruiker op de knop OK klikt.
Als je de code schrijft van een dialoogvenster is het nodig dat je gemakkelijk overschakelt
van het formulier (of dialoogvenster) naar de code en omgekeerd. Er zijn 2 eenvoudige
werkwijzen: om over te schakelen van het formulier naar de code kun je drukken op de
functietoets F7 en terug schakelen van de code naar het formulier met de toetscombinatie
SHIFT+F7. Je kunt als 2de mogelijkheid gebruik maken van de knoppen op de
Projectverkenner:
We beginnen met de code te schrijven van de knop OK. Als de gebruiker hierop klikt moet
het dialoogvenster gesloten worden en uit het geheugen verwijderd worden. Dit gebeurt
met 1 opdracht nl Unload gevolgd door de naam van het formulier. Hier wordt de
opdracht: Unload frmVerbruik.
Schakelen
naar de code
Schakelen
naar het
formulier
Programmeren met Excel 75
Dubbelklik op de OK-knop van het dialoogvenster. Je komt automatisch in het
codevenster. Je kunt hier de procedure schrijven van de gebeurtenis Click van de
opdrachtknop cmdOK. Anders gezegd: wat moet er gebeuren als de gebruiker klikt op de
knop OK.
Vul de code aan: Unload frmVerbruik
We voegen een module in om het programma te laten starten.
Kies in het menu Invoegen voor Module.
Hier moet je een procedure schrijven om het dialoogvenster te tonen. De naam van de
procedure is vrij te kiezen bijvoorbeeld StartVerbruik. De code om het formulier Verbruik te
tonen is frmVerbruik.Show
Vul de code in van de procedure:
Sub StartVerbruik ()
frmVerbruik.Show
End Sub
Test de code door het programma te starten terwijl je cursor in de code staat van de
procedure StartVerbruik met de functietoets F5. Het dialoogvenster wordt getoond en je
kunt het dialoogvenster afsluiten door op OK te klikken. Als dit niet lukt moet je eerst je
fouten verbeteren.
Keer terug naar het formulier door in de projectverkenner te dubbelklikken op
frmVerbruik
Nu moet je nog de code schrijven, die hoort bij de opdrachtknop Berekenen. Je moet de
getallen die de gebruiker in de 3 tekstvakken toewijzen aan een variabele of een
geheugenvakje. Het getal dat ingetypt is in het tekstvak txtAantalKm is de eigenschap Value
van het tekstvak. Je wijst dat getal toe aan de variabele AantalKm met de volgende code:
AantalKm = txtAantalKm.Value. Op dezelfde manier kun je de getallen in de tekstvakken
txtBedrag en txtPrijsPerLiter toewijzen aan de variabelen Bedrag en PrijsPerLiter met de
code: Bedrag= txtBedrag.Value en PrijsPerLiter = txtPrijsPerLiter.
Je hebt nog 3 variabelen nodig: nl AantalLiter, Verbruik en PrijsPerKm. Je hebt dus in totaal
6 variabelen die je declareert als Single (het kunnen decimale getallen zijn).
Verder moet je nog de berekeningen uitvoeren:
Programmeren met Excel 76
AantalLiter = Bedrag / PrijsPerLiter
Verbruik = AantalLiter / AantalKm *100
PrijsPerKm = Bedrag / AantalKm
Tenslotte moeten de resultaten van de berekeningen getoond worden (dit is de eigenschap
Caption van de Bijschriften).
lblGetalHoeveelheid.Caption = AantalLiter
lblGetalVerbruik.Caption = Verbruik
lblGetalPrijs.Caption = PrijsPerKm
Dubbelklik op de opdrachtknop Berekenen
Automatisch wordt de procedure cmdBerekenen_Click() geopend. Een mogelijke
structuur van de code is:.
Private Sub cmdBerekenen_Click()
Dim AantalKm As , Bedrag As
Dim PrijsPerLiter As , AantalLiter As
Dim Verbruik As , PrijsPerKm As
AantalKm =
Bedrag =
PrijsPerLiter =
AantalLiter =
Verbruik =
PrijsPerKm =
lblGetalHoeveelheid.Caption =
lblGetalVerbruik.Caption =
lblGetalPrijs.Caption =
End Sub
Test het programma uit en sla het programma op onder dezelfde naam
Dialoogvenster.xlsm. Let erop dat je bij het testen getallen invult in alle tekstvakken als
je foutmeldingen wilt vermijden. Vergelijk met de volgende schermafdruk.
Programmeren met Excel 77
Het zou kunnen dat een verstrooide gebruiker niet alle tekstvakken invult voordat hij klikt op
de opdrachtknop Berekenen.
Je kunt eerst onderzoeken of alle tekstvakken zijn ingevuld en pas de berekeningen
uitvoeren als geen enkel vak leeg is. Als er nog niets is ingevuld in txtAantalKm dan is de
eigenschap text van dit tekstvak een lege string of “” m.a.w. txtAantalKm.text = “”. Als 1 van
de 3 tekstvakken leeg is zullen we een berichtvenster tonen met de vraag om iets in te vullen
en de bijschriften van het aantal liter, verbruik per 100 km en de prijs per km leeg maken.
Een mogelijke structuur van de code is:.
Private Sub cmdBerekenen_Click()
Dim AantalKm As , Bedrag As
Dim PrijsPerLiter As , AantalLiter As
Dim Verbruik As , PrijsPerKm As
If txtAantalKm.Text = Or txtBedrag.Text = Or _
txtPrijsPerLiter = Then
MsgBox
lblGetalHoeveelheid.Caption = ""
lblGetalVerbruik.Caption =
lblGetalPrijs.Caption =
Else
AantalKm =
Programmeren met Excel 78
End If
End Sub
Test het programma uit en sla het programma op onder dezelfde naam
Dialoogvenster.xls. Als je nu 1 of meerdere tekstvakken niet invult, verschijnt een
berichtvenster en worden geen berekeningen getoond.
Als je een berekening gemaakt hebt en je vult in een tekstvak een ander getal in worden de
oude berekeningen nog altijd getoond. We willen dat als je iets invult in 1 van de 3
tekstvakken dat de vorige berekeningen niet meer op het scherm te zien zijn.
Dubbelklik op het tekstva k txtAantalKm. Je opent de procedure Private Sub
txtAantalKm_Change(). Deze gebeurtenis doet zich voor als er iets verandert aan het
tekstvak txtAantalKm. Vul de volgende code aan:
Doe hetzelfde voor de 2 andere tekstvakken.
Maak een knop op het werkblad Blad1 die je verbindt met de procedure StartVerbruik.
Test het programma uit en sla het programma op onder dezelfde naam
Dialoogvenster.xlsm.
9.2 Randen kleuren
9.2.1 De macro Randen kleuren
Open zonodig het bestand Dialoogvenster.xlsm
Start in de map Dialoogvenster.xlsm de macrorecorder. Geef als naam RandKleuren.
Kies in het menu Opmaak voor Celeigenschappen en kies bij het tabblad Rand voor een
Programmeren met Excel 79
willekeurige kleur, bij stijl een willekeurige dikte en tenslotte voor Omtrek. Klik op OK. Klik
op de knop Opname stoppen.
Dubbelklik op Module2 om de code van de macro te bekijken. Je mag de eerste 2 lijnen
verwijderen:
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
Achtereenvolgens worden de eigenschappen van de randen links, boven, onder en rechts
ingesteld. De lijnstijl (xlContinuous) verander je niet. De mogelijkheden van de dikte van de
lijn zijn: xlThin (fijn), xlMedium (normaal) of xlThick (dik). Bij de eigenschap colorindex
(kleurindex) kun je een getal invullen van 0 tot 56. Als je alle mogelijkheden wilt bekijken
moet je het bestand Kleuren.xls openen. We zullen de kleuren rood (colorindex = 3),
groen (4), blauw (5) en geel(6) gebruiken.
Maak een knop op het werkblad Blad1 die je verbindt met de macro RandKleuren.
Test het programma uit en sla het op onder dezelfde naam Dialoogvenster.xlsm.
9.2.2 Het dialoogvenster RandKleuren
Kies UserForm in het menu Invoegen van de Visual Basic-editor.
De naam van het dialoogvenster (eigenschap Name) is frmRandKleuren
Het bijschrift (eigenschap Caption) is De kleur en de dikte van de rand bepalen.
We zullen op dit formulier gebruik maken van 2 bijschriften (Labels), 2 opdrachtknoppen
(Commandbuttons) en 2 keuzelijsten met invoervak (Comboboxen).
Voeg deze 6 besturingselementen toe aan het dialoogvenster zoals op de volgende
schermafdruk.
Programmeren met Excel 80
Pas de eigenschappen van de besturingselementen aan:
Bijschrift1: Name: lblKleur
Caption: Welke kleur wens je?
Bijschrift2: Name: lblDikte
Caption: Welke dikte wens je?
Keuzelijst 1 met invoervak: Name: cboKleur
Keuzelijst 2 met invoervak: Name: cboDikte
Opdrachtknop1 Name: cmdStoppen
Caption: Stoppen
Opdrachtknop2 Name: cmdToepassen
Caption: Toepassen
Vergelijk met de volgende schermafdruk
Typ nu de kleuren en de randdikten in.
Schakel via de taakbalk over naar het Excelbestand Dialoogvenster.xlsm
Selecteer Blad2 en verander de naam van het werkblad in Gegevens
Typ de gewenste kleuren in het celbereik A1:A4 van het werkblad Gegevens rood, groen,
blauw en geel. Typ de gewenste randdiktes in het celbereik B1:B3: fijn, normaal, dik.
Je kunt in het keuzelijsten cboKleur en cboDikte instellen waar de gegevens terug te vinden
zijn in de eigenschap Rowsource.
Schakel terug naar de Visual Basic-editor en selecteer op het dialoogvenster
frmRandKleuren de keuzelijst met invoervak cboKleur
Programmeren met Excel 81
Zoek in het eigenschappenvenster de eigenschap Rowsource en vul daar de gegevensbron
in: Gegevens!A1:A4. Een volledige celverwijziging bestaat uit de naam van het werkblad
(hier Gegevens), gevolgd door een uitroepingsteken met erachter het celbereik.
Vul in de Rowsource van de keuzelijst met invoervak van cboDikte de juiste gegevensbron
in namelijk Gegevens!A1:A4
Als je wilt dat er bij het opstarten een kleur wordt getoond dat moet je die kleur invullen
in de eigenschap Value van cboKleur.
Als je wilt dat er bij het opstarten een randdikte wordt getoond dat moet je die randdikte
invullen in de eigenschap Value van cboDikte
Het ontwerp van het formulier is af. Nu volgt de code. We beginnen met de code van de
opdrachtknop cmdStoppen.
Dubbelklik op de Stoppen-knop van het dialoogvenster frmRandKleuren. Je komt
automatisch in het codevenster. Vul de code aan:
Unload frmRandKleuren
Nu moet de code geschreven worden van de opdrachtknop cmdToepassen. Je kunt gebruik
maken van de code die gegenereerd is door de macro RandKleuren.
Dubbelklik in het projectvenster op Module2. Je ziet de code van de macro RandKleuren.
Selecteer de code en kopieer ze. Dubbelklik eerst op frmRandKleuren en vervolgens op de
commandoknop cmdToepassen van dit dialoogvenster. Je komt automatisch in het
codevenster. Plak hier de code van de macro.
Dit zijn de eerste regels van de gekopieerde code: de constanten xlMedium en colorindex 32
kunnen bij jou verschillen.
Programmeren met Excel 82
Je hebt 2 variabelen nodig: KleurCode en DikteCode zijn gehele getallen. De gebruiker kan
de kleur kiezen in de keuzelijst met invoervak cboKleur. De kleur, die gekozen wordt is de
eigenschap Value van cboKleur. Met elke gekozen kleur komt een kleurCode overeen. Je
kunt dit het best programmeren met de controlestructuur Select Case. In de gekopieerde
code moet je dan telkens de Colorindex gelijk stellen met de KleurCode.
De gebruiker kan de dikte van de rand kiezen in de keuzelijst met invoervak cboDikte. De
dikte, die gekozen wordt is de eigenschap Value van cboDikte. Met elke gekozen dikte komt
een DikteCode overeen. Je gebruikt hier eveneens Select Case. In de gekopieerde code
moet je telkens de eigenschap Weight gelijk stellen met de DikteCode.
Pas de code van de procedure cmdToepassen_Click aan.
Private Sub cmdToepassen_Click()
Dim KleurCode As , DikteCode As
Select Case cboKleur.Value
Case "rood"
KleurCode = 3
Case
Case
Case
End Select
Select Case cboDikte.Value
Case
DikteCode = xlThin
Case
Case
End Select
Programmeren met Excel 83
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight =
.ColorIndex =
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight =
.ColorIndex =
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight =
.ColorIndex =
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight =
.ColorIndex =
End With
ActiveCell.Offset(1, 0).Select
End Sub
De code ActiveCell.Offset(1,0).Select selecteert de cel onder de huidige geselecteerde cel om
het resultaat beter te kunnen zien.
In module1 schrijf je een procedure Sub StartRandKleuren met 1 regel code nl.
frmRandKleuren.Show om het programma te laten starten.
Maak een knop op het werkblad Blad1 die je verbindt met de procedure
StartRandKleuren.
Test het programma uit en sla het programma op onder dezelfde naam
Dialoogvenster.xlsm.
Programmeren met Excel 84
10 Foutopvang
10.1 Uitvoeringsfouten
Als je een programma schrijft, moet je nagaan wat er gebeurt bij uitvoeringsfouten. Dit zijn
fouten die optreden tijdens de uitvoering van het programma en die veroorzaakt worden
door pogingen om een ongeldige actie te voltooien.
Sommige uitvoeringsfouten kun je voorkomen (bv. bij invoer door de gebruiker kun je het
gegevenstype en de waarde controleren) maar heel wat fouten zijn moeilijk op voorhand op
te vangen: de programmacode kan onjuiste logica bevatten die verhindert dat wordt gedaan
wat jij bedoeld had.
Meestal wordt de uitvoering door VBA onderbroken maar soms gaat de uitvoering gewoon
verder met onvoorspelbare effecten en resultaten als gevolg.
Foutopvang kan veel problemen voorkomen: als een fout optreedt, wordt het programma
dan niet onderbroken maar wordt een speciale routine uitgevoerd. In zo’n routine kan je de
gebruiker vertellen wat de oorzaak van de fout is, kan je de fout soms herstellen of kan je
het programma op een ordelijke wijze beëindigen.
10.2 Fouten onderscheppen
10.2.1 Voorbeeld
Open een nieuwe werkmap en de Visual Basic-editor. Bewaar de werkmap onder de
naam Foutopvang.
Kies Module in het menu Invoegen van de Visual Basic-editor.
Typ de code in:
Sub Delen()
Dim Getal1 As Integer, Getal2 As Integer, Resultaat As Single
Getal1 = InputBox("Geef een geheel getal")
Getal2 = InputBox("Geef een tweede geheel getal")
Resultaat = Getal1 / Getal2
MsgBox "Het quotiënt van " & Getal1 & " en " & Getal2 _
& " is " & Resultaat
End Sub
Programmeren met Excel 85
Test de procedure. Probeer vervolgens een getal groter dan 32767 in te voeren. Je krijgt
een foutmelding.
Klik op Foutopsporing. Klik vervolgens op Beginwaarden om de uitvoering te stoppen.
Je krijgt ook een foutmelding als je een tekst intypt i.p.v. een getal of als je als 2de getal nul
intypt.
Het is niet fraai als de uitvoering van een programma onderbroken wordt door een
foutmelding en als het programma wordt stopgezet. We zullen dat voorkomen door
foutopvang.
10.2.2 Foutopvang1
De eerste stap is het inschakelen van foutopvang met de volgende code:
On Error Goto regellabel
Als de foutopvang actief is en een fout optreedt, geeft VBA niet het gewone foutbericht
maar wordt de uitvoering doorgegeven aan de regel die is opgegeven via regellabel
Pas dit toe op de procedure Delen.
Open zonodig het bestand Foutopvang.xls en de Visual Basic-editor
Kopieer de procedure Delen , verander de naam in Foutopvang1 en vul de code aan die
vet gedrukt staat:
Sub Foutopvang1()
On Error GoTo Foutopvang
'Betekenis: als er een fout optreedt, ga naar het label Foutopvang:
Dim Getal1 As Integer, Getal2 As Integer, Resultaat As
Single
Getal1 = InputBox("Geef een geheel getal")
Programmeren met Excel 86
Getal2 = InputBox("Geef een tweede geheel getal")
Resultaat = Getal1 / Getal2
MsgBox "Het quotiënt van " & Getal1 & " en " & Getal2 _
& " is " & Resultaat
Exit Sub
'verlaat de procedure als er geen fout is opgetreden
‘Hier volgt het regellabel
Foutopvang:
MsgBox "Dit programma wordt beëindigd." & vbCrLf & _
"Reden: er is een fout opgetreden!!"
'Bij een fout wordt het programma niet verder uitgevoerd.
End Sub
De tekst waar een aanhalingsteken voor staat is commentaar en moet je niet intypen. Als je
die tekst intypt. (vergeet dan het aanhalingsteken niet)
Test de procedure.
Bij een fout krijgen we telkens hetzelfde bericht en wordt het programma niet uitgevoerd.
10.2.3 Foutopvang2
Je hebt bij Foutopvang1 een berichtvenster laten verschijnen en het programma
onderbroken. Je kunt bij een foutopvang het programma laten hervatten met de
code Resume. Als je enkel de code Resume gebruikt zal de opdracht waar de fout is
opgetreden herhaald wordt.
Als je de code Resume next gebruikt zal het programma hervat worden na de opdracht waar
de fout is gebeurd. Dit laatste is meestal niet aan te raden: meestal leidt dat tot een foutief
resultaat.
Open zonodig het bestand Foutopvang.xls en de Visual Basic-editor
Kopieer de procedure Delen , verander de naam in Foutopvang2 en vul de code aan die
vet gedrukt staat:
Sub Foutopvang2()
On Error GoTo VerkeerdeInvoer
'Dit is de foutopvang van de invoervensters
Dim Getal1 As Integer, Getal2 As Integer, Resultaat As Single
Getal1 = InputBox("Geef een geheel getal")
Programmeren met Excel 87
Opnieuw:
Getal2 = InputBox("Geef een tweede geheel getal")
On Error GoTo DelingDoor0
‘Dit is de foutopvang bij deling door 0
Resultaat = Getal1 / Getal2
MsgBox "Het quotiënt van " & Getal1 & " en " & Getal2 _
& " is " & Resultaat
Exit Sub
'de procedure wordt beëindigd
VerkeerdeInvoer:
MsgBox "De waarde is te groot of is geen getal"
Resume
'De opdracht Inputbox waar de fout is gebeurd wordt herhaald
DelingDoor0:
MsgBox "Delen door 0 is onmogelijk!"
Resume Opnieuw
'De opdracht wordt hervat vanaf de routine Opnieuw
End Sub
Test de procedure.
Als je nu tekst invoert i.p.v. een getal krijg je een berichtvenster en wordt het programma
hervat zodat je een tweede kans krijgt om een getal in te voeren. Als je als 2de getal 0 hebt
ingevoerd, wordt het programma hervat bij de invoer van het 2de getal.
10.2.4 Foutopvang3
Foutopvang2 is efficiënt maar geldt enkel voor deze procedure. Foutopvang3 is algemeen
geldig voor elke procedure.
In deze foutopvang laat je een berichtvenster verschijnen met 3 knoppen: Afbreken,
Nogmaals en Negeren. De gebruiker kan dan kiezen of het programma beëindigd wordt, of
het programma hervat wordt waar de fout gebeurd is of het programma verder gezet wordt
zonder rekening te houden met de foutmelding.
Je vangt de keuze van de gebruiker op in een variabele, die bijv. Antwoord wordt genoemd
en die gedeclareerd kan worden als Integer.
De code die hiervoor gebruikt wordt is:
Antwoord = MsgBox("Fout: " & Err.Number & " " & Err.Description, vbAbortRetryIgnore)
Uitleg: het bericht dat getoond wordt, bestaat uit de tekst Fout: gevolgd door Err.Number
(dit is het number van de fout) en Err.Description (dit is de beschrijving van de fout).
Programmeren met Excel 88
vbAbortRetryIgnore betekent dat de 3 knoppen Afbreken, Nogmaals en Negeren zullen
getoond worden.
Vervolgens moet je bepalen wat er moet gebeuren als de gebruiker gekozen heeft voor
Afbreken. Als de keuze van de gebruiker Afbreken is dan is Antwoord = vbAbort en moet de
procedure afgebroken worden. Bij de keuze Nogmaals is Antwoord = vbRetry (code:
Resume) en bij de keuze Negeren is Antwoord = vbIgnore (code: Resume Next).
Kopieer de procedure Delen , verander de naam in Foutopvang3 en vul de code aan die
vet gedrukt staat:
Sub Foutopvang3()
Dim Antwoord As Integer
On Error GoTo Foutopvang
Dim Getal1 As Integer, Getal2 As Integer, Resultaat As Single
Getal1 = InputBox("Geef een geheel getal")
Getal2 = InputBox("Geef een tweede geheel getal")
Resultaat = Getal1 / Getal2
MsgBox "Het quotiënt van " & Getal1 & " en " & Getal2 _
& " is " & Resultaat
Einde:
Exit Sub
Foutopvang:
Antwoord = MsgBox("Fout: " & Err.Number & " " & _
Err.Description, vbAbortRetryIgnore)
Select Case Antwoord
Case vbAbort
Resume Einde
Case vbRetry
Resume
Case Else
Resume Next
End Select
End Sub
Test de procedure.
Programmeren met Excel 89
Als je nu te grote getallen invoert, krijg je het berichtvenster met als boodschap: “Fout 6:
Overloop”. Voer je tekst in dan zie je de boodschap: “Fout 13: Typen komen niet overeen”
en als je als 2de getal 0 hebt ingevoerd, verschijnt er: “Fout 11: Delen door nul”. Probeer
telkens de 3 knoppen.
Programmeren met Excel 90
11 Enkele programma’s
11.1 Een quiz
Probleemstelling:
De computer toont een meerkeuzevraag met 4 mogelijkheden. De speler maakt een keuze.
Bij een verkeerd antwoord wordt het juiste antwoord gegeven. Vervolgens wordt de 2de
vraag getoond enz. Ondertussen wordt de score bijgehouden op een rekenblad. Na het
beantwoorden van de 5 vragen ziet de speler zijn totaalscore op het rekenblad.
Open een nieuwe werkmap en de Visual Basic-editor. Bewaar de werkmap onder de
naam Quiz.xlsm
Kies UserForm in het menu Invoegen van de Visual Basic-editor.
De naam van het dialoogvenster (eigenschap Name) is frmVraag1
Het bijschrift (eigenschap Caption) is Vraag 1.
Gebruik op het dialoogvenster een bijschrift om de vraag te formuleren, een groepsvak (een
frame) om de 4 mogelijke antwoorden te groeperen. De antwoorden kunnen gekozen
worden met een keuzerondje. Je plaatst binnen het groepsvak 4 keuzerondjes. Je gebruikt
een groepsvak om de keuzerondjes afhankelijk van mekaar te maken: je kunt er slechts één
van activeren. Zorg ervoor dat het groepsvak geselecteerd is op het moment dat je de
keuzerondjes op het dialoogvenster plaatst. Je hebt een opdrachtknop nodig om de
volgende vraag te tonen.
Plaats het bijschrift, het groepsvak met de keuzerondjes en de opdrachtknop op het
dialoogvenster. Vergelijk met de volgende schermafdruk.
Pas de eigenschappen van de besturingselementen aan:
Bijschrift: Name: lblVraag1
Programmeren met Excel 91
Caption: Welke sport vormt samen met langlaufen de "Noorse
combinatie"?
Groepsvak: Name: fraAntwoord
Caption: [We verwijderen Frame1]
Keuzerondje1: Name: optAntwoord1
Caption: Reuzenslalom
Keuzerondje2: Name: optAntwoord2
Caption: Schansspringen
Keuzerondje3: Name: optAntwoord3
Caption: Schieten
Keuzerondje4: Name: optAntwoord4
Caption: Kunstschaatsen
Opdrachtknop: Name: cmdOK
Caption: Naar volgende vraag
Vergelijk met de volgende schermafdruk.
Je moet in het rekenblad de score bijhouden.
Schakel via de taakbalk over naar het rekenblad. Typ in de
cellen A1: Score, A2: Vraag 1, A3: Vraag 2, A4: Vraag 3, A5:
Vraag 4, A6: Vraag 5, A7: Totaal. Je plaatst in de cel B7 een
formule die de som berekent van de waarden in het
celbereik B2:B6. Zorg voor opmaak van het werkblad: maak
gebruik van lettertype, rand en arcering.
Schakel terug over via de taakbalk naar VBA.
Dubbelklik op de opdrachtknop cmdOK. Je komt in het codevenster.
Programmeren met Excel 92
Vul de code van cmdOK_click aan en typ de code in.
Private Sub cmdOK_Click()
If optAntwoord1.Value = True Then
MsgBox "Verkeerd. Het juiste antwoord is schansspringen"
Range("B2").Value = 0
ElseIf
MsgBox "Je antwoord is juist"
ElseIf
ElseIf
End If
Unload frmVraag1
frmVraag2.Show ‘Deze coderegel uitschakelen met ‘ ervoor zolang
frmVraag2 niet bestaat
End Sub
Kies Module in het menu Invoegen. Schrijf een procedure StartVraag1 met 1 regel code
frmVraag1.Show.
Maak een knop op het werkblad Blad1 die je verbindt met de procedure StartVraag1.
Test het programma uit en sla het programma op onder dezelfde naam Quiz.xlsm.
(Vergeet niet de coderegel frmVraag2.Show uit te schakelen)
Je hebt 1 dialoogvenster met een vraag gemaakt. Je kunt de andere dialoogvensters op
dezelfde manier maken. Jammer genoeg kun je een formulier of dialoogvenster niet zomaar
kopieren. Toch kun je met een truc gebruik maken van al je werk. Je kunt namelijk een
dialoogvenster exporteren en ook importeren in een VBA-project. Er is wel een probleem:
als je frmVraag1 eerst exporteert en terug probeert te importeren geeft VBA een
foutmelding omdat er in een project geen 2 dialoogvensters dezelfde naam kunnen hebben.
Oplossing: we veranderen frmVraag1 van naam in frmVraag voor het exporteren. Na het
exporteren herstellen we de oorspronkelijke naam.
Programmeren met Excel 93
Verander de eigenschap Name van het dialoogvenster frmVraag1 in frmVraag. Kies
Bestand exporteren.. in het menu Bestand. Kies in Opslaan in je eigen map. Je mag de
voorgestelde naam frmVraag.frm aanvaarden. Klik op Opslaan.
Verander de eigenschap Name van het dialoogvenster frmVraag terug in frmVraag1.
Kies Bestand importeren… in het menu Bestand. Kies het bestand frmVraag en klik op
Openen. Je ziet in het projectvenster dat er 2 formulieren zijn.
Verander de eigenschap Name van het geimporteerde bestand frmVraag in frmVraag2
Vraag 2 luidt: “Wat vervuilt de lucht van Mexico-stad als vele tonnen stof?”
Mogelijke antwoorden: Droge poep (stront) Zeepresten Sigarettenas
Uitlaatgassen
Het eerste antwoord is het juiste antwoord.
Pas de eigenschappen aan van het bijschrift en van de keuzerondjes aan. Pas ook de code
van de commandoknop cmdOK_click aan.
Importeer opnieuw frmVraag en verander de eigenschap Name in frmVraag3
Vraag 3: “Wie is gekozen voor sportman van het jaar 2000?”
Mogelijke antwoorden: Mohammed Mourhit Johan Musseeuw Filip Meirhaeghe
Joël Smets
Het laatste antwoord is het juiste antwoord.
Pas de eigenschappen aan van het bijschrift en van de keuzerondjes aan. Pas ook de code
van de commandoknop cmdOK_click aan.
Importeer opnieuw frmVraag en verander de eigenschap Name in frmVraag4
Vraag 4: “Welk dier is terug te vinden op het logo van het automerk “Ferrari”?”
Mogelijke antwoorden: paard luipaard adelaar haai
Het eerste antwoord is het juiste antwoord.
Pas de eigenschappen aan van het bijschrift en van de keuzerondjes aan. Pas ook de code
van de commandoknop cmdOK_click aan.
Importeer opnieuw frmVraag en verander de eigenschap Name in frmVraag5
Vraag 5: “Welk meer hoort niet bij de “Great Lakes”, die tussen de VS en Canada liggen?”
Mogelijke antwoorden: Michiganmeer Eriemeer Victoriameer Huronmeer
Het derde antwoord is het juiste antwoord.
Programmeren met Excel 94
Pas de eigenschappen aan van het bijschrift en van de keuzerondjes aan. Pas ook de code
van de commandoknop cmdOK_click aan. Verander de caption van de commandoknop in
Einde.
Test het programma uit.
Er is nog 1 probleem. Als je het programma een 2de maal laat lopen, blijven de resultaten
van de vorige poging in de cellen B2:B6. Het kan dat de score daardoor foutief berekend
wordt. We kunnen bij het starten van het eerste dialoogvenster het celbereik B2:B6 wissen.
Schakel over naar het rekenblad. Neem een macro op met als naam WisBereik die het
celbereik B2:B6 wist. Schakel terug naar de Visual Basic-editor en dubbelklik op Module2.
Hier kun je de code terugvinden van de macro WisBereik. Vergelijk.
Sub WisBereik()
'WisBereik Macro
Range("B2:B6").Select
Selection.ClearContents
End Sub
Nu moet deze macro telkens opgestart worden als het eerste dialoogvenster wordt getoond.
Dubbelklik op frmVraag1. Dubbelklik op een lege plaats op het dialoogvenster (niet op
een besturingselement). Je komt in de code van UserForm_Click. Click is niet de juiste
gebeurtenis. Je kunt in het code venster bovenaan rechts in het keuzevenster met
invoervak (nu staat er Click) kiezen voor Initialize. Deze gebeurtenis wordt uitgevoerd
voor het tonen van het formulier.
Nu ben je in de procedure UserForm_Initialize. Typ hier de naam van de opgenomen
macro WisBereik in. Test het programma opnieuw uit.
Sla het programma op onder dezelfde naam Quiz.xlsm
Programmeren met Excel 95
11.2 Gegevens opzoeken
11.2.1 Gegevenslijsten sorteren en filteren
Excel kan grote hoeveelheden gegevens opslaan, bijhouden en analyseren, op voorwaarde
dat de gegevens ingevoerd zijn als een gegevenslijst of databank.
Open het bestand Klaslijsten.xlsm.
In dit bestand staan alle leerlingen van het 4de jaar met hun klasnummer, naam , voornaam,
klas, richting en geslacht. Deze namen staan bovenaan de kolommen en noemt men
veldnamen. Iedere rij bevat de gegevens van 1 leerling. Zo’n rij gegevens noemt men een
record. Je kunt deze gegevens heel eenvoudig sorteren en filteren.
Selecteer 1 cel uit de gegevenslijst. Kies Sorteren in het menu Gegevens. Geef bij
Sorteren op de eerste sleutel aan: in de keuzelijst vind je de veldnamen (Nr, Naam,…) van
de lijst. Kies voor Richting. Je mag de volgorde van A naar Z behouden. De leerlingen
worden per richting getoond: EC-MT, EC-WI enz. Wil je de oorspronkelijke volgorde terug,
dan kan je laten sorteren met als 1ste sleutel Klas en als 2de sleutel Nr.
Met Filter wordt het mogelijk specifieke records in een gegevenslijst op te sporen.
Plaats de cursor in de gegevenslijst. Kies Filter in het menu Gegevens. Iedere veldnaam
wordt een keuzelijst.
In de keuzelijst kan je voor ieder veld apart aangeven welke waarde dit veld moet
bevatten. Kies bij Richting voor EC-WI en bij Geslacht voor M. Schakel de filter uit door
terug op Filter te klikken.
11.2.2 Het programma “Gegevens opzoeken”
Probleemstelling:
De computer toont een dialoogvenster, waarop de gebruiker een nr,naam of voornaam kan
intikken, kan kiezen voor een klas of richting en geslacht. Als de gebruiker de opdracht laat
uitvoeren worden de gegevens automatisch gefilterd en vervolgens naar een nieuw
werkblad gekopieerd.
Programmeren met Excel 96
11.2.2.1 Macro opnemen
Je kunt een deel van de code laten genereren door een macro op te nemen.
Plaats de cursor in de gegevenslijst. Neem een nieuwe macro op. Je mag de naam
Macro1 behouden. Klik op OK. Maak de Filter actief.
Maak een keuze bij Klas, Richting, Geslacht, Nr, Naam en Voornaam. Je hebt slechts 1
record in de lijst. Selecteer A1.
Kies in het menu Start voor Zoeken en selecteren en vervolgens voor Ga Naar… kies
vervolgens voor Speciaal… Kies in het dialoogvenster Selecteren speciaal voor Huidig
gebied en klik op OK.
Kopieer de huidige selectie naar het klembord.
Voeg een nieuw werkblad in.
Plak de inhoud van het klembord in het nieuwe werkblad.
Selecteer A1
Selecteer het werkblad 4des. Druk op Escape. Vanaf nu kan de inhoud niet meer
gekopieerd worden uit het klembord. Zet de Filter uit.
Selecteer in dit werkblad ook A1. Beëindig de macro.
Bekijk de code van de opgenomen macro en vergelijk met de onderstaande code. De
vetgedrukte code verschilt van je opgenomen macro.
Sub Macro1()
' Macro1 Macro
Selection.AutoFilter
Selection.AutoFilter Field:=4, Criteria1:="4e"
Selection.AutoFilter Field:=5, Criteria1:="EC-MT"
Selection.AutoFilter Field:=6, Criteria1:="J"
Selection.AutoFilter Field:=1, Criteria1:="5"
Selection.AutoFilter Field:=2, Criteria1:="DE DECKER"
Selection.AutoFilter Field:=3, Criteria1:="Ben"
Range("A1").Select
Selection.CurrentRegion.Select
Selection.Copy
Programmeren met Excel 97
Sheets.Add
ActiveSheet.Paste
Selection.Columns.AutoFit
Range("A1").Select
Sheets("4des").Select
Application.CutCopyMode = False
Selection.AutoFilter
Range("A1").Select
End Sub
11.2.2.2 Dialoogvenster “Gegevens opzoeken”
Voeg een nieuwe userform in. Plaats 5 bijschriften, 3 tekstvakken, 2 keuzelijsten met
invoervak, 1 groepsvak en 2 opdrachtknoppen op het formulier.
Pas de eigenschappen van de besturingselementen aan:
UserForm: Name:frmGegevens Caption: Gegevens opzoeken
Bijschrift1: Name: lblNummer Caption: Nummer
Bijschrift2: Name: lblNaam Caption: Naam
Bijschrift3: Name: lblVoornaam Caption: Voornaam
Bijschrift4: Name: lblKlas Caption: Klas
Bijschrift5: Name: lblRichting Caption: Richting
Tekstvak1: Name: txtNummer
Tekstvak2: Name: txtNaam
Tekstvak3: Name: txtVoornaam
Keuzelijst1: Name: cboKlas Text: Onbekend
Bijschrift Tekstvak
Keuzelijst
met
invoervak
Opdracht-
knop Groepsvak
Keuzerondje
Programmeren met Excel 98
Keuzelijst2: Name: cboRichting Text: Onbekend
Groepsvak: Name: fraGeslacht Caption: Geslacht
Keuzerondje1: Name: optJongen Caption: Jongen
Keuzerondje2: Name: optMeisje Caption: Meisje
Keuzerondje3: Name: optOnbekend Caption: Onbekend Value:True
Opdrachtknop1: Name: cmdOpzoeken Caption: Opzoeken
Opdrachtknop1: Name: cmdEinde Caption: Einde
Je kunt de inhoud van de keuzelijsten met invoervak nog bepalen.
Typ eerst in het rekenblad de klassen in opeenvolgende cellen. Veronderstel dat je kiest
voor het celbereik I1:I6. De inhoud is 4a, 4b, 4c, 4d, 4e, Onbekend. Typ vervolgens in een
ander celbereik bijv. I8:I15 de richtingen: EC-MT, EC-WI, G-L, G-WI, L-MT, L-WI, MT-WI,
Onbekend. Als er Onbekend staat, wordt er niet gefilterd op dit veld. Verberg de kolom I.
Pas de eigenschap Rowsource van de keuzelijst cboKlas aan: 4des!I1:I6 en van de
keuzelijst cboRichting: 4des!I8:I15
Voeg een procedure toe in Module1 en noem ze GegevensOpzoeken met 1 regel code:
frmGegevens.show
Dubbelklik in het dialoogvenster frmGegevens op de commandoknop Einde om de code in
te vullen. Met deze code moet het dialoogvenster gesloten worden
Private Sub cmdEinde_Click()
Unload frmGegevens
End Sub
Test het programma. Daartoe moet je cursor binnen de procedure GegevensOpzoeken
staan en moet je op F5 drukken. Je kunt de keuzelijsten testen en de commandoknop
cmdEinde.
Nu moet de code nog geschreven worden van de commandoknop cmdOpzoeken. Gelukkig
kunnen we de code van de opgenomen macro gebruiken.
Kopieer de code van de macro Macro1. Dubbelklik op de knop cmdOpzoeken van het
dialoogvenster frmGegevens. Je cursor staat in de code van de procedure
cmdOpzoeken_Click. Plak hier de code van de macro.
Je kunt de code aanpassen. Elk gegeven van het dialoogvenster moet terecht komen in een
variabele. Je hebt dus 6 variabelen nodig: Nr is een geheel getal, Naam, Voornaam, Klas,
Richting en Geslacht is tekst. De tekst, die de gebruiker invult in een tekstvak is de
eigenschap Value. Om bijv. het nummer, dat is ingevuld in het tekstvak txtNummer op te
vangen in de variabele Nr schrijf je de volgende code: Nr = txtNummer.Value. Je kunt
Programmeren met Excel 99
dezelfde code gebruiken voor de Naam, Voornaam, Klas en Richting. Voor het geslacht moet
je een keuzestructuur gebruiken. Als de eigenschap Value van het keuzerondje optJongen
waar (true) is dan is de waarde van de variabele Geslacht gelijk aan “J”.
De regel code, die de filter toepast van het veld Nr is
Selection.AutoFilter Field:=1, Criteria1:="5"
Als het nummer niet is ingevuld mag er niet gefilterd worden op het veld Nr. Dit bekom je
door het criterium weg te laten.
Selection.AutoFilter Field:=1
Als het nummer wel is ingevuld, wordt de code:
Selection.AutoFilter Field:=1, Criteria1:= Nr
Vul de code van cmdOpzoeken_click aan en typ de code in.
Private Sub cmdOpzoeken_Click()
Dim Nr As , Naam As
Dim Voornaam As , Klas As
Dim Richting As , Geslacht As
Dim Bladnaam As String
'Als je het werkblad 4des niet actief is krijg je een foutmelding
Sheets("4des").Select
Range("A1").Select
Selection.AutoFilter
Nr = Val(txtNummer.Value) ‘Je hebt Val nodig om de tekst om te zetten
naar een getal
Naam = txtNaam.Value
Voornaam =
Klas = cboKlas.Value
Richting =
If optJongen.Value = True Then
Geslacht = "J"
ElseIf
Else
Geslacht = "Onbekend"
Programmeren met Excel 100
End If
If txtNummer.Value = "" Then
Selection.AutoFilter Field:=1
Else
Selection.AutoFilter Field:=1, Criteria1:=Nr
End If
If Naam = "" Then
Selection.AutoFilter Field:=2
Else
Selection.AutoFilter Field:=2, Criteria1:=Naam
End If
If Voornaam =
If Klas = "Onbekend" Then
If Richting = "Onbekend" Then
If Geslacht =
Range("A1").Select
Programmeren met Excel 101
Selection.CurrentRegion.Select
Selection.Copy
Sheets.Add
ActiveSheet.Paste
Selection.Columns.AutoFit
Range("A1").Select
'De regel die volgt wordt bijgevoegd om later dit werkblad te selecteren
Bladnaam = ActiveSheet.Name
Sheets("4des").Select
Application.CutCopyMode = False
Selection.AutoFilter
Range("A1").Select
'Het bijgevoegde werkblad wordt geselecteerd
Sheets(Bladnaam).Select
End Sub
Maak een knop op het werkblad 4des, die je verbindt met de procedure
GegevensOpzoeken.
Test het programma uit. Verwijder de bijgevoegde werkbladen. Sla het bestand onder
dezelfde naam Klaslijsten.xlsm.
Programmeren met Excel 102
12 Foutopsporing
Soms werkt een programma niet zoals het hoort. In VBA zijn er heel wat mogelijkheden om
fouten op te sporen.
Open het bestand Foutopsporing.xlsm. Start het programma Omtrek en oppervlakte
door te klikken op de opdrachtknop. In een dialoogvenster wordt de straal van de cirkel
gevraagd. Vul een tekst in i.p.v. een getal.
VBA toont een dialoogvenster:
Klik op Foutopsporing. Je ziet een geel pijltje en de tekst, waar het programma
onderbroken is, wordt geel gemarkeerd.
In de declaratie van de variabelen staat de straal als decimaal getal (single) gedefinieerd. De
computer verwacht een getal en je hebt een tekst (string) ingevoerd. De typen tekst en
getal komen niet overeen en dan geeft de computer de foutmelding 13. Meestal zul je nu
kiezen voor Beginwaarden om het programma te beëindigen en de fout te
verbeteren.
Klik op Doorgaan. Je krijgt een nieuwe kans om een straal in te vullen. Klik op
Annuleren. Je krijgt dezelfde foutmelding. Klik opnieuw op Foutopsporing en vervolgens
op Doorgaan. Vul nu een getal in en controleer in Excel of de omtrek en oppervlakte van
de cirkel berekend en ingevuld zijn.
Schakel over naar de Visual Basic-Editor en doe het aanhalingsteken weg voor het
woordje stop in de code van de procedure OmtrekOpp. Voer het programma opnieuw uit
en vul een willekeurig getal in als straal.
Programmeren met Excel 103
Het programma wordt onderbroken bij het woord Stop. Wijs met de muiscursor naar de
variabelen Straal, Omtrek en Oppervlakte. Telkens wordt de waarde van de variabele
getoond.
Klik op Doorgaan en plaats het aanhalingsteken terug voor het woordje stop in de code
van de procedure OmtrekOpp.
Je kunt het programma onderbreken door onderbrekingspunten te plaatsen. Klik in de
grijze balk aan de linkerkant van het codevenster naast Omtrek = OMTRCIRKEL(Straal).
Plaats nog een onderbrekingspunt bij Range("a1").CurrentRegion.Select
Voer het programma opnieuw uit en voer een willekeurig getal in als straal. Het
programma wordt onderbroken bij het 1ste onderbrekingspunt. Wijs de variabele straal
aan: de ingevulde waarde wordt getoond. Wijs de variabelen Omtrek en Oppervlakte
aan: de waarden zijn nog 0, omdat de omtrek en de oppervlakte nog niet berekend zijn.
Klik op Doorgaan: het programma stopt bij het 2de onderbrekingspunt. Als je nu wijst
naar de variabelen Omtrek en Oppervlakte worden de berekende waarden getoond.
Klik op Beginwaarden. Neem de onderbrekingspunten weg door opnieuw op dezelfde
plaatsen in linkerbalk van het codevenster te klikken.
Programmeren met Excel 104
13 Enkele programma’s
Het is nu de bedoeling de programma’s volledig zelfstandig te schrijven.
13.1 Tafels van vermenigvuldiging
Schrijf het programma dat de tafels van vermenigvuldiging opvraagt en bijhoudt hoeveel
maal men correct heeft geantwoord. Als het antwoord correct is, verschijnt er "juist".
Bewaar de opdracht in de map VBA als vermenigvuldiging.xlsm
Programmeren met Excel 105
14 Scorebord voetbal
Bouw in Excel een scorebord voor een voetbalwedstrijd waarmee de scores worden
getoond. De namen van de ploegen worden verwerkt in het eigenlijke scorebord.
In Excel:
Scorebord: