Download as pdf or txt
Download as pdf or txt
You are on page 1of 105

1 1.

VBA-instructies vastleggen met de macro-recorder Het tabblad ontwikkelaars toevoegen

Voor we macros kunnen gebruiken moet het tabblad ontwikkelaars toegevoegd worden. Klik hiervoor op de Office knop en kies Opties voor Excel

Schakel vervolgens Tabblad Ontwikkelaars op het lint weergeven in.

Programmeren met Excel

1.2

Macrobeveiliging instellen

Indien je een office document ontvangt kan dit een macro bevatten die niet onschuldig is. Stel daarom het beveiligingsniveau correct is.

1.3

Een macro opnemen

We willen een macro opnemen om de achtergrond van een cel rood te kleuren. Kies in tabblad Ontwikkelaars voor Marco opnemen.

Programmeren met Excel

Er verschijnt een dialoogvenster waarin we de naam van de macro invullen.

De macro naam moet beginnen met een letter, en er zijn enkel letters, cijfers en het onderstrepingsteken _ toegelaten. Spaties en punten zijn niet toegelaten. Afspraak: de eerste letter van elk woord is een hoofdletter, de andere letters zijn kleine letters. De naam van de macro moet logisch gekozen zijn. We kiezen hier voor de naam KleurAchtergrondRood.

Wanneer een macro opgenomen wordt is de knop Macro Opnemen verandert in de knop Opname stoppen.

Programmeren met Excel

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 Macros weergeven in het lint.

Een lijst met alle beschikbare macros (in dit geval is er slechts 1 macro) verschijnt. Selecteer de uit te voeren macro en kies Uitvoeren of dubbelklik op de macronaam uit de lijst.

Controleer of de cel A3 rood is gekleurd. Bewaar de werkmap onder de naam Macro in Mijn documenten\VBA

Programmeren met Excel

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 macros 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 macros bevatten moeten bewaard worden met de extensie .xlsm in plaats van de standaard .xlsx extensie.

Programmeren met Excel

1.7

Nog meer macros

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 macros te bekijken en te wijzigen gebruiken we een apart venster: de Visual Basic-editor. Alle Office-toepassingen (Excel, Word, Access, ) gebruiken dezelfde programmeeromgeving. Je kunt de editor starten door te klikken op de Visual Basic-knop onder ontwikkelaars.

De Visual Basic-editor bevat een menubalk en enkele werkbalken met opdrachten eigen aan de programmeeromgeving: bv. uitvoeren van een programma, foutopsporing, Daaronder vind je verschillende vensters met informatie. Je kunt deze vensters en de werkbalken naar wens zichtbaar maken, verbergen en herschikken.

Programmeren met Excel

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 macros in de module Module2 komen, enz. Als je niet oplet, vind je op de duur de juiste code niet meer terug. Je kunt procedures (dit is de code die gegenereerd is door een macro) verplaatsen door te knippen en te plakken van de ene module naar de andere. Een leeg moduleblad kunnen we verwijderen door er met de rechtermuisknop op te klikken en in het snelmenu te kiezen voor module verwijderen.

We bekijken de code van de macro VerwijderAchtergrondkleur Een procedure begint altijd met Sub en eindigt altijd met End Sub. Daarna volgen enkele commentaarregels. Deze zijn te herkennen aan de groene kleur waarin ze worden weergegeven. Als je deze regels verwijdert zal het programma nog altijd uitgevoerd kunnen worden. We kunnen zulke regels zelf bijvoegen door de regel te beginnen met het weglatingsteken . In deze commentaar leggen we uit wat we met een bepaalde code bedoelen en waarvoor de code juist dient. Een programma dat goed gedocumenteerd is, kan achteraf veel eenvoudiger aangepast worden.

Programmeren met Excel

2 2.1

Gebruik van dialoogvensters Berichtvensters

2.1.1 Bericht 1

Werk verder in het bestand Macro.xlsm We hebben enkele macros opgenomen en we hebben de code van de procedures bekeken. Nu zullen we zelf de code schrijven van de procedures. De functie, die we nodig hebben om een bericht in een dialoogvenster weer te geven, is de MsgBox-functie. We zullen de berichten in een aparte module bewaren.

Open de Visual Basic editor in het Excel document Kies Module in het menu Invoegen.

In het projectvenster zien we dat de nieuwe module Module2 is bijgevoegd.

Programmeren met Excel

Het code venster van Module2 is leeg. Als je het codevenster van een module wilt zien, moet je dubbelklikken op de module.

We veranderen de naam van Module2 door in het eigenschappenvenster te dubbelklikken op Module2 naast (Name) en de naam te veranderen in Berichten

Klik in het leeg codevenster. Tik in: Sub Bericht1 en druk op Enter

Sub betekent voor de computer het begin van een procedure (een programma). Als je op Enter drukt, voegt de computer na de naam nog () en op het einde End Sub toe. Alle code moet tussen Sub en End Sub getypt worden.

Druk op TAB en tik verder: Msgbox Hallo

De code ziet er zo uit:

Test de procedure Bericht1.Je kunt dan die procedure op dezelfde manier starten zoals een macro. Je kunt nog veel eenvoudiger de uitvoering aanvragen door de cursor in de programmacode te plaatsen en dan op F5 te drukken.

Je eerste kleine programma werkt (ik hoop dat het gelukt is).

2.1.2 Bericht 2 Maak een berichtvenster met de tekst Hallo, een titel Opgelet en zowel een OK - als een Annuleren-knop.

Plaats de cursor onder Bericht1 in de module berichten. Voeg eventueel een nieuwe Alinea in.

Programmeren met Excel

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

10

Programmeren met Excel

Druk op TAB en en tik verder:


Voornaam = InputBox (Wat is je voornaam?)

Deze regel vergt enige uitleg. De functie, die gebruikt wordt om een invoervenster op een venster te tonen is InputBox. De argumenten van deze functie, zoals het bericht die op het venster getoond wordt en de titel van het invoervenster, moeten altijd tussen haakjes staan. Via de InputBox kan je de uitvoering van een procedure pauzeren: de computer wacht tot de gebruiker tekst of een getal invoert en bevestigt met Enter of een andere knop kiest. Die invoer moet dan opgeslagen worden in het geheugen van de computer. Om de inhoud van het geheugenvakje later te kunnen gebruiken moet je er een zinvolle naam aan geven. Hier krijgt het geheugenvakje de naam Voornaam. De computer weet nu dat Voornaam de naam is van een variabele. Om de inhoud van een variabele te veranderen gebruik je een gelijkheidsteken. Meer uitleg over variabelen volgt in 2.3 Het gebruik van variabelen. Opmerking: het bericht, dat op het venster wordt getoond is tekst en tekst moet altijd tussen aanhalingstekens geplaatst worden. Je kunt nu de gebruiker aanspreken met zijn voornaam via een berichtvenster.

Druk op Enter en typ verder:


Msgbox "Hallo " & Voornaam

Het eerste deel Msgbox Hallo begrijp je al. Vergeet de spatie achter het woord Hallo en voor het aanhalingsteken niet! Om delen van een boodschap met elkaar te verbinden gebruik je het ampersand-teken (&). OPGELET: voor en achter het ampersand-teken moet je altijd een spatie typen. In het tweede deel van de boodschap vraag je aan de computer om de inhoud van de variabele Voornaam te tonen. Test Invoer1.

Plaats de cursor in de code en druk op F5 . Het invoervenster verschijnt op het scherm. Bewaar de werkmap Macro.xlsm

Programmeren met Excel

