Пользовательские подпрограммы и модули

Как вы уже могли заметить, код всех примеров из предыдущих глав нужно было размещать внутри специальной конструкции Sub...End Sub. Если кода не так много, то этим способом достаточно пользоваться и в дальнейшем. Однако, при увеличении количества кода получается длинная "лапша" с часто повтряющимися фрагментами кода. Такой код становится сложно поддерживать и модифицировать в дальнейшем. Чтобы упростить программу код делят на отдельные, логически законченные фрагменты, называемыми подпрограммами, и распределяют по отдельным файлам, которые называются модулями.

В языке VBA подпрограммы делятся на два типа: процедуры и функции. Основное отличие между этими типами заключается в способе вызова и возвращаемом значении. Процедуры просто выполняют код и ничего не возвращают, а функции выполняют код и дополнительно возвращают значение в точку вызова. В предыдущих главах мы уже не один раз использовали встроенные функции языка VBA, например, с помощью функции Len() получали количество символов в строке. В этой главе мы рассмотрим создание пользовательских подпрограмм, которые позволят уменьшить избыточность программного кода и повысить его структурированность.

Создание процедуры и ее вызов

Процедура — это именованный фрагмент кода, который можно вызвать из любого места программы. Процедура описывается с помощью ключевого слова Sub по следующей упрощенной схеме:

Sub <Имя процедуры>([<Параметры>])
   <Тело процедуры>
End Sub

Имя процедуры должно быть уникальным идентификатором, состоящим из букв, цифр и знаков подчеркивания, причем имя процедуры обязательно должно начинаться с буквы. Регистр символов в названии процедуры не имеет значения.

После имени процедуры в круглых скобках можно указать один или несколько параметров через запятую. Если процедура не принимает параметры, то просто указываются круглые скобки. Параметры описываются по следующей упрощенной схеме:

<Имя параметра1> [As <Тип>][, ..., <Имя параметраN> [As <Тип>]]

В качестве примера создадим две процедуры (листинг 9.1).

Листинг 9.1. Определения процедур

' Пример процедуры без параметров
Sub PrintOK()
   MsgBox "Сообщение при удачно выполненной операции"
End Sub

' Пример процедуры с параметром
Sub Еcho(Msg As String)
   MsgBox Msg
End Sub

Вызвать процедуру можно следующими способами:

  • если процедура не принимает параметров, то указывается только имя процедуры;
  • если процедура принимает параметры, то после имени процедуры указываются значения через запятую.

Вызвать процедуры из листинга 9.1 можно способами, указанными в листинге 9.2.

Листинг 9.2. Вызов процедур

PrintOK           ' Вызываем процедуру без параметров
Еcho "Сообщение"  ' Вызываем процедуру с параметром

Существует альтернативный способ вызова процедуры. В этом случае перед именем процедуры указывается ключевое слово Call. Вызвать процедуру можно так:

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

Вызвать процедуры из листинга 9.1 можно способами, указанными в листинге 9.3.

Листинг 9.3. Вызов процедур с помощью ключевого слова Call

Call PrintOK           ' Вызываем процедуру без параметров
Call PrintOK()         ' Вызываем процедуру без параметров
Call Еcho("Сообщение") ' Вызываем процедуру с параметром

Создание функции и ее вызов

Функция — это именованный фрагмент кода, который можно вызвать из любого места программы. В отличие от процедуры функция всегда возвращает какое-либо значение в точку вызова функции. Функция описывается с помощью ключевого слова Sub по следующей упрощенной схеме:

Function <Имя функции>([<Параметры>]) [As <Тип>]
   <Тело функции>
   <Имя функции> = <Возвращаемое значение>
End Function

Имя функции должно быть уникальным идентификатором, состоящим из букв, цифр и знаков подчеркивания, причем имя функции обязательно должно начинаться с буквы. Регистр символов в названии функции не имеет значения.

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

<Имя параметра1> [As <Тип>][, ..., <Имя параметраN> [As <Тип>]]

Инструкция <Имя функции> = <Возвращаемое значение> позволяет вернуть значение из функции. Тип возвращаемого значения указывается после ключевого слова As, расположенного после списка параметров. Если тип не указан, то по умолчанию функция возвращает значение типа Variant. Если инструкция <Имя функции> = <Возвращаемое значение> отсутствует, то возвращается значение по умолчанию для указанного типа.

В качестве примера создадим две функции (листинг 9.4).

Листинг 9.4. Определения функций

' Пример функции без параметров
Function ТекущаяДата() As String
   ТекущаяДата = Format$(Now, "dd.mm.yyyy")
End Function

' Пример функции с параметром
Function Сумма(a As Variant, b As Variant) As Variant
   Сумма = a + b
End Function

Вызвать функцию можно так:

  • если функция не принимает параметров, то указывается только имя функции или после имени функции вставляются круглые скобки;
  • если функция принимает параметры, то после имени функции внутри круглых скобок указываются значения через запятую.

Вызвать функции из листинга 9.4 можно способами, указанными в листинге 9.5.

Листинг 9.5. Вызов функций

Dim x As Integer, y As Integer
x = 10
y = 50
Debug.Print ТекущаяДата    ' Вызываем функцию без параметров
Debug.Print ТекущаяДата()  ' Вызываем функцию без параметров
Debug.Print Сумма(x, y)    ' Вызываем функцию с параметрами

Оператор +, используемый в функции Сумма(), применяется не только для сложения целых чисел, но и позволяет складывать вещественные числа, а также объединять строки. Так как в качестве типа возвращаемого значения указан тип Variant, функция Сумма() может использоваться не только для сложения целых чисел. В качестве примера выполним конкатенацию строк и сложение вещественных чисел:

Debug.Print Сумма("Стр", "ока") ' Строка
Debug.Print Сумма(0.5, 12.3)    ' 12,8

Visual Basic for Applications (VBA)
Статьи по Visual Basic for Applications (VBA)

Помощь сайту

Yandex-деньги: 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов