Naamconflicten voorkomen

Een naamconflict treedt op als u probeert een aanduiding te maken of te gebruiken die al eerder is gedefinieerd. In sommige gevallen veroorzaken naamconflicten foutmeldingen zoals "Er is een dubbelzinnige naam gevonden" of "Dubbele declaratie in het huidige bereik". Naamconflicten die niet worden ontdekt, kunnen tot programmafouten in de programmacode leiden. Deze programmafouten kunnen onjuiste resultaten opleveren, vooral als u niet expliciet alle variabelen declareert voordat u deze voor het eerst gebruikt.

U kunt de meeste naamconflicten vermijden als u de bereikeigenschappen van aanduidingen voor gegevens, objecten en procedures begrijpt. Visual Basic kent drie niveaus van bereik: het procedureniveau, private (persoonlijke) moduleniveau en public (openbare) moduleniveau.

Een naamconflict kan optreden als een aanduiding:

•	op meer dan één niveau zichtbaar is.

•	twee verschillende betekenissen op hetzelfde niveau heeft.

Procedures in aparte modules kunnen bijvoorbeeld dezelfde naam hebben. U kunt daarom een procedure MySub in de modules Mod1 en Mod2 definiëren. Als iedere procedure alleen vanuit andere procedures in de eigen module wordt opgeroepen, treden geen conflicten op. Een fout kan zich echter voordoen als MySub vanuit een derde module wordt opgeroepen en de twee procedures MySub op geen enkele manier van elkaar te onderscheiden zijn.

U kunt de meeste naamconflicten oplossen door vóór elke aanduiding een bepaling op te nemen die uit een modulenaam en eventueel een projectnaam bestaat. Bijvoorbeeld:

YourProject.YourModule.YourSub MyProject.MyModule.MyVar

De voorafgaande programmacode noemt de procedure Sub nu YourSub en behandelt MyVar als een argument. U kunt elke gewenste combinatie van bepalingen gebruiken om identieke aanduidingen verschillend te maken.

Visual Basic koppelt elke verwijzing aan de aanduiding die een structuur heeft die het ‘dichtst’ bij de structuur van de verwijzing ligt. Als MyID bijvoorbeeld in twee modules in een project (Mod1 en Mod2) tweemaal als Public is gedefinieerd, kunt u binnen Mod2 zonder verdere bepalingen de aanduiding MyID opgeven die u in Mod2 hebt gedefinieerd. In Mod1 moet u deze echter beschrijven als Mod2.MyID. Dit geldt ook als Mod2 zich in een ander project bevindt waar direct naar wordt verwezen. Als Mod2 zich echter in een project bevindt waar indirect naar wordt verwezen (via het project waarnaar u direct verwijst), moeten alle verwijzingen MyID naar de variabele Mod2 van de projectnaam worden voorzien. Als u in een onafhankelijke module, waarnaar direct wordt verwezen, een verwijzing naar MyID opneemt, wordt de verwijzing gekoppeld aan de eerste declaratie die tijdens het zoeken wordt gevonden.

•	Projecten waarnaar direct wordt verwezen, in de volgorde waarin deze in het dialoogvenster Verwijzingen van het menu Extra verschijnen.

•	De modules van elk project. Er is geen inherente volgorde voor de modules in het project.

U kunt namen van objecten in brontoepassingen (bijvoorbeeld R1C1 in Microsoft Excel) niet hergebruiken op andere niveaus.

Tip   Veel voorkomende fouten die door naamconflicten worden veroorzaakt zijn onder andere dubbelzinnige namen, dubbelzinnige declaraties, niet gedeclareerde aanduidingen en procedures die niet worden gevonden. Als u elke module begint met een instructie Option Explicit, zodat uw variabelen vóór gebruik expliciet zijn gedeclareerd, kunt u een aantal potentiële naamconflicten en programmafouten ten gevolge van verkeerde aanduidingen vermijden.


Procedures met dezelfde naam oproepen

U kunt elke procedure die zich in een module binnen hetzelfde project als de actieve module bevindt, dezelfde naam geven als een procedure die zich in de actieve module bevindt. Als twee of meer modules echter een procedure met dezelfde naam bevatten, moet u een modulenaam in de oproepinstructie opgeven. Bijvoorbeeld:

Sub Main()

Module1.MyProcedure

End Sub

Als u aan twee verschillende procedures in twee verschillende projecten dezelfde naam geeft, moet u een projectnaam opgeven als u die procedure oproept. De volgende procedure roept bijvoorbeeld de procedure Main in de module MyModule in het project MyProject.vbp aan.

Sub Main()

[MyProject.vbp].[MyModule].Main

End Sub

Opmerking   Toepassingen hebben vaak verschillende namen voor een project. In Microsoft Access wordt een project bijvoorbeeld een database (.mdb) genoemd; in Microsoft Excel heet het een werkmap (.xls).

Tips voor het oproepen van procedures

•	Als u de naam van een module of project wijzigt, moet u deze naam ook wijzigen in alle oproepinstructies, anders kan Visual Basic de opgeroepen procedure niet vinden. Voor het zoeken en vervangen van tekst in een module kunt u gebruik maken van de opdracht Vervangen in het menu Bewerken.

•	Om naamconflicten binnen projecten waarnaar wordt verwezen te vermijden, kunt u procedures een unieke naam geven, zodat u een procedure kunt oproepen zonder een project of module op te geven.


Procedures voor Property oproepen

De volgende tabel geeft een overzicht van de syntaxis voor het oproepen van procedures Property:

Procedure Property	Syntaxis
Property Let	[object.]eigenschapnaam(argumenten)] = argument
Property Get	varname = [object.]eigenschapnaam(argumenten)]
Property Set	Set [object.]eigenschapnaam[.(argumenten)] = varnaam
Als u een procedure Property Let of Property Set oproept, verschijnt steeds één argument aan de rechterkant van het gelijkteken (=).

Als u een procedure Property Let of Property Set met meerdere argumenten oproept, koppelt Visual Basic het argument aan de rechterkant van de oproep aan het laatste argument in de declaratie Property Let of Property Set. Het volgende diagram laat bijvoorbeeld zien hoe argumenten in de oproep van de procedure Property in verband staan met argumenten in de declaratie Property Let:

In de praktijk worden voor procedures Property met meerdere argumenten matrices of eigenschappen gemaakt.


Procedures voor Sub en Function oproepen

Als u een procedure Sub vanuit een andere procedure wilt oproepen, typt u de naam van de procedure met de waarden voor alle vereiste argumenten. De instructie Call is niet vereist, maar als u deze gebruikt, moet u alle argumenten tussen haakjes zetten.

U kunt een procedure Sub gebruiken om andere procedures te ordenen, zodat deze makkelijker te begrijpen zijn en fouten eenvoudiger op te sporen zijn. In het volgende voorbeeld roept de Sub-procedure Main de Sub-procedure MultiBeep aan en geeft hierbij de waarde 56 voor het argument op. Als MultiBeep is uitgevoerd, keert de besturing terug naar Main, waarna Main de Sub-procedure Message oproept. Message geeft een berichtvenster weer. Als de gebruiker op OK klikt, keert de besturing terug naar Main en sluit Main af.

Sub Main()

MultiBeep 56

Bericht

End Sub

Sub MultiBeep(numbeeps)

For counter = 1 To numbeeps

Beep

Next counter

End Sub

Sub Message ()

MsgBox "Tijd voor een kopje koffie!"

End Sub

Procedures Sub met meerdere argumenten oproepen

Het volgende voorbeeld illustreert twee manieren om een procedure Sub met meer dan één argument aan te roepen. De tweede keer dat HouseCalc wordt opgeroepen, staan de argumenten tussen haakjes, omdat de instructie Call is gebruikt.

Sub Main()

HouseCalc 99800, 43100

Call Housecalc (380950, 49500)

End Sub

Sub HouseCalc (price As Single, wage As Single)

If 2,5 * wage <= 0,8 * price Then

MsgBox "U kunt dit huis niet betalen."

Else

MsgBox "U kunt dit huis betalen."

End If

End Sub

Het gebruik van haakjes bij het oproepen van procedures Function

Om de resultaatwaarde van een functie te kunnen gebruiken, wijst u de functie toe aan een variabele en zet u de argumenten tussen haakjes. Bijvoorbeeld:

Answer3 = MsgBox("Bent u tevreden met uw salaris?", 4, "Vraag 3")

Als u de resultaatwaarde van een functie niet wilt weten, kunt u een functie op dezelfde manier oproepen als een procedure Sub. U laat gewoon de haakjes weg, maakt een lijst van de argumenten en wijst de functie aan een variabele toe. Bijvoorbeeld:

MsgBox "Taak Volbracht!", 0, "Taakvenster"

Waarschuwing   Als u in het voorafgaande voorbeeld haakjes plaatst, veroorzaakt de instructie een syntaxisfout.

Benoemde argumenten opgeven

Een instructie in een procedure Sub of Function kan met behulp van benoemde argumenten waarden doorgeven aan opgeroepen procedures. U kunt benoemde argumenten in elke gewenste volgorde plaatsen. Een benoemd argument bestaat uit de naam van het argument gevolgd door een dubbele punt, een gelijkteken en de waarde die aan het argument is toegewezen.

In het volgende voorbeeld wordt de functie MsgBox met behulp van benoemde argumenten en zonder resultaatwaarde opgeroepen.

MsgBox Title:="Taakvenster", Prompt:="Taak volbracht!"

In het volgende voorbeeld wordt de functie MsgBox met behulp van benoemde argumenten opgeroepen. De resultaatwaarde wordt toegewezen aan de variabele answer3.

answer3 = MsgBox(Title:=”Vraag 3", _

Prompt:=" Bent u tevreden met uw salaris?", Buttons:=4)


Objectvariabelen maken

U kunt een objectvariabele op precies dezelfde wijze behandelen als het object waarnaar het verwijst. U kunt de eigenschappen van het object instellen of terugsturen, of een van de methoden van het object gebruiken.

U maakt als volgt een objectvariabele:

1.	Declareer de objectvariabele.

2.	Wijs de objectvariabele toe aan een object.

Een objectvariabele declareren

Gebruik de instructie Dim of een van de andere declaratie-instructies (Public, Private of Static) om een objectvariabele te declareren. Een variabele die naar een object verwijst moet een Variant, Object of een bepaald objecttype zijn. De volgende declaraties zijn bijvoorbeeld geldig:

' MyObject declareren als gegevenstype Variant.

Dim MyObject

' MyObject declareren als gegevenstype Object.

Dim MyObject As Object

' MyObject declareren als type Font.

Dim MyObject As Font

Opmerking   Als u een objectvariabele gebruikt zonder deze eerste te declareren, is het gegevenstype van de objectvariabele standaard Variant.

Als het specifieke objecttype niet bekend is totdat de procedure wordt uitgevoerd, kunt u een objectvariabele met behulp van het gegevenstype Object declareren. Gebruik het gegevenstype Object om een algemene verwijzing naar alle objecten te maken.

Als u weet wat het specifieke objecttype is, declareert u de objectvariabele als dat objecttype. Als de toepassing bijvoorbeeld een objecttype Sample bevat, kunt u met behulp van een van deze instructies een objectvariabele voor dat object declareren:

Dim MyObject As Object	' Gedeclareerd als algemeen object.

Dim MyObject As Sample	' Alleen gedeclareerd als object Sample.

Het declareren van specifieke objecttypen levert een automatische controle van typen, een snellere programmacode en een verbeterde leesbaarheid op.

Een objectvariabele aan een object toewijzen

Gebruik de instructie Set om een object aan een objectvariabele toe te wijzen. U kunt een objectexpressie toewijzen of Nothing. De volgende toewijzingen aan objectvariabelen zijn geldig:

Set MyObject = YourObject	' Wijst objectverwijzing toe.

Set MyObject = Nothing	' Stop associatie.

Als u het sleutelwoord New met de instructie Set gebruikt, kunt u het declareren van een objectvariabele combineren met het toewijzen van een object hieraan. Bijvoorbeeld:

Set MyObject = New Object	' Maak en wijs toe

Als u een objectvariabele instelt op Nothing, verbreekt u de koppeling van de objectvariabele met een bepaald object. U voorkomt hierdoor dat u door het wijzigen van een variabele per ongeluk een object wijzigt. Een objectvariabele wordt altijd ingesteld op Nothing als het object waarmee het is verbonden, wordt gesloten. Bijvoorbeeld:

If Not MyObject Is Nothing Then