11

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. Zon 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 Byte Boolean Integer Plaats in het geheugen 1 byte 2 bytes 2 bytes Waarden Getallen van 0 tot 255 Waar of Onwaar Gehele getallen van 32.768 tot 32.767 Van 2.147.483.648 tot 2.147.483.647 Positieve en negatieve rationale getallen. Zeer grote en kleine rationale getallen Double 8 bytes (van 1,79769313486232E308 tot + 1,79769313486232E308) Van 922.337.203.685.477,5808 Currency 8 bytes tot + 922.337.203.685.477,5807 (voor valuta bedragen) String Date 1 byte = 1 teken 8 bytes Tekst Data en tijden

Long (long integer) 4 bytes Single 4 bytes

Het opgeven van het juiste gegevenstype bij het gebruik van een variabele noemt men een variabele declareren. 12
Programmeren met Excel

Declareren dat de variabele Voornaam van het type tekst is, gebeurt door de volgende coderegel:
Dim Voornaam as string

Algemeen: Dim Variabelenaam as type Toepassing: Maak een macro die de gebruiker vraagt een getal in te voeren, de vierkantswortel van de ingevoerde waarde berekent en het resultaat in een berichtvenster afdrukt op het scherm. Plaats de cursor onder de procedure Invoer1 in de module Berichten.

Tik in Sub Wortel en druk op Enter Druk op TAB en tik verder:


Dim Getal as Single Dim Vwortel as Single

Zo weet VBA dat er twee stukjes uit het werkgeheugen moeten worden vrijgehouden, die de naam Getal en Vwortel krijgen en die als waarde een rationaal getal kunnen bevatten

Druk op Enter en typ verder: Getal = Inputbox (Vul een getal in:)

Het getal, dat de gebruiker intikt, wordt opgeslagen in de variabele Getal.

Druk op Enter en typ verder: Vwortel = Getal ^ (1/2)

Zoals je wellicht weet uit de wiskundelessen is vierkantswortel uit een getal = dat getal verheffen tot de macht . De uitkomst wordt opgeslagen in de variabele Vwortel. Je kunt hier ook gebruik maken van de functie sqr. De code wordt dan:
Vwortel = sqr (Getal)

Nu moet je nog het bericht op het venster plaatsen met de wortel uit dat getal.

Druk op Enter en typ: Msgbox Wortel: & Vwortel Test het programma

2.4

Verfraaien van de dialoogvensters

De code van de procedure Invoer1 zullen we aanpassen

Kopieer de code van deze procedure in VBA en plak onder de vorige procedures in de module Berichten.

Programmeren met Excel

13

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 vbOKOnly vbOKCancel Beschrijving De standaardinstelling: uitsluitend de knop OK weergeven De knoppen OK en Annuleren weergeven

vbAbortRetryIgnore De knoppen Afbreken, Nogmaals en Negeren weergeven. vbYesNoCancel vbYesNo vbRetryCancel vbCritical vbQuestion De knoppen Ja, Nee en Annuleren weergeven De knoppen Ja en Nee weergeven De knoppen Nogmaals en Annuleren weergeven Het pictogram Het pictogram weergeven (Critical Message) weergeven (Warning Query)

14

Programmeren met Excel

vbExclamation vbInformation

Het pictogram Het pictogram

weergeven (Warning Message) weergeven (Information Message)

Je gebruikt de constante vbNewLine om in een berichtvenster een nieuwe regel te beginnen. De code van de MsgBox kan er als volgt uitzien (je mag andere argumenten kiezen):
MsgBox Prompt:="Hallo, " & Voornaam & _

". Je ziet er vandaag niet al te best uit. " & vbNewLine _ & "Heb je slecht geslapen?", _
Title:="Je computer is bezorgd om jou!!", _ Buttons:=vbYesNo + vbQuestion

Je kunt de cursief gedrukte tekst weglaten; vergeet dan de komma niet na Voornaam, gevolgd door een spatie en een onderstrepingsteken. Bij het argument Buttons kun je een knop en een pictogram kiezen. Je moet de 2 argumenten verbinden met een + teken.

Bewaar het programma. Test het programma. Pas op dezelfde manier de procedure Wortel aan en noem de nieuwe procedure Wortel2. Zorg voor een titel bij het invoervenster. Het berichtvenster moet er ongeveer als volgt uitzien:

1. Maak zelf een procedure Dubbel: de gebruiker voert een getal in, je berekent het dubbel en bewaart het in een variabele (gebruik voor de variabele een andere naam dan de procedure). Het resultaat wordt in een berichtvenster weergegeven. 2. Zelfde opdracht voor een procedure Kwadraat. 3. Schrijf een procedure Berekeningen die de gebruiker in vier opeenvolgende invoervensters vraagt een gehele waarde in te voeren. Daarna worden de vier getallen afgedrukt, samen met hun som en hun gemiddelde.
Programmeren met Excel 15

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

16

Programmeren met Excel

3 3.1

De opeenvolging als controlestructuur De sequentie of opeenvolging

Programmas 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 macros KleurAchtergrondRood, VerwijderAchtergrondkleur en Valutanotatie bevat.

Plaats de cursor op de eerste lijn na de laatste procedure in Module1

We willen dat de procedure StelWeergaveIn het getal in een cel op een rode achtergrond plaatst en dat getal weergeeft met 2 decimalen en met de valutatekst . De twee deelopdrachten zijn reeds in een macro opgenomen. Het structogram ziet er als volgt uit:

--StelWeergaveIn-KleurAchtergrondRood Valutanotatie

Programmeren met Excel

17

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 macros op en tik vervolgens de procedure in.

18

Programmeren met Excel

3.2

Een procedure aan een knop verbinden

Een procedure is maar efficint 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 macros. Als je tijdens het tekenen van de knop de Alt-toets ingedrukt houdt, zal de knop perfect op de randen van een cel komen.

Kies de macro of procedure StelWeergaveIn en klik op OK.

Programmeren met Excel

19

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

20

Programmeren met Excel

4 4.1

Werken met functies Functies ontwerpen

We hebben tot nu toe gebruik gemaakt van procedures om programmas te ontwerpen. Een procedure voert n of meerdere acties uit op objecten van de Excel-omgeving. Indien je met een macro werkt is het resultaat altijd een procedure. Een procedure wordt ook soms subroutine genoemd, vandaar de sleutelwoorden Sub in het begin en End Sub op het einde van een procedure. Een functie daarentegen voert een berekening of een bewerking uit en geeft n enkele waarde als resultaat, net zoals de gewone Excel-functies. Een functie aanvaardt gegevens (in het vervolg spreken we van argumenten), bewerkt ze en geeft het resultaat in de vorm van een getal, een tekst, Besluit: het verschil tussen een procedure en een functie zit in het resultaat. Een procedure doet iets, terwijl een functie een antwoord op een vraag geeft. Zijn de volgende opdrachten procedures of functies? Verklaar TekenKader _________________________________________________ _________________________________________________ BepaalLeeftijd _________________________________________________ _________________________________________________ CentreerTitel _________________________________________________ _________________________________________________ GaNaarBegin _________________________________________________ _________________________________________________ TelOp _________________________________________________ _________________________________________________ BepaalVrijeSchijfruimte _________________________________________________ _________________________________________________

Programmeren met Excel

21

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

22

Programmeren met Excel

4.2.2 Een zelfgemaakte functie gebruiken in je werkblad.


Selecteer een cel in het werkblad. Klik op de knop Functie invoegen .

Het venster Functie invoegen verschijnt. Kies in de Functiecategorie voor Door gebruiker gedefinieerd. Kies bij functienaam voor NWORTEL

Klik op OK.

Programmeren met Excel

23

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

24

Programmeren met Excel

"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 =
4 . .r 3 . 3

Programmeren met Excel

25

5 5.1

De keuze als controlestructuur 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 Groet = Goede morgen! NIET WAAR Groet = Goede middag!

