Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 семестр / vba_2002

.pdf
Скачиваний:
81
Добавлен:
09.04.2015
Размер:
9.9 Mб
Скачать

имя файла. Вы можете импортировать только те файлы, которые экспортированы с помощью команды F\\e*>Export File.

Если вы решили скопировать в другой проект модуль или объект userFonn, не обязательно использовать функции экспорта и импорта. Убедитесь, что оба проекта открыты, затем активизируйте окно Project Explorer и перетащите необходимый объект из одного проекта в другой.

Работа с окнами кода

Когда вы в совершенстве овладеете VBA, то будете проводить много времени, работая в окнах кода. Каждому объекту в проекте соответствует свое окно кода. Такими объектами могут быть:

сама рабочая книга (ЭтаКнига в окне Project Explorer);

рабочий лист или лист диаграмм рабочей книги (например, Лист1 или Диаграммв1 в окне Project);

модуль VBA;

модуль класса (специальный тип модуля, позволяющий создавать новые классы объектов);

форма UserForm.

Сворачивание и восстановление окон

В любой момент в VBE можно открывать несколько окон кода, и это существенно усложняет работу. На рис. 7.5 представлена такая ситуация.

Рис.7.5.Редакторперегруженокнамикода

Часть III. Visual Basic for Applications

139

Окна кода во многом напоминают окна рабочих листов Excel. Вы можете их свернуть, развернуть, скрыть, изменить порядок отображения на экране и т.д. Многие пользователи предпочитают разворачивать окно кода, над которым они работают в данный момент, что позволяет видеть большую часть программы, не отвлекаясь на другие модули. Чтобы максимизировать окно кода, щелкните на кнопке Развернуть в строке заголовка или дважды щелкните на самой строке заголовка. Чтобы вернуть окну кода прежний размер, щелкните на кнопке Восстановить в строке заголовка.

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

Сворачивая окно кода, вы скрываете его в окне редактора. Кроме того, вы можете щелкнуть на кнопке Закрыть в строке заголовка окна кода, чтобы полностью его закрыть. Открыть окно кода заново можно, дважды щелкнув на соответствующем объекте в окне Project Explorer.

VBE не позволяет закрывать рабочую книгу. Для этого вы должны вернуться в окно Excel и там закрыть книгу. Однако вы можете использовать окно Immediate, чтобы закрыть рабочую книгу или отключить надстройку. Активизируйте окно Immediate, введите оператор VBA {пример показан ниже) и нажмите <Enter>:

Workbooks ("inyaddin . xla") . Close

Как видно, этот оператор выполняет метод C l o s e объекта Workbook, закрывающий рабочую книгу. В данном примере рабочая книга является надстройкой.

СохранениепрограммыVBA

Как правило, окно кода содержит четыре типа кода.

Процедуры (процедуры Sub). Процедура — это набор инструкций, выполняющих определенное действие.

Процедуры функции. Функция — это набор инструкций, возвращающий значение или массив значений (концепция функции VBА подобна такой же функции Excel).

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

Объяснение — это информация о переменной, предоставляемая VBA. Например, можно объявить тип данных для переменных, которые вы планируете использовать в коде.

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

Терминология

В разных частях книги используются термины подпрограмма, процедура, макрос. Программисты для описания автоматизированной задачи обычно используют слово процедура. В Excel процедуру также называют макросом. Технически процедура может быть двух видов: процедура sub или процедура функции (или просто функция), оба вида иногда называют подпрограммами. В книге эти термины используются как синонимы. Тем не менее, между процедурами sub и процедурами функции существует большая разница. О ней речь пойдет в главах 9 и 10,

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

140

Глава 7. Введение в Visual Basic for Applications

выполняется при открытии рабочей книги, то эта процедура должна располагаться в окне кода для объекта ЭтаКнига и иметь специальное название. Подобный вопрос станет более понятным после того, как вы рассмотрите события (глава 19) и пользовательские формы UserForm (часть IV).

Введение кода VBA