' Variabele verwijst naar een geldig object.

. . .

End If

Met deze test kunt u natuurlijk nooit met absolute zekerheid zeggen of een gebruiker de toepassing met object waarnaar de objectvariabele verwijst, heeft gesloten.

Verwijzen naar de huidige versie van een object

Gebruik het sleutelwoord Me om te verwijzen naar de huidige versie van een object waarop de programmacode wordt uitgevoerd. Alle procedures die met het huidige object zijn verbonden, hebben toegang tot het object dat wordt aangeduid als Me. Me is bijzonder handig als u informatie over de huidige versie van een object aan een procedure in een andere module wilt doorgeven. Neem bijvoorbeeld de volgende procedure in een module:

Sub ChangeObjectColor(MyObjectName As Object)

MyObjectName.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)

End Sub

Met behulp van de volgende instructie kunt u de procedure oproepen en de huidige versie van het object als een argument doorgeven:

ChangeObjectColor Me


Recursieve procedures maken

Procedures beschikken over een beperkte hoeveelheid ruimte voor variabelen. Elke keer dat een procedure zichzelf oproept, wordt een deel van die ruimte verbruikt. Een procedure die zichzelf oproept is een recursieve procedure. Een recursieve procedure die zichzelf continu oproept zal uiteindelijk een fout veroorzaken. Bijvoorbeeld:

Function RunOut(Maximum)

RunOut = RunOut(Maximum)

End Function

Deze fout is misschien minder duidelijk als twee procedures elkaar een onbepaald aantal keer oproepen of als er een beperkende voorwaarde is waaraan nooit wordt voldaan. Toch kan recursie bruikbaar zijn. De volgende procedure maakt bijvoorbeeld gebruik van een recursieve functie voor het berekenen van faculteiten:

Function Factorial (N)

If N <= 1 Then	' Het einde van de recursieve oproepen.

Factorial = 1	' (N = 0) stop dus met oproepen.

Else	' Roep faculteit weer aan als N > 0.

Factorial = Factorial(N - 1) * N

End If

End Function

Test altijd uit of een recursieve procedure zichzelf niet zo vaak oproept dat u geheugen te kort komt. Controleer bij een foutmelding altijd of de procedure zichzelf niet een onbepaalde aantal keer oproept. Daarnaast kunt u op de volgende manieren proberen om geheugenruimte te sparen:

•	Verwijder onnodige variabelen.

•	Vermijd het gebruik van het gegevenstype Variant.

•	Denk de logica van de procedure nog eens door. Vaak kunt u geneste lussen gebruiken in plaats van recursie.


Matrices declareren

Matrices worden op dezelfde manier gedeclareerd als andere variabelen, zoals de instructies Dim, Static, Private en Public. Het verschil tussen schaalbare variabelen (die geen matrices zijn) en matrixvariabelen is dat u in het algemeen de grootte van de matrix moet opgeven. Een matrix met een opgegeven grootte is een vast matrix. Een matrix waarvan u tijdens de uitvoering van een programma de grootte kunt wijzigen, is een dynamische matrix.

Of de index van een matrix begint bij 0 of bij 1 hangt af van de instelling van de instructie Option Base. Als Option Base 1 niet is opgegeven, beginnen alle matrixindexen bij nul.

Een vaste matrix declareren

In de volgende regel programmacode wordt een vaste matrix gedeclareerd als Integer-matrix met 11 rijen en 11 kolommen:

Dim MyArray(10, 10) As Integer

Het eerste argument stelt het aantal rijen voor; het tweede argument stelt het aantal kolommen voor.

Net als bij elke andere declaratie van een variabele geldt hier dat als u geen gegevenstype voor de matrix opgeeft, het gegevenstype van de elementen in de matrix standaard Variant is. Elk numeriek Variant-element van de matrix gebruikt 16 bytes. Elk tekenreeks Variant-element gebruikt 22 bytes. Om uw programmacode zo compact mogelijk te houden, is het belangrijk dat u bij de declaratie van uw matrices expliciet opneemt dat uw matrices niet van het gegevenstype Variant zijn. In de volgende regels programmacode wordt de grootte van diverse matrices vergeleken:

' Integer-matrix gebruikt 22 bytes (11 elementen * 2 bytes).

ReDim MyIntegerArray(10) As Integer

' Matrix met dubbele precisie gebruikt 88 bytes (11 elementen * 8 bytes).

ReDim MyDoubleArray(10) As Double

' Variant-matrix gebruikt tenminste 176 bytes (11 elementen * 16 bytes).

ReDim MyVariantArray(10)

' Integer-matrix gebruikt 100 * 100 * 2 bytes (20.000 bytes).

ReDim MyIntegerArray (99, 99) As Integer

' Matrix met dubbele precisie gebruikt 100 * 100 * 8 bytes (80.000 bytes).

ReDim MyDoubleArray (99, 99) As Double

' Variant-matrix gebruikt tenminste 160.000 bytes (100 * 100 * 16 bytes).

ReDim MyVariantArray(99, 99)

De maximumgrootte van een matrix is afhankelijk van het besturingssysteem dat u gebruikt en de hoeveelheid geheugen die beschikbaar is. Als u een matrix gebruikt die meer geheugen nodig heeft dan het beschikbare RAM-geheugen op uw systeem, wordt het programma langzamer, omdat gegevens van en naar de vaste schijf moeten worden gelezen en geschreven.

Een dynamische matrix declareren

Als u een dynamische matrix declareert, kunt u de grootte van de matrix wijzigen, terwijl de programmacode wordt uitgevoerd. Gebruik de instructie Static, Dim, Private of Public om een matrix te declareren en zet niets tussen haakjes. Bijvoorbeeld:

Dim sngArray() As Single

Opmerking   U kunt de instructie ReDim gebruiken om een matrix impliciet binnen een procedure te declareren. Let bij het gebruiken van deze instructie goed op dat u de naam van de matrix niet verkeerd spelt. Zelfs als de instructie Option Explicit in de module is opgenomen, wordt een tweede matrix aangemaakt.

In een procedure binnen het bereik van de matrix kunt u met de instructie ReDim het aantal dimensies wijzigen, het aantal elementen opgeven en voor elke dimensie de benedengrens en bovengrens definiëren. Met de instructie ReDim kunt u de dynamische matrix zo vaak als nodig wijzigen. Elke keer dat u dit doet gaan de bestaande waarden in de matrix echter verloren. Met de instructie ReDim Preserve kunt u een matrix uitbreiden, terwijl u de bestaande waarden in de matrix behoudt. De volgende instructie vergroot de matrix varArray met 10 elementen, zonder dat de huidige waarden van de oorspronkelijke elementen verloren gaan.

ReDim Preserve varArray(UBound(varArray) + 10)

Opmerking   Als u het sleutelwoord Preserve met een dynamische matrix gebruikt, kunt u alleen de bovengrens van de laatste dimensie wijzigen en niet het aantal dimensies.


Constanten declareren

Met het declareren van een constante kunt u een zinvolle naam aan een waarde toekennen. Voor het declareren van een constante en het instellen van de waarde gebruikt u de instructie Const. Als u een constante hebt gedeclareerd, kunt u deze niet meer wijzigen.

Ook kunt u geen nieuwe waarde meer toewijzen. U kunt een constante binnen een procedure declareren of boven aan een module in de sectie Declaraties. Constanten op moduleniveau zijn standaard private. Als u vóór de instructie Const het sleutelwoord Public plaatst, declareert u de constante expliciet private. Uw programmacode is hierdoor makkelijker te lezen en te interpreteren. Zie voor meer informatie "Bereik en zichtbaarheid" in Visual Basic Help.

In het volgende voorbeeld wordt de Public-constante conAge als een Integer gedeclareerd. Verder wordt de waarde 34 toegewezen.

Public Const conAge As Integer = 34

Constanten kunnen als een van de volgende gegevenstypen worden gedeclareerd: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String of Variant. Aangezien u de waarde van een constante al weet, kunt u het gegevenstype opgeven in een instructie Const. Zie voor meer informatie over gegevenstypen de sectie “Samenvatting gegevenstype" in Visual Basic Help.

U kunt meerder constanten in één instructie opgeven. Als u een gegevenstype wilt opgeven, moet u voor elke constante het gegevenstype opnemen. In de volgende instructie worden de constanten conAge en conWage als Integer gedeclareerd.

Const conAge As Integer = 34, conWage As Currency = 35000


Variabelen declareren

Voor het declareren van variabelen gebruikt u gewoonlijk de instructie Dim. U kunt een declaratie-instructie binnen een procedure plaatsen om een variabele van procedureniveau aan te maken. U kunt de instructie ook boven aan een module in de sectie Declaraties plaatsen, waardoor u een variabele van moduleniveau maakt.

In het volgende voorbeeld wordt de variabele strName aangemaakt en wordt het gegevenstype String opgegeven.

Dim strName As String

Als deze instructie binnen een procedure verschijnt, kan de variabele strName alleen in die procedure worden gebruikt. Als de instructie in de sectie Declaraties van de module verschijnt, is de variabele strName voor alle procedures binnen de module beschikbaar, maar niet voor de procedures in andere modules in het project. Als u vóór deze variabele de instructie Public opneemt, maakt u deze beschikbaar voor alle procedures in het project. Bijvoorbeeld

Public strName As String

Zie de sectie "Naamregels in Visual Basic" in Visual Basic Help voor meer informatie over de naamgeving van variabelen.

Variabelen kunnen als een van de volgende gegevenstypen worden gedeclareerd: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String (voor tekenreeksen met variabele lengte), String * length (voor tekenreeksen met vaste lengte), Object of Variant. Als u geen gegevenstype opgeeft, wordt standaard het gegevenstype Variant toegewezen. Met behulp van de instructie Type kunt u ook een door de gebruiker gedefinieerd type maken. Zie voor meer informatie over gegevenstypen de sectie “Samenvatting gegevenstype" in Visual Basic Help.

In één instructie kunt u meerdere variabelen declareren. Als u een gegevenstype wilt opgeven, moet u voor elke variabele een gegevenstype opnemen. In de volgende instructie worden de variabelen intX, intY en intZ als Integer gedeclareerd.

Dim intX As Integer, intY As Integer, intZ As Integer

In de volgende instructie worden intX en intY als Variant gedeclareerd; alleen intZ wordt als Integer gedeclareerd.

Dim intX, intY, intZ As Integer

Het is niet noodzakelijk om het gegevenstype van de variabele in de declaratie-instructie te vermelden. Als u het gegevenstype weg laat, wordt het type Variant toegekend.

De instructie Public

Met de instructie Public kunt u variabelen op public moduleniveau declareren.

Public strName As String

Variabelen public kunnen in alle procedures in het project worden gebruikt. Als een variabele public in een standaardmodule of klassenmodule wordt gedeclareerd, kan deze ook worden gebruikt in projecten met verwijzingen naar projecten waarin de variabele public is gedeclareerd.

De instructie Private

Met de instructie Private kunt u variabelen op private moduleniveau declareren.

Private MyName As String

Variabelen private kunnen alleen door procedures in dezelfde module worden gebruikt.

Opmerking   Als u de instructie Dim op moduleniveau gebruikt, is deze gelijk aan de instructie Private. U kunt gebruik maken van de instructie Private om uw programmacode wat duidelijker en beter leesbaar te maken.

De instructie Static

Als u de instructie Static gebruikt in plaats van de instructie Dim, behoudt de gedeclareerde variabele tussen de verschillende oproepen zijn waarde.

De instructie Option Explicit

U kunt in Visual Basic impliciet een variabele declareren door deze in een toewijzingsinstructie te gebruiken. Alle variabelen die impliciet worden gedeclareerd, zijn van het type Variant. Variabelen van het type Variant nemen meer geheugenruimte in beslag dan andere variabelen. U kunt een toepassing efficiënter maken door variabelen expliciet te declareren met een specifiek gegevenstype. Als u alle variabelen expliciet declareert, verkleint u de kans op naamconflicten en spellingsfouten.

Als u niet wilt dat Visual Basic impliciete declaraties maakt, plaatst u vóór alle procedures in een module de instructie Option Explicit. Een vereiste voor deze module is dat u alle variabelen binnen de module expliciet declareert. Als een module de instructie Option Explicit bevat, treedt een compileerfout op wanneer Visual Basic een variabele tegenkomt die nog niet is gedeclareerd of verkeerd is gespeld.

