При составлении сложных программ очень часто в их различных частях приходится использовать одинаковую последовательность действий, например, вычислять:
loga x=lnx/lna
При составлении программ по такому алгоритму приходится записывать одну и ту же группу операторов, соответствующих каждому из повторяющихся фрагментов. Для более эффективного программирования подобных повторений в алгоритмических языках предназначены подпрограммы. Повторяемая группа операторов оформляется в виде отдельной программной единицы, которая записывается однократно, а в соответствующих местах основной программы (или подпрограмм) организуются обращения к ней.
Использование подпрограмм позволяет сложную задачу разбить на фрагменты, которые выполняют различные исполнители. Кроме того, подпрограмма может рассматриваться как самостоятельный модуль, который выполнен квалифицированными разработчиками и используется пользователями более низкой квалификации.
В 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.38b
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.38b
y=3.1415926
z=Логарифм(y,x)
Range("A7").Value=z
End Sub
Public Function Логарифм(ByVal основание, аргумент _
As Single) As Single
Логарифм = Log(аргумент) / Log(основание)
End Function
Результат счета по приведенным программам одинаковый и имеет вид, представленный на рисунке ниже:
Отметим, что в ячейки таблицы в результате выполнения программы выведены следующие значения:
- в ячейку A1 - значение log24=2;
- в ячейку A3 – значение loga+b(a+b)6=5;
- в ячейку A5 – значение lg1010000=4;
- в ячейку A7 - значение logz2,384 .