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

2 семестр / Программирование на VBA

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

сначала открыть модуль, содержащий этот макрос.

Задание 1. Откройте модуль в Excel, содержащий макрос

FormatArialBoldl2.

Для этого:

üнажмите Alt+F11, чтобы активизировать Редактор VB, если он еще не

открыт;

üвыберите команду View/Project Explorer (Вид/Окно проекта), чтобы отобразить Project Explorer;

üпросмотрите дерево-список в Project Explorer, чтобы найти модуль, который вам необходимо отобразить. Если опция просмотра папок в Project Explorer включена, вы найдете все модули проекта в папке Modules вашего проекта;

üдважды щелкните на модуле, который вам необходим; Редактор VB отображает этот модуль в Code Window (Окно программы).

После того как вы отобразите модуль, можете использовать список Procedure (Процедура) в Code Window для получения определенного макроса в этом модуле.

Замечание 1. Когда вы записывали макрос FormatArialBoldl2 в Excel 2003 во время изучения первой части, вы сохранили его в рабочей книге Personal.xls. Если это был первый макрос, какой вы когда-либо записали и сохранили в Personal.xls, Excel сохранил макрос FormatArialBoldl2 в модульном листе с именем Module1. Если бы вы затем записали другой макрос в том же самом сеансе работы, Excel также сохранил бы его в том же самом модуле (Module1). Если вы выходили из Excel между временем записи вами макроса FormatArialBoldl2 и временем записи другого макроса, Excel сохранил последний макрос в другом модуле (скорее всего, в Module2).

Использование инструмента Object Browser

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

Задание 2. Найдите макрос FormatArialBoldl2 в Excel с помощью Object Browser.

Для этого:

üнажмите Alt+F11, чтобы открыть Редактор VB

üвыберите View/Project Explorer (Вид/Окно проекта) для отображения

Project Explorer;

üв Project Explorer выделите проект VBA VBAProject (PERSONAL.XLS), в

котором вам необходимо найти макрос FormatArialBoldl2;

üвыберите команду View/Object Browser (Вид/Просмотр объектов).

Редактор VB отобразит диалоговое окно Object Browser (рис. 5);

üубедитесь, что в раскрывающемся списке Project/Library

(Проект/Библиотека) выделен элемент <AII Libraries> (<Все библиотеки>). Окно

21

Object Browser отображает все имеющиеся модули и объекты в списке Classes

(Классы);

Project/Library

Search Text

Search

Рис. 5

üвведите имя макроса FormatArialBoldl2, который вам необходимо найти,

вполе Search Text (Образец поиска);

Рис. 6

22

ü щелкните на кнопке Search (Поиск) в окне Object Browser. Object Browser выполняет поиск текста, который вы ввели в окно Search Text, в вашем проекте VBA (а также в других открытых в данный момент библиотеках);

После выполнения поиска меняется вид окна Object Browser: оно отображает список Search Results (рис. 6). Если Object Browser обнаружил макросы, совпадающие с текстом в окне Search Text (Образец поиска), они отображаются в списке Search Results (Результаты поиска). В противном случае,

вэтом списке отображается сообщение No items found (Элементы не найдены).

üЩелкните на макросе в списке Search Results, затем на кнопке View Definition (Описания) в окне Object Browser. Редактор VB открывает Code Window

(Программы) для модуля, содержащего этот макрос, и отображает исходный код макроса (листинг 1).

Листинг 1 Текст макроса FormatArialBold12

1Sub FormatArialBold12()

2'

3' FormatArialBold12 Макрос

4' Макрос записан 12.11.2007 (Titov) Форматирует текст диапазона: Arial, Bold, 12

5'

6

7'

8With Selection.Font

9.Name = "Arial"

10.FontStyle = "полужирный"

11.Size = 12

12.Strikethrough = False

13.Superscript = False

14.Subscript = False

15.OutlineFont = False

16.Shadow = False

17.Underline = xlUnderlineStyleNone

18.ColorIndex = xlAutomatic

19End With

20End Sub

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

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

üнажмите Alt+F11, чтобы открыть Редактор VB;

üвыберите View/Project Explorer (Вид/Окно проекта), чтобы отобразить

Project Explorer;

üв Project Explorer выделите проект VBA, в котором вам необходимо

23

найти макрос;

üвыберите команду View/Object Browser (Вид/Просмотр объектов).

Редактор VB отображает диалоговое окно Object Browser;

üвыделите имя вашего проекта в раскрывающемся списке Project/Library окна Object Browser. Если только вы не изменили имени вашего проекта, он называется VBAProject в Excel;

