Skip to content

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:

  1. de container van het script is WSH
  2. 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
1
2
3
4
un
deuxtrois
quatre
cinq

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
1
2
3
4
un
deuxtrois
quatre
cinq

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:

  1. klik op ‘Ja’
  2. klik op 'Nee'
  3. klik op 'Annuleren'
  4. 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
4
i=4
10,2
r1=10,2
0,014
r2=0,014
c1=bonjour
01/10/02
d1=01/10/02
10/01/02
d2=10/01/02
-1
b1=Vrai
0
b2=Faux
v=4
v=10,2
v=bonjour
v=01/10/02
v=Vrai

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
Bevat True (waar) of False (onwaar).
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
var=1,type=Integer
var=deux,type=String
var=Vrai,type=Boolean
var=4,5,type=Double
var=11/10/01,type=Date

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
var=1,type=2
var=deux,type=8
var=Vrai,type=11
var=4,5,type=5
var=11/10/01,type=7

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
dim1.vbs(9, 1) Erreur d'exécution Microsoft
 VBScript: Variable non définie: 'smme'

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:

Programma
Resultaten
var=4,code type=8,nom type=String
var=4,code type=2,nom type=Integer
var=1000000,code type=8,nom type=String
var=1000000,code type=3,nom type=Long
var=3,4e-5,code type=8,nom type=String
var=0,000034,code type=5,nom type=Double
var=3,4e-5,code type=8,nom type=String
var=0,000034,code type=4,nom type=Single
var=1000,45,code type=8,nom type=String
var=1000,45,code type=6,nom type=Currency
var=14,code type=2,nom type=Integer
var=14,code type=8,nom type=String
var=1000,45,code type=5,nom type=Double
var=1000,code type=2,nom type=Integer
var=1000,75,code type=5,nom type=Double
var=1001,code type=2,nom type=Integer

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

Tapez votre nom : st
Bonjour st

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
Tapez un nombre : 14
nombre lu=14,type=String

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
1
2
3
4
5
6
nombre1 : 3
nombre2 : 4
3+4=34
3-4=-1
3x4=12
3/4=0,75

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
nombre1 : 3
nombre1=3,type=String
nombre1=3,type=Long
nombre2 : 4
nombre2=4,type=String
nombre2=4,type=Long
3+4=7
3-4=-1
3x4=12
3/4=0,75

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:

set personne1=new personne
set personne2=new personne

Waarom schrijven we dan niet

personne1=new personne
personne2=new personne

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:

  1. er wordt een object personne aangemaakt. Dit betekent dat er geheugen aan wordt toegewezen.
  2. 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
p1=(dupont,18)

Het vorige programma zou als volgt kunnen worden aangepast:

Programma
Resultaten
nom=dupont
age=18

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:

  1. variabele=uitdrukking
  2. 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
i=4
j=4
i=4
j=5
p1.nom=dupont
p1.age=18
p1.nom=dupont
p1.age=19
p2.nom=dupont
p2.age=19

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:


if expression then
    action-vrai-1
    action-vrai-2
    ..
else
    action-faux-1
    action-faux-2
    ...
end if
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
1
2
3
4
5
3 est plus grand que 0
3 est plus grand que 2
i=4
4 est plus petit que 10
i=3

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
for i=idébut to ifin step ipas
    actions
next
  1. De variabele i wordt hier een lusvariabele genoemd. Deze kan een willekeurige naam hebben
  2. i krijgt de waarde idebut
  3. de waarde van i wordt vergeleken met ifin. Als i <= ifin, worden de acties tussen de for... next uitgevoerd
  4. i wordt met de waarde ipas verhoogd (i = i + ipas)
  5. we keren terug naar stap 3 hierboven. Na een eindig aantal stappen zal de waarde van i groter zijn dan ifin. De uitvoering van het script gaat verder met de instructie die volgt op de next
  6. als de increment ipas negatief is, wordt de voorwaarde van stap 3 gewijzigd. De acties van for...next worden alleen uitgevoerd als i >= ifin.
Men kan op elk moment uit een for-lus stappen met de instructie exit for.
Lus met onbekend aantal herhalingen
do while condition
    actions
