«Bill Jelen, Mr. Excel Tracy Syrstad 800 East 96th Street Indianapolis, Indiana 46240 ?изнес-решения Применение VBA и макросов в Microsoft® Excel Билл Джелен, “Мистер Excel” Трейси Сирстад Москва • Санкт-Петербург • Киев ...»
?изнес-решения
Применение VBA
и макросов в
Microsoft® Excel
?usiness solutions
VBA and Macros
for
Microsoft® Excel
Bill Jelen, Mr. Excel
Tracy Syrstad
800 East 96th Street
Indianapolis, Indiana 46240
?изнес-решения
Применение VBA
и макросов в
Microsoft® Excel
Билл Джелен, “Мистер Excel”
Трейси Сирстад
Москва • Санкт-Петербург • Киев
2006
ББК 32.973.26 018.2.75 Д40 УДК 681.3.07 Издательский дом ‘‘Вильямс” Главный редактор С.Н. Тригуб Зав. редакцией В.Р. Гинзбург Перевод с английского и редакция А.В. Журавлева По общим вопросам обращайтесь в Издательский дом ‘‘Вильямс’’ по адресу:
[email protected], http://www.williamspublishing.com 115419, Москва, а/я 783; 03150, Киев, а/я Джелен, Билл, Сирстад, Трейси.
Д40 Применение VBA и макросов в Microsoft Excel. : Пер. с англ. М. : Из дательский дом ‘‘Вильямс’’, 2006. 624 с. : ил. Парал. тит. англ.
ISBN 5 8459 0882 5 (рус.) В этой книге рассматривается автоматизация выполнения всевозможных задач с помощью Excel VBA от создания простого отчета до разработки полноценного приложения Excel ‘‘с нуля’’. Авторы книги полагаются на достаточно высокий уро вень подготовки читателя, однако допускают, что материал каждой главы не зна ком ему в полном объеме. Особое внимание при изложении материала уделяется таким высокоэффективным средствам Excel, как диаграмма, расширенный фильтр и сводная таблица. Прежде чем продемонстрировать решение той или иной задачи с помощью VBA, авторы кратко останавливаются на ее выполнении с помощью пользовательского интерфейса Excel. Прочитав книгу, читатель получит знания, необходимые для автоматизации выполнения повседневных задач и создания соб ственных решений в Excel с помощью VBA.
Книга предназначена для опытных пользователей Excel.
ББК 32.973.26 018.2. Все названия программных продуктов являются зарегистрированными торговыми марками соответствующих фирм.
Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механиче ские, включая фотокопирование и запись на магнитный носитель, если на это нет письменного разрешения издательства Que Corporation.
Authorized translation from the English language edition published by Sams Publishing, Copyright © 2004.
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage re trieval system, without permission from the publisher.
Russian language edition is published by Williams Publishing House according to the Agreement with R&I Enterprises International, Copyright © 2006.
ISBN 5 8459 0882 5 (рус.) © Издательский дом ‘‘Вильямс’’, ISBN 0 7897 3129 0 (англ.) © Sams Publishing, Об авторах Посвящения Благодарности Введение Часть I. Первые шаги Глава 1. Excel и VBA — гремучая смесь Глава 2. Знакомство с Visual Basic for Applications Глава 3. Работа с диапазоном ячеек Глава 4. Функции, определенные пользователем Глава 5. Циклы и управление выполнением кода Глава 6. Стиль записи ссылок R1C1 Глава 7. Имена Глава 8. События Глава 9. Введение в пользовательские формы Часть II. Автоматизация Excel Глава 10. Диаграммы Глава 11. Анализ данных с помощью расширенного фильтра Глава 12. Сводные таблицы Глава 13. Excel всемогущий Глава 14. Взаимодействие с Internet Глава 15. Поддержка XML в профессиональном выпуске Excel 2003 Часть III. Удивительные возможности Visual Basic Глава 20. Создание пользовательских объектов, типов и коллекций Глава 21. Пользовательские формы — профессиональный подход Глава 22. Интерфейс прикладного программирования (API) Windows 6 Оглавление Глава 24. Создание пользовательских меню и панелей инструментов Глава 26. Практикум: создание приложения Excel “с нуля” Часть III, “Удивительные возможности Visual Basic for Applications” 8 Содержание 5 советов по исправлению и оптимизации автоматически Совет 2: перемещайтесь на последнюю строку данных с конца рабочего Совет 4: используйте одно выражение для копирования и вставки Исправление и оптимизация автоматически сгенерированного Обращение к диапазону ячеек с помощью указания адреса его Обращение к диапазону ячеек, расположенному на другом Обращение к диапазону ячеек с помощью указания его Использование свойства Cells в качестве параметра свойства Range Изменение размера диапазона ячеек с помощью свойства Resize Обращение к диапазону ячеек с помощью свойств Columns и Rows Создание нового диапазона ячеек из пересекающихся диапазонов с Обращение к диапазону ячеек с помощью свойства CurrentRegion Обращение к диапазону несмежных ячеек с помощью коллекции Наиболее распространенные задачи программирования в Excel Вывод полного имени файла текущей рабочей книги в ячейке Проверка существования рабочего листа в открытой книге Получение имени пользователя, зарегистрировавшегося в системе Получение даты и времени последнего сохранения рабочей книги Сортировка и конкатенация значений ячеек из заданного диапазона 10 Содержание Управление выполнением кода: использование конструкций Обращение к строке или столбцу с помощью ссылок в стиле R1C1 Использование ссылок в стиле R1C1 при условном Задание условного форматирования с помощью пользовательского Использование ссылок в стиле R1C1 при создании формулы Событие Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Событие Workbook_WindowResize(ByVal Wn As Window) Событие Workbook_WindowActivate(ByVal Wn As Window) Событие Workbook_WindowDeactivate(ByVal Wn As Window) Событие Workbook_SheetActivate(ByVal Sh As Object) Событие Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Событие Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Событие Workbook_SheetCalculate(ByVal Sh As Object) Событие Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Событие Workbook_SheetDeactivate(ByVal Sh As Object) 12 Содержание Событие Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Событие Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Событие Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Событие Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Событие Worksheet_SelectionChange(ByVal Target As Range) Событие Worksheet_FollowHyperlink(ByVal Target As Hyperlink) Событие Chart_BeforeDoubleClick(ByVal ElementID As Long, ByVal Arg Событие Chart_MouseDown(ByVal Button As Long, ByVal Shift As Long, Событие Chart_MouseMove(ByVal Button As Long, ByVal Shift As Long, Событие Chart_MouseUp(ByVal Button As Long, ByVal Shift As Long, Событие Chart_Select(ByVal ElementID As Long, ByVal Arg1 As Long, Событие Chart_SeriesChange(ByVal SeriesIndex As Long, ByVal PointIndex Событие AppEvent_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Событие AppEvent_SheetBeforeRightClick(ByVal Sh As Object, ByVal Событие AppEvent_SheetChange(ByVal Sh As Object, ByVal Target As Событие AppEvent_SheetFollowHyperlink(ByVal Sh As Object, ByVal Событие AppEvent_SheetSelectionChange(ByVal Sh As Object, ByVal Target Событие AppEvent_WindowActivate(ByVal Wb As Workbook, ByVal Wn As Событие AppEvent_WindowDeactivate(ByVal Wb As Workbook, ByVal Wn Событие AppEvent_WindowResize(ByVal Wb As Workbook, ByVal Wn As Событие AppEvent_WorkbookActivate(ByVal Wb As Workbook) Событие AppEvent_WorkbookAddinInstall(ByVal Wb As Workbook) Событие AppEvent_WorkbookAddinUninstall(ByVal Wb As Workbook) Событие AppEvent_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel Событие AppEvent_WorkbookBeforePrint(ByVal Wb As Workbook, Cancel Событие AppEvent_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal Событие AppEvent_WorkbookDeactivate(ByVal Wb As Workbook) Событие AppEvent_WorkbookNewSheet(ByVal Wb As Workbook, By Val Sh Встроенные диаграммы и диаграммы, расположенные 14 Содержание Название диаграммы, легенда и таблица данных (ChartTitle, HasLegend Линии тренда и полосы погрешности (Trendlines и ErrorBar) Преимущества VBA перед пользовательским интерфейсом Excel Использование расширенного фильтра для отбора уникальных Отбор уникальных значений из заданного столбца с помощью Отбор уникальных значений из заданного столбца с помощью VBA Отбор уникальных значений из комбинации нескольких столбцов с Использование расширенного фильтра с указанием условия отбора Объединение нескольких условий с помощью Объединение нескольких условий с помощью логической операции “И” Дополнительные аспекты объединения условий с помощью Отображение записей, скрытых в результате фильтрации “на месте” Отбор только уникальных записей при фильтрации “на месте” Использование расширенного фильтра для копирования всех Копирование всех столбцов исходного диапазона данных Копирование и переупорядочивание подмножества столбцов исходного Создание сводных таблиц с помощью пользовательского Заполнение значениями пустых ячеек в области данных Изменение порядка следования столбцов сводной таблицы вручную Запрет автоматического добавления промежуточных итогов Создание отчета о структуре спроса на товары:
Суммирование значений полей области данных сводной таблицы Использование сводной таблицы для фильтрации исходных данных 16 Содержание Использование полей области страницы сводной таблицы Дополнительные вычисления в полях области данных сводной Приведенное отличие от значения предыдущего элемента поля Приведенное отличие от значения заданного элемента поля Считывание текстового файла в память и его последующий анализ Сохранение листов рабочей книги в виде отдельных рабочих книг Фильтрация данных с последующим копированием полученного Изменение размера области примечания с помощью центрирования Выделение ячейки без применения условного форматирования Запрет/разрешение выполнения операций вырезания, Поиск заданного текста с помощью свойства SpecialCells Вставка программного кода во вновь созданную рабочую книгу Создание Web запроса с помощью пользовательского интерфейса Excel Извлечение данных из Internet в режиме реального времени Определение временного окна для выполнения макроса Выполнение макроса по прошествии заданного периода времени Периодическое выполнение макроса через определенные Применение Excel в качестве системы управления содержимым Глава 15. Поддержка XML в профессиональном выпуске Excel 2003 Сохранение и считывание содержимого рабочей книги Excel в 18 Содержание Часть III. Удивительные возможности Visual Basic Импорт текстовых файлов, содержащих менее 65 536 записей Импорт текстовых файлов, содержащих более 65 536 записей Проверка существования поля в таблице базы данных Access Глава 20. Создание пользовательских объектов, типов и коллекций Обработка событий уровня приложения и встроенной диаграммы Использование выражений Property Let и Property Get Глава 21. Пользовательские формы профессиональный подход Добавление элементов управления на форму во время выполнения Изменение размеров формы во время выполнения программного кода Добавление элемента управления на форму во время выполнения Определение размера и положения элемента управления на форме во Ограничения, связанные с добавлением элементов управления на форму Добавление изображения на форму во время выполнения программного Использование полосы прокрутки для выбора значений Изменение цвета фона активного элемента управления Глава 22. Интерфейс прикладного программирования (API) Windows 20 Содержание Ошибка времени выполнения 1004: “Method 'Range' of object '_Global' Глава 24. Создание пользовательских меню и панелей инструментов Создание и удаление пользовательской панели инструментов Добавление раскрывающегося списка на панель инструментов Сохранение и восстановление координат панели инструментов Преобразование рабочей книги Excel в надстройку с помощью диалогового окна “Сохранение документа” (Save As) Преобразование рабочей книги Excel в надстройку с помощью Альтернативное решение: использование скрытой рабочей книги Глава 26. Практикум: создание приложения Excel ‘‘с нуля’’ Об авторах Билл Джелен, более известный под псевдонимом ‘‘Мистер Excel’’, руко водитель популярнейшего Web сайта MrExcel.com (свыше 10 млн. посещений в год), а также автор многочисленных книг, посвященных Excel. Билл создает решения, основанные на использовании Excel VBA, для сотен клиентов по всему миру. До основания MrExcel.com Билл на протяжении 12 лет занимал должность финансового аналитика в отделах финансов, маркетинга, бухгал терского учета и операций крупной корпорации. Билл проживает в окрестно стях города Акрон, штат Огайо, США, вместе со своей женой Мэри Эллен и детьми Джошем и Зиком.
Трейси Сирстад работает программистом и консультантом в компании Билла Джелена MrExcel Consulting. Трейси проживает в живописной местно сти Южной Дакоты вместе со своим мужем Джоном и собакой Генералом.
Посвящения Посвящается Мэри Эллен Джелен.
Посвящается Джону Сирстаду, вера которого в меня помогает преодолевать все трудности, встречающиеся на жизненном пути.
Благодарности Спасибо Мале Сингху (Mala Singh) из XLSoft Consulting за помощь в написа нии главы 10; Тому Уртису (Tom Urtis) за техническое редактирование; Джерри Колю (Jerry Kohl) за его великолепные идеи; Джанет Гарсиа (Jeanette Garcia), Барбе Джелен (Barb Jelen), Дагу и Стейси Джеффериз за техническую помощь;
Зику, Джошу и Мэри Эллен Джелен за их терпение; Тому Мацешеку (Tom Ma cioszek) за ‘‘дружескую’’ проверку; Чеду Ротшиллеру (Chad Rothschiller) из Mi crosoft за неоценимую помощь в изучении Excel XML; Дейву Гейнеру (Dave Gainer), Стиву Заске (Steve Zaske), Эрику Паттерсону (Eric Patterson) и Джо Чи рилову (Joe Chirilov) из Microsoft; Лоретте Йейтс (Loretta Yates), Шону Диксону (Sean Dixon), Марго Кэттс (Margo Catts), Энди Бистеру (Andy Beaster), Грегу Виганду (Greg Wiegand), Эми Сорокас (Amy Sorokas), Ким Спилкер (Kim Spilker), Эрике Миллен (Erika Millen), Кэти Бидуэл (Kathy Bidwell), Синди Ти терс (Cindy Teeters), Мишель Митчелл (Michelle Mitchell) и Гэри Адэру (Gary Adair) из Pearson; Иване Тейлор (Ivana Taylor) за блестящий маркетинг; читате лям MrExcel.com, нашим клиентам и всем MVP; Дэну Бриклину (Dan Bricklin), Бобу Фрэнкстону (Bob Frankston) и Митчу Кейпору (Mitch Kapor) за создание электронных таблиц; Уильяму Брауну (William Brown) из Waterside; Пэм Гензель 24 Благодарности (Pam Gensel) за 1 й урок по созданию макросов; Роберту Ф. Джелену (Robert F. Jelen) за то, что он был первым поклонником моего таланта программиста;
Роберту К. Джелену (Robert K. Jelen) за вдохновение; Бонни Хильярд (Bonnie Hilliard) за связь с общественностью; Лаурель Рииппу (Laurelle Riippa) из PW;
Лео Лапорте (Leo LaPorte) и Фон Луу (Fawn Luu) из TechTV; Дэну Пойнтеру (Dan Poynter); Крейгу Кросмэну (Craig Crossman) из Computer America и Уолте ру Моссбергу (Walter Mossberg) из Wall Street Journal.
Спасибо Корту Чиллдону Хоффу (Cort Chilldon Hoff) за поддержку в труд ные минуты; Хуану Пабло Гонсалесу Руизу (Juan Pablo Gonzales Ruiz) за его советы (в частности, касающиеся функций из главы 4); Даниелю Клэнну (Daniel Klann), Деннису Валентайну (Dennis Wallentin), Ивану Ф. Моале (Ivan F. Moala), Хуану Пабло Гонсалесу (Juan Pablo Gonzales), Масаре Каджи (Masaru Kaji), Натану П. Оливеру (Nathan P. Oliver), Ричи Силлсу (Richie Sills), Расселу Гауфу (Russell Hauf), Суату Мехмету Озгуру (Suat Mehmet Ozgur), Тому Уртису (Tom Urtis), Томми Майлзу (Tommy Miles) и Вэю Цзянгу (Wei Jiang) за их вклад в написание главы 13; Крису Лемэру (Chris Lemair) за то, что он открыл для меня удивительный мир Excel и макросов, а также Энн Трой (Anne Troy) за то, что она познакомила меня с Биллом.
VBA — работа на результат Язык программирования Visual Basic for Applications (VBA) позво VBA — работа на результат......... ляет существенно повысить произ Как организована эта книга........ водительность труда пользователей Microsoft Excel.
Не дожидаясь помощи от отдела информационных технологий, поль зователи Excel могут самостоятельно создавать отчеты, необходимые для Соглашения, принятые выполнения своих повседневных в этой книге
обязанностей. Это сулит как пре Рассматриваемые имущества, так и недостатки. С од версии Excel
ной стороны, пользователи Excel Программный код
смогут повысить эффективность свое го труда. С другой, им придется ра зобраться со всеми тонкостями ис кусства создания макросов с помо щью Excel VBA.
Уверен, что в этот самый момент вы или кто либо из ваших коллег все еще выполняете в Excel рутин ные операции, которые могут быть автоматизированы с помощью VBA.
Случай, произошедший с Валери, — весьма типичен для компаний, на считывающих 20 и более пользовате лей Excel.
26 Введение Практикум Создание финансового отчета Этот практикум основан на реальных событиях. После внедрения дорогостоящей системы планирования и управления ресурсами (ERP) корпорация средних раз меров осталась без средств для создания ежемесячных финансовых отчетов. Ва лери, занимающая должность бизнес аналитика в финансовом отделе корпора ции, приняла решение создать требуемый отчет самостоятельно.
Прежде всего, Валери экспортировала главную бухгалтерскую книгу из ERP системы в текстовый файл с разделителями запятыми (CSV). Затем полученный CSV файл был импортирован в Excel.
Создание отчета оказалось делом не из легких. Некоторые счета необходимо было классифицировать как расходы, некоторые — полностью исключить из отчета.
Шаг за шагом, Валери внесла все требуемые корректировки. Для получения пер вой части отчета она создала сводную таблицу и скопировала итоговые значения на новый рабочий лист. Аналогичным образом были получены остальные части отчета. После трех часов кропотливого труда финансовый отчет был готов.
Валери передала отчет своему начальнику, который уже отчаялся получить его в срок. Она тут же стала “героем дня” и пребывала на седьмом небе от счастья.
Неожиданный поворот событий На следующий день состоялось ежемесячное собрание руководства корпорации, пол ноценно подготовиться к которому смог лишь начальник финансового отдела. Он эф фектно положил на стол отчет, чем привел в замешательство всех присутствующих. По сле того как начальник Валери рассказал о происхождении отчета, президент корпора ции попросил его помочь подготовить отчеты для всех остальных отделов.
Тяжкое бремя славы Корпорация, в которой работает Валери, насчитывает 46 отделов. Подготовка фи нансового отчета для каждого отдела подразумевает импортирование данных из ERP системы, удаление определенных счетов, создание нескольких сводных таб лиц и комбинацию полученных итоговых результатов. На подготовку первого от чета Валери потратила 3 часа. Она подсчитала, что с учетом полученного опыта сможет создать 46 отчетов не менее чем за 40 часов. Валери пришла в отчаяние.
VBA спешит на помощь К счастью, Валери решила поделиться своими заботами с возглавляемой мною компанией MrExcel Consulting. Менее чем за неделю я создал набор VBA макросов, реализующих действия, необходимые для подготовки отчета, — импорт данных, удаление счетов, создание сводных таблиц, объединение полученных итоговых сведений и стилевое форматирование отчета. Благодаря VBA часовой процесс создания отчетов вручную был сведен к двум щелчкам мыши и четырем минутам ожидания.
Как организована эта книга Эта книга состоит из трех частей. Ее цель — научить читателя создавать макросы VBA для автоматизации выполнения рутинных задач в Excel.
Часть I, “Первые шаги” Глава 1, ‘‘Excel и VBA гремучая смесь’’, акцентирует внимание на фундамен тальной проблеме средства записи макросов Excel — средство записи макросов не работает. В главе 2, ‘‘Знакомство с Visual Basic for Applications’’, рассматриваются основы синтаксиса языка программирования Visual Basic for Applications. Глава 3, ‘‘Работа с диапазоном ячеек’’, посвящена работе с диапазонами ячеек.
В главе 4, ‘‘Функции, определенные пользователем’’, рассматривается соз дание функций, определенных пользователем, а также приводятся примеры решения 25 наиболее распространенных задач, встречающихся при повсе дневном программировании в Excel.
Глава 5, ‘‘Циклы и управление выполнением кода’’, посвящена циклам — фундаментальному компоненту любого языка программирования. Разрабаты вая решение для Валери, мы создали код, подготавливающий отчет для одного отдела, а затем поместили его в цикл с 46 итерациями.
В главе 6, ‘‘Стиль записи ссылок R1C1’’, описывается стиль записи ссылок R1C1, а в главе 7, ‘‘Имена’’, — использование имен. Глава 8, ‘‘События’’, по священа событиям, а глава 9, ‘‘Введение в пользовательские формы’’, — поль зовательским формам.
Часть II, “Автоматизация Excel” В главе 10, ‘‘Диаграммы’’, рассматривается использование VBA при работе с диаграммами. Глава 11, ‘‘Анализ данных с помощью расширенного фильт ра’’, посвящена анализу данных с помощью расширенного фильтра, а гла ва 12, ‘‘Сводные таблицы’’, — работе со сводными таблицами. В комбинации с VBA диаграммы, расширенный фильтр и сводные таблицы образуют мощ ную основу для создания всевозможных отчетов.
В главе 13, ‘‘Excel всемогущий’’, рассматриваются распространенные зада чи, встречающиеся при работе с Excel, и их решения с помощью VBA, пред лагаемые опытными программистами со всех уголков мира.
Глава 14, ‘‘Взаимодействие с Internet’’, посвящена автоматизации Web за просов, глава 15, ‘‘Поддержка XML в профессиональном выпуске Excel 2003’’, — работе с данными в формате XML, глава 16, ‘‘Автоматизация Word’’, — автомати зации Microsoft Word.
Часть III, “Удивительные возможности Visual Basic for Applications” В главе 17, ‘‘Массивы’’, рассматриваются массивы. Основное предназна чение массива заключается в упрощении обработки данных и повышении 28 Введение скорости выполнения программного кода. Глава 18, ‘‘Работа с текстовыми фай лами’’, посвящена работе с текстовыми файлами, а глава 19, ‘‘Использование Microsoft Access’’, — использованию баз данных Microsoft Access. Применение Excel в качестве пользовательского интерфейса, а MDB файла — в качестве базы данных позволяет добиться оптимального использования возможностей обеих программ.
В главе 20, ‘‘Создание пользовательских объектов, типов и коллекций’’, рас сматривается создание модулей классов, предназначенных для размещения поль зовательских объектов VBA. Глава 21, ‘‘Пользовательские формы профессио нальный подход’’, посвящена сложным элементам управления, а также различ ным приемам программирования пользовательских форм. В главе 22, ‘‘Интерфейс прикладного программирования (API) Windows’’, рассматриваются основы ис пользования функций интерфейса прикладного программирования (API) Win dows. Глава 23, ‘‘Обработка ошибок’’, посвящена обработке ошибок, глава 24, ‘‘Создание пользовательских меню и панелей инструментов’’, — созданию поль зовательских меню и панелей инструментов, глава 25, ‘‘Надстройки’’, — примене нию надстроек. Наконец, глава 26, ‘‘Практикум: создание приложения Excel ‘‘с нуля’’, представляет собой практикум, демонстрирующий процесс создания приложения Excel ‘‘с нуля’’.
Для кого предназначена эта книга На мероприятии, посвященном выходу на рынок пакета приложений Mi crosoft Office 2003, корпорация Microsoft огласила результаты исследования, согласно которым среднестатистический пользователь применяет только 10% заложенных в Office возможностей. Эта книга предназначена для опытных пользователей Excel. Опрос, проведенный среди 2000 посетителей Web сайта MrExcel.com, показал, что 42% опытных пользователей Excel применяют в по вседневной работе все наиболее эффективные средства этого приложения.
Компания MrExcel Consulting часто устраивает семинары для бухгалтеров. Как правило, все они работают с Excel по 30 40 часов в неделю. Практически на каждом семинаре я демонстрирую слушателям возможности Excel, о которых они ранее и не подозревали, и тем не менее практически на каждом семинаре находится слушатель, который превосходит меня в знании того или иного средства Excel. Что я хочу этим сказать? Вероятно, читатель этой книги вели колепно разбирается в Excel. Несмотря на это, я предполагаю, что материал каждой главы незнаком в полном объеме для 58% опытных пользователей Ex cel. Прежде чем продемонстрировать решение той или иной задачи с помо щью VBA, я кратко остановлюсь на ее выполнении с помощью пользователь ского интерфейса Excel.
История развития электронных таблиц и макросов Вплоть до 1978 года каждый бухгалтер применял для создания отчета бу магу формата ‘‘гроссбух’’, механический карандаш и ластик. Сведения о днев ном обороте записывались от руки, а промежуточный итог подсчитывался с помощью счетной машины. Ошибка в расчетах или исходных данных стоила многих часов работы с ластиком, счетной машиной и карандашом.
В 1979 году Дэн Бриклин (Dan Bricklin) и Боб Фрэнкстон (Bob Frankston) (рис. 1) в буквальном смысле изменили мир. Они создали первую электрон ную таблицу, предназначенную для выполнения на компьютерах Apple II, и назвали ее VisiCalc (сокращение от англ. ‘‘visual calculator’’ — визуальный калькулятор). Вскоре программа VisiCalc была перенесена на несколько раз личных платформ, включая IBM PC. В 1981 году была выпущена расширенная версия VisiCalc, предназначенная для выполнения на компьютерах Apple III и поддерживающая макросы командной строки. Проект VisiCalc прекратил свое существование в 1985 году в результате судебной тяжбы.
Рис. 1. Дэн Бриклин и Боб Фрэнкстон В 1983 году Митч Кейпор (Mitch Kapor) создал программу Lotus 1 2 3.
По своим функциональным возможностям Lotus 1 2 3, изначально разработан ная для выполнения под управлением операционной системы DOS, намного превзошла VisiCalc. В первый год объем продаж Lotus 1 2 3 достиг впечатляю щей цифры в 53 млн долларов. Вплоть до середины 90 х годов Lotus 1 2 3 зани мала лидирующее положение на рынке программ для работы с электронными 30 Введение таблицами. Несмотря на наличие конкурентов (Quattro, Multiplan и др.), Lotus 1 2 3 ‘‘де факто’’ оставалась стандартным инструментом бухгалтерского учета.
1985 год был ознаменован появлением на свет второго выпуска Lotus 1 2 3, поддерживающего 8192 строки и 256 столбцов — более 2 млн ячеек! Кроме того, пользователю была предоставлена возможность записывать простые макросы.
В 1990 году я был на 100% уверен в незыблемости позиций Lotus 1 2 3 на рынке программного обеспечения для работы с электронными таблицами.
В начале 90 х годов была выпущена версия Lotus 1 2 3 для операционной системы CP/M. В то же самое время Microsoft направила усилия на улучшение собственного продукта для работы с электронными таблицами — Excel. Про грамма Excel 3.0, выпущенная в 1990 году, существенно проигрывала Lotus 1 2 3. Тем не менее, Microsoft продолжала упорствовать, выпуская новую, улучшенную версию Excel каждые 1 2 года. Excel 4, выпущенная в 1992 году, уже пользовалась популярностью и предлагала возможность создавать макро сы с помощью языка XLM. Excel 5, выпущенная в 1993 году, поддерживала создание нескольких рабочих листов в пределах одной рабочей книги, а также запись макросов с помощью нового языка программирования — VBA. Благодаря наличию обратной совместимости с Lotus 1 2 3 продажи Excel стали стремительно возрастать. Середину 90 х годов прошлого столе тия можно без преувеличения назвать ‘‘золотой эрой’’ в развитии Excel.
В Excel 95 и Excel 97 были представлены новые функциональные средства, такие как сводные таблицы, автофильтр и автоматическое вычисление про межуточных итогов. Кроме того, в Excel 97 появилась новая среда разработ ки VBA. Доминированию Lotus 1 2 3 на рынке программ для работы с элек тронными таблицами был положен конец. На момент написания этой книги гремучая смесь в виде Excel и VBA прочно завоевала сердца более чем 400 млн пользователей по всему миру.
Будущее Excel и VBA С каждым новым выпуском программа для работы с электронными табли цами StarOffice Calc приближается по предлагаемым возможностям к Excel.
Один из наиболее существенных недостатков пакета StarOffice заключается в отсутствии поддержки VBA, равно как и любого другого языка создания макросов. Этот факт позволяет не рассматривать StarOffice Calc в качестве серьезного конкурента Excel.
Наверняка многие слышали о том, что Microsoft собирается отказаться от VBA. На самом деле это маловероятно. По прошествии более чем 10 лет с мо мента появления VBA Microsoft все еще поддерживает макросы XLM (язык макросов, появившийся в Excel 4). К тому же Microsoft официально заявила о поддержке VBA в следующей версии Excel. Учитывая, что большинство поль зователей приобретают каждую вторую версию Office, VBA будет актуален по меньшей мере до 2009 года.
Наконец, с точки зрения маркетинга было бы нелепо отказываться от VBA как от ключевого компонента, обеспечивающего Excel тотальное преимущест во над StarOffice Calc.
В октябре 2003 года корпорация Microsoft официально объявила о новой инициативе, направленной на повышение безопасности предлагаемых Mi crosoft решений. Это заявление имеет весьма серьезное значение, поскольку печально известный вирус Melissa использовал для своего распространения макросы VBA текстового редактора Word. Пресса и власть имущие отреагиро вали мгновенно, поместив VBA в список ‘‘вымирающих’’ технологий. Если безопасность приложений пакета Office будет оставаться под угрозой, Micro soft может быть вынуждена отказаться от VBA.
Одной из отличительных особенностей пакета Office 2003 является под держка языка программирования Visual Basic.NET. Язык Visual Basic 6 позво лял автоматизировать любую задачу в Excel XP с помощью VBA. В Excel некоторые задачи, такие как создание смарт документа или размещение со держимого на панели Справочные материалы (Research Pane), можно авто матизировать только из среды.NET.
Учитывая вопросы безопасности, возникающие при использовании VBA, Microsoft может заменить его набором инструментов.NET Tools for Office. Это было бы роковой ошибкой. На текущий момент свыше 400 млн пользователей Office могут приобрести книгу, подобную этой, в течении недели изучить осно вы создания макросов и начать разрабатывать собственные решения с помощью VBA. Производительность труда ‘‘белых воротничков’’ может существенно воз расти, а их зависимость от отдела информационных технологий — уменьшить ся. Если Microsoft заменит VBA набором инструментов.NET Tools for Office, ко нечный пользователь будет лишен возможности создавать макросы с помощью Excel. Кроме того, это нивелирует преимущество Excel перед конкурирующим продуктом StarOffice Calc, поддержка языка создания макросов в котором долж на появиться к 2007 году. Таким образом, инициатива по повышению безопас ности приложений пакета Office может обернуться для Microsoft утратой лиди рующих позиций на рынке программ для работы с электронными таблицами.
Тем не менее, я уверен, что VBA останется с нами по крайней мере до кон ца этого десятилетия. К тому же навыки создания макросов с помощью Excel VBA не утратят своей актуальности в результате перехода на среду.NET, а синтаксис VBA не так уж сильно отличается от синтаксиса Visual Basic.NET.
Соглашения, принятые в этой книге В этой книге приняты следующие обозначения.
Курсив используется для выделения терминов, названий Web сайтов, а также акцентирования внимания читателя.
Моноширинным шрифтом выделяется код VBA, заголовки столбцов, ссылки, формулы, имена макросов, модулей, функций, процедур, 32 Введение переменных, констант, объектов, методов, свойств, файлов, адре Для выделения названий элементов пользовательского интерфейса применяется следующий шрифт: Меню.
Вдобавок к указанным обозначениям, каждая глава книги содержит специ альные фрагменты текста: ‘‘Практикум’’, ‘‘На заметку’’, ‘‘Совет’’ и ‘‘Внимание’’.
‘‘Практикум’’ содержит примеры решений реальных задач с использованием средств, описываемых в текущей главе.
Так помечается информация, которая не относится к основной теме главы, однако является весьма интересной и полезной.
В этом фрагменте содержатся методы и приемы, позволяющие сэкономить время и усилия, которые потребуются для решения той или иной задачи.
Будьте осторожны, если встретите такой фрагмент. Приводящиеся в нем сведения помогут вам избежать ошибок, а также сберечь время и нервы.
Рассматриваемые версии Excel На момент написания этой книги текущей версией Excel была версия Ex cel 2003. За исключением главы 15, ‘‘Поддержка XML в профессиональном выпуске Excel 2003’’, большая часть приведенного в книге программного кода совместима с Excel 2002 и Excel 2000. Более подробно о совместимости раз личных версий Excel рассказывается в главе 23, ‘‘Обработка ошибок’’.
Программный код Прилагаемый к книге программный код включает все рассматриваемые в ней примеры. Его можно загрузить по адресу:
http://www.williamspublishing.com/Books/5-8459-0882-5.html.
(Чтобы загрузить код, прилагающийся к англоязычному изданию этой книги, по сетите Web страницу по адресу: http://www.mrexcel.com/getcode.html.) Следующий шаг В главе 1, ‘‘Excel и VBA гремучая смесь’’, рассматривается редактор Vi sual Basic и средство записи макросов Excel.
Ждем ваших отзывов!
Вы, читатель этой книги, и есть главный ее критик и комментатор. Мы це ним ваше мнение и хотим знать, что было сделано нами правильно, что мож но было сделать лучше и что еще вы хотели бы увидеть изданным нами. Нам интересно услышать и любые другие замечания, которые вам хотелось бы вы сказать в наш адрес.
Мы ждем ваших комментариев и надеемся на них. Вы можете прислать нам бумажное или электронное письмо, либо просто посетить наш Web сервер и оставить свои замечания там. Одним словом, любым удобным для вас спосо бом дайте нам знать, нравится или нет вам эта книга, а также выскажите свое мнение о том, как сделать наши книги более интересными для вас.
Посылая письмо или сообщение, не забудьте указать название книги и ее авторов, а также ваш обратный адрес. Мы внимательно ознакомимся с вашим мнением и обязательно учтем его при отборе и подготовке к изданию после дующих книг. Наши координаты:
[email protected] E mail:
http://www.williamspublishing.com WWW:
Адреса для писем:
из России: 115419, Москва, а/я из Украины: 03150, Киев, а/я Часть I 1. Excel и VBA — гремучая смесь
2. Знакомство с Visual Basic for Applications
3. Работа с диапазоном ячеек
4. Функции, определенные пользователем
5. Циклы и управление выполнением кода
6. Стиль записи ссылок R1C1
7. Имена
8. События
9. Введение в пользовательские формы
Excel VBA — Excel всемогущий Сочетание языка программирова ния Visual Basic for Applications (VBA) и Microsoft Excel таит в себе огром ные возможности. Удивительно, но об этом задумывались лишь немногие из почти что 400 миллионов пользовате лей Microsoft Office. С помощью VBA можно существенно упростить вы Выполнение макроса
полнение практически любой задачи в Редактор Visual Basic
Excel. К примеру, создание целого во Изучение кода макроса................ роха квартальных диаграмм может Непредвиденные результаты..... быть сведено всего лишь к несколь ким щелчкам мыши.
Камни преткновения Чтобы научиться программировать с помощью VBA, вам придется пре одолеть два барьера — несовершенное средство записи макросов Excel и чрезвычайно запутанный синтаксис языка программирования VBA.
Средство записи макросов не работает!
С середины 90 х годов прошлого столетия корпорация Microsoft нача ла доминировать на рынке программ для создания электронных таблиц.
Несмотря на то что в части работы с электронными таблицами продукт Microsoft оказался действительно очень удачным (приверженцы Lotus 38 Часть I Первые шаги 1 2 3 быстро научились с ним работать), записать корректно работающий макрос в Excel не удавалось практически никому. Неоспоримое преимущество языка программирования Microsoft VBA перед языком макросов Lotus 1 нивелировалось низким качеством средства записи макросов.
Макрос, созданный накануне с помощью Lotus 1 2 3, прекрасно выполня ется и сегодня. Аналогичный макрос, созданный с помощью Microsoft Excel, мог преподнести неприятный сюрприз. Многие из тех, кто пытался создать свой первый макрос в Excel, приходили в отчаяние.
Visual Basic — это не BASIC Код, сгенерированный в результате создания моего первого макроса, не был похож ни на что, виденное мною ранее. Несмотря на то что я знал с пол дюжины различных языков программирования, так называемый ‘‘Visual Basic’’ оказался абсолютно неинтуитивным и даже приблизительно не напо минал тот BASIC, который я изучал в школе.
В 1995 году я уже в совершенстве освоил создание электронных таблиц.
И вот компания, в которой я работал, приняла решение о переходе с Lotus 1 2 3 на Excel. Без преувеличения, я оказался в сложном положении: с одной стороны — средство записи макросов, которое не работает так, как надо, с другой — язык программирования, в котором я ничего не понимал.
Эта книга задумывалась как пособие для тех, кто разбирается в создании электронных таблиц больше, чем остальные 90% его сотрудников. Знание ка кого либо языка программирования необязательно. Практика показывает, что знание таких языков, как BASIC, может скорее навредить, чем принести пользу.
Нас должно объединять следующее: мы все пытались создать макрос в Excel и остались недовольны полученным результатом.
Хорошие новости Многочисленные недостатки средства записи макросов не являются не преодолимым препятствием на пути к постижению искусства программиро вания в Excel. Далее в книге будет рассказано, как исправить ошибки автома тически сгенерированного кода, а также как прочитать загадочный ману скрипт, написанный на языке Visual Basic.
Отличные новости Microsoft Visual Basic for Applications (VBA) — чрезвычайно мощный язык программирования. С его помощью можно продублировать абсолютно все действия, выполняемые посредством пользовательского интерфейса Excel, например, создание отчетов, построение диаграмм и т.п.
Авторы книги работают в компании MrExcel Consulting, предлагающей ус луги по автоматизации процесса создания отчетов в Excel для огромного числа клиентов. В ходе своей работы мы часто сталкиваемся с очень похожими зада чами: успешно импортировав данные в Excel, наши клиенты хотели бы упро стить долгий и утомительный процесс создания одних и тех же еженедельных, ежемесячных или ежеквартальных отчетов.
Именно это и предлагает VBA. Часы, потраченные на программирование макросов, сводят создание отчетов к нескольким щелчкам мыши. Поистине царская награда!
В этой главе будут рассмотрены причины некорректной работы средства за писи макросов. В частности, будет рассмотрен макрос, который начинает сбо ить на следующий день после своего создания. Не обращайте внимания на не понятный вам код. Цель этой главы — показать фундаментальную проблему средства создания макросов Excel и познакомить вас со средой разработки VBA.
Панель инструментов “Visual Basic” Панель инструментов Visual Basic — одно из основных средств, необходи мых при написании макросов с помощью VBA. Чтобы отобразить ее на экра не, выберите в меню Excel команду Вид Панели инструментов Visual Basic (View Toolbars Visual Basic) (рис. 1.1).
Рис. 1.1. Панель инструментов Visual Basic предоставляет интерфейс для выполне ния и записи макросов Панель инструментов Visual Basic содержит несколько кнопок.
Выполнить макрос (Run Macro). Отображает список доступных макросов.
Записать макрос (Record Macro). Начинает процесс записи макроса и отображает панель инструментов Остановить запись (Stop Recording) Рис. 1.2. Одна из самых маленьких панелей инструментов в Excel содержит одну из самых важных для записи работоспособного макроса кнопок (Относительная Безопасность (Security). Отображает диалоговое окно Безопасность (Security) (см. раздел ‘‘Безопасность макросов’’, далее в этой главе).
Редактор Visual Basic (Visual Basic Editor). Открывает редактор Visual Элементы управления (Control Toolbox). Отображает панель инструмен тов с элементами управления, которые можно добавить на рабочий лист.
Режим конструктора (Design Mode). Режим конструктора позволяет редактировать элементы управления, размещенные на рабочем листе.
Редактор сценариев (Microsoft Script Editor). Открывает редактор Web сценариев. Поскольку эта тема не имеет прямого отношения к VBA, Панель инструментов Остановить запись (см. рис. 1.2), которая отобража ется на экране в результате щелчка на кнопке Записать макрос, содержит всего лишь 2 кнопки.
Остановить запись (Stop Recording). Останавливает текущий процесс Относительная ссылка (Relative Reference). Указывает Excel на необ ходимость использования относительных ссылок вместо абсолютных.
Безопасность макросов После того как макросы VBA стали использоваться злоумышленниками для распространения вирусов, Microsoft разработала новую политику безопас ности, по умолчанию запрещающую выполнение макросов. Чтобы продол жить изучение материала, нам потребуется изменить стандартную политику.
Откройте диалоговое окно Безопасность (Security) (рис. 1.3), выбрав ко манду главного меню Excel Сервис Макрос Безопасность (Tools Macro Security). Microsoft различает 4 уровня безопасности: Очень высокая (Very High), Высокая (High) (используется по умолчанию), Средняя (Medium) и Низкая (Low). При выборе уровня безопасности Высокая запрещается выпол нение или редактирование всех неподписанных макросов. Чтобы начать созда ние собственных макросов, выберите уровень безопасности Средняя.
Уровень безопасности “Очень высокая” В соответствии с парадигмой безопасности Microsoft системный админи стратор создает высокозащищенный сетевой каталог (так называемую песочницу (sandbox)) и определяет его как доверенное размещение. Все макро сы, находящиеся в песочнице, считаются безопасными (их разрешается вы полнять), остальные макросы таят в себе потенциальную угрозу. Ключевым моментом этой парадигмы является предположение о невозможности ком прометации доверенного размещения.
Уровень безопасности “Высокая” На этом уровне безопасности разрешается выполнение только доверенных макросов, т.е. макросов, имеющих цифровую подпись и происходящих из на дежного источника. Поскольку подписывание макроса подразумевает необхо димость приобретения цифрового сертификата у уполномоченной на это ор ганизации (такой как VeriSign), уровень безопасности Высокая (High) являет ся далеко не самым лучшим выбором при разработке собственных макросов.
При открытии рабочей книги все находящиеся в ней неподписанные макросы будут попросту отключены.
Рис. 1.3. Уровень безопасности Высокая выбран по Уровень безопасности “Средняя” На уровне безопасности Средняя (Medium) решение об отключении потенциально опасных макросов принимается пользователем. Именно этот уровень безопасности рекомендуется применять при разработке соб ственных макросов. Конечно же, необходимость включать макросы при каждом открытии рабочей книги может несколько раздражать. С другой стороны, это последняя возможность защититься от разрушительного ви руса, который таится в ничем не приметной рабочей книге, присланной вам по электронной почте.
Уровень безопасности “Низкая” На этом уровне безопасности защита от потенциально опасных макро сов отсутствует. Теперь уже ничто не защитит вас от вируса, хранящегося в рабочей книге. Применение уровня безопасности Низкая (Low) крайне не рекомендуется.
42 Часть I Первые шаги Если необходимость включения собственных макросов при каждом откры тии рабочей книги начала приводить вас в бешенство, подумайте о приобре тении цифрового сертификата (см. выше).
Запись, хранение и выполнение макросов Запись макросов весьма полезна на начальном этапе изучения языка мак росов. По мере накопления знаний и опыта потребность в записи макросов будет неуклонно уменьшаться.
Чтобы начать запись макроса, выберите команду главного меню Excel Сервис Макрос Начать запись (Tools Macro Record New Macro) или щелкните на кнопке Записать макрос (Record Macro) панели инструментов Visual Basic. Перед тем как начать запись макроса, Excel отобразит диалоговое окно Запись макроса (Record Macro), показанное на рис. 1.4.
Диалоговое окно “Запись макроса” Введите имя макроса в поле Имя макроса (Macro name). В имени макроса не допускается использование пробела (таким образом, имя Макрос1 являет ся допустимым, а имя Макрос 1 — нет). Старайтесь давать макросам значи мые имена, например, КвартальныйОтчет. Имена наподобие Макрос1 яв ляются не слишком информативными.
Задайте сочетание клавиш с помощью одноименного поля. К примеру, если ввести в поле Сочетание клавиш (Shortcut key) букву ‘‘п’’, записанный макрос можно будет выполнить путем нажатия комбинации клавиш.
С помощью раскрывающегося списка Сохранить в (Store macro in) выберите место хранения записываемого макроса: Личная книга макросов (Personal Macro Workbook), Новая книга (New Workbook) или Эта книга (This Workbook).
Макросы, имеющие непосредственное отношение к текущей рабочей книге, рекомендуется сохранять в размещении Эта книга.
Личная книга макросов (PERSONAL.XLS) создается при первом сохранении макроса в одноименном размещении. Это скрытая рабочая книга, которая загружается автоматически при каждом запуске Excel. Чтобы отобразить лич ную книгу макросов на экране, выберите команду главного меню Excel Окно Отобразить (Window Unhide).
Личная книга макросов подходит для хранения далеко не каждого макроса.
В ней рекомендуется хранить макросы общего назначения, не имеющие непо средственного отношения к конкретному рабочему листу или книге.
После выбора места хранения макроса щелкните на кнопке OK. Чтобы за кончить запись макроса, щелкните на кнопке Остановить запись (Stop Re cording) одноименной панели инструментов.
Выполнение макроса Для выполнения макроса достаточно нажать соответствующую комбина цию клавиш (если она определена) на клавиатуре. Макрос можно назначить также кнопке панели инструментов или элементу управления формы. Кроме того, выполнить макрос можно с помощью уже рассмотренной панели инст рументов Visual Basic.
Создание кнопки выполнения макроса Макросы общего назначения рекомендуется хранить в личной книге мак росов и запускать с помощью кнопки, вынесенной на панель инструментов.
Чтобы создать кнопку выполнения макроса, следуйте приведенной ниже процедуре.
1. Щелкните на панели инструментов правой кнопкой мыши и выберите команду контекстного меню Настройка (Customize).
2. Перейдите во вкладку Команды (Commands) (рис. 1.5).
макроса на панель инструментов Excel, восполь 44 Часть I Первые шаги 3. Выберите категорию Макросы (Macros).
4. Выберите команду Настраиваемая кнопка (Custom Button) (со значком улыбающейся рожицы) и перетащите ее на панель инструментов.
5. Щелкните на помещенном на панель инструментов значке с улыбаю щейся рожицей правой кнопкой мыши (не закрывайте диалоговое окно Настройка (Customize)).
6. Выберите команду контекстного меню Назначить макрос (Assign Macro), выберите макрос и щелкните на кнопке OK.
7. Закройте диалоговое окно Настройка.
Назначение макроса элементу управления формы Макросы, имеющие непосредственное отношение к конкретной рабочей книге, рекомендуется хранить вместе с рабочей книгой и запускать с помо щью элемента управления формы, помещенного на рабочий лист.
Чтобы назначить макрос элементу управления формы, помещенному на рабочий лист, выполните следующие действия.
1. Отобразите панель инструментов Формы (Forms), выбрав команду главного меню Excel Вид Панели инструментов Формы (View 2. Щелкните на кнопке Кнопка (Button).
3. Щелкните на рабочем листе левой кнопкой мыши и, удерживая ее (кнопку) нажатой, нарисуйте контур кнопки. Отпустите левую кнопку мыши.
4. Выберите требуемый макрос в диалоговом окне Назначить макрос объекту (Assign Macro) (рис. 1.6) и щелкните на кнопке OK.
5. Щелкните на только что созданной кнопке для выполнения макроса.
Редактор Visual Basic На рис. 1.7 показано типичное окно редактора Visual Basic, которое состоит из трех основных частей. Не беспокойтесь, если ваше окно редактора Visual Basic отличается от показанного на рисунке. Более подробно редактор Visual Basic рассматривается в следующих разделах главы.
Рис. 1.7. Окно редактора Visual Basic Параметры редактора Visual Basic Редактор Visual Basic имеет несколько настраиваемых параметров. Рас смотрим те из них, которые относятся непосредственно к написанию кода.
Настройка параметров редактора Visual Basic Чтобы настроить параметры редактора Visual Basic, выберите команду ме ню Tools Options (Сервис Параметры)1 и перейдите во вкладку Editor (Редактор). Из всех параметров, размещенных на этой вкладке, внимания за служивает только один — Require Variable Declaration (Требовать объявления переменной). По умолчанию Excel не требует объявлять переменные, что спо 1 Примерный перевод. Редактор Visual Basic не русифицирован. Прим. ред.
46 Часть I Первые шаги собствует более быстрому написанию кода. С другой стороны, с помощью этого требования можно предотвратить ошибки ввода имен переменных. По ступайте так, как посчитаете нужным.
Использование цифровых подписей Если вам надоело постоянно подтверждать безопасность собственных мак росов, воспользуйтесь цифровой подписью, выбрав команду меню Tools Digital Signature (Сервис Цифровая подпись).
Диспетчер проектов Диспетчер проектов содержит список всех открытых рабочих книг и загру женных дополнительных модулей. Щелкнув на значке ‘‘плюс’’ рядом с узлом VBAProject (Проект VBA), можно увидеть папки Microsoft Excel Objects (Объекты Microsoft Excel), Forms (Формы), Class Modules (Модули классов) и Modules (Модули) (присутствует по умолчанию). Каждая папка содержит один или несколько компонентов.
Чтобы просмотреть код компонента, щелкните на нем правой кнопкой мыши и выберите команду контекстного меню View Code (Просмотр кода).
Такого же результата можно достичь путем двойного щелчка на названии компонента (за исключением форм, двойной щелчок на названии которых приводит к открытию формы в режиме конструктора).
Чтобы отобразить окно диспетчера проектов, выберите команду меню Tools Project Explorer (Сервис Диспетчер проектов), нажмите ком бинацию клавиш или щелкните на кнопке Project Explorer (Диспетчер проектов), расположенной на панели инструментов.
Окно диспетчера проектов показано на рис. 1.8. Чтобы добавить к проекту модуль, щелкните на названии проекта правой кнопкой мыши, выберите ко манду контекстного меню Insert (Вставить), а затем — тип добавляемого модуля.
Объекты Microsoft Excel По умолчанию проект состоит из модулей рабочих листов и модуля ЭтаКнига (ThisWorkbook). Код, имеющий непосредственное отношение к рабочему листу (например, код обработки событий листа), помещается в соответствую щий этому листу модуль. Модуль ЭтаКнига содержит код обработки событий рабочей книги. Об обработке событий речь идет в главе 8, ‘‘События’’.
Excel позволяет создавать формы для взаимодействия с пользователем.
О формах речь идет в главе 9, ‘‘Введение в пользовательские формы’’.
При записи макроса Excel автоматически создает модуль, куда помещает код макроса. Именно в таких модулях хранится большая часть создаваемого Модули классов Модули классов Excel предназначены для создания пользовательских объ ектов. Помимо этого, модули классов позволяют программистам обменивать ся фрагментами кода, не вдаваясь в подробности работы последнего. О моду лях классов речь идет в главе 20, ‘‘Создание пользовательских объектов, типов и коллекций’’.
Окно свойств Окно свойств предназначено для редактирования параметров различных компонентов — рабочих листов, книг, модулей или элементов управления форм. Список параметров компонента зависит от его типа.
Чтобы открыть окно свойств, выберите команду меню View Properties Window (Вид Окно свойств), нажмите клавишу или щелкните на кнопке Project Properties (Свойства проекта), расположенной на панели инструментов.
Практикум Предположим, что вы работаете бухгалтером. Каждое утро вы получаете по элек тронной почте текстовый файл с разделителями запятыми, содержащий инфор мацию о счетах за вчерашний день в столбцах СчетДата, СчетНомер, ПродавецНомер, КлиентНомер, ПродуктВыручка, СервисВыручка, ПродуктСтоимость (рис. 1.9).
48 Часть I Первые шаги Рис. 1.9. Файл Счет.txt Вы вручную импортируете этот файл в Excel, добавляете итоговый столбец, фор матируете заголовки столбцов с помощью утолщенного шрифта и распечатываете полученный отчет для передачи менеджерам.
Подготовка к записи макроса Описанная выше последовательность действий просто таки напрашивается быть оформленной в виде макроса. Прежде чем приступить к его записи, составьте точный список выполняемых операций. В рассматриваемом случае он должен выглядеть так.
1. Выберите команду главного меню Excel Файл Открыть (File Open).
2. Отобразите содержимое папки, в которой хранится файл Счет.txt.
3. Выберите значение Все файлы (All Files) из раскрывающегося списка Тип 4. Выберите файл Счет.txt.
5. Щелкните на кнопке Открыть (Open).
6. В группе Формат исходных данных (Original data type) диалогового окна Мастер текстов (импорт) — шаг 1 из 3 (Text Import Wizard — Step 1 of 3) устано вите переключатель С разделителями (Delimited).
7. Щелкните на кнопке Далее (Next).
8. В группе Символом-разделителем является (Delimiters) диалогового окна Мастер текстов (импорт) — шаг 2 из 3 (Text Import Wizard — Step 2 of 3) сбросьте флажок Знак табуляции (Tab) и установите флажок Запятая (Comma).
9. Щелкните на кнопке Далее.
10.В группе Формат данных столбца (Column data format) диалогового окна Мастер текстов (импорт) — шаг 3 из 3 (Text Import Wizard — Step 3 of 3) уста новите переключатель Дата (Date) и выберите из раскрывающегося списка 11. Щелкните на кнопке Готово (Finish) для импортирования файла.
12.Нажмите клавишу, а затем — клавишу, чтобы переместиться на по следнюю строку импортированных данных.
13.Нажмите клавишу, чтобы переместиться на итоговую строку.
14.Введите слово “Всего”.
15. Нажмите клавишу 4 раза, чтобы переместиться в столбец E итоговой строки.
16.Щелкните на кнопке Автосумма (AutoSum) и нажмите комбинацию клавиш, чтобы суммировать значения столбца ПродуктВыручка, остава ясь при этом в той же ячейке.
17. Перетащите маркер заполнения по столбцам F и G, чтобы скопировать в них формулу суммирования.
18.Выделите строку 1 и щелкните на кнопке Полужирный (Bold), чтобы выделить заголовки столбцов путем утолщения шрифта.
19.Выделите итоговую строку и щелкните на кнопке Полужирный, чтобы выделить суммарные значения столбцов путем утолщения шрифта.
20.Нажмите комбинацию клавиш, чтобы выделить все ячейки рабочего листа.
21.Выберите команду Формат Столбец Автоподбор ширины (Format Column AutoFit Selection).
Теперь вы готовы к записи своего первого макроса. Создайте пустую рабочую книгу и сохраните ее под каким нибудь описательным именем, например МакросИмпортаСчетов.xls. Щелкните в панели инструментов Visual Basic на кнопке Записать макрос (Record Macro) или выберите команду меню Сервис Макрос Начать запись (Tools Macro Record New Macro).
Измените предлагаемое по умолчанию имя макроса Макрос1 на более инфор мативное, например ИмпортСчета. Убедитесь, что макрос будет сохранен в раз мещении Эта книга (This Workbook) и задайте сочетание клавиш для выполнения макроса, к примеру. По умолчанию в поле Описание (Description) зано сится ваше имя и дата создания макроса. Добавьте сюда текст, кратко описываю щий предназначение макроса (рис. 1.10), и щелкните на кнопке OK.
50 Часть I Первые шаги Запись макроса Начиная с этого момента средство записи макросов фиксирует каждое совершен ное вами действие. Постарайтесь не отклоняться от намеченной ранее последо вательности операций. Если, к примеру, вы случайно переместитесь в столбец F вместо столбца E, а затем вернетесь обратно, созданный макрос будет старатель но повторять эту ошибку при каждом своем запуске.
Сопротивляйтесь желанию убрать из виду панель инструментов Остановить запись (Stop Recording). Если она будет вам мешать, перетащите ее в безо пасное место (действие по перетаскиванию панели Остановить запись не вклю чается в записываемый макрос). Если вы все же закроете панель инструментов Остановить запись, то для того чтобы завершить запись макроса, вам потребует ся выбрать команду меню Сервис Макрос Остановить запись (Tools Macro Stop Recording).
Выполните все действия, необходимые для создания отчета. Чтобы остановить запись макроса, щелкните на панели инструментов Остановить запись на одно именной кнопке. Панель инструментов Остановить запись исчезнет из виду.
Закрытие панели инструментов Остановить запись не приводит к остановке записи макроса. Этим вы только усложните себе жизнь, так как теперь для завершения записи макроса вам потребуется выбрать команду меню Сервис Макрос Остановить запись.
Пришло время взглянуть на сгенерированный код макроса. Для этого от кройте окно редактора Visual Basic, выбрав команду меню Сервис Макрос Редактор Visual Basic (Tools Macro Visual Basic Editor) или воспользовав шись комбинацией клавиш.
Изучение кода макроса Рассмотрим код, сгенерированный Excel в результате записи макроса. От кройте редактор Visual Basic, воспользовавшись комбинацией клавиш. Щелкните на названии модуля Module1 проекта МакросИмпортаСчетов.xls правой кнопкой мыши и выберите команду контекстного ме ню View Code (Просмотр кода). Строки кода, начинающиеся со знака апост рофа, являются комментариями и игнорируются Excel. Комментарии созда ются на основе информации, введенной в окне Запись макроса (Record Macro) (сюда, в частности, относится сочетание клавиш, использующееся для вызова макроса).
Внимание Комментарий не определяет сочетание клавиш. Другими словами, изменив в комментарии сочетание клавиш на, вы ничего не добьетесь.
Изменить сочетание клавиш можно только с помощью диалогового окна Макрос (Macro).
Сгенерированный код макроса, как правило, выглядит достаточно опрятно (рис. 1.11). Все строки кода, отличные от строк комментариев, сдвинуты на 4 символа вправо. Если длина строки превышает 100 символов, средство запи си макросов разбивает ее на несколько строк меньшей длины, дополнительно сдвигая их еще на 4 символа вправо. В месте разрыва строки помещаются сим волы пробела и знака подчеркивания. Поскольку физические размеры книги не позволяют поместить на странице строку длиной 100 символов, в приводимых далее примерах все строки будут разбиваться на границе в 60 65 символов. Та ким образом, код на экране компьютера может несколько отличаться от при водимого здесь.
Рис. 1.11. Сгенерированный код макроса выглядит очень аккуратно Приведенные ниже 8 строк кода представляют собой 1 строку, разбитую на несколько фрагментов для удобочитаемости.
Workbooks.OpenText Filename:= _ "C:\Счет.txt", Origin:=1251, StartRow:=1, _ DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, _ Comma:=True, Space:=False, Other:=False, _ FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), _ 52 Часть I Первые шаги Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1)), _ TrailingMinusNumbers:=True Учитывая сказанное выше, средство записи макросов превратило 21 шаговую процедуру создания отчета в 14 строк кода. Весьма неплохо!
Каждое действие, выполняемое посредством пользовательского интерфейса Excel, может быть описано с помощью одной или нескольких строк программного кода.
А теперь протестируем созданный макрос. Вернитесь к интерфейсу Excel, воспользовавшись комбинацией клавиш. Закройте файл Счет.txt, не сохранив внесенных в него изменений. При этом у вас должна остаться от крытой рабочая книга МакросИмпортаСчетов.xls.
Выполните сохраненный макрос, нажав комбинацию клавиш.
Он должен сработать безукоризненно (рис. 1.12).
Рис. 1.12. Создание отчета прошло без сучка и задоринки Непредвиденные результаты Предположим, что утром следующего дня вы получили по электронной почте новый файл Счет.txt. Запустив созданный накануне макрос с помо щью сочетания клавиш, вы были неприятно удивлены. Файл Счет.txt от 5 июня содержал сведения о 12 ти счетах, а файл Счет.txt от 6 июня — о 16 ти. Тем не менее, макрос поместил итоговую информацию в 14 ю строку, тем самым в точности воспроизведя действия, выполненные при его записи (рис. 1.13).
Возможное решение: использование относительных ссылок По умолчанию средство записи макросов рассматривает все действия, со вершаемые пользователем, как абсолютные. Если на определенном этапе пользователь введет данные в 14 ю строку, записанный макрос всегда будет вводить эти данные в 14 ю строку. Поскольку исходная информация может располагаться на разном количестве строк, использование при записи макро са абсолютных ссылок недопустимо.
Рис. 1.13. Записанный накануне макрос не выдержал проверки на прочность. Вместо того, что бы добавить итоговые сведения сразу же после информации о счетах, макрос добавил их в 14 ю строку Одним из возможных решений в данной ситуации является использование при записи макроса относительных ссылок.
Абсолютные ссылки основаны на действительных адресах ячеек, например A1. Относительные ссылки основаны на позиции ячейки относительно другой ячейки. Например, ссылка R[16]C[-1] указывает на ячейку, которая нахо дится на 16 строк ниже и на 1 столбец левее текущей ячейки.
Практикум Запишем тот же макрос с использованием относительных ссылок. Закройте файл Счет.txt без сохранения изменений. В рабочей книге МакросИмпортаСчетов.xls создайте новый макрос, выбрав команду меню Сервис Макрос Начать запись (Tools Macro Record New Macro). Присвойте новому макросу имя ИмпортСчетаОтносительно и назначьте другое сочетание клавиш, например (рис. 1.14).
Импортируйте данные из файла Счет.txt. Прежде чем переходить к последней строке данных с помощью последовательного нажатия клавиш и, щелкните на кнопке Относительная ссылка (Relative Reference) в панели инстру ментов Остановить запись (Stop Recording) (см. рис. 1.2).
Выполните следующие действия.
1. Нажмите клавишу, а затем — клавишу, чтобы переместиться на по следнюю строку импортированных данных.
54 Часть I Первые шаги 2. Нажмите клавишу, чтобы переместиться на итоговую строку.
3. Введите слово “Всего”.
4. Нажмите клавишу 4 раза, чтобы переместиться в столбец E итоговой строки.
5. Щелкните на кнопке Автосумма (AutoSum) и нажмите комбинацию клавиш, чтобы суммировать значения столбца ПродуктВыручка, остава 6. Перетащите маркер заполнения по столбцам F и G, чтобы скопировать в них формулу суммирования.
7. Выделите итоговую строку с помощью комбинации клавиш и щелкните на кнопке Полужирный (Bold), чтобы выделить суммарные значения столбцов путем утолщения шрифта.
Не спешите перемещаться в ячейку A1 и выделять заголовки столбцов путем утолщения шрифта. Средство записи макросов зафиксирует это действие как перемещение на 17 строк вверх, а это не совсем корректно. Отключите режим относительных ссылок, еще раз щелкнув на кнопке Относительная ссылка, и продолжите запись макроса.
8. Выделите строку 1 и щелкните на кнопке Полужирный, чтобы выделить заголов ки столбцов путем утолщения шрифта.
9. Нажмите комбинацию клавиш, чтобы выделить все ячейки рабочего 10.Выберите команду Формат Столбец Автоподбор ширины (Format Column AutoFit Selection).
11. Остановите запись макроса.
Нажмите комбинацию клавиш, чтобы вернуться в окно редактора Visual Basic и просмотреть полученный на этот раз код. Текст макроса ИмпортСчетаОтносительно будет помещен в модуль Module1 сразу же после текста макроса ИмпортСчета.
Внимание Если между созданием первого и второго макроса вы завершали работу с Ex cel, новый макрос будет помещен в модуль Module2.
На рис. 1.15 показан код макроса ИмпортСчетаОтносительно с двумя ком ментариями, указывающими на момент включения и отключения режима от носительных ссылок.
Рис. 1.15. Код макроса, записанного с использованием режима относительных ссылок Чтобы протестировать макрос, закройте файл Счет.txt без сохранения изменений и нажмите комбинацию клавиш. На этот раз работа мак роса не должна вызывать каких либо нареканий.
Предположим, что файл Счет.txt от 7 го июня содержит сведения о 21 счете (рис. 1.16).
Откройте рабочую книгу МакросИмпортаСчетов.xls и выполните но вый макрос, нажав комбинацию клавиш. На первый взгляд макрос справился с поставленной перед ним задачей. Но взгляните на рис. 1.17 — не кажется ли вам, что здесь что то не так?
Передав подобный отчет менеджеру, вы, несомненно, навредили бы своей репутации. Присмотритесь к ячейке E23. В левом верхнем углу ячейки нахо 56 Часть I Первые шаги дится маленький зеленый треугольник — верный признак ошибки. Следует отметить, что возможность предупреждения ошибок появилась благодаря смарт тегам — средству, недоступному в Excel 95 или Excel 97.
Рис. 1.16. Сможет ли новый макрос справиться с этими данными?
Рис. 1.17. Результат выполнения макроса, использующего относительные ссылки Щелкните в ячейке E23 и подведите указатель к появившейся рядом с ячей кой кнопке примечания. На экране появится сообщение о том, что формула в этой ячейке ссылается на диапазон, к которому прилегают другие значения.
Взглянув на строку формул, вы увидите, что макрос суммировал значения толь ко с 7 по 22 строку. К сожалению, логику функции автоматического суммирова ния не может воспроизвести ни один автоматически созданный макрос.
Если же файл Счет.txt от 7 го июня содержит сведения о меньшем коли честве счетов, чем 6 го июня, Excel ‘‘наградит’’ вас аналогичной формулой =СУММ(E10:E65531) (=SUM(E10:E65531)) и сообщением о наличии цик лических ссылок (рис. 1.18).
Рис. 1.18. Результат выполнения макроса, использующего относительные ссылки, при меньшем количестве счетов Отчаяние Дочитав книгу до этого места, вы, вероятно, уже проклинаете Microsoft.
Представьте себе мое состояние после нескольких дней безуспешных попыток написать хотя бы один работающий макрос. Ситуацию усугубляло знание то го, что подобные макросы без проблем генерировались средством записи мак росов Lotus 1 2 3, созданным в далеком 1983 году. То, что получилось у Мича Кейпора (Mitch Kapor) 21 год назад, Microsoft не может повторить до сих пор.
Известно ли вам, что все ранние версии Excel вплоть до Excel 97 поддержи вали выполнение макросов командной строки Lotus? Этот факт стал известен мне только после того, как Microsoft объявила об окончании поддержки Excel 97. Многие компании, перешедшие на Excel XP (который уже не под держивал выполнение макросов Lotus 1 2 3), обратились к нам с просьбой пе реписать старые макросы Lotus на Excel VBA. Я не могу смириться с мыслью, что начиная с Excel 5, Excel 95 и Excel 97 интерпретатор Microsoft мог выпол нить макрос, корректно решавший поставленную нами задачу, однако средст во записи макросов было не в состоянии его создать.
Следующий шаг Единственно правильное решение рассмотренной задачи заключается в применении языка программирования Visual Basic. Первым приближением 58 Часть I Первые шаги к цели можно считать автоматически сгенерированный макрос. Немного здравого смысла, и он станет реальным подспорьем в решении повседневных задач. В главе 2, ‘‘Знакомство с Visual Basic for Applications” мы попробуем применить этот подход к двум записанным нами макросам. Научившись ‘‘читать’’ код VBA, вы с легкостью сможете подправить автоматически сгене рированный код и даже написать макрос ‘‘с нуля’’.
Visual Basic for Applications Загадочный код Код VBA способен смутить каж дого, кто изучал в школе один из процедурных языков программиро вания наподобие BASIC или COBOL.
Несмотря на то что VBA расшифро вывается как ‘‘Visual Basic for Applica tions’’, он представляет собой объект но ориентированную версию BASIC. Диспетчер объектов
Рассмотрим небольшой фрагмент 5 советов по исправлению и Selection.End(xlDown).Select ActiveCell.FormulaR1C1 = "Всего" автоматически Range("E14").Select Selection.FormulaR1C1 = _ "=SUM(R[-12]C:R[-1]C)" Selection.AutoFill Destination:=Range("E14:G14"), _ Type:=xlFillDefault Бьюсь об заклад, что этот код не будет иметь ни малейшего смысла для тех, кто изучал только процедур ные языки программирования (к со жалению, практика изучения проце дурных языков еще весьма популярна во многих учебных заведениях).
Ниже приведен фрагмент кода, написанный на языке BASIC.
For x = 1 to Print Rpt$(" ", x);
Print "*";
Next x В результате его выполнения на эк ране компьютера появится ‘‘лесенка’’ из символов звездочки.
Синтаксис процедурного языка программирования больше похож на син таксис английского языка, нежели синтаксис объектно ориентированного языка программирования. К примеру, выражение Print "Hello World" записано в привычном формате ‘‘глагол объект’’. А теперь постараемся за быть о программировании и рассмотрим один конкретный пример.
Учимся понимать “речь” VBA Попробуем сыграть в футбол на языке BASIC. Команда ‘‘ударить по мячу’’ будет выглядеть примерно следующим образом:
Именно так мы и говорим в повседневной жизни. Глагол ‘‘ударить’’ (kick) следует перед существительным ‘‘мяч’’ (the ball). Аналогично, в приведенном выше примере глагол Print следует перед существительным * (звездочка).
К сожалению, подобный синтаксис не употребляется ни в одном объект но ориентированном языке, включая VBA. Исходя из самого названия этого класса языков программирования, становится ясно, что центральное место здесь отводится объекту, т.е. существительному. Команда ‘‘ударить по мячу’’, записанная на языке VBA, будет выглядеть так:
Ball.Kick В VBA существительное (объект) записывается перед глаголом (методом).
Базовая структура большинства строк VBA выглядит так:
К сожалению, это не очень похоже на повседневную речь. Никто не гово рит ‘‘Вода.Пить’’, ‘‘Мяч.Ударить’’ или ‘‘Девушка.Целовать’’. Именно поэтому VBA кажется очень сложным по сравнению с процедурными языками про граммирования.
Продолжим аналогию. Представьте, что вы стоите на зеленом газоне перед тремя мячами: футбольным, баскетбольным и бейсбольным. Как сказать на VBA ‘‘ударить футбольный мяч’’ члену школьной футбольной команды?
Выше была приведена команда ‘‘ударить по мячу’’ (Ball.Kick), однако в данном случае этого недостаточно. Возможно, ребенок ударит мяч, который находится ближе всех к нему (например, бейсбольный).
В VBA практически для каждого объекта (существительного) определяется коллекция этих объектов. Рассмотрим электронную таблицу Excel. Строке со ответствует набор строк, столбцу набор столбцов, рабочему листу набор рабочих листов. С точки зрения синтаксиса имя коллекции объектов состав ляется из имени объекта и суффикса ‘‘s’’, например:
Row Rows, Cell Cells, Ball Balls.
Существует несколько способов обращения к элементу коллекции. Пер вый из них состоит в использовании порядкового номера элемента, например:
Balls(2).Kick Несмотря на то что приведенная выше запись вполне корректна, пере упорядочивание мячей в коллекции может привести к весьма плачевному результату.
Второй способ обращения к элементу коллекции является более безопас ным и состоит в использовании имени элемента, например:
Balls("Soccer").Kick Теперь можно быть уверенным, что ребенок ударит именно по футбольно му мячу.
Для большинства методов (глаголов) в Excel VBA определены параметры, ха рактеризующие способ выполнения метода (назовем их наречиями). Ниже приве дена команда ‘‘сильно ударить футбольный мяч так, чтобы он полетел влево’’:
Balls("Soccer").Kick Direction:=Left, Force:=Hard Комбинации двоеточия и знака равенства в коде VBA всегда указывают на параметр метода.
Методы могут иметь много параметров, как обязательных, так и нет. Пред положим, что у метода Kick есть параметр Elevation (‘‘поднятие’’). Ниже приведена команда ‘‘сильно ударить футбольный мяч так, чтобы он полетел высоко влево’’:
Balls("Soccer").Kick Direction:=Left, Force:=Hard, Elevation:=High Для каждого метода существует определенный порядок следования его пара метров. Некоторые программисты пропускают имена параметров, указывая толь ко их значения. Следующая строка кода полностью эквивалентна предыдущей:
Balls("Soccer").Kick Left, Hard, High Практика пропуска имен параметров не вносит ясности в код, так как не зная точного порядка следования параметров, сложно судить о предназначе нии той или иной строки. Значения параметров Left, Hard и High сами по себе информативны, однако так бывает далеко не всегда. Рассмотрим сле дующую строку кода:
WordArt.Add Left:=10, Top:=20, Width:=100, Height:= Если пропустить имена параметров, она будет выглядеть так:
WordArt.Add 10, 20, 100, Несмотря на то что приведенная выше строка кода вполне корректна, от сутствие имен параметров серьезно затрудняет восприятие ее смысла. Точный 62 Часть I Первые шаги порядок следования параметров метода можно узнать, обратившись к разделу справочной системы, посвященному этому методу.
Ситуацию усложняет еще и то, что имена параметров требуется указывать только в случае нарушения стандартного порядка их следования. Ниже приве дены две эквивалентных строки кода, соответствующих команде ‘‘ударить футбольный мяч так, чтобы он полетел высоко влево’’ (не важно, насколько сильным будет сам удар):
Balls("Soccer").Kick Direction:=Left, Elevation:=High Balls("Soccer").Kick Left, Elevation:=High Указав имя одного параметра, следует указать также имена всех парамет ров, которые последуют за ним в этой строке кода.
Некоторые методы не имеют параметров. Ниже приведен код, имитирую щий нажатие клавиши :
Application.Calculate Другие методы выполняют действие и возвращают его результат. Ниже приведен код, добавляющий рабочий лист:
Worksheet.Add Before:=Worksheets(1) Поскольку метод Worksheet.Add создает новый объект, результат его выполнения может быть присвоен переменной (параметры метода при этом следует взять в скобки):
Set MyWorksheet = Worksheet.Add (Before:=Worksheets(1)) Напоследок рассмотрим еще одну важную составляющую языка VBA — свойства. Свойства описывают объект наподобие того, как прилагательное описывает существительное.
Обратимся к примеру. В Excel существует объект, соответствующий актив ной ячейке ActiveCell. Предположим, что нам необходимо изменить цвет активной ячейки на желтый. Цвет ячейки определяется значением свой ства Interior.ColorIndex объекта ActiveCell. Изменение цвета ячейки на желтый описывается следующей строкой кода:
ActiveCell.Interior.ColorIndex = Обратите внимание, что в приведенном выше коде используется конструк ция Объект.Свойство, похожая на уже рассмотренную нами конструкцию Объект.Метод. На первый взгляд, их невозможно отличить друг от друга. Если же присмотреться повнимательнее, то можно заметить отсутствие двоеточия перед знаком равенства в строке с конструкцией Объект.Свойство. Обычно свойство всегда присутствует в левой или правой части выражений, связанных с присвоением значения.
Ниже приведена команда, изменяющая цвет текущей ячейки на цвет ActiveCell.Interior.ColorIndex = Range("A1").Interior.ColorIndex Итак, изменение значения свойства Interior.ColorIndex приводит к изменению цвета ячейки. Сравнивая свойство с прилагательным, получаем достаточно странный результат изменение прилагательного влечет за собой выполнение действия.
В табл. 2.1 приведен краткий ‘‘словарь’’ терминов VBA.
Таблица 2.1. Словарь терминов VBA Объект Имя существительное Коллекция Имя существительное Обычно указывается элемент коллек Свойство Имя прилагательное Обычно свойство присутствует в левой Справочная система VBA Не беспокойтесь, если вы все еще не научились отличать метод от свойст ва. Именно здесь нам пригодится раскритикованное в предыдущей главе средство записи макросов. Чтобы узнать, как запрограммировать то или иное действие, запишите его в виде макроса и затем изучите сгенерированный код.
Спасительная клавиша Приступая к написанию макросов, обязательно убедитесь в наличии на вашем компьютере справочной системы VBA. К сожалению, она не входит в стандартную установку Microsoft Office. Чтобы проверить наличие справочной системы VBA, выполните следующие действия.
1. Запустите Excel и откройте окно редактора Visual Basic, воспользовав шись комбинацией клавиш. Выберите команду меню Insert Module (Вставить Модуль) (рис. 2.1).
2. Введите 3 строки кода, как показано на рис. 2.2, и установите курсор посредине слова MsgBox.
3. Нажмите клавишу. Если справочная система VBA установлена, откроется окно, показанное на рис. 2.3.
64 Часть I Первые шаги Рис. 2.1. Вставьте в рабочую книгу Рис. 2.2. Установите курсор посредине Рис. 2.3. Если справочная система VBA установлена, вы увидите Если справочная система VBA не установлена, Excel выдаст сообщение об ошибке. Установите справочную систему VBA, воспользовавшись установоч ными компакт дисками Microsoft Office (при необходимости обратитесь за помощью к системному администратору).
Просмотр разделов справочной системы Раздел справочной системы, посвященный тому или иному методу, содер жит подробное описание всех его параметров. Под именем метода или функ ции расположены три ссылки: See Also (См. также), Example (Пример) и Specifics (Особенности). Одной из наиболее полезных является ссылка Example, ведущая на страницу с примером использования метода или функ ции (рис. 2.4).
Рис. 2.4. Большинство разделов справочной системы VBA со держат ссылку на страницу с примерами Код примера можно выделить (рис. 2.5), скопировать в буфер обмена с по мощью комбинации клавиш, а затем вставить в модуль с помощью комбинации клавиш.
Код записанных макросов наверняка содержит много незнакомых объек тов и методов. Установите курсор посредине интересующего вас ключевого 66 Часть I Первые шаги слова и нажмите клавишу, чтобы отобразить соответствующий раздел справочной системы VBA.
Рис. 2.5. Выделите код примера и скопируйте его в буфер обмена с по Изучение кода записанного макроса Рассмотрим код первого макроса, записанного в главе 1, “Excel и VBA — гремучая смесь”, и попытаемся понять его смысл в контексте объектов, свойств и методов (рис. 2.6).
Согласно концепции Объект.Метод (или, что то же самое, Существитель ное.Глагол) в 1 й строке кода Workbooks является объектом, а OpenText — методом. Установите курсор внутри слова OpenText и нажмите клавишу, чтобы открыть раздел справочной системы VBA, посвященный этому методу (рис. 2.7).
В справочной системе указано, что OpenText — это метод. Его парамет ры перечислены в стандартном порядке следования в области, выделенной серым цветом. Обратите внимание, что метод OpenText имеет всего лишь один обязательный аргумент FileName. Все остальные параметры могут быть пропущены.
Рис. 2.6. Код записанного макроса Рис. 2.7. Раздел справочной системы, посвященный методу OpenText. Ссылка Applies To (Применяется к) позволяет просмотреть список объектов, к которым может быть применен этот метод 68 Часть I Первые шаги Необязательные параметры В справочной системе VBA можно найти информацию о стандартных зна чениях необязательных параметров. К примеру, стандартным значением пара метра StartRow является 1, что весьма приемлемо. А вот пропустив параметр Origin, вы рискуете попасть впросак. Дело в том, что по умолчанию Excel ис пользует текущее значение этого параметра. Другими словами, если вы выпол ните свой макрос после того, как кто то импортирует в Excel файл с китайскими иероглифами, Excel предположит, что вы хотите сделать то же самое.
Предопределенные константы Согласно разделу справочной системы VBA, посвященному методу OpenText (см. рис. 2.7), DataType — это свойство, которое может иметь значение xlDelimited или xlFixedWidth (предопределенные константы Excel VBA типа XlTextParsingType). В редакторе Visual Basic нажмите комбинацию клавиш, чтобы открыть окно Immediate (Быстрое выполнение).
В окне Immediate введите следующую строку и нажмите клавишу :
Print xlFixedWidth Как показано на рис. 2.8, значением константы xlFixedWidth является 2.
Аналогичным образом можно узнать значение константы xlDelimited, которое равно 1. Использование предопределенных констант с информа тивными именами вместо чисел значительно повышает удобочитаемость программного кода.
В большинстве случаев раздел справочной системы либо содержит допус тимые константы непосредственно в тексте справки, либо предлагает ссылку, щелчок на которой приводит к их отображению (рис. 2.9).
К справочной системе VBA можно предъявить только одну претензию она не позволяет узнать, является ли конкретный параметр нововведением те кущей версии Excel. К примеру, параметр TrailingMinusNumbers был впервые представлен в Excel 2002. Попытка выполнения макроса, содержа щего этот параметр, в Excel 2000 завершится весьма плачевно. К сожалению, эта проблема достаточно серьезна, поскольку решить ее можно только мето дом проб и ошибок.
Рис. 2.9. Щелкните на ссылке, чтобы увидеть все допустимые константы Изучив раздел справочной системы, посвященный методу OpenText, можно заметить, что этот метод является в некотором смысле эквивалентом мастера импорта текстов. Так, на первом шаге мастера необходимо выбрать формат исходных данных ширины (Fixed width), а также формат файла и строку, с которой необходимо начать импорт (рис. 2.10).
Другими словами, первый шаг мастера импорта текстов можно описать тремя параметрами метода OpenText:
Origin:= StartRow:= DataType:=xlDelimited 70 Часть I Первые шаги Рис. 2.10. Первый шаг мастера импорта текстов описывается тремя па На втором шаге мастера импорта текстов производится выбор разделителя для текстовых данных. Чтобы Excel не считал две последовательные запятые одной, флажок Считать последовательные разделители одним (Treat con secutive delimiters as one) снят. Поля, содержащие запятую как часть данных (например, ‘‘XYZ, Inc.’’), должны быть ограничены символом, выбранным в раскрывающемся списке Ограничитель строк (Text qualifier) (рис. 2.11).
Рис. 2.11. Второй шаг мастера импорта текстов описывается семью па Второй шаг мастера импорта текстов можно описать следующими пара метрами метода OpenText:
TextQualifier:=xlDoubleQuote ConsecutiveDelimiter:=False Tab:=False Semicolon:=False Comma:=True Space:=False Other:=False На третьем шаге мастера импорта текстов определяется формат столбцов данных. В рассмотренном примере мы оставили стандартный формат Общий (General) для всех столбцов, кроме первого, для которого был выбран формат даты ДМГ (DMY) (рис. 2.12).
Рис. 2.12. Третий шаг мастера импорта текстов описывается всего лишь одним параметром метода OpenText Третий шаг мастера импорта текстов полностью описывается параметром FieldInfo метода OpenText.
Щелкнув на кнопке Подробнее (Advanced) диалогового окна Мастер текстов (импорт) — шаг 3 из 3 (Text Import Wizard — Step 3 of 3), можно вы брать разделитель целой и дробной части, разделитель разрядов, а также ука зать на необходимость отображения знака ‘‘минус’’ в конце отрицательных чисел (рис. 2.13).
Следует отметить, что средство записи макросов не генерирует код для па раметров DecimalSeparator и ThousandsSeparator до тех пор, пока не будет выбран отличный от стандартного разделитель целой и дробной части и разделитель разрядов, соответственно. В то же время, средство записи макро сов всегда генерирует код для параметра TrailingMinusNumbers.
Как видите, практически каждое действие, выполняемое с помощью поль зовательского интерфейса Excel, находит отражение в фрагменте программ ного кода макроса.
72 Часть I Первые шаги Рассмотрим следующую строку:
Selection.End(xlDown).Select Щелкните на слове End и нажмите клавишу. На экране появится диалоговое окне Context Help (Контекстная справка), предлагающее выбрать один из двух разделов справочной системы, посвященный слову End. Один из них находится в библиотеке Excel, а другой в библиотеке VBA (рис. 2.14).
Чтобы не гадать, какой из двух разделов справочной системы вам нужен, щелкните на кнопке Help (Справка). Как показано на рис. 2.15, раздел спра вочной системы из библиотеки VBA содержит сведения о выражении End. Это не то, что нам нужно.
Закройте окно справочной системы, снова нажмите клавишу и выбе рите раздел, посвященный слову End, из библиотеки Excel. Свойство End воз вращает объект Range, что эквивалентно последовательному нажатию кла виш и или и в пользовательском интерфейсе Excel.
Щелкнув на ссылке XlDirection, можно увидеть список параметров, допус тимых для передачи функции End (рис. 2.16).
Рис. 2.15. Поиск нужного раздела справочной системы можно проводить методом проб и ошибок Возврат объектов свойством Ранее неоднократно упоминалось, что базовый синтаксис языка VBA пред ставлен конструкцией Объект.Метод. В рассмотренной выше строке кода ме тодом, очевидно, является метод.Select. Несмотря на то, что End — это свойство, оно возвращает объект Range, а метод, таким образом, применяется непосредственно к свойству.
Открыв раздел справочной системы, посвященный слову Selection, можно обнаружить, что это также свойство, а не объект. Полное обращение к свойству Selection выглядит как Application.Selection, однако в кон тексте использования объектной модели Excel префикс Application можно опустить. Если бы данный макрос выполнялся в текстовом редакторе Word, нам обязательно потребовалось бы указать перед свойством.Selection пе ременную объекта для идентификации вызываемого приложения.
Рис. 2.16. Нужный раздел справочной системы, посвященный свойству End Тип возвращаемого свойством Application.Selection объекта зависит от текущего выделенного элемента. Если это ячейка, свойство Application.Selection возвращает объект Range.
Использование отладчика кода Редактор Visual Basic содержит великолепный отладчик, предназначенный для поиска и устранения недостатков программного кода.
Пошаговое выполнение кода Обычно на выполнение макроса уходит всего лишь несколько секунд. Если во время этого произойдет какой то сбой, отследить его будет очень трудно.
К счастью, отладчик Excel поддерживает пошаговое выполнение кода.
Разместите курсор посредине имени процедуры ИмпортСчета и выберите команду меню Debug Step Into (Отладка Пошаговое выполнение) (или на жмите клавишу ) (рис. 2.17).
Сейчас редактор Visual Basic находится в режиме пошагового выполне ния кода. Строка, которая будет выполнена следующей, выделена желтым цветом. Кроме того, на нее указывает желтая стрелка, расположенная сле ва (рис. 2.18).
Рис. 2.18. Отладчик готов выполнить первую строку кода макроса Выполнение строки Sub ИмпортСчета() приводит к входу в процедуру ИмпортСчета(). Нажмите клавишу, чтобы выполнить эту строку и пе рейти к следующей. Редактор Visual Basic выделит желтым цветом фрагмент кода, соответствующий методу OpenText. Нажмите клавишу. После выполнения метода OpenText переключитесь в Excel с помощью комбина ции клавиш и убедитесь в успешном импорте файла Счет.txt.
Обратите внимание, что текущей выделенной ячейкой является ячейка A (рис. 2.19).
76 Часть I Первые шаги Рис. 2.19. Файл Счет.txt успешно импортирован в Excel Переключитесь в редактор Visual Basic, воспользовавшись комбинацией клавиш. Нажмите клавишу, чтобы выполнить строку кода макроса Selection.End(xlDown).Select. Переключившись в Excel, можно увидеть, что теперь текущей выделенной ячейкой является ячейка A (рис. 2.20).
Рис. 2.20. Выполнение команды Selection.End(xlDown).Select эквивалентно последовательному нажатию клавиш и Переключившись в редактор Visual Basic, нажмите клавишу, чтобы выполнить команду Range("A14").Select. Вместо того чтобы выделить ячейку в первой свободной строке после импортированных данных (A11), макрос выделил ячейку A14, как показано на рис. 2.21.
Рис. 2.21. Записанный макрос допускает ошибку Обнаружив проблемный участок кода, остановите выполнение макроса, выбрав команду меню Run Reset (Выполнить Сброс) или щелкнув на кнопке панели инструментов Reset (Сброс) (рис. 2.22). Вернитесь в Excel и отмените все действия, которые успел выполнить макрос. В данном случае за кройте файл Счет.txt без сохранения изменений.
Рис. 2.22. Щелчок на кнопке Reset приводит к остановке выполнения макроса Точки прерывания Длина некоторых макросов может достигать сотен строк. Чтобы добраться к проблемному участку кода, совсем необязательно пошагово выполнять все предшествующие ему строки. Создайте точку прерывания, и выполнение мак роса будет остановлено на ее границе.
Чтобы создать точку прерывания, щелкните на полосе слева от строки ко да, перед выполнением которой необходимо сделать остановку. Строка кода будет выделена красно коричневым цветом, а слева от нее появится такого же цвета маркер (рис. 2.23).
Рис. 2.23. Красно коричневый маркер слева от строки кода свидетельствует о наличии точки прерывания Выберите команду Run Run Sub/UserForm (Выполнить Выполнить под программу/Пользовательскую форму) или нажмите клавишу. Выполне ние макроса остановится на границе точки прерывания, а соответствующая 78 Часть I Первые шаги строка кода будет выделена желтым цветом. Нажмите клавишу, чтобы продолжить выполнение макроса в пошаговом режиме (рис. 2.24).
Рис. 2.24. Строка кода, на которой установлена точка прерывания, выделена желтым цветом Завершив отладку кода, следует удалить все точки прерывания. Чтобы уда лить точку прерывания, щелкните на соответствующей ей точке на полосе слева от строки кода. Чтобы удалить все точки прерывания в проекте, выбери те команду меню Debug Clear All Breakpoints (Отладка Удалить все точки прерывания) или воспользуйтесь комбинацией клавиш.
Перемещение по коду Пошаговый режим отладки позволяет изменить порядок выполнения строк кода. Чтобы пропустить фрагмент кода или вернуться к уже выполнявшимся строкам, перетащите желтую стрелку, расположенную на полосе слева от кода.
При подведении указателя мыши к стрелке он меняет свою форму, как показано на рис. 2.25. Перетащите желтую стрелку на строку кода, которая должна быть выполнена следующей, или разместите на этой строке курсор и выберите ко манду меню Debug Set Next Statement (Отладка Выполнить следующей).
Выполнение фрагмента кода Иногда возникает необходимость в выполнении целого фрагмента кода, на пример, цикла. Вместо того чтобы возвращаться к одним и тем же строкам не сколько раз подряд, можно указать отладчику на необходимость выполнения всего участка кода до указанной вами строки. Для этого разместите курсор на требуемой строке и воспользуйтесь комбинацией клавиш или коман дой меню Debug Run To Cursor (Отладка Выполнить до указанной строки).
Вычисление значения переменной или выражения В режиме пошагового выполнения кода можно просмотреть значение пе ременной или выражения (между прочим, средство записи кода никогда не создает переменных).
Окно Immediate Чтобы открыть окно Immediate (Быстрое выполнение) в редакторе Visual Basic, нажмите комбинацию клавиш. На рис. 2.26 приведен пример вычисления различных выражений, таких как адрес текущей выделенной ячейки, ее значение, а также имя активного рабочего листа.
Окно Immediate обычно располагается под окном просмотра программ ного кода. Размер окна Immediate можно изменить, воспользовавшись марке ром изменения размера окна (рис. 2.27).
Рис. 2.26. Пауза после выполнения каждой Рис. 2.27. Изменение размера окна строки кода позволяет узнать текущие значе Immediate ния переменных или выражений Если содержимое окна Immediate не умещается на экране, его можно про смотреть с помощью полосы прокрутки, расположенной в правой части окна.
Выражение, значение которого необходимо вычислить с помощью окна Immediate, не обязательно набирать каждый раз заново. К примеру, вычислим значение выражения Selection.Address после выполнения нескольких строк кода макроса (рис. 2.28).
Нажмите клавишу, чтобы выполнить следующую строку кода. Вме сто повторного ввода выражения, установите курсор в конец содержащей это выражение строки (рис. 2.29).
80 Часть I Первые шаги Рис. 2.28. Вычисление значения выра Рис. 2.29. Чтобы повторно вычис Чтобы повторно вычислить результат выражения, нажмите клавишу.
Новый результат (в данном случае $1:$1) ‘‘сдвинет’’ старый ($E$14:$G$14) на одну строку вниз (рис. 2.30).
Нажмите клавишу четыре раза, чтобы выполнить строку Cells.Select. Снова расположите курсор в конце строки Print Selection.Address в окне Immediate и нажмите клавишу. Новый ре зультат выражения Selection.Address сдвинет на одну строку вниз два предыдущих (рис. 2.31).
Рис. 2.30. Старый результат выра Рис. 2.31. После выделения всех жения был сдвинут новым резуль ячеек текущий адрес выбранного Выражение, указанное в окне Immediate, можно изменить. Установите курсор справа от слова Address и удалите его с помощью клавиши. Введите выражение Rows.Count и нажмите клавишу. В окне Immediate появится значение, равное числу выделенных строк (рис. 2.32).