Procedures kunnen 0, 1 of meerdere invoerparameters. Deze parameters kunnen op twee manieren van de oproepende procedure naar de functie of subroutine worden doorgegeven: via de waarde (ByVal) of via referentie (ByRef). Het onderscheid tussen deze twee parameter 'passing' mechanismen is cruciaal.

Probeer bijvoorbeeld eens te voorspellen wat de output zal zijn van het volgende algoritme. U kunt het uittesten met dit werkboek. Klik hier om de output te weten.

Option Explicit
Sub test()
    Dim x As Byte
    x = 5
    Call doeIets(x)
    MsgBox x
End Sub

Sub doeIets(y As Byte)
    y = y + 1
End Sub

Parameter passing: ByVal

Sub test1()
  Dim x As Integer
  x = 5
  Call proc_byVal(x)
  MsgBox x
End Sub



Sub proc_byVal(ByVal y As Integer)
  y = y * 2
End Sub

 

De output van de procedure test1 is het getal 5. Dit komt omdat de variabele x doorgegeven is By Value. Dit wil zeggen dat de waarde van de variabele x is doorgegeven aan de procedure proc_ByVal en niet een referentie naar de variabele (of het adres van de variabele). In het PSD geven we dit aan door een ander symbool te gebruiken voor de invoerparameter. Opgepast: in de VBA-code hoeft dit niet. Zelfs indien we x als symbool zouden nemen voor de invoerparameter is de variabele x in de procedure proc_ByVal een andere variabele dan de x uit de procedure test1. Enkel het sleutelwoord ByVal is van belang hier.

Parameter passing: ByRef

Sub test2()
  Dim x As Integer
  x = 5
  Call proc_byRef(x)
  MsgBox x
End Sub



Sub proc_byRef(ByRef x As Integer)
  x = x * 2
End Sub

 

De output van de procedure test2 is gelijk aan 10. Dit komt doordat de variabele x doorgegeven is als referentie. Met andere woorden, de procedure proc_ByRef ontvangt eigenlijk een referentie of adres van de variabele x. Iedere bewerking op deze variabele zal ook merkbaar zijn in de procedure test2. In het PSD trachten we dit aan te geven door hetzelfde symbool te gebruiken; namelijk x. Opgepast: in VBA is dit echter niet nodig. Door het kernwoord ByRef is er een koppeling tussen de variabele x in de oproepende procedure en de gebruikte variabele (ongeacht het symbool) in de subroutine.

U kunt dit makkelijk uitproberen door de macro's test1 en test2 van het werkboek parameter.xls uit te voeren. Indien u de stap-methode gebruikt en het venster Lokale variabelen zichtbaar maakt, ziet u ook welke waarden de verschillende variabelen aannemen.

De standaardinstelling voor Excel VBA is ByRef. In de nieuwe Visual Basic.net is het echter veranderd naar ByVal. Het is een goede gewoonte om expliciet het 'parameter passing' mechanisme op te geven. De voorkeur verdient ByVal, zeker bij het gebruik van functies.

©  H. Schouppe
Laatste wijziging: 2004-05-12