loop
  1. wordt de voorwaarde geëvalueerd. Als deze waar is, worden de acties van while...loop uitgevoerd
  2. De uitgevoerde acties kunnen de waarde van de voorwaarde hebben gewijzigd. We keren terug naar stap 1 hierboven.
  3. wanneer de voorwaarde onwaar wordt, wordt de lus beëindigd
Men kan op elk moment uit een do-while-lus stappen met de instructie exit do.

Het onderstaande programma illustreert deze punten:

Programma
Resultaten
i=0,tableau(i)=10,somme=10
i=1,tableau(i)=20,somme=30
i=2,tableau(i)=30,somme=60
i=3,tableau(i)=40,somme=100
i=0,tableau(i)=10,somme=10
i=1,tableau(i)=20,somme=30
i=2,tableau(i)=30,somme=60
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
i=10
i=11
i=1
i=2
i=3
i=4
i=5
i=6

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:

  
début

Direct na het uitvoeren van het programma worden de volgende drie DOS-opdrachten gegeven:

1
2
3
4
5
6
7
C:\>if ERRORLEVEL 5 echo 5

C:\>if ERRORLEVEL 4 echo 4
4

C: >if ERRORLEVEL 3 echo 3
3

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
Le tableau t1 a 5 éléments
t1(0)=1
t1(1)=-4,5
t1(2)=deux
t1(3)=Vrai
t1(4)=10/01/02
t1=1:-4,5:deux:Vrai:10/01/02
t1(5)=10:20:30
t1(5)(1)=20
t1=1 ~ -4,5 ~ deux
t1=:::

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
Le tableau t1 a 5 éléments
t1(0)=1
t1(1)=-4,5
t1(2)=deux
t1(3)=Vrai
t1(4)=10/01/02
t1=1:-4,5:deux:Vrai:10/01/02
Le tableau t1 a 5 éléments
t2(0)=0
t2(1)(2)=30
t2=:::
t3(0,0)=0
t3(0,1)=1
t3(1,0)=10
t3(1,1)=11

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

' omzetting van array naar tekenreeks en vice versa

' array --> tekenreeks
tableau=array("un",2,"trois")
chaine=join(tableau,",")
wscript.echo chaine

' tekenreeks → array
tableau2=split(chaine,",")
For i=0 To ubound(tableau2)
  wscript.echo tableau2(i)
Next

un,2,trois
un
2
trois

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

' aanmaken en gebruiken van een woordenboek
Set dico=CreateObject("Scripting.Dictionary")

' woordenboek vullen
dico.add "clé1","valeur1"
dico.add "clé2","valeur2"
dico.add "clé3","valeur3"

' aantal elementen
wscript.echo "Le dictionnaire a " & dico.count & " éléments"

' lijst met sleutels
wscript.echo "liste des clés"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo cles(i)
Next

' lijst met waarden
wscript.echo "liste des valeurs"
valeurs=dico.items
For i=0 To ubound(valeurs)
  wscript.echo valeurs(i)
Next

' lijst met sleutels en waarden
wscript.echo "liste des clés et valeurs"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next

' zoeken naar elementen
' sleutel1
If dico.exists("clé1") Then
    wscript.echo "La clé clé1 existe dans le dictionnaire et la valeur associée est " & dico.item("clé1")
  Else
    wscript.echo "La clé clé1  n'existe pas dans le dictionnaire"
  End If
' sleutel4  
If dico.exists("clé4") Then
    wscript.echo "La clé clé4 existe dans le dictionnaire et la valeur associée est " & dico.item("clé4")
  Else
    wscript.echo "La clé clé4  n'existe pas dans le dictionnaire"
  End If

' sleutel 1 verwijderen
dico.remove("clé1")

' lijst met sleutels en waarden
wscript.echo "liste des clés et valeurs après suppression de clé1"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next

' alles verwijderen
dico.removeall

' lijst met sleutels en waarden
wscript.echo "liste des clés et valeurs après suppression de tous les éléments"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next

