Иллюстрированный самоучитель по Microsoft Outlook 2002

Структура программы

Программа 20.17. Использование именованных аргументов.

Sub Test2()
Dim bookshops(1 To 25) As Integer
Dim result As Boolean
Init bookshops
result = SaleAbility(arr := bookshops, numOfBooks := 3000)
MsgBox(result) End Sub

При описании синтаксиса объявления процедуры мы вскользь упомянули ключевое слово ParamArray, настало время уделить ему достойное внимание. Возможность передавать процедуре заранее неизвестное число фактических параметров является опять-таки уникальной по отношению ко многим другим языкам программирования.

Например, мы создадим процедуру подсчета общего количества заявок с использованием параметра ParamArray. При вызове этой процедуры в процедуре Tests можно задавать сколько угодно фактических параметров массива заявок.

Программа 20.18. Использование параметра ParamArray.

Sub FullSum(ParamArray arr() As Variant)
Dim sum As Integer
For i = LBound(arr) To UBound(arr) sum = sum + arr(i)
Next i
MsgBox(sum) End Sub
Sub Test3()
FullSum 100, 2000, 350, 450 End Sub

Рассмотрим еще один способ вызова процедур или функций – рекурсивный вызов, т. е. вызов, при котором процедура вызывается из своего же тела. Стандартный пример рекурсивной функции – вычисление факториала.

Программа 20.19. Рекурсивный вызов функции.

Function fCTRL(n As Integer) As Variant
If(n <= 1) Then fCTRL = 1
Else
fCTRL = n * fCTRLfn - 1) End If End Function
Sub Test4()
MsgBox fCTRL(20) End Sub

Как правило, рекурсивными вызовами не стоит злоупотреблять, поскольку при рекурсивных вызовах достаточно быстро заполняется стековая память компьютера и на их обработку тратится гораздо больше времени. В нашем случае можно избежать использования рекурсивного вызова его заменой на обыкновенный цикл. Хотя, безусловно, есть ситуации, когда использование рекурсивных методов заметно ускоряет работу, например при работе с древовидными структурами данных.

В заключение мы рассмотрим пример, показывающий различие между передачей параметров по ссылке и по значению, в котором приведены две процедуры: RefVal и MainCalc. Вспомогательная процедура RefVal использует три формальных аргумента, описанные по-разному. Далее в теле этой процедуры каждый из них увеличивается на единицу, а затем их значения выводятся на экран. Основная процедура MainCalc устанавливает значения переменных а, b и с, а затем передает их в качестве параметров процедуре RefVal. При этом первый параметр передается по ссылке (по умолчанию), второй – по значению, а третий – снова по ссылке. После возврата из процедуры RefVal основная процедура также выводит на экран значения трех переменных, передававшихся в качестве параметров. Всего на экран выводится шесть значений. Сначала это числа 11, 21 и 31 (все полученные значения увеличились на 1 и выводятся процедурой RefVal). Затем это числа 11, 20 и 31 (эти значения выводятся процедурой MainCalc, причем переменные, переданные по ссылке, увеличились, а переменная, переданная по значению, – нет).

Программа 20.20. Разница между ByRef и ByVal

Sub RefVal(x, ByVal y, ByRef z)
x = x + 1
y = y + 1
z = z + 1
MsgBox(x)
MsgBox(y)
MsgBox(z) End Sub
Sub MainCalc 0 a = 10 b = 20 c = 30 Call RefVal(a, b, c)
MsgBox(a) MsgBox(b) MsgBox(c) End Sub

Итак, мы рассмотрели работу с процедурами и функциями, определяемыми пользователем, но помимо этой возможности, есть широкий набор всевозможных встроенных процедур и функций, позволяющих программисту не задумываться над реализацией стандартных операций, таких как сравнение строк или взятие синуса от некоторого числа. К сожалению, рамки нашей книги не дают возможность описать даже малую часть встроенных процедур и функций (да это и ни к чему), но вы всегда сможете найти их полный перечень и описание во встроенной справке Outlook.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.