Для того чтобы выполнить одно из действий программным образом, необходимо написать программу VBA в окне кода. Код VBA располагается в процедуре. Процедура состоит из операторов VBA. На данном этапе (для примера) остановимся только на одном типе окна кода: модуль VBA.

Вы можете добавить код в модуль VBA тремя способами.

Ввести код традиционным способом: с клавиатуры.

Использовать функцию записи макросов в Excel, чтобы записать действия и преобразовать их в код VBA.

Скопировать текст программы из другого модуля и вставить его в модуль, над которым работаете.

Ввод кода вручную

Иногда самый простой путь является наилучшим. Непосредственное введение кода связано... с использованием клавиатуры, т.е. вы вводите код программы с помощью клавиатуры. Клавиша <ТаЬ> при этом используется с целью задать отступ в строках, которые логически принадлежат одной группе (например, условные операторы If и End If) . Это совершенно не обязательно, но помогает быстрее освоить программу, анализируя ее блочную структуру. Именно поэтому подобный подход в программировании называется "'хорошим стилем".

Ввод и редактирование кода в модуле VBA выполняется обычным образом. Вы можете выделять текст, копировать, вырезать его, а затем вставлять в другое место программы.

Отдельная инструкция в VBA может иметь произвольную длину. Однако, чтобы обеспечивать удобочитаемость кода, длинные инструкции лучше разбить на две или более строк. Для этого следует в конце строки ввести пробел и символ подчеркивания, а затем нажать <Enter> и продолжить инструкцию в следующей строке. Например, ниже приведен один оператор VBA, разбитый на четыре строки.

MsgBox "Невозможно найти" & UCase(SHORTCUTMENUFILE) _

& vbCrLf &

vbCrLf &

"Файл должен находиться в _

" & ThisWorkbook.Path & vbCrLf & vbCrLf & _

"Возможно,

требуется

переустановить BudgetMan", v b C r i t i c a l , APPNAME

Обратите внимание, что три последние строки этого оператора введены с отступом. Это необязательное условие, однако таким образом вы указываете что на самом деле эти четыре строки являются одним оператором.

Как и в Excel, в VBE есть несколько уровней отмены выполненных операций. По- с°в|Т этому, если вы по ошибке удалили инструкцию, можете несколько раз щелкнут» на кнопке Undo (Отменить) или нажать <Ctrl+Z>, и инструкция вновь появится в коде.

После отмены операции можно щелкнуть на кнопке Redo (Вернуть), чтобы вернуть изменения, которые ранее отменены. Эта функция поможет исправить критически важныеошибки, поэтомунепренебрегайтеееиспользованием.

Выполните такие действия: добавьте в проект модуль VBA, затем введите следующую процедуру в окне кода данного модуля:

Часть III. Visual Basic forApplications

141

Sub SayHelloO

Msg = "Ваше имя " & Application.UserName & "?" Ans = MsgBox(Msgr vbYesNo)

If Ans = vbMo Then

MsgBox "Ничего страшного."

Else

MsgBox "Наверное, я ясновидящий!" End If

End Sub

На рис. 7.6 показано, как это выглядит в модуле VBA.

Рис.7.6.ВашаперваяпроцедураVBA

При введении кода вы могли заметить, что VBE вносит некоторые изменения во введенный текст. Например, если вы пропустите пробел перед или после знака равенства (=}, VBE вставит его автоматически. Кроме того, изменяется цвет некоторых слов кода. Это нормально, и позже вы данный факт оцените.

Для выполнения процедуры S a y H e l l o убедитесь, что курсор находится во введенном вами тексте. Затем выполните одно из следующих действий.

Нажмите <F5>.

Выберите Rurr^Run Sub/UserForm.

Щелкните на кнопке Run Sub/UserForm на стандартной панели инструментов.

Если вы ввели код правильно, процедура будет выполнена. Вы сможете выбрать ответ в простом диалоговом окне (рис. 1.1), в котором отображается имя пользователя, заданное в диалоговом окне Параметры. Это окно вызывается го меню Сервис программы Excel. Обратите внимание, что при выполнении макроса активизируется программа Excel. На данном

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

Рис.7.7.Результатвыполненияпроцедуры,показаннойнарис.7.6

В большинстве случаев вы будете запускать макросы в Excel. Однако тестировать макрос удобнее, выполняя его прямо в VBE.

Написанная только что программа представляет собой процедуру VBA (называемую также макросом). Когда вы даете команду выполнить макрос, VBE быстро компилирует код и запускает

142

Глава 7. Введение в Visual Basic forApplications

его. Другими словами, каждая инструкция анализируется в VBE, a Excel всего лишь выполняет то, что указано в инструкциях. Вы можете выполнить макрос сколько угодно раз, хотя через некоторое время он теряет свою привлекательность.

При построении в этой простой процедуре использовались следующие принципы (все они рассмотрены далее в главе).

Объявление процедуры (первая строка).

Присвоение значения переменным (Msg и Ans).

Конкатенация строк (с помощью оператора &).

Использование встроенной функции VBA (MsgBox).

Применение встроенных констант VBA (vbYesNo и vbNo).

Использование конструкции I f - T h e n - E l s e .

Окончание процедуры (последняя строка).

Неплохо для первого раза, не правда ли?

Использование функции записи макросов

Одним из способов создания кода модуля VBA является запись последовательности действий с помощью специальной функции записи макросов Excel.

Как бы вы ни старались, но записать показанную в предыдущем примере процедуру Say- H e l l o вы не сможете. Запись макросов— полезное средство, но имеет свои ограничения. После записи макросов вы неоднократно будете вносить изменения или вводить дополнительный код вручную.

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

1.Активизируйте рабочий лист в книге (подойдет любой лист).

2.Выберите команду Сервис^Макрос^Начать запись.

При этом Excel отображает диалоговое окно Запись макроса.

3.Щелкните на кнопке ОК, чтобы принять параметры по умолчанию.

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

панель инструментов, содержащая две кнопки (Остановить запись и

Относительная ссылка).

4.Выполните команду Файл^Параметры страницы.

Excel отображает диалоговое окно Параметры страницы.

5.Выберите переключатель Альбомная и щелкните на кнопке ОК, чтобы закрыть 1зиалоговое окно.

6. Щелкните на кнопке Остановить запись на панели инструментов (или выберите С е р в и с а макрос<=>Остановить запись).

Excel прекращает записывать ваши действия.

Чтобы просмотреть макрос, запустите VBE (проще всего нажать <Alt+Fl 1>) и найдите проект в окне Project Explorer. Щелкните на узле Modules, чтобы развернуть его, Затем щелкните на элементе Module 1, чтобы отобразить окно кода (если в проекте уже присутствовал модуль Module"!, новый макрос будет находиться в модуль Module2). Код, созданный

Часть III. VisualBasic forApplications

143

одной командой, представлен в листинге 7.1. Если вы используете не Excel 2002, а иную версию,текстпрограммы можетнемного отличаться.

Листинг 7.1. Макрос изменения ориентации страницы на альбомную

Sub Макрос1{)

' Макрос1 Макрос 1 Макрос записан 19.08.2003

With ActiveSheet.PageSetup

.PrintTitleRows = ""

.PrintTitleColumns = "" End With

ActiveSheet.PageSetup.PrintArea = "" With ActiveSheet.PageSetup

.LeftHeader = ""

.CenterHeader = ""

.RightHeader = "n

.LeftFooter = ""

.CenterFooter = "

.RightFooter = ""

.LeftMargin = Application ЛnchesToPoints(0.787401575)

.RightMargin = Application.InchesToPoints(0.787401575)

.TopMargin = Application.InchesToPoints(0.984251969)

.EottomMargin = Application.InchesToPoints(0.984251969)

. HeaderMargin = Application. InchesToPoints (0.5)

.FooterMargin = Applicatior.InchesToPoints(0.5)

.PrintHeadings = False

.PrintGridlines = False

.PrintComments = xlPrintNoComments •PrintQuality = 1200

.CenterHorizontally = False

.CenterVertically = False

.Orientation = xlLandscape

.Draft = False

.PaperSize • xlPaperA4

.FirstPageNumber - xlAutoma tic

.Order = xlDownThenOver

.BlackAndWhite = False

.Zoom = 100

.PrintErrors = xlPrintErrorsDisplayed End With

End Sub

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

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

144

Глава 7. Введение в Visual Basic for Applications

Sub Макрос1

With ActiveSheet.PageSetup ,Orientation = xlLandscape

End With End Sub

Мы удалили весь код, кроме строки, изменяющей свойство Orientation. На самом деле данный макрос можно упростить еще больше, так как конструкция With-End With не обязательна при изменении только одного свойства.

Sub Макрос1

ActiveSheet.PageSetup.Orientation = xlLandscape End Sub

В данном примере макрос изменяет свойство Orientation объекта PageSetup активного листа. Отметим, что xlLandscape — это встроенная константа, которая преднашачена для облегчения изменения ориентации. Переменная xlLandscape имеет значение 2, axlPortrai t —значение 1. Следующий макрос работает, как и предыдущий Макрос].; Sub Макрос1

ActiveSheet.PageSetup.Orientation = 2 End Sub

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

Зачастую данная процедура вводится непосредственно в модуль VBA, но для этого необходимо знать, какие объекты, свойства и методы требуется использовать. Очевидно, что быстрее записать макрос. Кроме того, данный пример продемонстрировал наличие у объекта PageSetup свойства O r i e n t a t i o n .

Я считаю, что запись действий — это лучший способ изучить VBA. Если у вас возникают проблемы с введением кода, то воспользуйтесь функцией записи действий. Несмотря на то, что в результате вы можете получить не совсем то, что ожидалось, результирующий код укажет правильное направление. Для получения информации об объектах, свойствах и методах, которые присутствуют в записанномкоде,используйтеэлектроннуюсправочнуюсистему.

Механизм записи макросов подробнее рассмотрен далее в этой главеСм. раздел "Функция записи макросов".

Копирование кода VBA

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

Как уже отмечалось в этой главе, вы также можете импортировать в файл модуль, который был ранее экспортирован.

Часть III. VisualBasic totApplications

145

Специальные настройки VBE

Впроцессе программирования в Excel вы будете проводить много времени, работая в окнах VBE. Чтобы сделать редактор более удобным, вы можете настроить некоторые параметры.

Встроке меню окна VBE выберите Tools^Options (СервисФПараметры). Будет отображено диалоговое окно с четырьмя вкладками: Editor (Редактор), Editor Format (Формат редактора). General (Общие) и Docking (Присоединение). Некоторые наиболее часто используемые параметры этих вкладок будут рассмогрены в следующих разделах. Кстати, не путайте это окно с диалоговым окном Параметры программы Excel, которое можно открыть в Excel с помощью подобной команды — Сервис^Параметры. В этих диалоговых окнах, хотя они и называются одинаково, задаются разные параметры.

Использование вкладки Editor

На рис. 7.8 показаны параметры, доступные на вкладке Editor диалогового окна Options.

Параметр Auto Syntax Check

Настройка Auto Syntax Check (Автоматическая проверка синтаксиса) определяет, будет ли появляться диалоговое окно, когда VBE обнаруживает синтаксическую ошибку в коде VBA. В этом диалоговом окне указывается тип допущенной ошибки. Если снять этот флажок, то VBE будет выделять синтаксические ошибки, отображая соответствующие фрагменты кода другим цветом, и вам не придется работать в диалоговых окнах, которые появляются на экране.

Некоторые пользователи отключают пара- Рис. 7.8. Вкладка Editor диалогового окна Options

метр Auto Syntax Check, так как диалоговые

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

Параметр Require Variable Declaration

При активизированном параметре Require Variable Declaration (Обязательное декларирование переменных) VBE вставляет в начале; каждого нового модуля следующий оператор:

Option Explicit