üвыделите модуль в списке Classes (Классы). Окно Object Browser отображает теперь все макросы в выделенном модуле в списке Members of <object> (Компонент <объект>). Точный заголовок этого списка изменяется в зависимости от объекта, выделенного в списке Classes;

üвыделите макрос, исходный код которого вам необходимо увидеть, в

списке Members of <object>;

üщелкните на кнопке View Definition (Описания) в окне Object Browser.

Редактор VB открывает Code Window для модуля, содержащего этот макрос, и отображает исходный код макроса.

Если вы рассмотрите несколько записанных макросов, то заметите, что все они имеют общие элементы. Листинг 1 показывает исходный код для макроса FormatArialBoldl2 в Excel, который вы записали при изучении части 1. В листинге 1 строка 1 является началом записанного макроса. Каждый макрос VBA начинается с ключевого слова Sub, за которым следует имя макроса. Строку, содержащую ключевое слово Sub и имя макроса, называют строкой объявления (declaration) макроса. За именем макроса всегда следуют пустые круглые скобки.

Строки 2–7 являются комментариями. Комментарий (comment) – это строка

вмакросе VBA, которая, действительно, не содержит инструкции, являющиеся частью этого макроса. Для VBA любой текст, который следует за апострофом (ключевым словом Rem), представляет собой комментарий, начинающийся с апострофа и заканчивающийся в конце этой строки. Записанный макрос всегда начинается со строк комментариев, формулирующих имя макроса и содержащих текст, который вы ввели в текстовое окно Description (Описание) диалогового окна Record Macro (Запись макроса) в момент записи этого макроса. Конкретное

количество и содержимое строк комментариев в записанном макросе зависит от длины вводимого вами описания.

Сразу за объявлением макроса следует тело (body) макроса (которое может включать или не включать строки комментариев). В листинге 1 строки 8-19 составляют тело макроса FormatArialBodyl2. Каждая строка в теле макроса состоит из одного или более операторов VBA. Оператор (statement) VBA – это последовательность ключевых слов и других символов, которые вместе составляют одну полную инструкцию для VBA. Макрос VBA состоит из одного или нескольких операторов. Операторы VBA в записанном макросе содержат инструкции, соответствующие действиям, которые вы выполняли, когда записывали этот макрос. Например, строка 9 в листинге 1 устанавливает шрифт Arial, – строка 10 – размер шрифта и так далее.

За телом макроса следует строка, содержащая ключевые слова End Sub, которые сообщают VBA о том, что достигнут конец макроса. Макрос в листинге 1 заканчивается в строке 20.

24

Когда вы запускаете макрос, VBA начинает выполнение кода с первой строки в теле этого макроса (первая строка после объявления макроса) и выполняет инструкции в этой строке последовательно слева направо. Затем VBA переходит к следующей строке и выполняет инструкции в ней и так далее, пока он не достигнет конца макроса, обозначенного оператором End Sub. VBA игнорирует любые строки комментариев, которые могут появиться в теле макроса.

Как вы могли уже заметить, многие строки в записанном макросе имеют отступ от левого края. Каждый уровень отступа помогает отделять одну часть макроса от другой. Заметьте, что все тело каждого макроса смещено вправо между ключевыми словами Sub…End Sub для наглядного выделения тела макроса. В других местах (в строках 9–18 в листинге 1) операторы расположены с еще большим отступом. Этот второй, больший уровень отступа помогает определить все операторы, заключенные между ключевыми словами With…End With. В следующих частях оператор With…End With будет рассмотрен подробнее.

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

Когда вы будете просматривать записанный макрос на экране (используя Редактор VB), то заметите, что различные части текста макроса отображаются различными цветами. Комментарии отображаются зеленым цветом, тогда как Sub, End Sub и другие ключевые слова VBA – синим. Остальной текст в макросе отображается черным цветом для указания на то, что он содержит данные и программные операторы, созданные пользователем. VBA выполняет цветовое кодирование текста на экране, чтобы можно было легко определить, какую часть макроса или оператор вы просматриваете.

При редактировании кода макроса в модуле вы можете использовать команды и методы, известные вам как пользователю Windows, Word или Excel.

Для сохранения изменений, которые вы вносите в модуль, используйте команду File/Save (Файл/Сохранить) Редактора VB или щелкайте на кнопке Save (Сохранить) на панели инструментов. Любые изменения, которые вы выполняете в модуле, также сохраняются всякий раз, когда вы сохраняете файл рабочей книги, содержащий этот модуль. (Excel выдает запрос на сохранение любых изменений, выполненных в Personal.xls, при выходе.)

Задание 3. Добавьте в макрос FormatArialBoldl2 символ продолжения строки.

Для этого:

üпереместите курсор вставки в строку 10 за знак =;

üнапечатайте один пробел и символ подчеркивания ( _ ) и нажмите клавишу Enter;