In de programmeeromgeving van Visual Basic bevindt zich een optie die de mogelijkheid biedt de instructie Option Explicit automatisch in alle nieuwe modules op te nemen. Raadpleeg de documentatie bij uw toepassing als u de omgevingsopties van Visual Basic wilt wijzigen. Met deze optie kunt u overigens geen bestaande programmacode wijzigen.

Opmerking   Vaste en dynamische matrices moeten altijd expliciet worden gedeclareerd.

Een objectvariabele voor automatisering declareren

Als u een toepassing gebruikt om de objecten van een andere toepassing te kunnen beheren, moet u een verwijzing naar de typebibliotheek van de andere toepassing maken. Als u een verwijzing hebt gemaakt, kunt u objectvariabelen van het meest geschikte type declareren. Als u bijvoorbeeld vanuit Microsoft Word een verwijzing naar de typebibliotheek van Microsoft Excel maakt, kunt u vanuit Microsoft Word een variabele van het type Werkblad declareren die een Werkbladobject van Microsoft Excel voorstelt.

Als u een andere toepassing gebruikt voor het beheer van Microsoft Access-objecten, kunt u in de meeste gevallen objectvariabelen van het meest geschikt type declareren. U kunt ook het sleutelwoord New gebruiken om automatisch een nieuwe versie van een object te maken. U moet misschien wel aangeven dat het om een Microsoft Access-object gaat. Als u bijvoorbeeld vanuit Microsoft Visual Basic een objectvariabele declareert die een Microsoft Access-formulier voorstelt, moet u onderscheid maken tussen het Form-object van Microsoft Access en het Form-object van Visual Basic. Neem de naam van de typebibliotheek op in de declaratie van de variabele. Bijvoorbeeld:

Dim frmOrders As New Access.Form

Sommige toepassingen herkennen geen afzonderlijke Microsoft Access-objecttypen. Zelfs als u in deze toepassingen een verwijzing naar de typebibliotheek van Microsoft Access opneemt, moet u alle Microsoft Access-objectvariabelen als Object declareren. U kunt ook niet het sleutelwoord New gebruiken om een nieuwe versie van het object aan te maken. In het volgende voorbeeld kunt u zien hoe u vanuit een toepassing die de objecttypen van Microsoft Access niet herkent, een variabele kunt declareren die een versie van het object Application van Microsoft Access voorstelt. De toepassing maakt vervolgens een versie van het object Application aan.

Dim appAccess As Object

Set appAccess = CreateObject("Access.Application")

Raadpleeg de documentatie bij de toepassing om te bepalen welke syntaxis door een toepassing wordt ondersteund.


Programmacode uitvoeren tijdens het instellen van eigenschappen

Het is mogelijk procedures Property Let, Property Set en Property Get te maken die allen dezelfde naam hebben. U maakt zo een groep verwante procedures die met elkaar samenwerken. Als een naam eenmaal voor een procedure Property is gebruikt, kan die naam niet meer voor een procedure Sub of Function, een variabele of een door de gebruiker gedefinieerd type worden gebruikt.

Met de instructie Property Let kunt u een procedure maken die de waarde van de eigenschap instelt. Een voorbeeld hiervan is een procedure Property die een geïnverteerde eigenschap maakt voor een bitmap op een formulier. Dit is de syntaxis die gebruikt wordt voor het oproepen van de procedure Property Let:

Form1.Inverted = True

Het eigenlijke inverteren wordt binnen de procedure Property Let gedaan:

Private IsInverted As Boolean

Property Let Inverted(X As Boolean)

IsInverted = X

If IsInverted Then

…

(statements)

Else

(statements)

End If

End Property

De instelling van uw eigenschap wordt opgeslagen in de variabele IsInverted. Als deze Private is gedeclareerd, kan deze alleen met de procedure Property Let worden gewijzigd. Gebruik een naam waaraan eenvoudig te herkennen is dat de variabele voor die eigenschap wordt gebruikt.

Deze procedure Property Get wordt gebruikt om de huidige instelling van de eigenschap Inverted af te beelden:

Property Get Inverted() As Boolean

Inverted = IsInverted

End Property

Met behulp van procedures Property is het makkelijk om tijdens het instellen van de waarde van een eigenschap programmacode uit te voeren. U kunt met procedures Property de volgende bewerkingen uitvoeren:

•	De waarde van een eigenschap bepalen voordat de waarde van een eigenschap is ingesteld.

•	De waarde van een eigenschap bepalen voordat de waarde van een eigenschap is ingesteld, op basis van de nieuwe waarde.


Lussen ontwerpen

Als u voorwaardelijke instructies en lusinstructies (ook wel besturingsstructuren geheten) gebruikt, kunt u Visual Basic-programmacode schrijven die beslissingen maakt en acties herhaalt. Een andere bruikbare besturingsstructuur, de instructie With, maakt het mogelijk dat u een series instructies kunt uitvoeren zonder dat u een object opnieuw hoeft te kwalificeren.

Voorwaardelijke instructies voor het maken van beslissingen

Voorwaardelijke instructies gaan na of een voorwaarde True of False is en geven afhankelijk van het resultaat aan welke instructie(s) moet(en) worden uitgevoerd. Een voorwaarde is in het algemeen een expressie die gebruik maakt van een vergelijkingsoperator om twee waarden of variabelen te vergelijken.

Het kiezen van een voorwaardelijke instructie

•	If...Then...Else: Maakt een vertakking afhankelijk van de waarde True of False van een voorwaarde.

•	Select Case: Selecteert een tak uit een collectie voorwaarden.

Lussen voor het herhalen van programmacode

Door middel van het inbouwen van lussen kunt u een groep instructies herhaaldelijk uit laten voeren. Sommige lussen herhalen instructies totdat een voorwaarde False is; andere lussen herhalen instructies totdat een voorwaarde True is. Weer andere lussen herhalen een instructie een gegeven aantal keer of per object in een collectie.

Een lus kiezen

•	Do...Loop: Herhaalt instructies totdat een voorwaarde True is

•	For...Next: Maakt gebruik van een Counter om instructies een gegeven aantal keer uit te voeren

•	For Each...Next: Herhaalt een groep instructies per object in een collectie

Meerdere instructies op hetzelfde object uitvoeren

In Visual Basic moet u meestal een object opgeven voordat u een van de methoden van het object kunt uitvoeren of een van de eigenschappen van het object kunt wijzigen. Met de instructie With kunt u een object in een keer voor een hele serie instructies opgeven.

•	With: Een serie instructies op hetzelfde object uitvoeren


Snellere lussen For...Next maken

Het gegevenstype Integer neemt minder geheugenruimte in beslag dan het gegevenstype Variant en kan iets sneller worden bijgewerkt. Dit verschil is echter alleen merkbaar als u vele duizenden bewerkingen uitvoert. Bijvoorbeeld:

Dim CountFaster As Integer	' Eerste geval, gebruik Integer.

For CountFaster = 0 to 32766

Next CountFaster

Dim CountSlower As Variant	' Tweede geval, gebruik Variant.

For CountSlower = 0 to 32766

Next CountSlower

In het eerste geval is de runtime iets korter dan in het tweede geval. Als CountFaster echter hoger dan 32.767 wordt, treedt een fout op. U kunt dit oplossen door van CountFaster een gegevenstype Long te maken die een groot aantal integers ondersteunt. In het algemeen geldt dat hoe kleiner het gegevenstype is, hoe minder tijd het kost om het bij te werken. Varianten zijn iets langzamer dan gelijkwaardige gegevenstypen.


Argumenten efficiënt doorgeven

Alle argumenten worden via verwijzing aan procedures doorgegeven, tenzij u dit anders aangeeft. Dit is efficiënt omdat alle argumenten die via verwijzing worden doorgegeven, even snel worden doorgegeven en binnen de procedure dezelfde hoeveelheid ruimte (4 bytes) in beslag nemen, ongeacht het gegevenstype van het argument.

U kunt een argument via waarde doorgeven als u het sleutelwoord ByVal in de declaratie van de procedure opneemt. Argumenten die via waarde worden doorgegeven nemen tussen de 2 en 16 bytes in beslag, afhankelijk van het gegevenstype van het argument. Grotere gegevenstypen worden iets langzamer doorgegeven dan kleinere. U kunt hierdoor de gegevenstypen String en Variant in het algemeen beter niet via waarde doorgeven.

Als u een argument via waarde doorgeeft, kopieert u de oorspronkelijke variabele. Wijzigingen binnen de procedure hebben geen invloed op de oorspronkelijke variabele. Bijvoorbeeld:

Function Factorial (ByVal MyVar As Integer)	' Function-declaratie.

MyVar = MyVar - 1

If MyVar = 0 Then

Factorial = 1

Exit Function

End If

Factorial = Factorial(MyVar) * (MyVar + 1)

End Function

' Roep faculteit met een variabele S aan.

S = 5

Print Factorial(S)	' Geeft 120 (de faculteit van 5) weer

Print S	' Geeft 5 weer.

Als ByVal niet in de functiedeclaratie had gestaan, zouden de voorafgaande instructies Print 1 en 0 weergeven. MyVar zou in dat geval namelijk naar variabele S verwijzen, die met 1 wordt verlaagd tot deze gelijk is aan 0.

Aangezien ByVal een kopie van het argument maakt, kunt u een variant naar de functie Factorial erboven doorgeven. U kunt een variant niet via verwijzing doorgeven als in de declaratie van de procedure staat dat het argument van een ander gegevenstype is.


Tekenreeksen als resultaat van functies

Van sommige functies bestaan twee versies: een versie die een gegevenstype Variant als resultaat geeft en een versie die een gegevenstype String als resultaat geeft. De versies Variant zijn handiger in het gebruik, omdat varianten automatisch conversies tussen verschillende gegevenstypen maken. Varianten maken het ook mogelijk dat Null via een expressie wordt overgebracht. De versies String zijn efficiënter, omdat ze minder geheugen gebruiken.

De versie String is het overwegen waard als:

•	Uw programma erg groot is en veel variabelen gebruikt.

•	U direct gegevens naar direct toegankelijke bestanden schrijft.

De volgende functies zetten waarden terug in een variabele String als u een dollarteken ($) aan de functienaam toevoegt. Deze functies worden op dezelfde manier gebruikt en hebben dezelfde syntaxis als de Variant zonder het dollarteken.

Chr$	ChrB$	*Command$
CurDir$	Date$	Dir$
Error$	Format$	Hex$
Input$	InputB$	LCase$
Left$	LeftB$	LTrim$
Mid$	MidB$	Oct$
Right$	RightB$	RTrim$
Space$	Str$	String$
Time$	Trim$	UCase$
* Is niet in alle toepassingen beschikbaar.


Voorwaardelijk compileren

U kunt gebruik maken van voorwaardelijke compilatie om programmacodeblokken selectief uit te voeren. Voorwaardelijke compilatie wordt onder meer gebruikt in debug-instructies die de snelheid van verschillende methoden voor dezelfde programmeertaak vergelijken en voor het lokaliseren van een toepassing voor verschillende talen.

Met de stuurinstructie #Const kunt u een voorwaardelijke compileerconstante in programmacode declareren en met de stuurinstructie #If...Then...#Else kunt u aangeven dat programmacodeblokken voorwaardelijk worden gecompileerd. In het volgende voorbeeld wordt debug-programmacode of productieprogrammacode op basis van de waarde van de variabele conDebug uitgevoerd.

' Declareer public compileerconstante in sectie Declaraties.

#Const conDebug = 1

Sub SelectiveExecution()

#If conDebug = 1 Then

.	' Voer programmacode uit met debug-instructies.

.

.

#Else

.	' Voer normale programmacode uit.

.

.

#End If

End Sub


De levensduur van variabelen

De tijd gedurende welke een variabele haar waarde behoudt, staat bekend als de levensduur. Tijdens deze levensduur kan de waarde van een variabele wel veranderen, maar een zekere waarde blijft behouden. Als een variabele haar bereik verliest, verliest ze ook haar waarde.

Bij het starten van een procedure worden alle variabelen geïnitialiseerd. Een numerieke variabele wordt tot nul geïnitialiseerd, een tekenreeks met variabele lengte wordt tot een tekenreeks zonder gegevens ("") geïnitialiseerd en een tekenreeks met vaste lengte wordt gevuld met het teken dat wordt voorgesteld door de ASCII-code 0 of Chr(0). Variabelen van het type Variant worden geïnitialiseerd op Empty. Elk onderdeel van een variabele van een door de gebruiker gedefinieerd type wordt geïnitialiseerd alsof het een afzonderlijke variabele betreft.

