3.10.3. Процедуры
Программные
модули VBA состоят из процедур – это минимальный модуль в составе
прикладной программы на языке VBA.
У них
стандартное оформление:
Sub <имя - процедуры> (аргументы)
….
Тело процедуры (операторы)
….
End Sub
Оператор Sub объявляет процедуру, задаёт имя и указывает состав аргументов,
передаваемых при вызове процедуры из программы. Ему всегда соответствует
свой оператор End Sub.
В программе
могут использоваться процедуры других рабочих книг. Для этого задают
ссылки. Если модуль на рабочем месте, то выполняются команды
Вид
| Модуль
и выбирают
нужный из списка. Для установки новых ссылок щёлкнуть по кнопке Пролистать
и указать диск, каталог и файл, содержащий процедуры, на которые можно
ссылаться из данного модуля.
Вызов
процедуры осуществляется по имени: Proc_B
Если
он в другой процедуре другого модуля, то [Модуль#].Proc_B
Из
другого приложения:
[RW1.XLS].[Модуль
#].Proc_B
Если
мы не хотим, чтобы к процедуре обращались из других модулей, то
объявляют её так:
Private
Sub Proc_B ()
….
End Sub
Если
мы не хотим, чтобы к модулю обращались из других рабочих книг, то
указывают:
Option
Private Module
Если
в момент вызова процедуры передаются какие-то величины либо значения
при её выполнении, определяют список аргументов, который содержит
данные обмена с вызывающей процедурой. В теле процедуры могут быть
объявлены внутренние переменные, они никуда не передаются, а потому
действуют только внутри процедуры.
Объявление
аргументов в заголовке процедуры имеет вид:
Sub
Proc_ B (Val1 As Single; Val2 As Date;…)
Если
аргумент необязательный, т. е. может не задаваться при вызове процедуры,
указывается ключевое слово Optional.
Sub
SquarPr (L As Single; H As Single; S As Single; Optional F)
If
IsMissing(F) Then F=100 IsMissing
проверяет наличие аргумента F, если F не задано, по умолчанию F
присваивают 100.
S=L*H
: End Sub
Вызов:
Sub Proc_A()
I
способ: Dim Sq as Single
SquarPr
12;23;sq могут быть
через , - зависит от установки.
End
Sub
II способ: Sub Proc_A()
Dim
Sq as Single: Dim LL as Single; Dim HH as Single
LL=12:
HH=23: SquarPr LL HH Sq
End
Sub
III способ: Sub Proc_A()
Dim
Sq as Single: Dim LL as Single; Dim HH as Single
LL=12:
HH=23: SquarPr L:=LL; H:=HH; S:=Sq
End
Sub
При завершении работы вызываемой процедуры и передаче управления вызывающей
процедуре происходит потеря значений переменных, объявляемых в вызываемой
процедуре. Для предотвращения этого сохраняемые переменные смогут
объявить:
Static
<var> As <type>
Обычно
при вызове процедуры происходит передача адреса, по которому находится
значение. Процедура может изменить значение аргумента. Для блокировки
изменения значения аргумента следует передача величин значением. Для
этого выполняют либо модификацию заголовка процедуры, либо передачу
аргументов в виде формул.
Для модификации:
Sub
SquarPr (ByVal L As Single; ByVal H As Single; S As Single)
S=L*H:
L=10: H=20: End Sub
Для
преобразования аргумента в виде формулы имя переменной заключают в
круглые скобки.
Пример.
Sub
Proc_A()
Dim
Sq as Single: Dim LL as Single: Dim HH as Single
LL=12:
HH=23: SqarPr L:=(LL); H:=(HH); S:=Sq
End
Sub
Если
хотим передать массив по ссылке (чтобы место под него выделялось один
раз, а не в каждой процедуре), то перед именем массива в заголовке
процедуры пишем не ByVal, а ByRef. В этом случае изменение значений
элементов массива в вызванной процедуре приведёт к изменению их значений
и в вызывающей процедуре. Это экономит оперативную память.
Пример 1.
В
заданной матрице х(4,4) сложить элементы 1-й и 3-й строк и записать
их на место элементов 1-й строки в процедуре.
Sub
zam(ByRef x() As Integer, ByVal n As Integer, ByVal m As Integer)
Dim
i, j As Integer
For
j = 0 To m
x(1,
j) = x(1, j) + x(3, j)
Next
j
End
Sub
Sub
CommandButton1_Click()
Dim
i, j, n, m, x(4, 4) As Integer
n
= 4
m
= 4
For
i = 0 To n
For
j = 0 To m
x(i,
j) = Cells(i + 1, j + 1)
Next
j
Next
i
zam
x, n, m
For
j = 0 To m
For
i = 0 To n
Cells(i
+ 7, j + 1).Value = x(i, j)
Next
i
Next
j
End
Sub
Пример
2.
Подсчитать
в процедуре сумму в каждом столбце
Sub
Sum(ByRef x() As Integer, ByVal n As Integer, ByVal m As Integer)
Dim
i, j, s(2) As Integer
For
j = 0 To m
s(j)
= 0
For
i = 0 To n
s(j)
= s(j) + x(i, j)
Next
i
MsgBox
"s(j)=" & CStr(s(j))
Next
j
End
Sub
Sub
CommandButton1_Click()
Dim
i, j, n, m, x(4, 2) As Integer
n =
4
m =
2
For
i = 0 To n
For
j = 0 To m
x(i,
j) = Cells(i + 1, j + 1)
Next
j
Next
i
Sum
x, n, m
End
Sub
|