üвыполните макрос FormatArialBoldl2.

Замечание 3. Символу подчеркивания предшествует пробел, отделяя его от

25

другого текста в строке. Эта особая комбинация символа пробела, за которым следует символ подчеркивания в конце строки, называется символом продолжения строки (line-continuation character) и сообщает VBA о том, что

следующая строка макроса должна быть присоединена к текущей строке для образования единого оператора. Операторы, разделенные (уместнее было бы говорить «объединенные») символом продолжения строки, размещаются с еще большим отступом, чтобы их было легче обнаружить при чтении кода.

Перемещение или копирование макроса из одного модуля в другой

Для копирования одного макроса используйте Clipboard, выполняя следующие шаги:

üотобразите макрос, который вам необходимо копировать;

üвыделите весь текст исходного кода макроса. Убедитесь, что вы выделили весь макрос, включая строки Sub, End Sub и все строки между ними;

üвыберите команду Edit/Сору (Правка/Копировать) для копирования текста макроса в Clipboard;

üотобразите модуль, в который вам необходимо копировать этот макрос;

üвыберите команду Edit/Paste (Правка/Вставить) для вставки текста макроса в модуль.

Упражнение 1

Создайте произвольный макрос, не содержащийся в Module1, и переместите его в Module1.

Замечание 4. Вы можете пользоваться описанным выше методом для копирования макроса в тот же модуль, в другой модуль одного и того же проекта или в модуль другого проекта. Можно также использовать этот метод для вставки текста макроса в другие приложения Windows.

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

Если вам необходимо сделать резервную копию всего модуля, вы можете сохранить его как текстовый файл. Сохранение целого модуля как текстового файла полезно, если вы хотите импортировать модуль в другой проект VBA, создать архивные копии вашей. Такое сохранение модуля называется экспортированием модуля. После того как вы экспортируете модуль, вы можете импортировать его в любой проект VBA или Visual Basic.

Для экспортирования модуля как текстового файла выполните следующее:

üвыделите в Project Explorer модуль, который хотите экспортировать;

üвыберите команду File/Export File (Файл/Экспорт файла). Редактор VB отображает диалоговое окно Export File (Экспорт файла) (рис. 7);

üв списке Папка (Save In) выберете диск и папку, в которой вы хотите сохранить текстовый файл;

üвведите имя экспортируемого файла в текстовое окно Имя файла (File Name). Редактор VB вводит имя модуля по умолчанию;

üубедитесь, что в списке Тип файла (Save as type) выделен пункт Basic Files (*.bas). Расширение *.bas определяет этот файл как файл исходного кода VBA или Visual Basic. Информация, сохраняемая в этом файле, – это читаемый

26

текст;

ü щелкните на кнопке Сохранить (Save), чтобы экспортировать файл. Редактор VB экспортирует выделенный модуль и закрывает диалоговое окно

Export File.

Рис. 7

Упражнение 2

Экспортируйте Module1 в Excel.

Замечание 5. Когда вы экспортируете модуль, Редактор VB создает файл читаемого текста, содержащий все макросы в этом модуле. Если необходимо, вы можете просматривать или редактировать файлы *.bas, созданные Редактором VB, с помощью Блокнот или Visual Basic. Обратите внимание на то, что текст в файле *.bas, отображенный приложением Блокнот, содержит строки, начинающиеся со слова Attribute и отсутствующие в модуле в Code. Редактор VB добавляет эти дополнительные строки к экспортированному файлу *.bas, поскольку они содержат информацию, которая потребуется VBA или Visual Basic, если вы в дальнейшем будете импортировать файл *.bas в другой проект.

Вы можете добавлять любой модуль, экспортированный вами как файл *.bas, в любой из проектов VBA. Модуль добавляется в проект импортированием текстового файла *.bas. Для того чтобы импортировать файл *.bas, выполните следующее:

üвыделите проект в Project Explorer, в который необходимо импортировать файл *.bas;

üвыберите команду File/Import File (Файл/Импорт файла). Редактор VB отображает диалоговое окно Import File (Импорт Файла) рис. 8;

üв списке Папка (Look In) выберете диск и папку, в которой содержится файл, который вам необходимо импортировать в ваш проект. Это должен быть файл, который вы создали, используя Редактор VB для экспортирования модуля;

üубедитесь, что в списке Тип файлов (Files Of Type) выделен пункт VB Files (*.frm, *.bas, *.cls);

üщелкните мышью дважды на имени файла, который вам необходимо

27

импортировать. Редактор VB читает файл и добавляет модуль в ваш проект. Если проект уже содержит модуль с тем же именем, что и модуль, импортируемый вами, Редактор VB добавляет число в конец имени модуля (1, 2, 3 и так далее) для создания уникального имени модуля.