Als u een objectvariabele declareert, wordt in het geheugen ruimte gereserveerd. De waarde hiervan wordt echter op Nothing ingesteld totdat u met behulp van de instructie Set een objectverwijzing aan de variabele toewijst.

Als de waarde van een variabele tijdens het uitvoeren van de programmacode niet is veranderd, blijft de geïnitialiseerde waarde behouden totdat de variabele haar bereik verliest.

Een variabele op procedureniveau die met de instructie Dim is gedeclareerd, houdt altijd een waarde totdat de procedure volledig is uitgevoerd. Als de procedure andere procedures oproept, blijft de waarde van de variabele ook tijdens het uitvoeren van die procedures behouden.

Als een variabele op procedureniveau is gedeclareerd met het sleutelwoord Static, behoudt de variabele zijn waarde zolang de code in een willekeurige module wordt uitgevoerd. Wanneer alle code is uitgevoerd, verliest de variabele zijn bereik en zijn waarde. De levensduur is gelijk aan de levensduur van een variabele op moduleniveau.

Een variabele op moduleniveau is geen statische variabele. In een standaardmodule of klassenmodule wordt de waarde behouden totdat u stopt met het uitvoeren van uw programmacode. In een klassenmodule wordt de waarde behouden zolang er een versie van de klasse bestaat. Variabelen op moduleniveau blijven geheugenruimte in beslag nemen totdat u de waarden opnieuw hebt ingesteld.

Gebruik deze variabelen dus alleen als het noodzakelijk is. Als u vóór een instructie Function of Sub het sleutelwoord Static plaatst, blijven tussen de oproepen door de waarden van alle variabelen op procedureniveau behouden.


Benoemde en optionele argumenten

Bij het oproepen van een procedure Sub of Function kunt u argumenten via positie invoeren, in de volgorde waarin deze in de definitie van de procedure voorkomen, of via naam, waarbij u geen rekening houdt met de positie.

Voor de volgende procedure Sub zijn bijvoorbeeld drie argumenten nodig:

Sub PassArgs(strName As String, intAge As Integer, dteBirth As Date)

Debug.Print strName, intAge, dteBirth

End Sub

U kunt deze procedure oproepen door de argumenten in de juiste positie in te voeren en tussen de argumenten komma's te plaatsen, zoals in het volgende voorbeeld:

PassArgs "Mary", 29, #2-21-69#

U kunt deze procedure ook oproepen door benoemde argumenten in te voeren en tussen de argumenten komma's te plaatsen:

PassArgs intAge:=29, dteBirth:=#2/21/69#, strName:="Mary"

Een benoemd argument bestaat uit een argumentnaam gevolgd door een dubbele punt, een gelijkteken (:=) en de waarde van het argument.

Benoemde argumenten zijn bijzonder bruikbaar bij het oproepen van procedures die optionele argumenten bevatten. Als u benoemde argumenten gebruikt, hebt u geen komma's nodig om ontbrekende positionele argumenten aan te geven. Verder kunt u eenvoudiger bijhouden welke argumenten u hebt ingevoerd en welke u hebt weggelaten.

Optionele argumenten worden in de proceduredefinitie voorafgegaan door het sleutelwoord Optional. U kunt in de proceduredefinitie ook een standaardwaarde voor het optionele argument opgeven. Bijvoorbeeld:

Sub OptionalArgs(strState As String, Optional strCountry As String = "USA")

. . .

End Sub

Als u een procedure met een optioneel argument oproept, kunt u kiezen of u het optionele argument wilt opgeven. Als u het optionele argument niet opgeeft, wordt de standaardwaarde gebruikt. Als geen standaardwaarde is opgegeven, is het argument gelijk aan elke andere variabele van het opgegeven type.

De volgende procedure bevat twee optionele argumenten, de variabelen varRegion en varCountry. De functie IsMissing bepaalt of een optioneel argument van het type Variant aan de procedure is doorgegeven.

Sub OptionalArgs(strState As String, Optional varRegion As Variant, _

Optional varCountry As Variant = "USA")

If IsMissing(varRegion) And IsMissing(varCountry) Then

Debug.Print strState

ElseIf IsMissing(varCountry) Then

Debug.Print strState, varRegion

ElseIf IsMissing(varRegion) Then

Debug.Print strState, strCountry

Else

Debug.Print strState, varRegion, varCountry

End If

End Sub

U kunt deze procedure met behulp van benoemde argumenten oproepen, zoals in de volgende voorbeelden.

OptionalArgs varCountry:="USA", strState:="MD"

OptionalArgs strState:= "MD", varRegion:=5


Objecten, eigenschappen, methoden en gebeurtenissen

Een object stelt een element van een toepassing voor, zoals een werkblad, een cel, een diagram, een formulier of een rapport. In Visual Basic-programmacode moet u een object definiëren, voordat u een van de methoden aan het object kunt toepassen of de waarde van een van de eigenschappen kunt wijzigen.

Een collectie is een object dat verschillende andere objecten bevat die vaak (maar niet altijd) van hetzelfde type zijn. In Microsoft Excel bevat het object Workbook bijvoorbeeld alle geopende objecten Workbook. In Visual Basic bevat de collectie Forms alle objecten Form van een toepassing.

Items in een collectie worden gedefinieerd via nummer of naam. In de volgende procedure wordt het eerste geopende object Workbook gedefinieerd via Workbooks(1).

Sub CloseFirst()

Workbooks(1).Close

End Sub

In de volgende procedure wordt een object Formulier gedefinieerd via een naam die als tekenreeks is opgegeven.

Sub CloseForm()

Forms("MijnForm.frm").Close

End Sub

U kunt ook een hele collectie objecten bewerken als de objecten gemeenschappelijke methoden hebben. De volgende procedure sluit bijvoorbeeld alle geopende formulieren.

Sub CloseAll()

Forms.Close

End Sub

Een methode is een actie die door een object kan worden uitgevoerd. Add is bijvoorbeeld een methode van het object ComboBox, omdat het een nieuwe ingang aan een combinatievak toevoegt.

De volgende procedure maakt gebruik van de methode Add om een nieuw item aan een ComboBox toe te voegen.

Sub AddEntry(newEntry as String)

Combo1.Add newEntry

End Sub

Een eigenschap definieert een bepaald kenmerk van een object, zoals grootte, kleur of plaats op het scherm. Dit kenmerk kan ook een gedragsaspect zijn, bijvoorbeeld of een object geactiveerd is, of zichtbaar. Als u de kenmerken van een object wilt wijzigen, moet u de waarden van de eigenschappen wijzigen.

Als u de waarde voor een eigenschap wilt instellen, plaatst u achter de verwijzing naar een object achtereenvolgens een punt, de naam van de eigenschap, een gelijkteken (=) en de nieuwe waarde voor de eigenschap. De volgende procedure wijzigt bijvoorbeeld het opschrift van een formulier in Visual Basic door de eigenschap Caption in te stellen.

Sub ChangeName(newTitle)

MyForm.Caption = newTitle

End Sub

Sommige eigenschappen kunnen niet worden ingesteld. In het Help-onderwerp bij elke eigenschap kunt u lezen of de betreffende eigenschap kan worden ingesteld (lezen-schrijven). Het is ook mogelijk dat de eigenschap alleen kan worden gelezen (alleen-lezen) of dat alleen naar de eigenschap kan worden geschreven (alleen-schrijven).

U kunt informatie over een object ophalen door de waarde van een van de eigenschappen op te halen. De volgende procedure maakt gebruik van een berichtvenster om de titel die boven aan het geactiveerde formulier staat, weer te geven.

Sub GetFormName()

formName = Screen.ActiveForm.Caption

MsgBox formName

End Sub

Een gebeurtenis is een actie die door een object wordt herkend, zoals het klikken met de muis of het indrukken van een toets. Met behulp van programmacode kunt u een reactie definiëren die door een gebeurtenis wordt veroorzaakt. Gebeurtenissen worden veroorzaakt door een actie van de gebruiker, een programmacode of het systeem.

Objecten terughalen

Elke toepassing kent methoden om objecten terug te halen. Deze methoden zijn echter niet allemaal hetzelfde, dus u moet het Help-onderwerp bij het desbetreffende object of de desbetreffende collectie raadplegen om te zien hoe u het object kunt terughalen.


Automatisering

Automatisering (wat vroeger OLE-automatisering heette) is een kenmerk van het Component Object Model (COM), een standaardtechnologie die wordt gebruikt om objecten van toepassingen beschikbaar te stellen aan hulpprogramma's, macrotalen en andere toepassingen die Automatisering ondersteunen. In een spreadsheettoepassing kunnen dit bijvoorbeeld een werkblad, diagram, cel of cellenbereik zijn— elk als een ander type object. Een tekstverwerker beschikt bijvoorbeeld over objecten als een toepassing, een document, een alinea, een zin, een bladwijzer en een selectie.

Als een toepassing Automatisering ondersteunt, zijn de objecten van de toepassing voor Visual Basic toegankelijk. Met Visual Basic kunt u deze objecten bewerken door methoden voor het object aan te roepen of de eigenschappen van het object op te halen en in te stellen. U kunt bijvoorbeeld een Automatiseringsobject met de naam MyObj aanmaken en de volgende programmacode schrijven om toegang te krijgen tot het object:

MyObj.Insert "Hallo allemaal."	' Voer tekst in.

MyObj.Bold = True	' Maak tekst op.

If Mac = True	' Controleert platformconstante

MyObj.SaveAs  "HD:\WORDPROC\DOCS\TESTOBJ.DOC"	' Bewaar het object (Macintosh).

Else

MyObj.SaveAs  "C:\WORDPROC\DOCS\TESTOBJ.DOC"	' Bewaar het object (Windows).

Gebruik de volgende functies om toegang te krijgen tot een Automatiseringsobject:

Functie	Beschrijving
CreateObject	Maakt een nieuw object of opgegeven type aan.
GetObject	Haalt een object op uit een bestand.
Voor details over de eigenschappen en methoden die door een toepassing worden ondersteund, kunt u de documentatie bij de toepassing raadplegen. De objecten, functies, eigenschappen en methoden die door een toepassing worden ondersteund, worden gewoonlijk in de objectbibliotheek van de toepassing gedefinieerd.


Parametermatrices

Een parametermatrix wordt gebruikt om matrices of argumenten voor een procedure op te geven. Bij het definiëren van de procedure hoeft u niet te weten hoeveel elementen de matrix bevat.

U duidt een parametermatrix aan met het sleutelwoord ParamArray. Deze matrix wordt als een matrix van het type Variant gedeclareerd en moet altijd het laatste argument in de definitie van de procedure zijn.

In het volgende voorbeeld kunt u zien hoe u een procedure met behulp van een parametermatrix kunt definiëren.

Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant)

Dim intI As Integer

Debug.Print strName; "    Scores"

' Gebruik functie UBound om bovengrens van matrix te bepalen.

For intI = 0 To UBound(intScores())

Debug.Print "    "; intScores(intI)

Next intI

End Sub

In het volgende voorbeeld kunt u zien hoe u deze procedure kunt benoemen.

AnyNumberArgs "Erik", 10, 26, 32, 15, 22, 24, 16

AnyNumberArgs "Judith", "Hoog", "Laag", "Gemiddeld", "Hoog"


Bereik en zichtbaarheid

Bereik verwijst naar de beschikbaarheid van een variabele, constante of procedure voor een andere procedure. Visual Basic kent drie niveaus voor bereik: het procedureniveau, private (persoonlijke) moduleniveau en public (openbare) moduleniveau.

U bepaalt het bereik van een variabele bij de declaratie. Het is verstandig om alle variabelen expliciet te declareren, zodat u naamconflicten tussen variabelen met verschillende bereiken voorkomt.

Bereik op procedureniveau definiëren

Een variabele of constante die binnen een procedure is gedefinieerd, is buiten die procedure niet zichtbaar. Deze variabele of constante kan alleen in de procedure met de declaratie van de variabele worden gebruikt. In het volgende voorbeeld geeft de eerste procedure een berichtvenster met een tekenreeks weer. De tweede procedure geeft een leeg berichtvenster weer, omdat de variabele strMsg een lokale variabele is voor de eerste procedure.

Sub LocalVariable()

Dim strMsg As String

strMsg = "Deze variabele kan niet buiten deze procedure worden gebruikt."

MsgBox strMsg

End Sub

Sub OutsideScope()

MsgBox strMsg