' einde
wscript.quit 0
Resultaten
Le dictionnaire a 3 éléments
liste des clés
clé1
clé2
clé3
liste des valeurs
valeur1
valeur2
valeur3
liste des clés et valeurs
dico(clé1)=valeur1
dico(clé2)=valeur2
dico(clé3)=valeur3
La clé clé1 existe dans le dictionnaire et la valeur associée est valeur1
La clé clé4  n'existe pas dans le dictionnaire
liste des clés et valeurs après suppression de clé1
dico(clé2)=valeur2
dico(clé3)=valeur3
liste des clés et valeurs après suppression de tous les éléments

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:

cscript prog1.vbs arg1 arg2 .... argn

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
C:\>cscript arg1.vbs a b c

Il y a 3 arguments
a
b
c

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

    24740        0.15        2072.5

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:

    0                0.65        49062

wat de belasting I = 0,65 * R - 49062 * nbParts oplevert.

Het programma is als volgt:

Programma
' berekening van de belasting van een belastingplichtige
' het programma moet worden aangeroepen met drie parameters: gehuwd, kinderen, salaris
' getrouwd: letter O indien getrouwd, N indien ongehuwd
' kinderen: aantal kinderen
' salaris: jaarsalaris zonder centimes

' er wordt geen controle uitgevoerd op de geldigheid van de gegevens, maar
' wordt gecontroleerd of het er inderdaad drie zijn

' verplichte declaratie van variabelen
Option Explicit

' er wordt gecontroleerd of er 3 argumenten zijn
Dim nbArguments
nbArguments=wscript.arguments.count
If nbArguments<>3 Then
    wscript.echo "Syntaxe : pg marié enfants salaire"
    wscript.echo "marié : caractère O si marié, N si non marié"
    wscript.echo "enfants : nombre d'enfants"
    wscript.echo "salaire : salaire annuel sans les centimes"
     ' afbreken met foutcode 1
    wscript.quit 1
End If

' de argumenten worden opgehaald zonder hun geldigheid te controleren
Dim marie, enfants, salaire
If wscript.arguments(0) = "O" Or wscript.arguments(0)="o" Then
    marie=true
Else
    marie=false
End If
' 'kinderen' is een geheel getal
enfants=cint(wscript.arguments(1))
' salaris is een lang geheel getal
salaire=clng(wscript.arguments(2))

' de gegevens die nodig zijn voor de berekening van de belasting worden in 3 tabellen gedefinieerd
Dim limites, coeffn, coeffr
limites=array(12620,13190,15640,24740,31810,39970,48360, _
55790,92970,127860,151250,172040,195000,0)
coeffr=array(0,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45, _
0.5,0.55,0.6,0.65)
coeffn=array(0,631,1290.5,2072.5,3309.5,4900,6898.5,9316.5, _
12106,16754.5,23147.5,30710,39312,49062)

' het aantal aandelen wordt berekend
Dim nbParts
If marie=true Then
    nbParts=(enfants/2)+2
Else
    nbParts=(enfants/2)+1
End If
If enfants>=3 Then nbParts=nbParts+0.5

' we berekenen het gezinsquotiënt en het belastbaar inkomen
Dim revenu, qf
revenu=0.72*salaire
qf=revenu/nbParts

' de belasting wordt berekend
Dim i, impot
i=0
Do While i<ubound(limites) And qf>limites(i)
    i=i+1
Loop
impot=int(revenu*coeffr(i)-nbParts*coeffn(i))

' het resultaat wordt weergegeven
wscript.echo "impôt=" & impot

' het programma wordt zonder fouten afgesloten
wscript.quit 0
Resultaten
C:\>cscript impots1.vbs o 2 200000

impôt=22504

C:\>cscript impots1.vbs o 2 20000

impôt=0

C:\>cscript impots1.vbs o 2 2000000

impôt=746064

C:\>cscript impots1.vbs n 2 200000

impôt=33388

C:\>cscript impots1.vbs n 3 200000

impôt=22504

C:\>cscript impots1.vbs

Syntaxe : pg marié enfants salaire
marié : caractère O si marié, N si non marié
enfants : nombre d'enfants
salaire : salaire annuel sans les centimes

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