Dim M(l То 3, 1 То 3) As Single
Dim V(l To 12) As Integer
Значения элементов массива задаются поэлементно. Н а п р и м е р,
DimM(lTo 2,1 То 2) AsInteger
M(l,l)=2: M(1,2)=4: M(2,1)=1: В(1,2)=6
Удобным способом задания одномерных массивов является функция Array, преобразующая список элементов, разделенных запятыми, в вектор из этих значений, и присваивающая их переменной типа Variant.
Например,
Dim A As Variant
А = Array{10,20,30)
В = А(2)
Динамические массивы
Иногда в процессе выполнения программы требуется изменять размер массива. В этом случае первоначально массив объявляют как динамический. Для этого при объявлении массива не указывают размерность.
Например:
Dim R() as Single
В программе следует вычислить необходимый размер массива и связать его с некоторой переменной, затем изменить размер динамического массива с помощью оператора ReDim, формат которого:
ReDim [Preserve] ИмяПеременной(Индексы) [As Тип]_
[. ИмяПеременной(Индексы)[As Тип]] ...
Preserve – ключевое слово, используемое для сохранения данных в существующем массиве при изменении значения последней размерности.
ИмяПеременной – имя переменной, удовлетворяющее стандартным правилам именования переменных.
Индексы – размерности переменной массива; допускается описание до 60 размерностей. Аргумент Индексы использует следующий синтаксис:
[Нижний То] Верхний [, [Нижний То] Верхний] ...
Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией Option Base. Если отсутствует инструкция Option Base, нижняя граница массива равняется нулю.
Тип – тип данных массива.
Например, установим границы массива R:
ReDim R(1 To 10)
Допустимо повторное использование инструкции ReDim для изменения числа элементов и размерностей массива.
9. Подпрограммы
9.1 Процедуры
Процедура является самостоятельной частью кода, которая имеет имя и может содержать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов.
Синтаксис:
[Private | Public] [Static] SubИмя [(СписокАргументов)]
[инструкции]
[Exit Sub]
[инструкции]
End Sub
Элементы описания:
Public | Указывает, что процедура Sub доступна для всех других процедур во всех модулях |
Private | Указывает, что процедура Sub доступна для других процедур только того модуля, в котором она описана |
Static | Указывает, что локальные переменные процедуры sub сохраняются в промежутках времени между вызовами этой процедуры |
Имя | Имя процедуры sub, удовлетворяющее стандартным правилам именования переменных |
СписокАргументов | Список переменных, представляющий аргументы, которые передаются в процедуру Sub при ее вызове. Имена переменных разделяются запятой |
Инструкции | Любая группа инструкций, выполняемых в процедуре Sub |
Инструкция Exit Sub приводит к немедленному выходу из процедуры Sub.
Синтаксис элемента СписокАргументов:
[Optional] [ByVal | ByRef] [ParamArray] имяПеременной[( )] _
[As тип] [= поУмолчанию]
Optional | Ключевое слово, указывающее, что аргумент не является обязательным. При использовании этого элемента все последующие аргументы, которые содержатся в списке СписокАргументов, также должны быть необязательными и описаны с помощью ключевого слова optional. Все аргументы, описанные как optional, должны иметь тип variant. He допускается использование ключевого слова optional для любого из аргументов, если используется ключевое слово ParamArray |
ByVal | Указывает, что этот аргумент передается по значению. |
ByRef | Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в VBA по умолчанию |
ParamArray | Используется только в качестве последнего элемента в списке СписокАргументов для указания, что конечным аргументом является описанный как optional массив значений типа Variant. Ключевое слово ParamArray позволяет задавать произвольное количество аргументов. Оно не может быть использовано со словами ByVal, ByRef или Optional |
имяПеременной | Имя переменной, удовлетворяющее стандартным правилам именования переменных |
тип | Тип данных аргумента, переданного в процедуру; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (ТОЛЬКО строки переменной длины), object, Variant. Если отсутствует ключевое слово optional, могут быть также указаны определяемый пользователем тип или объектный тип |
поУмолчанию | Любая константа или выражение, дающее константу. Используется только вместе с параметром optional. Если указан тип object, единственным значением по умолчанию может быть значение Nothing |
Приведенный ниже синтаксис описывает имя, аргументы и текст программы, составляющие тело процедуры Function. Синтаксис:
[Public | Private] [Static] FunctionИмя [(СписокАргументов)] [AsТип]
[Инструкции]
[Имя = Выражение]
[Exit Function]
[Инструкции]
[Имя = Выражение]
End Function
Синтаксис инструкции Function содержит те же элементы, что и Sub. Инструкция Exit Function приводит к немедленному выходу из процедуры Function. Подобно процедуре Sub, процедура Function является самостоятельной процедурой, которая может получать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. Однако в отличие от процедуры Sub, когда требуется использовать возвращаемое функцией значение, процедура Function может применяться в правой части выражения, как и любая другая встроенная функция, например, cos.
Процедура Function вызывается в выражении по своему имени, за которым список аргументов в скобках. Для возврата значения из функции следует присвоить значение имени функции. Любое число таких инструкций присвоения может находиться в любом месте процедуры.
9.2 Переход в подпрограмму и возвращение из подпрограммы
В VBA от первоначальных версий BASIC сохранилась конструкция подпрограммы GoSub - Return, которая в настоящее время редко используется. Для полноты изложения вкратце напомним синтаксис этой инструкции. Синтаксис:
GoSub строка
строка
Return
Аргумент строка может быть любой меткой строки или номером строки. В качестве метки строки может быть любая комбинация символов, начинающаяся с буквы и заканчивающаяся двоеточием.
Допускается использование инструкций GoSub и Return в любом месте процедуры, но GoSub и соответствующая инструкция Return должны находиться в одной процедуре. Подпрограмма может содержать несколько инструкций Return. Первая обнаруженная инструкция Return приводит к передаче управления назад к инструкции, непосредственно следующей за последней выполненной инструкцией GoSub.
9.3 Вызов процедуры
Вызов процедуры Sub из другой процедуры можно произвести несколькими способами.
Первый способ вызова процедуры Sub:
ИмяПроцедуры СписокФактическихПараметров
ИмяПроцедуры | Имя вызываемой процедуры |
СписокФактическихПараметров | Список аргументов, передаваемых процедуре. Он должен соответствовать списку, заданному в процедуре по количеству и типу. |
Если требуется использовать несколько процедур с одинаковыми названиями; при их вызове после имени процедуры через точку надо указывать имя модуля, на котором они расположены. А именно,
ИмяМодуля . ИмяПроцедуры СписокФактическихПараметров
Второй способ вызова процедуры sub производится с помощью инструкции Call.
ИмяПроцедуры (СписокФактическихПараметров )
Обратите внимание, что в этом случае список фактических параметров заключается в скобки. В первом способе скобки не использовались.
VBA позволяет вводить фактические параметры через имена аргументов в любом порядке и опускать необязательные (optional). При этом после имени аргумента ставятся двоеточие и знак равенства, после которого помещается значение аргумента (фактический параметр).
Приведенный ниже пример показывает основные способы передачи параметров в процедуры.
Dim с As Double
' с - глобальный параметр
Function F(ByVal x As Integer) As Integer
F = x^2
End Function
‘Sub Assistant (ByVal a As Integer, ByVal b As Integer)
‘Процедура, находящая сумму двух чисел и выводящая результат в диалоговом окне
с = а + b
MsgBoxCStr(c)
End Sub
Sub Main()
‘Процедура, находящая сумму двух чисел и выводящая результат в диалоговом окне
Dim x, у As Double
‘ x, у - переменные, используемые в качестве фактических параметров
' Вызов процедуры с конкретными числами как фактическими параметрами
Assistant 1, 3
' Первоначальное присвоение переменным значений, с последующим вызовом процедуры
х = 1: у = 1
Assistant x, у + 2
' Использование функции как фактического параметра
х = 1: у = 3
Assistant F(x), у
‘Вызов процедуры с указанием фактических параметров по имени
Assistant a:=l, b:=3
End Sub
Приведем пример процедуры с необязательными параметрами. Процедура CторонаТреугольника позволяет найти длину недостающей стороны прямоугольного треугольника, где переменные A и B отведены под длины катетов, а переменная С – под гипотенузу. Например, формула =СторонаТреугольника(;В2;С2) вычисляет катет А по введенным в ячейки В2 и С2 длинам катета В и гипотенузы С. При работе с необязательными переменными необходимо использовать функцию IsMissing, возвращающую значение True, если соответствующий аргумент не был передан в процедуру, и False в противном случае.
Function СторонаТреугольника (Optional A, Optional В, Optional С)
If Not (IsMissing(A)) And Not (IsMissing(В)) Then
СторонаТреугольника = Sqr(А^2 + В^2)
End If
If Not (IsMissing(A)) And Not (IsMissing(C)) Then
СторонаTреугольника = Sqr(С^2 – A^2)
End If
If Not (IsMissing(B)) And Not (IsMissing(C)} Then
Сторонатреугольника = Sqr (C^2 – B^2)
End If
EndFunction
Назначение значений по умолчанию необязательным параметрам
Для необязательного параметра можно определить значение по умолчанию. В следующем примере, если значение параметра ь не передано в функцию, то ему присваивается указанное по умолчанию значение 8.