End Sub

Bereik op private moduleniveau definiëren

U kunt variabelen en constanten op moduleniveau definiëren in de sectie Declaraties van een module. Variabelen op moduleniveau kunnen zowel public als private zijn. Variabelen public kunnen in alle procedures in alle modules van een project worden gebruikt; Variabelen private kunnen alleen in procedures in de desbetreffende module worden gebruikt. Variabelen die met de instructie Dim in de sectie Declaraties zijn gedefinieerd, hebben een private bereik. Als u echter vóór de variabele het sleutelwoord Private opneemt, maakt u het bereik duidelijk zichtbaar in de programmacode.

In het volgende voorbeeld is de tekenreeksvariabele strMsg beschikbaar voor alle procedures die in de module zijn gedefinieerd. Als de tweede procedure wordt opgeroepen, verschijnt de inhoud van de tekenreeksvariabele strMsg in een dialoogvenster.

' Voeg het volgende toe aan de sectie Declaraties van de module.

Private strMsg sAs String

Sub InitializePrivateVariable()

strMsg = "Deze variabele kan niet buiten deze module worden gebruikt."

End Sub

Sub UsePrivateVariable()

MsgBox strMsg

End Sub

Opmerking   Procedures public in een standaardmodule of klassenmodule kunnen in elk verwijzend project worden gebruikt. Om het bereik van de procedures in een module tot het huidige project te beperken, voegt u een instructie Option Private Module aan de sectie Declaraties van het module toe. Variabelen public en procedures public kunnen dan nog wel in andere procedures binnen het huidige project worden gebruikt, maar niet meer in verwijzende projecten.

Bereik op public moduleniveau definiëren

Als u een variabele op public moduleniveau declareert, kan deze variabele in alle procedures in het project worden gebruikt. In het volgende voorbeeld kan de tekenreeksvariabele strMsg in elke procedure in elke module in het project worden gebruikt.

' Neem op in sectie Declaraties van de module.

Public strMsg As String

Gebeurtenisprocedures zijn de enige procedures die niet standaard public zijn. Als Visual Basic een gebeurtenisprocedure maakt, wordt automatisch het sleutelwoord Private voor de declaratie van de procedure geplaatst. In alle andere procedures moet u de procedure expliciet met het sleutelwoord Private declareren, als u niet wilt dat deze public is.

U kunt gebruik maken van procedures, variabelen en constanten public die in verwijzende projecten in standaardmodules of klassenmodules zijn gedefinieerd. U moet echter eerst een verwijzing opnemen naar het project waarin deze zijn gedefinieerd.

Procedures, variabelen en constanten public die niet in standaardmodules of klassenmodules zijn gedefinieerd, maar bijvoorbeeld in formuliermodules of rapportmodules, kunnen niet in verwijzende projecten worden gebruikt, omdat deze private zijn voor het project waarin ze zich bevinden.


Varianten

Als u bij het declareren van een constante, variabele of argument geen gegevenstype opgeeft, wordt automatisch het gegevenstype Variant toegekend. Variabelen die als Variant worden gedeclareerd, kunnen tekenreeksen, datums, tijden, Boole- en numerieke waarden bevatten en kunnen de waarden die ze bevatten automatisch converteren. Numerieke Variant-waarden hebben 16 bytes aan geheugen nodig (dit is alleen van belang in grote procedures of in complexe modules) en zijn minder snel toegankelijk dan variabelen van een ander type. Het gegevenstype Variant wordt zelden voor constanten gebruikt. Tekenreeks Variant-waarden hebben 22 bytes aan geheugen nodig.

De volgende instructies maken variabelen Variant aan:

Dim MyVar

Dim yourVar As Variant

theVar = "Dit is wat tekst."

De laatste instructie declareert de variabele theVar niet expliciet, maar op een meer impliciete, automatische manier. Variabelen die impliciet worden gedeclareerd, worden als Variant gedeclareerd.

Tip   Als u een gegevenstype voor een variabele of argument opgeeft en vervolgens het verkeerde gegevenstype gebruikt, treedt een fout op. Om fouten in gegevenstypen te vermijden, moet u of alleen impliciete variabelen gebruiken (van het gegevenstype Variant) of alle variabelen expliciet declareren en een gegevenstype opgeven. De laatste methode heeft de voorkeur.


De syntaxis van Visual Basic

De syntaxis van een methode, instructie, of functie in een Help-onderwerp van Visual Basic bestaat uit alle onderdelen die nodig zijn om de methode, instructie of functie correct te gebruiken. In de voorbeelden in deze sectie wordt uitgelegd hoe u de belangrijkste onderdelen van de syntaxis moet interpreteren.

De syntaxis van de methode Activate

object.Activate

In de syntaxis van de methode Activate is het cursieve woord ‘object’ een plaatshouder voor informatie die u invoert— in dit geval programmacode die een object als resultaat geeft. Vetgedrukte woorden moeten precies zo worden ingetypt als deze verschijnen. De volgende procedure activeert bijvoorbeeld het tweede venster in het actieve document.

Sub MakeActive()

Windows(2).Activate

End Sub

De syntaxis van de functie MsgBox

MsgBox(prompt[, knoppen] [, titel] [, helpbestand, context])

In de syntaxis van de functie MsgBox zijn de vetgedrukte cursieve woorden benoemde argumenten van de functie. Argumenten die tussen haakjes staan, zijn optioneel. (Typ geen haakjes in uw Visual Basic-programmacode.) Het enige argument dat u voor de functie MsgBox moet plaatsen, is de tekst voor de prompt.

Argumenten voor functies en methoden worden in de programmacode via positie of via naam opgegeven. Als u argumenten via positie wilt opgeven, houdt u de volgorde aan die in de syntaxis wordt aangegeven, waarbij u de argumenten met behulp van komma's scheidt. Bijvoorbeeld:

MsgBox "Uw antwoord is correct!",0,"Antwoordvenster"

Als u een argument via naam wilt opgeven, voert u de naam van het argument in, gevolgd door een dubbele punt, een gelijkteken (:=) en de waarde van het argument. U kunt benoemde argumenten in elke gewenste volgorde opgeven. Bijvoorbeeld:

MsgBox Title:="Antwoordvenster", Prompt:="Uw antwoord is correct!"

In de syntaxis van functies en van een aantal methoden staan de argumenten tussen haakjes. Deze functies en methoden geven waarden als resultaat, dus u moet de argumenten tussen haakjes opnemen om een waarde aan een variabele toe te wijzen. Als u de resultaatwaarde negeert of als u helemaal geen argumenten opgeeft, moet u ook de haakjes weglaten. Bij methoden die geen waarden als resultaat geven, hoeft u geen argumenten tussen haakjes op te nemen. Deze richtlijnen gelden zowel voor positionele als voor benoemde argumenten.

In het volgende voorbeeld is de resultaatwaarde van de functie MsgBox een getal dat de geselecteerde knop aangeeft die in de variabele MyVar is opgeslagen. Haakjes zijn vereist, omdat de resultaatwaarde is gebruikt. Een ander berichtvenster geeft vervolgens de waarde van de variabele weer.

Sub Question()

MyVar = MsgBox(Prompt:="Ik vind mijn werk leuk.", _

Title:="Antwoordvenster", Buttons:="4")

MsgBox MyVar

End Sub

De syntaxis van de instructie Option

Option Compare {Binary | Text | Database}

In de syntaxis van de instructie Option Compare geven de haakjes en het verticale streepje aan dat het een verplichte keuze tussen drie items betreft. (Typ geen haakjes in de Visual Basic-instructie). De volgende instructie geeft bijvoorbeeld aan dat binnen de module tekenreeksen worden vergeleken in een sorteervolgorde die niet hoofdlettergevoelig is.

Option Compare Text

De syntaxis van de instructie Dim

Dim varnaam[([subscripts])] [As type] [, varnaam[([subscripts])] [As type]] . . .

In de syntaxis van de instructie Dim is het woord Dim een vereist sleutelwoord. Het enige vereiste onderdeel is varnaam (de naam van de variabele). De volgende instructie maakt bijvoorbeeld drie variabelen aan: myVar, nextVar en thirdVar. Deze worden automatisch als variabelen Variant gedeclareerd.

Dim MyVar, nextVar, thirdVar

In het volgende voorbeeld wordt een variabele String gedeclareerd. Als u een gegevenstype opneemt, spaart u geheugenruimte en kunt u gemakkelijker fouten in uw programmacode opsporen.

Dim MyAnswer As String

Om meerdere variabelen in een instructie op te kunnen nemen, moet u het gegevenstype voor elke variabele opnemen. Variabelen die zonder gegevenstype worden gedeclareerd, worden automatisch als Variant gedeclareerd.

Dim x As Integer, y As Integer, z As Integer

In de volgende instructie krijgen x en y het gegevenstype Variant toegewezen. Alleen aan z wordt het gegevenstype Integer toegewezen.

Dim x, y, z As Integer

Als u een matrix-variabele declareert, moet u haakjes opnemen. De subscripts zijn optioneel. De volgende instructie bepaalt het aantal dimensies van MyArray, een dynamische matrix.

Dim MyArray()


Matrices

U kunt in een declaratie opnemen dat een matrix met een collectie waarden van hetzelfde gegevenstype werkt. Een matrix is een enkele variabele met een groot aantal afdelingen waar u waarden kunt opslaan. Een doorsnee variabele heeft slechts één opslagafdeling waar slechts één waarde in kan worden opgeslagen. U kunt naar de matrix als geheel verwijzen (u verwijst dan naar alle waarden die de matrix bevat), maar u kunt ook naar de afzonderlijke elementen verwijzen.

Als u bijvoorbeeld de dagelijkse uitgaven van een heel jaar wilt opslaan, kunt u beter één matrixvariabele met 365 elementen declareren dan 365 aparte variabelen. Elk element in een matrix bevat één waarde. In de volgende instructie wordt de matrixvariabele curExpense gedeclareerd. Deze variabele heeft 365 elementen. De index van een matrix begint standaard bij nul, dus de bovengrens van de matrix is 364 en geen 365.

Dim curExpense(364) As Currency

Om de waarde van een afzonderlijk element in te stellen, geeft u de index van het element op. In het volgende voorbeeld wordt aan elk element in de matrix een beginwaarde van 20 toegewezen.

Sub FillArray()

Dim curExpense(364) As Currency

Dim intI As Integer

For intI = 0 to 364

curExpense(intI) = 20

Next

End Sub

De ondergrens wijzigen

Met de instructie Option Base boven aan een module kunt u de standaardindex van het eerste element van 0 in 1 veranderen. In het volgende voorbeeld wijzigt de instructie Option Base de index van het eerste element en declareert de instructie Dim de matrixvariabele curExpense met 365 elementen.

Option Base 1

Dim curExpense(365) As Currency

Met behulp van een component To kunt u de ondergrens van een matrix ook expliciet instellen. Bijvoorbeeld:

Dim curExpense(1 To 365) As Currency

Dim strWeekday(7 To 13) As String

Variant-waarden in matrices opslaan

U kunt op twee manieren matrices maken van Variant-waarden. De eerste manier is het declareren van een matrix van het gegevenstype Variant. Bijvoorbeeld:

Dim varData(3) As Variant

varData(0) = "Suzanne Bergman"

varData(1) = "Torenstraat 242"

varData(2) = 38

varData(3) = Format("06-09-1952", "Algemene datum")

De tweede manier is het toewijzen van de matrix die door de functie Array in een variabele van het type Variant wordt teruggeplaatst. Bijvoorbeeld:

Dim varData As Variant

varData = Array("Ron Bergman", "Torenstraat 242", 38, _

Format("06-09-1952", "Algemene datum"))

De elementen in een matrix van Variant-waarden worden op index gedefinieerd. Het maakt hierbij niet uit welke techniek wordt gebruikt om de matrix te maken. De volgende instructie kan bijvoorbeeld aan een van de vorige voorbeelden worden toegevoegd.

MsgBox "Gegevens voor " & varData(0) & " zijn opgenomen."

Matrices met meerdere dimensies

In Visual Basic kunt u matrices declareren die maximaal 60 dimensies hebben. De volgende instructie declareert een tweedimensionale, 5 bij 10-matrix.

Dim sngMulti(1 To 5, 1 To 10) As Single

Een matrix in Visual Basic heeft veel weg van een wiskundige matrix. Het eerste argument stelt hierbij de rijen voor en het tweede argument de kolommen.

