ЧАСТЬ 3

ИНФОРМАТИКА

Электронное учебно-методическое пособие

 

 
 



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

 

 


© Сибирская государственная геодезическая академия (СГГА), 2011