Если в модуле задан этот оператор, то вы должны явно определить каждую используемую в нем переменную. Таким образом, у вас вырабатывается хорошая привычка, которая, правда, требует от вас дополнительных усилий. Если вы не объявляете переменные, все они имеют тип данных V a r i a n t ; это достаточно гибко, но неэффективно с точки зрения использования аппаратных ресурсов и скорости выполнения кода (см. далее в этой главе),

Изменение параметра Require Variable Declaration затрагивает только новые моммвпсу дули, а не уже существующие.

146 Глава 7. Введение в Visual Basic for Applications

ПараметрAutoListMembers

Если выставлена опция Auto List Members (Автоматическая вставка объектов), VBE предоставляет помощь при вводе кода VBA, отображая список элементов текущего объекта. К этим элементам относятся методы и свойства объекта, название которого вводится вручную.

Данный параметр весьма полезен, поэтому рекомендуется его всегда активизировать. На рис. 7.9 показан пример использования опции Auto List Members (предназначение которой станет понятнее, когда вы начнете вводить код VBA самостоятельно). В данном примере VBE отображает список элементов объекта A p p l i c a t i o n . Вы можете выбрать элемент из списка, чгабы не вводить его с клавиатуры {в результате название элемента точно будет введено без ошибок).

Рис. 7.9. Пример использования опции Auto List Members

ПараметрAuto Quick Info

Если включен параметр Auto Quick Info (Отображать краткие сведения), VBE отображает информацию об аргументах функций, свойств и методов, названия которых вы вводите с клавиатуры. Это очень полезно, поэтому рекомендуется всегда оставлять эту настройку включенной. На рис. 7.10 данная функция показана в действии: отображается синтаксис свойства Range.

Рис. 7.10. ПримерфункцииAutoQuickInfo, предоставляющейсведений о свойстве Range

ПараметрAuto DataTips

Если включен параметр Auto Data Tips, VBE отображает при отладке кода значение переменной, над которой находится курсор. Когда вы ознакомитесь с инструментами отладки

Часть №. Visual Basic for Applications

147

в VBE, то по достоинству сможете оценить этот параметр. Рекомендуем всегда держать его включенным.

Параметр Auto Indent

Настройка Auto Indent (Автоматический отступ) определяет, располагает ли VBE автоматически каждую новую строку программы с тем же отступом, который задан для предыдущей строки. Тем, кто использует отступы в программных кодах, советуем всегда обращаться к этому параметру. Вы можете также задать количество символов в отступе (по умолчанию указано значение 4).

Используйте клавишу <ТаЬ>, а не пробел, чтобы задать отступ в коде, Кроме того, для отмены отступа в конкретной строке можно использовать комбинацию клавиш <Shift+Tab>, которая работает также и при выделении более чем одного оператора.

Параметр Drag-and-Drop Text Editing

При выборе параметра Drag-and-Drop Text Editing (Включить редактирование перетаскиванием) вы можете копировать и перемещать текст, перетаскивая его с помощью мыши. Например, я оставляю этот параметр включенным, но никогда не пользуюсь функцией перетаскивания, так как предпочитаю для копирования и вставки обращаться к комбинациям клавиш.

Параметр Default to Full Module View

Параметр Default to Full Module View (По умолчанию использовать полный режим просмотра) определяет принцип просмотра процедуры. При включении этого параметра процедуры в окне кода помещаются в одно окно с полосой прокрутки. Если же он отключен, то вы можете просматривать одновременно только одну процедуру. Рекомендуем активизировать этот параметр.

Параметр Procedure Separator

Когда параметр Procedure Separator (Разделение процедур) включен, в конце каждой процедуры в окне кода отображаются специальные разделители. Если вам нравятся эти визуальные подсказки окончания процедуры, выставляйте данный флажок.

Использование вкладки Editor Format

На рис. 7.11 показана вкладка Editor Format диалогового окна Options.

|1 Рис. 7.11. Вкладка EditorFormat диалогового окна Options

148

Глава 7. Введение в Visual Basic for Applications

Соседние файлы в папке 2 семестр