VBA ByVal - Как да използвам аргумента на функцията ByVal? (Примери)

Аргумент за функция на 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 можем да пренесем стойността на променливата от един макрос в другия.

Интересни статии...