Во второй части нашего курса рассмотрим простейшие приемы работы на VBA с подпрограммами и массивами, связанные с инженерно-математическими расчетами.
При составлении сложных программ очень часто в их различных частях приходится использовать одинаковую последовательность действий, например, вычислять . При составлении программ по такому алгоритму приходится записывать одну и ту же группу операторов, соответствующих каждому из повторяющихся фрагментов. Для более эффективного программирования подобных повторений в алгоритмических языках предназначены подпрограммы. Повторяемая группа операторов оформляется в виде отдельной программной единицы, которая записывается однократно, а в соответствующих местах основной программы (или подпрограмм) организуются обращения к ней.
Использование подпрограмм позволяет сложную задачу разбить на фрагменты, которые выполняют различные исполнители. Кроме того, подпрограмма может рассмотриваться как самостоятельный модуль, который выполнен квалифицированными разработчиками и используется пользователями более низкой квалификации.
В VBA подпрограммы разделяются на процедуры – Sub и подпрограммы-функции – Function . Кроме того, от первоначальных версий BASIC сохранилась конструкция подпрограмм GoSub – Return , которая в настоящее время редко используется и в нашем курсе не рассматривается.
Любая процедура может содержать несколько входных параметров, произвольное число операторов и несколько результатов ее выполнения.
Синтаксис процедуры в упрощенной форме имеет вид:
[ Private | Public ] Sub <имя процедуры> ( список )
< операторы >
End Sub
Здесь квадратные скобки указывают на необязательный параметр, вертикальная черта – на варианты параметров, выбираемых пользователем. Так, элемент описания Private указывает, что рассматриваемая процедура доступна только из программы и процедур только того модуля, в котором она описана. Элемент описания Public указывает на то, что рассматриваемая процедура доступна для всех программ и процедур во всех модулях. В предлагаемых образцах программ мы будем использовать процедуры только с описанием 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 выведено значение , в ячейку A3 – значение , в ячейку A5 – значение , а в ячейку A7 выведено значение .
Перейдем к изучению массивов. В предыдущей части программирования на VBA рассматривались переменные, являющимися только скалярными величинами. Однако при решении научно-технических и экономических задач приходится сталкиваться с совокупностью переменных, объединенных одним именем, но с различными индексами. Простейшими примерами таких переменных являются элементы векторов и матриц. Аналогом таких переменных в алгоритмических языках являются массивы. В общем случае массив – это упорядоченное конечное множество элементов одинакового типа.
Если в математике, как правило, индекс указывается несколько ниже имени переменной, например или – для элементов векторов и – для элементов матриц, то в VBA индексы заключаются в круглые скобки через запятую. Например: x(1) x(2) ... x(n), или x(i) – для элементов векторов и a(i,j) – для элементов матриц. На VBA в качестве индексов можно использовать переменные перечисляемого типа. Например, названия дней недели, названия цветов радуги и так далее. Мы же будем рассматривать простейший случай, когда в качестве индексов используются аргументы целого типа с указанием пределов их изменения. Число индексов в массиве определяет его размерность.
Для работы с массивами необходимо их предварительно описать. В нашем курсе мы их будем описывать в операторах Dim с указанием границ изменения его индексов в виде граничных пар. При этом объявление массивов может иметь вид:
. . . . . . . . .
Dim a(1 To 5) As Single
Dim b(-1 To 3) As Integer
Dim c(1 To 2, 1 To 4) As Single
. . . . . . . . .
Здесь описаны три массива. Вектор a вещественного типа, состоящий из пяти элементов: a(1) a(2) a(3) a(4) и a(5); вектор b целого типа, состоящий из пяти элементов: b(-1) b(0) b(1) b(2) и b(3); матрица C вещественного типа, состоящая из восьми элементов:
c(1,1) c(1,2) c(1,3) c(1,4)
c(2,1) c(2,2) c(2,3) c(2,4)
Границы изменения индексов массивов можно описать либо в виде граничных пар чисел, как указано выше, либо в виде граничных пар именных констант. Например:
. . . . . . . . .
Const m = 1, n = 10
Dim a(m To n) As Single
. . . . . . . . .
Следует отметить, что должно соблюдаться условие: . Если же , то соответствующий индекс может принимать только одно значение.
Довольно часто массивы описываются с запасным количеством элементов, например вектор, состоящий из 100 элементов, а в программе используются только часть этого массива. Например, только 30 элементов массива.
В качестве индексов массивов в наших задачах могут быть использованы либо целые числа, либо целые именные постоянные, либо целые переменные, либо арифметические выражения целого типа. В VBA не определены операции над массивами. Поэтому всевозможные арифметические и математические действия с массивами проводятся с элементом массива, для которого указаны индексы (индекс). Обычно это производится с помощью операторов цикла, используя целочисленные параметры этих операторов.
Для использования массивов в подпрограммах часто используется их описание в виде динамических, для которых размерность и диапазон изменения параметров определяется вызывающей программой. Например, x(). Использование динамических массивов в качестве входных и выходных параметров подпрограмм допускается только с ключевым словом ByRef и они обязательно должны быть описаны в конце списка параметров подпрограммы .Если в подпрограмме используется несколько массивов, то каждый из ник должен содержать в описании ключевое слово ByRef и описание типа.
Студенту необходимо разобраться в приведенных образцах решения задач контрольной работы № 2 и модифицировать программы согласно условиям своего варианта.