Plaats volgende code in een module, en zorg er voor dat bovenaan zeker niet de instructie: ‘Option Explicit’ staat.
Sub
test()
i
= 10
MsgBox "i heeft de waarde
van:" & vbCrLf _
& i & vbCrLf & "Helaas vraag je op die manier om
fouten."
End Sub
Indien je op deze manier met variabelen omgaat, zal dit wel werken, maar dit is verre van professioneel. U vraagt zelfs om fouten, en bovendien weigert Excel elke medewerking, zoals we later nog zullen merken. Met andere woorden: vergeet deze code maar gauw.
Om maar meteen correct van start te gaan, kan je beter eerst je instellingen even controleren in de VB-editor.
Ga naar de menu Extra in de VB-editor (ALT + F11), en kijk naar de opties.
In het tabblad ‘Editor’ moet elke optie aangevinkt zijn.
Indien je nu een nieuwe module maakt komt daar bovenaan altijd de instructie: ‘Option Explicit’ te staan. Deze instructie zorgt er voor (noem het voor mijn part pesten), dat je geen enkele variabele meer kan gebruiken die niet op voorhand gedeclareerd is. Bovenstaande code zal dus niet meer werken.
Wat is dat nu weer? Alvorens ik ook maar iets gezegd heb over het correct declareren van uw variabelen begin ik eerst over een venster dat te vinden is via het menu ‘Beeld’. Het venster ‘Lokale Variabelen’ is nochtans enorm handig bij het nakijken van uw programmacode. Zo kan je bij het doorlopen van uw code op gelijk welk moment de waarde van uw variabelen in het oog houden. Verder geeft dit venster u informatie hoe Excel zelf een variabele op de meest voordelige manier opslaat.
Nogmaals een test dus. Plaats volgende macro in een module:
Sub
test()
Dim myValue
myValue = 1
myValue = "Ikke"
myValue = #1/13/2004#
myValue = 1.25
myValue = True
myValue = 123456789
End Sub
Dit is een betere code dan de voorgaande… maar toch… de variabele is wel gedeclareerd, maar enkel als Variant, terwijl er wel betere gegevenstypes te vinden zijn. Roep nu ook het venster ‘Lokale variabelen’ op via het menu ‘Beeld’. Maak dit venster niet te groot, zodat je nog bij je code kan komen. Je kan dit venster slepen, en verkleinen met de muis. Houd wel de CTRL knop ingedrukt, zodat het venster niet aan de wand blijft kleven.
In dit venster vind je -op dit ogenblik nog lege- lijst met 3 kolommen.
|
Opmerking: VBA Spreekt Amerikaans. Zoals we in de hiernavolgende voorbeelden zullen zien moet je hiermee rekening houden bij het werken met datums, cijfers na de komma (Een komma wordt niet gebruikt), en functies (WAAR of ONWAAR bestaan niet… Wel TRUE en FALSE). |
Nu we zo ver zijn: plaats uw cursor midden in de code, en druk éénmaal op de functietoets ‘F8’.
Onmiddellijk wordt het venster ‘Lokale Variabelen’ gevuld met uw variabelen. De variabele ‘myValue’ heeft nog steeds de waarde ‘leeg’, en bij type zal je merken dat Excel hier een ‘Variant’ van heeft gemaakt. Een ‘Variant’ kan elk gegevenstype zijn, maar vraagt wel het meeste geheugen van uw computer.
Druk nog 2 maal op de functietoets ‘F8’. De variabele heeft haar eerste waarde gekregen, nml. het getal 1.
De variabele blijft het type ‘Variant’ behouden, maar nu heeft Excel er een Integer van gemaakt. Dit is te merken in de 3de kolom.
Druk nogmaals op ‘F8’, en uw variabele heeft de waarde ‘Ikke’ gekregen. Als type heeft Excel er ditmaal een ‘String’ van gemaakt.
Nogmaals op ‘F8’, en uw variabele krijgt de waarde: 13-Januari-2004. Let op het volgende: Een datum tussen hekjes wordt in VBA als datum herkend. U moet in de VBA-editor de Amerikaanse schrijfwijze hanteren. Dat wil zeggen: Eerst de maand; dan de dag; en daarna het jaar. In het venster ‘Lokale variabelen’ laat Excel u de lokale schrijfwijze zien. En als type heeft ie er een ‘Date’ van gemaakt.
Nogmaals op ‘F8’. Zelfde opmerkingen als in het voorgaande. De punt die jij in de VBA-editor moest gebruiken, wordt hier vervangen door een komma. (Op voorwaarde natuurlijk dat je lokale instellingen dit voorschrijven). Het gegevenstype is voor Excel ditmaal een ‘Double’.
Nogmaals ‘F8’, en de waarde is ‘Waar’, gegevenstype: Boolean.
En tenslotte de laatste variabele: Een ‘Long’.
Druk nu nog eenmaal op ‘F8’ om de macro te beëindigen.
Het voorgaande moet u reeds duidelijk gemaakt hebben dat er verschillende gegevenstypes bestaan. Het is ook van het allergrootste belang dat niet Excel, maar jijzelf deze gegevenstypes declareert. Hierdoor spaar je niet alleen het geheugen, laat je ook de code sneller lopen, en zal Excel u zelfs verder nog helpen bij het schrijven van de code, of het opsporen van fouten.
De verschillende gegevenstypes
|
Gegevenstype |
Geheugenruimte |
Bereik |
|
Byte |
1 byte |
0 tot 255 |
|
Boolean |
2 bytes |
Waar of Onwaar |
|
Integer |
2 bytes |
-32.768 tot 32.768 |
|
Long
(Long integer) |
4 bytes |
-2.147.483.648
tot 2.147.483.647 |
|
Single |
4 bytes |
-3,402823E38 tot -1,401298E-45 voor negatieve waarden; 1,401298E-45 tot 3,402823E38 voor positieve waarden. |
|
Double |
8 bytes |
-1,79769313486232E308 tot -4,94065645841247E-324 voor negatieve waarden; 4,94065645841247E-324 tot 1,79769313486232E308 voor positieve waarden. |
|
Currency |
8 bytes |
-922.337.203.685.477,5808
tot 922.337.203.685.477,5807 |
|
Decimal |
14 bytes |
+/-79.228.162.514.264.337.539.543.950.335 zonder decimale komma; +/- 7,9228162514264337539543950335 met 28 decimalen. |
|
Date |
8 bytes |
1 januari 100 tot 31 december 9999 |
|
Object |
4 bytes |
Elke objectverwijzing |
|
String (variabele lengte) |
10 bytes + 1 byte per teken |
0 tot ongeveer 2 miljard |
|
String (vaste lengte) |
Lengte van de tekenreeks |
1 tot ongeveer 65.400 |
|
Variant (getal) |
16 bytes |
Elke numerieke waarde tot het bereik van een Double |
|
Variant (tekst) |
22 bytes + 1 byte per teken |
Zelfde bereik als bij een string met variabele lengte |
Tot hiertoe heb ik u reeds 2 methodes aan de hand gedaan om het juiste gegevenstype te bepalen. Of je kijkt in het venster ‘Lokale Variabelen’, of je kijkt hier in de tabel. Ik laat hier even het gegevenstype ‘Object’ buiten beschouwing, omdat je de waarde op een andere manier er aan moet toewijzen. Bovendien is het ook steeds handig om hierin iets preciezer te zijn, dan de objecten simpelweg als object te declareren. De gegevenstypes ‘Variant’ kan je eveneens beter buiten beschouwing laten … dit omdat ik nog nooit een situatie ben tegengekomen waarin ik mijn variabele niet kon voorzien van een ander gegevenstype.
Typ nu in de VBA-editor:
Dim myValue As
Onmiddellijk komt Excel met een aantal voorstellen af, waarmee je je variabele kan declareren. Doet Excel dat niet, dan heb je vergeten een vinkje te zetten bij: Extra => Opties => Tabblad ‘editor’ en ‘Autolijstweergave van Leden’. Herlees dan nog maar eens mijn tweede punt: ‘Instellingen in VB’.
Je geeft een waarde aan een variabele met het ‘=’ teken. Dit werkt voor alle hierboven genoemde variabelen met uitzondering van de Objecten.
Getallen kan je gewoon zonder meer toewijzen.
Een Boolean (WAAR of ONWAAR) mag je ook zomaar noteren.
Tekst moet tussen aanhalingstekens staan.
En Datums moeten tussen hekjes staat.
Let steeds op de Amerikaanse schrijfwijze.
Voorbeeld:
Dim
i As Integer
Dim
d As Date
Dim
b As Boolean
Dim
s As String
i
= 1
d
= #1/2/2004#
b
= True
s = "Mijn Tekst"
Opgelet:
Om goed te programmeren moet je elke variabele declareren.
Een fout die ik vaak zie maken is deze:
Dim iNummer1, iNummer2, iNummer3 As
Integer.
Wie denkt hier 3 variabelen van het type Integer gedeclareerd te hebben heeft het flink mis. Neen, je hebt hier 2 variabelen van het type Variant (iNummer1 en iNummer2), en 1 Variabele van het type Integer (iNummer3)
Een juiste schrijfwijze is deze:
Dim iNummer1 As Integer, iNummer2
As Integer, iNummer3 As Integer
Het zal u vermoedelijk ook opgevallen zijn dat er een ‘eigenaardige’ String tussen de mogelijke declaraties zit.
Een String met een vaste lengte??? Hoe bepaal je dat?
Een voorbeeld nog eens:
Dim
sNaam As String * 10
Ik heb hier een tekst gedeclareert met 10 letters. Niet meer en niet minder.
sNaam = “Luc”
Deze variabele krijgt nu de waarde: “Luc “ (Luc met 7 spaties)
sNaam = “Luc Heyndrickx”
En deze variabele krijgt de waarde: “Luc Heyndr”
Wie zelf code schrijft heeft er alle belang bij dat hij en anderen zijn code later nog makkelijk kunnen ontcijferen. De eerste (en belangrijkste) methode is: maak uw code zo kort mogelijk! Vermijd gewoon alle overbodige code, die vooral door de macrorecorder is opgenomen. Maak veelvuldig gebruik van opmerkingen tussen uw code… vooral voor moeilijk te snappen code. Maak voldoende gebruik van variabelen én geef ze een duidelijke zinvolle naam.
Vele programmeurs gebruiken een voorvoegsel voor hun variabelen. Alhoewel dit niet verplichtend is, maakt het de zaak wel duidelijk met welk gegevenstype je aan het werken bent. De volgende lijst geeft een aantal aan te bevelen voorvoegsels.
|
Gegevenstype |
Kort voorvoegsel |
Lang voorvoegsel |
|
Boolean |
f |
bin |
|
Byte |
b |
bit |
|
Currency |
c |
cur |
|
Date |
dt |
dtm of
dat |
|
Double |
d |
dbl |
|
Integer |
i |
int |
|
Long |
l |
lng |
|
Object |
o |
obj |
|
Single |
|
sng |
|
String |
s |
str |
|
Variant |
v |
var |
|
Tip: Gebruik voor de naamgeving van uw variabelen een combinatie van Hoofdletters en kleine letters. Bijvoorbeeld: Dim strMijnNaam As String Bij het schrijven van de code typ je dan constant kleine of hoofdletters. Excel zal de schrijfwijze automatisch aanpassen aan de schrijfwijze van uw declaratie. Verandert Excel deze schrijfwijze niet… dan kan je er zeker van zijn dat uw variabele verkeerd geschreven is. Dit behoedt u onmiddellijk voor dergelijke fouten. |
Een stapje verder nu… Arrays en Collections.
Arrays
Een Array bestaat uit een verzameling variabelen van hetzelfde gegevenstype. U kan het gegevenstype net zoals hiervoor verder specificeren met het juiste type. De aanvulling met al hetgeen hierboven vermeld, is dat je het aantal leden van de Array tussen haakjes moet opgeven.
En omdat voorbeelden vaak meer duidelijk maken dan 100 woorden: meteen maar een voorbeeld.
Dim
iTopTien(9) As Integer
Dim
i As Integer
For
i = 0 To 9
iTopTien(i) = i + 1
Next
Enkele opmerkingen: hier wens ik 10 cijfers te declareren (van 1 tot 10). Toch zet ik maar een 9 tussen de haakjes. Wat zou daar de oorzaak van kunnen zijn?
Dit komt omdat het eerste indexnummer van een Array standaard 0 is. Geen 1 dus. Een Array met als hoogste indexnummer een 9 heeft dus 10 leden.
Hoe worden de waardes van deze Array nu opgehaald? We nemen voorgaand voorbeeld, en voegen daar volgende code aan toe:
MsgBox iTopTien(4)
Dit laat de 5de waarde uit de Array zien.
Deze methode is natuurlijk de meest eenvoudige voorstelling van een Array. Je hebt ook de mogelijkheid om een multidimensionale Array te maken. Een tweedimensionale Array kan je nog het beste vergelijken met een Spreadsheet.
Een tweedimensionale Array kan je dan weer als volgt declareren:
Dim
sArray(3, 3) As String
Deze Array geeft u een
verzameling van 4 x 4. Bij het vullen
van de Array moet je opeenvolgend het eerste én het tweede indexnummer
opgeven. Volgende macro zal u dit
duidelijk maken:
Sub
test()
Dim sArray(3, 3) As String
Dim i As Integer
Dim y As Integer
‘ Het vullen van de Array
For i = 0 To 3
sArray(i, 0) = "Noord" &
i + 1
sArray(i, 1) = "Oost" &
i + 1
sArray(i, 2) = "Zuid" &
i + 1
sArray(i, 3) = "West" &
i + 1
Next
‘ De test: de Array wordt in het werkblad weggeschreven.
For i = 1 To 4
For y = 1 To 4
Cells(i, y).Value = sArray(i - 1,
y - 1)
Next
Next
End Sub
Natuurlijk hoef je je
Array niet te beperken tot 2 dimensies.
Je kan makkelijk véél meer dimensies aan. Het volgende voorbeeld is een Array met 3 dimensies. Om deze uit te voeren heb je een bestand
nodig met 3 werkbladen. Het is ook de
laatste multidimensionele Array die ik nog visueel kan voorstellen.
Sub test()
Dim iArray(2, 3, 3) As Integer
Dim i As Integer
Dim y As Integer
Dim x As Integer
For i = 0 To 2
iArray(i, 0, 0) = i + 1
For y = 1 To 3
For x = 1 To 3
iArray(i, y, x) = y & x
Next
Next
Next
For i = 0 To 2
With Sheets(iArray(i, 0, 0))
For y = 1 To 3
For x = 1 To 3
.Cells(x, y).Value = iArray(i, x, y)
Next
Next
End With
Next
End Sub
Tot hiertoe hebben we
enkel nog maar Arrays gezien met een vaste lengte. Het is echter niet mogelijk op deze manier een Array te maken met
een variabele lengte. Dit werkt dus
niet:
Dim
iArray(InputBox("Hoe groot moet de Array zijn?")) As String
De oplossing voor dit
probleem vind je in de sleutelwoorden: ReDim en Preserve.
Met ReDim kunt u tijdens
het uitvoeren van de macro de Array van afmetingen voorzien, terwijl het
gereserveerde woord Preserve de waarden van een Array moet bewaren.
Het voorgaande ‘foutieve’
voorbeeld zal dus in praktijk zo moeten worden geschreven:
Dim
iArray() As String
ReDim Preserve
iArray(InputBox(“Hoe groot moet de Array zijn?”))
Of iets meer uitgewerkt:
Sub
test()
Dim i As Integer
Dim iArray() As String
ReDim Preserve iArray(InputBox("Hoe groot moet de Array zijn?"))
For i = LBound(iArray) To UBound(iArray)
iArray(i) = InputBox("Voer een naam in voor
Array(" & i & ")")
Next
End Sub
Let hier ook even op de
sleutelwoorden: LBound en UBound, waarmee ik de hoogste en laagste waarde uit
de Array ophaal.
Collections
Nog een methode om met
verzamelingen om te gaan is door gebruik te maken van Collections. Enkele grote verschillen met Arrays:
Even een kort voorbeeld
van een Collectie met één lid:
Sub
test()
Dim c As New Collection
c.Add "Luc"
MsgBox c(1)
End Sub
Een Collection wordt dus
gedeclareerd als New Collection.
Verder worden er leden
aan de Collection toegevoegd met de methode ‘Add’.
En de leden worden terug
opgevraagd via het indexnummer.
De standaard-methode voor
een collection is de methode Item.
Bijgevolg zijn volgende codes identiek:
c(1)
c.Item(1)
In tegenstelling tot een
Array is het ook zeer eenvoudig om een lid uit een Collection te
verwijderen. Dit gaat met de methode
Remove. Weer een voorbeeld om het
duidelijk te maken:
Sub
test()
Dim c As New Collection ‘Declaratie van Collectie
Dim i As Integer ‘Integer om te tellen
Dim sCol As String ‘ String om de Collectie zichtbaar
te maken
‘ Het ophalen van de waardes voor de Collectie
For i = 1 To 10
c.Add i
Next
‘ Eerst tellen van het aantal leden van de Collectie,
‘ En vervolgens een tekststring maken om de
Collectie zichtbaar te maken.
For i = 1 To c.Count
sCol = sCol & c(i) & vbNewLine
Next
MsgBox sCol
‘ Verwijderen van het 6de lid van de Collectie
c.Remove (6)
sCol = ""
‘ De tekststring van de Collectie opnieuw samenstellen
For i = 1 To c.Count
sCol = sCol & c(i) & vbNewLine
Next
MsgBox sCol
End Sub
Wat is nu nog meer
mogelijk met een Collection?
Bekijken we even de
eerste methode van een Collection. Dit
is de methode Add. Het eerste
argument dat hiervoor moet worden opgegeven is verplicht. Dit argument geeft aan welk item aan de
collectie moet worden toegevoegd. We
hebben echter ook de mogelijkheid om een tweede, en zelfs een derde argument
aan de methode toe te voegen.
Het tweede argument is de
key. Hiervoor kan je een unieke
tekenreeksexpressie opgeven, die i.p.v. een positionele index kan gebruikt
worden. Indien je tracht een dubbele
tekenreeksexpressie toe te voegen, krijg je een fout. Volgende macro zou dit moeten duidelijk maken. Ik tracht een Collectie te vullen met 100
waardes. Ik zorg er echter voor dat de
key enkel om de 10 items een andere waarde krijgt. Gevolg: Van de 100 waardes schieten er maar 10 meer over. Let er ook op dat ik hiervoor bovenaan de
instructie:
On
Error Resume Next
moet zetten. Anders loopt de macro onherroepelijk vast.
Sub
test()
On Error Resume Next
Dim c As New Collection
Dim i As Integer
For i = 1 To 100
c.Add "Item" & i, “it”
& Int(i / 10)
Next
For i = 1 To c.Count
MsgBox c(i)
Next
End Sub
Bovenstaande macro vult
de Collection met waarden zoals: Item1; Item10; Item20 enz.
De key’s hebben namen
als: it0; it1; it2 enz.
Je kan de Leden van de
Collectie ook opvragen aan de hand van deze key.
Vervang bijvoorbeeld de MsgBox c(i) eens door:
MsgBox
c(“it6”)
Na uw variabelen
gedeclareerd te hebben als waarde, of verzameling, kan je uw variabele ook nog
declareren als Object. Ik raad u aan om
hier niet willekeurig steeds te declareren als object, of zelfs als Variabele,
maar ook hier uit te zoeken welk het juiste type is wat je voor je object kan
gebruiken.
De juiste syntaxis voor het
declareren van uw objectvariabelen is als volgt:
Dim myObject
As Type ‘Type
moet hier uiteraard vervangen worden door het juiste type
Set myObject =
….. ‘En hier vul je het juiste Object
in.
Het juiste Object
toewijzen aan uw variabele gaat dus steeds met het sleutelwoordje: Set.
Het meest gebruikte
Object is wellicht het Object ‘Range’.
|
Test Om even te bewijzen dat hetgeen ik in het begin gezegd heb geen larie en apekool is, stel ik voor om even een test te nemen. Herinner u dat ik voorgesteld heb om in de VB-editor via Extra => Opties=> tabblad ‘editor’ elke optie aan te vinken. Herinner u ook dat ik gezegd heb dat door uw variabelen goed te declareren Excel u zelfs een handje helpt bij het schrijven van de code. Daarjuist nog heb ik u de raad gegeven om niet elk object als Object te declareren. We schrijven dus eerst de code, waarin we ons Object wél als Object declareren. (Typ volgende code in de VB-editor. NIET PLAKKEN) Sub test() Dim
obj As Object Set
obj = Range("A1:A10") obj.Select End
Sub Deze code werkt! Ik heb het veel gebruikte Object ‘Range’ als Object gedeclareerd. Daarna heb ik een waarde (Range) aan het object toegewezen, en vervolgens dit object geselecteerd. Excel heeft u echter nooit echt geholpen bij het schrijven van de code. Op het ogenblik dat je de laatste maal obj. typte, heeft Excel na dat punt geen keuzelijst laten zien van alle mogelijke eigenschappen en methoden. Typ nu volgende code in de VB-editor: Sub
test() Dim
obj As Range Set
obj = Range("A1:A10") obj.Select End
Sub Indien je ook dit hebt getypt, zal je bij het laatste punt onmiddellijk het verschil merken. |
Welk zijn nu de andere
veelgebruikte Objecten?
Hiermee zijn de
belangrijkste Objecten genoemd. Vergeet
echter niet dat deze lijst enkel het topje van de ijsberg is. Er zijn nog objecten voor ‘afbeeldingen’;
‘Pivot-onderdelen’; Grafieken; CommandBars; CommandBars-Buttons; FileSearch; en zelfs de assistent. Indien ik de mogelijkheid niet zou hebben
mijn objecten correct te benoemen, zou het me zelf al veel moeilijker vallen om
goede code te schrijven.
|
Tip: Weet je niet juist welk type uw variabele is? Benoem uw variabele dan tijdelijk niet (Gewoon zo: Dim x). Doorloop daarna de code via de F8 toets, en houd het venster ‘Locale Variabelen’ in het oog. Excel zal zelf wel bepalen welk gegevenstype je in handen hebt. |
Tot hiertoe heb ik het
enkel gehad over Variabelen.
Gegevenstypes die in de loop van de macro van waarde kunnen wisselen.
Het zou echter kunnen dat een variabele tijdens het uitvoeren van de macro niet
meer moet veranderen, maar dit in de toekomst wel eens zou moeten kunnen.
Stel dat je de naam van
uw bedrijf regelmatig in de macro moet gebruiken. De naam van uw bedrijf verandert vermoedelijk niet zo snel… maar
het zou kunnen. Ook wanneer je je macro
aan anderen doorgeeft.
Volgende code kan je
gebruiken voor een dergelijk geval:
Const
SBEDRIJFSNAAM As String = “Mijn Bedrijfje”
Een veel gehanteerde
regel bij het benoemen van Constanten, is het gebruik van hoofdletters. Dit maakt het onderscheid tussen gewone
variabelen makkelijker. Dergelijke
constanten zijn makkelijk in de code aan te passen indien de omstandigheden
wijzigen. Veel makkelijker dan de hele
code doorlopen op zoek naar de string: “Mijn Bedrijfje”.
Nu we (hopelijk) onze
variabelen correct kunnen declareren, wordt het tijd om ook eens naar het bereik
van deze variabelen te kijken.
Omwille van dezelfde
redenen als waarom we onze variabelen zo klein mogelijk moeten declareren, is
het ook hier van belang om het bereik van de variabelen zo klein mogelijk te
houden. Natuurlijk is het makkelijk om
er een gewoonte van te maken onze variabelen een zo groot mogelijk bereik te
geven. Dan kunnen we ze altijd, en
overal gebruiken. Bovendien moeten we
ons nooit meer zorgen maken waar de variabelen te declareren. Toch is dit geen goede methode. Om het geheugen van ons systeem te sparen is
het altijd nuttiger het bereik van de variabelen zo klein mogelijk te
houden. Hoe minder geheugen een
procedure vraagt, hoe sneller ze wordt uitgevoerd.
Een variabele op
procedureniveau
Het kleinste bereik: een
variabele die enkel bruikbaar is binnen de procedure (Sub) waarbinnen ze
gedeclareerd is. Deze variabele plaats
je net onder de Sub. Maak er ook een
goede gewoonte van al uw variabelen samen te declareren, vlak onder de Sub, en
niet willekeurig tussen de procedure door.
Dit maakt uw code duidelijker, en geeft meer orde.
Een voorbeeld van zulk
een variabele:
Sub Test()
Dim sMijnNaam As String
sMijnNaam = “Luc”
MsgBox “Hallo” & sMijnNaam
End
Sub
Je kan nu de variabele
sMijnNaam gebruiken zolang de proceduren ‘Test’ loopt. Maar dan wel met die beperking dat die
variabele binnen die procedure gebruikt wordt, en niet binnen een andere
procedure.
Dit zal bijvoorbeeld niet
werken:
Sub
test()
Dim sMijnNaam As String
sMijnNaam = "Luc"
Call GebruikVariabele
End Sub
Private Sub
GebruikVariabele()
MsgBox sMijnNaam
End Sub
Zelfde procedure nu, maar
de variabele is gedeclareerd binnen de tweede procedure. En dat werkt wel.
Sub
test()
Call GebruikVariabele
End Sub
Private Sub
GebruikVariabele()
Dim
sMijnNaam As String
sMijnNaam = "Luc"
MsgBox sMijnNaam
End Sub
Nota: de variabele
verliest zijn waarde bij het beëindigen van de procedure.
Een variabele op
Moduleniveau
De volgende stap is een
variabele die zijn waarde behoud voor alle procedures die binnen één module
staan.
Om een variabele zijn
waarde te laten behouden binnen één module, dient u de variabele te declareren
bovenaan alle Sub’s. In tegenstelling
tot de vorige variabele (de variabele op procedureniveau), verliest deze variabele
zijn waarde niet na het beëindigen van de procedure.
Weerom een
voorbeeld. Plaats in één module
volgende macro’s. (Let er op dat je
geen 2x na elkaar ‘option Explicit’ zet)
Option
Explicit
Dim sMijnNaam
As String
Sub
GeefWaarde()
sMijnNaam = "Luc"
End
Sub
Sub
test1()
MsgBox sMijnNaam
End Sub
Maak daarna een nieuwe
module, en plaats daarin deze macro:
Sub
test2()
MsgBox sMijnNaam
End
Sub
Vervolgens voer je eerst
de macro: ‘GeefWaarde’ uit. En daarna
achtereenvolgens ‘test1’ en ‘test2’.
‘test1’ werkt zonder problemen.
‘test2’ zal een foutmelding geven.
Dat komt omdat de variabele gedeclareerd is in een andere module.
Public-variabelen
Het grootste bereik
hebben de Public-variabelen. Deze
variabelen (Of constanten) kunnen in alle procedures gebruikt worden, ongeacht
of ze zich in dezelfde module bevinden als waarin de variabele is gedeclareerd,
of elders. Public-variabelen behouden
hun waarde zolang het bestand is geopend.
Public-variabelen worden altijd gedeclareerd in het modulegebied
‘Algemene Declaraties’. Dit is dus in
een module boven alle Sub’s.
We nemen opnieuw het
voorgaande voorbeeld (Met de foute procedure), maar we declareren de variabele
nu als Public.
De eerste module:
Option
Explicit
Public
sMijnNaam As String
Sub
GeefWaarde()
sMijnNaam = "Luc"
End
Sub
Sub
test1()
MsgBox sMijnNaam
End Sub
En de tweede module:
Sub
test2()
MsgBox sMijnNaam
End
Sub
Nadat je de macro
‘GeefWaarde’ hebt uitgevoerd, zal je merken dat alle andere procedures ook
werken.
Een constante declareer
je dan weer zo:
Public Const
SMIJNBEDRIJF As String = “Mijn Bedrijfje”
Dit hier heeft nog weinig
te maken met variabelen. Toch wens ik
het er bij te vermelden, vermits je met volgende methode variabelen op
module-niveau en public-variabelen kan vermijden.
We nemen opnieuw
voorgaande macro’s, maar ditmaal verwijderen we de declaratie, en schrijven de
macro zo:
Module 1:
Sub
GeefWaarde()
test1 "Luc"
Test2 "Luc 2"
End
Sub
Sub
test1(sMijnNaam As String)
MsgBox sMijnNaam
End Sub
En in module 2:
Sub
Test2(sMijnNaam As String)
MsgBox sMijnNaam
End Sub
Voer nu enkel de macro:
‘GeefWaarde’ uit. Via deze macro worden
de argumenten doorgegeven aan ‘test1’ en ‘test2’. De truc zit hem in de argumenten die tussen haakjes staan in
test1 en Test2.
Deze methode zal je
vooral veel zien in functies. Een functie aanvaardt niet alleen
argumenten, hij geeft ook waardes terug.
Als voorbeeld geef ik
hier een functie die de letters van een naam telt. Uiteraard is hier geen extra functie voor nodig, omdat dit zo
eenvoudig is. Toch gebruik ik deze
functie, omdat ik aan de hand hiervan goed kan illustreren wat ik wil zeggen.
Function
TelLetters(sNaam As String) As Integer
TelLetters = Len(sNaam)
End
Function
Sub
TestTelLetters()
MsgBox TelLetters("Luc Heyndrickx")
End Sub
Let hier even op de
declaraties binnen de Functie.
Tussen de haakjes wordt
een String (tekst) verwacht. Dit is het
argument dat aan de functie wordt doorgegeven.
Na de haakjes declareer
ik de zaak als Integer. Dat wil zeggen
dat de functie een geheel getal zal teruggeven als resultaat.
Tot zover de
uiteenzetting over variabelen.