Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Пользовательские подпрограммы и модули
Как вы уже могли заметить, код всех примеров из предыдущих глав нужно было размещать внутри специальной конструкции 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
Помощь сайту
Yandex-деньги: 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов