Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ Информатика ЛР.doc
Скачиваний:
12
Добавлен:
27.08.2019
Размер:
3.47 Mб
Скачать

Функции с побочным эффектом

В классическом варианте все аргументы функции являются входными параметрами, и единственный результат вычисления функции – это ее возвращаемое значение, примером является функция Cube. Однако чаще всего, используются функции с побочным эффектом, то есть такие функции, которые помимо получения значения функции изменяют значения некоторых результирующих параметров, передаваемых функции по ссылке. Например:

Public Function SideEffect(ByVal X As Integer, ByRef Y As Integer) As Integer

SideEffect = X+Y

Y = Y+1

End Function

Public Sub TestSideEffect()

Dim X As Integer, Y As Integer, Z As Integer

X = 3: Y = 5

Z = X+Y+SideEffect(X, Y)

Debug.Print X, Y, Z

X = 3: Y = 5

Z = SideEffect(X, Y)+X+Y

Debug.Print X, Y, Z

End Sub

Вот результаты вычислений:

3 6 16

3 6 17

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

Создание процедуры

Для создания новой процедуры, текст которой пишется вручную, нужно:

  1. открыть в окне проектов "Проект-(VBA)Project" (Project Explorer) папку с модулем (формой, документом, рабочим листом и т.п.), к которому требуется добавить процедуру, и, щелкнув этот модуль, открыть окно редактора с кодами процедур модуля;

  2. перейти в редактор, набрать ключевое слово (Sub, Function или Property), имя процедуры и ее аргументы; затем нажмите клавишу Enter, и VBA поместит ниже строку с соответствующим закрывающим оператором (End Sub, End Function, End Property);

  3. написать текст процедуры между ее заголовком и закрывающим оператором.

Можно автоматизировать работу, вызвав диалоговое окно "Вставка процедуры" (Insert Procedure). Последовательность действий в этом случае следующая:

  1. выбрать в меню "Вставка" (Insert) команду "Процедура" (Procedure);

  2. в поле "Имя" (Name) появившегося окна "Вставка процедуры" (Insert Procedure) ввести имя процедуры;

  3. указать в группе кнопок-переключателей "Тип" (Type) тип создаваемой процедуры: Подпрограмма (Sub), Функция (Function) или Свойство (Property);

  4. указать в группе кнопок-переключателей "Область определения" (Scope) вид доступа к процедуре: Общая (Public) или Личная (Private);

  5. пометить, если нужно, флажок "Все локальные переменные считать статическими" (All Local Variables as Statics), чтобы в заголовок процедуры добавился ключ Static;

  6. щелкнуть кнопку "OK" – в окне редактора появится заготовка процедуры, состоящая из ее заголовка (без параметров) и закрывающего оператора;

  7. добавить параметры в заголовок процедуры и написать текст процедуры между ее заголовком и закрывающим оператором.

Создание процедур обработки событий

VBA является языком, в котором, как и в большинстве современных объектно-ориентированных языков, реализована концепция программирования, управляемого событиями (event driven programming). Здесь нет понятия программы, которая начинает выполняться от Begin до End. Пользователи системы документов и операционная система могут инициировать события в мире объектов. В ответ на возникновение события операционная система посылает сообщение соответствующему объекту. Реакцией объекта на получение сообщения является вызов процедуры – обработчика события. Задача программиста сводится к написанию обработчиков событий для объектов. Причем, все обычные процедуры и функции VBA, о которых мы говорили выше, вызываются прямо или косвенно из процедур обработки событий, если только речь не идет о режиме отладки. Именно эти процедуры приводят к последовательности вызовов обычных процедур и функций.

С каждым из объектов Office связан набор событий, на которые он может реагировать. Процедуры обработки этих событий располагаются в модулях, связанных с объектами, реагирующими на события. Для кнопок меню, у которых есть только один обработчик события, соответствующая процедура может находиться в стандартном модуле или модуле макросов. Office позволяет при описании собственных классов, создаваемых программистом, задать определенный набор событий. Обработчики событий таких объектов создаются по определенной технологии. Например, процедура, которая будет пять раз подавать звуковой сигнал при закрытии документа:

Private Sub Document_Close()

Dim I As Integer

For I = 1 To 5 ' 5 раз подается

Beep ' звуковой сигнал

Next I

End Sub

Эта процедура находится в модуле, связанном с объектом ThisDocument, и вызывается в момент закрытия документа.