При составлении сложных программ очень часто в их различных частях приходится использовать одинаковую последовательность действий, например, вычислять:
$log_a \ x = ln x/ln a $
При составлении программ по такому алгоритму приходится записывать одну и ту же группу операторов, соответствующих каждому из повторяющихся фрагментов. Для более эффективного программирования подобных повторений в алгоритмических языках предназначены подпрограммы. Повторяемая группа операторов оформляется в виде отдельной программной единицы, которая записывается однократно, а в соответствующих местах основной программы (или подпрограмм) организуются обращения к ней.
Использование подпрограмм позволяет сложную задачу разбить на фрагменты, которые выполняют различные исполнители. Кроме того, подпрограмма может рассматриваться как самостоятельный модуль, который выполнен квалифицированными разработчиками и используется пользователями более низкой квалификации.
В VBA подпрограммы разделяются на:
- подпрограммы-процедуры – Sub;
- подпрограммы-функции – Function.
Кроме того, от первоначальных версий BASIC сохранилась конструкция подпрограмм GoSub – Return , которая в настоящее время практически используется.
Подпрограммы-процедуры
Любая процедура может содержать несколько входных параметров, произвольное число операторов и несколько результатов ее выполнения.
Синтаксис процедуры в упрощенной форме имеет вид:
[ Private | Public ] Sub ( список )
End Sub
В данном случае квадратные скобки указывают на необязательный параметр, вертикальная черта – на варианты параметров, выбираемых пользователем. Так, элемент описания Private указывает, что рассматриваемая процедура доступна только из программы и процедур только того модуля, в котором она описана. Элемент описания Public указывает на то, что рассматриваемая процедура доступна для всех программ и процедур во всех модулях.
Список формальных аргументов процедуры условно в рассматриваемом нами примере вычисления логарифма разделим на входные параметры – исходные данные и выходные – результаты счета. Входные параметры в списке будем описывать с ключевым словом ByVal и обязательным указанием типа. Выходные же параметры в списке будем описывать с ключевым словом ByRef и обязательным указанием типа. При таком способе описания входные параметры передаются в процедуру по значению: вначале в вызывающей программе вычисляются значения фактических аргументов и эти значения подставляются в процедуре вместо формальных. Входные параметры могут быть либо постоянными, либо именными постоянными, либо переменными, либо выражениями. Выходные параметры, описанные с ключевым словом ByRef, передаются по адресам в электронной памяти компьютера и должны быть только переменными. После их вычисления в процедуре их значения передаются в вызывающую программу. Отметим, что каждая переменная, которая используется в качестве выходного параметра процедуры с ключевым словом ByRef в вызывающей программе, должна быть описана в ней только в отдельном операторе описания. Вызов процедуры из вызывающей программы осуществляется с помощью оператора:
Call ( фактические переменные )
Так вычисление логарифма по произвольному основанию и образец обращения к процедуре его вычисления можно представить в следующей программе.
Private Sub Workbook_Open()
Const $a = 2, b = 4$
Dim x As Single
Dim y As Single
Dim z As Single
Call Логарифм(a, b, x)
Call Логарифм(a + b, (a + b) ^ 5, y)
Call Логарифм(10, 10000, z)
$Range("A1").Value = x$
$Range("A3").Value = y$
$Range("A5").Value = z$
$x = 2.38 ^ b$
$y = 3.1415926$
Call Логарифм(y, x, z)
$Range("A7").Value = z$
End Sub
Public Sub Логарифм(ByVal основание, аргумент_As Single, ByRef результат _As Single)
результат = Log(аргумент) / Log(основание)
End Sub
Отметим, что одновременное использование латинского алфавита и кириллицы при написании программ на начальном этапе затруднительно. В приведенном примере это сделано для большей наглядности.
Кроме того, что в процедуре может быть несколько выходных параметров, описанных с ключевым словом ByRef, возможны побочные результаты действия процедур на изменение входных параметров с ключевым словом ByVal, которые мы рассматривать не будем.
Подпрограммы-функции
Подпрограмма-функция – это подпрограмма, результат которой представляет собой единственное значение, присваиваемое имени этой функции.
Подпрограмма-функция имеет следующий синтаксис:
[Public | Private] Function (список) _As
End Function
В местах выхода из подпрограммы-функции должен стоять оператор присваивания:
=
Обращения к подпрограммам-функциям аналогичны обращению к стандартным математическим функциям VBA.
Рассмотрим оформление предыдущего примера в виде подпрограммы-функции и обращения к ней.
Private Sub Workbook_Open()
Const $a = 2, b = 4$
Dim x As Single
Dim y As Single
Dim z As Single
$x = Логарифм(a, b)$
$y = Логарифм(a + b, (a + b) ^ 5)$
$z = Логарифм(10, 10000)$
$Range("A1").Value = x$
$Range("A3").Value = y$
$Range("A5").Value = z$
$x = 2.38 ^ b$
$y = 3.1415926$
$z = Логарифм(y, x)$
$Range("A7").Value = z$
End Sub
Public Function Логарифм(ByVal основание, аргумент _
As Single) As Single
Логарифм = Log(аргумент) / Log(основание)
End Function
Результат счета по приведенным программам одинаковый и имеет вид, представленный на рисунке ниже:
Отметим, что в ячейки таблицы в результате выполнения программы выведены следующие значения:
- в ячейку A1 - значение $log2 4 = 2$;
- в ячейку A3 – значение $log_{a+b} (a+b)^6 = 5$;
- в ячейку A5 – значение $lg_{10} 10000 = 4$;
- в ячейку A7 - значение $log_z 2,38^4$ .