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

256

Часть III. Visual Basic for Applications

Совет

Всем процедурам модуля можно назначить область действия P riv a te , да­ же если они объявлены с помощью ключевого слова P u b lic . Для этого пе­ ред первым оператором процедуры помещается следующая конструкция:

O p tio n P riv a te Module

Если этот оператор добавлен в модуль, можно изъять ключевое слово P r i­ v a te из объявления процедуры.

Функция записи макросов Excel обычно создает процедуры с названием Макрос1, Макрос2 и т.д. Все эти процедуры имеют область действия P u b lic и не имеют аргументов.

Выполнение процедуры

Далее представлены некоторые способы выполнения, или вызова, процедуры VBA.

С помощью команды Run^Run Sub/UserForm (Выполнить^Выполнить проце­ дуру/пользовательскую форму) (в VBE). Альтернатива — нажать <F5> либо вос­ пользоваться кнопкой Run Sub/UserForm панели инструментов Standard (Стандартная).

Из диалогового окна Макрос (Macro) в Excel.

С помощью комбинации клавиши <Ctrl> и присвоенной процедуре клавиши (если процедуре присвоена комбинация клавиш).

Щелкнув на кнопке или форме рабочего листа. Для этого кнопке или форме долж­ на быть присвоена процедура.

Из другой процедуры. Процедуры Sub и F u n c tio n могут вызывать другие про­ цедуры.

С помощью пользовательского элемента управления, находящегося на ленте. Кроме того, встроенные элементы управления ленты могут быть “перенастроены” для вызова макроса на выполнение.

Из пользовательского контекстного меню.

После выполнения определенного события. Такими событиями могут выступать открытие рабочей книги, сохранение рабочей книги, закрытие рабочей книги, из­ менение ячейки, переход на другой рабочий лист и многие другие.

Из окна отладки (Immediate) в VBE. Просто введите название процедуры, укажите все необходимые аргументы и нажмите клавишу <Enter>.

Рассмотренные методы запуска процедур подробно обсуждаются в следующих разделах.

Примечание

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

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

259

Выполнение процедуры с помощью ленты

Если вы хотите достичь цели, не прилагая больших усилий, можете написать код XML, выполняющий добавление новой кнопки (либо другого элемента управления) на ленту, а также присвоить макросу этот элемент управления. Обратите внимание, что из­ менение ленты осуществляется без помощи Excel и VBA.

Новинка

Пользователи Excel 2010 могут изменять ленту с помощью возможности, предоставляемой самой Excel. Теперь можно добавить произвольный эле­ мент управления на ленту, а затем назначить ему макрос.

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

Обратитесь к главе 22 для получения дополнительных сведений о настройке ленты.

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

Макрос может быть выполнен путем щелчка мышью на элементе контекстного меню. Это меню отображается после щелчка правой кнопкой мыши на объекте или диапазоне Excel.

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

Дополнительные сведения о контекстных меню можно найти в главе 23.

Выполнение процедуры из другой процедуры

Один из самых популярных способов выполнить процедуру — вызвать ее из другой процедуры. Для этого существует три способа:

ввести название процедуры и необходимые аргументы этой процедуры (если они есть) через запятую;

ввести ключевое слово C a ll, после него— название процедуры и ее аргументы (если они есть), заключенные в скобки и разделенные запятыми;

• использовать метод Run объекта A p p lic a tio n . Этот метод можно применять для выполнения других процедур VBA или макросов XLM. Метод Run полезен, когда выполняется процедура, название которой присвоено переменной. Тогда переменную можно передать в метод Run как аргумент.

В следующем примере показан первый метод. В данном случае процедура MySub выполняет некоторые операторы (не показанные в примере), запускает процедуру Up­ date Sheet и затем выполняет остальные операторы.

Sub MySub ()

'. . . [код]

U p d a te S h e e t ' . . . [код]

End Sub

260

Часть III. Visual Basic for Applications

Sub

U p d a t e S h e e t ()

'. . . [код]

E n d Sub

Далее представлен второй метод. Ключевое слово Call вызывает процедуру Update, имеющую один аргумент; вызывающая процедура передает аргумент в вызываемую процедуру. Аргументы процедур рассматриваются далее.

Sub

M y S u b ()

 

M onthN um = I n p u t B o x ( "Введите номер м есяца: ")

 

C a l l

U p d a te S h e e t(M o n th N u m )

'

. . .

[код]

E n d

Sub

 

Sub

U p d a te S h e e t( M o n th S e q )

'

. . . [код]

En d

Sub

 

Совет

