Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 3491 / 369 | Оценка: 4.65 / 4.29 | Длительность: 30:37:00
Специальности: Программист, Менеджер
Лекция 10:

Процедуры и функции

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

В классическом варианте все аргументы функции являются входными параметрами, и единственный результат вычисления функции - это ее возвращаемое значение., примером является функция 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). Последовательность действий в этом случае такая:

  • выбрать в меню Вставка (Insert) команду Процедура (Procedure);
  • в поле Имя (Name) появившегося окна "Вставка процедуры" (Insert Procedure) ввести имя процедуры.
  • указать в группе кнопок-переключателей Тип (Type) тип создаваемой процедуры: Подпрограмма ( Sub ), Функция ( Function ) или Свойство ( Property );
  • указать в группе кнопок-переключателей "Область определения" (Scope) вид доступа к процедуре: Общая (Public) или Личная (Private);
  • пометить, если нужно, флажок "Все локальные переменные считать статическими" (All Local Variables as Statics ), чтобы в заголовок процедуры добавился ключ Static ;
  • щелкнуть кнопку OK - в окне редактора появится заготовка процедуры, состоящая из ее заголовка (без параметров) и закрывающего оператора;
  • добавить параметры в заголовок процедуры и написать текст процедуры между ее заголовком и закрывающим оператором.

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

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

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

Private Sub Document_Close()
End Sub

Дополнив ее:

Private Sub Document_Close()
	Dim I As Integer

	For I = 1 To 5		' 5 раз подается
		Beep		' звуковой сигнал
	Next I
End Sub

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

полина есенкова
полина есенкова
Дмитрий Вологжин
Дмитрий Вологжин
Добрый день, прошел тесты с 1 по 9, 10 не сдал, стал читать лекцию и всё пройденные тесты с 1 по 9 сбросились, когда захотел пересдать 10 тест.