Het algemeen structogram voor een tweezijdige selectie is:

voorwaarde WAAR Opdracht(en) 1 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 voldaan is uit te voeren als aan de voorwaarde NIET WAAR Opdracht(en) 2

26

Programmeren met Excel

Else opdracht(en) 2 niet voldaan is End If afgesloten met End If wordt de keuzestructuur uit te voeren als aan de voorwaarde

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) voldaan is End If uit te voeren als aan de voorwaarde

Het algemeen structogram voor een eenzijdige selectie is:

voorwaarde WAAR Opdracht(en) NIET WAAR

Maak een nieuwe werkmap Keuze in Excel. Open de Visual Basic-editor en maak een module Keuze aan. Typ de code in onder de procedure Begroeting (Vergeet niet te beginnen met Sub)
If Time < 0.5 Then Msgbox Goedemorgen Else Msgbox Goedemiddag End If

Test de procedure. Bewaar de werkmap onder de naam Keuze.xlsm.

Programmeren met Excel

27

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 Meer dan 90 Van 70 tot 80 Van 60 tot 70 Van 50 tot 60 Minder dan 50 Commentaar Schitterend gewerkt! Goed gewerkt! Voldoende Geslaagd Onvoldoende

Van 80 tot (en met) 90 Zeer goed gewerkt!

Daarvoor bestaan er in Excel 2 mogelijkheden.

28

Programmeren met Excel

5.2.1 De IfThenElseIfElseEnd If-blok De eerste mogelijkheid is een uitbreiding van de tweezijdige keuze en de formulering is: If voorwaarde1 Then opdracht(en) 1 voldaan is ElseIf voorwaarde2 Then opdracht(en) 2 voldaan is ElseIf voorwaarde3 Then opdracht(en) 3 voldaan is Else opdracht(en) End If afgesloten

uit te voeren als aan voorwaarde1

uit te voeren als aan voorwaarde2

uit te voeren als aan voorwaarde3

uit te voeren als aan geen enkele met End If wordt de keuzestructuur

voorwaarde voldaan is

Voer de code in (heb je inspiratie, dan mag je de commentaar wijzigen)


Sub RapportCommentaar() Dim Uitslag As Byte Dim Commentaar As String Uitslag = InputBox("Geef je uitslag in percent:") If Uitslag > 90 Then Commentaar = "Schitterend gewerkt!" ElseIf Uitslag > 80 Then Commentaar = "Zeer goed gewerkt!" ElseIf Uitslag > 70 Then Commentaar = "Goed gewerkt!" ElseIf Uitslag > 60 Then Commentaar = "Voldoende" ElseIf Uitslag > 50 Then Commentaar = "Geslaagd" Else Commentaar = "Onvoldoende" End If MsgBox Commentaar End Sub

Test het programma. Verbeter zonodig de fouten en bewaar onder de naam Keuze.xlsm.

Programmeren met Excel

29

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.

30

Programmeren met Excel

Vul het structogram aan:

-- Wortel2 -Invoervenster: vraag het getal

_____________________ WAAR __________________________ __________________________ NIET WAAR __________________________ __________________________

Een mogelijke structuur van het programma.


Sub Wortel2() Dim Getal As , Vwortel As ________________________

Getal= _____________________________________________________________________ If _______________________________________________________________ then Vwortel = ________________________________________________________ Msgbox De positieve vierkantswortel uit het getal & __________________ & _ is gelijk aan & _______________________ & vbNewLine & _ __________________ & _

"De negatieve vierkantswortel uit het getal " & " is gelijk aan -" & ________________________ Else MsgBox End If End Sub

Voer de code in en test het programma uit. Verbeter zonodig de fouten. Bewaar het bestand onder dezelfde naam Keuze.xlsm.

Programmeren met Excel

31

5.3.2 Oplossen van vierkantsvergelijkingen. Schrijf een programma om een vierkantsvergelijking op te lossen. Ter herinnering: als de vergelijking a x 2 b x c 0 is dan is de discriminant d b 2 4 a c . Als d > 0 dan zijn er 2 oplossingen: opl1=
b d b d b en opl2 = . Als d = 0 dan is er 1 oplossing opl = . 2a 2a 2a

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 Dim opl1 As a = InputBox b = InputBox c = InputBox d= If opl1 = opl2 = MsgBox "De twee oplossingen zijn: " & ElseIf opl = Then & " en " & Then , b As , opl2 As , c As , opl As , d As

32

Programmeren met Excel

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 1 1 1 3 2 4 b 5 2 2 9 11 4 c 6 1 3 6 18 1 aantal opl. 2 1 0 2 0 1 0,5 1 2 opl1 2 1 opl2 3

Programmeren met Excel

33

6 6.1

De begrensde herhaling als controlestructuur 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.

34

Programmeren met Excel

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
35

Programmeren met Excel

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 = ActiveCell.Value = C Next End Sub To

Vul zelf het structogram in

36

Programmeren met Excel

-- VulInTot15 --

Maak een knop op het werkblad Blad1 die je verbindt met de procedure VulInTot15 .

Test het programma uit en sla het bestand op onder dezelfde naam Begrensde herhaling.xlsm

6.2.2 VulOnevenIn Schrijf een procedure die de cellen vanaf B1 de cellen verticaal opvult met alle oneven getallen vanaf 31 tot 50. Je moet nu eerst B1 selecteren. Vervolgens ga je met de controlestructuur begrensde herhaling de cellen een waarde toekennen van een teller die 31 als beginwaarde heeft en die telkens met 2 verhoogd wordt (dit wordt de stapwaarde genoemd). De eindwaarde van de teller mag 50 niet overschrijden. Bekijk de code van de macro SelecteerA1:
Sub SelecteerA1() Range("A1").Select End Sub

Je kunt nu zelf de code schrijven om de cel B1 te selecteren:

Een mogelijke structuur van de procedure VulOnevenIn is:


Sub VulOnevenIn() Dim Teller As

Programmeren met Excel

37