Gebruik geneste instructies For...Next voor het verwerken van multidimensionale matrices. Op de volgende manier vult u een tweedimensionale matrix met Single-waarden.

Sub FillArrayMulti()

Dim intI As Integer, intJ As Integer

Dim sngMulti(1 To 5, 1 To 10) As Single

' Vul matrix met waarden.

For intI = 1 To 5

For intJ = 1 To 10

sngMulti(intI, intJ) = intI * intJ

Debug.Print sngMulti(intI, intJ)

Next intJ

Next intI

End Sub


Constanten

Soms komt het voor dat uw programmacode veel constante waarden bevat die vaak voorkomen of dat uw programmacode afhankelijk is van bepaalde getallen die moeilijk te onthouden zijn en geen duidelijke betekenis hebben. Met behulp van constantenkunt u uw programmacode beter leesbaar maken. Een constante is een betekenisvolle naam die in de plaats van een vast getal of een vaste tekenreeks komt. U kunt een constante niet wijzigen of een nieuwe waarde aan een constante toewijzen, zoals dat bij een variabele kan.

Er zijn drie typen constanten:

Intrinsieke constanten, of door het systeem gedefinieerde constanten, worden door toepassingen en besturingselementen gedefinieerd. Andere toepassingen met objectbibliotheken, zoals Microsoft Access, Microsoft Excel, Microsoft Project  en Microsoft Word, bevatten ook lijsten van constanten en bijbehorende objecten, methoden en andere eigenschappen. In de Object Browser bevindt zich een lijst van constanten voor afzonderlijke objectbibliotheken.

De constanten van Visual Basic zijn opgenomen in de typebibliotheek van Visual Basic for Applications (VBA) en Data Access Object-bibliotheek (DAO).

Opmerking  Visual Basic herkent ook constanten van toepassingen die in vorige versies van Visual Basic of Visual Basic for Applications zijn gemaakt. U kunt uw constanten bijwerken tot de constanten in de Object Browser. U hoeft in uw toepassing geen constanten te declareren die in de Object Browser zijn opgenomen.

•	Symbolische of door de gebruiker gedefinieerde constanten worden met de instructie Const gedeclareerd.

•	Voorwaardelijke compileerconstanten worden met de instructie #Const gedeclareerd.

In vorige versies van Visual Basic werden namen van constanten meestal met hoofdletters en onderstrepingen weergegeven. Bijvoorbeeld:

TILE_HORIZONTAL

Intrinsieke constanten worden nu gekwalificeerd, dat wil zeggen dat ze van een aanduiding worden voorzien. Hierdoor wordt voorkomen dat constanten die zich in verschillende bibliotheken bevinden maar dezelfde naam hebben, met elkaar worden verward. Namen van constanten kunnen op twee manieren worden gekwalificeerd:

•	via een voorvoegsel

•	via een bibliotheekverwijzing

Constanten via een voorvoegsel kwalificeren

De intrinsieke constanten die in alle objecten voorkomen, worden in een combinatie van kleine letters en hoofdletters weergegeven en zijn voorzien van een voorvoegsel van twee tekens dat aangeeft door welke objectbibliotheek de constante wordt gedefinieerd. Constanten uit de objectbibliotheek van Visual Basic for Applications worden voorafgegaan door het voorvoegsel "vb" en constanten uit de objectbibliotheek van Microsoft Excel worden voorafgegaan door het voorvoegsel "xl". In de volgende voorbeelden kunt u zien hoe voorvoegsels voor extra besturingselementen, afhankelijk van de typebibliotheek van elkaar kunnen verschillen,.

•	vbTileHorizontal

•	xlDialogBorder

Constanten via een bibliotheekverwijzing kwalificeren

U kunt de verwijzing naar een constante ook op de volgende manier kwalificeren:

[biblnaam.] [modulenaam.]constname

De syntaxis van kwalificerende constanten bestaat uit de volgende onderdelen:

Onderdeel	Beschrijving
biblnaam	Optioneel. De naam van de typebibliotheek die de constante definieert. Voor de meeste aangepaste besturingselementen  (niet beschikbaar op de Macintosh)is dit ook de klassenaam van het besturingselement. Als u de klassennaam van het besturingselement niet meer weet, plaats dan de muisaanwijzer boven het besturingselement in de werkset. De klassennaam wordt dan in de ToolTip weergegeven.
modulenaam	Optioneel. De naam van de module binnen de typebibliotheek die de constante definieert. Met behulp van de Object Browser kunt u deze naam vinden.
constname	De naam die in de typebibliotheek voor de constante is gedefinieerd.
Bijvoorbeeld:

Threed.LeftJustify


Gegevenstypen efficiënt gebruiken

Tenzij anders aangegeven krijgen variabelen die niet zijn gedeclareerd het gegevenstype Variant. Dit gegevenstype is handig voor het schrijven van programma's, maar is niet altijd het meest efficiënte gegevenstype in het gebruik.

Andere gegevenstypen zijn het overwegen waard als:

•	Uw programma erg groot is en veel variabelen gebruikt.

•	Uw programma zo snel mogelijk moet draaien.

•	U direct gegevens naar direct toegankelijke bestanden schrijft.

Naast Variant worden onder meer de volgende gegevenstypen ondersteund: Byte, Boolean, Integer, Long, Single, Double, Currency, Decimal, Date, Object en String. Met behulp van de instructie Dim kunt u een variabele of een bepaald type opgeven. Bijvoorbeeld:

Dim X As Integer

Deze instructie declareert dat de variabele X een integer is — een geheel getal tussen -32.768 en 32.767. Als u een getal buiten dat bereik aan X wilt toewijzen, treedt een fout op. Als u een gebroken getal aan X wilt toewijzen, wordt het getal afgerond. Bijvoorbeeld:

X = 32768	' Veroorzaakt fout.

X = 5,9	' Stelt x op 6 in.


Instructies Do...Loop

Met instructies Do...Loop kunt u een blok met instructies een onbepaald aantal keer herhalen. De instructies worden herhaald zolang een voorwaarde True is of totdat een voorwaarde True wordt.

Instructies herhalen zolang een voorwaarde True is

U kunt het sleutelwoord While op twee manieren gebruiken voor het toetsen van een in een instructie Do...Loop. U kunt de voorwaarde toetsen voordat de lus begint of als de lus tenminste eenmaal is uitgevoerd.

In de volgende procedure ChkFirstWhile kunt u de voorwaarde toetsen voordat de lus begint. Als MyNum op 9 in plaats van op 20 wordt ingesteld, worden de instructies binnen de lus nooit uitgevoerd. In de procedure ChkLastWhile worden de instructies binnen de lus slechts één keer uitgevoerd voordat de voorwaarde False wordt.

Sub ChkFirstWhile()

counter = 0

MyNum = 20

Do While MyNum > 10

MyNum = MyNum - 1

counter = counter + 1

Loop

MsgBox "De lus heeft " & counter & " herhalingen gemaakt."

End Sub

Sub ChkLastWhile()

counter = 0

MyNum = 9

Do

MyNum = MyNum - 1

counter = counter + 1

Loop While MyNum > 10

MsgBox "De lus heeft " & counter & " herhalingen gemaakt."

End Sub

Instructies herhalen totdat een voorwaarde True wordt

U kunt het sleutelwoord Until op twee manieren gebruiken om een voorwaarde in een instructie Do...Loop te toetsen. U kunt de voorwaarde toetsen voordat de lus begint (zoals in de procedure ChkFirstUntil) of u kunt de voorwaarde toetsen als de lus tenminste één keer is uitgevoerd (zoals in de procedure ChkLastUntil). De lussen worden uitgevoerd zolang de voorwaarde False is.

Sub ChkFirstUntil()

counter = 0

MyNum = 20

Do Until MyNum = 10

MyNum = MyNum - 1

counter = counter + 1

Loop

MsgBox "De lus heeft " & counter & " herhalingen gemaakt."

End Sub

Sub ChkLastUntil()

counter = 0

MyNum = 1

Do

MyNum = MyNum +1

counter = counter + 1

Loop Until MyNum = 10

MsgBox "De lus heeft " & counter & " herhalingen gemaakt."

End Sub

Een instructie Do...Loop vanuit de lus verlaten

Met behulp van de instructie Exit Do kunt u een Do...Loop verlaten. Als u bijvoorbeeld in een eindeloze lus zit, kunt u deze verlaten via de instructie Exit Do in het instructieblok True van een instructie If...Then...Else of Select Case. Als de voorwaarde False is, gaat de lus gewoon door.

In het volgende voorbeeld wordt aan MyNum een waarde toegewezen die een eindeloze lus tot gevolg heeft. De instructie If...Then...Else toetst deze voorwaarde en verlaat vervolgens de lus. Op deze manier wordt een eindeloze lus voorkomen.

Sub ExitExample()

counter = 0

MyNum = 9

Do Until MyNum = 10

MyNum = MyNum - 1

counter = counter + 1

If MyNum < 10 Then Exit Do

Loop

MsgBox "De lus heeft " & counter & " herhalingen gemaakt."

End Sub

Opmerking  U kunt op ESC of CTRL+BREAK drukken om een eindeloze lus te stoppen.


Instructies For...Next

Met instructies For...Next kunt u een blok met instructies een gegeven aantal keer herhalen. Lussen For maken gebruik van de variabele Counter, waarvan de waarde bij elke herhaling van de lus wordt verlaagd of verhoogd.

De volgende procedure zorgt ervoor dat de computer 50 pieptonen maakt. In de instructie For worden de Countervariabele x en de beginwaarde en eindwaarde hiervan gedefinieerd. De instructie Next verhoogt de variabele Counter met 1.

Sub Beeps()

For x = 1 To 50

Beep

Next x

End Sub

Met behulp van het sleutelwoord Step kunt u de variabele Counter verhogen of verlagen met een door u opgegeven waarde. In het volgende voorbeeld wordt de Countervariabele j bij elke herhaling van de lus met 2 verhoogd. Als de lus is afgelopen, geeft total de som van 2, 4, 6, 8 en 10 weer.

Sub TwosTotal()

For j = 2 To 10 Step 2

total = total + j

Next j

MsgBox "Het totaal is " & total

End Sub

Als u een negatieve waarde voor Step gebruikt, kunt u de variabele Counter verlagen. Om de variabele Counter te verlagen moet u een eindwaarde opgeven die lager is dan de beginwaarde. In het volgende voorbeeld wordt de Countervariabele MyNum bij elke herhaling van de lus met 2 verlaagd. Als de lus is afgelopen, geeft total de som van 16, 14, 12, 10, 8, 6, 4 en 2 weer.

Sub NewTotal()

For MyNum = 16 To 2 Step -2

total = total + MyNum

Next MyNum

MsgBox "Het totaal is " & total

End Sub

Opmerking   Het is niet noodzakelijk om achter de instructie Next de naam van de variabele Counter op te nemen. Deze naam is hier omwille van de leesbaarheid opgenomen.

Met de instructie Exit For kunt u een instructie For...Next verlaten voordat de Counter de eindwaarde bereikt. U kunt deze instructie gebruiken als er een fout optreedt. De instructie Exit For bevindt zich in het instructieblok True van een instructie If...Then...Else of Select Case die op het opsporen van fouten is ingesteld. Als de fout niet optreedt, geeft de instructie If...Then...Else als resultaat False weer en wordt de lus gewoon verder uitgevoerd.


Instructies For Each...Next

In instructies For Each...Next wordt voor elk object in een collectie of voor elk element in een matrixeen instructieblok herhaald. Elke keer dat de lus wordt uitgevoerd, stelt Visual Basic automatisch een variabele in. De volgende procedure sluit alle formulieren behalve het formulier met de lopende procedure:

Sub CloseForms()

For Each frm In Application.Forms

If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close

Next

End Sub

De volgende programmacode laat elk element in een matrix door een lus gaan en stelt de waarde van alle elementen in op de waarde van de indexvariabele I.

Dim TestMatrix(10) As Integer, I As Variant

For Each I In TestArray

TestArray(I) = I

Next I

Lussen in een cellenbereik uitvoeren

Met de lus For Each...Next kunt u de cellen in een bereik door een lus laten gaan. De volgende procedure voert lussen uit op het bereik A1:D10 op Blad1 en stelt elk getal waarvan de absolute waarde lager dan 01 is, op 0 (zero) in.

Sub RoundToZero()

For Each MyObject in MyCollection

If Abs(MyObject.Value) < 0.01 Then MyObject.Value = 0

Next

End Sub

Een lus For Each...Next verlaten