Рис. 8

Упражнение 3

Импортируйте экспортируемый модуль из упражнения 2 в Excel.

Замечание 6. Команда Import File (Импорт Файла) позволяет добавлять в проект файлы форм (*.frm), программ (*.bas) и описания классов (*.cls). Файлы этих же форматов можно экспортировать с помощью команды Export File

(Экспорт файла).

Удаление модулей из проекта

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

üвыделите модуль, который хотите удалить из проекта, в Project Explorer Редактора VB;

üвыберите команду File/Remove <object>… (Файл/Удалить <объект>…).

Редактор VB отображает окно сообщения, запрашивающее у вас, хотите ли вы экспортировать модуль перед тем, как удалить его (рис. 9);

Рис. 9

ü щелкните на кнопке Да (Yes), если хотите экспортировать модуль перед

28

его удалением. Настоятельно рекомендуется экспортировать модуль как файл *.bas, если только вы не уверены абсолютно, что вам никогда не понадобятся макросы, содержащиеся в этом модуле. Иначе можно щелкнуть на кнопке Нет (No) для удаления модуля без его экспортирования;

ü если вы выберите экспортирование модуля перед его удалением, Редактор VB отображает диалоговое окно Export File, описанное ранее в этой части. Заполните диалоговое окно Export File, как было описано ранее, и щелкните на кнопке Сохранить.

В любом случае Редактор VB удаляет модуль из проекта.

Упражнение 4

Удалите модуль без сохранения созданный упражнением 3.

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

Написание новых макросов и процедур

До сих пор в этом учебно-методическом пособии использовался термин макрос (macro) как для макросов, которые вы записываете рекордером, так и для макросов, которые пишите сами. Существует другой термин, помогающий различать эти макросы. Строго говоря, термин макрос применим только для инструкций, которые вы записываете с помощью макрорекордера. Иногда в литературе макросами называют программы, которые не имеют аргументов (вы, наверное, уже поняли, что записываемые рекордером макросы не могут иметь аргументов). Макросы, которые вы пишете заново более точно называются

подпроцедурами (subprocedures) или просто процедурами (procedures). Далее в этом учебно-методическом пособии термин макрос относится к коду, записываемому с помощью макрорекордера, а термин процедура к коду VBA, который вы пишете сами.

Если документ, в котором вы хотите сохранить процедуру, еще не содержит модуль, вы должны вставить модуль перед тем, как сможете написать процедуру VBA в этом проекте. Вы можете также вставить новый модуль, если существующие модули заполнены (модуль может содержать не более 4000 строк) или если вы просто хотите создать новую процедуру VBA в ее собственном модуле.

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

üубедитесь, что в Excel открыта рабочая книга, в которой вы хотите сохранить процедуру;

üнажмите Alt+F11 для активизации Редактора VB;

üв Project Explorer выделите проект, в который хотите добавить модуль (скорее всего, в этот момент он там будет один);

üвыберите команду Insert/Module (Вставка/Модуль) или на панели Standard с помощью кнопки Insert <object> (Вставка объекта) выберите в раскрывающемся меню Module. Редактор VB добавляет новый модуль в проект и

29

открывает Code Window для нового модуля.

Упражнение 5

Добавьте новый модуль в проект.

Когда Редактор VB вставляет новый модуль, он дает ему имя в соответствии с правилами, изложенными ранее в этой части; ваш новый модуль будет иметь имя по умолчанию Module (Модуль) с последующим номером. Всякий раз при вставке модуля следует переименовывать его, чтобы этот модуль имел описательное имя. Для переименования модуля выполните следующие шаги:

üвыделите в Редакторе VB модуль, который будете переименовывать;

üесли Properties Window (Окно свойств) еще не выведено на экран, выберите команду View/Properties Window (Вид/Окно свойств) или щелкните на

кнопке Properties Window на панели инструментов, чтобы отобразить его (рис. 10);

Рис. 10

ü в текстовое поле Name (Имя) в Properties Window введите новое имя для модуля. Как только вы уберете курсор вставки из текстового поля Name, Редактор VB переименует модуль

Упражнение 6

Переименуйте созданный модуль упражнением 5, дав ему имя NewModule.

Для написания новой процедуры в существующем модуле необходимо сначала открыть Code Window (Окно программы) для модуля, в котором вы хотите написать процедуру. Чтобы открыть Code Window для модуля, либо щелкните дважды на этом модуле в Project Explorer, либо выделите этот модуль в

Project Explorer и затем выберите команду View/Code (Вид/Программа).

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

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

Когда вы пишете новую процедуру, вы должны указать имя процедуры и

30