Range( For

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

38

Programmeren met Excel

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 Dim Som As For = Getal = InputBox ( Som = Next Gemiddelde = Msgbox De som van de getallen is & Het gemiddelde bedraagt & End Sub & vbNewLine & _ + To ) , Getal As , Gemiddelde As

Vul zelf het structogram in

-- Rekenen --

Programmeren met Excel

39

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 Dim Som As Dim Aantal As Aantal = InputBox (" For = Getal = InputBox ( Som = Next Gemiddelde = Msgbox De som van de getallen is & Het gemiddelde bedraagt & End Sub & vbCrLf & _ + To ) ") , Getal as , Gemiddelde as

40

Programmeren met Excel

Vul zelf het structogram in

-- Rekenen2 --

Maak een knop op het werkblad Blad1 die je verbindt met de procedure Rekenen2. Test het programma uit en sla het bestand op onder dezelfde naam Begrensde herhaling.xlsm.

6.2.4 Tellen

Je vraagt aan de gebruiker hoeveel gehele getallen hij wil invoeren. Terwijl je aan de gebruiker vraagt deze getallen in te voeren wordt het aantal positieve (0 inbegrepen) en het aantal strikt negatieve getallen bijgehouden. In de cellen C1 en C2 wordt de tekst Aantal positief en Aantal negatief automatisch ingevoerd. De breedte van de kolom C wordt aangepast aan de inhoud. In de cellen D1 en D2 worden de resultaten getoond. Je zult voor het oplossen van deze oefening eerst een macro opnemen om de tekst in de cellen C1 en C2 in te voeren en de kolombreedte aan te passen aan de inhoud.

Neem de macro TekstEnBreedte op. Wis de tekst in de cellen C1 en C2 en verander de kolombreedte. Test de macro. Wis nogmaals de tekst en herstel de kolombreedte.

Je hebt heel wat variabelen nodig: Aantal voor het aantal getallen dat de gebruiker wil invoeren, Teller voor de lus, Getal voor het geheel getal dat de gebruiker telkens invoert,
Programmeren met Excel 41

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 Dim Getal As Dim Negatief As Aantal = InputBox For Getal = InputBox If Negatief = Negatief + 1 Else End If Next Teller Then = To , Teller As , Positief As

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

42

Programmeren met Excel

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 Rows( Next End Sub = To Step

). Interior.ColorIndex = 19

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

Programmeren met Excel

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 Dim Teller As Getal = InputBox Faculteit = 1 For = , Faculteit As Double

Als je dit weglaat start Faculteit met de waarde 0


To

44

Programmeren met Excel

Faculteit = Next MsgBox End Sub

Vul het structogram in

-- FaculteitBerekenen --

Maak een knop op het werkblad Blad1 die je verbindt met de procedure Faculteit. Test het programma uit en sla het bestand op onder dezelfde naam Begrensde herhaling.xlsm

Vergelijk je werkblad Blad1 met de volgende schermafdruk.

Programmeren met Excel

45

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. Wanneer Wordt minstesten? tens 1 maal uitgevoerd Do opdrachten Loop While voorwaarde Do While voorwaarde opdrachten Loop Do opdrachten Loop Until voorwaarde Do Until voorwaarde opdrachten Loop Opmerkingen:
Je kunt de voorwaarde controleren voor het uitvoeren van de lusacties of na het

Syntax

Betekenis

Voert de opdrachten uit zolang aan de voorwaarde voldaan is Zolang aan de voorwaarde voldaan

Einde

Ja

is moeten de opdrachten uitgevoerd Begin worden. Voert de opdrachten uit totdat aan de voorwaarde voldaan is Totdat aan de voorwaarde voldaan is moeten de opdrachten uitgevoerd Begin worden.

Neen

Einde

Ja

Neen

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

46

Programmeren met Excel

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
7.1.1

Oefeningen op voorwaardelijke herhaling


Wachtwoord

Je vraagt aan de gebruiker met om het juiste wachtwoord in te vullen. De lus wordt herhaald tot de gebruiker olva heeft ingetypt. Je kunt de 4 mogelijkheden van de voorwaardelijke herhaling gebruiken:

Programmeren met Excel

47

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.

48

Programmeren met Excel

Voeg eerst een module in en voer de code van de procedure Wachtwoord in:
Sub Wachtwoord() Dim Woord As String Do Woord = InputBox("Vul het juiste wachtwoord in") Loop Until Woord = "olva" End Sub

Je kunt in de code Loop Until Woord = olva vervangen door


Loop While Woord <> olva

Maak een knop op het werkblad Blad1 die je verbindt met de procedure Wachtwoord. Sla eerst het bestand op en test het programma uit.

7.1.2

InvoerDatum

Je vraagt de gebruiker om nieuwe invoer, zolang geen datum wordt ingevoerd. De naam van de functie om te onderzoeken of een variabele een datum is IsDate.

Een mogelijke structuur voor de procedure InvoerDatum is:


Sub InvoerDatum() Dim Datum Do Datum = InputBox Loop Until IsDate(Datum) End Sub

De lus wordt herhaald tot de invoer als datum herkend wordt.


Maak een knop op het werkblad Blad1 die je verbindt met de procedure InvoerDatum.. Sla eerst het bestand op en test het programma uit.

Programmeren met Excel

49

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.

50

Programmeren met Excel

Voorbeelden: 28 Mod 5 = 3 67 Mod 12 = 7 66 Mod 6 = 0 Betekenis: de rest bij deling van 28 door 5 is 3 Betekenis: de rest bij deling van 67 door 12 is 7 Betekenis: 66 is deelbaar door 6 of de rest bij deling door 6 is 0

Je moet opnieuw een samengestelde voorwaarde formuleren: het getal dat de gebruiker invoer moet deelbaar zijn door 6 en het moet groter zijn dan 50 en het moet kleiner zijn dan 80. In code: Getal Mod 6 = 0 And Getal > 50 And Getal < 80.

Een mogelijke structuur voor de procedure Zesvoud is:


Sub Zesvoud() Dim Getal as Integer Do

Loop Until End Sub

Maak een knop op het werkblad Blad1 die je verbindt met de procedure Zesvoud. Sla het bestand op en test het programma uit.

7.1.5

StopDrievoud

Vul als voorbereiding van deze oefening de cellen A1 tot A12 van het werkblad Blad1 met willekeurige getallen. Schrijf een procedure waarbij alle cellen van de actieve kolom vanaf de actieve cel, n voor n geselecteerd worden. Op het ogenblik dat de celwaarde een drievoud is of als de cel leeg is stopt de procedure. Je hebt in 6.1 De begrensde herhaling een macro opgenomen om de celcursor 1 cel lager te plaatsen. Je kunt dit hier opnieuw doen. Let er wel op dat je kiest voor Relatieve verwijzing en dat je achteraf de Absolute verwijzing terug activeert. Je kunt anderszijds de code gebruiken om de cursor 1 cel lager te plaatsen en die bestaat uit slechts 1 regel. Code: ActiveCell.Offset(1,0).Select Om te onderzoeken of een cel leeg is, kijk je de waarde van de actieve cel (ActiveCell.Value) een lege string is (). De waarde van een cel is een drievoud als de rest bij deling door 3 gelijk is aan 0 (ActiveCell.Value Mod 3 = 0).

Programmeren met Excel

51

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.

52

Programmeren met Excel

Vul het structogram in van de procedure KleineGetallen.

-- KleineGetallen --

Vergelijk je werkblad Blad1 met de volgende schermafdruk.

Programmeren met Excel

53

8 8.1

Getal raden 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.

54

Programmeren met Excel

Een mogelijke structuur van de code is: Dim AantalGetallen as Dim Bovengrens as , Benedengrens as

Function GENEREERGETAL(Benedengrens, Bovengrens) Randomize AantalGetallen = Bovengrens - Benedengrens + 1 GENEREERGETAL = Int(Rnd * AantalGetallen + Benedengrens) End Function

Test deze functie in je werkblad. Zie hiervoor hoofdstuk 4 Een zelfgemaakte functie gebruiken in je werkblad.

Nu kun je beginnen met de eigenlijke procedure GetalRaden. Het structogram van de procedure ziet er als volgt uit:

-- GetalRaden-Genereer een willekeurig getal Laat getal raden Controleer getal Je hebt nog 2 variabelen nodig: TeRadenGetal voor het willekeurig getal en Getal voor het getal dat de gebruiker invoert.

Vul bovenaan je module de declaratie van de variabelen aan: Dim Getal as , TeRadenGetal as

Vul de code van de procedure GetalRaden aan en typ dan de code in. Sub GetalRaden() TeRadenGetal = GENEREERGETAL ( Getal = Inputbox ControleerGetal End Sub , )

Als je deze procedure test, krijg je een foutmelding omdat de computer ControleerGetal niet herkent. Je kunt deze code tijdelijk uitschakelen door er een aanhalingsteken voor te plaatsen. VBA beschouwt deze zin dan als commentaar. Bij het testen zie je dat er gevraagd
Programmeren met Excel 55

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 Bericht = Juist. NIET WAAR 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.

56

Programmeren met Excel

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 s tart van het programma en wordt gelijk aan Ja als het getal geraden wordt.

Programmeren met Excel

57

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 Bericht = Juist. Bericht = Bericht & Het te raden getal was & TeRadenGetal NogEens = MsgBox (Bericht , vbYesNo) NogEens = vbYes MsgBox Bericht Geraden = Ja WAAR Laat getal raden NIET WAAR Meld wat het te raden getal was

NIET WAAR Bericht = Verkeerd.

Bericht = Bericht & Wil je nog eens proberen?

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

58

Programmeren met Excel

Vul de code van de procedures GetalRaden, Controle en ControleerGetal aan en typ dan de code in.
Sub GetalRaden() Geraden = "Nee" Getal = TeRadenGetal = Controle End Sub

Sub Controle() Do

Loop Until Geraden = "Ja" Or NogEens = vbNo End Sub

Sub ControleerGetal() If Getal = TeRadenGetal Then Bericht = Bericht = MsgBox Geraden = Ja Else Bericht = Bericht = NogEens = If NogEens = vbYes Then Getal = InputBox Else Bericht = "Het te raden getal was " & TeRadenGetal MsgBox Bericht End If End If

Programmeren met Excel

59

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 Bericht = Juist. Bericht = Bericht & Het te raden getal was & TeRadenGetal NogEens = MsgBox (Bericht , vbYesNo) Bericht = Bericht & Wil je nog eens proberen? NIET WAAR Bericht = Verkeerd.

MsgBox Bericht 60
Programmeren met Excel

MsgBox Bericht Geraden = Ja WAAR

NogEens = vbYes NIET WAAR Bericht = "Het te raden getal was " & TeRadenGetal
WAAR NIET WAAR

TeRadenGetal > Getal

Bericht= Hoger

Bericht= Lager MsgBox Bericht

Msgbox Bericht Getal = InputBox("Raad een getal vanaf 1 tot en met 10")

Maak een nieuw Excel document GetalRaden3 aan. De geschreven code uit GetalRaden2 kan je hergebruiken.
Sub ControleerGetal() If Getal = TeRadenGetal Then Bericht = Bericht = MsgBox Geraden = Else Bericht = Bericht = NogEens = If NogEens = vbYes Then If TeRadenGetal > Getal Then Bericht = "Het te raden getal is groter dan " & Getal Else Bericht = End If MsgBox Bericht

Programmeren met Excel

61

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.

62

Programmeren met Excel

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.


AantalGetallen As Integer Bovengrens As Integer, Benedengrens As Integer Getal As Integer, TeRadenGetal As Integer Bericht As String, NogEens As Byte Geraden as string,AantalPogingen As Integer

Dim Dim Dim Dim Dim

Function GENEREERGETAL(Benedengrens, Bovengrens) Randomize AantalGetallen = Bovengrens - Benedengrens + 1 GENEREERGETAL = Int(Rnd * AantalGetallen + Benedengrens) End Function Sub GetalRaden() AantalPogingen = 0 Geraden = Nee Getal = InputBox("Raad een getal vanaf 1 tot en met 10") TeRadenGetal = GENEREERGETAL(1, 10) Controleer End Sub Sub Controle() Do ControleerGetal Loop Until Geraden = "Ja" Or NogEens = vbNo End Sub Sub ControleerGetal() AantalPogingen = AantalPogingen + 1 If Getal = TeRadenGetal Then Bericht = "Juist. " Bericht = Bericht & "Het te raden getal was " & TeRadenGetal Bericht = Bericht & vbCrLf & "Geraden na " & AantalPogingen & " pogingen." MsgBox Bericht

Programmeren met Excel

63

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)

64

Programmeren met Excel

De argumenten van dit invoervenster zijn achtereenvolgens: de tekst die getoond wordt, de titel van het venster en tenslotte de standaardwaarde. Een standaardwaarde is een getal die getoond wordt en die gebruikt wordt als de gebruiker niets invult. Vervolgens vraag je aan de gebruiker tot welk getal hij wil raden. De code is: Bovengrens = InputBox ("Tot welk getal wil je raden? ", "Bepalen bovengrens", 10) De code in de procedure GetalRaden om de gebruiker een getal te laten raden wordt: Getal = InputBox("Raad een getal vanaf " & Benedengrens & " tot en met " & Bovengrens, "Poging 1") De code in de procedure ControleerGetal om de gebruiker een getal te laten raden wordt: Getal = InputBox("Raad een getal vanaf " & Benedengrens & _ " tot en met " & Bovengrens, "Poging " & Aantal pogingen)

Maak een nieuw Excel document GetalRaden5 aan. De geschreven code uit GetalRaden4 kan je hergebruiken. Vul de code van de procedures GetalRaden en ControleerGetal aan en typ dan de code in. Het nieuwe deel is in het vet getypt. De procedure Controleer is onveranderd.

Sub GetalRaden() AantalPogingen = 0 Geraden = "Nee" Benedengrens = InputBox

Bovengrens = InputBox

Getal = InputBox

TeRadenGetal = GENEREERGETAL(Benedengrens, Bovengrens) Controleer End Sub

Sub ControleerGetal() AantalPogingen = AantalPogingen + 1 If Getal = TeRadenGetal Then Bericht = "Juist. " Bericht = Bericht & "Het te raden getal was " & TeRadenGetal Bericht = Bericht & vbCrLf & "Geraden na " & AantalPogingen & " pogingen." MsgBox Bericht Geraden = "Ja"
Programmeren met Excel 65

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.

66

Programmeren met Excel

Als je wilt weten waar de fout juist gebeurd is klik je op Foutopsporing.

Er verschijnt links van de code een geel pijltje en de code waarin de fout gebeurd is, krijgt als achtergrondkleur geel.

Klik op de knop Beginwaarden om het programma te stoppen.

Als je op de knop Annuleren klikt krijgt de variabele Benedengrens als waarde een lege tekst, terwijl in de declaratie Benedengrens gekend is als Integer of als geheel getal. Je kunt die fout voorkomen door Benedengrens nog niet als geheel getal te declareren maar het type nog open te laten (men noemt dit ook het Varianttype). Dit kan gebeuren met de code Dim Benedengrens zonder meer. Een ander manier is de formulering: Dim Benedengrens as Variant. Verder moet het invoervenster getoond worden tot de gebruiker iets heeft ingevuld. Dit kan met de controlestructuur de voorwaardelijke herhaling. De code hiervoor is: Do Benedengrens = InputBox("Vanaf welk getal wil je raden? ", _ "Bepalen benedengrens", 1) Loop Until Benedengrens <> "" Je moet ook de variabelen Bovengrens en Getal declareren als Variant en het invoervenster van de Bovengrens en het Getal blijven vragen tot de gebruiker iets heeft ingevuld. Als je het programma een 2de maal runt, blijven de geheugenvariabelen Benedengrens, Bovengrens en Getal hun waarde behouden. Het is beter deze variabelen leeg te maken. Men noemt dit initialiseren van de variabelen. Dit gebeurt bovenaan de procedure GetalRaden met de code: Benedengrens = , Bovengrens = , Getal =

Maak een nieuw Excel document GetalRaden6 aan. De geschreven code uit GetalRaden5 kan je hergebruiken.

Programmeren met Excel

67

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

68

Programmeren met Excel

Sub Controle() Do ControleerGetal Loop Until Geraden = "Ja" Or NogEens = vbNo End Sub Sub ControleerGetal() AantalPogingen = AantalPogingen + 1 If Getal = TeRadenGetal Then Bericht = "Juist. " Bericht = Bericht & "Het te raden getal was " & TeRadenGetal Bericht = Bericht & vbNewLine & "Geraden na " & _ AantalPogingen & " pogingen." MsgBox Bericht Geraden = "Ja" Else Bericht = "Verkeerd. " Bericht = Bericht & "Wil je nog eens proberen?" NogEens = MsgBox(Bericht, vbYesNo) If NogEens = vbYes Then If TeRadenGetal > Getal Then Bericht = "Het te raden getal is groter dan " & Getal Else Bericht = "Het te raden getal is kleiner dan " & Getal End If MsgBox Bericht Getal = InputBox("Raad een getal vanaf " & Benedengrens & _ " tot en met " & Bovengrens, "Poging " & AantalPogingen) Else Bericht = "Het te raden getal was " & TeRadenGetal Bericht = Bericht & vbNewLine & "Niet geraden na " & _ AantalPogingen & " pogingen." MsgBox Bericht End If End If End Sub

Test het programma uit en sla het bestand op onder de naam GetalRaden6. Voorzie eveneens een knop op het werkblad.

Programmeren met Excel

69

9 9.1

Zelf dialoogvensters maken 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 Bijschrift Tekstvak Gebruikt Om tekst te tonen, die de gebruiker niet kan bewerken 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.

70

Programmeren met Excel

Verander de naam van het dialoogvenster in frmVerbruik

In de titelbalk van het dialoogvenster zie je UserForm1. Je kunt dit opschrift veranderen. De naam in de titelbalk is de eigenschap Caption.

Verander de eigenschap Caption van UserForm1 in Berekening van het verbruik

Je kunt de grootte van het dialoogvenster veranderen door de formaatgrepen te gebruiken

Je zult nu besturingselementen (ook controls genoemd) op het lege dialoogvenster (een andere naam is formulier) plaatsen. Om een besturingselement op een formulier te plaatsen moet de Werkset Besturingselementen zichtbaar zijn. Normaal wordt deze werkset zichtbaar als je op het formulier klik. Als je de werkset onopzettelijk gesloten hebt, kun je hem terug zichtbaar maken door in het menu Beeld te kiezen voor Werkset Als je een besturingselement wilt toevoegen aan een formulier klik je op de Werkset de corresponderende knop aan en klik je vervolgens in het dialoogvenster. Het besturingselement verschijnt in de standaardvorm. Als je meerdere gelijke besturingselementen wilt toevoegen dubbelklik je op de Werkset op de corresponderende knop en klik je daarna in het dialoogvenster voor elk besturingselement dat je wilt maken. Om te eindigen klik je nogmaals op datzelfde besturingselement op de Werkset.

Programmeren met Excel

71

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

72

Programmeren met Excel

Verander de eigenschap Caption van het bijschrift van Label1 in Aantal kilometer

Doe hetzelfde voor de bijschriften Label2 t.e.m. Label6. Verwijder de tekst van de eigenschap Caption van de Label7 8 en 9. De tekst van deze bijschriften zal tijdens het programma ingevuld worden. Vergelijk met onderstaande schermafdruk.

Plaats 3 tekstvakken op het dialoogvenster.


Dubbelklik op het besturingselement Tekstvak op de Werkset Klik driemaal in het dialoogvenster, klik tenslotte terug op de knop Tekstvak. op de Werkset en vergelijk met het volgende resultaat.

Programmeren met Excel

73

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:

Schakelen naar de code

Schakelen naar het formulier

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.

74

Programmeren met Excel

Dubbelklik op de OK-knop van het dialoogvenster. Je komt automatisch in het codevenster. Je kunt hier de procedure schrijven van de gebeurtenis Click van de opdrachtknop cmdOK. Anders gezegd: wat moet er gebeuren als de gebruiker klikt op de knop OK.

Vul de code aan: Unload frmVerbruik

We voegen een module in om het programma te laten starten.

Kies in het menu Invoegen voor Module.

Hier moet je een procedure schrijven om het dialoogvenster te tonen. De naam van de procedure is vrij te kiezen bijvoorbeeld StartVerbruik. De code om het formulier Verbruik te tonen is frmVerbruik.Show

Vul de code in van de procedure: Sub StartVerbruik () frmVerbruik.Show End Sub

Test de code door het programma te starten terwijl je cursor in de code staat van de procedure StartVerbruik met de functietoets F5. Het dialoogvenster wordt getoond en je kunt het dialoogvenster afsluiten door op OK te klikken. Als dit niet lukt moet je eerst je fouten verbeteren.

Keer terug naar het formulier door in de projectverkenner te dubbelklikken op frmVerbruik

Nu moet je nog de code schrijven, die hoort bij de opdrachtknop Berekenen. Je moet de getallen die de gebruiker in de 3 tekstvakken toewijzen aan een variabele of een geheugenvakje. Het getal dat ingetypt is in het tekstvak txtAantalKm is de eigenschap Value van het tekstvak. Je wijst dat getal toe aan de variabele AantalKm met de volgende code: AantalKm = txtAantalKm.Value. Op dezelfde manier kun je de getallen in de tekstvakken txtBedrag en txtPrijsPerLiter toewijzen aan de variabelen Bedrag en PrijsPerLiter met de code: Bedrag= txtBedrag.Value en PrijsPerLiter = txtPrijsPerLiter. Je hebt nog 3 variabelen nodig: nl AantalLiter, Verbruik en PrijsPerKm. Je hebt dus in totaal 6 variabelen die je declareert als Single (het kunnen decimale getallen zijn). Verder moet je nog de berekeningen uitvoeren:

Programmeren met Excel

75

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 Dim PrijsPerLiter As Dim Verbruik As AantalKm = Bedrag = PrijsPerLiter = AantalLiter = Verbruik = PrijsPerKm = lblGetalHoeveelheid.Caption = lblGetalVerbruik.Caption = lblGetalPrijs.Caption = End Sub , Bedrag As , AantalLiter As , PrijsPerKm As

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.

76

Programmeren met Excel

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 Dim PrijsPerLiter As Dim Verbruik As If txtAantalKm.Text = txtPrijsPerLiter = MsgBox lblGetalHoeveelheid.Caption = "" lblGetalVerbruik.Caption = lblGetalPrijs.Caption = Else AantalKm = , Bedrag As , AantalLiter As , PrijsPerKm As Or txtBedrag.Text = Then Or _

Programmeren met Excel

77

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

78

Programmeren met Excel

willekeurige kleur, bij stijl een willekeurige dikte en tenslotte voor Omtrek. Klik op OK. Klik op de knop Opname stoppen.

Dubbelklik op Module2 om de code van de macro te bekijken. Je mag de eerste 2 lijnen verwijderen: Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone

Achtereenvolgens worden de eigenschappen van de randen links, boven, onder en rechts ingesteld. De lijnstijl (xlContinuous) verander je niet. De mogelijkheden van de dikte van de lijn zijn: xlThin (fijn), xlMedium (normaal) of xlThick (dik). Bij de eigenschap colorindex (kleurindex) kun je een getal invullen van 0 tot 56. Als je alle mogelijkheden wilt bekijken moet je het bestand Kleuren.xls openen. We zullen de kleuren rood (colorindex = 3), groen (4), blauw (5) en geel(6) gebruiken.

Maak een knop op het werkblad Blad1 die je verbindt met de macro RandKleuren. Test het programma uit en sla het op onder dezelfde naam Dialoogvenster.xlsm.

9.2.2 Het dialoogvenster RandKleuren

Kies UserForm in het menu Invoegen van de Visual Basic-editor. De naam van het dialoogvenster (eigenschap Name) is frmRandKleuren Het bijschrift (eigenschap Caption) is De kleur en de dikte van de rand bepalen.

We zullen op dit formulier gebruik maken van 2 bijschriften (Labels), 2 opdrachtknoppen (Commandbuttons) en 2 keuzelijsten met invoervak (Comboboxen).

Voeg deze 6 besturingselementen toe aan het dialoogvenster zoals op de volgende schermafdruk.

Programmeren met Excel

79

Pas de eigenschappen van de besturingselementen aan: Bijschrift1: Bijschrift2: Name: lblKleur Caption: Welke kleur wens je? Name: lblDikte Caption: Welke dikte wens je? Name: cboKleur Name: cboDikte Name: cmdStoppen Caption: Stoppen Opdrachtknop2 Name: cmdToepassen Caption: Toepassen

Keuzelijst 1 met invoervak: Keuzelijst 2 met invoervak: Opdrachtknop1

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

80

Programmeren met Excel

Zoek in het eigenschappenvenster de eigenschap Rowsource en vul daar de gegevensbron in: Gegevens!A1:A4. Een volledige celverwijziging bestaat uit de naam van het werkblad (hier Gegevens), gevolgd door een uitroepingsteken met erachter het celbereik.

Vul in de Rowsource van de keuzelijst met invoervak van cboDikte de juiste gegevensbron in namelijk Gegevens!A1:A4

Als je wilt dat er bij het opstarten een kleur wordt getoond dat moet je die kleur invullen in de eigenschap Value van cboKleur.

Als je wilt dat er bij het opstarten een randdikte wordt getoond dat moet je die randdikte invullen in de eigenschap Value van cboDikte

Het ontwerp van het formulier is af. Nu volgt de code. We beginnen met de code van de opdrachtknop cmdStoppen.

Dubbelklik op de Stoppen-knop van het dialoogvenster frmRandKleuren. Je komt automatisch in het codevenster. Vul de code aan:

Unload frmRandKleuren

Nu moet de code geschreven worden van de opdrachtknop cmdToepassen. Je kunt gebruik maken van de code die gegenereerd is door de macro RandKleuren.

Dubbelklik in het projectvenster op Module2. Je ziet de code van de macro RandKleuren. Selecteer de code en kopieer ze. Dubbelklik eerst op frmRandKleuren en vervolgens op de commandoknop cmdToepassen van dit dialoogvenster. Je komt automatisch in het codevenster. Plak hier de code van de macro.

Dit zijn de eerste regels van de gekopieerde code: de constanten xlMedium en colorindex 32 kunnen bij jou verschillen.

Programmeren met Excel

81

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

82

Programmeren met Excel

With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = .ColorIndex = End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = .ColorIndex = End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = .ColorIndex = End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = .ColorIndex = End With ActiveCell.Offset(1, 0).Select End Sub

De code ActiveCell.Offset(1,0).Select selecteert de cel onder de huidige geselecteerde cel om het resultaat beter te kunnen zien.

In module1 schrijf je een procedure Sub StartRandKleuren met 1 regel code nl. frmRandKleuren.Show om het programma te laten starten. Maak een knop op het werkblad Blad1 die je verbindt met de procedure StartRandKleuren. Test het programma uit en sla het programma op onder dezelfde naam Dialoogvenster.xlsm.

Programmeren met Excel

83

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 zon 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 beindigen.

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 quotint van " & Getal1 & " en " & Getal2 _ & " is " & Resultaat End Sub

84

Programmeren met Excel

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 2 de getal nul intypt. Het is niet fraai als de uitvoering van een programma onderbroken wordt door een foutmelding en als het programma wordt stopgezet. We zullen dat voorkomen door foutopvang.

10.2.2 Foutopvang1 De eerste stap is het inschakelen van foutopvang met de volgende code: On Error Goto regellabel Als de foutopvang actief is en een fout optreedt, geeft VBA niet het gewone foutbericht maar wordt de uitvoering doorgegeven aan de regel die is opgegeven via regellabel Pas dit toe op de procedure Delen.

Open zonodig het bestand Foutopvang.xls en de Visual Basic-editor Kopieer de procedure Delen , verander de naam in Foutopvang1 en vul de code aan die vet gedrukt staat: Sub Foutopvang1() On Error GoTo Foutopvang 'Betekenis: als er een fout optreedt, ga naar het label Foutopvang: Dim Getal1 As Integer, Getal2 As Integer, Resultaat As Single Getal1 = InputBox("Geef een geheel getal")

Programmeren met Excel

85

Getal2 = InputBox("Geef een tweede geheel getal") Resultaat = Getal1 / Getal2 MsgBox "Het quotint 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 beindigd." & 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")

86

Programmeren met Excel

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 quotint van " & Getal1 & " en " & Getal2 _ & " is " & Resultaat Exit Sub

'de procedure wordt beindigd 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 2 de getal 0 hebt ingevoerd, wordt het programma hervat bij de invoer van het 2de getal. 10.2.4 Foutopvang3 Foutopvang2 is efficint 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 beindigd wordt, of het programma hervat wordt waar de fout gebeurd is of het programma verder gezet wordt zonder rekening te houden met de foutmelding. Je vangt de keuze van de gebruiker op in een variabele, die bijv. Antwoord wordt genoemd en die gedeclareerd kan worden als Integer. De code die hiervoor gebruikt wordt is: Antwoord = MsgBox("Fout: " & Err.Number & " " & Err.Description, vbAbortRetryIgnore) Uitleg: het bericht dat getoond wordt, bestaat uit de tekst Fout: gevolgd door Err.Number (dit is het number van de fout) en Err.Description (dit is de beschrijving van de fout).

Programmeren met Excel

87

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

88

Programmeren met Excel

Als je nu te grote getallen invoert, krijg je het berichtvenster met als boodschap: Fout 6: Overloop. Voer je tekst in dan zie je de boodschap: Fout 13: Typen komen niet overeen en als je als 2de getal 0 hebt ingevoerd, verschijnt er: Fout 11: Delen door nul. Probeer telkens de 3 knoppen.

Programmeren met Excel

89

11

Enkele programmas

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 2 de vraag getoond enz. Ondertussen wordt de score bijgehouden op een rekenblad. Na het beantwoorden van de 5 vragen ziet de speler zijn totaalscore op het rekenblad.

Open een nieuwe werkmap en de Visual Basic-editor. Bewaar de werkmap onder de naam Quiz.xlsm Kies UserForm in het menu Invoegen van de Visual Basic-editor. De naam van het dialoogvenster (eigenschap Name) is frmVraag1 Het bijschrift (eigenschap Caption) is Vraag 1.

Gebruik op het dialoogvenster een bijschrift om de vraag te formuleren, een groepsvak (een frame) om de 4 mogelijke antwoorden te groeperen. De antwoorden kunnen gekozen worden met een keuzerondje. Je plaatst binnen het groepsvak 4 keuzerondjes. Je gebruikt een groepsvak om de keuzerondjes afhankelijk van mekaar te maken: je kunt er slechts n van activeren. Zorg ervoor dat het groepsvak geselecteerd is op het moment dat je de keuzerondjes op het dialoogvenster plaatst. Je hebt een opdrachtknop nodig om de volgende vraag te tonen.

Plaats het bijschrift, het groepsvak met de keuzerondjes en de opdrachtknop op het dialoogvenster. Vergelijk met de volgende schermafdruk.

Pas de eigenschappen van de besturingselementen aan: Bijschrift: Name: lblVraag1


Programmeren met Excel

90

Caption: Welke sport vormt samen met langlaufen de "Noorse combinatie"? Groepsvak: Keuzerondje1:

Name: fraAntwoord Caption: Name: optAntwoord1 Caption: Reuzenslalom Name: optAntwoord2 Caption: Schansspringen Name: optAntwoord3 Caption: Schieten Name: optAntwoord4 Caption: Kunstschaatsen Name: cmdOK Caption: Naar volgende vraag [We verwijderen Frame1]

Keuzerondje2: Keuzerondje3: Keuzerondje4: Opdrachtknop:

Vergelijk met de volgende schermafdruk.

Je moet in het rekenblad de score bijhouden.

