End Function

End Sub

Функции

End Sub

End Sub

End Sub

End Sub

Sub ChangeName2(ByRef NewName)

NewName = "Петр"

Такая конструкция используется в том случае, когда одна и та же подпрограмма вызывается для разных переменных.

При передаче аргумента по значению сама передаваемая переменная в подпрограмму не попадает. Поэтому изменения, внесенные в нее в вызванной программе, не скажутся на ее значении в вызвавшей программе. Передача по значению аналогична передаче по ссылке, только в этом случае используется ключевое слово ByVal.

Sub ПередачаАргументаПоЗначению ()

Dim UserName As String

UserName = "Иван"

ChangeName3 UserName

MsgBox "В исходной программе имя осталось прежним " _

& UserName

Sub ChangeName3(ByVal UserName)

MsgBox "Сначала был " & UserName & "."

UserName = "Петр"

MsgBox "В вызванной подпрограмме имя стало " & UserName

Исходное значение UserName передано в подпрограмму ChangeName3 и выведено на экран. Затем оно изменяется и снова выводится на экран во втором информационном окне. Поскольку аргумент был передан в ChangeName3 по значению, исходная переменная UserName после возвращения управления в ПередачаАргументаПоЗначению не изменяется, о чем и свидетельствует окно, выводимое на экран в последней строке этой программы.

Мы уже говорили, что программы VBA делятся на два вида — подпрограммы и функции. До сих пор в этой главе мы обсуждали подпрограммы, и вот теперь черед функций.

Функции и подпрограммы имеют всего три основных отличия.

  • Функция начинается ключевым словом Function и заканчивается ключевыми словами EndFunction.
  • Функцию можно вызывать из формулы, введенной в ячейку.
  • Функция может возвращать значение в вызывающую программу или формулу.

Рассмотрим пример функции Multiply, вычисляющей произведение двух чисел.

Sub ВызовФункции()

Dim Var1 As Integer

Dim Var2 As Integer

Dim Var3 As Integer

Var1 =5

Var2 = 10

Var3 = Multiply(Var1, Var2)

MsgBox Var3

Function Multiply(ByVal Var1, ByVal Var2)

Multiply = Var1 * Var2

Обратите внимание на строку 2 функции Multiply — в ней значение произведения двух чисел присваивается имени функции. Как раз через него вычисленное значение возвращается в вызывающую программу.

Примечание Определять тип аргументов функции и возвращаемого ею значения можно в описании функции, как показано ниже.

Function Multiply (ByVal Var1 As Integer, _

ByVal Var2 As Integer)

Если Вы не укажете тип функции и ее аргументов, им будет присвоен тип по умолчанию (Variant).

Вы, вероятно, обратили внимание на любопытную особенность вызова функции Multiply — он указан в правой части оператора присваивания, в левой части которого помещена переменная Var3. При этом список аргументов — Varl и Var2 — заключен в круглые скобки. Эти переменные передаются в функцию Multiply, а возвращаемое ею значение присваивается переменной Var3. Взгляните на предыдущие примеры: при вызове подпрограммы передаваемые в нее аргументы в скобки не заключаются. Запомните следующие основные правила передачи аргументов в подпрограммы и функции.