Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Источники / excel_2010_professionalnoe_programmirovanie_na_vba_RuLit_Me_412629.pdf
Скачиваний:
4
Добавлен:
27.09.2025
Размер:
22.97 Mб
Скачать

Глава 9. Работа с процедурами VBA

265

Выполнение процедуры по событию

Некоторые процедуры должны выполняться, если в системе (программе) происходит определенное событие. Это может быть открытие рабочей книги, ввод данных в рабочий лист, сохранение книги, щелчок на элементе управления CommandButton и многое другое. Процедура, которая выполняется, когда происходит какое-либо событие, называ­ ется обработкой события. Процедуры обработки событий характеризуются общими свойствами:

имеют специальные названия, состоящие из имени объекта, символа подчеркива­ ния и названия события; например, процедура, которая выполняется при открытии рабочей книги, называется Workbook_Open;

хранятся в окне кода для определенного объекта.

Перекрестная ссылка

Процедуры обработки событий описываются в главе 19.

Выполнение процедуры в окне отладки

Процедуру можно также выполнить, введя ее название в окне отладки (Immediate) программы VBE. Если это окно в данный момент не отображено, нажмите <Ctrl+G>. Окно отладки выполняет операторы VBA, которые вы вводите в его области. Чтобы вы­ полнить процедуру, достаточно ввести название процедуры в окне отладки и нажать кла­ вишу<Enter>.

Этот метод часто применяется при разработке процедуры, поскольку в окне отладки можно вводить непосредственные команды, чтобы сразу же увидеть результат их выпол­ нения. Продемонстрируем этот прием.

Sub C h a n g e C a s e ()

Dim M y S t r in g

A s

S t r i n g

M y S tr in g

= "Э т о

т е с т "

M y S tr in g

= U C a s e ( M y S t r in g )

D ebug . P r i n t

M y S t r in g

End Sub

На рис. 9.5 показан результат выполнения процедуры ChangeCase в окне отладки. Оператор Debug.Print немедленно отобразит его.

Передача аргументов процедурам

Аргументы обеспечивают процедуру данными, использующимися в ее инструкциях. Аргумент может передавать следующие данные:

переменная;

константа;

массив;

объект.

Глава 9. Работа с процедурами VBA

267

 

F i le ( 3 ) = " d e p t 3 . x ls x "

 

 

F o r i

= 1 To 3

 

 

C a l l P r o c e s s F i l e ( F i l e ( i ) )

 

 

N e xt

i

 

End

Sub

 

 

Sub

P r o c e s s F i le ( T h e F ile )

 

 

W o rk b o o k s . O pen F ile N a m e : = T h e F ile

 

' . . . [код]

End Sub

Конечно, вы всегда можете передавать в процедуру текст (не переменные).

Sub M a in ()

C a ll P r o c e s s F i l e ( " b u d g e t . x l s x " )

End Sub

Используются два способа передачи аргументов процедуре.

По ссылке. При передаче аргумента по ссылке (метод, применяемый по умолча­ нию) процедуре передается адрес ячейки памяти, в которой хранится переменная. Поэтому изменение аргумента в процедуре приводит к изменению исходной пе­ ременной.

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

Следующий пример подтверждает высказанную концепцию. Аргумент процедуры Process передается по ссылке (по умолчанию). После того как процедура Main присваи­ вает переменной MyValue значение 10, она вызывает процедуру Process и передает MyValue в качестве аргумента. Процедура Process умножает значение своего аргумента названием YourValue) на 10. По окончании процедуры Process возобновляется вы­ полнение процедуры Main, а функция MsgBox отображает строку MyValue: 100.

Sub M ain ()

Dim M y V a lu e A s I n t e g e r

M yV alue

= 1 0

C a ll P r o c e s s ( M y V a lu e )

M sgBox

M y V a lu e

End

Sub

Sub

P ro c e s s ( Y o u r V a lu e )

 

Y o u rV a lu e = Y o u r V a lu e * 10

End Sub

Если требуется, чтобы вызываемая процедура не изменяла переменные, полученные как аргументы, измените список аргументов вызываемой процедуры так, чтобы аргументы пе­ редавались по значению, а не по ссылке. Для этого добавьте перед аргументом ключевое слово ByVal. Тогда вызываемая процедура будет управлять копией переданных данных, а несамими данными. В следующей процедуре, например, изменения, которые происходят с YourValue в процедуре Process, не влияют на значение переменной MyValue в про­ цедуре Main. В результате функция MsgBox отображает 10, а не 100.

Sub

P ro c e s s ( B y V a l Y o u r V a lu e )

 

Y o u rV a lu e = Y o u r V a lu e * 10

End

Sub

268

Часть III. Visual Basic for Applications

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

Аргументы процедуры могут быть самыми разными и передаваться и по значению, и первым способом. Все аргументы, перед которыми указано ключевое слово ByVal, передаются по значению, остальные — по ссылке.

Примечание

Если в процедуре применена переменная с пользовательским типом дан­ ных, то ее нужно передавать по ссылке. При попытке передать ее по значе­ нию происходит ошибка.

Переменные типа P u b lic и передача аргументов процедуре

В главе 8 уже отмечалось, что переменная типа P u b l ic (определенная в верхней части модуля) будет доступной для всех процедур этого модуля. В некоторых случаях предпочтительнее пользоваться переменной типа P u b lic , чем передавать переменную в виде аргумента при вызове другой процедуры.

Например, приведенная ниже процедура передает значение M o n th v a l процедуре

P ro c e s s M o n th .

Sub M y S u b ()

D im M o n th V a l a s I n t e g e r

. . . [код]

M o n th V a l = 4

C a l l P r o c e s s M o n th ( M o n th V a l)

'. . . [код ]

E n d Sub

Альтернативный метод выглядит следующим образом.

P u b l ic M o n th V a l a s I n t e g e r

Sub M y S u b ()

'. . . [код ]

 

M o n th V a l = 4

 

C a l l P ro c e s s M o n th 2

1

. . . [код]

E n d

Sub

Во втором фрагменте кода, из-за того что M o n th v a l является переменной типа P u b l ic , процедура P ro c e s s M o n th 2 имеет к ней доступ, поэтому необходимость в ар­ гументах для этой процедуры отпадает.

Так как в предыдущих примерах не был объявлен тип данных ни для одного аргумен­ та, все аргументы имеют тип данных Variant. Но процедура может определять типы данных непосредственно в списке аргументов. Ниже представлен оператор Sub для про­ цедуры с двумя аргументами, имеющими различные типы данных. Первый аргумент объявлен как Integer, второй — как String.

Sub P r o c e s s ( I t e r a t io n s A s I n t e g e r , T h e F ile A s S t r in g )

При передаче аргументов в процедуру важно, чтобы данные, которые передаются в качестве аргументов, имели тип данных аргументов. Например, в предыдущем примере