Variabelen in Excel VBA

Variabelen

Wat werkt… en is fout?

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.

Instellingen in VB.

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.

Het venster ‘Lokale Variabelen’

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. 

  1. De eerste kolom zal de expressie tonen.  Dat zal in de eerste plaats: ‘Module1’ zijn… of een andere module waar je op dat ogenblik toevallig mee werkt.  En op de tweede plaats komt ‘myValue’, of de variabele die je tijdens het uitvoeren van de code hebt gedeclareerd.
  2. De tweede kolom toont de waarde van uw variabelen.  Dit is een zeer handig hulpmiddel bij het controleren van uw code, en bij het zoeken naar fouten.
  3. De derde kolom toont het type van uw variabelen.  Vermits we bij deze variabele geen type hebben opgegeven zal dit steeds een Variant zijn.  Maar Excel zal ook het meest voordelige gegevenstype laten zien in deze kolom.  Hou het dus in de gaten.

 

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.

De verschillende gegevenstypes

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”

De naamgeving van Variabelen

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.

 

 

Arrays en Collections  

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:

  1. De grootte van een Collection moet niet op voorhand bepaald zijn
  2. De leden van een Collection kunnen van een verschillend gegevenstype zijn.
  3. Een Collection heeft steeds als gegevenstype een Variant.  Dat wil dus zeggen dat ie meer geheugen vraagt.
  4. De index van de leden van een Collection begint niet met 0, maar met 1

 

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

Objecten

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

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

  1. Als eerste Object kan je al het Object ‘Application’ benoemen.  Echt veel nut heeft dit niet, maar door het object Application aan een variabele toe te wijzen, kan je dit object wel verkennen in het venster ‘Locale Variabelen’
  2. Als tweede Object kan je het ‘WorkBook’ zelf benoemen.   Bedenk dat doordat je de juiste instellingen in Excel hebt aangebracht, je steeds een keuzelijst krijgt, na het typen van het sleutelwoordje ‘As’.  Dat maakt het vaak al zeer makkelijk om het juiste gegevenstype te selecteren.
  3. Het derde Object is de ‘WorkSheet’.
  4. ‘Range’ … hier hadden we het al over.  Vermoedelijk het meest gebruikte Object.

 

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.

 

Constanten

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

Het bereik van Variabelen en Constanten.

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”

Argumenten doorgeven aan andere macro’s en functie’s

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.

Dit bericht werd geplaatst in VBA. Bookmark de permalink .

Plaats een reactie