cursus VBA 2007

105
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.

description

Nederlands

Transcript of cursus VBA 2007

Page 1: 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.

Page 2: cursus VBA 2007

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”.

Page 3: cursus VBA 2007

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”.

Page 4: cursus VBA 2007

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”

Page 5: cursus VBA 2007

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.

Page 6: cursus VBA 2007

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.

Page 7: cursus VBA 2007

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.

Page 8: cursus VBA 2007

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.

Page 9: cursus VBA 2007

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.

Page 10: cursus VBA 2007

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

Page 11: cursus VBA 2007

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

Page 12: cursus VBA 2007

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.

Page 13: cursus VBA 2007

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.

Page 14: cursus VBA 2007

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)

Page 15: cursus VBA 2007

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.

Page 16: cursus VBA 2007

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

Page 17: cursus VBA 2007

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

Page 18: cursus VBA 2007

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.

Page 19: cursus VBA 2007

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.

Page 20: cursus VBA 2007

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

Page 21: cursus VBA 2007

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 _________________________________________________

_________________________________________________

Page 22: cursus VBA 2007

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

Page 23: cursus VBA 2007

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.

Page 24: cursus VBA 2007

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 & _

Page 25: cursus VBA 2007

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 .

Page 26: cursus VBA 2007

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

Page 27: cursus VBA 2007

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.

Page 28: cursus VBA 2007

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.

Page 29: cursus VBA 2007

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.

Page 30: cursus VBA 2007

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.

Page 31: cursus VBA 2007

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.

Page 32: cursus VBA 2007

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 =

Page 33: cursus VBA 2007

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

Page 34: cursus VBA 2007

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.

Page 35: cursus VBA 2007

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

Page 36: cursus VBA 2007

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

Page 37: cursus VBA 2007

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

Page 38: cursus VBA 2007

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

Page 39: cursus VBA 2007

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 --

Page 40: cursus VBA 2007

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

Page 41: cursus VBA 2007

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,

Page 42: cursus VBA 2007

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 --

Page 43: cursus VBA 2007

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.

Page 44: cursus VBA 2007

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

Page 45: cursus VBA 2007

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.

Page 46: cursus VBA 2007

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

Page 47: cursus VBA 2007

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:

Page 48: cursus VBA 2007

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.

Page 49: cursus VBA 2007

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.

Page 50: cursus VBA 2007

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.

Page 51: cursus VBA 2007

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).

Page 52: cursus VBA 2007

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.

Page 53: cursus VBA 2007

Programmeren met Excel 53

Vul het structogram in van de procedure KleineGetallen.

-- KleineGetallen --

Vergelijk je werkblad Blad1 met de volgende schermafdruk.

Page 54: cursus VBA 2007

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.

Page 55: cursus VBA 2007

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

Page 56: cursus VBA 2007

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.

Page 57: cursus VBA 2007

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.

Page 58: cursus VBA 2007

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

Page 59: cursus VBA 2007

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

Page 60: cursus VBA 2007

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)

Page 61: cursus VBA 2007

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

Page 62: cursus VBA 2007

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.

Page 63: cursus VBA 2007

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

Page 64: cursus VBA 2007

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)

Page 65: cursus VBA 2007

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"

Page 66: cursus VBA 2007

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.

Page 67: cursus VBA 2007

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.

Page 68: cursus VBA 2007

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

Page 69: cursus VBA 2007

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.

Page 70: cursus VBA 2007

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.

Page 71: cursus VBA 2007

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.

Page 72: cursus VBA 2007

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

Page 73: cursus VBA 2007

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.

Page 74: cursus VBA 2007

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

Page 75: cursus VBA 2007

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:

Page 76: cursus VBA 2007

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.

Page 77: cursus VBA 2007

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 =

Page 78: cursus VBA 2007

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

Page 79: cursus VBA 2007

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.

Page 80: cursus VBA 2007

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

Page 81: cursus VBA 2007

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.

Page 82: cursus VBA 2007

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

Page 83: cursus VBA 2007

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.

Page 84: cursus VBA 2007

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

Page 85: cursus VBA 2007

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")

Page 86: cursus VBA 2007

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")

Page 87: cursus VBA 2007

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).

Page 88: cursus VBA 2007

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.

Page 89: cursus VBA 2007

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.

Page 90: cursus VBA 2007

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

Page 91: cursus VBA 2007

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.

Page 92: cursus VBA 2007

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.

Page 93: cursus VBA 2007

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.

Page 94: cursus VBA 2007

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

Page 95: cursus VBA 2007

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.

Page 96: cursus VBA 2007

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

Page 97: cursus VBA 2007

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

Page 98: cursus VBA 2007

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

Page 99: cursus VBA 2007

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"

Page 100: cursus VBA 2007

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

Page 101: cursus VBA 2007

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.

Page 102: cursus VBA 2007

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.

Page 103: cursus VBA 2007

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.

Page 104: cursus VBA 2007

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

Page 105: cursus VBA 2007

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: