3. De basisprincipes van het programmeren VBSCRIPT
Nadat we de mogelijke uitvoeringscontexten voor een VBScript-script hebben beschreven, gaan we nu in op de taal zelf. In het vervolg gaan we uit van de volgende omstandigheden:
- de container van het script is WSH
- het script is opgeslagen in een bestand met de extensie .vbs
Om een concept te introduceren, gaan we doorgaans als volgt te werk:
- we introduceren het concept indien nodig
- we presenteren een illustratief programma met de bijbehorende resultaten
- we geven indien nodig uitleg bij de resultaten en het programma
VBScript-containers zijn niet hoofdlettergevoelig in de tekst van het script. Het maakt dus niet uit of je wscript.echo "hallo" of WSCRIPT.ECHO "hallo" schrijft.
De programma’s die hierna worden gepresenteerd, voeren veel weergavebewerkingen op het scherm uit; daarom zullen we de weergavemethoden van het wscript-object nogmaals toelichten.
3.1. Informatie weergeven
We hebben de methode echo van het object wscript al gebruikt, maar dit object beschikt over nog andere methoden om op het scherm te schrijven, zoals het volgende script laat zien:
Programma | Resultaten |
![]() |
Let op de volgende punten:
- Alle tekst die na een apostrof staat, wordt beschouwd als een opmerking in het script en wordt niet geïnterpreteerd door WSH (regel 1).
- De methode echo schrijft haar argumenten en gaat naar de volgende regel, net als de methode writeLine (regels 2 en 6)
- de methode write schrijft zijn argumenten en gaat niet door naar de volgende regel (regel 3)
- Een regeleinde wordt weergegeven door de reeks van twee codetekens ASCII 13 en 10. Regel 4 wordt dus weergegeven door de uitdrukking chr(13) & chr(10), waarbij chr(i) het codetekens ASCII i is en & de operator voor het samenvoegen van tekenreeksen. Zo is "chat" & "eau" de tekenreeks "chateau".
- Het einde-van-regel-teken kan eenvoudiger worden weergegeven door de constante vbCRLF (regel 5)
3.2. E e schrijfwijze van instructies in een VBScript-script
Standaard wordt één instructie per regel geschreven. Het is echter mogelijk om meerdere instructies per regel te schrijven door ze te scheiden met het teken :, zoals in inst1:inst2:inst3. Als een regel te lang is, kun je deze in stukken opsplitsen. De verschillende delen van de instructie moeten dan worden afgesloten met de twee tekens (spatie)_. We nemen het vorige voorbeeld opnieuw en herschrijven de instructies op een andere manier:
Programma | Resultaten |
![]() |
3.3. Schrijven met de functie msgBox
Hoewel we in dit document vrijwel uitsluitend het object wscript gebruiken om op het scherm te schrijven, bestaat er een meer geavanceerde functie om informatie in een venster weer te geven. Dit is de functie msgbox, die doorgaans met drie parameters wordt gebruikt:
msgbox bericht, pictogrammen+knoppen, titel
- message is de tekst van het weer te geven bericht
- iconen+knoppen (optioneel) is in feite een getal dat aangeeft welk type icoon en welke knoppen in het berichtvenster moeten worden geplaatst. Dit getal is meestal de som van twee getallen: het eerste bepaalt het icoon, het tweede de knoppen
- titel is de tekst die in de titelbalk van het berichtvenster moet worden geplaatst
De waarden die moeten worden gebruikt om het pictogram en de knoppen van het weergavevenster te specificeren, zijn de volgende:
Constante | Waarde | Beschrijving |
vbOKOnly | 0 | Geeft alleen de knop OK weer. |
vbOKCancel | 1 | Geeft de knoppen OK en Annuleren weer. |
vbAbortRetryIgnore | 2 | Geeft de knoppen 'Afbreken', 'Opnieuw proberen' en 'Negeren' weer. |
vbYesNoCancel | 3 | Geeft de knoppen 'Ja', 'Nee' en 'Annuleren' weer. |
vbYesNo | 4 | Geeft de knoppen Ja en Nee weer. |
vbRetryCancel | 5 | Geeft de knoppen 'Opnieuw proberen' en 'Annuleren' weer. |
vbCritical | 16 | Geeft het pictogram 'Kritiek bericht' weer. |
vbQuestion | 32 | Geeft het pictogram 'Waarschuwingsverzoek' weer. |
vbExclamation | 48 | Geeft het pictogram 'Waarschuwingsbericht' weer. |
vbInformation | 64 | Geeft het pictogram 'Informatiebericht' weer. |
vbDefaultButton1 | 0 | De eerste knop is de standaardknop. |
vbDefaultButton2 | 256 | De tweede knop is de standaardknop. |
vbDefaultButton3 | 512 | De derde knop is de standaardknop. |
vbDefaultButton4 | 768 | De vierde knop is de standaardknop. |
vbApplicationModal | 0 | Modale toepassing; de gebruiker moet op het bericht reageren voordat hij verder kan werken in de huidige toepassing. |
vbSystemModal | 4096 | Modaal systeem; alle applicaties worden onderbroken totdat de gebruiker op het bericht reageert. |
Hier volgen enkele voorbeelden:
Programma | ||||||||||||||||||
![]() | ||||||||||||||||||
Resultaten | ||||||||||||||||||
| ||||||||||||||||||
In sommige gevallen wordt er een informatievenster weergegeven dat tevens een invoervenster is. Als er een vraag wordt gesteld, willen we bijvoorbeeld weten of de gebruiker op de knop oui of op de knop non heeft geklikt. De functie msgBox levert een resultaat op dat we in het vorige programma niet hebben gebruikt. Dit resultaat is een geheel getal dat de knop aangeeft die de gebruiker heeft gebruikt om het weergavevenster te sluiten:
Constante | Waarde | Gekozen knop |
vbOK | 1 | OK |
vbCancel | 2 | Annuleren |
vbAbort | 3 | Afbreken |
vbRetry | 4 | Opnieuw proberen |
vbIgnore | 5 | Negen |
vbYes | 6 | Ja |
vbNo | 7 | Nee |
Het volgende programma laat zien hoe het resultaat van de functie msgBox wordt gebruikt. Er wordt vier keer een venster weergegeven met de knoppen Ja, Nee en Annuleren. Men reageert als volgt:
- klik op ‘Ja’
- klik op 'Nee'
- klik op 'Annuleren'
- sluit je het venster zonder een knop te gebruiken. Het programma laat zien dat dit hetzelfde is als het gebruik van de knop 'Annuleren'.
Programma | ||||
![]() | ||||
Resultaten | ||||
|
3.4. De -gegevens die bruikbaar zijn in VBScript
VBscript kent slechts één gegevenstype: de variant. De waarde van een variant kan een getal zijn (4, 10,2), een tekenreeks ("hallo"), een booleaanse waarde (true/false), een datum (#01/01/2002#), het adres van een object of een verzameling van al deze gegevens in een structuur die een array wordt genoemd.
Laten we het volgende programma en de resultaten ervan eens bekijken:
Programma | Resultaten |
![]() |
Opmerkingen:
- In een aantal programmeertalen (C, C++, Pascal, Java, C#, ...) moet een variabele eerst worden gedeclareerd voordat deze kan worden gebruikt. Bij deze declaratie worden de naam van de variabele en het gegevenstype dat deze kan bevatten (geheel getal, reëel getal, tekenreeks, datum, booleaanse waarde, ...) opgegeven. Het declareren van variabelen biedt verschillende voordelen:
- inzicht krijgen in de benodigde geheugenruimte voor de variabele, aangezien verschillende gegevenstypen verschillende hoeveelheden geheugenruimte vereisen
- de consistentie van het programma te controleren. Als i bijvoorbeeld een geheel getal is en c een tekenreeks, dan heeft het vermenigvuldigen van i met c geen zin. Als het type van de variabelen i en c door de programmeur is gedeclareerd, kan het programma dat het programma vóór de uitvoering analyseert, een dergelijke inconsistentie signaleren.
Net als de meeste scripttalen met één gegevenstype (Perl, Python, JavaScript, ...) staat VBScript toe dat variabelen niet worden gedeclareerd. Dit is wat in het bovenstaande voorbeeld is gedaan.
- Let op de syntaxis van verschillende getallen
- 10,2 op regel 10 (decimaalteken in plaats van een komma). Merk op dat bij de weergave 10,2 wordt weergegeven.
- 1.4e-2 op regel 13 (wetenschappelijke notatie). Op het scherm wordt het getal 0,014 weergegeven
- [#01/10/2002#] (regel 26) om de datum 10 januari 2002 weer te geven. Vbscript gebruikt dus de notatie #mm/dd/jjjj# om de datum jj van de maand mm van het jaar aaaa weer te geven
- de booleaanse waarden true en false (waar/onwaar) in de regels 31 en 34. Deze twee waarden worden respectievelijk weergegeven door de gehele getallen -1 en 0, zoals te zien is in de weergave van de regels 32 en 35. Wanneer een booleaanse waarde wordt samengevoegd met een tekenreeks, worden deze waarden respectievelijk de tekenreeksen "Vrai" en "Faux", zoals te zien is in de regels 33 en 36. Terloops zij opgemerkt dat de samenvoegoperator & ook kan worden gebruikt om andere zaken dan tekenreeksen samen te voegen.
- Aangezien een variabele v geen toegewezen type heeft, kan deze in de loop van de tijd achtereenvolgens waarden van verschillende typen bevatten.
3.5. L' s sous-types du type variant
Dit is wat de officiële documentatie zegt over de verschillende gegevenstypen die een variant kan bevatten:
Naast het eenvoudige onderscheid tussen getallen en tekenreeksen kan een Variant verschillende soorten numerieke informatie onderscheiden. Bepaalde numerieke gegevens vertegenwoordigen bijvoorbeeld een datum of een tijdstip. Wanneer deze gegevens worden gebruikt in combinatie met andere datum- of tijdgegevens, wordt het resultaat altijd weergegeven in de vorm van een datum of een tijdstip. Er zijn ook andere soorten numerieke informatie beschikbaar, variërend van booleaanse waarden tot grote getallen met drijvende komma. Deze verschillende categorieën informatie die in een Variant kunnen worden opgenomen, zijn subtypen. In de meeste gevallen plaatst u uw gegevens gewoon in een Variant en deze gedraagt zich op de meest geschikte manier op basis van deze gegevens.
De volgende tabel geeft een overzicht van verschillende subtypen die in een Variant kunnen voorkomen.
Subtype | Beschrijving |
Empty | De Variant is niet geïnitialiseerd. De waarde is gelijk aan nul voor numerieke variabelen en aan een tekenreeks met lengte nul ("") voor tekenreeksvariabelen. |
Null | De Variant bevat opzettelijk onjuiste gegevens. |
Boolean | |
Byte | Bevat een geheel getal van 0 tot 255. |
Integer | Bevat een geheel getal van -32 768 tot 32 767. |
Currency | -922 337 203 685 477,5808 tot 922 337 203 685 477,5807. |
Long | Bevat een geheel getal van -2 147 483 648 tot 2 147 483 647. |
Single | Bevat een getal met drijvende komma met enkele precisie van -3,402823E38 tot -1,401298E-45 voor negatieve waarden; van 1,401298E-45 tot 3,402823E38 voor positieve waarden. |
Dubbel | Bevat een drijvende-kommagetal met dubbele precisie van -1,79769313486232E308 tot -4,94065645841247E-324 voor negatieve waarden; van 4,94065645841247E-324 tot 1,79769313486232E308 voor positieve waarden. |
Datum (Tijd) | Bevat een getal dat een datum weergeeft tussen 1 januari 100 en 31 december 9999. |
Tekst | Bevat een tekenreeks van variabele lengte, beperkt tot ongeveer 2 miljard tekens. |
Object | Bevat een object. |
Fout | Bevat een foutnummer. |
3.6. C et het exacte type van de gegevens in een variant achterhalen
Een variabele van het type ‘variant’ kan gegevens van verschillende typen bevatten. Soms moeten we de exacte aard van deze gegevens kennen. Als we in een programma produit=nombre1*nombre2 schrijven, gaan we ervan uit dat nombre1 en nombre2 twee numerieke waarden zijn. Soms zijn we daar niet zeker van, omdat deze waarden afkomstig kunnen zijn van invoer via het toetsenbord, uit een bestand of uit een willekeurige externe bron. We moeten dan de aard van de gegevens in nombre1 en nombre2 controleren. Met de functie typename(var) kunnen we achterhalen welk gegevenstype de variabele var bevat. Hier volgen enkele voorbeelden:
Programma | Resultaten |
![]() |
Een andere mogelijke functie is vartype(var), die een getal retourneert dat het type weergeeft van de gegevens die de variabele var bevat:
Constante | Waarde | Beschrijving |
vbEmpty | 0 | Leeg (niet geïnitialiseerd) |
vbNull | 1 | Null (geen geldige gegevens) |
vbInteger | 2 | Geheel getal |
vbLong | 3 | Lang geheel getal |
vbSingle | 4 | Getal met drijvende komma (enkele precisie) |
vbDouble | 5 | Getal met dubbele precisie in drijvende-kommavorm |
vbCurrency | 6 | Valuta |
vbDate | 7 | Datum |
vbString | 8 | Kanaal |
vbObject | 9 | Object Automatisering |
vbError | 10 | Fout |
vbBoolean | 11 | Booleaanse waarde |
vbVariant | 12 | Variant (alleen gebruikt bij Variant-arrays) |
vbDataObject | 13 | Niet-Automation-object |
vbByte | 17 | Byte |
vbArray | 8192 | Tabel |
Opmerking: Deze constanten worden gespecificeerd door VBScript. Daardoor kunnen de namen overal in uw code worden gebruikt in plaats van de werkelijke waarden.
De bovenstaande informatie is afkomstig uit de documentatie van VBscript. Deze is soms onjuist, waarschijnlijk als gevolg van kopiëren en plakken uit de documentatie van VB. De functie vartype van VBScript doet slechts een deel van wat hierboven wordt beschreven.
Het vorige programma, herschreven voor vartype, levert de volgende resultaten op:
Programma | Resultaten |
![]() |
3.7. D e variabelen die door het script worden gebruikt, declareren
We hebben aangegeven dat het niet verplicht is om de variabelen die door het script worden gebruikt te declareren. Als we in dit geval het volgende schrijven:
1) somme=4
...
2) somme=smme+10
met een typefout smme in plaats van ‘somme’ in instructie 2, zal VBScript geen fout melden. Het gaat ervan uit dat smme een nieuwe variabele is. Het maakt deze aan en gebruikt deze in de context van instructie 2 door deze op 0 te initialiseren.
Dit soort fouten kan erg moeilijk op te sporen zijn. Daarom is het raadzaam om de declaratie van variabelen af te dwingen met de richtlijn option explicit aan het begin van het script. Vervolgens moet elke variabele vóór het eerste gebruik worden gedeclareerd met een dim-instructie:
option explicit
...
dim somme
1) somme=4
...
2) somme=smme+10
In dit voorbeeld zal VBScript aangeven dat er een niet-gedeclareerde variabele is, net als in 2), zoals te zien is in het volgende voorbeeld:
Programma | Resultaten |
![]() |
Hoewel in de korte voorbeelden in dit document de variabelen meestal niet worden gedeclareerd, zullen we hun declaratie afdwingen zodra we de eerste betekenisvolle scripts gaan schrijven. De richtlijn Option explicit zal dan systematisch worden gebruikt.
3.8. De conversiefuncties van de ** **
VBScript zet de gegevens van de varianten om in tekenreeksen, getallen, booleaanse waarden, ... afhankelijk van de context. Meestal werkt dit goed, maar soms levert het voor verrassingen op, zoals we later zullen zien. Het kan dan wenselijk zijn om het gegevenstype van de variant te ‘forceren’. VBscript beschikt over conversiefuncties die een uitdrukking omzetten in verschillende gegevenstypen. Hier volgen er enkele:
Cint (uitdrukking) | zet de uitdrukking om in een klein geheel getal (integer) |
Clng (uitdrukking) | zet uitdrukking om in een lang geheel getal (long) |
Cdbl (uitdrukking) | zet de uitdrukking om in een dubbele reële waarde (double) |
Csng (uitdrukking) | zet de uitdrukking om in een single-getal (single) |
Ccur (uitdrukking) | zet uitdrukking om in een valutawaarde (currency) |
Hier volgen enkele voorbeelden:
3.9. eert gegevens die via het toetsenbord zijn ingevoerd
Met het wscript-object kan een script gegevens ophalen die via het toetsenbord zijn ingevoerd. Met de methode wscript.stdin.readLine kan een tekstregel worden gelezen die via het toetsenbord is ingevoerd en met de "Enter"-toets is bevestigd. Deze gelezen regel kan aan een variabele worden toegewezen.
Programma | Resultaten |
![]() | |
Opmerkingen:
- In de kolom met de resultaten en in de rij [Tapez votre nom : st] is st de rij die door de gebruiker is ingevoerd.
Als de via het toetsenbord ingevoerde tekst een getal is, wordt deze toch in de eerste plaats als een tekenreeks beschouwd, zoals het onderstaande voorbeeld laat zien:
Programma | Resultaten |
![]() |
Als dit getal in een rekenkundige bewerking wordt gebruikt, zal VBscript de tekenreeks automatisch naar een getal omzetten, maar dat gebeurt niet altijd. Laten we het volgende voorbeeld eens bekijken:
Programma | Resultaten |
![]() |
Uit de resultaten blijkt dat regel 8 van het script niet is verlopen zoals verwacht. Dit komt doordat (helaas) de operator + in VBScript twee betekenissen heeft: het optellen van twee getallen of het samenvoegen van twee tekenreeksen (de twee tekenreeksen worden aan elkaar geplakt). We hebben eerder gezien dat de getypte getallen als tekenreeksen werden geïnterpreteerd en dat VBScript deze indien nodig omzette in getallen. Dit gebeurde correct voor de bewerkingen -, *, /, die alleen getallen kunnen bevatten, maar niet voor de operator +, die ook tekenreeksen kan bevatten. Het programma ging er hier vanuit dat we tekstreeksen wilden samenvoegen.
Een eenvoudige oplossing voor dit probleem is om de tekenreeksen direct bij het inlezen om te zetten in getallen, zoals blijkt uit de volgende verbetering van het vorige programma:
Programma | Resultaten |
![]() |
3.10. S egevens invoeren met de functie inputbox
Soms wil men gegevens invoeren via een grafische interface in plaats van via het toetsenbord. In dat geval gebruikt men de functie inputBox. Deze functie ondersteunt talrijke parameters, waarvan slechts de eerste twee vaak worden gebruikt:
reponse=inputBox(message,title)
- bericht: de vraag die u aan de gebruiker stelt
- titel (optioneel): de titel die u aan het invoervenster geeft
- antwoord: de tekst die de gebruiker heeft ingevoerd. Als de gebruiker het venster heeft gesloten zonder te antwoorden, is 'antwoord' de lege tekenreeks.
Hier volgt een voorbeeld waarin de naam en de leeftijd van een persoon worden gevraagd. Voor de naam voeren we gegevens in en kiezen we OK. Voor de leeftijd voeren we eveneens gegevens in, maar kiezen we Annuleren.
Programma | ||||
![]() | ||||
Resultaten | ||||
|
3.11. U gestructureerde objecten gebruiken
Met VBScript is het mogelijk om objecten te maken met methoden en eigenschappen. Om het niet te ingewikkeld te maken, zullen we hier een object presenteren met eigenschappen en zonder methoden. Laten we eens kijken naar een persoon. Deze persoon heeft talrijke eigenschappen die hem of haar kenmerken: lengte, gewicht, huidskleur, oogkleur, haarkleur, ... We zullen er slechts twee onthouden: zijn of haar naam en leeftijd. Voordat we objecten kunnen gebruiken, moeten we eerst de mal maken waarmee we ze kunnen aanmaken. In VBScript gebeurt dit met een klasse. De klasse personne zou als volgt gedefinieerd kunnen worden:
class personne
Dim nom,age
End class
Het is de instructie [Dim nom,age] die de twee eigenschappen van de klasse personne definieert. Om exemplaren (ook wel instanties genoemd) van de klasse personne aan te maken, schrijf je:
Waarom schrijven we dan niet
Omdat een variant geen object kan bevatten. Het kan alleen het adres ervan bevatten. Door set persoon1=new persoon te schrijven, vindt de volgende reeks gebeurtenissen plaats:
- er wordt een object personne aangemaakt. Dit betekent dat er geheugen aan wordt toegewezen.
- het adres van dit object personne wordt toegewezen aan de variabele personne1
We hebben dan het volgende geheugenschema voor de variabelen personne1 en personne2:
![]() |
In de volksmond zou men kunnen zeggen dat personne1 een object personne is. We kunnen deze figuurlijke uitdrukking accepteren als we bedenken dat personne1 in feite het adres is van een object personne en niet het object personne zelf.
We hebben gezegd dat een object personne twee eigenschappen had: nom en age. Hoe kunnen we deze eigenschappen benutten? Door de notatie objet.propriété te gebruiken, zoals hierboven al is uitgelegd. Zo
personne1.nom de naam van persoon 1 en personne1.age zijn leeftijd. Hier volgt een kort programma ter illustratie:
Programma | Resultaten |
![]() |
Het vorige programma zou als volgt kunnen worden aangepast:
Programma | Resultaten |
![]() |
We hebben hier de structuur *with ... end with gebruikt, waarmee objectnamen in uitdrukkingen kunnen worden 'uitgesplitst'. De structuur *with p1 ... end with in de regels 9-12 en 15-18 maakt het vervolgens mogelijk om de syntaxis .nom te gebruiken in plaats van p1.nom en .age in plaats van p1.age. Dit maakt het mogelijk om instructies te vereenvoudigen waarin dezelfde objectnaam herhaaldelijk wordt gebruikt.
3.12. Een waarde toewijzen aan een variabele
Er zijn twee instructies om een waarde aan een variabele toe te wijzen:
- variabele=uitdrukking
- set variabele=uitdrukking
Vorm 2 is voorbehouden aan uitdrukkingen waarvan het resultaat een objectreferentie is. Voor alle andere soorten uitdrukkingen is vorm 1 geschikt. Het verschil tussen de twee vormen is als volgt:
- in de instructie variable=expression krijgt de variabele een waarde toegewezen. Als v1 en v2 twee variabelen zijn, wordt door v1=v2 te schrijven de waarde van v1 aan v2 toegewezen. Er vindt dus een duplicatie van een waarde op twee verschillende plaatsen plaats. Als de waarde van v2 vervolgens wordt gewijzigd, blijft de waarde van v1 ongewijzigd.
![]() |
- In de instructie `set variable=expression` krijgt de variabele het adres van een object als waarde. Als v1 en v2 twee variabelen zijn en v2 het adres is van een object obj2, dan wijst `set v1=v2` de waarde van v1 toe aan v2, dus het adres van het object obj2. Wanneer het script vervolgens v1 en v2 bewerkt, worden niet de „waarden” van v1 en v2 bewerkt, maar wel de objecten waarnaar v1 en v2 „verwijzen”, dus in dit geval hetzelfde object. Men zegt dat v1 en v2 twee verwijzingen zijn naar hetzelfde object en dat het geen verschil maakt of men dit object via v1 of v2 bewerkt. Met andere woorden: het wijzigen van het object waarnaar v2 verwijst, wijzigt ook het object waarnaar v1 verwijst.
![]() |
Hier is een voorbeeld:
Programma | Resultaten |
![]() |
3.13. E xpressies evalueren
De belangrijkste operatoren voor het evalueren van uitdrukkingen zijn de volgende:
Type operatoren | Operatoren | Voorbeeld |
Rekenkundig | +,-,*,/ | |
mod | ||
\ | ||
^ | ||
Vergelijking | <,<= >, >= =,<> | a<>b is waar als a verschilt van b a=b is waar als a gelijk is aan b a en b kunnen beide getallen zijn of beide tekenreeksen. In het laatste geval geldt tekenreeks1<tekenreeks2 als tekenreeks1 in alfabetische volgorde vóór tekenreeks2 komt. Bij het vergelijken van tekenreeksen komen hoofdletters in alfabetische volgorde vóór kleine letters. |
is | ||
Logica | and, or, not, xor | De operanden zijn hier allemaal booleaanse waarden. bool1 or bool2 is waar als bool1 of bool2 waar is bool1 and bool2 is waar als zowel bool1 als bool2 waar zijn not bool1 is waar als bool1 onwaar is en omgekeerd bool1 xor bool2 is waar als slechts één van de booleaanse waarden bool1 of bool2 waar is |
Aaneenschakeling | &, + | Het wordt afgeraden om de operator + te gebruiken om twee tekenreeksen samen te voegen, vanwege de mogelijke verwarring met het optellen van twee getallen. Gebruik daarom uitsluitend de operator &. |
3.14. C e uitvoering van het programma controleren
3.14.1. E : acties voorwaardelijk uitvoeren
De VBScript-instructie waarmee acties kunnen worden uitgevoerd op basis van de waar/onwaar-waarde van een voorwaarde is de volgende:
| De uitdrukking expression wordt eerst geëvalueerd. Deze uitdrukking moet een booleaanse waarde hebben. Als de waarde waar is, worden de acties van then uitgevoerd; anders zijn het die van else, indien aanwezig. |
Hieronder volgt een programma met verschillende varianten van de if-then-else:
Programma | Resultaten |
![]() |
Opmerkingen:
- In VBScript kun je instructie1:instructie2:... : instructien schrijven in plaats van één instructie per regel. Deze mogelijkheid is bijvoorbeeld in regel 10 benut.
3.14.2. E en herhaaldelijk acties uit te voeren
Lus met een bekend aantal herhalingen |
Men kan op elk moment uit een for-lus stappen met de instructie exit for. |
Lus met onbekend aantal herhalingen |
Men kan op elk moment uit een do-while-lus stappen met de instructie exit do. |
Het onderstaande programma illustreert deze punten:
Programma |
![]() |
Resultaten |
Opmerking: Tijdens de ontwikkelingsfase van een programma komt het vaak voor dat een programma in een "lus" terechtkomt, c.a.d, en nooit stopt. Meestal voert het programma een lus uit waarvan de uitstapvoorwaarde niet kan worden gecontroleerd, zoals bijvoorbeeld in het volgende voorbeeld:
' oneindige lus
i=0
Do While 1=1
i=i+1
wscript.echo i
Loop
' nog een van hetzelfde soort
i=0
Do While true
i=i+1
wscript.echo i
Loop
Als we het vorige programma uitvoeren, zal de eerste lus nooit vanzelf stoppen. We kunnen het stoppen forceren door CTRL-C op het toetsenbord in te voeren (houd de toetsen CTRL en C tegelijkertijd ingedrukt).
3.14.3. De uitvoering van het programma beëindigen
De instructie wscript.quit n beëindigt de uitvoering van het programma en retourneert daarbij een foutcode gelijk aan n. Onder DOS kan deze foutcode worden getest met de instructie if ERRORLEVEL n, die waar is als de foutcode die door het laatst uitgevoerde programma is geretourneerd >=n is. Laten we het volgende programma en de resultaten ervan bekijken:
![]() |
Direct na het uitvoeren van het programma worden de volgende drie DOS-opdrachten gegeven:
Het commando DOS 1 controleert of de door het programma geretourneerde foutcode >=5 is. Zo ja, dan wordt 5 weergegeven (echo), zo niet, dan gebeurt er niets.
Het commando DOS 3 controleert of de door het programma geretourneerde foutcode >=4 is. Zo ja, dan wordt 4 weergegeven; zo niet, dan gebeurt er niets.
Het commando DOS 5 controleert of de door het programma geretourneerde foutcode >=3 is. Zo ja, dan wordt 3 weergegeven; zo niet, dan gebeurt er niets.
Uit de weergegeven resultaten kan worden afgeleid dat de door het programma geretourneerde foutcode 4 was.
3.15. e gegevenslijsten in een variant
Een variant T kan een lijst met waarden bevatten. We zeggen dan dat het een array is. Een array T heeft verschillende eigenschappen:
- Men krijgt toegang tot het element i van de array T via de syntaxis T(i), waarbij i een geheel getal is dat ‘index’ wordt genoemd en tussen 0 en n-1 ligt, als T n elementen heeft.
- De index van het laatste element van de array T kan worden bepaald met de uitdrukking ubound(T). Het aantal elementen van de array T is dan ubound(T)+1. Dit getal wordt vaak de grootte van de array genoemd.
- Een variabele T kan worden geïnitialiseerd met een lege array via de syntaxis T=array() of met een reeks elementen via de syntaxis T=array(element0, element1, ...., elementn)
- Er kunnen elementen worden toegevoegd aan een reeds aangemaakte array T. Hiervoor wordt de instructie redim preserve T(N) gebruikt, waarbij N de nieuwe index is van het laatste element van de array T. Deze bewerking wordt een herdimensionering (redim) genoemd. Het sleutelwoord preserve geeft aan dat bij deze herdimensionering de huidige inhoud van de array behouden moet blijven. Zonder dit sleutelwoord wordt T herdimensionerd en worden de elementen verwijderd.
- Een element T(i) van de array T is van het type variant en kan dus elke waarde bevatten, en in het bijzonder een array. In dat geval verwijst de notatie T(i)(j) naar het j-de element van de array T(i).
Deze verschillende eigenschappen van arrays worden geïllustreerd door het volgende programma:
Programma | Resultaten |
![]() |
Opmerkingen
- Hier is gebruikgemaakt van een functie genaamd 'join', die verderop nader wordt toegelicht.
3.16. n arrayvariabelen
In VBScript bestaat er nog een andere manier om een array te gebruiken, namelijk door gebruik te maken van een arrayvariabele. In tegenstelling tot scalaire variabelen moet een dergelijke variabele verplicht worden gedeclareerd met een dim-instructie. Er zijn verschillende declaraties mogelijk:
- dim array(n) declareert een statische array van n+1 elementen, genummerd van 0 tot n. Dit type array kan niet worden aangepast
- dim array() declareert een lege dynamische array. Deze moet worden aangepast om te kunnen worden gebruikt met de redim-instructie, op dezelfde manier als bij een variant die een array bevat
- dim array(n,m) declareert een tweedimensionale array met (n+1)*(m+1) elementen. Het element (i,j) van de array wordt aangeduid als tableau(i,j). Let op het verschil met een variant, waar hetzelfde element zou zijn aangeduid als tableau(i)(j).
Waarom zijn er twee soorten arrays die uiteindelijk zo op elkaar lijken? De documentatie van VBScript gaat hier niet op in en geeft evenmin aan of de ene beter presteert dan de andere. In onze voorbeelden zullen we voortaan vrijwel uitsluitend de array in een variant gebruiken. We moeten echter niet vergeten dat VBscript afkomstig is uit de taal Visual Basic, die zelf getypeerde gegevens bevat (integer, double, boolean, ...). Als we in dit geval bijvoorbeeld een array met reële getallen moeten gebruiken, zal de variabele ‘array’ beter presteren dan de variantvariabele. We declareren dan bijvoorbeeld *dim tableau(1000) as double* om een array van reële getallen te declareren, of gewoon dim tableau() as double als de array dynamisch is.
Hier volgt een voorbeeld dat het gebruik van array-variabelen illustreert:
Programma | Resultaten |
![]() |
3.17. e functies split en join
Met de functies split en join kun je van een tekenreeks naar een array gaan en vice versa:
- Als T een array is en car een tekenreeks, dan is join(T,car) een tekenreeks die wordt gevormd door alle elementen van de array T samen te voegen, waarbij elk element van het volgende wordt gescheiden door de tekenreeks car. Zo levert join(array(1,2,3),"abcd") de tekenreeks "1abcd2abcd3" op
- Als C een tekenreeks is die bestaat uit een reeks velden gescheiden door de tekenreeks car, dan is de functie split(C,car) een array waarvan de elementen de verschillende delen van de tekenreeks C zijn. Zo levert split("1abcd2abcd3", "abcd") de array (1,2,3) op
Hier volgt een voorbeeld:
Programma | Resultaten |
|
3.18. De tabellen
Men heeft toegang tot een element van een array T wanneer men het nummer i ervan kent. Het is dan toegankelijk via de notatie T(i). Er bestaan arrays waarvan de elementen niet via een nummer, maar via een tekenreeks worden benaderd. Het typische voorbeeld van dit type array is het woordenboek. Wanneer men de betekenis van een woord opzoekt in de „Larousse“ of „Le petit Robert“, krijgt men deze te zien via het woord zelf. Men zou dit woordenboek kunnen weergeven met een array met 2 kolommen:
woord1 | beschrijving1 |
woord2 | beschrijving2 |
woord3 | beschrijving3 |
.... |
Dan zou je bijvoorbeeld het volgende kunnen schrijven:
woordenboek("woord1")="beschrijving1"
woordenboek("woord2")="beschrijving2"
...
Dit lijkt sterk op de werking van een array, met dit verschil dat de indices van de array geen gehele getallen zijn, maar tekenreeksen. Dit type array noemen we een woordenboek (of associatieve array, hashtable) en de indices (tekenreeksen) zijn de sleutels van het woordenboek (keys). Het gebruik van woordenboeken komt in de informatica zeer vaak voor. We hebben allemaal een socialezekerheidskaart met daarop een nummer. Dit nummer identificeert ons op unieke wijze en geeft toegang tot de informatie die op ons betrekking heeft. In het model woordenboek("sleutel")="informatie" zou "sleutel" hier het socialezekerheidsnummer zijn en "informatie" alle informatie die over ons is opgeslagen op de computers van de sociale zekerheid.
In Windows is er een ActiveX-object beschikbaar met de naam "Scripting.Dictionary" waarmee woordenboeken kunnen worden aangemaakt en beheerd. Een ActiveX-object is een softwarecomponent die een interface biedt die kan worden gebruikt door programma’s die in verschillende talen zijn geschreven, zolang ze maar voldoen aan de standaard voor het gebruik van ActiveX-objecten. Het Scripting.dictionary-object kan dus worden gebruikt door de programmeertalen van Windows: JavaScript, Perl, Python, C, C++, VB, VBA, ... en niet alleen door VBScript.
1 | Een Scripting.Dictionary-object wordt aangemaakt met de instructie set dico=wscript.CreateObject("Scripting.Dictionary") of simpelweg set dico=CreateObject("Scripting.Dictionary") CreateObject is een methode van het object WScript waarmee instanties van ActiveX-objecten kunnen worden aangemaakt. Versie 2 laat zien dat wscript een impliciet object kan zijn. Wanneer een methode niet aan een object kan worden ‘gekoppeld’, zal de container WSH proberen deze aan het object wscript te koppelen. |
2 | Zodra het woordenboek is aangemaakt, kunnen we er elementen aan toevoegen met de methode add: dico.add "sleutel",waarde maakt een nieuw item aan in het woordenboek dat gekoppeld is aan de sleutel "sleutel". De bijbehorende waarde is een variant met willekeurige gegevens. |
3 | Om de waarde op te halen die aan een bepaalde sleutel is gekoppeld, gebruiken we de methode item van het woordenboek: var=dico.item("sleutel") of set var=dico.item("sleutel") als de waarde die aan de sleutel is gekoppeld een object is. |
4 | Alle sleutels van het woordenboek kunnen met behulp van de methode `keys` in een variabele array worden opgehaald: sleutels = dic.keys sleutels is een array waarvan de elementen kunnen worden doorlopen. |
5 | Alle waarden van het woordenboek kunnen met behulp van de methode `items` in een variabele array worden opgehaald: waarden = dic.items items is een array waarvan de elementen kunnen worden doorlopen. |
6 | Met de methode `exists` kan worden gecontroleerd of een sleutel bestaat: dico.exists("sleutel") is waar als de sleutel "sleutel" in het woordenboek voorkomt |
7 | Je kunt een item (sleutel+waarde) uit het woordenboek verwijderen met de methode remove: dico.remove("sleutel") verwijdert het item uit het woordenboek dat gekoppeld is aan de sleutel "sleutel". dico.removeall verwijdert alle sleutels, c.a.d maakt het woordenboek leeg. |
Het volgende programma maakt gebruik van deze verschillende mogelijkheden:
Programma |
|
Resultaten |
|
3.19. Een array of een dictionary sorteren
Het komt vaak voor dat men een array of een dictionary wil sorteren in oplopende of aflopende volgorde op basis van de waarden of, in het geval van een dictionary, de sleutels. Hoewel de meeste programmeertalen over sorteerfuncties beschikken, lijken deze in VBScript te ontbreken. Dit is een tekortkoming.
3.20. De argumenten van een programma
Het is mogelijk om een VBScript-programma aan te roepen door er parameters aan door te geven, zoals in:
Hierdoor kan de gebruiker informatie doorgeven aan het programma. Hoe haalt het programma deze informatie op? Laten we eens kijken naar het volgende programma:
Programma | Resultaten |
![]() |
Opmerkingen
- WScript.Arguments is de verzameling van argumenten die aan het script zijn doorgegeven
- een C-verzameling is een object dat
- een eigenschap count die het aantal elementen in de verzameling aangeeft
- een methode C(i) die het i-de element van de verzameling retourneert
3.21. Een eerste toepassing: IMPOTS
We willen een programma schrijven waarmee de belasting van een belastingplichtige kan worden berekend. We gaan uit van het vereenvoudigde geval van een belastingplichtige die alleen zijn salaris hoeft aan te geven:
- we berekenen het aantal aandelen van de werknemer nbParts = nbEnfants/2 + 1 als hij ongehuwd is, nbEnfants/2+2 als hij getrouwd is, waarbij nbEnfants het aantal kinderen is.
- vervolgens wordt zijn belastbaar inkomen R = 0,72 * S berekend, waarbij S zijn jaarsalaris is
- vervolgens wordt zijn gezinscoëfficiënt Q = R/N berekend
bereken zijn belasting I op basis van de volgende gegevens
12620,0 | 0 | 0 |
13.190 | 0,05 | 631 |
15640 | 0,1 | 1290,5 |
24.740 | 0,15 | 2072,5 |
31810 | 0,2 | 3309,5 |
39.970 | 0,25 | 4900 |
48360 | 0,3 | 6898,5 |
55790 | 0,35 | 9316,5 |
92970 | 0,4 | 12106 |
127860 | 0,45 | 16754,5 |
151250 | 0,50 | 23147,5 |
172.040 | 0,55 | 30710 |
195.000 | 0,60 | 39312 |
0 | 0,65 | 49.062 |
Elke regel bevat 3 velden. Om belasting I te berekenen, zoeken we de eerste regel waarin QF <= veld1 is. Als bijvoorbeeld QF = 30000 is, vinden we de regel
Belasting I is dan gelijk aan 0,15*R - 2072,5*nbParts. Als QF zodanig is dat de relatie QF<=veld1 nooit geldt, dan worden de coëfficiënten van de laatste regel gebruikt. In dit geval:
wat de belasting I = 0,65 * R - 49062 * nbParts oplevert.
Het programma is als volgt:
Programma | ||
| ||
Resultaten | ||
|
Opmerkingen:
- het programma maakt gebruik van wat eerder is behandeld (variabeledeclaratie, argumenten, typewijzigingen, toetsingen, lussen, array in een variant)
- het controleert de geldigheid van de gegevens niet, wat in een echt programma ongebruikelijk zou zijn
- Alleen de while-lus vormt een probleem. Deze probeert de index i van de array `limites` te bepalen waarvoor `limites(i)>qf` geldt, en wel voor i<ubound(limites) (c.a.d. Hier is i<13), omdat het laatste element van de array `limites` niet van belang is. Het is uitsluitend toegevoegd zodat de test [Do While i<ubound(limites) And qf>limites(i)] kan worden uitgevoerd voor i=13. De test is dan 13<13 en qf>limites(13) en daarom moet (in VBScript) limites(13) bestaan. Bij het verlaten van de while-lus kan met de laatst berekende waarde van i de belasting worden berekend: [impot=int(revenu*coeffr(i)-nbParts*coeffn(i))].









































