Excel VBA ByVal-functieargument
ByVal is een statement in VBA. ByVal staat voor By Value, dwz wanneer de subprocedure die vanuit de procedure wordt aangeroepen, de waarde van de variabelen wordt gereset naar de nieuwe waarde van de nieuwe aangeroepen procedure.
Als we in VBA werken met functies die in verschillende functies worden aangeroepen, zijn er bepaalde omstandigheden dat de waarde voor het oorspronkelijke argument wordt gewijzigd wanneer de functie wordt aangeroepen; de instructie byval verbiedt de procedure of de code om de waarde voor het argument te wijzigen.
Ik weet dat het niet gemakkelijk te begrijpen is door de uitleg te lezen, maar met praktische voorbeelden van functies kunnen we het eigenlijk beter begrijpen.

Hoe ByVal Argument in VBA te gebruiken?
Voorbeeld 1
Bekijk bijvoorbeeld de onderstaande VBA-codes.
Code:
Sub Macro1 () Dim k As Integer k = 50 Macro2 k MsgBox k End Sub
Submacro2 (ByVal k As Integer) k = k + 5 End Sub

In de bovenstaande twee macro-procedures hebben we een gemeenschappelijke variabele "k" voor alle procedures. Laat me dit in detail uitleggen voordat we het resultaat zien.
In de eerste macro hebben we de waarde 50 toegewezen aan de variabele 'k'.
Dim k als geheel getal k = 50
Vervolgens hebben we de tweede macro-procedure aangeroepen vanaf de eerste macro.
Macro2 k
In de Macro2 hebben we de waarde van de variabele gereset naar k = k + 5. In deze macro hebben we het ByVal-argument gebruikt om de waarde toe te wijzen aan de variabele "k".
Om "ByVal" te begrijpen, laten we de VBA-code regel voor regel uitvoeren door op F8 te drukken.
# 1 - Door eerst op de F8-toets te drukken, wordt de eerste regel van Macro1 gemarkeerd.

Plaats op dit moment een cursor op de variabele 'k' en deze zou de waarde van de variabele 'k' moeten weergeven.

Op dit moment is de waarde van "k" nul.
# 2 - Druk nog een keer op de F8-toets en het springt naar de derde regel.

Zelfs nu is de waarde van "k" nog steeds nul.
# 3 - Druk nu op de F8-toets en zie de waarde van de k.

Omdat de "k" -waarde is ingesteld op 50 en de code wordt uitgevoerd, wordt de waarde weergegeven als 50.
# 4 - Nu is de gemarkeerde regel "Macro2 k", dwz door op de F8-toets te drukken, springt u naar de tweede procedure, Macro2.

# 5 - Zelfs nu wordt de waarde van variabele "k" in deze procedure ook weergegeven als 50. Maar binnen deze macro stellen we de waarde van de variabele "k" opnieuw in als k = k + 5 dwz 55. Druk nu op de F8-toets nog twee keer.

Zoals u hierboven kunt zien, is de waarde van "k" nu 55.
# 6 - Druk op de F8-toets en het springt terug naar de Macro1-procedure.

Toen de macro terugging naar de oorspronkelijke procedure Macro1, is onze variabele "k" -waarde niet langer 55, maar de oorspronkelijke waarde in deze procedure, dwz 50.
Wanneer u op de F8-toets drukt, kunnen we slechts 50 zien in het berichtvenster in VBA.

Dus, zoals we aan het begin van het artikel hebben verteld, draagt het "ByVal" -argument geen waarden van de ene procedure naar de andere, ook al draagt het de waarde van de variabele van de eerste macro naar de tweede op het moment dat het de regel " ByVal ”wanneer het terugkeert naar de originele macro, wordt de waarde alleen in de procedure teruggezet naar de originele waarde.
Voorbeeld 2
Bekijk nu de onderstaande twee macro's.
Code:
Sub P1 () Dim k As Integer: k = 10 Call P2 (k) MsgBox k End Sub
Sub P2 (ByVal k As Integer) k = 15 End Sub

- Dit is vergelijkbaar met het eerste voorbeeld. In de macro 'P1' hebben we de waarde 10 toegewezen aan de variabele 'k' en in dezelfde macro 'P1' hebben we de tweede macro 'P2' met variabele 'k' genoemd.
- In de tweede macro "P2" hebben we het ByVal-argument gebruikt, en deze keer is de waarde van variabele "k" 15.
Deze macro heeft de waarde van variabele "k" als tien van macro "P1" tot macro "P2", en in deze macro wordt de waarde gereset naar 15, maar op het moment dat het terugkomt om de macro te beëindigen, wordt de eerste macro uitgevoerd "P1" de waarde van "k" terug naar 10, niet 15.

Dingen om te onthouden
Het ByVal-argument heeft geen invloed op de waarde van de variabele, zelfs niet nadat de macro is uitgevoerd, maar met het By Ref-argument kunnen we de waarde van de variabele van de ene macro naar de andere overbrengen.