В совершенстве овладев VBA, вы будете много времени работать в окнах кода. Каждому объекту в проекте соответствует свое окно кода. Такими объектами могут быть следующие:
• сама рабочая книга (ЭтаКнига в окне Project Explorer);
• рабочий лист или лист диаграммы рабочей книги (например, Лист1 или Диаграмма! в окне Project Explorer);
• модуль VBA;
• модуль класса (специальный тип модуля, позволяющий создавать новые классы объектов);
• форма UserForm.
Сворачивание и восстановление окон
В любой момент в редакторе VBE можно открыть несколько окон кода, и это существенно усложняет работу. Окна кода во многом напоминают окна рабочих листов Excel. Их можно свернуть, развернуть, скрыть, изменить порядок отображения на экране и т.д. Многие пользователи предпочитают разворачивать окно кода, над которым они работают в данный момент, что позволяет видеть большую часть программы, не отвлекаясь на другие модули. Чтобы максимизировать окно кода, щелкните на кнопке Развернуть в строке заголовка или дважды щелкните на самой строке заголовка. Чтобы вернуть окну кода прежний размер, щелкните на кнопке Восстановить в строке заголовка.
Иногда необходимо, чтобы на экране отображалось сразу несколько окон кода. Например, требуется сравнить код в двух модулях или скопировать код из одного модуля в другой.
Сворачивая окно кода, вы скрываете его в окне редактора. Кроме того, можно щелкнуть на кнопке Свернуть (Close) в строке заголовка окна кода, чтобы полностью его закрыть. Открыть окно кода заново можно, дважды щелкнув на соответствующем объекте в окне Project Explorer.
VBE не позволяет закрывать рабочую книгу. Для этого вы должны вернуться в окно Excel и там закрыть книгу. Однако можно использовать окно отладки (Immediate), чтобы закрыть рабочую книгу или отключить надстройку. Активизируйте это окно, введите оператор VBA (пример показан ниже) и нажмите <Enter>.
Workbooks(“myaddin.xlam”).Close
Этот оператор выполняет метод Close объекта Workbook, закрывающий рабочую книгу. В данном примере рабочая книга является надстройкой.
Сохранение кода VBA
Как правило, окно кода содержит четыре типа кода.
• Sub (Процедура). Это набор инструкций, выполняющих определенное действие.
• Function (Функция). Это набор инструкций, возвращающий значение или массив значений (функции VBA напоминают функции рабочего листа Excel, например СУММ).
• Property (Процедуры свойств). Специальные процедуры, используемые в модулях классов.
• Объявление. Объявления включают информацию о переменной, которая предоставляется VBA. Например, можно объявить тип данных для переменных, которые вы планируете использовать в коде.
В отдельном модуле VBA может храниться любое количество процедур, функций и объявлений. Способ организации модуля VBA зависит только от вашего желания. Можно записывать весь код VBA приложения в одном модуле VBA или разделять код на несколько модулей.
Несмотря на то, что пользователям предоставляются широкие возможности по выбору места хранения кода VBA, существует ряд ограничений. Процедуры обработки событий должны содержаться в окне кода объекта, которому соответствует это событие. Например, если создана процедура, которая вызывается при открытии рабочей книги, то эта процедура должна располагаться в окне кода для объекта ЭтаКнига и иметь специальное название.
Ввод кода VBA
Для того чтобы выполнить одно из действий программным образом, необходимо написать программу VBA в окне кода. Код VBA располагается в процедуре. Процедура состоит из операторов VBA. На данном этапе (для примера) остановимся только на одном типе окна кода – модуле VBА.
Вы можете добавить код в модуль VBA тремя способами.
• Ввести код вручную. Для этого используйте клавиатуру.
• Использовать функцию создания макросов. Используйте функцию записи макросов в Excel, чтобы записать действия и преобразовать их в код VBA.
• Использовать операцию копирования и вставки. Скопируйте текст программы из другого модуля и вставьте его в модуль, над которым работаете.
Ввод кода вручную
Иногда самый простой путь является наилучшим. Непосредственное введение кода связано с использованием клавиатуры, т.е. вы вводите код программы с помощью клавиатуры. Клавиша <Tab> при этом поможет задать отступ в строках, которые логически принадлежат одной группе (например, условные операторы If и End If). Это совершенно не обязательно, но помогает быстрее освоить программу, анализируя ее блочную структуру.
Ввод и редактирование кода в модуле VBA выполняются обычным образом. Вы можете выделять текст, копировать и вырезать, а затем вставлять в другое место программы.
Здесь применяются термины подпрограмма, процедура и макрос. Программисты для описания автоматизированной задачи обычно используют слово процедура. В Excel процедуру также называют макросом. Технически процедура может быть двух видов: Sub (Подпрограмма) либо Function (Функция); оба вида иногда называют подпрограммами. Здесь эти термины используются как синонимы. Тем не менее между процедурами типа Sub и Function существует большая разница.
Отдельная инструкция в VBA может иметь произвольную длину. Однако для обеспечения удобочитаемости кода длинные инструкции лучше разбить на две или более строк. Для этого следует в конце строки ввести пробел и символ подчеркивания, а затем нажать <Enter> и продолжить инструкцию в следующей строке. Например, ниже приведен один оператор VBA, разбитый на четыре строки.
MsgBox “Невозможно найти ” & UCase(SHORTCUTMENUFILE) _
& vbCrLf & vbCrLf & “Файл должен находиться в ” _
& ThisWorkbook.Path & vbCrLf & vbCrLf _
& “Возможно, требуется переустановить BudgetMan ”, _
vbCritical, APPNAME
Как и в Excel, в VBE существует несколько уровней отмены операций. Поэтому, если вы по ошибке удалили инструкцию, можете несколько раз щелкнуть на кнопке Отменить (Undo) (либо нажать клавиши <Ctrl+Z>), после чего инструкция вновь появится в коде. После отмены операции можно щелкнуть на кнопке Вернуть (Redo) (либо нажать клавиши <Ctrl+Y>), чтобы вернуть изменения, которые ранее были отменены. Эта функция поможет исправить критически важные ошибки.
Выполните такие действия: добавьте в проект модуль VBA и введите следующую процедуру в окне кода данного модуля (рисунок ниже).
При вводе кода вы могли заметить, что VBE вносит некоторые изменения во введенный текст. Например, если пропустить пробел перед или после знака равенства (=), VBE автоматически вставит его. Кроме того, изменяется цвет некоторых слов кода. Это нормально, и позже вы оцените данный факт.
Для вызова на выполнение процедуры SayHello убедитесь в том, что текстовый курсор находится в области вводимого текста. Затем выполните следующие действия.
1. Нажмите клавишу <F5>.
2. Выберите команду Выполнить→Выполнить процедуру/пользовательскую форму (Run→Run Sub/UserForm).
3. Щелкните на кнопке Run Sub/UserForm, находящейся на панели инструментов Standard.
Если вы ввели код правильно, процедура будет выполнена. Вы сможете выбрать ответ в простом диалоговом окне, в котором отображается имя пользователя, заданное в диалоговом окне Параметры Excel (Excel Options). Обратите внимание, что при выполнении макроса активизируется программа Excel. На данном этапе вам не обязательно понимать принципы работы программы; в этом вы разберетесь позже.
В большинстве случаев вы будете запускать макросы в Excel. Однако тестировать макрос удобнее, выполняя его непосредственно в VBE.
Написанная программа представляет собой процедуру VBA (называемую также макросом). Когда вы даете команду выполнить макрос, VBE быстро компилирует код и запускает его. Другими словами, каждая инструкция анализируется в VBE, a Excel всего лишь выполняет то, что указано в инструкциях. Вы можете выполнить макрос сколько угодно раз.
При выполнении кода этой простой процедуры выполнялись следующие действия:
• объявление процедуры (первая строка);
• присвоение значения переменным (Msg и Ans);
• конкатенация строк (с помощью оператора &);
• использование встроенной функции VBA (MsgBox);
• применение встроенных констант VBA (vbYesNo и vbNo);
• использование конструкции If-Then-Else;
• окончание процедуры (последняя строка).
Использование средства записи макросов
Одним из способов создания кода модуля VBA является запись последовательности действий с помощью специальной функции записи макросов Excel.
Как бы вы ни старались, но записать показанную в предыдущем примере процедуру SayHello вы не сможете. Запись макросов – полезное средство, но оно имеет свои ограничения. После записи макросов вы неоднократно будете вносить изменения или вводить дополнительный код вручную.
В следующем примере показано, как записать макрос, изменяющий ориентацию страницы на альбомную. Если вы хотите получить его самостоятельно, то начните работу с пустой рабочей книги и выполните следующие действия.
1. Активизируйте рабочий лист в книге (подойдет любой лист).
2. Выберите команду Разработчик→Код→Запись макроса. После этого Excel отобразит диалоговое окно Запись макроса.
3. Щелкните на кнопке ОК, чтобы принять параметры, заданные по умолчанию.
Excel автоматически вставит новый модуль VBA в проект VBA рабочей книги. Начиная с этого момента, Excel будет преобразовывать все ваши действия в код VBA. Обратите внимание, что в строке состояния Excel отображается голубой квадратик. После щелчка на нем запись макроса прекращается.
4. Выберите команду Разметка страницы→Параметры страницы→Ориентация→Альбомная.
5. Выберите команду Разрабочик→Код→Остановить запись или щелкните на голубом квадратике, который находится в строке состояния.
Программа Excel прекратит запись ваших действий.
Чтобы просмотреть макрос, запустите VBE (проще всего нажать клавиши <Alt+F11>) и найдите проект в окне Project Explorer. Щелкните на узле Modules, чтобы развернуть его. Затем щелкните на элементе Module1, чтобы отобразить окно кода (если в проекте уже присутствовал модуль Module1, новый макрос будет находиться в модуле Module2). Код создан всего лишь одной простой командой Excel. Строки кода с предшествующими им апострофами являются комментариями и не выполняются.
Возможно, вас удивит объем кода, сгенерированного всего лишь одной командой (особенно если вы записываете макрос впервые). Несмотря на то, что вы изменили только одну простую настройку на вкладке Параметры страницы, Excel генерирует код, задающий все параметры в этом диалоговом окне.
Таким образом, зачастую программа, полученная при записи макроса, избыточна. Если вы хотите, чтобы макрос всего лишь изменял ориентацию страницы на альбомную, можете значительно упростить его, удалив ненужный код. Это облегчит восприятие макроса и ускорит его выполнение, поскольку избавит его от лишних операций. Упростить макрос вы вправе до следующего вида.
Sub Macro1()
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, a xlPortrait – значение 1. Следующий макрос работает, как и предыдущий Макрос1.
Sub Макрос1а()
ActiveSheet.PageSetup.Orientation = 2
End Sub
Многим пользователям легче запомнить название константы, чем произвольные числа. Вы можете воспользоваться справочной системой, чтобы выучить соответствующие каждой настройке константы.
Зачастую данная процедура вводится непосредственно в модуль VBA, но для этого необходимо знать, какие объекты, свойства и методы требуется использовать. Но ведь записать макрос быстрее. Кроме того, данный пример продемонстрировал наличие у объекта PageSetup свойства Orientation.
Запись действий – это наилучший способ изучить VBA. Если у вас возникают проблемы с введением кода, воспользуйтесь функцией записи действий. Даже если вы получаете совсем не то, чего ожидали, результирующий код укажет правильное направление. Для получения информации об объектах, свойствах и методах, которые присутствуют в записанном коде, используйте электронную справочную систему.
Копирование кода VBA
Выше были рассмотрены способы непосредственного ввода кода и записи действий для создания программы VBA. Последний метод добавления кода в модуль VBA – копирование текста программы из другого модуля. Например, вы могли написать процедуру в одном из более ранних проектов, которая также используется в текущем проекте. Вместо того чтобы заново вводить код, достаточно открыть рабочую книгу, активизировать модуль и использовать стандартные способы копирования и вставки, чтобы скопировать его в текущий модуль VBA. Если после вставки возникает необходимость, подкорректируйте код модуля.
И не забывайте об Интернете. На веб-сайтах, форумах и в блогах можно найти тысячи примеров кода VBА. Достаточно скопировать нужный пример в окне браузера и вставить его в окно модуля VBА.
Как уже отмечалось, можно импортировать в файл модуль, который был ранее экспортирован.