Некоторые программисты всегда используют ключевое слово C a l l , чтобы явно указать на вызов другой процедуры, хотя это действие необязательно.

В следующем примере используется метод Run, выполняющий процедуру Up­ dateSheet и передающий MonthNum в качестве аргумента.

Sub M y S u b ()

M onthN um = I n p u t B o x ( "Введите номер м есяца: ")

A p p lic a t i o n . R u n " U p d a t e S h e e t " , M onthN iim

'. . . [код]

E n d

Sub

Sub

U p d a te S h e e t( M o n th S e q )

'. . . [код ]

E n d Sub

Возможно, главной причиной использования метода Run является присвоение назва­ ния процедуры переменной. Существует только один способ выполнить процедуру та­ ким образом (см. следующий пример). Процедура Main использует функцию VBA WeekDay для определения дня недели (целое число от 1 до 7, начиная с воскресенья). Переменной SubToCall присваивается строка, содержащая название процедуры. Затем метод Run вызывает соответствующую процедуру (WeekEnd или Daily).

Sub

M a in ()

 

 

 

 

 

 

D im S u b T o C a ll A s S t r i n g

 

 

 

S e le c t

C a se

W eekD ay(N ow )

 

 

C a s e

1,

7:

S u b T o C a ll

=

"W eekEn d"

 

C a se

E ls e :

S u b T o C a ll

=

" D a ily "

 

E n d

S e le c t

 

 

 

 

 

A p p lic a t i o n . R u n S u b T o C a ll

E n d

Sub

 

 

 

 

 

 

Sub

W e e k E n d ()

 

 

 

 

 

M sgB o x

"Сегодня выходной

день"

'

Код,

который

выполняется

в выходной

E n d

Sub

 

 

 

 

 

 

Sub

D a i l y ()

 

 

 

 

 

M sgB o x

"Сегодня будний

день"

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

261

1 Код, который выполняется в будний

день

End Sub

 

Вызов процедуры из другого модуля

Если VBA не может найти вызываемую процедуру в текущем модуле, он ищет про­ цедуры P u b lic в других модулях этого же проекта.

При вызове процедуры P r iv a te из другой процедуры обе они должны находиться в одном модуле.

Следует отметить, что в одном модуле не может быть двух процедур с одинаковыми на­ званиями, не допускается также использование процедуры с идентичными именами в разных модулях. Можно указать VBA выполнить неоднозначно названную процедуру, т.е. другую процедуру с тем же названием, но в другом модуле. Для этого введите перед названием про­ цедуры название модуля и точку. Предположим, вы создали процедуры с названием MySub в двух модулях: M odulel и Module2. Если требуется, чтобы процедура MySub в Module2 вызывала MySub из M odulel, то используйте один из следующих операторов.

M o d u le l. M ySub

C a ll M o d u le l. M ySub

Если вы не укажете разницу между процедурами с одинаковыми названиями, будет отображено сообщение об ошибке: Ambiguous Name D e te c te d (Обнаружено неод­ нозначное имя).

Вызов процедуры из другой рабочей книги

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

Чтобы добавить ссылку на другую рабочую книгу, выберите в VBE команду Tooted References (Сервис=>Ссылки). Будет отображено диалоговое окно References (Ссылки), как показано на рис. 9.3, в котором перечислены все существующие ссылки во всех от­ крытых рабочих книгах. Выставьте флажок, соответствующий той рабочей книге, на ко­ торую вы планируете добавить ссылку, и щелкните на кнопке ОК. После установки ссылки процедуры в этой рабочей книге можно вызывать так, будто они находятся в те­ кущей рабочей книге, к которой принадлежит вызывающая процедура.

Рабочая книга, на которую ссылаются, не обязательно должна быть открыта — она рас­ сматривается как отдельная библиотека объектов. Используйте кнопку Browse (Просмотр)

вдиалоговом окне References, чтобы установить ссылку на закрытую рабочую книгу.

©Примечание

Названия книг, которые указаны в списке ссылок соответствуют названиям

проектов VBE. По умолчанию каждый проект обычно называется V B A P ro - j e c t . Следовательно, в списке может содержаться несколько одинаково на­ званных элементов. Чтобы отличить определенный проект от других эле­ ментов в списке, измените его название в окне Properties (Свойства) редак­ тора VBE. Щелкните на имени проекта в окне Project (Проект) и выберите команду Tools^ ххх Properties (Сервисах** Свойства), где ххх — это имя те­ кущего проекта. Находясь в диалоговом окне Project Properties (Свойства проекта), щелкните на вкладке General (Общие) и измените имя, отобра­ жаемое в поле Project Name (Имя проекта).