Met behulp van de instructie Exit For kunt u een lus For Each...Next verlaten. U kunt deze instructie gebruiken als er een fout optreedt. De instructie Exit For bevindt zich in het instructieblok True van een instructie If...Then...Else of Select Case die op het opsporen van fouten is ingesteld. Als de fout niet optreedt, geeft de instructie If...Then...Else als resultaat False weer en wordt de lus gewoon verder uitgevoerd.

In het volgende voorbeeld wordt gezocht naar de eerste cel in het bereik A1:B5 die geen getal bevat. Als zo'n cel wordt gevonden, verschijnt een bericht en breekt Exit For de lus af.

Sub TestForNumbers()

For Each MyObject In MyCollection

If IsNumeric(MyObject.Value) = False Then

MsgBox "Object bevat een niet-numerieke waarde."

Exit For

End If

Next c

End Sub


Instructies If...Then...Else

Met de instructie If...Then...Else kunt u een specifieke instructie of een specifiek instructieblok uitvoeren, afhankelijk van de waarde van een voorwaarde. U kunt een instructie If...Then...Else op elk gewenst aantal niveaus nesten. Omwille van de leesbaarheid is het vaak echter beter om een instructie Select Case te gebruiken in plaats van meerdere niveaus met geneste instructies If...Then...Else.

Instructies uitvoeren wanneer een voorwaarde True is

U gebruikt de eenregelige syntaxis van de instructie If...Then...Else als u slechts één instructie wilt uitvoeren wanneer een voorwaarde True is. In het volgende voorbeeld wordt een eenregelige syntaxis weergegeven, waarbij het sleutelwoord Else wordt weggelaten:

Sub FixDate()

MyDate = #2/13/95#

If MyDate < Now Then MyDate = Now

End Sub

U gebruikt de syntaxis voor meerdere regels als u meerdere regels programmacode wilt uitvoeren. Deze syntaxis bevat de instructie End If, wat u in het voorbeeld kunt zien:

Sub AlertUser(value as Long)

If value = 0 Then

AlertLabel.ForeColor = "Rood"

AlertLabel.Font.Bold = True

AlertLabel.Font.Italic = True

End If

End Sub

Bepaalde instructies uitvoeren als een voorwaarde True is en andere als deze False is

Gebruik de instructie If...Then...Else als u twee blokken instructies wilt uitvoeren: één blok wordt uitgevoerd als de voorwaarde True is, het andere blok als de voorwaarde False is.

Sub AlertUser(value as Long)

If value = 0 Then

AlertLabel.ForeColor = vbRed

AlertLabel.Font.Bold = True

AlertLabel.Font.Italic = True

Else

AlertLabel.Forecolor = vbBlack

AlertLabel.Font.Bold = False

AlertLabel.Font.Italic = False

End If

End Sub

Een tweede voorwaarde toetsen als de eerste voorwaarde False is

U kunt instructies ElseIf aan een instructie If...Then...Else toevoegen als u wilt controleren of een tweede voorwaarde False is. De volgende functieprocedure berekent bijvoorbeeld een bonus op basis van het type baan. De instructie die na de instructie Else komt, wordt uitgevoerd als de voorwaarden in alle instructies If en ElseIf de waarde False hebben.

Function Bonus(performance, salary)

If performance = 1 Then

Bonus = salary * 0,1

ElseIf performance = 2 Then

Bonus = salary * 0,09

ElseIf performance = 3 Then

Bonus = salary * 0,07

Else

Bonus = 0

End If

End Function


Het gebruik van haakjes in programmacode

Sub-procedures, ingebouwde instructies en sommige methoden geven geen waarde als resultaat, dus worden de argumenten niet tussen haakjes gezet. Bijvoorbeeld:

MySub "tekenreeksargument", integerArgument

Function-procedures, ingebouwde functies en sommige methoden geven geen waarde als resultaat, maar u kunt dit negeren. Als u de resultaatwaarde negeert, moet u de haakjes weglaten. De functie wordt op dezelfde manier als een Sub-procedure opgeroepen. U laat de haakjes weg, somt de argumenten op en wijst de functie niet aan een variabele toe. Bijvoorbeeld:

MsgBox "Taak Volbracht!", 0, "Taakvenster"

Als u de resultaatwaarde van een functie wilt gebruiken, zet u de argumenten tussen haakjes. Bijvoorbeeld :

Answer3 = MsgBox("Bent u tevreden met uw salaris?", 4, "Vraag 3")

Een instructie in een Sub- of Function-procedure kan met behulp van benoemde argumenten defnamedarguments@vbendf98.hlp waarden aan een opgeroepen procedure doorgeven. De richtlijnen voor het gebruik van haakjes blijven van toepassing, of u nu benoemde argumenten gebruikt of niet. Benoemde argumenten kunnen in elke gewenste volgorde worden ingevoerd en u kunt optionele argumenten weglaten. Benoemde argumenten worden altijd afgesloten door een dubbele punt, een gelijkteken (:=) en de waarde van het argument.

In het volgende voorbeeld wordt de functie MsgBox met behulp van benoemde argumenten opgeroepen. De resultaatwaarde wordt echter genegeerd:

MsgBox Title:="Taakvenster", Prompt:="Taak volbracht!"

In het volgende voorbeeld wordt de functie MsgBox met behulp van benoemde argumenten opgeroepen. De resultaatwaarde wordt toegewezen aan de variabele antwoord3.

answer3 = MsgBox(Title:=”Vraag 3", _

Prompt:=" Bent u tevreden met uw salaris?", Buttons:=4)


Instructies Select Case

Als u één expressie met verschillende waarden vergelijkt, kunt u de instructie Select Case gebruiken in plaats van ElseIf in instructies If...Then...Else. Het verschil is dat instructies If...Then...Else een verschillend expressie voor elke instructie ElseIf kunnen evalueren, terwijl instructies Select Case slechts één expressie tegelijk kunnen evalueren, namelijk de expressie die boven aan de besturingsstructuur staat.

In het volgende voorbeeld evalueert de instructie Select Case het argument performance dat aan de procedure is doorgegeven. Elke instructie Case kan overigens meerdere waarden, een bereik van waarden of een combinatie van waarden en vergelijkingsoperators bevatten. De optionele instructie Case Else wordt uitgevoerd als de instructie Select Case met geen enkele waarde in de instructies Case overeenkomt.

Function Bonus(performance, salary)

Select Case performance

Case 1

Bonus = salary * 0,1

Case 2, 3

Bonus = salary * 0,09

Case 4 To 6

Bonus = salary * 0,07

Case Is > 8

Bonus = 100

Case Else

Bonus = 0

End Select

End Function


Instructies With

Met een instructie With kunt u eenmaal een object of een door de gebruiker gedefinieerd type voor een hele serie instructies opgeven. Instructies With zijn prima hulpmiddelen voor het versnellen van uw procedures en het voorkomen van herhaald intypen.

In het volgende voorbeeld wordt een bereik van cellen met het getal 30 gevuld, het lettertype op vet ingesteld en de inwendige kleur van de cellen op geel ingesteld.

Sub FormatRange()

With Worksheets("Blad1").Range("A1:C10")

.Value = 30

.Font.Bold = True

.Interior.Color = RGB(255, 255, 0)

End With

End Sub

Om de efficiëntie te verhogen, kunt u instructies With nesten. In het volgende voorbeeld wordt in cel A1 een formule geplaatst en vervolgens het lettertype opgemaakt.

Sub MyInput()

With Workbooks("Boek1").Worksheets("Blad1").Cells(1, 1)

.Formula = "=SQRT(50)"

With .Font

.Name = "Arial"

.Bold = True

.Size = 8

End With

End With

End Sub


Naamregels in Visual Basic

Neem de volgende regels in acht wanneer u procedures, constanten, variabelen en argumenten in een modulevan Visual Basic benoemt:

•	Het eerste teken moet een letter zijn.

•	Spaties, punten (.), uitroeptekens (!) en de tekens @, &, $, # mogen niet in een naam worden gebruikt.

•	De naam mag niet langer dan 255 tekens zijn.

•	In het algemeen geldt dat u geen namen van functies, instructies en methoden van Visual Basic moet gebruiken. Het gevolg is namelijk dat deze namen met de  sleutelwoorden van de taal worden verward. Als u een intrinsieke taalfunctie, instructie of methode wilt gebruiken die strijdig is met een toegewezen naam, moet u deze expliciet definiëren. U moet dan de naam van de bijbehorende  typebibliotheek opnemen vóór de naam van de intrinsieke functie, instructie of methode. Als u bijvoorbeeld een variabele heeft die Left heet, kunt u de functie Left alleen oproepen met VBA.Left.

•	Binnen elk niveau van bereik kunt u een naam slechts eenmaal gebruiken. U kunt bijvoorbeeld niet binnen één procedure twee variabelen met de naam age declareren. U kunt binnen één module echter wel een variabele private en een gelijknamige variabele op procedure-level declareren.

Opmerking  Visual Basic is niet hoofdlettergevoelig, maar de hoofdletters in de instructie waarin de naam is gedeclareerd, blijven wel staan.


Werken met verschillende toepassingen

Visual Basic kan nieuwe objecten aanmaken en bestaande objecten opvragen uit een groot aantal toepassingen van Microsoft. U kunt met Visual Basic ook objecten maken voor gebruik in andere toepassingen. Raadpleeg de documentatie bij de desbetreffende toepassingen voor meer informatie.

Met behulp van de functies CreateObject en GetObject kunt u nieuwe objecten aanmaken en bestaande objecten uit andere toepassingen opvragen:

' Start Microsoft Excel en maak een nieuw werkbladobject.

Set ExcelWorksheet = CreateObject("Excel.Blad")

' Start Microsoft Excel en open een bestaand werkbladobject.

Set ExcelWorksheet = GetObject("BLAD1.XLS")

' Start Microsoft Word.

Set WordBasic = CreateObject("Word.Basic")

De meeste toepassingen kunnen met Exit of Quit worden afgesloten. Het is hierbij niet van belang of de toepassing zichtbaar is of niet. Meer informatie over objecten, methoden en eigenschappen van toepassingen vindt u in de documentatie bij de desbetreffende toepassingen.

In sommige toepassingen kunt u met het sleutelwoord New een object of een willekeurige klasse uit de bijbehorende typebibliotheek aanmaken. Bijvoorbeeld:

Dim X As New Field

In dit geval is Field een voorbeeld van een klasse in de typebibliotheek. Via deze syntaxis wordt een nieuwe versie van het object Field aangemaakt. Raadpleeg de documentatie bij de toepassing voor informatie over de objectklassen die op deze manier kunnen worden aangemaakt.


Een procedure Function schrijven

Een procedure Function is een serie Visual Basic-instructies die zich tussen de instructies Function en End Function bevinden. Een procedure Function lijkt op een procedure Sub, met het verschil dat een functie ook een waarde als resultaat kan geven. Een procedure Function kan argumenten als constanten, variabelen en expressies bevatten die door een oproepende procedure zijn geleverd. Als een procedure Function geen argumenten bevat, moeten in de instructie Function twee haakjes zonder inhoud staan. Een functie geeft een waarde als resultaat als in een of meerdere instructies van de procedure een waarde aan de naam wordt toegewezen.

In het volgende voorbeeld berekent de functie Celsius het aantal graden Celsius uit het aantal graden Fahrenheit. Als de functie vanuit de procedure Main wordt opgeroepen, wordt een variabele met de waarde van het argument aan de functie toegewezen. De uitkomst van de berekening wordt naar de oproepende procedure teruggestuurd en in een berichtvenster weergegeven.

Sub Main()

temp = Application.InputBox(Prompt:= _

"Voer de temperatuur in graden F. in", Type:=1)

MsgBox "Het is " & Celsius(temp) & " graden C."

End Sub

Function Celsius(fDegrees)

Celsius = (fDegrees - 32) * 5 / 9

End Function


Een procedure Property schrijven

Een procedure Property is een serie Visual Basic-instructies waarmee een programmeur aanpasbare eigenschappen kan maken en bewerken.

•	Met procedures Property kunt u alleen-lezen eigenschappen voor formulieren, standaardmodules en klassenmodules maken.

•	Als u programmacode hebt die bij het instellen van de waarde voor de eigenschap moet worden uitgevoerd, gebruikt u procedures Property in plaats van variabelen Public.

•	Anders dan variabelen Public kunnen procedures Property in de Object Browser aan Help-tekenreeksen worden gekoppeld

