Аргумент за функция на Excel VBA ByVal
ByVal е изявление във VBA. ByVal означава By Value, т.е. когато подпроцедурата, извикана от процедурата, стойността на променливите се нулира до новата стойност от новата процедура, извикана.
В VBA, когато работим с функции, които са извикани в различни функции, има определени обстоятелства, че стойността за оригиналния аргумент се променя, когато функцията се извиква; изявлението byval забранява процедурата или кода, променящи стойността на аргумента.
Знам, че не е лесно да се разбере, като прочетете обяснението, но с практически примери за функция всъщност можем да разберем по-добре.

Как да използвам аргумента ByVal във VBA?
Пример # 1
Например погледнете кодовете по-долу VBA.
Код:
Sub Macro1 () Dim k As Integer k = 50 Macro2 k MsgBox k End Sub
Sub Macro2 (ByVal k As Integer) k = k + 5 End Sub

В горните две макропроцедури имаме обща променлива „k“ между процедурите. Нека да обясня това подробно, преди да видим резултата.
В първия макрос сме присвоили стойността 50 на променливата „k.“
Dim k As Integer k = 50
След това извикахме втората макро процедура от първия макрос.
Макро2 k
В Macro2 възстановихме стойността на променливата на k = k + 5. В този макрос използвахме аргумента ByVal, за да присвоим стойността на променливата „k“.
Сега, за да разберем „ByVal“, нека пуснем кода на VBA ред по ред, като натиснем клавиша F8.
# 1 - При първо натискане на клавиша F8, той ще маркира първия ред на Macro1.

В този момент от време поставете курсор върху променливата „k“ и тя трябва да показва стойността на променливата „k“.

В момента стойността на „k“ е нула.
# 2 - Натиснете клавиша F8 още веднъж и той ще премине към третия ред.

Дори сега стойността на „k“ все още е нула.
# 3 - Натиснете клавиша F8 сега и вижте стойността на k.

Тъй като стойността “k” е зададена на 50 и кодът се изпълнява и така стойността се показва като 50.
# 4 - Сега маркираният ред е „Macro2 k“, т.е., като натиснете клавиша F8, той ще премине към втората процедура, Macro2.

# 5 - Дори сега стойността на променлива „k“ в тази процедура също се показва като 50. Но вътре в този макрос ние нулираме стойността на променливата „k“ като k = k + 5, т.е. 55. Сега натиснете Клавиш F8 още два пъти.

Както можете да видите по-горе, стойността на „k“ е 55 сега.
# 6 - Натиснете клавиша F8 и той ще се върне към процедурата Macro1.

Когато макросът се върне към първоначалната процедура Macro1, стойността на нашата променлива „k“ вече не е 55, а първоначалната стойност в тази процедура, т.е. 50.
Когато натиснете клавиша F8, можем да видим само 50 в полето за съобщения във VBA.

И така, както казахме в началото на статията аргументът „ByVal“ не носи стойности от една процедура към друга, въпреки че носи стойността на променливата от първия макрос към втория към момента, в който срещне реда “ ByVal ”, когато се върне към оригиналния макрос, той нулира стойността до първоначалната стойност само в процедурата.
Пример # 2
Сега погледнете по-долу два макроса.
Код:
Sub P1 () Dim k As Integer: k = 10 Call P2 (k) MsgBox k End Sub
Sub P2 (ByVal k As Integer) k = 15 Край Sub

- Това е подобно на първия пример. В макроса „P1“ присвоихме стойността 10 на променливата „k“, а в същия макрос „P1“ нарекохме втория макрос „P2“ с променлива „k“.
- Във втория макрос „P2“ използвахме аргумента ByVal и този път стойността на променлива „k“ е 15.
Този макрос носи стойността на променлива „k“ като десет от макрос „P1“ до макрос „P2“ и в този макрос стойността ще бъде нулирана на 15, но в момента, в който се върне, за да завърши макроса към първия макрос “P1” стойността на “k” обратно на 10, а не на 15.

Неща за запомняне
Аргументът ByVal не засяга стойността на променливата дори след стартиране на макроса, но с аргумента By Ref можем да пренесем стойността на променливата от един макрос в другия.