Schakel via de taakbalk over naar het rekenblad. Typ in de cellen A1: Score, A2: Vraag 1, A3: Vraag 2, A4: Vraag 3, A5: Vraag 4, A6: Vraag 5, A7: Totaal. Je plaatst in de cel B7 een formule die de som berekent van de waarden in het celbereik B2:B6. Zorg voor opmaak van het werkblad: maak gebruik van lettertype, rand en arcering.

Schakel terug over via de taakbalk naar VBA. Dubbelklik op de opdrachtknop cmdOK. Je komt in het codevenster.

Programmeren met Excel

91

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.

92

Programmeren met Excel

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 Jol Smets Het laatste antwoord is het juiste antwoord.

Pas de eigenschappen aan van het bijschrift en van de keuzerondjes aan. Pas ook de code van de commandoknop cmdOK_click aan.

Importeer opnieuw frmVraag en verander de eigenschap Name in frmVraag4

Vraag 4: Welk dier is terug te vinden op het logo van het automerk Ferrari? Mogelijke antwoorden: paard luipaard adelaar haai Het eerste antwoord is het juiste antwoord.

Pas de eigenschappen aan van het bijschrift en van de keuzerondjes aan. Pas ook de code van de commandoknop cmdOK_click aan.

Importeer opnieuw frmVraag en verander de eigenschap Name in frmVraag5

Vraag 5: Welk meer hoort niet bij de Great Lakes, die tussen de VS en Canada liggen? Mogelijke antwoorden: Michiganmeer Eriemeer Victoriameer Huronmeer Het derde antwoord is het juiste antwoord.

Programmeren met Excel

93

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

94

Programmeren met Excel

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. Zon rij gegevens noemt men een record. Je kunt deze gegevens heel eenvoudig sorteren en filteren.

Selecteer 1 cel uit de gegevenslijst. Kies Sorteren in het menu Gegevens. Geef bij Sorteren op de eerste sleutel aan: in de keuzelijst vind je de veldnamen (Nr, Naam,) van de lijst. Kies voor Richting. Je mag de volgorde van A naar Z behouden. De leerlingen worden per richting getoond: EC-MT, EC-WI enz. Wil je de oorspronkelijke volgorde terug, dan kan je laten sorteren met als 1ste sleutel Klas en als 2de sleutel Nr.

Met Filter wordt het mogelijk specifieke records in een gegevenslijst op te sporen.

Plaats de cursor in de gegevenslijst. Kies Filter in het menu Gegevens. Iedere veldnaam wordt een keuzelijst.

In de keuzelijst kan je voor ieder veld apart aangeven welke waarde dit veld moet bevatten. Kies bij Richting voor EC-WI en bij Geslacht voor M. Schakel de filter uit door terug op Filter te klikken.

11.2.2 Het programma Gegevens opzoeken

Probleemstelling: De computer toont een dialoogvenster, waarop de gebruiker een nr,naam of voornaam kan intikken, kan kiezen voor een klas of richting en geslacht. Als de gebruiker de opdracht laat uitvoeren worden de gegevens automatisch gefilterd en vervolgens naar een nieuw werkblad gekopieerd.

Programmeren met Excel

95

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. Beindig 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, Selection.AutoFilter Field:=5, Selection.AutoFilter Field:=6, Selection.AutoFilter Field:=1, Selection.AutoFilter Field:=2, Selection.AutoFilter Field:=3, Range("A1").Select Selection.CurrentRegion.Select Selection.Copy

Criteria1:="4e" Criteria1:="EC-MT" Criteria1:="J" Criteria1:="5" Criteria1:="DE DECKER" Criteria1:="Ben"

96

Programmeren met Excel

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.

Bijschrift

Tekstvak Keuzelijst met

Keuzerondje Groepsvak

invoervak Opdrachtknop

Pas de eigenschappen van de besturingselementen aan: UserForm: Bijschrift1: Bijschrift2: Bijschrift3: Bijschrift4: Bijschrift5: Tekstvak1: Tekstvak2: Tekstvak3: Keuzelijst1: Name:frmGegevens Name: lblNummer Name: lblNaam Name: lblVoornaam Name: lblKlas Name: lblRichting Name: txtNummer Name: txtNaam Name: txtVoornaam Name: cboKlas Text: Onbekend Caption: Gegevens opzoeken Caption: Nummer Caption: Naam Caption: Voornaam Caption: Klas Caption: Richting

Programmeren met Excel

97

Keuzelijst2: Groepsvak: Keuzerondje1: Keuzerondje2: Keuzerondje3:

Name: cboRichting Name: fraGeslacht Name: optJongen Name: optMeisje Name: optOnbekend

Text: Onbekend Caption: Geslacht Caption: Jongen Caption: Meisje Caption: Onbekend Caption: Opzoeken Caption: Einde Value:True

Opdrachtknop1: Name: cmdOpzoeken Opdrachtknop1: Name: cmdEinde

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

98

Programmeren met Excel

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 Dim Voornaam As Dim Richting As Dim Bladnaam As String , Naam As , Klas As , Geslacht As

'Als je het werkblad 4des niet actief is krijg je een foutmelding


Sheets("4des").Select Range("A1").Select Selection.AutoFilter Nr = Val(txtNummer.Value) Naam = txtNaam.Value Voornaam = Klas = cboKlas.Value Richting = If optJongen.Value = True Then Geslacht = "J" ElseIf Je hebt Val nodig om de tekst om te zetten naar een getal

Else Geslacht = "Onbekend"

Programmeren met Excel

99

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

100

Programmeren met Excel

Selection.CurrentRegion.Select Selection.Copy Sheets.Add ActiveSheet.Paste Selection.Columns.AutoFit Range("A1").Select 'De regel die volgt wordt bijgevoegd om later dit werkblad te selecteren Bladnaam = ActiveSheet.Name Sheets("4des").Select Application.CutCopyMode = False Selection.AutoFilter Range("A1").Select 'Het bijgevoegde werkblad wordt geselecteerd Sheets(Bladnaam).Select End Sub

Maak een knop op het werkblad 4des, die je verbindt met de procedure GegevensOpzoeken.

Test het programma uit. Verwijder de bijgevoegde werkbladen. Sla het bestand onder dezelfde naam Klaslijsten.xlsm.

Programmeren met Excel

101

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

om het programma te beindigen en de fout te

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.

102

Programmeren met Excel

Het programma wordt onderbroken bij het woord Stop. Wijs met de muiscursor naar de variabelen Straal, Omtrek en Oppervlakte. Telkens wordt de waarde van de variabele getoond.

Klik op Doorgaan en plaats het aanhalingsteken terug voor het woordje stop in de code van de procedure OmtrekOpp.

Je kunt het programma onderbreken door onderbrekingspunten te plaatsen. Klik in de grijze balk aan de linkerkant van het codevenster naast Omtrek = OMTRCIRKEL(Straal). Plaats nog een onderbrekingspunt bij Range("a1").CurrentRegion.Select

Voer het programma opnieuw uit en voer een willekeurig getal in als straal. Het programma wordt onderbroken bij het 1ste onderbrekingspunt. Wijs de variabele straal aan: de ingevulde waarde wordt getoond. Wijs de variabelen Omtrek en Oppervlakte aan: de waarden zijn nog 0, omdat de omtrek en de oppervlakte nog niet berekend zijn.

Klik op Doorgaan: het programma stopt bij het 2de onderbrekingspunt. Als je nu wijst naar de variabelen Omtrek en Oppervlakte worden de berekende waarden getoond.

Klik op Beginwaarden. Neem de onderbrekingspunten weg door opnieuw op dezelfde plaatsen in linkerbalk van het codevenster te klikken.

Programmeren met Excel

103

13

Enkele programmas

Het is nu de bedoeling de programmas 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

104

Programmeren met Excel

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:

Programmeren met Excel

105

You might also like