Als u een procedure Property maakt, wordt deze een eigenschap van de module die de procedure bevat. Visual Basic kent de volgende drie typen procedures Property:

Procedure	Beschrijving
Property Let	Een procedure die de waarde van een eigenschap toewijst.
Property Get	Een procedure die de waarde van een eigenschap als resultaat geeft.
Property Set	Een procedure die een verwijzing naar een object instelt.
De syntaxis voor het declareren van een procedure Property is:

[Public | Private] [Static] Property {Get | Let | Set} eigenschapnaam_ [(argumenten)] [As type]

instructies

End Property

Procedures Property worden meestal in paren gebruikt: Property Let met Property Get en Property Set met Property Get. Het declareren van alleen een procedure Property Get is zoiets als het declareren van een alleen-lezen eigenschap. Alleen bij variabelen Variant heeft het zin om de drie typen procedure Property samen te gebruiken, omdat alleen een Variant zowel een object als informatie van een ander gegevenstype kan bevatten. Property Set is voor objecten bedoeld; Property Let is niet voor objecten bedoeld.

In de onderstaande tabel staan de vereiste argumenten voor de declaraties van de procedure Property:

Procedure	Syntaxis
Property Get	Property Get eigenschapnaam(1, ..., n) As type
Property Let	Property Let eigenschapnaam(1, ...,,,, n, n+1)
Property Set	Property Set eigenschapnaam(1, ..., n, n+1)
Het eerste tot en met het op één na laatste argument (1, ..., n) moeten dezelfde naam en hetzelfde gegevenstype hebben binnen alle procedures Property met dezelfde naam.

De declaratie van een procedure Property Get bevat één argument minder dan de declaraties van de verwante procedures Property Let en Property Set. Het gegevenstype van de procedure Property Get moet hetzelfde zijn als het gegevenstype van het laatste argument (n+1) in de declaraties van de verwante procedures Property Let en Property Set. Als u bijvoorbeeld de volgende procedure Property Let declareert, moet u in de declaratie van de procedure Property Get argumenten gebruiken die dezelfde naam en hetzelfde gegevenstype hebben als de argumenten in de procedure Property Let.

Property Let Names(intX As Integer, intY As Integer, varZ As Variant)

‘ hier instructie.

End Property

Property Get Names(intX As Integer, intY As Integer) As Variant

‘ hier instructie.

End Property

Het gegevenstype van het laatste argument in de declaratie van een procedure Property Set moet een objecttype of een Variant zijn.


Een procedure Sub schrijven

Een procedure Sub is een serie Visual Basic-instructies die zich tussen de instructies Sub en End Sub bevindt. Een procedure Sub voert acties uit maar geeft geen waarden als resultaat. Een procedure Sub kan argumenten als constanten, variabelen of expressies bevatten die door een oproepende procedure zijn aangevoerd. Als een procedure Sub geen argumenten heeft, moeten in de instructie Sub twee haakjes zonder inhoud staan.

De volgende procedure Sub bevat opmerkingen die bij elke regel uitleg verschaffen.

' Declareert een procedure met de naam GetInfo

' Deze procedure Sub bevat geen argumenten

Sub GetInfo()

' Declareert een tekenreeksvariabele met de naam answer

Dim answer As String

' Wijst de resultaatwaarde van de functie InputBox aan answer toe

answer = InputBox(Prompt:="Wat is uw naam?")

' Voorwaardelijke instructie If...Then...Else

If answer = Empty Then

' Roept de functie MsgBox aan

MsgBox Prompt:="U hebt geen naam ingevoerd."

Else

' De functie MsgBox bij de variabele answer gevoegd

MsgBox Prompt:="Uw naam is " & answer

' Beëindigt de instructie If...Then...Else

End If

' Beëindigt de procedure Sub

End Sub


Toewijzingsinstructies schrijven

Toewijzingsinstructies kennen een waarde of expressie aan een variabeleof constante toe. Toewijzingsinstructies bevatten altijd een gelijkteken (=). In het volgende voorbeeld wordt de resultaatwaarde van de functie InputBox aan de variabele yourName toegewezen.

Sub Question()

Dim yourName As String

yourName = InputBox("Wat is uw naam?")

MsgBox "Uw naam is " & yourName

End Sub

De instructie Let is optioneel en wordt meestal weggelaten. De voorafgaande toewijzingsinstructie kan ook zo worden geschreven:

Let yourName = InputBox("Wat is uw naam?").

Met de instructie Set wijst u een object toe aan een variabele die als object is gedeclareerd. Het sleutelwoord Set moet hierbij worden gebruikt. In het volgende voorbeeld wijst de instructie Set het bereik op Blad1 aan de objectvariabele MyCell toe:

Sub ApplyFormat()

Dim MyCell As Range

Set MyCell = Worksheets("Blad1").Range("A1")

With MyCell.Font

.Bold = True

.Italic = True

End With

End Sub

Instructies die waarden van eigenschappen toewijzen zijn ook toewijzingsinstructies. In het volgende voorbeeld wordt de eigenschap Bold van het object Font aan het object voor de actieve cel toegewezen:

ActiveCell.Font.Bold = True


Declaratie-instructies schrijven

Met behulp van declaratie-instructies benoemt en definieert u procedures, variabelen, matrices en constanten. Bij het declareren van een procedure, variabele of constante, definieert u ook het bereik. Dit is afhankelijk van waar u de declaratie plaatst en van welke sleutelwoorden u bij de declaratie gebruik maakt.

Het volgende voorbeeld bevat drie declaraties.

Sub ApplyFormat()

Const limit As Integer = 33

Dim MyCell As Range

' Meer instructies

End Sub

Met de instructie Sub (met bijbehorende instructie End Sub) wordt een procedure met de naam ApplyFormat gedeclareerd. Elke keer dat de procedure ApplyFormat wordt opgeroepen of uitgevoerd, worden alle instructies tussen de instructies Sub en End Sub uitgevoerd.

•	Procedures schrijven

De instructie Const declareert de constante limit en geeft hierbij het gegevenstype Integer en een waarde van 33 op.

•	Constanten declareren

De instructie Dim declareert de variabele MyCell. Het gegevenstype is een object, in dit geval een Microsoft Excel Range-object. U kunt een variabele declareren als elk object dat in de huidige toepassing beschikbaar is. Instructies Dim zijn een type instructies waarmee u variabelen kunt declareren. Andere sleutelwoorden die in declaraties worden gebruikt, zijn ReDim, Static, Public, Private en Const.

•	Variabelen declareren


Uitvoerbare instructies schrijven

Een uitvoerbare instructie stelt een actie in werking. Een uitvoerbare instructie kan een methode of functie uitvoeren en lussen of vertakkingen in blokken programmacode maken. Uitvoerbare instructies bevatten vaak wiskundige of voorwaardelijke operators

In het volgende voorbeeld wordt een instructie For Each...Next uitgevoerd in alle cellen in het bereik MijnBereik op Blad1 van een actief Microsoft Excel-werkmap. De variabele c is een cel in de collectie van cellen die zich in MijnBereik bevindt.

Sub ApplyFormat()

Const limit As Integer = 33

For Each c In Worksheets("Blad1").Range("MijnBereik").Cells

If c.Value > limit Then

With c.Font

.Bold = True

.Italic = True

End With

End If

Next c

MsgBox "Klaar!"

End Sub

De instructie If...Then...Else toetst de waarde van de cel. Als de waarde hoger dan 33 is, wijst de instructie With de eigenschappen Bold en Italic toe aan het object Font van de cel. Instructies If...Then...Else worden afgesloten met End If.

De instructie With kan u typewerk besparen, omdat de instructies erin automatisch worden uitgevoerd op het object dat na het sleutelwoord With komt.

De instructie Next roept de volgende cel in de collectie van cellen in MijnBereik aan.

De functie MsgBox (waarmee een ingebouwd Visual Basic-dialoogvenster wordt weergegeven) geeft het bericht weer dat de procedure Sub is beëindigd.


Gegevens naar bestanden schrijven

Als u met grote hoeveelheden gegevens werkt, is het vaak handig om gegevens naar een bestand te schrijven of om gegevens van een bestand te lezen. Met de instructie Open kunt u direct bestanden maken of toegang krijgen tot bestanden. Open kent drie typen toegang:

•	Sequentiële toegang (de werkstanden Input, Output en Append) wordt gebruikt voor het schrijven van tekstbestanden, zoals foutlogboeken en rapporten.

•	Directe toegang (de werkstand Random) wordt gebruikt voor het lezen en schrijven van gegevens van en naar een bestand, zonder dat dit bestand wordt gesloten. Direct toegankelijke bestanden bewaren gegevens in records, waardoor u eenvoudig en snel informatie kunt vinden.

•	Binaire toegang (de werkstand Binary) wordt gebruikt voor het lezen of schrijven van en naar elke willekeurige bytepositie in een bestand.

Opmerking   De instructie Open mag niet worden gebruikt om de bestandstypen van de toepassing zelf te openen. Gebruik de instructie Open bijvoorbeeld niet om een Word-document, , a een Microsoft Excel-spreadsheet,  of een Microsoft Access-database te openen. Dit leidt tot verlies aan bestandsintegriteit en beschadiging van bestanden.

In de volgende tabel worden de instructies vermeld die veel worden gebruikt bij het lezen of schrijven van en naar bestanden.

Toegangstype	Gegevens schrijven	Gegevens lezen
Sequentieel	Print #, Write #	Input #
Direct	Put	Get
Binair	Put	Get


Visual Basic-instructies schrijven

Een instructie in Visual Basic is een volledige instructie. Deze kan geen sleutelwoorden, operatoren, variabelen, constanten of expressies bevatten. De volgende drie categorieën omvatten alle instructies:

•	Declaratie-instructies, voor het benoemen van variabelen, constanten en procedures en het opgeven van gegevenstypen.

Declaratie-instructies schrijven

•	Toewijzingsinstructies, die een waarde of expressie aan een variabele of constant toewijzen.

Toewijzingsinstructies schrijven

•	Uitvoerbare instructies, die een actie in werking stellen. Een uitvoerbare instructie kan een methode of functie uitvoeren en lussen of vertakkingen in blokken programmacode maken. Uitvoerbare instructies bevatten vaak wiskundige of voorwaardelijke operators

Uitvoerbare instructies schrijven

Een instructie over meerdere regels voortzetten

Een instructie past meestal op één regel. Met behulp van een regelvervolgtekenkunt u echter ook een instructie op de volgende regel voortzetten. In het volgende voorbeeld wordt de uitvoerbare instructie MsgBox over drie regels voortgezet:

Sub DemoBox()  'Deze procedure declareert een tekenreeksvariabele,

' wijst hieraan de waarde Claudia toe en geeft vervolgens

' een samengevoegd bericht weer.

Dim MyVar As String

MyVar = "Bart"

MsgBox Prompt:="Hallo " & MyVar, _

Title:="Begroetingsvenster ", _

Buttons:=vbExclamation

End Sub

Opmerkingen toevoegen

Opmerkingen kunnen een procedure of een bepaalde instructie verduidelijken voor iedereen die uw programmacode leest. Bij het uitvoeren van de procedures worden de opmerkingen door Visual Basic genegeerd. Regels met opmerkingen beginnen altijd met een apostrof (') of met Rem, gevolgd door een spatie. Regels met opmerkingen kunnen op elke gewenste plaats in een procedure worden ingevoegd. Als u een opmerking op dezelfde regel als een instructie wilt plaatsen, zet u een apostrof achter de instructie en daarachter de opmerking. Opmerkingen worden standaard als groene tekst weergegeven.

Syntaxisfouten nakijken

Als u na het invoeren van een regel op ENTER drukt en de regel wordt rood weergegeven (soms verschijnt ook een foutbericht), moet u een fout in de instructie opzoeken en verbeteren.


Invoegtoepassingenbeheer gebruiken

Gebruik het dialoogvenster Beheer van invoegtoepassingen om een invoegtoepassing te laden of te verwijderen. Als u alleen de zichtbare delen van een invoegtoepassing sluit, bijvoorbeeld door op het systeemmenu ervan te dubbelklikken of op de knop Afsluiten te klikken, verdwijnen de formulieren van de invoegtoepassing uit het scherm, maar staat de invoegtoepassing zelf nog steeds in het geheugen. Het invoegtoepassingsobject zelf blijft altijd in het geheugen aanwezig totdat het vanuit het dialoogvenster Beheer van invoegtoepassingen wordt ontkoppeld.