Оглавление
Содержание
Об авторе
Благодарности
Введение
На кого рассчитана эта книга
Как организована данная книга
Часть I. Пятница. Вечер
Урок 2. Редактор VBA
Урок 3. Объектная модель Excel
Урок 4. Синтаксис и данные в языке VBA
Часть I. Пятница. Вечер. Обзор
Часть II. Суббота. Утро
Урок 6. Управляющие конструкции
Урок 7. Процедуры и модули
Урок 8. Работа со значениями даты и времени
Урок 9. Работа с текстом
Урок 10. Использование диапазонов и выделенных областей
Часть II. Суббота. Утро. Обзор
Часть III. Суббота. День
Урок 12. Программирование с помощью формул
Урок 13. Программирование с использованием встроенных функций Excel
Урок 14. Форматирование рабочего листа
Урок 15. Операции поиска и замены
Урок 16. Создание пользовательских панелей инструментов
Часть III. Суббота. День. Обзор
Часть IV. Суббота. Вечер
Урок 18. Профессиональные средства построения диаграмм
Урок 19. Использование экранных форм для создания пользовательских диалоговых окон
Урок 20. Элементы управления экранных форм
Часть IV. Суббота. Вечер. Обзор
Часть V. Воскресенье. Утро
Урок 22. Пример экранной формы
Урок 23. Обработка событий
Урок 24. Вопросы защиты данных
Урок 25. Отладка и распространение программ
Урок 26. Определение и применение пользовательских классов
Часть V. Воскресенье. Утро. Обзор
Часть VI. Воскресенье. День
Урок 28. Задачи баз данных
Урок 29. Создание надстроек
Урок 30. Добавление к приложениям электронной справочной системы
Часть VI. Воскресенье. День. Обзор
Приложение А. Ответы на вопросы в обзорах частей
Ответы на вопросы к части \
Ответы на вопросы к части \
Ответы на вопросы к части \
Ответы на вопросы к части \
Ответы на вопросы к части \
приложение Б. Описание Web-сайта
Файлы примеров с упражнениями из книги
Решение вопросов
Предметный указатель
Текст
                    Интенсивный курс
программирования
в Excel за выходные


Excel Programming Weel<end Crash Course® Peter G. Aitken WILEY wiley.com
Интенсивный курс программирования в Excel за выходные Питер Эйткен Ш ДИАЛЕКТИКА Москва ♦ Санкт-Петербург ♦ Киев 2004
ББК 32.973.26-018.2.75 ЭЗЗ УДК 681.3.07 Компьютерное издательство "Диалектика" Главный редактор С.Я. Тригуб Зав. редакцией В.Р. Гинзбург Перевод с английского ПА. МинькОу Л,П, Стрелец^ 0.В, Шпырко Под редакцией ПЛ. Минько По общим вопросам обращайтесь в издательство "Диалектика" по адресу: info@dialektika.com, http://www.dialektika.com Эйткен, Питер. ЭЗЗ Интенсивный курс программирования в Excel за выходные. : Пер. с англ. — М.: Издательский дом "Вильяме", 2004. — 432 с.: ил. — Парал. тит. англ. ISBN 5-8459-0687-3 (рус.) Возможности Microsoft Excel не ограничиваются лишь работой с таблицами данных. За знакомыми средствами обработки электронных таблиц скрывается мощный язык программирования — VBA (Visual Basic for Applications). Практически любой пользователь может научиться писать программы на языке VBA для решения самых разнообразных задач в Excel — от автоматического выполнения вычислений до создания системы для ввода данных со своими экранными формами и с возможностью проверки корректности набираемых значений. Именно этой цели и служит данная книга. Она будет полезной для всех, кто хочет научиться программировать в Excel и открыть для себя новые возможности этой программы. ББК 32.973.26-018.2.75 Все названия программных продуктов являются зарегистрированными торговыми марками соответствующих фирм. Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механические, включая фотокопирование и запись на магнитный носитель, если на это нет письменного разрешения издательства JOHN WILEY&Sons, Inc. Copyright © 2004 by Dialektika Computer Publishing. Original English language edition Copyright © 2003 by Wiley Publishing, Inc. All rights reserved including the right of reproduction in whole or in part in any fprm. This translation is published by arrangement with Wiley Publishing, Inc. ISBN 5-8459-0687-3 (рус.) © Компьютерное изд-во "Диалектика", 2004 ISBN 0-7645-4062-9 (англ.) © Wiley Publishing, Inc., 2003
Оглавление Часть I. Пятница. Вечер 24 Урок 1. Программирование в Microsoft Excel: что и как 25 Урок 2. Редактор VBA 37 Урок 3. Объектная модель Excel 51 Урок 4. Синтаксис и данные в языке VBA 65 Часть II. Суббота. Утро 86 Урок 5. Операторы 87 Урок 6. Управляющие конструкции 95 Урок 7. Процедуры и модули 105 Урок 8. Работа со значениями даты и времени 115 Урок 9. Работа с текстом 123 Урок 10. Использование диапазонов и выделенных областей 137 Часть III. Суббота. День 154 Урок 11. Работа со столбцами, строками и ячейками 155 Урок 12. Программирование с помощью формул 165 Урок 13. Программирование с использованием встроенных функций Excel 175 Урок 14. Форматирование рабочего листа 185 Урок 15. Операции поиска и замены 201 Урок 16. Создание пользовательских панелей инструментов 209 Часть IV. Суббота. Вечер 224 Урок 17. Основы построения диаграмм 225 Урок 18. Профессиональные средства построения диаграмм 241 Урок 19. Использование экранных форм для создания пользовательских диалоговых окон 253 Урок 20. Элементы управления экранных форм 265
Часть V. Воскресенье. Утро 284 Урок 21. Дополнительные средства создания экранных форм 285 Урок 22. Пример экранной формы 297 Урок 23. Обработка событий 309 Урок 24. Вопросы защиты данных 325 Урок 25. Отладка и распространение программ 335 Урок 2в. Определение и применение пользовательских классов 345 Часть VI. Воскресенье. День 360 Урок 27. Обработка ошибок выполнения программы 361 Урок 28. Задачи баз данных 371 Урок 29. Создание надстроек 383 Урок 30. Добавление к приложениям электронной справочной системы 395 Приложение А. Ответы на вопросы в обзорах частей 407 Приложение Б. Описание Web-сайта 415 Предметный указатель 416 Оглавление
Содержание Об авторе 17 Благодарности 17 Введение 17 На кого рассчитана эта книга 18 Как организована данная книга 18 Часть I. Пятница. Вечер 24 Урок 1. Программирование в Microsoft Excel: что и как 25 Преимущества программирования 26 Экономия времени 26 Уменьшение количества ошибок 26 Соблюдение стандартов 26 Взаимодействие с другими приложениями 26 Основы программирования 27 Создание инструкций 27 Обработка данных 27 Язык программирования VBA 28 Объектная модель Excel 28 Объекты 29 Компоненты и автоматизация 30 Макросы и программирование 30 Создание пользовательских приложений 31 Ваша первая программа Excel 31 Создание программы и присвоение ей имени 32 Написание кодов 33 Выполнение программы 34 Обзор 35 Проверьте себя 36 Урок 2. Редактор VBA 37 Структура создаваемых проектов 37 Окно Project Explorer 38 Импортирование и экспортирование модулей 39 Инструменты редактирования 40 Окно свойств объекта 42 Меню редактора VBA 44 Использование макросов при написании программ 44 Запись макросов 45 Ссылки на ячейки в макросах 46 Просмотр и выполнение макросов 47 Справочная система 47 Обзор 49 Проверьте себя 49
Урок 3. Объектная модель Excel 51 Свойства и методы объектов 51 Ссылки на объекты 52 Работа с коллекциями 53 Иерархия объектов 55 Объект Workbook 55 Создание и открытие рабочих книг 56 Сохранение и закрытие рабочих книг 56 Ссылки на рабочие книги 57 Вывод рабочих книг на печать 58 Отправка рабочей книги по электронной почте 59 Объект Worksheet 60 Добавление и удаление рабочих листов 61 Ссылки на рабочие листы 62 Копирование и перемещение рабочих листов 62 Обзор 63 Проверьте себя 63 Урок 4. Синтаксис и данные в языке VBA 65 Основы синтаксиса VBA 65 Комментарии 66 Форматирование кодов 67 Использование констант 67 Объявление и использование переменных 68 Числовые переменные 69 Строковые переменные 70 Переменные даты 71 Переменные-объекты 71 Переменные типа Boolean 72 Тип Variant 72 Работа с массивами 73 Статические массивы 73 Динамические массивы 75 Определенные пользователем типы 77 Перечислимые типы 77 Область видимости переменных 78 Обзор 79 Проверьте себя 80 Часть I. Пятница. Вечер. Обзор 82 Часть II. Суббота. Утро 86 Урок 5. Операторы 87 Оператор присвоения 87 Числовые операторы 88 Строковые операторы 89 Логические операторы 89 Операторы сравнения 90 Приоритет операторов 92 8 Содержание
Обзор 92 Проверьте себя 93 Урок 6. Управляющие конструкции 95 Оператор If ...Then 96 Оператор Select Case 98 Оператор Do... Loop 99 Оператор For...Next 101 Оператор For Each... Next 102 Оператор Goto 103 Обзор 103 Проверьте себя 104 Урок 7. Процедуры и модули 105 Подпрограммы 106 Аргументы процедуры 107 Вызов процедур 109 Проверка типа аргументов 110 Процедуры-функции 110 Переменные в процедурах 111 Область видимости процедуры 113 Сохранение процедур 113 Обзор 113 Проверьте себя 114 Урок 8. Работа со значениями даты и времени 115 Тип данных Date 115 Значения даты и времени 116 Вычисления со значениями даты и времени 117 Информация о дате и времени 118 Форматирование значений даты и времени 121 Обзор 122 Проверьте себя 122 Урок 9. Работа с текстом 123 Ввод и вывод текста 123 Функция MsgBox 123 Функция InputBox 125 Поиск текста 127 Сравнение строк 128 Преобразование строк 128 Функция StrConv 128 Функции LCase и UCase 129 Функция Val 129 Функция Str 130 Работа со значениями ASCH 130 Функции Asc, AscB и AscW 130 Функция Chr 133 Извлечение или изменение фрагментов строк 133 Функции Left и Right 133 Функция Mid 133 Содержание
Выражение Mid 133 Другие функции работы со строками 134 Обзор 135 Проверьте себя 135 Урок 10. Использование диапазонов и выделенных областей 137 Объект Range 137 Работа с диапазонами 138 Относительные ссылки на диапазоны ячеек 139 Другие способы получения ссылок на диапазоны 142 Работа с комментариями 144 Строка, столбец и размер диапазона 145 Считывание данных из диапазона ячеек 145 Присвоение имен диапазонам ячеек 148 Свойство Selection 149 Обзор 150 Проверьте себя 151 Часть П. Суббота. Утро. Обзор 152 Часть III. Суббота. День 154 Урок 11. Работа со столбцами, строками и ячейками 155 Обращение к ячейкам с помощью свойства Cells 155 Ссылка на все ячейки 156 Ссылка на ячейку по строке и столбцу 156 Ссылка по позиции ячейки 158 Метод SpecialCells 159 Работа со строками и столбцами 160 Добавление и удаление строк и столбцов 162 Обзор 163 Проверьте себя 163 Урок 12. Программирование с помощью формул 165 Ссылки на ячейки в формулах 165 Относительные ссылки на ячейки 166 Абсолютные ссылки на ячейки 166 Ссылки на именованные диапазоны 168 Ссылка на ячейки других рабочих листов и книг 168 Операторы 169 Математические операторы 169 Операторы сравнения 170 Логические операторы 170 Как можно избежать циклических ссылок 170 Контроль за производимыми формулой вычислениями 172 Обзор 173 Проверьте себя 174 Урок 13. Программирование с использованием встроенных функций Excel 175 Встроенные функции Excel 175 Использование функций Excel при составлении формул 176 10 Содержание
Обзор функций Excel 177 Финансовые функции 177 Функции даты и времени 179 Математические и тригонометрические функции 181 Текстовые функции 182 Объект WorksheetFunction 183 Обзор 183 Проверьте себя 184 Урок 14. Форматирование рабочего листа 185 Форматирование ячеек 185 Числовой формат 187 Форматирование шрифтов 189 Выравнивание и ориентация содержимого ячеек 190 Границы ячеек 192 Установка фона ячейки 194 Изменение размера строк и столбцов 197 Обзор 199 Проверьте себя 199 * Урок 15. Операции поиска и замены 201 Поиск данных 201 Метод Find 202 Методы FindNext и FindPrevious 203 Замена данных 205 Обзор 207 Проверьте себя 207 Урок 16. Создание пользовательских панелей инструментов 209 Создание пользовательских панелей инструментов в Excel 209 Отображение и скрытие панелей инструментов 210 Создание новой панели инструментов 211 Добавление и удаление кнопок на панели инструментов 211 Запуск программ с помощью кнопок панелей инструментов 213 Добавление пользовательских панелей инструментов к рабочим книгам 217 Скрытие и отображение панелей инструментов из программы VBA 218 Обзор 219 Проверьте себя 220 Часть III. Суббота. День. Обзор 222 Часть IV. Суббота. Вечер 224 Урок 17. Основы построения диаграмм 225 Встроенные диаграммы и листы диаграмм 225 Встроенные диаграммы 227 Листы диаграмм 227 Объект Chart 228 Определение исходных данных 228 Определение типа диаграммы 230 Содержание 11
Определение внешнего вида диаграммы 232 Отображение названия диаграммы 232 Заголовки осей диаграммы 233 Выбор шрифтов для диаграммы 235 Метод ChartWizard 237 Обзор 239 Проверьте себя 239 Урок 18. Профессиональные средства построения диаграмм 241 Названия диаграмм 241 Блокирование диаграмм 242 Объект ChartObject 243 Использование точечных диаграмм 246 Типы точечных диаграмм 249 Изменение диапазона осей 2 50 Вывод диаграмм на печать 251 Обзор 252 Проверьте себя 252 Урок 19. Использование экранных форм для создания пользовательских диалоговых окон 253 Знакомство с экранными формами 254 Основные характеристики редактора экранных форм 254 Проектирование пользовательского интерфейса 256 Настройка свойств 257 Свойства форм 257 Свойства, определяющие вид экранной формы 258 Свойства, определяющие функциональность и расположение формы 258 Методы форм 259 Отображение, использование и скрытие форм 260 Пример экранной формы 261 Обзор 264 Проверьте себя 264 Урок 20. Элементы управления экранных форм 265 Перечень элементов управления 265 Стандартные свойства элементов управления 266 Детальное описание элементов управления 267 Элемент управления CheckBox 267 Элемент управления ComboBox 267 Элемент управления CommandButton 270 Элемент управления Frame 272 Элемент управления Label 272 Элемент управления OptionButton 273 Элемент управления RefEdit 275 Элемент управления TextBox 2 76 Элемент управления ToggleButton 2 78 Обзор 278 Проверьте себя 279 Часть 1У. Суббота. Вечер. Обзор 280 12 Содержание
Часть V. Воскресенье. Утро 284 Урок 21. Дополнительные средства создания экранных форм 285 События элементов управления 285 Дополнительные приемы проектирования форм 287 Сетка формы 288 Инструменты размещения и выравнивания элементов управления 289 Перекрывающиеся элементы управления и z-порядок 292 Фокус и порядок обхода элементов формы 293 Обзор 295 Проверьте себя 296 Урок 22. Пример экранной формы 297 Планирование проекта 297 Шаг 1: создание рабочей книги 299 Шаг 2: проектирование формы 299 Шаг 3: написание кода инициализации формы 300 Шаг 4: проверка корректности почтового индекса 301 Шаг 5: добавление кодов, проверяющих корректность вводимых данных 302 Шаг 6: окончание проекта 304 Шаг 7: тестирование проекта 306 Обзор 307 Проверьте себя 307 Урок 23. Обработка событий 309 Категории событий 309 Процедуры обработки событий 310 Последовательности событий 311 Включение и отключение событий 312 События рабочих книг 312 Событие Open 313 Событие NewSheet 314 События рабочих листов 314 Событие Change 315 События приложения 317 Создание процедур обработки событий на уровне приложения 318 Событие WorkbookBef oreClose 319 Другие события 320 Событие OnTime 320 Событие ОпКеу 322 Обзор 323 Проверьте себя 324 Урок 24. Вопросы защиты данных 325 Защита рабочих книг 325 Защита рабочих листов 326 Программа VBA и защита рабочих листов 328 Защита рабочего листа с таблицей, вычисляющей суммы выплат по кредиту 329 Защита кодов VBA 329 Безопасное использование макросов 330 Содержание 13
Создание списка надежных источников 332 Удаление источника макросов из списка надежных источников 332 Использование цифровых сертификатов для подписи макросов 332 Обзор 333 Проверьте себя 334 Урок 25. Отладка и распространение программ 335 Отладка приложений 335 Что такое программные ошибки 335 Как избежать ошибок 336 Инструменты отладки программ 337 Распространение готовых приложений 342 Обзор 342 Проверьте себя 343 Урок 26. Определение и применение пользовательских классов 345 Основные сведения о классах 345 Преимущества классов 346 Создание экземпляров класса 347 Свойства классов 347 Создание процедур для работы со свойствами 348 Переменная свойства 349 Связь между свойствами и их процедурами 349 Свойства-массивы 350 Свойства, доступные только для чтения 351 Доступ к значениям свойств в кодах программы 352 Методы классов 352 Проверка корректности свойств 352 События классов 353 Повторное использование класса 353 Демонстрация класса 353 Обзор 357 Проверьте себя 357 Часть V. Воскресенье. Утро. Обзор 358 Часть VI. Воскресенье. День 360 Урок 27. Обработка ошибок выполнения программы 361 Что такое ошибка выполнения программы 361 Причины возникновения ошибок 363 Как избежать ошибок 363 Перехват ошибок 364 Объект Err 366 Код обработки ошибок 366 Откладывание обработки ошибок 367 Примеры обработки ошибок 368 Игнорирование ошибки 368 Информирование пользователя о возникшей ошибке 368 Использование ошибок в качестве инструмента программирования 369 14 Содержание
Обзор 370 Проверьте себя 370 Урок 28. Задачи баз данных 371 Базы данных в Excel 371 Основные понятия баз данных 372 Сортировка данных 373 Фильтрация данных 374 Формы для ввода данных 377 Функции баз данных 3 78 Обзор 380 Проверьте себя 381 Урок 29. Создание надстроек 383 Основные отличия надстроек от рабочих книг 383 Создание надстроек 385 Передача надстроек конечным пользователям 385 Надстройки и события 387 Функции в надстройках 387 Использование VBA для работы с надстройками 388 Демонстрация надстройки 389 Программирование функции 390 Код программы 391 Создайие панели инструментов 391 Защита кодов и сохранение надстройки 393 Тестирование надстройки 393 Обзор 394 Проверьте себя 394 Урок 30. Добавление к приложениям электронной справочной системы 395 Электронная справочная система Excel 395 Использование компонентов Excel для создания справочной системы 396 Размещение справочной информации на рабочем листе 396 Размещение справочной информации на отдельном рабочем листе 397 Размещение справки в окне экранной формы 401 Создание справочной системы с помощью внешних компонентов 401 Справка HTML 401 Получение справки через Internet 403 Обзор 404 Проверьте себя 405 Часть VI. Воскресенье. День. Обзор 406 Приложение А. Ответы на вопросы в обзорах частей 407 Ответы на вопросы к части "Пятница. Вечер " 407 Ответы на вопросы к части "Суббота. Утро" 408 Ответы на вопросы к части "Суббота. День" 409 Ответы на вопросы к части "Суббота. Вечер" 410 Ответы на вопросы к части "Воскресенье. Утро" 411 Ответы на вопросы к части "Воскресенье. День" 412 Содержание 15
приложение Б. Описание Web-сайта 415 Тест для самооценки 415 Файлы примеров с упражнениями из книги 415 Решение вопросов 415 Предметный указатель 416 16 Содержание
06 авторе Питер Эйткен (Peter G. Aitken) уже более десяти лет пишет о компьютерах и программировании. Его перу принадлежит около 30 книг и сотни статей. Назовем лишь последние его книги: Visual Basic ,NET Programming with Peter Aitken, Office XP Development with VBAy XML the Microsoft Way, Windows Script Host, Teach Yourself Visual Basic .NET Internet Programming in 21 Days, Уже несколько лет он является одним из редакторов журнала Microsoft OfficePro, где ведет популярную колонку Visual Basic column, Питер — владелец основанной в 1994 году компании PGA Consulting, специализирующейся на разработке программных приложений и Internet-проектов для коммерческих структур, научных учреждений и правительственных организаций. Благодарности Хочу поблагодарить всех сотрудников издательства Wiley, принимавших участие в создании этой книги, а особенно Джима Минатела (Jim Minatel), Марка Энохса (Mark Enochs), Кена Словака (Ken Slovak) и Сьюзан Гоббс (Susan Hobbs). Введение Microsoft Excel является мощной программой электронных таблиц; более того, это наиболее популярная на сегодняшний день программа электронных таблиц. Однако возможности Excel не ограничиваются лишь работой с таблицами данных. Многие пользователи, например, не знают о том, что Excel является также полноценной платформой для разработки пользовательских приложений. За знакомыми средствами обработки электронных таблиц скрывается мощный язык программирования — VBA (Visual Basic for Applications). Если вам уже приходилось записывать и воспроизводить макросы Excel, значит, вы уже имеете опыт использования VBA — хотя вы могли и не подозревать об этом. Программирование на языке VBA не ограничивается записью макросов. Практически любой пользователь может научиться писать программы на языке VBA, которые решают самые разнообразные задачи в Excel — от автоматического выполнения вычислений до создания системы для ввода данных со своими экранными формами и с возможностью проверки корректности набираемых значений. К сожалению, многие пользователи пренебрегают возможностями программирования в Excel, поскольку им этот процесс кажется слишком сложным. Возникают трудности с практическими руководствами, которые помогли бы освоить искусство написания программ. Поскольку возможности программирования в Excel действительно довольно широки, не удивительно, что для их освоения придется приложить некоторые усилия, однако на самом деле практически любой, кто хоть немного знаком с компьютерными технологиями, сможет осилить программирование в Excel. А сделать это поможет книга, которую вы сейчас держите в руках.
На кого рассчитана эта книга Настоящая книга будет полезной для всех, кто хочет научиться программировать в Excel и открыть для себя новые возможности. Может быть, вы хотели бы писать программы исключительно для себя или же создавать приложения, которые смогли бы использовать ваши сотрудники. В любом случае эта книга для вас. Она написана максимально простым и доступным языком. Вам не обязательно иметь какие-то начальные знания по программированию или опыт написания собственных программ. Разумеется, если такие знания или опыт у вас уже есть, они не помешают, если — нет, можете ни о чем не беспокоиться и смело приступать к изучению представленного далее материала. Как организована данная книга Настоящая книга состоит из 30 уроков, каждый из которых построен таким образом, чтобы на его освоение уходило не более получаса. В конце каждого урока представлен краткий обзор пройденного материала и перечень вопросов для самоконтроля. Все уроки разделены на шесть частей, в основном, с той целью, чтобы помочь вам рационально распределить по времени весь процесс обучения. В конце каждой части вы найдете дополнительный перечень вопросов, имеющих отношение к темам уроков, представленных в этой части. Ответы на эти вопросы собраны в приложении А. Часть L Пятница. Вечер Первый урок является своеобразным введением в программирование в Excel. В нем представлен обзор всех преимуществ работы в данной программе, описаны базовые концепции программирования. Во втором уроке речь пойдет о том, как работать с редактором VBA. Этот редактор является частью инсталляционного пакета Excel, его используют для создания, тестирования и запуска программ. В уроке 3 рассказывается об объектной модели Excel. Так называется набор инструментов приложения Excel, которые вы можете использовать в своих программах. В уроке 4 вы ознакомитесь с языком программирования VBA— вашим основным инструментом для написания программ. Часть П. Суббота. Утро Уроки 5-9 посвящены изучению языка VBA. Чтобы писать программы на этом языке, необходимо хорошо знать его элементы и синтаксис их использования. В частности, вы должны быть знакомы с операторами, управляющими конструкциями, процедурами, модулями, а также с процессом выполнения обработки значений даты, времени, текстовой информации. В последнем, десятом, уроке этой части показано, как работать с диапазонами и выделенными областями Excel. Часть Ш. Суббота. День в уроках 11-14 рассмотрены вопросы, связанные с управлением Excel посредством кодов VBA. Вы узнаете, как работать со столбцами, строками и ячейками, как в программах использовать специальные формулы и встроенные функции, как выполнять форматирование рабочих листов. В последних двух 18 Введение
уроках речь идет о таких возможностях, как поиск и замена значении и создание пользовательских панелей инструментов. Часть IV. Суббота. Вечер Уроки 17 и 18 посвящены вопросам использования в программах возможностей построения диаграмм, реализованных в Excel. Из материала уроков 19 и 20 вы узнаете, как создавать диалоговые окна для своих программ с использованием экранных форм Excel. Часть V. Воскресенье. Утро Уроками 21 и 22 завершается тема, посвященная экранным формам, причем будет продемонстрирован полностью рабочий пример. В уроках 23-26 рассматриваются вопросы, связанные с событиями Excel, с обеспечением безопасности, отладкой и распространением программ и с созданием пользовательских классов. Часть VI. Воскресенье. День в уроках последней части рассматриваются такие темы, как ошибки выполнения программы, работа с базами данных, создание надстроек и электронной справочной системы. Желательно изучать уроки в том порядке, в котором они представлены в книге. Советуем вначале изучить материал уроков с первого по девятый и лишь затем двигаться дальше. Web'Caum данной книги На Web-сайте, посвященном этой книге, вы найдете листинги кодов программ, используемых в качестве примеров, а также объемный тест для самоконтроля, состоящий из более чем 80 вопросов. Адрес этого сайта: www. wiley. com/ compbooks/aitken. Используемые в этой книге соглашения Как уже отмечалось ранее, каждый урок составлен таким образом, чтобы на его освоение уходило около 30 минут. Однако гнаться за временем нет никакой необходимости, поэтому не беспокойтесь, если материал каких-то уроков вы будете изучать дольше. Гораздо важнее — качество полученных вами знаний. Представленные ниже пиктограммы будут обозначать, какая часть урока уже пройдена. Следующими пиктограммами будут обозначены некоторые вводные фрагменты текста. Осталось Осталось 30 минут 20 минут 10 минут Готово! Такой пиктограммой обозначаются важные сведения, на которые следует обратить внимание. Так будут представлены советы о том, как быстрее и проще выполнить ту или иную задачу. Введение 19
-й в абзацах, помеченных такой пиктограммой, речь пойдет о том, чего делать ни в коем случае нельзя. Так отмечаются ссылки на другие уроки этой книги, в которых рассматриваются подобные вопросы. Ждем ваших отзывов! Вы, уважаемый читатель, и есть главный критик и комментатор этой книги. Мы ценим ваше мнение и хотим знать, что было сделано нами правильно, что можно было сделать лучше и что еще вы хотели бы увидеть изданным нами. Нам интересно услышать и любые другие замечания, которые вам хотелось бы высказать в наш адрес. Мы ждем ваших комментариев и надеемся на них. Вы можете прислать нам бумажное или электронное письмо, либо просто посетить наш Web-сервер и оставить свои замечания там. Одним словом, любым удобным для вас способом дайте нам знать, нравится или нет вам эта книга, а также выскажите свое мнение о том, как сделать наши книги более интересными для вас. Посылая письмо или сообщение, не забудьте указать название книги и ее авторов, а также ваш обратный адрес. Мы внимательно ознакомимся с вашим мнением и обязательно учтем его при отборе и подготовке к изданию последующих книг. Наши координаты: E-mail: info@dialektika.com WWW: http://www.dialektika.com Информация для писем: из России: 115419, Москва, а/я 783 из Украины: 03150, Киев, а/я 152 20 Введение
\?(ПяП1 ^« 00^ свиь
- aiaiff^m-^^Mjf-if^, Урок1. Программирование в Microsoft Excel: что и как Урйн 2. Редактор VBA Урок 3. Объектная модель Excel Урак 4. Синтаксис и данные в языке VBA
ЧАСТЬ Пятницей Вечер Урок 1. Программирована ш Microsoft Excel: что и как Урок 2 Редактор VJ Урок 3^
УРОК Программирование в Microsoft Excel: что и как Содержание урока ^ Преимущества программирования в Excel ^ Основы программирования ^ Объектная модель Excel ^ Макросы ^ Создание пользовательских приложений ^ Ваша первая программа Excel Большинство пользователей вполне обоснованно считают Excel программой для работы с электронными таблицами, и она действительно является таковой. Вообще, Excel — довольно мощное и сложное приложение, предоставляющее в распоряжение своих пользователей огромный набор средств и инструментов для обработки, анализа и отображения данных. Как правило. Excel используют именно в этих целях — и многим пользователям, по правде говоря, ничего другого от этой программы и не требуется. Однако в действительности Excel — это нечто большее, чем просто программа для работы с таблицами данных. Она включает в себя также мощный язык программирования, позволяющий управлять практически всеми аспектами ее функционирования. Все, что можно выполнить с помощью клавиатуры и мыши, вы вправе также повторить путем написания соответствующей программы. Возможность программирования превращает Excel в гибкий и мощный инструмент, который опытные пользователи могут использовать для решения самых разнообразных задач обработки и анализа данных. В этом уроке рассматриваются преимущества программирования в Excel, а также описываются используемые технологии.
преимущества программирования Благодаря программированию, пользователи Excel получают ряд существенных преимуществ. Как отмечалось раннее, далеко не для всех пользователей эти преимущества могут оказаться столь необходимыми, однако зачастую они могут оказаться полезными. Экономия времени Почти все функции создаваемых в Excel программы можно выполнить с помощью клавиатуры или мыши. Однако программы, как правило, выполняются быстрее. Даже опытный пользователь, которому хорошо известны все способы решения той или иной задачи, не сможет сравниться в быстродействии с работающей программой. Разница во времени может быть весьма существенной — то, что человек будет делать более часа, программа выполнит всего за несколько секунд. Уменьшение количества ошибок Подобно тому, как даже самые опытные машинистки время от времени нажимают не на те клавиши, так и человек, профессионально владеющий программой, иногда щелкает не на той кнопке или выбирает не тот пункт меню. Программы подобных ошибок не допускают. Все их команды выполняются точно и именно в тот момент, когда это необходимо. Конечно, сами программы могут содержать в себе ошибки. Excel выполняет запрограммированную последовательность команд, и если какие-то команды окажутся некорректными, полученный результат будет далек от ожидаемого. Тема обнаружения и исправления ошибок в программе очень важна, и ее рассмотрению посвящено несколько уроков настоящей книги. Соблюдение стандартов Во многих организациях соблюдение стандартов в области обработки данных является важным условием для повышения производительности труда. Например, от продавцов может требоваться предоставление еженедельного отчета. Если формат и структура всех отчетов будут одинаковы, процесс обработки данных с целью получения итогового отчета несложно автоматизировать. С другой стороны, даже незначительное отклонение от принятой формы предоставления отчета может стать причиной возникновения серьезных сбоев на этапе проведения итоговых вычислений. Если же создать программу для ввода данных в отчеты, проблем с нарушением стандартной формы отчетов не возникнет. Взаимодействие с другими приложениями Работа на всегда выполняется только лишь в Excel — в этой программе предусмотрены также возможности обмена данными и взаимодействия с другими приложениями. Особенно это касается приложений, входящих в пакет Microsoft Office. Например, программа, написанная в Excel, может использовать Outlook для создания и отправки сообщений электронной почты, которые содержат данные, взятые из электронной таблицы. Для организации такого рода взаимодействия не обязательно создавать соответствующие программы, однако некоторые задачи проще и эффективнее решать именно путем программирования. 26 Часть L Пятница, вечер
Основы программирования Ничего сверхъестественного в процессе программирование нет. Вероятно, многие читатели этой книги уже имеют определенный опыт создания компьютерных программ. Если же вы не принадлежите к их числу, ознакомьтесь с материалом этого раздела и узнайте о том, что такое программирование и для чего оно используется. Создание инструкций Суть программирования состоит в написании набора инструкций, определяющих последовательность действий, которые должен выполнить компьютер. В повседневной жизни примером таких действий может быть указание помощнику сделать копии документов. Компьютерная программа представляет собой то же самое — вы должны указать компьютеру, что он должен сделать. Основное отличие состоит в том, что компьютеры не умеют думать, а потому требуют детального описания всех необходимых действий. Перечень точных инструкций и является ядром любой программы. Некоторые инструкции создаются для обработки данных. Их уровень сложности может быть совершенно разным — от суммирования двух чисел до создания сводных диаграмм. Другие инструкции управляют ходом выполнения программы. Например, можно запрограммировать выполнение различных действий в разные дни недели. Кроме того, существуют также инструкции, описывающие способы взаимодействия программы с ее пользователями. Такие инструкции, например, могут определять реакцию программы на выбор конкретного пункта меню или конкретной опции диалогового окна. Обработка данных Любая компьютерная программа оперирует данными. Эти данные могут быть текстовыми, числовыми или графическими, но вы пока можете не обращать внимания на эти детали. Наиболее важный аспект программирования заключается в обработке данных, используемых программой. Необходимо определить место хранения этих данных, а также способы доступа к ним. С этой точки зрения, все данные можно разделить на две категории. • Данные, сохраненные за пределами программы (внешние данные). В большинстве случаев это данные, хранящиеся в ячейках рабочих листов Excel. Программе не потребуется создавать место для хранения таких данных, хотя они всегда остаются доступными для чтения и записи. • Данные, хранимые в самой программе (внутренние данные). Программа должна выделять место для хранения данных, которые не могут быть расположены в каком-нибудь другом месте. Для хранения внутренних данных используются переменные. Как будет показано в последующих уроках, в программах Excel предусмотрены широкие возможности для хранения внутренних данных. Возможности обработки данных, доступные при написании программ Excel, действительно впечатляют. В распоряжение программистов предоставляются различные типы данных, специально предусмотренные для хранения самой разнообразной информации. Подробнее об этих типах данных будет рассказано в следующих уроках настоящей книги. Урок 1. Программирование в Microsoft Excel: что и как 27
Язык программирования VBA Программы Excel пишутся на языке VBA (Visual Basic for Applications). Он является одним из двух основных компонентов, на которых строится программирование в Excel. В свою очередь, язык VBA основывается на языке программирования Microsoft Visual Basic. На VBA пишутся программы для пользовательских приложений, в частности, для тех, которые входят в состав пакета Microsoft Office (Excel, Word, Access, PowerPoint и Outlook). Язык VBA сравнительно простой в изучении, однако этот факт нисколько не уменьшает его возможностей. Задача написания программ на языке VBA упрощается благодаря использованию редактора VBA, являющегося частью инсталляционного пакета Excel. Чтобы открыть редактор VBA, в Excel нажмите клавиши <Alt4-Fll> либо выберите команду Сервис^=>Макрос'=^Редактор Visual Basic. Окно редактора показано на рис. 1.1. В большом чистом окне набираются коды VBA создаваемой программы. Другие элементы редактора являются инструментами организации, выполнения и отладки программ. Способы применения этих элементов рассматриваются в последующих уроках настоящей книги. Рис. 1.1. Редактор VBA Объектная модель Excel Объектная модель Excel является вторым важным компонентом программирования на языке VBA. Для лучшего понимания объектной модели необходимо ознакомиться с некоторой дополнительной информацией о внутреннем устройстве Осталось о ri i 20 минут таких приложении, как Excel. 28 Часть I. Пятница. Вечер
Объекты Методы программирования совершенствуются на протяжении уже многих лет, программы становятся все более мош;ными и, соответственно, более сложными. Чем сложнее программа, тем выше вероятность возникновения в ее кодах ошибок и тем больше требуется времени на их поиск и устранение. Как показывает опыт, львиная доля всех ошибок возникает именно вследствие непредусмотренного взаимодействия разных компонентов программы. Сведение количества таких взаимодействий к минимуму способно существенно уменьшить количество ошибок, возникающих в процессе написания программ. Объекты и классы При обсуждении вопросов, связанных с объектно-ориентированным программированием, часто употребляют термины "объект" и "класс" (причем иногда их используют как взаимозаменяемые понятия). Однако классы и объекты не являются одним и тем же. Класс — это описание или определение, тогда как объект— реализация такого определения, называемая также экземпляром. Например, можно провести такую аналогию: чертежи автомобиля являются классом, а сам автомобиль, собранный по этим чертежам,^ объектом. Вы можете создать довольно большое количество объектов, принадлежащих к одному и тому же классу. С другой стороны, программисты понимают, что им приходится снова и снова писать коды, предназначенные для решения однотипных задач. Например, большинство программ, написанных под Windows, имеют набор стандартных меню, и программисты при разработке очередной программы должны каждый раз набирать одни и те же коды для создания этих меню. Эти и другие факторы стимулировали разработку и создание новой технологии написания программ, названной объектно-ориентированным программированием (ООП). Объектно-ориентированная программа выглядит как совокупность взаимосвязанных разделов, или модулей, каждый из которых используется для решения собственных задач. Одни модули управляют компонентами программного интерфейса: меню, кнопками и диалоговыми окнами, другие — предназначены для управления данными, с которыми работает программа (в Excel, например, это рабочие книги, рабочие листы и ячейки). Каждый из этих модулей является объектом. ООП имеет целый ряд преимуществ по сравнению с традиционными методами программирования. В частности, к числу таких преимуществ относятся следующие. • Уменьшение количества ошибок. Объекты являются самодостаточными логическими единицами, максимально изолированными друг от друга. Взаимодействие объектов с другими компонентами программы строго контролируется, что исключает возникновение ряда ошибок. • Повторное использование кодов. Сама природа объектов (а точнее, классов) подразумевает их повторное использование, причем область такого повторного использования не ограничена рамками одной конкретной программы. Excel, как и другие приложения пакета Microsoft Office, создана с использованием технологии ООП. Таким образом. Excel состоит из большого количества объектов, действующих совместно для обеспечения всего объема функциональных возможностей данной программы. В следующем подразделе будет рассмотрено влияние этого факта на особенности программирования в Excel. Урок 1. Программирование в Microsoft Excel: что и как 29
Компоненты и автоматизация Объекты, из которых состоит Excel, написаны таким образом, чтобы их можно было использовать из других' программ. (Зогласно компьютерной терминологии, эти объекты называются открытыми (exposed). Данное обстоятельство является элементом технологии СОМ (Component Object Model), на основе которой создана как сама операционная система Windows, так и большинство приложений, работающих под ее управлением. Термином компоненты^ или СОМ-компоненты, обозначаются открытые для других приложений объекты; именно поэтому объекты, открытые в Excel, также иногда называют компонентами. Обратите внимание, что в одном компоненте могут быть открытыми сразу несколько классов. Каким образом программист может использовать открытые компоненты? Вам поможет другая СОМ-технология, называемая автоматизацией (ранее она была известна под названием ОЬЕ-автоматизация). Данная технология позволяет внешней программе обращаться к открытым компонентам и управлять ими. Благодаря автоматизации компоненты разных приложений могут также взаимодействовать друг с другом. Например, с ее помощью можно внедрить рабочий лист Excel в документ Word. Аналогичным образом, программа,^ написанная на языке VBA, зачастую использует компоненты Excel. Другие языки программирования, например, C++ или Java, также поддерживают технологию автоматизации, однако этот вопрос не относится к теме настоящей книги. Компоненты СОМ, которые могут использоваться вашими программами VBA, существуют в виде файлов на жестком диске и являются установленными на вашем компьютере в качестве составных элементов пакета Office или приложения Excel. Компоненты используются двумя способами. • Приложение-клиент управляет классами, открытыми из других компонентов. • Приложение-сервер открывает свои классы для других компонентов. Компонент автоматизации может выступать в роли сервера, клиента или в роли сервера и клиента одновременно. Если вы программируете в Excel, VBA выступает в роли клиента, а компоненты Excel — в роли сервера. Некоторые компоненты Excel, в свою очередь, являются клиентами и управляют другими компонентами. Благодаря указанному построению, программист Excel получает в свое распоряжение не только такой мощный язык программирования как VBA, но также и доступ ко всем компонентам приложения Excel. Это чрезвычайно эффективное сочетание: Excel можно сравнить с хорошо обученным и умелым слугой, а язык VBA подобен господину, отдающему точные приказания Excel. Совокупность всех открытых компонентов Excel называют объектной моделью Excel, Более детально об объектной модели Excel будет рассказано далее в этой книге, в частности, в уроке 3. Макросы и программирование Если вам уже приходилось использовать такую возможность Excel, как создание макросов, значит у вас есть уже некоторый опыт программирования в Excel. Макрос представляет собой запись последовательности действий пользователя, которая может быть повторно воспроизведена неограниченное количество раз. Данная возможность позволяет экономить время, поскольку избавляет вас от необходимости вручную повторять одну и ту же последовательность действий. Чтобы записать макрос, выберите команду Сервис'=>Макрос'=>Начать запись. 30 Часть 1. Пятница. Вечер
Все действия, выполняемые пользователем во время записи макроса, преобразуются в соответствующие команды VBA, которые после окончания записи сохраняются для последующего воспроизведения. Возможность записи макросов может оказаться удобным инструментом для программистов Excel. Ш Подробнее о макросах будет рассказано в уроке 2. Создание пользовательских приложений При создании собственной программы Excel, как и при написании любой другой программы, прежде всего следует продумать ее структуру. Процесс планирования очень важен. Для простого проекта эта процедура может занять всего несколько минут, тогда как на разработку плана сложного приложения может уйти несколько дней. В любом случае, предварительное планирование позволяет избежать многих ошибок при написании программы. Прежде чем начать, четко определите круг задач, которые должны решаться будущей программой. Результатом непонимания между заказчиком и программистом может стать возникновение ряда проблем. Написание самой изящной программы будет пустой тратой времени, если эта программа не выполняет того, что необходимо заказчику! Требования к программе следует определить точно и довольно подробно. Согласовав все детали, вы сможете приступать непосредственно к планированию программы. Для программ, решающих простые задачи, этот этап прост, так как обычно существует какой-то один наиболее очевидный способ получения требуемого результата. Чем сложнее задача, тем больше вариантов ее решения. Сколько понадобится рабочих листов и рабочих книг? Необходимы ли экранные формы? Какую функциональную нагрузку возложить на отдельные фрагменты программы? Потребуется ли определять новые классы? Разумеется, созданный на данном этапе план программы вряд ли будет окончательным: в дальнейшем вам наверняка придется его модифицировать по мере необходимости. Но все же наличие плана, пускай и не самого совершенного, способно значительно упростить дальнейший процесс написания программы. Ф Ваша первая программа Excel Чтобы дать вам общее представление о программировании в Excel, в этом раз- 1лминут деле мы опишем процесс создания небольшой программы, иллюстрирующей основные принципы. На данном этапе не обязательно вникать во все подробности — достаточно рассмотреть приведенный пример, чтобы подготовиться к изучению нового материала последующих уроков. Представленная программа довольно проста, она была создана для решения следующих задач. 1. Начинается работа программы с чистого рабочего листа. 2. Пользователю предоставляется возможность ввести "числовые значения в определенные ячейки. 3. Введенные пользователем числа суммируются. 4. Рабочая книга сохраняется на диске. В следующих подразделах описан процесс создания и запуска такой программы. Урок 1. Программирование в Microsoft Excel: что и как 31
Создание программы и присвоение ей имени Чтобы создать базовую структуру программы и присвоить новой программе название, выполните следующее. 1. Запустите Excel. Как правило, работа приложения начинается с создания трех чистых рабочих листов. 2. Нажмите клавиши <Alt+Fll>, чтобы открыть редактор VBA. 3. В левой верхней части редактора расположено окно Project - VBAProject со списком открытых рабочих листов: Лист1, Лист2 и ЛистЗ (рис. 1.2). Дважды щелкните на пункте Лист 1, чтобы открыть окно редактирования кодов. 4. Выберите команду Insert":^Procedure (Вставить==>Процедуру), после чего на экране появится диалоговое окно Add Procedure (Добавление процедуры). Укажите название программы, например МояПерваяПрограмма. Название может состоять из букв и цифр, но не должно содержать в себе пробелов (иногда для разделения слов используют символ подчеркивания). 5. Щелкните на кнопке ОК. Редактор вставит первую и последнюю строки новой процедуры (программы) в окно редактирования кодов (рис. 1.3). На этом этапе создается пустой шаблон программы. Далее можно добавлять коды, которые будут обеспечивать ее функциональность. Программы и процедуры Программы и процедуры — это не одно }л то же. Некоторые простые программы, наподобие создаваемой в этом уроке, могут состоять из одной процедуры. Однако более сложные программы включают большое множество процедур. Eite &iit )liew Insert fcrmat jjebug Bun lools А<М-Ы ШпОам tielp CSS Сз ^ VBAProject (Книга!) ~ v:^ Microsoft Excel Objects i] Лиа2 (ЛИСТ2) в ЛистЗ (ЛиаЗ) Л«1ст1 V.'crfcsheet A»h8betk:[oae90fte«4| |Листi DlspldyPageBreaks Felse iDisptayWghtToLeft Felse JEnableAutoHtter False lEnabJeCatculaticn True jEnabteOutllnlng False inablePivotTable Fetse lEnableSetecuon 0 - xft4oResincttons jMame Лист! SaollVee IStarxlardWfcJth 8,11 [Visible -1 - xlSheetvistble Puc. 1^. Дважды щелкните на пункте Лист1, чтобы открыть окно редактирования кодов 32 Часть 1. Пятница. Вечер
Рис, 1.3, Редактор VBA добавляет первую и последнюю строки кодов программы Написание кодов Для данной программы необходимо написать коды, которые выполняли бы такую последовательность действий. 1. Переместить курсор в ячейку В2. 2. Принять от пользователя числовое значение и поместить его в текущую ячейку. 3. Переместить курсор в ячейку ВЗ. 4. Повторять перемещение курсора и ввод чисел до заполнения ячеек с В2 по В6. 5. Поместить в ячейку В7 формулу, суммирующую введенные пользователем числовые значения. 6. Сохранить рабочую книгу на диске. Код программы использует несколько элементов VBA и объектную модель Excel. Прежде чем приступить к написанию программы, необходимо рассмотреть некоторые общие идеи. Range("В2").Select Этот фрагмент кода использует объект Range для перемещения курсора в указанную ячейку, в нашем случае — В2. ActiveCell.Value = InputBox("Введите значение") Приведенный выше фрагмент кода состоит из двух частей. Функция Input- Box отображает диалоговое окно с адресованным пользователю предложением ввести данные, которое сопровождается надписью "Введите значение". Объект ActiveCell принимает введенное значение и помещает его в активную ячейку (ту, в которой сейчас находится курсор). Два указанных выше фрагмента кода повторяются пять раз, чтобы вы имели возможность ввести значения в ячейки с В2 по В6. Когда курсор переместится в ячейку В7, будет выполнен следующий код: ActiveCell.Formula = "=СУММ(В2:В6)" Обратите внимание, что при этом опять используется объект ActiveCell, но теперь с целью помещения в активную ячейку формулы. В этой формуле посредством использования встроенной в Excel функции СУММ вычисляется сумма значений, сохраненных в ячейках В2:В6. ActiveWorkbook.SaveAs Filename = "МояПерваяПрограмма.х1з" Урок 1. Программирование в Microsoft Excel: что и как 33
Эта последняя строка кода использует объект ActiveWorkbook для сохранения рабочей книги на диске в файле с указанным именем. Теперь, имея общее представление о том, как работает создаваемая программа, можно набрать ее коды в редакторе VBA. Листинг кодов программы приведен ниже. Обратите внимание, что редактор уже добавил первую и последнюю строки программы, и теперь вд,м необходимо набрать лишь оставшуюся часть кодов. Будьте особенно внимательны при наборе кодов, поскольку даже самая незначительная ошибка не позволит программе быть выполненной. Public Sub МояПерваяПрограмма() Range("В2").Select ActiveCel1.Value = InputBox("Введите значение") Range("ВЗ").Select ActiveCell.Value = InputBox("Введите значение") Range("В4").Select ActiveCell.Value = InputBox("Введите значение") Range("В5").Select ActiveCell.Value = InputBox("Введите значение") Range("Вб").Select ActiveCell.Value = InputBox("Введите значение") Range("В7").Select ActiveCell.Formula = "=СУММ(В2:B6)" ActiveWorkbook.SaveAs Filename := "МояПерваяПрограмма.xls" End Sub Выполнение программы Набрав коды, запустите программу на выполнение. 1. Воспользуйтесь панелью задач Windows, чтобы перейти к окну Excel. 2. Нажмите клавиши <Alt+F8> — в результате будет открыто диалоговое окно Макрос (рис. 1.4). Его можно также отобразить путем выбора команды Сервис'=>Макрос|=>Ма1фосы. Рис, 1Л, Выберите программу» которую необходимо выполнить 34 Часть!. Пятни!^. Вечер
3. в диалоговом окне Макросы выберите пункт Лист1 .МояПерваяПрограмма (из этого названия следует, что программа хранится в рабочем листе Лист1), после чего щелкните на кнопке Выполнить. 4. Программа предложит ввести новое значение, повторив это действие пять раз. По окончании работы программы ваш рабочий лист будет выглядеть приблизительно так, как показано на рис. 1.5 (разумеется, в ячейках будут отображаться введенные вами значения). Эта программа, несмотря на свою простоту, наглядно демонстрирует такие преимущества программирования в Excel, как точность и согласованность выполняемых действий, в частности, программа обеспечивает: • ввод данных в требуемые ячейки; • использование правильной формулы; • сохранение рабочей книги в файле с корректно указанным названием. Таким образом, имея общее представление об основных принципах программирования в Excel, можно переходить к следующему ЗФОку и приступать к изучению деталей. 11|1ям1диш111ра1ррш1и liljll|MJ,i,UiHUIHHI. Ф4С Ш] ^айп Прабка. Э«д Водвка^^ ,Фо|^ет ,,_^_. _ __. В7 *^ ^ > .^у =СУММ(В2:В6) 2. 3 4 5* 6 1о) Рис. 1.5. Вид рабочего листа после окончания работы программы 3 Готово! Обзор в этом уроке изложены основы программирования в Excel. В частности, были рассмотрены следующие вопросы. • Программирование в Excel предоставляет целый ряд преимуществ. • Программы Excel пишутся на языке программирования VBA. • Функциональные возможности Excel доступны в V&A в качестве компонентов. • Совокупность открытых компонентов Excel составляет объектную модель Excel. • Создание макросов Excel является упрощенным способом программирования. • Предварительное планирование является важным этапом разработки программы. гУрок 1. Программирование в Microsoft Excel: что и как 35
проверьте себя 1. Назовите преимущества программирования в Excel. (См. раздел "Преимущества программирования".) 2. Из каких частей состоит программа? (См. раздел "Основы программирования*'.) 3. В чем заключается различие между классами и объектами? (См. раздел "Объектная модель Excel".) 4. Каким образом программа получает доступ к функциональным возможностям Excel? (См. раздел "Объектная модель Excel".) 5. Что такое макросы? (См. раздел "Макросы и программирование".) 6. Что должен сделать программист, перед тем как приступить к написанию кодов программы? (См. раздел "Создание пользовательских приложений".) 36 Часть L Пятница. Вечер
УРОК Редактор VBA Содержание урока ^ Структура проектов VBA ^ Использование окна Project Explorer ^ Использование кодов в других проектах ^ Применение инструментов редактирования ^ Работа с окном Property Window ^ Применение макросов при написании программ ^ Использование справочной системы Ф Редактор VBA является средством написания и редактирования кодов создаваемых программ. Кроме того, он позволяет также запускать программы и производить их отладку, обеспечивать защиту кодов от несанкционированного доступа. Осталось isr л. 30 минут разрабатывать экранные формы для ввода данных и пользоваться электронной справочной системой. Некоторые функциональные возможности редактора рассматриваются в других главах этой книги, а именно: защита кодов программы (урок 24), отладка программ (урок 25), создание экранных форм (уроки с 19 по 21). Структура создаваемых проектов Базовой структурной единицей кодов VBA является процедура (procedure, иногда subprocedure), состоящая из следующих частей. • Начальная строка содержит ключевое слово Sub со следующими за ним именем процедуры и парой круглых скобок. • Завершающая строка, содержащая ключевые слова End Sub.
• Одна или несколько строк кода, расположенные между открывающей и завершающей строками. Более подробно процедуры рассматриваются в уроке 7. На данном этапе достаточно знать, что процедуры являются минимальными структурными единицами кодов программы VBA. Когда вы записываете макрос (детальнее об этом будет рассказано ниже), он сохраняется в виде процедуры. Имя этой процедуры совпадает с названием, которое вы даете макросу. Процедуры VBA сохраняются в рабочих книгах. Вся совокупность кодов, сохраненных в одной рабочей книге, образует проект VBA (VBA project) VBA. Способ организации кодов в рамках проекта вначале может показаться слишком сложным, однако в процессе ознакомления с этой организацией вы поймете, что она обеспечивает достаточно высокую гибкость и удобство в использовании. Каждый проект состоит из следующих компонентов. • Набор объектов программы Microsoft Excel, включающий по одному объекту для каждого рабочего листа данной рабочей книги, плюс один специальный объект, имеющий название ЭтаКнига. Эти компоненты всегда присутствуют в проекте. • Один или несколько модулей. • Одна или несколько форм. • Один и несколько модулей классов. Модули, формы и модули классов присутствуют в проекте только в тех случаях, когда они специально добавляются пользователем (подробнее об этом будет рассказано в следующих главах). Любой из компонентов может содержать в себе коды. Решая, в каком месте расположить коды программы, следует помнить о том, что формы и модули классов используются для специальных целей. Итак, в вашем распоряжении имеются следующие варианты. • Рабочий лист. Добавьте коды к рабочему листу, если коды должны быть непосредственно связаны с этим листом. • Объект ЭтаКнига. Расположите коды в объекте ЭтаКнига, если они относятся ко всему проекту (к данной рабочей книге). • В модуле. Разместите коды здесь, если нет каких-либо веских причин располагать их в другом месте. Более подробно о работе с модулями классов и экранными формами рассказывается в уроках 19-21, а также в уроке 26. Место расположения кодов не принципиально, поскольку система разработана таким образом, что вы можете обращаться к кодам независимо от того, где он находится. Кроме того, коды программы без труда можно перемещать с одного места в другое. Если у вас возникли какие-то сомнения, создайте модуль (о том, как это сделать, рассказывается далее в этом уроке) и там расположите свои коды. Окно Project Explorer Окно Project Explorer, находящееся в левом верхнем углу редактора VBA, отображает структуру открытых в данный момент проектов VBA (рис. 2.1). Информация 38 Часть L Пятница. Вечер
представлена в иерархическом виде. Узлы верхнего уровня этой иерархии соответствуют открытым проектам (рабочим книгам). Уровнем ниже расположены узлы объектов Excel, а также (если эти элементы были добавлены к проекту) узлы модулей, экранных форм и модули классов. Чтобы открыть окно редактирования кодов какого-то компонента, дважды щелкните на его названии. Если требуется добавить новый модуль, выберите команду Insert»^Module (Вставить«^Модуль). Новым модулям по умолчанию присваиваются стандартные именаModulel, Module2 и т.д. Ш Ш Microsoft Excel Objects В -Ш Forms Ё1 UserForml ^■Ш Modutes 4^ Modufel Ц VBAProject (Кнт-аг) &-Ш Microsoft ЕхсеГ Objects j ® Лист! (Лиа1) ; е1Лисг2(Лисг2) \- в ЛистЗ (ЛисгЗ) ^ ЭтаКиига ® Forms = В! UserForml Рис. 2.1. Компоненты проекта представлены в окне Project Explorer В верхней части окна Project Explorer прямо под строкой заголовка расположены три кнопки, назначение которых описано ниже. • View Code (Просмотр кода). Отображает код текущего объекта. • View Object (Просмотр объекта). Отображает средства визуального проектирования текущего объекта. Данная возможность доступна только для экранных форм. • Toggle Folders (Переключение папок). Переключает режим отображения элементов в окне Project Explorer (функциональность элементов не зависит от выбранного режима отображения). Многие элементы редактора VBA имеют свои собственные контекстные меню, открываемые щелчком правой кнопкой мыши на данном элементе. В этих меню содержится список команд, имеющих отношение к данному объекту. Импортирование и экспортирование модулей Как уже отмечалось выше, каждый проект VBA сохраняется в том же файле, в котором хранится соответствующая рабочая книга. Отдельные модули, таким образом, не могут храниться как отдельные файлы. Однако вы можете экспортировать модуль в отдельный файл и затем импортировать его из этого файла в другие йроекты VBA. Такая возможность доступна для модулей, экранных форм, модулей классов и объектов Microsoft Excel. В результате вы сможете переносить 0рок 2. Редактор VBA 39
коды программы из одного проекта в другой и даже обмениваться кодами с другими программистами. Нет необходимости набирать заново одни и те же коды. Если вы однажды создали код VBA, предназначенный для решения определенной задачи (например, выполнения финансовых расчетов), то можете повторно использовать его в разных проектах. Чтобы экспортировать модуль, выполните следующее. 1. Щелкните правой кнопкой мыши на требуемом модуле в окне Project Explorer и в отрывшемся меню выберите пункт Export File (Экспортировать файл). На экране будет отображено диалоговое окно Export File (рис. 2.2). ^'il'Xi Моихюкументы iQcorelUserFnesI jesiCQ Lite fe images liSiMy Pictures I^My Received Files |вМои видеозаписи il^MoH источники данных ^^\ --^М- ф Е|у^;;-^^л г^^:- Змои рисунки 1 ^Моя музыка ^ {Новая папка Wii^$6»m -., |Module1 Д;ип4|юйАо: ]Basic FilesCbas) ^ Справка Рис. 2.2, Экспортирование модуля Осталось 20 минут 2. Используйте диалоговое окно для выбора папки, в которой должен быть сохранен экспортируемый файл. 3. Оставьте имя файла, предлагаемое по умолчанию, либо укажите новое. Расширение файла определяется типом экспортируемого компонента. Расширение . CLS применяется для объектов Excel и модулей классов, расширение . ВАЗ — для модулей и расширение . FRM — для экранных форм. 4. Щелкните на кнопке Save (Сохранить). Чтобы импортировать модуль, выполните перечисленные ниже действия. 1. Щелкните правой кнопкой мыши на названии проекта в окне Project Explorer и в открывшемся меню выберите пункт Import File (Импортировать файл). 2. Выберите требуемый файл с расширением .BAS, .FRM или .CLS. 3. Щелкните на кнопке Open (Открыть). Инструменты редактирования в пределах окна редактирования кодов редактор VBA выполняет все основные функции, свойственные обычному текстовому редактору. В окне редактирования можно перемещать курсор, набирать и удалять текст, копировать, вырезать, вставлять и т.д. Однако в этом окне реализованы также некоторые специальные функции, облегчающие написание кодов VBA. Представим краткое описание этих функций. 40 Часть L Пятница. Вечер
• Автоматическая проверка синтаксиса (Auto Syntax Check). Когда вы завершаете набор строки кода, редактор автоматически проверяет ее синтаксис и сообщает об ошибках, которые иначе были бы обнаружены только во время выполнения программы. • Автоматическое отображение списка доступных элементов (Auto List Members). Эта функция отображает список элементов, которые могли бы дополнить набираемое выражение. Можно либо выбрать один из предлагаемых вариантов, либо самостоятельно продолжать набор кодов. • Автоматическое отображение справочной информации (Auto Quick Info). При наборе названия функции VBA редактор отображает краткую информацию о ней, а также список ее параметров. • Автоматический отступ (Auto Indent). Каждая новая строка автоматически начинается с отступа, соответствующего предыдущей строке. Нажимайте клавишу <ТаЬ>, чтобы увеличить отступ, и клавиши <Shift4-Tab>, чтобы уменьшить его. Все эти функции вы можете включать и отключать по своему усмотрению. 1. Выберите команду Tools^=t>Options (СервисеПараметры), чтобы открыть диалоговое окно Options. 2. Перейдите на вкладку Editor (Редактор) — рис. 2.3. Editof |е<й1ог fonnakt| Generai p" Auto SyntaxQwdf -•••.T-.-'^-^, \\ P AutollslMwnbei». ^"; j..--[7'-.Aiil»QttkkIrtb ^-С- С:-•.'"■"-^,' Ip^'Ambidiilt-- T*|?JWkltt»:|4 ':,■: .y:h-i0(i^iiW.^A^ Щ^ ■ ^ \ ' ■'' ••'•; OU^iftW^i^|y ^V^ ■: Puc. 2.3 Настройка параметров редактора VBA 3. Установите флажки напротив названий тех функций, которые вам необходимы. 4. Щелкните на кнопке ОК. Редактор отображает разные типы текста различными цветами и/или разными шрифтами. Так, ключевые слова языка VBA могут выделяться цветом, отличным от того, которым отображаются, например, имена переменных. Опции управления этими параметрами расположены на вкладке Editor Format (Формат редактора) диалогового окна Options. Урок 2. Редактор VBA 41
Параметры редактора VBA не влияют на функциональность самих кодов и на ход выполнения программы. Они лишь облегчают работу программиста. Ранее в этом уроке уже говорилось о том, что процедура является базовой структурной единицей кодов VBA. Если в окне редактирования отображаются коды двух и более процедур, то они могут быть представлены одним из двух способов. • Full module view (Отображение целого модуля). Все процедуры отображаются одновременно (хотя, возможно, вам придется воспользоваться полосой прокрутки, чтобы увидеть некоторые из них). Они разделяются горизонтальными линиями, обозначающими окончание одной процедуры и начало следующей. • Procedure view (Отображение отдельных процедур). Одновременно отображаются коды только одной процедуры. Когда курсор расположен в первой или в последней строке процедуры, нажатие клавиш <PgDn> и <PgUp> позволяет переключиться к следующей или предыдущей процедуре соответственно. Переключение между этими двумя режимами отображения выполняется с помощью кнопок Full module view и Procedure view, расположенных в нижней части окна редактирования (рис. 2.4). Р^ (General) т| ]{Declarationt) ввгХ| :з Act iveCe 11. Value = InputBox ("Введите значение **) ^ Range {" В 4 ") . Select ---^1 ActiveCelLvalue = InputBox("Введите значение") Range("В5").Select ActiveCell.Value = InputBox("Введите значение") Range("B6").Select ActiveCell.Value = InputBox("Введите значение") Range("37").Select ActiveCell.Formula = "=СУММ(В2:В6)" ActiveWorkbook.SaveAs Filename:^"МояПерБаяПрограм Коды всего модуля Коды отдельных процедур Рис. 2.4, Переключение между режимами отображения кодов процедур ш Чтобы сразу же перейти к требуемой процедуре в пределах текущего модуля, выберите ее название из раскрывающегося меню, расположенного в правой верхней чааи окна редактирования. Окно свойств объекта По умолчанию окно свойств объекта располагается в левом нижнем углу редактора VBA. В этом окне отображаются свойства объекта, выбранного в данный момент в редакторе. Свойство — это атрибут объекта, определяющий ас- 42 Часть 1. Пятница. Вечер
пект отображения или поведения данного объекта. Например, объект Worksheet (Рабочий лист) имеет свойство Name (Название), свойство Visible (Отображение) и еще целый ряд других свойств. Некоторые объекты имеют всего несколько свойств. Например, модуль характеризуется только свойством Name. На рис. 2.5 показано окно свойств рабочего листа, выбранного в данный момент в окне Project Explorer. Окно Immediate Это окно используется для отображения информации, возвращаемой выражением Debug.Print в процессе выполнения программы. Чтобы отобразить или убрать это окно, выберите команду View=>Immediate Window (Видсс>0кно Immediate) либо нажмите клавиши <Ctrl+G>. Об использовании выражения Debug. Print детально будет рассказано в последующих уроках. |Лмст2 Worksheet lotsplsyPageBrealcs IDispleyRrghtToLeft JEnabteAutoFilter lEnableCalculation lEnableOutiining jEnablePtvon'abie jEnabteSelection INanfie jScrollArea Istendi^rdVVrdth^ Ivisibte ^^ШЙ1/ Лнсг2 False False Fatee True Fajse False"" "'""' 0 - xtNoRestrlctions Лисг2 8,11 -1 - xlSheetVistble Щ '▼1 - - j Puc, 2.5. Сейчас в этом окне отображаются свойства выбранного рабочего листа В окне представлены две вкладки, которые позволяют просматривать свойства объекта либо в алфавитном порядке, либо по категориям. В левом столбце указываются названия свойств, в правом — их значения. Все свойства делятся на четыре категории. 1. Свойства логического типа, принимающие значения True (истина) либо False (ложь). Требуемое значение либо выбирается из списка, либо меняется на противоположное двойным щелчком на названии свойства. 2. Свойства перечислимого типа, принимающие одно из строго определенных значений. Требуемое значение выбирается из выпадающего списка. 3. Свойства, значения которых устанавливаются в диалоговом окне. Для установки значения щелкните на кнопке с многоточием. 4. Свойства произвольного типа, которые могут принимать любые значения. Щелкните в поле со старым значением и наберите новое значение. Урок 2. Редактор VBA 43
Меню редактора VBA Редактор VBA имеет достаточно развитую систему меню (см. табл. 2.1). Назначение многих команд меню описывается в разных частях этой книги. Например, команды меню Debug (Отладка) рассмотрены в уроке 25. Некоторые команды соответствуют редко используемым функциям, их описание выходит за рамки данной книги. Другие, например, команды меню Window (Окно), являются типичными для приложений Windows, а потому также не рассматриваются. Таблица 2.1. Некоторые команды меню редактора VBA Меню Команда Действие Сохранение текущего проекта (рабочей книги) Закрытие редактора и возврат в Excel Удаление выбранного объекта из проекта Отмена последней выполненной команды Повтор последней выполненной команды Возврат к Excel без закрытия редактора Управление параметрами отображения панелей инструментов Добавление новой процедуры в текуп^ий модуль Добавление новой экранной формы в текущий проект Добавление нового модуля в текущий проект Добавление нового модуля класса в текущий проект Настройка параметров редактора VBA Настройка параметров проекта Многим командам, доступным через меню редактора, соответствуют кнопки на панелях ин^рументов и определенные комбинации клавиш. File File File Edit Edit View View Insert Insert Insert Insert Tools Tools Save Close and Return. Remove... Undo Redo Microsoft Excel Toolbars Procedure UserForra Module Class Module Options Properties... Использование макросов при написании программ Как уже отмечалось в уроке 1, запись макросов можно рассматривать как одну из разновидностей программирования. Макрос представляет собой запись действий, производимых пользователем в Excel, в том числе таких, как ввод данных, выбор команд меню, создание диаграмм, печать и т.п. В процессе записи макросов действия пользователя преобразуются в соответствующие коды VBA. Если макрос записан, его можно воспроизводить любое количество раз с целью повторения уже выполненных действий. В принципе, запись макросов не относятся к программированию, поскольку при этом просто фиксируются выполняемые пользователем действия, тогда как сам он коды не пишет. Но несмотря на это возможность записи макросов является весьма полезной для программиста по следующим причинам. • Существует возможность записать макрос для определенного действия и использовать автоматически сгенерированные коды в качестве образца для написания собственных программ. 44 Часть L Пятница. Вечер
• Вы можете записать макрос и использовать полученные в результате коды в собственных программах, вставляя их в том виде, в котором они существуют, или внося необходимые изменения. Благодаря своим широким возможностям, макросы заслуживают детального изз^ения. Запись макросов Чтобы записать макрос, выполните перечисленные ниже действия. 1. В Excel выберите команду Сервис'=с>Макрос«=^Начать запись. В результате на экране появится диалоговое окно, изображенное на рис. 2.6. |^Ч*Ш*<»»*ШЫМ »«ММ*#^1>^Л1ЦМ Kimii» 1»*1»**1ИМИ>М11 1 Kt IIIMtl.lllllHli><t'?!!8iS?SKlffnBSffiLi рввн 0)4ereHtiejtfteei«B: CaxpaHKibg: Ctrf^j I Эта книга ▼] QmtcBHtte:' (Макрос записан 15.06.2004 (BOSS) OK Отмена Рис. 2.6. Диалоговое окно Запись макроса Название макроса должно начинаться с буквы. Далее могут следовать другие буквы, цифры или символы подчеркивания. Использование пробелов и других символов не допускается. 2. В поле Имя макроса укажите название создаваемого макроса. 3. Если вы хотите, чтобы записанный макрос запускался нажатием комбинации клавиш, укажите эту комбинацию в поле Сочетание клавиш. Например, если указать в этом поле символ М, макрос можно будет запускать нажатием клавиш <Ctrl-bM>. Если не обязательна такая возможность, оставьте это поле пустым. 4. Используйте раскрывающийся список для выбора места сохранения макроса: • Эта книга — сохранить в текущей рабочей книге; • Новая книга — создать новую рабочую книгу и сохранить в ней макрос; • Личная книга макросов — сохранить создаваемый макрос в личной книге макросов. Сохраненные таким образом макросы остаются доступными при каждом запуске Excel. 5. Если необходимо, наберите свой текст в поле Описание. Этот текст будет включен в качестве комментария в коды макроса. 6. Щелкните на кнопке ОК. На экране появится панель управления, после чего начнется запись макроса. 7. Выполните действия, которые должны быть записаны в макросе. 8. Завершив выполнение всех требуемых действий, щелкните на кнопке Остановить запись, расположенной на панели инструментов. Урок 2. Редактор VBA 45
ш о сохранении кодов VBA речь шла ранее в этом уроке в разделе ''Структура создаваемых проектов". Ссылки на ячейки в макросах На небольшой панели управления, появляющейся на экране в процессе записи макроса, кроме кнопки Остановить запись, отображается также кнопка Относительная ссылка. Чтобы правильно воспользоваться этой возможностью, необходимо знать, как в Excel указываются ссылки на ячейки рабочего листа. В макросах, как и в любых других кодах VBA, часто возникает необходимость указать ссылки на определенные ячейки рабочего листа. Эту задачу можно выполнить двумя способами. Первый способ заключается в использовании абсолютных ссылок; при этом требуемая ячейка идентифицируется по абсолютным позициям строки и столбца. Абсолютная ссылка на ячейку А2, например, всегда указывает на эту ячейку и только на нее. Второй способ состоит в использовании относительных ссылок; при этом требуемая ячейка определяется по ее положению относительно текущей активной ячейки (визуально активная ячейка выделена жирной черной рамкой). Так, "на одну ячейку вниз" или "на две ячейки вниз и на три ячейки вправо" — это примеры относительных ссылок. Ясно, что положение ячейки, определяемой по относительной ссылке, зависит от положения текущей активной ячейки. Вопросы использования ссылок на ячейки детальнее рассматриваются в уроке 11. По умолчанию при записи макросов в Excel указываются абсолютные ссылки на ячейки. Предположим, что в момент начала записи макроса активной была ячейка А1, после этого вы четыре раза подряд нажали клавишу со стрелкой "вниз". Созданный в результате макрос будет содержать коды VBA, в которых будут зафиксированы следующие команды: Перейти к ячейке А2. Перейти к ячейке A3. Перейти к ячейке А4. Перейти к ячейке А5. Если в процессе записи щелкнуть на кнопке Относительная ссылка, Excel перейдет к режиму использования относительных ссылок (чтобы опять вернуться к использованию абсолютных ссылок, повторно щелкните на той же кнопке). При выборе режима использования относительных ссылок, в кодах VBA фиксируются следующие инструкции: Перейти на одну строку вниз. Перейти на одну строку вниз. Перейти на одну строку вниз. Перейти на одну строку вниз. Решение о том, какие ссылки (абсолютные, относительные или их комбинации) следует использовать, зависит от требований конкретной программы. Особенность программирования на языке VBA и использования объектной модели Excel состоит в том, что одну и ту же задачу практически всегда можно решить несколькими способами. Способ, выбранный системой при записи макроса, зачастую не является единственно возможным, и программист не обязан повторять это решение в своих программах. 46 Часть 1. Пятница. Вечер
ф Осталось 10 минут Просмотр и выполнение макросов Чтобы запустить макрос, нажмите соответствующую комбинацию клавиш, если она была задана для него в момент записи. Можно также выбрать команду Сервис:^ Макрос'=с> Макросы или нажать клавиши <Alt+F8>, чтобы отобразить диалоговое окно Макрос (рис. 2.7). ШШ ii*3c ;„>;" ^:\< ;'..'«: СозуЕ^ииеТаблицы ВОШх ';"'^'";'"УГ'"'" ' )6тт» i "Ht^f^ «,;;^,:|Эта книга 3-. WtgmHifp».», Рис. 2.7. Запуск макроса из диалогового окна Макрос Это диалоговое окно позволяет не только запускать макросы, но и выполнять другие действия. Выберите требуемый макрос и затем воспользуйтесь одной из перечисленных ниже возможностей. • Используйте список Находится в для определения, какие макросы должны отображаться в данном окне. • Щелкните на кнопке Выполнить, чтобы запустить выбранный макрос на выполнение. • Щелкните на кнопке Войти, чтобы приступить к отладке выбранного макроса (подробнее об отладке программ рассказывается в уроке 25). • Щелкните на кнопке Изменить, чтобы открыть макрос в редакторе VBA для просмотра и редактирования его кодов. • Щелкните на кнопке Удалить, чтобы удалить выбранный макрос. • Щелкните на кнопке Параметры, чтобы задать макросу новую комбинацию клавиш и/или изменить текст его описания. Щелкнув на кнопке Изменить, вы можете скопировать код макроса и затем вставить его в свою собственную программу. Справочная система Редактор VBA предоставляет доступ к подробной справочной системе, содержащей детальную информацию о языке VBA, об объектной модели Excel, а также о самом редакторе. Предусмотрено несколько вариантов доступа к этой информации. Урок 2. Редактор УвА 47
Один способ состоит в использовании контекстно-зависимой справки, вызываемой нажатием клавиши <F1>. Редактор отслеживает выполняемые вами действия и при нажатии клавиши <F1> выдает подсказку, соответствующую этим действиям. Например, если вы нажмете клавишу <F1> после выбора какого-либо элемента в окне Project Explorer, будет отображена справочная информация об использовании окна Project Explorer. Если редактор не сможет определить, чем вы занимаетесь, в данный момент, на экране будет появится соответствующее сообщение. Второй способ состоит в получении справки через диалоговые окна. В большинстве диалоговых окон редактора VBA имеется кнопка Help (Справка), щелчок на которой позволяет получить справочную информацию по использованию возможностей текущего диалогового окна. Однако наиболее универсальный и гибкий способ состоит в поиске требуемой информации. Выберите команду Не1р'=^>Справка: Microsoft Visual Basic, в результате чего будет открыто окно справочной системы с расположенной на переднем плане вкладкой Мастер ответов (рис.2.8). Чтобы выполнить поиск интересующей вас информации, в поле Выберите действие наберите слово или фразу, по которой должен осуществляться поиск, после чего нажмите клавишу <Enter> или щелкните на кнопке Найти. Поисковая система отобразит список разделов, имеющих отношение к вашей теме. На рис. 2.9 показаны результаты поиска, выполненного по слову "массив". Още^кш*» Маотфотаетов У|шз; < I ► Bb^e^eafiStrmm-- ^0 [Туре your question here and then dick Search. ' .{loi|dL»>ln«pHfnr«^; Рис. 2.8. Вкладка Мастер ответов окна справочной системы Оодарлсанйв |!эетврответов [указ; < 1 ► 1 массив \ '/• '■'^- "'''r-'-^ir^- :г:-. Вь^бсцжсге (Мвдел:" .ч ''■•'': У: \ -v Нейти j 1 ^'-^- ■ {-"'у 1 Выделение диапазона ячеек, содержащих форн> 1 Формулы массива и константы массива 1 О'ММРАЗНКВ СУММКВРАЗН СУММПРОИЗВ iftBMeHeHMe формулы массива 1 Удалемю формулы | ПРВДСКАЗ ЛГРФПРИБЛ ТРАНСЛ СУММСУММКВ ВПР МУМНОЖ СРГЕОМ МОПРЕД ИНДЕКС ПРОСМОТР ЧАСТОТА ПОИСКГЮЗ Рис. 2.9. Результаты поиска по слову **массив" Чтобы выполнить быстрый поиск справочной информации, можно также набрать требуемую фразу в поле, расположенном в правой части строки меню редактора VBA, и нажать клавишу <Enter>. 48 Часть L Пятница. Вечер
Многие разделы справочной системы содержат гиперссылки, обеспечивающие доступ к дополнительной информации. Некоторые из них отображаются в самом начале раздела, причем для разных разделов они могут быть различными. Например, некоторые разделы содержат ссылку См. также, после щелчка на которой отображается перечень других разделов справочной системы, имеющих отношение к рассматриваемой теме. Ссылки внутри разделов указывают на определения соответствующих терминов. В верхней части окна справочной системы располагаются кнопки, краткое описание которых приведено ниже. • Автомозаика/Скрыть. Позволяют переходить от режима, при котором окно справочной системы перекрывает собой окно редактора VBA, к режиму, при котором оба окна располагаются рядом, и наоборот. • Назад. Переход к предыдущему разделу справочной системы. • Вперед. Переход к следующему разделу. • Печать. Вывод текущего раздела на печать. Готово! Обзор Редактор VBA является мощным "центром управления" процессом разработки проектов Excel. Он позволяет не только редактировать коды, но и содержит в себе инструменты, предназначенные для управления структурой проекта и свойствами объектов. Некоторые специальные возможности редактора будут рассмотрены в последующих уроках. Из этого урока вы узнали ряд важных сведений. • Код VBA состоит из процедур, которые размещаются в модулях. • Окно Project Explorer позволяет просмотреть перечень компонентов проекта и добавить новые модули. • Коды могут быть повторно использованы путем экспортирования модулей из одного проекта и последующего их импортирования в другой проект. • В редакторе VBA предусмотрен ряд дополнительных возможностей, повышающих скорость и точность написания кодов. • Окно Property Window используется для просмотра и редактирования свойств объектов. • Макросы Excel записываются в виде кодов VBA, которые используются программистами при написании собственных программ. • Справочная система редактора VBA содержит информацию о языке VBA, об объектной модели Excel и о возможностях самого редактора. Проверьте себя 1. Где редактор VBA сохраняет написанный программистом код? (См. раздел "Структура создаваемых проектов".) 2. В каких частях проекта VBA могут располагаться коды программы и какой из них используется чаще всего? (См. раздел "Структура создаваемых проектов".) 3. Как перенести коды из одного проекта в другой? (См. подраздел "Импортирование и экспортирование модулей".) Урок 2. Редактор VBA 49
в редакторе VBA предусмотрены дополнительные функции (например, автоматическая проверка синтаксиса), которые помогают при написании кодов программы. Как включить или отключить эти функции? (См. раздел "Инструменты редактирования".) Как выбрать требуемое значение для свойства перечислимого типа в окне Property редактора VBA? (См. раздел "Окно свойств объекта".) В чем заключается различие между абсолютными и относительными ссылками на ячейки? (См. подраздел "Ссылки на ячейки в макросах".) 50 Часть L Пятница. Вечер
УРОК Объектная модель Excel Содержание урока ^ Использование свойств и методов ^ Работа с коллекциями ^ Иерархия объектов ^ Объект Workbook ^ Объект Worksheet Объектная модель Excel является основой, на которой строится программирование в Excel (другой основой является язык VBA). Как было показано в уроке 1, приложение Excel состоит из объектов, обеспечивающих функциональность данной прозе «uwym граммы. Благодаря тому, что эти объекты являются "открытыми" (т.е. ими можно управлять извне), их функциональные возможности используют программы, написанные на языке VBA. Совокупность объектов Excel, открытых для использования другими приложениями, называется объектной Моделью Excel, изучению которой и будет посвящен настоящий урок. Свойства и методы объектов При работе с объектами вам потребуется знание таких терминов, как свойства и методы объектов. В некотором смысле, сам объект — это и есть его свойства и методы, поскольку лишь они доступны извне (т.е. из вашей программы). Использование объекта сводится к использованию его свойств и методов. Свойство — это фрагмент информации, имеющий отношение к данному объекту. Свойства могут предоставлять информацию о самом объекте либо определять особенности его воспроизведения (это касается отображаемых объектов) и поведения. Если в качестве примера привести автомобиль, то его свойства — это цвет, частота, на которую настроен его радиоприемник, количество топлива
в баке и т.п. Некоторые свойства доступны только для чтения^ т.е. их значения можно считывать, но не изменять (например, количество дверей автомобиля). Другие свойства доступны как для чтения, так и для записи (т.е. изменения), например, частота, на которую настроен радиоприемник. В отличие от свойств, методы представляют собой действия, выполняемые объектом. Продолжая аналогию с автомобилем, приведем в качестве примера методы "увеличить скорость*', "повернуть" и "остановиться". Методы могут принимать значения параметров, уточняющие характер действия, которое необходимо выполнить. Например, для метода "повернуть" можно определить параметр "направление", который будет принимать значения "вправо" или "влево". Обозначение свойств и методов выполняется в стандартном формате: ИмяОбъекта.ИмяСвойства и ИмяОбъектаМмяМетода, соответственно. Если метод способен принимать значения параметров, выполняется это одним из трех способов. Первый способ состоит в указании этих значений в круглых скобках, причем в том порядке, в каком были объявлены сами параметры: ИмяОбъекта .ИмяМе то да (арг^умент!, аргумент2, ...) Этот же способ используется в тех редких случаях, когда значения параметров передаются свойству. Порядок следования значений должен строго соответствовать порядку, в котором были объявлены сами параметры. Второй способ передачи значений параметров при вызове метода отличается от первого лишь отсутствием круглых скобок: ИмяОбъекта.ИмяМетода аргумент!, аргумент2, ... Требования к порядку следования значений такие же, как и для первого способа. Третий способ заключается в использовании именованных аргументов и является, пожалуй, наиболее простым и очевидным. При вызове метода вы указываете названия аргументов, за которыми следуют оператор : = и сами передаваемые значения: ИмяОбъекта.ИмяМетода имя1аргумента:=значение1аргумента, _ имя2аргумента:=значение2аргумента... Например: МояКнига.SaveAs Filename:="ИтоговаяТаблица.wks" Вызов метода с использованием именованных аргументов имеет два преимущества. Прежде всего, это наглядность кодов программы. Имя каждого аргумента в какой-то мере описывает его назначение, а потому использование этого имени в момент вызова метода способствует более точному пониманию кодов программы. Второе преимущество данного способа состоит в его простоте. Многие методы имеют большое количество необязательных параметров, и довольно часто при вызове таких методов многим параметрам оставляют значения, используемые по умолчанию. Если вызов метода осуществляется обычным способом, параметры определяются только порядком их следования, причем для тех из них, которым требуется оставить значения, принятые по умолчанию, в списке аргументов следует оставить пустое место и отделить их от других аргументов запятыми. Если же вызов метода выполняется с помощью именованных аргументов, указывать необходимо только те аргументы, значения которых определяются вызывающей программой. Ссылки на объекты Чтобы получить доступ к объекту, требуется иметь ссылку, которая на него указывает. Ссылка — это имя в кодах программы, указывающее на данный 52 Часть 1. Пятница. Вечер
объект. В некоторых случаях объект уже существует, поэтому вашей программе необходимо лишь получить ссылку на этот объект. Например, после открытия рабочей книги программе потребуется ссылка на один из рабочих листов этой книги. В случае, если объект еще не создан, программа должна его создать, только после этого она получит на него ссылку. Например, добавление нового рабочего листа к уже существующей рабочей книге. В следующих главах обе техники будут рассматриваться применительно к различным объектам Excel. Работа с коллекциями в объектной модели Excel довольно часто используются коллекции. Это особый класс (класс Collection), специально разработанный для управления экземплярами других объектов. Excel использует коллекции практически всегда, когда существует потенциальная вероятность создания более одного объекта. Например, рабочая книга Excel может содержать несколько листов. Их управление организовано следующим образом. • Рабочая книга представлена объектом Workbook. • Объект Workbook содержит коллекцию Sheets. • Коллекция Sheets содержит по одному объекту Sheet для каждого листа данной рабочей книги. Почему коллекция, содержащая рабочие листы, называется Sheets, а не Worksheets? Дело в том, что в Excel представлено два типа листов. Листы первого типа (рабочие листы — worksheets) могут содержать в себе как данные, организованные в столбцы и строки, так и диаграммы. Листы второго типа (листы диаграмм — chart sheets) включают только диаграммы. Таким образом, коллекция Sheets содержит объекты класса Sheet, каждый из которых может представлять собой лист первого или второго типа. Если вы планируете работать только с рабочими листами или только с листами диаграмм, воспользуйтесь свойством Worksheets или свойством Charts, соответственно (как показано далее в этом уроке). Приведенный выше пример иллюстрирует действие соглашения, в соответствии с которым имя коллекции образуется как множественное число от имени объектов, в ней содержащихся: коллекция Sheets содержит объекты класса Sheet, коллекция Windows — объекты класса Window и т.д. Это правило, однако, имеет ряд исключений, о которых будет рассказано далее в этой книге. Объект коллекции имеет свойство Count, его значение соответствует порядковому номеру данного объекта в этой коллекции. Свойство Count доступно только для чтения, изменить его значение нельзя. Предусмотрено два способа, с помощью которых можно обратиться к требуемому объекту коллекции. Следует либо указать порядковый номер этого объекта в коллекции, либо использовать уникальный ключ данного объекта. Данный ключ зависит от того, какие объекты содержатся в коллекции. Как правило, он представляет собой фрагмент информации, по которому можно идентифицировать требуемый объект. Например, в коллекции Sheets таким ключом является название рабочего листа. Таким образом, запись Sheets (1) обозначает первый лист текущей рабочей книги, тогда как запись Sheets("ОбъемыПродаж") Урок 3. Объектная модель Excel 53
ссылается на лист с названием "ОбъемыПродаж". Второй метод применяется чаще, поскольку точный порядковый номер требуемого объекта в коллекции обычно не известен. Ссылку на объект, принадлежащий коллекции, можно использовать двумя способами. Вы имеете возможность обратиться к элементам коллекции напрямую. Применение такого способа продемонстрировано на примере следующей строки, где вызов метода Calculate сопровождается пересчетом всех формул указанного рабочего листа: Sheets("ОбъемыПродаж").Calculate Можно также присвоить ссылку на элемент коллекции какой-нибудь переменной и затем использовать эту переменную для обращения к данному элементу: Set МойЛист = Sheets("ОбъемыПродаж") В данном примере подразумевается, что переменная МойЛист была объявлена с указанием типа данных, который позволяет хранить ссылки на рабочие листы (более подробно об этом будет рассказано в уроке 4). Обратите внимание на использование ключевого слова Set, которое обязательно, если переменной присваивается ссылка на объект. В результате переменная МойЛист теперь ссылается на рабочий лист, имеющий название 'ЮбъемыПродаж'% и может быть использована для обращения к свойствам и методам этого листа: МойЛист.Calculate Даже если в программе создано несколько ссылок на один и тот же объект, вы все равно имеете дело с одним объектом. В большинстве коллекций предусмотрены методы, позволяющие добавлять к ней новые объекты и удалять старые. Для добавления объектов используется метод Add: Имя Коллекции. Add (аргументы) Аргументы метода определяют способ создания добавляемого объекта, их перечень может быть разным для разных коллекций. Метод Add возвращает ссылку на созданный объект, которая изначально может быть проигнорирована. Для удаления объектов из коллекции используется метод Delete. При работе с коллекциями довольно полезным инструментом является оператор For Each In. С его помощью можно создать цикл для прохождения по всем элементам коллекции. Синтаксис применения этого оператора выглядит следующим образом: For Each Элемент In Коллекция Next Элемент — это переменная, которая должна быть объявлена с указанием типа данных, позволяющего хранить ссылки на элементы коллекции. Коллекция — это ссылка на саму коллекцию. Изначально переменная Элемент указывает на первый элемент коллекции, для которого выполняется набор инструкций, обозначенных троеточием. Когда программа достигает слова Next, управление передается на начало цикла, переменной Элемент присваивается ссылка на следующий элемент коллекции, и набор инструкций выполняется вновь. Цикл продолжается до тех пор, пока не будут пройдены все элементы коллекции. Если коллекция не содержит элементов, управление сразу передается строке, следующей за словом Next. Пример использования конструкции For Each In рассматривается далее в этом уроке в разделе, посвященном работе с объектом Workbook. 54 Часть 1. Пятница. Вечер
Итак, вы получили некоторые сведения об использовании коллекций. Более подробно вопросы, касающиеся работы с конкретными коллекциями, рассматриваются в следующих главах этой книги. Иерархия объектов Объектная модель Excel организована в виде иерархической структуры. Верхним Осталось „ -, ^ . . « ^ 20минут узлом В ЭТОЙ иерархии является объект Application, представляющий собственно приложение Excel. Все другие объекты модели являются дочерними по отношению к Application. Сам объект Application всегда доступен для пользовательских приложений. Если вы пишете программу VBA в другом приложении пакета Office, например, в приложении Word, и вам необходимо получить доступ к возможностям Excel, то в таком случае объект Application для приложения Excel потребуется создать явно. Однако в данной книге эти вопросы рассматриваться не будут. Если вы занимаетесь программированием в Excel, объект Application этого приложения всегда доступен в качестве неявной ссылки. Объект Workbook имеет несколько непосредственных потомков, наиболее важный из них — коллекция Workbooks. Элементами этой коллекции являются все открытые в настоящий момент рабочие книги. Каждый объект класса Workbook имеет свою коллекцию Sheets, содержащую по одному объекту Sheet для каждого рабочего листа и листа диаграмм данной рабочей книги. В графическом виде структура описанной выше объектной модели представлена на рис. 3.1. Рис, 3.1. Отношения между объектами Application» Workbook и Sheet Разумеется, структура объектной модели Excel включает не только те отношения, которые представлены на рис. 3.1. Существуют также и другие объекты и коллекции, которые не отображены на этой схеме (они будут рассмотрены в следующих уроках). Объект Workbook Каждая открытая в Excel рабочая книга представлена объектом Workbook, принадлежащим к коллекции Workbooks объекта Application. В этом разделе описаны методы работы с объектом Workbook. Урок 3. Объектная модель Excel 55
Создание и открытие рабочих книг Чтобы создать новую рабочую книгу, вызовите метод Add коллекции Workbooks: Workbooks.Add(Template) Поскольку коллекция Workbooks является потомком объекта Application, полный синтаксис приведенного выше выражения следующий: Application.Workbooks.Add(Template) Если вы программируете в Excet объект Application всегда доступен в виде неявной ссылки, поэтому указывать его явно не обязательно. Template -это необязательный аргумент, представляющий собой название файла уже существующей рабочей книги (данный файл сохраняется на диске). Если этот аргумент указан, то новая рабочая книга создается на основе существующей. В противном случае новая книга будет содержать три пустых рабочих листа. Метод возвращает ссылку на новую рабочую книгу. В данном случае вы имеете возможность выбора: либо сразу ее использовать, либо проигнорировать. Например: Dim MyWB As Workbook Set MyWB = Workbooks.Add Как обычно, использование ключевого слова Set обязательно, если переменной присваивается значение ссылки на объект. Переменная MyWB ссылается на только что созданную рабочую книгу, и теперь ее можно использовать для обращения к данной книге. Кроме того, ссылка на эту книгу помещается также в коллекцию Workbooks. Если требуется открыть уже существующую рабочую книгу (файл которой сохранен на диске), используйте метод Open: Workbooks.Open {Filename) Аргумент Filename — это название файла рабочей книги, которую следует открыть (с указанием полного пути, если существует такая необходимость). Этот метод открывает существующую рабочую книгу, помещает ссылку на нее в коллекцию Workbooks и возвращает эту ссылку в качестве результата. Например: Dim MyWB as Workbook Set MyWB = Workbooks.Open("c:\oтчeты\пpoдaжи.xls") Если указанный файл не существует или не может быть открыт по какой-либо причине (например, если этот файл уже открыт другим приложением), возникает ошибка выполнения программы. Более подробно вопросы обработки этих и других ошибок рассматриваются в уроке 27. Необходимо всегда учитывать возможность возникновения ошибок, особенно при работе с файлами. Чтобы облегчить восприятие, мы решили в фрагменты кодов, приводимые в этом и в следующих уроках в качестве примеров, не включать команды, которые предназначены для обработки возможных ошибок. Однако это не значит, что при написании своих приложений вы должны поступать точно так же! Сохранение и закрытие рабочих книг Чтобы сохранить рабочую книгу с использованием ее текущего названия, вызовите метод Save. Текущим является название, присвоенное рабочей книге в результате вызова метода SaveAs (о чем подробнее будет рассказано далее в этом 56 Часть 1. Пятница. Вечер
уроке), или же стандартное название (Книга!, Книга2 и т.д.), присвоенное ей в момент создания. Метод Save не имеет аргументов. Чтобы сохранить рабочую книгу с новым названием, используйте метод SaveAs: P\Ш.SaveAs {Filename) WB —это ссылка на сохраняемую рабочую книгу, а Filename — это название файла, в котором данная рабочая книга должна быть сохранена. Если в названии файла явно не указано расширение .XLS, то оно будет добавлено автоматически. Название файла может быть дано с указанием полного пути, если рабочую книгу необходимо сохранить не в той папке, которая применяется по умолчанию. Например: МояКнига.SaveAs ("g:\отчеты\продажи\март.xls") Метод SaveAs имеет также несколько необязательных аргументов, используемых для назначения рабочей книге пароля, определения режима резервного копирования и других параметров сохранения. Полный список аргументов метода SaveAs приведен в справочной системе VBA. Метод SaveCopyAs позволяет сохранить рабочую книгу в файле с другим названием, не изменяя названия самой рабочей книги: WB.SaveCopyAs(Fi1епате) Закрытие рабочей книги осуществляется путем вызова метода Close: WB.Close {SaveChanges, Filename, RouteWorkbook) Далее будет представлено описание аргументов метода Close. • SaveChanges. Если данному аргументу передается значение True, изменения, внесенные после последнего сохранения, будут сохранены, если же False, — нет. В том случае, когда значение аргумента не указано, пользователь должен будет подтвердить свое желание сохранить изменения. • Filename. Данный аргумент определяет название файла, в котором будет сохранена рабочая книга. Если значение аргумента не указано, книга сохраняется со своим прежним названием. Если рабочей книге не присваивалось название, отличное от стандартного (Книга!, Книга2 и т.д.) и при вызове метода этому аргументу не присваивается никакое значение, пользователю будет предложено указать название сохраняемой книги. • RouteWorkbook. Этот аргумент имеет значение только в том случае, если предусмотрена рассылка данной рабочей книги, которая ранее не выполнялась. Если аргументу передается значение True, рассылка выполняется, если значение False — нет. Если рассылка предусмотрена, но значение аргумента не указано, в запросе пользователь должен указать необходимость выполнения рассылки. Ниже представлен пример использования конструкции For Next In для закрытия всех открытых рабочих книг (при этом сохраняются все внесенные изменения): Dim WB As Workbook For Each WB in Workbooks WB.Close SaveChanges:=True Next Ссылки на рабочие книги Чтобы управлять рабочей книгой в кодах программы, необходимо иметь ссылку на эту книгу. Существует несколько способов получения таких ссылок, выбор одного из них зависит от конкретной ситуации. Урок 3. Объектная модель Excel 57
Осталось 10 минут Первый способ заключается в следующем: вы должны получить ссылку в момент создания или открытия рабочей книги путем вызова методов Add и Open соответственно: Dim HoBaHWB As Workbook Dim ОткрытаяКВ as Workbook Set HoBaflWB = Workbooks.Add Set OTKpbiTanWB = Workbooks .Open ( "затраты.xls" ) Обратите внимание, что переменные, которым присваиваются значения ссылок на рабочие книги, должны быть объявлены с использованием подходящего типа данных. Подробнее о том, как объявляются переменные, предназначенные для хранения ссылок на объекты, рассказывается в уроке 4. Если рабочая книга уже создана или открыта (другими словами, если она уже принадлежит коллекции Workbooks), вы можете обращаться к ней непосредственно через эту коллекцию. Например, выражение Workbooks{Name) возвращает ссылку на рабочую книгу с названием Name, Название должно быть указано с учетом расширения .xls (например итоги.xls, а не просто итоги). Если рабочей книги с таким названием не существует, возникнет ошибка выполнения программы. Наконец, в языке VBA предусмотрено два ключевых слова, использующихся для обращения к рабочим книгам: • ActiveWorkbook —для обращения к активной рабочей книге; • ThisWorkbook — для обращения, к рабочей книге, в которой выполняется код программы. Активной считается та рабочая книга, которая активна на экране. Как нетрудно догадаться, ключевое слово ActiveWorkbook может оказаться очень удобным инструментом. Необходимость в использовании ключевого слова ThisWorkbook не столь очевидна. В большинстве случаев код, выполняемый в настоящий момент, расположен в той же рабочей книге, что и данные, с которыми он работает, а потому в использовании слова ThisWorkbook нет необходимости. Но в некоторых ситуациях код, расположенный в одной рабочей книге, обращается к данным, хранящимся в другой книге. В этом случае при обращении к "своей" рабочей книге необходимо использовать слово ThisWorkbook. Наиболее часто подобная ситуация возникает при создании надстроек; при этом использование ключевого слова ThisWorkbook гарантирует, что ссылка указывает не на активную рабочую книгу, а на ту книгу, в которой сохранены коды программы. Вывод рабочих книг на печать Чтобы распечатать всю рабочую книгу или какие-то отдельные ее части, используйте метод Printout: IVB. Printout (From, То, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName) Ни один аргумент данного метода не является обязательным. 58 Часть I. Пятница. Вечер
• From и To — первый и последний листы рабочей книги, которые необходимо вывести на печать. По умолчанию распечатываются все листы. • Copies — число копий. По умолчанию значение равно единице. • Preview— если этому аргументу передается значение True, перед выводом на печать открывается окно предварительного просмотра. По умолчанию используется значение False. • ActivePrinter -название принтера, на который выводятся данные. Если вы не укажете другой принтер, будет использован принтер, установленный по умолчанию для операционной системы Windows. • PrintToFile — если передать этому аргументу значение True, данные отправляются на печать в файл, а не на принтер. По умолчанию используется значение False. • Collate— если производится печать нескольких копий и данному аргументу передается значение True, копии печатаются в подбор. По умолчанию используется значение False. • PrToFileName— название файла, в который будет произведена печать. Имеет смысл указывать лишь в том случае, если аргументу PrintToFile передается значение True. ^тщ/ж Метод Printout доступен также для некоторых других объектов Excel — ^В^н Chart, Range, Window и Worksheet. Отправка рабочей книги по электронной почте Чтобы отправить файл рабочей книги по электронной почте, воспользуйтесь методом SendMail. Файл отправляется как вложение с использованием установленной в вашей системе почтовой программы. IVB.SendMail (Recipients, Subject, ReturnReceipt) Далее описаны аргументы данного метода: • Recipients— обязательный аргумент, определяющий список адресов, по которым производится рассылка; • Subject — тема письма, необязательный аргумент. Если значение не указано, то будет использовано название отправляемой рабочей книги; • J?eturni?eceipt — если этому аргументу передано значение True, будет затребовано подтверждение доставки сообщения. Аргумент не обязателен, по умолчанию используется значение False. Адрес получателя может быть указан явно либо посредством обозначения имени, записанного в адресной книге. Если получатель один, передайте его имя или адрес почтового ящика соответствующему аргументу: WB.SendMail recipients:="Дима Волков" Чтобы отправить письма сразу нескольким получателям, вначале необходимо создать массив с их адресами: Dim recip As Variant recip = Array("Дима Волков", "someone®somewhere.com", "Bill Gates") WB.SendMail recipients:=recip Другие методы и свойства объекта Workbook Урок 3. Объектная модель Excel 59
Объект Workbook содержит довольно много методов и свойств — слишком много, чтобы все подробно рассмотреть в этой книге. Некоторые методы и свойства используются крайне редко, несмотря на это они детально описаны в справочной системе. Краткое описание наиболее часто используемых свойств и методов объекта Workbook приведено в табл. 3.1. Таблица 3.1. Описание некоторых свойств и методов объекта Workbook Имя Тип Описание ActiveSheet Charts CreateBackup FullName HasPassword Path Readonly Saved Sheets Worksheets Свойство Свойство Свойство Свойство Свойство Свойство Свойство Свойство Свойство Свойство Activate Метод AddToFavorites Метод NewWindow Метод Post Метод PrintPreview Метод WebPagePreview Метод Возвращает ссылку на активную страницу Возвращает коллекцию Sheets со ссылками на объекты Sheet всех листов диаграмм настоящей книги Если присвоено значение True, при сохранении рабочей книги создается ее резервная копия Полное имя файла рабочей книги Имеет значение True, если рабочая книга защищена паролем Путь к файлу рабочей книги Имеет значение True, если рабочая книга открыта только для чтения Имеет значение True, если рабочая книга сохранялась после внесения последних изменений Возвращает коллекцию Sheets, содержащую объекты Sheet всех рабочих листов и листов диаграмм данной рабочей книги Возвращает коллекцию Sheets, содержащую объекты Sheet всех рабочих листов данной рабочей книги Делает рабочую книгу активной Добавляет ярлык рабочей книги в папку Избранное Создает новое окно Отправляет рабочую книгу в общедоступную папку на Microsoft Exchange Server Отображает рабочую книгу в окне Print Preview Предварительный просмотр рабочей книги в виде Web- страницы Объект Worksheet Как уже отмечалось ранее в этом уроке, рабочий лист — один из двух типов листов, которые может содержать рабочая книга. Второй тип — это листы диаграмм. В данном разделе рассмотрены наиболее важные сведения о работе с объектами Worksheet, представляющими рабочие листы. Листы диаграмм детально рассматриваются в уроках 17 и 18. 60 Часть L Пятница. Вечер
Добавление и удаление рабочих листов Чтобы добавить к рабочей книге новый пустой рабочий лист, воспользуйтесь методом Add коллекции Worksheets: WB.Add(Before, After, Count) Все аргументы являются необязательными: • Аргумент Before — ссылка на существующий лист, перед которым должны быть добавлены новые рабочие листы. • Аргумент After— ссылка на существующий лист, после которого должны быть добавлены новые листы. • Аргумент Count определяет количество добавляемых листов. По умолчанию его значение равно единице. Разумеется, нельзя одновременно передавать значения аргументам Before и After. Если при вызове метода ни одному аргументу значения не были переданы, новый рабочий лист добавляется перед активным в данный момент листом. Метод Add возвращает ссылку на вновь созданный рабочий лист. Если было добавлено несколько листов, метод вернет ссылку на последний из добавленных. ^^ГЯЦ Новый рабочий лист можно также добавить с помощью метода Add коллекции «■Я^в Sheets, однако этот способ не предоставляет никаких дополнительных пре- mSBW имуществ. Сразу после создания нового листа желательно присвоить ему вместо имени, установленного по умолчанию (Лист1, Лист2 и т.д.), другое имя, которое имеет информационную нагрузку. Это имя отображается на экране на корешке рабочего листа и может быть использовано для получения ссылки на рабочий лист из коллекций Sheets или Worksheets. Dim МойНовыйЛист As Worksheet Set МойНовыйЛист = ActiveWorkbook.Add МойНовыйЛист.Name = "Итоговый отчет" Рабочий лист, создаваемый в ходе выполнения программы, изначально не виден пользователю. Чтобы отобразить его на экране и предоставить пользователю возможность работать с ним, свойству Visible данного листа необходимо присвоить значение True. Для удаления рабочего листа используется метод Delete соответствующего объекта Worksheet: МойРабочийЛист.Delete Также для этих целей можно применить ссылку на данный рабочий лист, полученную из коллекции Worksheets: МояКнига.Worksheets[ИмяЛиста) .Delete Обычно при попытке удаления рабочего листа Excel запрашивает у пользователя подтверждение на выполнение данной операции. Для того чтобы такой запрос не отображался на экране, необходимо присвоить значение False свойству DisplayAlerts объекта Application: DisplayAlerts = False МойРабочийЛист.Delete DisplayAlerts = True Урок 3. Объектная модель Excel 61
После удаления рабочего листа обязательно верните свойству DisplayAlerts значение True (см. предыдущий пример). Ссылки на рабочие листы Ранее уже были рассмотрены способы обращения к требуемому рабочему листу, в частности, с использованием ссылок, полученных при создании листа или извлеченных из коллекции Worksheets. Еще один способ обращения к рабочему листу заключается в использовании свойства ActiveSheet объекта Workbook. Это свойство возвращает ссылку на лист (рабочий или лист диаграмм), являющийся в данный момент активным в этой рабочей книге. Если ни один лист рабочей книги не является активным, свойство ActiveSheet возвращает специальное значение Nothing (см. врезку "Значение Nothing"). Более детально об использовании оператора If будет рассказано в уроке 6. Значение Nothing В некоторых случаях переменные, предназначенные для хранения ссылок на объекты, не ссылаются ни на один из уже созданных объектов (другими словами, они ссылаются "в никуда"). Для представления таких ссылок в языке VBA предусмотрено ключевое слово Nothing. Например, переменная, которая должна ссылаться на какой-то объект, на период между ее объявлением и инициализацией (когда ей присваивается ссылка на какой-то конкретный объект) получает значение Nothing: Dim MyWB As Workbook ' MyWB содержит значение Nothing Set MyWB = Workbooks.Add ' MyWB была инициализирована и теперь ссылается на существующий объект Значение Nothing в определенных условиях могут также возвращать некоторые свойства и методы объектов (например, свойство ActiveSheet в том случае, если в данный момент ни один лист не является активным). Чтобы проверить, ссылается ли переменная на объект или имеет значение Nothing, воспользуйтесь выражением If ...Then в сочетании с оператором Is Nothing: If СсылкаНаОбъект Is Nothing Then End If И наконец, если какой-то объект больше не будет использоваться в программе, вы можете (и должны) присвоить переменной, которая на него ссылается, значение Nothing: Set ссылкаНаОбъект = Nothing После того как последняя ссылка на объект будет закрыта путем присвоения ей значения Nothing, выделенная под этот объект память будет освобождена. Копирование и перемещение рабочих листов Рабочий лист можно целиком копировать, перемещать на новое место в пределах той же рабочей книги либо переносить его в другую рабочую книгу. 62 Часть L Пятница, вечер
При копировании рабочего листа используется следующий синтаксис (метод Move, используемый для перемещения рабочих листов, имеет тот же синтаксис, что и метод Сору): Sheet.Сору {Before, After) В приведенном выше примере Sheet — ссылка на копируемый лист. Аргументы Before и After указывают на лист, перед или после которого необходимо вставить копию исходного листа. Помните о том, что передавать значения сразу двум этим аргументам не допускается. Например, в результате выполнения следующего фрагмента кода Лист1 копируется и вставляется сразу после листа ЛистЗ: Worksheets("Лист1").Сору After := Worksheets("ЛистЗ") При копировании в пределах одной рабочей книги к имени вставленного листа добавляется индекс, например Лист1 (2). Чтобы скопировать лист в другую рабочую книгу, необходимо вызвать метод Сору без передачи значений аргументам Before и After. В результате Excel создаст новую рабочую книгу и поместит в нее копию исходного листа. о в Обзор Вы не сможете напрямую скопировать рабочий лист в уже существующую рабочую книгу. Если же в этом возникла необходимоаь, следует применить объект Range для копирования данных в буфер обмена и после этого вставить скопированные данные в новое место. Подробнее этот способ рассматривается в уроке 10. Любая программа, написанная вами на языке VBA, будет использовать объект- Готво! jjyjQ модель Excel. В этом уроке вы имели возможность получить общее представление об этой объектной модели и ознакомиться с рядом важных вопросов, касающихся, в частности, следующих аспектов программирования в Excel. • Работа с объектами осуществляется посредством обращения к их свойствам и методам. • Для хранения ссылок на объекты в Excel используются коллекции. • Объектная модель Excel имеет иерархическую структуру, верхним узлом в которой является объект Application. • Рабочие книги представлены объектами Workbook, ссылки на которые хранятся в коллекции Workbooks. При написании программ можно использовать методы объектов, предназначенные для создания новых и открытия существующих рабочих книг, сохранения и закрытия книг, а также для выполнения других действий над рабочими книгами. • Рабочие листы представлены объектами Sheet, ссылки на которые хранятся в коллекции Sheets. Объекты Sheet содержат методы, позволяющие добавлять, удалять, копировать и перемещать рабочие листы. Проверьте себя 1. В чем разница между свойством и методом? (См. раздел ''Свойства и методы объектов".) 2. Как добавить новый объект в коллекцию? (См. раздел ''Работа с коллекциями".) Урок 3. Объектная модель Excel 63
3. Каково общее правило присвоения имен коллекциям? (См. раздел 'Табота с коллекциями".) 4. Какой объект является верхним узлом в иерархической структуре объектной модели Excel? (См. раздел "Иерархия объектов".) 5. Как присвоить имя только что созданной рабочей книге? (См. раздел "Объект Workbook".) 6. Как получить ссылку на активный в данный момент рабочий лист? (См. раздел "Объект Workbook".) 64 Часть L Пятница. Вечер
УРОК Синтаксис и данные в языке VBA Содержание урока ^ Основы синтаксиса VBA ^ Как использовать константы •• Как объявлять программные переменные ^ Типы данных, предусмотренные для сохранения числовых, текстовых и других значений ^ Ранняя и поздняя привязка ^ Статические и динамические массивы ^ Пользовательские и перечислимые типы данных у Область видимости переменных ФВ языке VBA содержится мощный набор инструментов, предназначенных для управления данными (и это важно, поскольку каждая программа Excel обрабатывает данные того или иного типа). В этом уроке рассматривается ряд вопросов, зоминут связанных С обработкой данных различных типов в приложениях Excel, в частности, будут описаны способы сохранения данных в процессе выполнения программы. Однако вначале мы рассмотрим основы синтаксиса языка VBA. Основы синтаксиса VBA Понятие синтаксиса в языках программирования имеет много общего с аналогичным понятием обычных языков (русского, английского и т.п.). Так называется совокупность правил, определяющая порядок использования
и организации элементов данного языка. Например, одним из правил синтаксиса русского языка является следующее: предложение должно заканчиваться точкой. Поэтому прежде, чем приступить к написанию собственного кода VBA, необходимо ознакомиться с синтаксисом этого языка программирования. Коды программы VBA состоят из выражений (statements). В каждой строке кода, как правило, располагается одно отдельное выражение. Но данное правило имеет исключения: • несколько выражений могут быть расположены в одной строке и разделены двоеточием; • использование символа продолжения строки (пробел, за которым следует символ подчеркивания) позволяет создавать выражение, занимающее несколько строк. Не рекомендуется использовать первый прием для расположения нескольких выражений в одной строке, поскольку реальной пользы это не принесет, но сами коды могут при этом стать более сложными для чтения и восприятия. Вторая же возможность, которая состоит в использовании символа продолжения строки, может быть действительно полезной. Некоторые строки кода оказываются слишком длинными и не помещаются целиком в пределах видимой области окна редактирования, что делает неудобным их чтение и редактирование. Чтобы разбить строку в определенной позиции, наберите пробел, затем символ подчеркивания (_) и нажмите клавишу <Enter>. Не допускается использовать символ продолжения строки только внутри заключенных в кавычки строк. Рекомендуется продолжение каждой строки выделять отступом. Для VBA это не имеет никакого значения, но зато при чтении кодов вашей программы каждому будет понятно, что это продолжение предыдущей строки, а не начало новой. Комментарии в кодах VBA комментариями (comments) называется текст, который игнорируется и никак не влияет на ход выполнения программы. Вы можете (и должны) использовать комментарии для добавления сопроводительных пояснений о том, как работает программа, значения каких аргументов требуется передавать процедурам. Советуем добавлять любые замечания, которые в будущем могут оказаться полезными вам или другим программистам. Один из способов создания комментария состоит в использовании символа апострофа (единичные кавычки). Все, что будет набрано от апострофа и до конца текущей строки, считается комментарием. Символ апострофа может быть набран как вначале строки, так и внутри нее: ' Это комментарий Dim MyWB As Workbook ' Это тоже комментарий Для обозначения комментариев можно также использовать ключевое слово REM (образовано от слова "remark" •— замечание). Обратите внимание, что слово REM обязательно должно быть указано в начале строки: REM Это комментарий Dim MyWB As Workbook REM A это не комментарий Вы увидите, что в редакторе VBA комментарии отображаются другим цветом — по умолчанию зеленым. 66 Часть 1. Пятница. Вечер
Символ апострофа можно использовать с целью '"перевода в разряд комментариев" отдельных фрагментов кода программы. Такая возможность оказывается полезной в тех случаях, когда требуется проверить, как будет работать программа без отдельных, уже набранных строк кода. Не удаляйте эти строки, а просто превратите их в комментарии. В дальнейшем, если вы захотите вновь вернуть строку "в строй", просто удалите набранный перед ней символ апострофа. Форматирование кодов Так называемые пробельные символы (white space) в кодах программы (обычные пробелы, символы табуляции и пустые строки) игнорируются программой VBA, однако вы с успехом можете использовать их для визуального форматирования кодов, чтобы сделать их более удобными для чтения и восприятия. Добавляйте пустые строки, чтобы визуально отделить фрагменты кодов, функционально не зависящие друг от друга, а также добавляйте к выражениям большие или меньшие отступы, в зависимости от их отношения к другим выражениям. (Детально ознакомьтесь с материалом этого урока, а также урока 6, в котором изложена подробная информация о выражениях VBA, и смысл приведенных выше рекомендаций станет для вас более понятным.) Использование констант Константами (constant) называются данные, которые не изменяются в ходе выполнения программы. В языке VBA различают константы двух типов: литеральные (literal) и символьные (symbolic). Литеральные константы набираются непосредственно в кодах программы и могут представлять собой числа и строки (текстовые значения). Строковые константы должны заключаться в двойные кавычки. Например: МояСтрока = "четыре" МоеЧисло = 4 В данном случае значения "четыре" и 4 являются литеральными константами. Что касается числовых значений, VBA распознает их экспоненциальную запись и (с использованием префикса &Н) шестнадцатеричную запись: 1.2Е5' число 1,2, умноженное на 10 в пятой степени, т.е. 120000 &HFE ' эквивалентно десятичному числу 254 Шестнадцатеричная система исчисления основана на использовании 16 цифр, тогда как привычная нам десятеричная система построена на применении десяти цифр. В шестнадцатеричной системе цифры от О до 9 обозначают первые десять цифр (как и в десятичной системе), а для обозначения последующих шести цифр используются первые шесть букв латинского алфавита (от А до F). Символьные константы имеют собственные имена. Если в коде программы возникает необходимость в использовании значения такой константы, следует указать ее имя. Определяются символьные константы с помощью ключевого слова Const: Const ИмяКонетанты = ЗначениеКонстаиты В качестве имени константы можно использовать любое допустимое в языке VBA имя (см. врезку "Правила выбора имен в языке VBA"). ЗначениеКонстаиты — это литеральная, числовая либо строковая константа, определяющая значение создаваемой символьной константы. Например: Const МоеИмя = "Питер" Const МойВозраст =30 Урок 4. Синтаксис и данные в языке VBA 67
Символьные константы обладают двумя преимуществами. Имя такой константы может (и должно) быть описательным, что значительно упрощает чтение кодов программы. Однако более важно следующее: если возникнет необходимость изменить значение константы в кодах программы, то достаточно будет сделать это только в одном месте — там, где она была объявлена. Согласно общепринятому соглашению, имена констант набираются исключительно прописными буквами, тогда как имена других элементов, например, переменных, состоят из комбинаций прописных и строчных букв. Например, имя ПРО- ЦЕНТНАЯ_СТАВКА соответствует константе, а имя ПроцентнаяСтавка принадлежит переменной. Для программы VBA это правило не имеет никакого значения, однако, следуя ему, вы сможете довольно просто отличить в кодах программы имена констант от имен переменных. Правила выбора имен в языке VBA Эти правила в языке VBA распространяются на символьные константы, переменные, свойства и практически на любые другие элементы, которым в кодах программы могут присваиваться имена. Итак, в языке VBA имена должны соответствовать следующим требованиям: • начинаться с букв; • состоять не более чем из 255 символов; • не совпадать с ключевыми словами VBA; • не содержать в себе точек, пробелов, а также символов !, @, #, &, % и $. Старайтесь давать переменным и прочим элементам описательные имена, по которым можно было бы определить их назначение в контексте программы. Поскольку использование пробелов не допускается, имена, состоящие из нескольких слов, можно образовать путем чередования строчных и прописных букв (например, ПроцентнаяСтавка) или вместо пробелов использовать символ подчеркивания (например, Итог_2003). Регистр символов не имеет значения, потому имена Сумма, сумма и СУММА считаются в языке VBA идентичными. Объявление и использование переменных Как нетрудно догадаться, переменные содержат в себе значения, изменяемые в ходе выполнения программы. В языке VBA каждая переменная характеризуется своим типом (type), от которого зависит, какого рода данные в ней могут храниться. Создавая или объявляя переменную, вы определяете также ее тип. В простейшем случае синтаксис объявления переменной состоит из одного выражения, включающего в себя: • ключевое слово Dim; • имя переменной; • ключевое слово As; • название типа переменной. Объявление переменной в кодах программы выглядит следующим образом: Dim ИмяПеременной As тип В одной строке можно объявить сразу несколько переменных: Dim ИмяПеременной^! As тип1, ИмяПеременной2 As тип2, ... 68 Часть 1. Пятница. Вечер
Имена переменных должны быть составлены с учетом тех же правил, которые были рассмотрены ранее в этом уроке. Имя переменной должно быть уникальным в пределах ее области видимости. Подробнее об области видимости будет рассказано далее в этом уроке. Объявление переменных и выражение Option Explicit Недостатком языка VBA является то, что он позволяет программистам обходиться без объявления переменных. Такой порядок используется в языке VBA по умолчанию — вы просто добавляете новые переменные по мере необходимости, не заботясь об их объявлении или об использовании ключевого слова Dim. Если такой путь кажется вам наиболее простым и очевидным, что же в этом плохого? Добавление переменных без их объявления приводит к возникновению ряда ошибок. Например, если вы случайно неправильно наберете имя переменной, программа просто воспримет это как добавление новой переменной с другим именем. В результате вы столкнетесь с некоторыми проблемами. Кроме того, если вы сами не объявите переменную, для нее автоматически будет выбран тип Variant, в результате доступные системные ресурсы будут использованы крайне нерационально. Если же необходимость объявления переменных активизирована, VBA автоматически распознает неправильно набранные имена переменных как "необъявленные", что избавляет вас от многих проблем, о которых было сказано выше. Кроме того, поскольку вам придется явно объявлять каждую переменную, вы сможете подобрать такие типы данных, которые наилучшим образом будут подходить для сохранения обрабатываемых значений. Чтобы активизировать необходимость объявления переменных, добавьте выражение Option Explicit в каждом модуле перед началом всех процедур. Вы можете активизировать также эту возможность (что я вам настоятельно рекомендую), выбрав команду Tools=>Options (Сервис^^Параметры). В открывшемся диалоговом окне на вкладке Editor (Редактор) установите флажок опции Require Variable Declaration (Объявление переменных обязательно). Числовые переменные Числовые типы данных VBA могут быть разделены на две категории. Осталось 20минут ф Целочисленные. Числа, не содержащие дробной части (например, -5, 1, 1234 и т.п.). • С плавающей запятой. Числа, содержащие дробную часть (например, 1,01 или-0,06.). К каждой из этих категорий относится три разных типа, отличающихся диапазоном допустимых значений и (это касается типов с плавающей запятой) точностью определения принимаемых значений. Обобщенная информация об этих типах представлена в табл. 4.1. При объявлении переменных определиться с тем, какой тип выбрать — целочисленный или с плавающей запятой — несложно. Во всех случаях, когда это возможно, следует отдавать предпочтение именно первому из них, поскольку значения целочисленных типов занимают меньше памяти и быстрее обрабатываются (хотя, справедливости ради, следует заметить, в мощных современных компьютерах вы эту разницу вряд ли заметите). В пределах же одной категории следует выбирать тот тип данных, диапазон и точность которого окажутся достаточными для сохранения и обработки значений, передаваемых этой переменной. Обратите внимание, что тип данных Currency специально предназначен для представления денежных значений. Урои 4. Синтаксис и данные в языке VBA 69 Э
Таблица 4.1. Числовые типы данных VBA Тип Byte Integer Long Single Double Currency Категория Целочисленный Целочисленный Целочисленный С плавающей запятой С плавающей запятой С плавающей запятой Диапазон от 0 до 255 -32 768 до 32 767 -2 147 483 648 до 2 147 483 647 -3,4x1038 до 3,4x1038 * -1,79x10308 до 1,79x10308 * -9,22x1011 до 9,22x1011 * Точность нет нет нет 6 знаков 14 знаков 4 знаков * Приблизительные значения При объявлении числовых переменных им изначально присваивается нулевое значение. Строковые переменные Переменные типа String (строковые переменные, или строки) используются для хранения и обработки текстовых данных. Строки переменной длины могут включать любое количество символов (приблизительно до д,вух миллиардов). Вам не придется беспокоиться о длине строки, поскольку она автоматически будет увеличиваться до размеров, достаточных для сохранения передаваемых данных. При объявлении переменных этого типа используется ключевое слово String: Dim Имя As String Другой тип строковых переменных в языке VBA называется строками фиксированной длины. Максимальная длина таких строковых переменных определяется в момент их объявления, она может колебаться в пределах от 1 до 64 000 символов. Чтобы объявить строковую переменную фиксированной длины, после ключевого слова String наберите символ * (звездочка) и затем число, соответствующее максимальному количеству символов: Dim СтрокаФиксированнойДлины As String * 12 Бели строковым переменным фиксированной длины присваиваются строки, состоящие из большего количества символов, чем объявлено для этой переменной, лишние символы просто отбрасываются. Например: Dim строка As String * 5 строка = "New York" В результате выполнения этого кода переменная строка будет содержать значение "New Y" (помните, что пробелы также считаются символами). Некоторые строки, например "1234", могут выглядеть как числовые значения. Для VBA, однако, это просто строка, она не может быть использована в числовых вычислениях. Проверить, что последовательность цифр сохраняется именно как строка, можно, начав ее с нуля. Если цифры сохранены в виде строки, ноль будет отображаться. В VBA включены инструменты, которые позволяют преобразовывать строковые значения в числовые. Эти инструменты будут рассмотрены в уроке 10. 70 Часть 1. Пятница. Вечер
Переменные даты в языке VBA термином дата обозначаются как собственно значения даты, так и значения времени. Даты отображаются в числовом виде как значения с плавающей запятой. Целая часть такого значения определяет дату как количество дней, прошедших, начиная с 30 декабря 1899 года (предшествующие этой дате дни определяются с помощью отрицательных чисел), а дробная часть указывает время дня как дробную часть от 24-часового интервала. К счастью, вам никогда не придется непосредственно столкнуться с этим числовым представлением даты и времени, поскольку в VBA представлены мощные инструменты, которые позволяют работать с датами, представленными в более привычном и удобном формате. Подробнее о них будет рассказано в уроке 8. Тип данных Date специально предназначен для обработки информации о дате и времени. Чтобы указать значение даты, наберите его в любом из широко распространенных форматов между двумя символами решетки (#). Например: Dim день1 As Date, день2 As Date, деньЗ As Date день1 = #Март 1, 2004# день2 = #1/1/2004# деньЗ = #Июль 4, 2004# Переменные-объекты Переменные типа Object могут содержать ссылку на любой объект. Такая возможность используется нечасто, поскольку при объявлении переменных требуется указывать, значения какого именно типа они будут принимать. Например: Dim ОбщийОбъект As Object Dim КонкретныйОбъект As Worksheet Объявленная таким образом переменная ОбщийОбъект может содержать ссылку на самые различные объекты, тогда как переменная КонкретныйОбъект содержит только ссылку на объекты Worksheet (т.е. на рабочие листы). На первый взгляд может показаться, что лучше объявлять переменные с использованием типа данных Object, поскольку он предоставляет более широкие возможности. Однако это не совсем так, и вот почему. Использование типа данных Object называется поздней привязкой (late binding). Программа изначально не знает, ссылку на объект какого именно типа будет содержать переменная. Это становится известно только после того, как программа начинает работать и переменной, наконец, присваивается какое-то значение. Данное обстоятельство несколько замедляет работу программы, но не это самое главное. Гораздо важнее, что в таком случае недоступной будет возможность Auto List редактора VBA. Если вы объявляете переменную с использованием какого-то конкретного объектного типа, это называется ранней привязкой {early binding), VBA изначально знает, ссылки на объекты какого именно типа будет содержать такая переменная, что позволяет в процессе редактирования кодов программы использовать возможность Auto List, отображающую список методов и свойств объектов данного типа. Это может быть действительно удобно. Объявление переменных-объектов определенного типа не следует путать с таким действием, как инициализация переменных. Например: Dim WS As Worksheet ¥рок 4. Синтаксис и данные в языке VBA 71
jmnmk l|jq5^| активизировать возможноаь Auto List выберите команду Toois<=>Options ■^B^w (СервисеПараметры) и на вкладке Editor (Редактор) открывшегося диалогового окна ^BSB^ установите флажок опции Auto List Members (Автоматическое отображение списка компонентов). Если данная возможность активна, при наборе названия переменной- объекта и следующей за ним точки редактор отобразит список методов и свойств объектов этого типа, из числа которых можно выбрать требуемый компонент. После выполнения этой строки создается переменная ws, затем указывается, что она будет ссылаться на объекты типа Worksheet. Однако в настоящий момент она ни на что не ссылается, так как содержит значение Nothing. Чтобы инициализировать данную переменную, необходимо передать ей конкретную ссылку, например: Set ws = Worksheet.Add Теперь переменная ws ссылается на новый рабочий лист, созданный в результате вызова метода Add. Ключевое слово Set должно использоваться каждый раз, когда переменной присваивается ссылка на объект. Как правило, ссылка на объект извлекается из коллекции — это либо уже существующий элемент коллекции, либо он создается в результате вызова метода Add. В некоторых ситуациях, однако, требуемой коллекции может и не быть, тогда для создания объекта необходимо использовать ключевое слово New. Синтаксис подобного выражения выглядит следующим образом: Set ПеременнаяОбъект = New НазваниеОбъекта В одном выражении можно также совместить объявление с инициализацией переменной: Dim ПеременнаяОбъект As New НазваниеОбъекта Переменные типа Boolean Переменные, объявленные с использованием типа Boolean, могут принимать одно из двух значений— True (ИСТИНА) и False (ЛОЖЬ). Такие переменные и свойства (иногда называемые логическими) в кодах программы часто используются для представления и обработки данных: да/нет, принять/отказать и т.п. Логическим переменным в момент объявления автоматически присваивается начальное значение False. В языке предусмотрены ключевые слова True и False для обозначения соответствующих логических значений: Dim Обновить As Boolean Обновить = True Тип Variant в VBA тип Variant имеет настолько же широкие возможности, как и тип, используемый по умолчанию. Более того, если в момент объявления переменной ее тип не указывается, она создается как переменная типа Variant: Dim X'Объявление переменной X типа Variant Можно также непосредственно указать этот тип данных: Dim X As Variant 72 Часть I. Пятница. Вечер
Переменные, объявленные с использованием типа Variant, могут принимать значения практически всех типов, однако они не могут использоваться для представления строк фиксированной длины и для работы с типами, определенными пользователем. Таким образом, переменная типа Variant может содержать целочисленные значения, числа с плавающей запятой, строки или ссылки на объекты. Переменная Variant содержит целый массив. Недостаток этого типа состоит в том, что для сохранения его значений требуется больше памяти, а для их обработки — большее количество системных ресурсов. Следовательно, вы следует злоупотреблять использованием типа Variant лишь потому, что в таком случае вам можно не беспокоиться о выборе более специфического типа данных. Ограничьте применение данного типа только теми ситуациями, в которых его универсальность действительно оказывается востребованной. Приведем приблизительный перечень подобных ситуаций. • Для представления данных, которые на разных этапах выполнения программы могут интерпретироваться как числовые и как текстовые. • Для представления аргументов процедуры, которым могут передаваться значения разных типов. • Для сохранения данных из ячеек рабочего листа, если изначально не известно, значения каких именно типов могут содержаться в этих ячейках. О методах работы с аргументами процедур будет рассказано уроке 1, а вопросы, связанные с извлечением значений из ячеек рабочего листа, рассматриваются в уроке 10. э Работа с массивами Массивы позволяют сохранять в одном месте целые наборы элементов данных. iflSyin Массив имеет собственное имя, а доступ к отдельным его элементам осуществляется с помощью числовых индексов. В момент создания массива указывается какой- то определенный тип данных VBA, и все элементы этого массива соответствуют именно этому типу данных. Массивы удобны, поскольку позволяют сохранять водном месте наборы взаимосвязанных значений. Предположим, что программа должна обработать итоговые значения объемов продаж по каждому из 12 месяцев прошедшего года. Вы можете создать массив из 12 элементов и значение данного показателя за январь сохранить, например, как первый элемент этого массива, значение по февралю — как второй элемент и т.д. Использование массивов для работы с данными во многих случаях упрощает задачу написания кодов программы и делает их более удобными для чтения и восприятия. В VBA предусмотрено использование массивов двух типов — статических и динамических. Статические массивы Общее количество элементов статического массива строго определено. Размер массива (количество его элементов) определяется в момент его объявления, ООН остается неизменным в течение всего процесса выполнения программы. Синтаксис объявления массива имеет следующий вид: Dim ИмяМассива (л) As Тип ИмяМассива должно удовлетворять стандартным правилам присвоения имен языка VBA, а Тип может быть любым предусмотренным в языке VBA типом данных. Размер массива определяется параметром п. В действительности размер Урок 4. Синтаксис и данные в языке VBA 73
массива будет на единицу большим числа п, поскольку нумерация элементов массивов VBA начинается с индекса 0. Поэтому массив, объявленный как Dim МойМассив(50) As Integer состоит из 51 элемента, все они будут пронумерованы индексами от О до 50. Вы получите доступ к элементам массива, если укажете имя массива и заключенное в скобки значение индекса: МойМасив(О) = 1 МойМассив(25) = 73 В качестве индекса могут указываться целочисленные переменные или константы: Dim idx As Integer idx = 12 МойМассив(idx) = 44 ' Равнозначно использованию записи МойМассив(12) Если вы не хотите, чтобы отсчет индексов массива начинался с нуля, можете воспользоваться одним из двух вариантов. Один из них состоит в добавлении выражения Option Base 1 в начале модуля за пределами всех процедур. В результате для всех массивов данного модуля отсчет индексов будет начинаться с единицы, а не с нуля. Другой вариант является более гибким и заключается в объявлении массива с использованием ключевого слова То: Dim ИмяМассива{НижняяГраница То ВерхняяГраиица) As Тип Значения НижняяГраница и ВерхняяГраиица должны быть целочисленными, причем первое обязательно должно быть меньше второго. Например: Dim МойМассив(20 То 40) As Long Массивы с одним индексом называются одномерными. Чтобы создать массив с двумя или нескольким индексами, укажите их в момент объявления массива. Dim Двухмерный(10, 10) As Single Такой массив состоит из 121 элемента, он начинается элементом Двухмерный (О, 0) и заканчивается элементом Двухмерный (10, 10). Первая размерность включает в себя 11 элементов, вторая — еще 11. Общее количество элементов массива вычисляется как произведение числа 11 на число 11. При объявлении многомерных массивов также можно использовать ключевое слово То: Dim ШахматнаяДоска (1 То 8, 1 То 8) As String В VBA не предусмотрено никаких ограничений на максимально допустимое количество элементов массива и на количество его размерностей. На практике, однако, и первая, и вторая характеристика ограничены доступными объемами системной памяти и дискового пространства, но эти ограничения вряд ли когда-нибудь вам смогут помешать. В случае, если ваша система работает довольно медленно по причине недостаточного количества доступной памяти или дискового пространства, работа с массивами больших размеров может усугубить ситуацию. Если какая-то процедура попытается обратиться к несуществующему элементу массива, это вызовет ошибку выполнения программы. Например, если массив объявлен как Dim МойМассив (20) As Integer, то при введении выражения МойМассив (21),МойМассив (30) и т.п., возникнет ошибка. 74 Часть L Пятница. Вечер
Динамические массивы Размер динамических массивов не является фиксированным. В ходе выполнения программы он может увеличиваться и уменьшаться по мере необходимости. Динамический массив объявляется с помощью пустых скобок: Dim ДинамическийМассив() As Тип Прежде чем приступить к использованию массива, необходимо определить его размер с помощью выражения ReDIm: ReDim ДинамическийМассив{размер) Аргумент размер определяет как размерность массива, так и количество элементов в каждой размерности. Например: Dim Динамический!() As String Dim Динамический2() As Integer Dim ДинамическийЗ() As Obj ect ReDim Динамический!(100) ReDim Динамический2(-5 To 5) ReDim Динамический2(5, 5, 5) ! размерность, !0! элемент ! размерность, !! элементов с -5 по 5 3 размерности, всего 2!б элементов Выражение ReDim не позволяет изменять тип динамического массива, однако с его помощью вы можете изменять размер этого массива любое количество раз. Как правило, при использовании выражения ReDim все прежние значения массива теряются. Чтобы сохранить уже имеющиеся данные (по возможности), добавьте к выражению ReDim ключевое слово Preserve: ReDim Preserve Динамический(!О О) Существуют следующие ограничения на сохранение данных с помощью ключевого слова Preserve: • если размер массива уменьшается, значения отбрасываемых элементов теряются; • для многомерных массивов вы можете изменять только объем последней размерности; • вы не можете изменять количество размерностей. В листинге 4.1 представлен пример использования динамического массива. Чтобы применить данйую программу на практике, расположите курсор над верхней ячейкой столбца числовых значений и затем запустите программу. Программа пройдет вниз по ячейкам столбца и скопирует все его значения, сохранив их как элементы массива. Для каждой очередной ячейки программа будет использовать выражение ReDim, с помощью которого добавляются новые элементы массива. Когда будет достигнута пустая ячейка, программа просуммирует значения всех элементов массива. В результате будет получено итоговое значение, которое затем помещается в ячейку под исходным столбцом значений. Ниже йеречислены действия, которые необходимо выполнить для создания и выполнения данной программы. 1. В Excel на рабочем листе наберите столбец числовых значений. 2. Нажмите клавиши <Alt-l-Fl 1>, чтобы открыть редактор VBA. 3. В окне Project Explorer дважды щелкните на названии рабочего листа, в котором вы набирали числовые значения. Откроется окно редактора кодов. Урок 4. Синтаксис и данные в языке VBA 75
4. В открывшемся окне наберите коды, представленные в листинге 4.1. 5. Опять вернитесь к окну Excel и разместите курсор над верхней ячейкой столбца. 6. Нажмите клавиши <Alt-f-F8>, чтобы открыть диалоговое окно Макрос. 7. Выберите макрос SumColumn и затем щелкните на кнопке ВыполнитьГ В данной программе используются некоторые элементы языка VBA, с которыми вы пока еще мало знакомы. Возможно, вы сами догадаетесь об их назначении. Сосредоточьте свое внимание на представленном далее способе использования динамического массива. Листинг 4.1. Пример использования динамического массива Public Sub SumColumnО Dim data О As Single Dim total As Single Dim count As Integer Dim i As Integer Dim finished As Boolean count = 0 Do count = count + 1 ReDim Preserve data(count) data(count) = ActiveCell.Value ActiveCell.Offsetd, 0) .Activate If ActiveCell.Value = "" Then finished = True Loop Until finished For i = 1 To Ubound(data) total = total + data(i) Next ActiveCell.Value = total End Sub Определение размеров массива В VBA существуют две функции, которые позволяют определить размеры любого массива. В частности, они предоставляют возможность определить наименьший и наибольший допустимый индекс массива: UBound(ИмяМассива, размерность); LBound(ЯмяМассива, размерность) . Функция UBound возвращает наибольший, а функция LBound — наименьший допустимый индекс заданного массива. Аргумент размерность является необязательным, он определяет, индекс какой размерности массива требуется вернуть. По умолчанию его значение равно единице. Например: Dim МойМассив(1 То 5, 10 То 25) X = LBound(МойМассив)' Возвращает 1 X = UBound(МойМассив, 2) ' Возвращает 25 76 Часть L Пятница. Вечер
Определенные пользователем типы Определенные пользователем (т.е. программистом) типы (далее для удобства мы будем обозначать их аббревиатурой ОПТ) служат инструментом определения специальных элементов данных, которые наилучшим образом подходят для обработки той или иной специфической информации. Такие типы могут содержать от двух и более элементов. Каждый элемент может быть либо переменной, либо массивом. Для определения соответствующего типа используйте выражение Type...End Туре: Туре НазваниеТипа ИмяЭлемента! As Тип ИмяЭлемента2 As Тип End Туре Каждый элемент объявляется с учетом стандартных правил объявления переменных. При этом для элементов могут быть выбраны любые доступные типы данных. Элемент может быть также массивом либо экземпляром другого объявленного вами типа. Приведем пример определения ОПТ, предназначенного для представления информации о сотрудниках: Туре СотрудникИнфо Имя As String Фамилия As String Код As String * 10 Стаж As Date Страховка As Boolean Оклад As Currency End Type Посмотрим, что происходит при выполнении каждой строки этого кода. • Первой строкой начинается определение данного типа. • Во второй строке объявляется первая переменная ОПТ — Имя типа String. • В третьей строке объявляется вторая переменная ОПТ — Фамилия типа String. • В последующих строках объявляются другие переменные ОПТ. • Последней строкой завершается определение данного типа. Код определения ОПТ должен помещаться в модуле за пределами всех процедур. После того, как ОПТ будет определен, вы можете использовать его, как и другие стандартные типы VBA, при объявлении переменных. Например: Dim Сотрудник As СотрудникИнфо Dim ВсеСотрудники(100) As СотрудникИнфо Для получения доступа к элементам (переменным) ОПТ используется синтаксис имя. элемент. Например: Сотрудник.Имя = "Степан" Сотрудник.Фамилия = "Петров" ВсеСотрудники(1).Имя = "Никодим" Перечислимые типы Перечислимые типы данных состоят из наборов символьных констант, указанных программистом. Переменные, объявленные с использованием перечис- Урок 4. Синтаксис и данные в языке VBA 77
лимого типа, могут принимать только одно из предустановленных значении. Создание и работа с такими типами удобна в тех случаях, когда природа самих данных такова, что переменные должны принимать только некоторые строго определенные значения. Например, это могут быть названия дней недели. Используя перечислимый тип, содержащий названия семи дней недели, вы точно будете уверены, что соответствующая переменная не примет какое-то нестандартное неверное значение. Перечислимые типы определяются с помощью выражения Enum...End Enum: Enum ИмяТипа Элемент! Элемент2 End Enum Например: Enum Наполнитель Ваниль Шоколад Земляника Кофе End Enum Каждой константе перечислимого типа присваивается числовое значение. Если вы сами не укажите эти значения, они будут присвоены автоматически, начиная с нулевого и далее в порядке возрастания. Так, в предыдущем примере константа Ваниль получила значение О, константа Шоколад — значение 1 и т.д. Если это необходимо, можете сами указать требуемые значения: Enum Наполнитель Ваниль = 1 Шоколад = 4 Земляника = 7 Кофе = 16 End Enum Перечислимый тип должен быть определен на уровне модуля за пределами всех процедур (подобно определяемым пользователем типам). После этого такой тип можно использовать при объявлении переменных: Dim Мороженое As Наполнитель Dim Ассортимент(50) As Наполнитель При работе с переменным перечислимых типов Auto List редактора VBA отображает перечень констант данного типа, и это действительно удобно, поскольку вы можете просто выбрать требуемую константу из списка и не набирать ее вручную. Область видимости переменных Переменные, объявленные в программе VBA, остаются доступными для использования только в пределах определенной части данной программы. Этот факт определяется таким понятием, как область видимости переменных, согласно которому каждая переменная доступна только в пределах своей области видимости. Для других частей программы эта переменная, по сути, не существует. Вы можете работать с двумя одинаковыми переменными, которые имеют разную область видимости, и они будут абсолютно независимы друг от друга. В VBA различают три уровня видимости. 78 Часть 1. Пятница. Вечер
• Уровень процедуры. Область видимости ограничена одной конкретной процедурой VBA. • Уровень модуля. Область видимости ограничена одним конкретным модулем (и распространяется на все процедуры этого модуля). • Уровень проекта. Область видимости распространяется на весь проект. Чтобы создать переменную с областью видимости на уровне процедуры, объявите ее с помощью выражения Dim внутри требуемой процедуры. Всегда ограничивайте область видимости переменной уровнем процедуры, если не существует каких-либо веских причин для использования более широкой области видимости. Большинство переменных вашей программы должны иметь именно такую область видимости. Чтобы создать переменную с областью видимости на уровне модуля, объявите ее, используя выражение Dim, внутри этого модуля за пределами всех процедур. Такой уровень видимости применяется в тех случаях, когда доступ к данной переменной необходим сразу нескольким процедурам этого модуля (подобная ситуация возникает при работе с процедурами свойств, о которых будет рассказано в уроке 26). Тот же эффект может быть достигнут в том случае, если вместо слова Dim используется ключевое слово Private: Private Total As Integer Область видимости на уровне проекта бывает двух видов. Если переменная объявляется с помощью ключевого слова Public, ее область видимости распространяется на все модули данного проекта, а также на все открытые в данный момент проекты VBA. Если в начале модуля будет добавлено выражение Option Private Module, область видимости переменной, объявленной с помощью ключевого слова Public, ограничивается пределами данного проекта. Если области видимости двух переменных с одинаковым именем пересекаются, приоритет имеет та переменная, область видимости которой меньше. При выборе области видимости для переменной следует использовать как можно более ограниченную область. Большая часть переменных программы имеет область видимости на уровне процедуры. Изолируя переменные в пределах процедуры, вы исключаете тем самым возможность непреднамеренного изменения их значений и существенно уменьшаете вероятность возникновения ошибок. Если необходимо передать информацию от одной процедуры к другой, используйте возможности возвращения процедурами значений и передачи процедурам значений аргументов. Прибегайте к помощи переменных с более широкой областью видимости только лишь в крайних случаях, при этом необходимо внимательно следить за корректностью их использования. э Обзор Практически все программы Excel создаются с целью обработки какой-то ин- готойо! формации. ВОЗМОЖНОСТИ VBA в этом плане практически неограничены. Различные типы данных могут быть использованы для работы с самыми разными значениями, в том числе с числовыми значениями, с текстом, с датами и со ссылками на объекты. В данном уроке были рассмотрены следующие вопросы. • Основы синтаксиса VBA, в том числе правила использования комментариев. • Способы применения символьных и литеральных констант. Урок 4. Синтаксис и данные в языке VBA 79
• Правила VBA о присвоении имен переменным. • Способы объявления переменных. • Типы числовых, строковых и объектных переменных. • Область видимости переменных. • Способы создания и использования статических и динамических массивов. • Использование определенных пользователем и перечислимых типов. Проверьте себя 1. Как разбить выражение VBA на несколько строк? (См. раздел "Основы синтаксиса VBA".) 2. Назовите два способа создания комментариев. (См. подраздел "Комментарии*'.) 3. Назовите преимущества использования символьных констант. (См. раздел "Использование констант".) 4. Требуется ли применять выражение Option Explicit при написании программ? Поясните ответ. (См. врезку "Объявление переменных и выражение Option Explicit**.) 5. Какой тип данных предназначен для работы с денежными значениями? (См. подраздел "Числовые переменные**.) 6. Какое выражение используется для создания определенного пользователем типа? (См. подраздел "Определенные пользователем типы**.) 7. Когда необходимо использовать тип данных Object? (См. подраздел "Переменные-объекты**.) 8. Что означает термин область видимости переменных? (См. раздел "Область видимости переменных**.) 80 Часть 1. Пятница. Вечер
ЧАСТЬ Пятница. Вечер. Обзор 1. Что такое программа? 2. Как запустить редактор VBA из Excel? 3. Как вставить новый модуль в проект VBA? 4. Назовите простейший способ копирования кодов из одного проекта VBA в другой. 5. Что такое свойство? 6. Как создается абсолютная ссылка на ячейку? 7. В чем различие между свойствами и методами объектов? 8. Всегда ли при вызове метода необходимо передавать аргументы в том порядке, в котором они были объявлены? 9. Какой оператор VBA применяется для организации прохождения по всем членам коллекции? 10. В каких случаях в программе, работающей в Excel, необходимо использовать ключевое слово Application? 11. Как можно сохранить копию рабочей книги под новым именем, оставив при этом название исходной книги без изменений? 12. Какой метод следует использовать для вывода текущей рабочей книги на печать? 13. Как получить ссылку на активный рабочий лист текущей рабочей книги? 14. Каким образом в кодах программы можно изменить название рабочего листа (которое отображается на его корешке)? 15. Как отменить отображение диалогового окна Excel о подтверждении удаления рабочего листа, если команда на удаление указывается в кодах программы? 16. Для каких целей служит ключевое слово Nothing? 17. Как в кодах VBA определить, сколько именно листов содержится в данный момент в текущей рабочей книге? 18. Какое назначение свойства Workbook. GreatеВаскир? 19. Как получить полное имя файла (с указанием пути) рабочей книги? 20. Если в Excel открыто несколько рабочих книг, как сделать активной требуемую книгу? 82 Часть I. Пятница. Вечер. Обзор
21. Как определить, сохранялась ли рабочая книга после внесения в нее последних изменений? 22. Какие ограничения (если они есть) существуют на использование символа продолжения строки в кодах VBA? 23. Какими правилами VBA регулируется применение отступов в кодах программы? 24. Каким образом в языке VBA фиксируется информация о датах? 25. Массив VBA был объявлен таким образом: Dim Data (100) As Integer. Из какого количества элементов он состоит? 26. Как в кодах программы определить размер массива? 27. Что такое область видимости переменной? 28. Как следует объявить переменную, область видимости которой должна распространяться на весь проект? Часть I. Пятница. Вечер. Обзор 83
м J^ Ш \ ^су ббО"!^ > fl i^ ««^
Часть IL Суббота. Утро Урок 5. Операторы Урок б. Управляющие конструкции Урок 7. Процедуры и модули Урок 8. Работа со значениями доты и времени Урок 9. Работа с текстом Урок 10. Использование диапазонов и выделенных областей Часть III. Суббота. День Урок 11. Работа со столбцами, строками и ячейками Урок 12. Программирование с помощью формул Урок 13. Программирование с использованием встроенных функций Excel Урок 14. Форматирование рабочего листа Урок 15. Операции поиска и замены Урок 16. Создание пользовательских панелей инструментов Часть IV. Суббота. Вечер Урок 17. Основы построения диаграмм Урок 18. Профессиональные средства построения диаграмм Урок 19. Использование экранных форм для создания пользовательских диалоговых окон Урок 20.
УрШШ Урок 8ж Pa6Qmiii:o3i Урока Ра
УРОК Операторы Содержание урока ^ Оператор присвоения ^ Числовые и текстовые операторы ^ Логические операторы ^ Операторы сравнения ^ Приоритет операторов Оператор — это символ, который дает указание программе выполнить определенное действие над имеющимися данными. Таким действием может быть, например, сложение двух чисел. Операторы являются основными элементами мно- Осталось 30минут ГИХ программ, В ТОМ числе программ, выполняющих вычисления и сравнивание числовых значений. В VBA содержится несколько категорий операторов, используемых с данными различных типов и предназначенных для выполнения разных операций. Оператор присвоения Символ равенства (=) в VBA представляет собой оператор присвоения. Он используется для присвоения значения переменной или свойству. Например: X = 5 В этой строке программы переменной х присваивается значение 5. Обратите внимание, что данный оператор имеет значение, отличное от символа равенства в математике, где он используется для обозначения равенства между собой двух отдельных элементов. При использовании оператора присвоения следует учитывать следующие правила.
Слева от оператора присвоения должен находиться элемент, которому можно присвоить значение, т.е. переменная, свойство или (в выражении с ключевым словом Const) константа. Если присваивается ссылка на объект, строка должна начинаться с ключевого слова Set. Элемент справа от оператора присвоения должен представлять собой выражение, т.е. любую формулу, результатом которой является значение. В данном случае термином выражение {expression) обозначается любой код VBA, который можно упростить или привести путем вычислений к числовому или текстовому значению. Таким образом, 5+2-1 — это выражение, потому что его результатом является одно значение б. Аналогично, "Micro" & "soft" — это выражение, так как результатом его оценивания является одно значение "Microsoft". Существуют некоторые ограничения на использование типов данных для двух частей выражения присвоения. • Если числовой переменной присваивается текстовое значение, переменной типа Boolean значение, отличное от True или False, или объектной переменной любое необъектное значение, возникает ошибка. • Если числовой переменной присваивается значение, которое находится за пределами диапазона значений данного типа, возникает ошибка. • Если строковой переменной присваивается числовое значение, это число преобразуется в текстовый эквивалент. • Если значение с плавающей точкой присваивается переменной целого типа, это значение округляется до ближайшего целого числа. Символ = может использоваться также в VBA как оператор сравнения (см. далее в этом уроке). Из контекста всегда понятно, в каком значении применен оператор: для присвоения или для сравнения. Концепция выражения (expression) — важное понятие в программировании. Выражение — это любая конструкция, результатом оценивания которой является значение. Это может быть числовое значение, строка, объектная ссылка или логическое (True/False) значение. Числовые операторы Числовые операторы, которые иногда называют математическими, выполняют действия над числами. Знакомые всем операторы сложения, вычитания, умножения и деления представлены символами +, -, * и /, соответственно. Далее представлены три менее известные операции над числами. • Целочисленное деление (\). Осуществляет деление и возвращает целую часть результата. Таким образом, 11\3 дает результат 3. • Возведение в степень (^). Возводит число в указанную степень. В VBA выражение 4 "^2 означает "четыре во второй степени", или 4^ что равно числу 16. • Остаток от деления, или модуль (mod). Выполняет деление и возвращает остаток. Например, 18 mod 5 дает результат 3. Числа с плавающей точкой в операторе mod округляются до целых. 88 Часть II. Суббота. Утро
э Строковые операторы в VBA существует единственный строковый оператор — оператор конкатена- ^омииут ^^^- ^^ обозначается символом &. Конкатенация— это простое объединение двух строк. Например: Dim si As String, s2 As String, s3 As String si = "Micro" s2= "soft" s3 = si & s2 Первая строка si содержит текст "Micro", вторая строка s2 — "soft". Результатом конкатенации (объединения) этих строк является строка s3, которая содержит текст "Microsoft". Иногда символ + используют для конкатенации. Это устаревшее значение оператора, которое осталось от старых версий VBA; вы не должны использовать его в своих программах. Такой оператор тоже работает, однако советуем применить символ &, чтобы сделать код программы максимально понятным. Несмотря на то, что в VBA существует только один строковый оператор, возможности этого языка в сфере обработки текстовой информации чрезвычайно широки. Возможности по обработке текста, предоставляемые VBA, рассматриваются в уроке 10. Логические операторы Логические операторы работают с логическими (True/False) значениями. Все такие операторы (за исключением оператора Not) обрабатывают два логических значения и возвращают одно из них — True или False. Примеры выполнения логических операций часто встречаются в повседневной жизни. Предположим, что вы решили купить телевизор, однако он должен соответствовать ряду требований: • Диагональ экрана не меньше 36 дюймов. • Стереозвук. • Цена не больше 500 долларов. Ваше решение относительно покупки конкретной модели телевизора логически будет выражено следующим образом: Приобретение TV = (экран 36"?) And (стереозвук?) And (дешевле $500?) В данном случае оператор And используется для того, чтобы указать, что вы купите данный телевизор в том и только том случае, если выполняются все три условия. В VBA существует шесть логических операторов, которые описаны в таблице 5.1. Урок 5. Операторы 89
Таблица 5.1, Логические операторы VBA Оператор Пример Значение True, если: Значение False, если: And Or XOr (исключающее Or) Eqv (эквивалентность) A Eqv В Imp(импликация) A Imp В Not A And В И A, и В имеют значение True А Or В Либо А, либо В имеет значение True А ХОг В А и В имеют разные значения А и В имеют одинаковые значения А имеет значение False, а В имеет значение True или False Not А А имеет значение False А, В или оба имеют значение False А и В имеют значение False А и В имеют одинаковые значения А и В имеют разные значения А имеет значение True, а В имеет значение False А имеет значение True Операторы сравнения Операторы сравнения используются для сравнивания отдельных выражений. Выражение сравнения является логическим, его результат — значение True или False — зависит от используемых данных и операторов. Например, знак равенства — это оператор сравнения, который отвечает на вопрос, равны ли два выражения. Следовательно, выражение 10 = 5 дает результат False. Ниже перечислены операторы сравнения, которые используются по отношению к числам: • = равно; • > больше; • < меньше; • >= больше или равно; • <= меньше или равно; • о не равно. Эти операторы сравнения можно использовать также и для обработки строк (текстовой информации). При сравнении строк понятия "больше" и "меньше" основаны на значениях кода ASCH для символов, из которых они состоят. Поскольку коды ASCII назначались символам с учетом алфавитного порядка, при сравнивании, например строк "apple" и "banana", первая будет воспринята как меньшая. Для представления алфавитных символов, знаков пунктуации и т.п. во внутренних компьютерных вычислениях используются числа. ASCII (American Standard Code for Information Interchange — Американский стандартный код для обмена информацией) — это общепринятый код, который определяет число, соответствующее каждому символу. Список кодов ASCII вы можете найти в электронной справочной системе Visual Basic по ключевым словам ''character set". Однако советуем учесть следующее: символы верхнего и нижнего регистра имеют различные коды ASCII, причем коды символов верхнего регистра меньше, чем коды символов нижнего регистра. Следовательно, по умолчанию в VBA стро- 90 Часть П. Суббота. Утро
ка "Apple" будет меньше (не равна) строки "apple". Как правило, так сравнивать текстовые значения нежелательно, поэтому используйте описанные далее альтернативные способы. Первый из них состоит в следующем: включите в начале модуля VBA, за пределами других процедур, выражение Option Compare Text. В этом случае VBA получает инструкцию о том, что при сравнении строк символы верхнего и нижнего регистра должны считаться эквивалентными, в результате строка "Apple" будет равна строке "apple". Это относится ко всем операциям сравнения строк в рамках данного модуля. Второй способ — использовать функцию VBA UCase или LCase, чтобы преобразовать строку в верхний или нижний регистр и уже после этого выполнить сравнение: UCase(строка!) = UCase(строка2) Данные функции не изменяют исходных строк, а лишь создают их временные копии, представленные символами верхнего регистра, которые затем сравниваются. Последний оператор сравнения строк называется Like. Он определяет, соответствует ли строка заданному шаблону. Этот оператор используется следующим образом: строка Like шаблон Здесь шаблон является строкой, составленной из элементов, которые описаны в табл. 5.2. Используемые элементы и их порядок зависит от того, какое соответствие шаблону вы хотите найти. В табл. 5.3 приведены примеры нескольких шаблонов и показано, какие строки им соответствуют, а какие — нет. Таблица 5.2. Элементы, используемые в шаблонах для оператора Like Элемент шаблона Соответствия Какой-либо символ # [ список] [ 1 список] Этот же символ Любая последовательность символов или их отсутствие Любой отдельный символ Любая цифра Любой символ из списка Любой символ, не входящий в список Таблица 5.3. Примеры шаблонов для оператора Like Шаблон Соответ,ст.вуют, Не соответствуют b [ае] t bat, bet but, bit [a-d] ?? ace, bad, cat, dig fix, apple, coast, vice c?d cad, cod, cud, c!d cook, dad, cd #####-#### Любые девять цифр, разделенные дефисом Все остальное после пятой цифры [! 5] #### Любое пятизначное число, которое не начи- Все остальное нается с 5 Наконец, существует еще один оператор сравнения, который используется для сравнения объектных ссылок. Оператор Is возвращает True, если две ссылки ссылаются на один и тот же объект: СсылкаОбъект! Is Ссылка0бъект2 Урок 5. Операторы 91
Кроме того, оператор Is используется для определения того, что объектная ссылка ни на что не ссылается (т.е. содержит значение Nothing): СсылкаОбъект! Is Nothing Приоритет операторов Результат вычисления некоторых выражений вполне очевиден. Однако более ^о"минут сложные выражения могут быть неправильно интерпретированы начинающими программистами. Рассмотрим следующее выражение: 12 * 3 + 5 Если вначале выполняется умножение, получаем 36 + 5, что в результате дает число 41. Если же сначала выполняется сложение, получаем 12 * 8, и в результате 96. Правила приоритета операторов VBA устраняют подобного рода неоднозначность, поскольку ими определяется порядок выполнения операции. Расположив операторы в порядке от наивысшего приоритета, получим следующий список. • Возведение в степень С). • Умножение (*) и деление (/). • Целочисленное деление (\). • Остаток от деления, или модуль (mod). • Сложение (+) и вычитание (-). • Конкатенация строк (&). В предыдущем примере (12 * 3 + 5) вначале выполняется умножение, а потому результатом этого выражения будет значение 41. Чтобы изменить порядок вычислений, используйте скобки^ Выражение в скобках будет вычислено в первую очередь, независимо от приоритета операторов. Таким образом, выражение 12 * (3 + 5) в результате даст значение 96, так как операция сложения будет выполнена первой. При необходимости можно использовать несколько пар скобок. В таком случае вычисление начинается от самых внутренних скобок и продолжается по направлению к внешним скобкам. Каждая открывающая скобка должна иметь закрывающую пару. Готово! Обзор Если для какого-то выражения порядок выполнения операций однозначно не определяется приоритетом операторов или скобками, вычисления всегда осуществляются слева направо. Язык VBA предоставляет полный набор операторов для составления программ. Операторы, по сути, являются инструкциями, позволяющими разными способами обрабатывать данные и получать на выходе определенные результаты. В этом уроке было рассказано о том, что: • оператор присвоения используется для присвоения значений переменным; • числовые (или математические) операторы выполняют обычные операции над числовыми значениями; • оператор конкатенации объединяет две строки; • логические операторы используются для работы со значениями True/Fal se; 92 Часть и. Суббота. Утро
операторы сравнения позволяют сравнивать различные элементы данных; правила приоритета операторов VBA определяют порядок выполнения операций в процессе вычисления выражений. Проверьте себя 1. Раскройте значение термина "присвоение" в языке VBA. (См. раздел "Оператор присвоения".) 2. Как определить остаток от деления? (См. раздел "Числовые операторы".) 3. В каком случае выражение А ХОг В имеет значение True? (См. раздел "Логические операторы".) 4. Всегда ли при сравнивании строк строка "yes" равна строке "YES"? Поясните ответ. (См. раздел "Операторы сравнения".) 5. Одинаковый ли результат дают выражения А + В/Си(А + В) /С? Поясните ответ. (См. раздел "Приоритет операторов".) Урок 5. Операторы 93
УРОК Управляющие конструкции Ф Содержание урока ^ Оператор If , . . Then ^ Оператор Select Case ^ Оператор Do. . . Loop ^ Операторы For. . .Next и For Each. . .Next Язык программирования VBA включает ряд элементов, которые позволяют управлять ходом выполнения программы. Данные элементы называются управляющими конструкциями. Все эти элементы делятся на следующие категории. Осталось 30минут ф Условные операторы выполняют или не выполняют указанные инструкции, что зависит от соответствия заданным условиям (операторы If ...Then и Select Case). • Операторы цикла выполняют заданный набор инструкций определенное количество раз, что также зависит от соответствия заданным условиям. Это операторы Do...Loop, For..J^ext и For Each..iJext. Чтобы научиться программировать на языке VBA, вам обязательно необходимо понять принципы использования перечисленных выше операторов. W1th...EndWith Конструкцию With...End With нельзя назвать управляющим оператором, так как она не влияет на ход выполнения программы. Тем не менее, в некоторых ситуациях ее удобно использовать как способ упрощения написания кодов программы. Как вы помните, чтобы получить доступ к свойствам или методам объекта, используется такой синтаксис: ИмяОбъекта,НазваниеСвойства
Таким образом, если требуется обратиться сразу к нескольким свойствам или методам одного и того же объекта, то придется неоднократно повторить название данного объекта. Конструкция With...End With позволяет упростить код программы следующим образом: With ИмяОбъекта .Свойство! = Значение! .Свойство2 = Значение2 .Метод! .Метод 2 End With Представленный выше фрагмент эквивалентен следующему: ИмяОбъекта.Свойство! = Значение! ИмяОбъекта.Свойство2 = Значение2 ИмяОбъекта. Метод! ИмяОбъекта.Метод2 Конструкция With...End With придумана исключительно для удобства программистов, однако она может избавить вас от необходимости набора лишних кодов. Оператор If... Then Оператор If. . .Then, сокращенно If, используется в программе для выполнения блока инструкций, если заданное логическое условие выполняется. Кроме того, данный оператор может также выполнять другой блок инструкций, если при вычислении данного условия возвращается значение False. В самой простой форме оператор If выглядит следующим образом: If условие Then блок! End If Если при вычислении выражения условие возвращается значение True, то операторы, обозначенные выше словом блок!, выполняются. Если же возвращается значение False, эти операторы не выполняются. Блок может состоять из одного или нескольких операторов VBA, причем ограничений на размеры этого блока не существует (хотя лучше по возможности сократить количество выполняемых операторов). Если блок состоит только из одного оператора, ключевые слова End If можно опустить; тогда вся конструкция If будет записана в одну строку: If условие Then оператор Существует другой вариант, в котором присутствует слово Else и два блока инструкций: If условие Then блок! Else блок2 End If Если при вычислении выражения условие возвращается значение True, выполняются операторы, обозначенные словом блок!. Если же условие оказывается ложным, выполняются операторы, обозначенные словом блок2. Таким образом, в любом случае выполняется один из этих двух блоков инструкций. 96 Часть IL Суббота. Утро
Последний вариант оператора If позволяет проверить несколько условий благодаря применению ключевого слова Elself. При этом используется такой синтаксис: If условие-1 Then блок-1 Elself условие-2 Then блок-2 Elself условие-п Then блок-л Else блок-Else End If Если в ходе выполнения программы встречается такая конструкция, поочередно проверяются условия, начиная с самого верхнего. Как только будет найдено условие, при вычислении которого возвращается значение True, то выполняется соответствующий ему блок инструкций, после чего программа переходит к выполнению кодов, записанных после ключевого слова End If. Если ни одно условие не возвращает значения True, выполняется блок инструкций, соответствующий ключевому слову Else. Ключевое слово Else и соответствующий ему блок указывать не обязательно. Если они не указаны, то в рамках конструкции If... End I f может вообще не выполняться ни одна строка кода. В листинге 6.1 приведена короткая программа, иллюстрирующая применение оператора I f. Листинг 6,1. Пример использования оператора If Public sub IfDemo О Dim num num = InputBox("Введите число от 5 до 10:") If num < 5 Then MsgBox("3TO слишком маленькое число.") Elself num > 10 Then MsgBox("3TO слишком большое число.") Else MsgBox("Спасибо I") End If End Sub Если требуется проверить достаточно большое количество условий, как правило, вместо многократного использования ключевого слова Elself применяют оператор Select Case. Оба варианта работают одинаково хорошо, однако оператор Select Case, с точки зрения программиста, использовать удобнее. Функция Ilf Применение функции VBA Ilf немного напоминает использование оператора If. . .Then. Эта функция возвращает одно из двух значений, в зависимости от истинности или ложность заданного условия. Функция Ilf имеет следующий синтаксис: Ilf(условие, выр1, выр2) Если при вычислении выражения условие возвращается значение True, функция возвращает значение, получаемое при обработке выражения вырГ, если условие ложно, функция Урок б. Управляющие конструкции 97
возвращает значение, получаемое при обработке выражения выр2. Приведем пример, в котором переменной Z присваивается большее из двух значений — X или Y: Z = Ilf (X > Y, X, Y) 3 Оператор Select Case Оператор Select Case позволяет осуществлять выбор одного из перечисленных гомин^ вариантов. Основой выбора служит значение оцениваемого выражения. Синтаксис оператора Select Case такой: Select Case выражение Case шаблон-1 бЛОК'1 Case шаблон-2 блок-2 Case шаблон-п блок-п Case Else блок-Е18е End Select Обрабатывается данная конструкция следующим образом. Вначале оценивается тестовое выражение. Затем программа переходит к списку выражений, начинающихся ключевым словом Case, и сравнивает полученное значение с каждым шаблоном. Если найдено соответствие шаблону, выполняется определенный блок инструкций. Если выражение не соответствует ни одному шаблону, выполняется блок инструкций, обозначенных ключевым словом Case Else. Можно применить любое количество блоков, обозначенных словом Case. Задавать блок Case Else не обязательно. Обратите внимание: если имеется несколько шаблонов, которым соответствует заданное выражение, все равно выполняется только один блок инструкций (для первого найденного соответствия). Шаблон оператора состоит либо из одного выражения, либо из нескольких выражений, разделенных запятыми. Сравниваемое выражение может представлять собой: • любое обычное выражение (в таком случае выполняется поиск точного соответствия); • диапазон значений, определяемый с помощью ключевого слова То (например: 10 То 20); • ключевое слово Is, за которым следует оператор сравнения и выражение (например: Is < 100). Приведем пример шаблона, который выполняется в том случае, если значение выражения равно 12, больше или равно 20, либо находится в диапазоне от 1 до 4. Case 12, Is >= 20, 1 То 4 Ключевые слова То и Is могут также использоваться при обработке текето- вых значений. ^JQV| О том, как выполнить сравнение строк в языке VBA, см. урок 5. 98 Часть П. Суббота. Утро
Оператор Do..,Loop Оператор Do. . .Loop, сокращенно Do, используется для многократного выполнения одного блока операторов, т.е. для организации циклов. Предположим, что программа в процессе просматривания содержащего числовые значения столбца рабочего листа должна остановиться, как только будет найдено нулевое значение. В таком слз^ае оператор Do. . . Loop идеально подойдет для создания необходимого кода. Синтаксис данного оператора имеет несколько вариантов, с помощью которых можно решить практически любые задачи программирования. Эти варианты описаны в табл. 6.1. Таблица 6.1. Способы использования оператора Do Синтаксис Действие Комментарии Do While условие операторы Loop Do Until условие операторы Loop Do операторы Loop While Do опера торы Loop Until условие условие Пока условие выполняется, повторяет выполнение блока операторы Повторяет выполнение блока операторы, пока условие не станет истинным Выполняет блок операторы один раз; затем повторяет его выполнение до тех пор, пока условие остается истинным Выполняет блок операторы один раз; затем повторяет его выполнение до тех пор, пока условие не станет истинным Если условие изначально возвращает . значение FALSE, операторы вообще не выполняются Если условие сразу возвращает значение TRUE, операторы вообще не выполняются Операторы обязательно выполняются по крайней мере один раз Операторы обязательно выполняются по крайней мере один раз Чтобы досрочно завершить выполнение цикла Do. .. Loop, используйте ключевые слова Exit Do. Когда программа доходит до этой инструкции, вьшолнение переходит к коду, набранному за ключевым словом Loop, причем независимо от значения условия, проверяемого в цикле. Ниже показан пример цикла, выполняемого до тех пор, пока переменная X не примет нулевого значения или значения, которое больше 50: Do Until X > 50 If X = О Then Exit Do Loop Иногда возникает необходимость в создании бесконечного цикла, выход из которого выполняется с помощью слов Exit Do. При выполнении показанного ниже цикла вопрос повторяется до тех пор, пока от пользователя не будет получен правильный ответ: Do While True str = InputBox("Назовите столицу Франции.") If str = "Париж" Then Exit Do Loop Конечно, TOT же результат может быть достигнут и другим способом: Урок б. Управляющие конструкции 99
Do str = InputBoxCНазовите столицу Франции.") Loop Until str = "Париж" Эти примеры иллюстрирует гибкость языка YBA — практически любая задача может быть решена несколькими способами. Программируя циклы, следите за тем, чтобы они не оказались замкнутыми (т.е. повторяемыми до бесконечности). Это может происходить в том случае, когда неверно сформулировано условие цикла, или когда в процессе выполнения цикла проверяемые в условии значения никак не изменились. Например: Do Until X < 5 And X > 10 Loop Возможно, вы сразу заметите проблему: переменная X не может быть одновременно меньше 5 и больше 10, поэтому условие никогда не будет истинным — в результате цикл повторяется до бесконечности. Если программа VBA "зависает" и не отвечает на действия пользователя, причиной тому может быть выполнение бесконечного цикла. Прерывание бесконечного цикла Столкнувшись с проблемой выполнения бесконечного цикла, воспользуйтесь диспетчером задач Windows. Выполните следующие действия: 1. Нажмите клавиши <Ctrl+Alt+Del>, чтобы открыть диалоговое окно Диспетчер задач Windows. 2. На вкладке Приложения выделите запись Microsoft Visual Basic. 3. Щелкните на кнопке Снять задачу. Эти действия завершают работу редактора VBA. Несохраненные изменения в вашей программе при этом будут потеряны. В языке VBA поддерживается также использование устаревшего оператора While. . .Wend, который сохранился еще от первых версий языка Basic. Этот оператор имеет такой синтаксис: While условие Wend Цикл повторяется до тех пор, пока условие остается истинным (при его вычислении возвращается значение True). Очевидно, что такой цикл функционально эквивалентен следующему варианту цикла Do: Do While условие Loop Оператор While. . .Wend поддерживается исключительно с целью обеспечения обратной совместимости с ранними версиями данного языка программирования. Вам не обязательно использовать его при написании кодов своих программ. 100 Часть IL Суббота. Утро
Осталось 10 минут Оператор For...Next Оператор For. . . Next выполняет блок инструкций указанное количество раз. В самой простой форме его синтаксис выглядит следующим образом: For индекс = начало То остановка Next индекс • индекс — переменная, используемая как счетчик количества выполненных итераций. Обычно она имеет тип Integer. • начало— выражение, определяющее начальное значение переменной индекс, • остановка — выражение, определяющее конечное значение переменной индекс. Когда в программе встречается оператор For. . .Next, индекс устанавливается равным значению начало, после чего выполняется блок операторов, набранных между ключевыми словами For и Next. Далее значение переменной индекс увеличивается (инкрементируется) на единицу, и цикл повторяется. Выполнение новых итераций продолжается до тех пор, пока значение переменной индекс не превысит значение, заданное выражением остановка. Обратите внимание, что на последней итерации оба эти значения совпадают. Название переменной-счетчика после оператора Next можно не указывать. Если вы просто наберете одно ключевое слово Next, VBA автоматически соотнесет его с предыдущим ключевым словом For. В цикле For. . . Next значение счетчика может увеличиваться на число, отличное от единицы. Чтобы воспользоваться этой возможностью, примените такой синтаксис: For индекс = начало То остановка Step шаг Next индекс В данном случае значение выражения шаг определяет, на какое число будет изменяться значение счетчика после выполнения очередной итерации. Обратите внимание на следующее: • если шаг отрицательный, значение начало должно быть больше, чем остановка; • если выражение шаг возвращает значение с плавающей точкой, то индекс должен быть объявлен как переменная одного из типов, соответствующих значениям с плавающей точкой. Ниже приведен пример, в котором выполняется отсчет от числа 10 до числа 5 с шагом 0,1 (т.е. переменная-счетчик принимает значения 10; 9,9; 9,8;... 5,1; 5). Dim index As Single For index = 10 To 5 Step -0.1 Next index Внимание: не изменяйте значение счетчика внутри цикла. Вы можете использовать его для выполнения других вычислений, но изменять его должен только сам оператор For. . . Next. Для досрочного прерывания цикла For. . .Next используется оператор Exit For. В следующем примере программа поочередно оценивает элементы Урок б. Управляющие конструкции 101
массива и прерывает выполнение цикла, если найден элемент, значение которого равно нулю: Dim found As Boolean Dim index As Integer found = False For index = LBound(MyArray^ To UBound(MyArray) If MyArray(index) = 0 Then found = True Exit For End If Next index Оператор For Each,..Next Оператор For Each. . . Next позволяет выполнять отдельную итерацию для каждого элемента коллекции или массива. Для коллекций используется такой синтаксис: For Each элемент in коллекция Next Здесь элемент — это переменная, объявленная соответствующим типом, который позволяет ссылаться на объекты в коллекции (тип Object, тип Variant или тип элементов данной коллекции). Цикл начинается с присваивания переменной элемент ссылки на первый объект коллекции, после чего выполняются операторы, набранные между ключевыми словами For и Next. Затем переменной элемент присваивается ссылка на следующий объект коллекции, после чего снова выполняется блок операторов. Процесс повторяется до тех пор, пока не будут пройдены все элементы коллекции. Если коллекция пуста, блок операторов такого цикла вообще не выполняется. В следующем примере цикл For Each. . . Next используется для вывода на печать всех рабочих листов в активной книге: Dim WS As Worksheet For Each ws In ActiveWorkbook.Worksheets WS.Printout Next Синтаксис конструкции For Each. . .Next для элементов массива подобен синтаксису, используемому при работе с коллекциями: For Each переменная in массив Next В данном случае переменная должна иметь тот же тип данных, что и массив, либо тип Variant. В следующем коде вычисляется сумма всех элементов массива (предполагается, что массив МуАггау имеет тип Single): Dim var As Single Dim total As Single total = 0 For Each var in MyArray total = total + var Next Обратите внимание, что ту же задачу можно решить с помощью цикла For. . .Next, а также функций LBound и UBound, но цикл For Each. . .Next позволяет выполнить эту задачу проще. 102 Часть П. Суббота. Утро
Как и в цикле For. . .Next, оператор Exit For можно использовать для выхода из цикла For Each. . .Next до того, как будут обработаны все элементы коллекции или массива. Оператор Goto Оператор Goto указывает программе на необходимость выполнения кодов, обозначенных указанной меткой. Синтаксис оператора следующий: Goto метка Здесь метка — это идентификатор позиции в кодах программы, который указывается в отдельной строке и состоит из произвольного слова и следующего за ним двоеточия. Действие оператора Goto ограничено пределами процедуры. Другими словами, оператор Goto и его метка должны находиться внутри одной и той же процедуры. Ниже показан пример использования оператора Goto: Dim val As Integer val = InputBox("Введите четное число:") If val mod 2 <> 0 Then Goto NotEven MsgBox("Спасибо 1") Goto Finished NotEven: MsgBox("ЭЙ, это не четное число!") Finished: ' Оставшаяся часть программы Сама метка не влияет на ход выполнения программы, она служит лишь указателем для оператора Goto. Рекомендуется по возможности избегать использования оператора Goto (это правило не распространяется на программы обработки ошибок). Его использование обычно приводит к созданию запутанного кода и к возникновению множества ошибок. К тому же, практически все задачи программирования гораздо эффективнее решаются с помощью других операторов VBA. Ф Обзор в языке VBA предусмотрен ряд операторов, позволяющих управлять ходом вы- готово! ПОЛ нения программы. Вы увидите, что эти операторы играют важную роль при написании практически всех программ Excel, за исключением, разве что, самых простых. В данном уроке вы имели возможность ознакомиться со следующей информацией: • операторы If и Select Case используются для выполнения того или иного блока инструкщ1Й, что зависит от результатов проверки указанных условий; • оператор For. . .Next позволяет повторно выполнять блок инструкций заданное количество раз; • оператор Do. . . Loop повторяет выполнение блока инструкций до тех пор, пока заданное условие остается истинным (либо, наоборот, пока оно не станет истинным); • оператор For Each. . . Next позволяет выбирать отдельную итерацию для каждого элемента коллекции или массива; • переходить к другой позиции в кодах программы позволяет оператор Goto, но его использования по возможности лучше избегать. Урок б. Управляющие конструкции 103
проверьте себя 1. В каких случаях вместо оператора If лучше использовать оператор Select Case? (См. раздел "Оператор If. . . Then".) 2. Каким образом необходимо использовать оператор If, чтобы блок инструкций выполнялся в случае ложности проверяемого условия? Подсказка: эту задачу можно решить несколькими способами. (См. раздел "Оператор If. . .Then".) 3. Как иС|Пользовать оператор Do. . .Loop, чтобы блок инструкций выполнялся по крайней мере один раз? (См. раздел "Оператор Do. . . Loop".) 4. Опишите два способа вьгаолнения итераций для каждого элемента массива. (См. разделы "Оператор For. . . Next" и "Оператор For Each. .. Next".) 5. В каких случаях следует использовать оператор Goto? (См. раздел "Оператор Goto".) 104 Часть IL Суббота. Утро
УРОК Процедуры и модули Содержание урока ^ Объявление подпрограмм и функций ^ Определение аргументов процедуры V Необязательные аргументы и аргументы ParamArray ^ Вызов процедур ^ Объявление переменных в процедурах ^ Область видимости процедуры ^ Хранение и организация процедур В одном из предыдущих уроков вы узнали, что процедура — это совокупность кодов VBA, рассматриваемых как единое целое. Макросы записываются как отдельные процедуры VBA. Простейшие программы VBA состоят из одной проце- зТминут дуры, тогда как более сложные программы состоят из ряда взаимодействующих между собой процедур. Таким образом, чтобы создать программу Excel, необходимо знать, как создавать процедуры и работать с ними. 06 использовании процедур для организации кодов VBA рассказано в уроке 2. э в языке VBA существуют процедуры пяти различных типов: • подпрограмма — именованный, независимый раздел кодов; • процедура-функция — подобна подпрограмме, но может возвращать данные в программу, которая ее вызвала; • метод — это процедура (подпрограмма или функция) в модуле класса; • процедура свойства — определяет свойство класса;
• процедура события — выполняется, когда происходит определенное событие (например, нажатие клавиши или кнопки мыши). В данном уроке рассматриваются процедуры двух основных типов — подпрограммы и функции. Методы, процедуры свойств и событий являются более специфическими типами процедур, они будут описаны далее. Методы и процедуры свойств рассматриваются в уроке 26, процедуры событий -— в уроке 27. Подпрограммы Подпрограмма определяется с помощью ключевых слов Sub и End Sub. При этом используется такой синтаксис: Sub ИьляПроц{ аргументы) End Sub Имя процедуры должно соответствовать стандартным правилам именования в языке VBA, оно также должно быть уникальным в области видимости процедуры. Об использовании аргументов (данных, которые передаются в процедуру) будет рассказано в следующем разделе. Если процедура не имеет аргументов, оставьте скобки пустыми. В тело процедуры можно включить практически любой код VBA, кроме: • определения другой процедуры; • определения класса; • определения типа, задаваемого пользователем; • определения перечислимых типов. Количество кодов в теле процедуры может быть любым, однако рекомендуется придерживаться разумных пределов. Что считать "разумными пределами"? На этот вопрос непросто ответить, но по своему опыту могу сказать, что в процедуру не следует включать более 30 или 40 строк кода. Когда тело процедуры достигает таких размеров, ее можно разделить на две или более отдельные процедуры. В результате будет получен код, более удобный для чтения, понимания и отладки. Планируя структуру программы помните о том, что для каждой отдельной задачи, которую предстоит выполнить, всегда желательно создать отдельную процедуру. Предположим, что вы пишете программу, вычисляющую два показателя: сумму ипотечного кредита, который человек может себе позволить на основании своих доходов и долговых обязательств, и ежемесячные выплаты по этому кредиту с учетом различных процентных ставок. Конечно, вы можете поместить все коды в одну процедуру, но лучше разделить программу как минимум на две процедуры — первая процедура будет определять сумму кредита, а вторая —- вычислять ежемесячные выплаты. Создавая для логически разделяемых задач отдельные процедуры, вы тем самым уменьшаете вероятность возникновения ненужных связей между разными частями кода, что обычно приводит к появлению ошибок. Кроме того, спроектированные таким образом процедуры гораздо легче впоследствии использовать в других программах. 106 Часть П. Суббота. Утро
ф Аргументы процедуры Аргумент — это некое значение, передаваемое процедуре в момент ее вызова. ^"митп Д*^^ процедуры можно определить любое количество аргументов. Объявляя процедуру, в списке аргументов необходимо указать по одному элементу, соответствующему каждому аргументу процедуры. Этот элемент будет иметь следующий синтаксис: ИмяАргумента As тип ШляАргумента — это название аргумента, которое подчиняется правилам присвоения имен в языке VBA, а тип — это тип данных аргумента. Для аргумента может быть выбран любой тип данных VBA, объектный тип из объектной модели Excel, тип, определенный пользователем, либо перечислимый тип. Если тип данных не указан, аргумент по умолчанию получает тип Variant. Несколько аргументов должны быть разделены запятыми, как показано в следующем примере: Sub MyProcedure(count As Integer, deadline As Date, overdue As Boolean) End Sub Если в качестве аргумента следует передать процедуре массив значений, укажите имя этого аргумента и за ним — пару пустых скобок. Ниже для подпрограммы определяется один аргумент, который является массивом типа Single: Sub AnotherSub(data() As Single) В теле процедуры каждый аргумент доступен как переменная указанного типа, причем начальное значение этой переменной совпадает со значением, которое было присвоено аргументу в момент вызова процедуры (см. следующий подраздел, "Вызов процедур"). в Аргументы должны иметь такие названия, по которым можно будет определить выбранный для них тип данных. Необязательные аргументы По умолчанию аргументы процедуры являются обязательными, т.е. при вызове процедуры всем объявленным аргументам обязательно должно передаваться какое-то значение; в противном случае возникает ошибка. Однако при необходимости некоторые аргументы процедуры можно объявить как необязательные. В данном случае используется следующий синтаксис: Optional ИмяАрг As тип = по__умолчанию Имя Apr и тип те же, что и для обычных аргументов. Аргументу можно присвоить значение, используемое по умолчанию, — это значение присваивается аргументу, если при вызове процедуры ему не передается другое значение. Если вы не хотите присваивать аргументу значение, используемое по умолчанию, опустите часть =по_умолчанию в объявлении аргумента. При объявлении процедуры все необязательные аргументы перечисляются в конце списка аргументов, т.е. после объявления обычны:^ аргументов. Ш Выполнение процедуры завершается, когда программа достигает оператора End Sub. Чтобы сделать это раньше, наберите оператор Exit Sub в требуемом месте процедуры. Урок 7. Процедуры и модули 107
Аргументы ParamArray Дополнительные возможности по передаче аргументов в процедуру предоставляет ключевое слово ParamArray. При этом синтаксис выглядит следующим образом: Sub ^1мяЯроц(ParamArray ИмяМассива {) ) Данная строка объявляет, что в процедуру будет передан массив аргументов. Массив всегда имеет тип Variant, но его длина может быть разной. Посмотрим, как это выглядит на практике. Предположим, некоторая процедура была объявлена следующим образом: Sub MySub(ParamArray Data О) End Sub Затем осуществляется вызов процедуры: Call MySub("hello", 55, #12/25/2003#) В этой процедуре массив Data содержит три элемента: Daua(O) — строку "hello"; Data(l) — значение 55; Data (2) — дату 12/25/2003. Размер массива зависит от количества переданных в процедуру аргументов. Чтобы определить размер массива, используйте функцию UBound. Можно комбинировать аргументы ParamArray с обычными обязательными аргументами. При объявлении процедуры используется только один массив ParamArray, он должен быть указан последним в списке аргументов. Массив аргументов ParamArray нельзя объявлять с помощью ключевого слова Optional. Ниже представлен пример объявления и вызова процедуры, принимающей массив значений: Sub My Sub (А As Integer, В As String, ParamArray paO) Вызов процедуры: Call MySub("один", "два", "три", "четыре") Значения "один" и "два" интерпретируются программой как значения аргументов А и В. Значения "три" и "четыре" воспринимаются как элементы массива ра (). Аргументы ByVal и ByRef Слова ByVal и ByRef определяют два способа передачи переменной какой- либо процедуре в качестве аргумента. ByRef обозначает "by reference", т.е. "по ссылке". Этот способ передачи переменных используется в языке VBA по умолчанию. В данном случае в процедуру передается ссылка на аргумент — другими словами, указывается место в памяти, где хранится этот аргумент. Например: Dim str As String str = "hello" MySub str В этом примере процедуре передается адрес памяти, соответствующий переменной str. Получив адрес, процедура может обращаться к значению переменной str. Более того, процедура сама может изменять значение переменной str. Другим словами, если коды в теле процедуры изменяют значение аргумента, соответствующим образом изменяется и значение исходной переменной. Покажем это на примере: Sub MySub(s As String) s = "измененная" 108 Часть П. Суббота. Утро
End Sub Dim str As String str = "исходная" MySub str После выполнения этих кодов строка str будет содержать значение измененная. Можно также передать аргументу только значение переменной. Для этого при объявлении процедуры следует использовать ключевое слово ByVal (*Ъу value" — "по значению*'): Sub MySub(ByVal s As String) При вызове такой процедуры аргументу передается копия значения переменной. Таким образом, процедура получает доступ к значению переменной, применяемой в качестве аргумента, но она не имеет доступа к самой переменной, а следовательно, не может присваивать ей другие значения (см. следующий пример): Sub MySub(ByVal s As String) s = "измененная" End Sub Dim str As String str = "исходная" MySub str После выполнения этого кода переменная str все равно будет содержать значение исходная. При написании программ VBA принято передавать аргументы по ссылке, так как это более эффективный способ, нежели передача аргументов по значению. Возможность изменять значения переменных в теле процедуры — это побочный эффект, связанный с передачей аргументов по ссылке; его не рекомендуется регулярно использовать как прием программирования. Если процедура должна возвращать данные в вызывающую ее программу, лучше использовать другой тип процедур — функции (см. далее в этом уроке). Необходимо с большой осторожностью подходить к изменению значений аргументов в самой процедуре; обращайтесь к такой возможности только в тех случаях, когда это действительно необходимо. Вызов процедур Чтобы вызвать или выполнить процедуру, воспользуйтесь диалоговым окном Макрос (Macros), отображаемым на экране после нажатия клавиш <Alt-HF8>. Однако чаще процедуры требуется вызывать из самой программы. Как правило, каждая написанная вами программа Excel включает одну начальную процедуру, представляющую собой точку входа в данную программу. От этой точки переход к выполнению других процедур программы осуществляется посредством их вызова. Ниже представлено два способа вызова процедуры. В первом случае используется ключевое слово Call: Call ИмяПроц{СписокАрг) Если процедура не получает аргументов, скобки использовать не нужно: Call ИмяПроц Во втором случае ключевое слово Call не используется — указывается лишь имя процедуры: Урок 7. Процедуры и модули 109
ИьляПроц СписокАрг Обратите внимание, что в случае, когда ключевое слово Call не применяется, список аргументов не заключается в скобки. Если процедуре передаются значения аргументов, они должны быть того же типа, который был указан при объявлении соответствующих аргументов. Чтобы передать в качестве аргумента массив, наберите название массива, а после этого — пару пустых скобок. Проверка типа аргументов При объявлении аргументов процедуры указывается определенный тип данных. Когда программа передает процедуре значения аргументов, их тип сравнивается с типом, объявленным для соответствующих аргументов. Если типы данных отличаются, возникает ошибка "ByRef Argument Type Mismatch" (несоответствие типа аргумента по ссылке). Следующий фрагмент кода вызывает эту ошибку (в операторе Call): Sub MySub(val As Single) End Sub Dim X As Long X = 12345 Call MySub(X) Существует два метода решения этой проблемы. Первый заключается в использовании функции преобразования данных VBA— в результате передаваемые значения преобразуются к требуемому типу данных. Так, функция CSng преобразует обрабатываемые значения к типу Single, а потому может быть использована в приведенном выше примере: Call MySub(CSng(X)) Информацию о других функциях преобразования типа данных можно найти в документации VBA. Другой способ избежать ошибки несоответствия типов состоит во включении аргумента в дополнительную пару скобок: Call MySub({X)) Скобки преобразуют значение аргумента к выражению, не имеющему определенного типа, благодаря чему ошибка несоответствия типов не возникает. Команда Insertc> Procedure Самый простой способ добавить новую процедуру в модуль VBA —- использовать команду lnsert=>Procedure (Вставить«=>Процедуру). При этом на экране отображается диалоговое окно, в котором необходимо указать имя процедуры и определить ее тип: подпрограмма или функция. Редактор автоматически добавляет каркас процедуры в модуль. Далее вы можете редактировать процедуру, добавляя в нее аргументы и коды. э Процедуры-функции Процедура-функция во многом подобна подпрограмме, в частности, одинаков ^Ш1нш сг^особ объявления аргументов и тип кодов, которые она может содержать. Разница заключается в том, что функция возвращает значение в вызывающую про- 110 Часть IL Суббота. Утро
грамму, тогда как подпрограмма этого не делает. Функции определяют с помощью ключевых слов Function. . . End Function: Function ИмяФункции{аргументы) As тип End Function Элемент тип определяет тип данных значения, возвращаемого функцией; это может быть один из типов данных, предусмотренных в языке VBA, тип, определенный пользователем, либо перечисляемый тип. Если часть As тип в объявлении функции опущена, то функция по умолчанию возвращает значение типа Variant. Возвращаемый функцией результат определяется путем присвоения значения названию функции в теле самой функции: Function MyFunctionO As Integer MyFunction = выражение End Function Присвоение чаще всего осуществляется в конце тела функции, однако это правило не является обязательным. Выполнение присвоения само по себе не заканчивает выполнение функции. Чтобы раньше выйти из нее, используйте оператор Exit Function. Если названию функции не было присвоено значение, ошибка не возникнет. В таком случае функция возвращает неинициализированное значение соответствующего типа (ноль — для числовых типов, пустая строка — для типов String и Variant, Nothing — для объектных типов). То обстоятельство, что функция возвращает вызывающей ее программе значение, определяет способ ее вызова. Поскольку функция возвращает значение, ее вызов рассматривается как обычное выражение. Следовательно, это значение можно использовать везде, где допускается применение выражения. Аргументы функции должны быть заключены в скобки. Приведем несколько примеров использования функций: X = Fund о + Func2() X = Func3(Func4()) Debug.Print Func5(a, b, c) В этом фрагменте применяется оператор Debug.Print для отображения данных в окне Immediate редактора VBA. О работе с окном immediate было рассказано в уроке 2. Кроме того, функцию можно вызвать тем же способом, что и процедуру (см. ранее в данном уроке). В таком случае возвращаемое функцией значение игнорируется. Переменные в процедурах Большинство переменных, используемых в программе, объявляется внутри процедур. Такие переменные называют локальными, поскольку их область видимости ограничена пределами процедуры, в которой они объявляются. Другими словами, локальная переменная не существует за пределами своей процедуры. Объявление переменных VBA описано в уроке 4. Урок 7. Процедуры и модули 111
Не пытайтесь определить в процедуре пользовательский или перечисляемый тип данных — это запрещено. Однако вы можете объявить в ней переменные подобных типов, объявленных за пределами процедур. При каждом вызове процедуры ее локальные переменные заново создаются и инициализируются. Это означает, что локальная переменная не сохраняет свое значение на период между вызовами своей процедуры. Данный факт можно считать положительным, однако порой возникают ситуации, при которых локальная переменная должна "помнить" свое значение. Достичь этого можно с помощью ключевого слова Static. При объявлении данной переменной используйте ключевое слово Static — так вы сделаете ее статичной: Static X As Integer Вы можете сделать статичными все переменные; для этого используйте ключевое слово Static при определении самой процедуры: Static Sub SubNameO End Sub Пример использования ключевого слова Static показан в листинге 7.1. Листинг 7.1, Пример использования статических переменных Public Sub TestStaticlO Dim i As Integer For i = 1 To 5 TestStatic2 Next End Sub Public Sub TestStatic20 Static A As Integer Dim В As Integer Debug.Print A, В A = A + 1 В = В + 1 End Sub При выполнении процедуры TestStaticl в окне Immediate появятся следующие значения: О О I Оператор Debug. Print и окно Immediate рассмотрены в уроке 2. Как видно из примера, статическая переменная А сохраняла свое значение между вызовами процедуры, а переменная В — нет. 112 Часть 11. Суббота. Утро
Область видимости процедуры Концепция области видимости переменных была рассмотрена в уроке 4. Как и переменные, процедуры также имеют свою область видимости. По сути, область видимости процедуры — это та часть программы, из которой она может быть вызвана. Существует три уровня видимости процедур. • Глобальный уровень (Public). Процедура видна во всех модулях всех проектов. Такая область видимости определяется по умолчанию, если процедура объявлена без ключевого слова. Можно также применить ключевое слово Public и получить тот же результат. • Локальный уровень (Private). Процедура видна только в своем модуле. Чтобы создать такую процедуру, используйте ключевое слово Private: Private Sub MySubO • Глобальный с ограничением. Если в начале модуля было использовано выражение Option Private, процедуры, объявленные в этом модуле с ключевым словом Public или без него, будут видны во всех модулях текущего проекта, но не в других проектах. Сохранение процедур Процедуры сохраняются в модулях. Но в каких именно модулях их следует сохранять? На этот вопрос не существует единственно правильного ответа. Кроме возможных ограничений, связанных с областью видимости процедур, на их размещение не накладывается больше никаких условий. Но чтобы организовать процедуры наиболее удобным образом, необходимо заранее подумать об их размещении. Приступая к программированию, объедините все процедуры VBA в один модуль и затем импортируйте этот модуль в каждый создаваемый вами проект. Впоследствии, когда коллекция написанных вами процедур станет достаточно большой, можно разбить процедуры по функциональному критерию, а затем сохранить каждую отдельную группу процедур в своем модуле. Тогда вы сможете при необходимости включить тот или иной модуль в свой текущий проект VBA. о Обзор Подпрограммы и функции являются базовыми структурами, используемыми для организации кодов VBA. Каждая программа Excel состоит как минимум из одной процедуры, а более сложные содержат несколько процедур. В этом уроке вы узнали о том, что: • процедура— это независимая часть кода, которой было присвоено имя и которую можно вызывать (выполнять) из другой точки программы; • функция возвращает значение в вызывающую ее программу; подпрограмма не возвращает никаких значений; • процедуре могут передаваться значения аргументов; тип данных каждого аргумента объявляется заранее; • процедура может содержать любые коды VBA, кроме объявлений других процедур, объявлений определяемых пользователем типов данных, объявлений перечислимых типов; Урок 7. Процедуры и модули 113
по умолчанию процедура имеет глобальную область видимости (Public), что делает ее доступной для всех модулей во всех проектах. Проверьте себя 1. Назовите основное отличие подпрограммы от функции. (См. раздел **Процедуры-функции*'.) 2. Сколько аргументов может иметь процедзфа? (См. раздел "Аргументы процедуры'*.) 3. Необходимо ли заключать значения аргументов в скобки при вызове подпрограммы? (См. раздел "Вызов процедуры".) 4. Что происходит при передаче процедуре аргумента, тип данных которого отличается от объявленного? (См. подраздел "Проверка типа аргументов".) 5. Как определить необязательный аргумент процедуры со значением по умолчанию? (См. подраздел "Необязательные аргументы".) 6. Какую область видимости по умолчанию имеет процедура? (См. раздел "Область видимости процедуры".) 114 Часть II. Суббота. Утро
УРОК ф Работа со значениями даты и времени Содержание урока ^ Тип данных Date ^ Преобразование текстовой информации в значения даты ^ Фиксирование даты и времени по системным часам ^ Детализированная информация о дате ^ Форматирование значений даты и времени для их последующего отображения В программах Excel довольно часто приходится работать со значениями даты и немного реже— со значениями времени. Excel предоставляет великолепные инструменты для работы с данными этих типов. Подобные возможности преду- 30минут смотрены И В языке VBA, в котором поддерживается тип данных, специально предназначенный для хранения информации о дате и времени. Тип данных Date Язык VBA содержргт специальный тип д,аккых Date, предназначенный для представления значений даты и времени. Внутри программ значения типа Date представлены как числа с плавающей запятой: • целая часть значения отображает дату как количество дней, прошедшее с 30 декабря 1899 года; • дробная часть значения представляет время в виде доли 24-часового дня (например, .25 — это 6 часов утра, . 5 — это полдень и т.д.); • дробное число без целой части отображает время без даты.
Для пользователя или программиста представленные таким образом значения даты и времени являются бесполезными. К счастью, вам довольно редко придется работать со значениями даты и времени в их исходном формате. В языке VBA предусмотрены инструменты, позволяющие преобразовывать эти значения к более знакомому пользователям виду. Исходное "сырое** представление значений даты и времени в виде чисел с плавающей запятой скрыто от посторонних глаз и используется программой только в процессе проведения внутренних вычислений. Значения даты и времени Язык VBA способен распознавать значения даты и времени, представленные практически в любом стандартном формате. Чтобы указать на текстовые константы как на значения даты/времени, необходимо заключить их в символы #. Используйте обычный оператор присваивания, чтобы присвоить переменной типа Date значение даты/времени: Dim dt As Date dt = #01/05/2003# ' Или #5 Jan 03#, #January 5, 2003# и т. д. Функция Date Value выполняет, по сути, ту же задачу, преобразовывая представленные в текстовом виде значения даты к значениям типа Date: Dim dt As Date dt = DateValue("January 5, 2003") Если передаваемое этой функции текстовое значение содержит информацию о времени, она не учитывается; однако неправильно представленная информация о времени вызовет ошибку. Функция DateSerial используется для генерирования значений типа Date на основе отдельно представленной информации о месяце, дне и годе: DateSerial{год, месяц, день) Каждый аргумент этой функции представляет собой целочисленное выражение, соответствующее указанному компоненту даты. Аргумент месяц может принимать значения в диапазоне от 1 до 12, день — от 1 до 31, а год — от 100 до 9999. Вы также вправе создать значение, представляющее относительную информацию о дате. Например, значение месяца -2 создает относительное значение даты, на 2 месяца предшествующее другому значению даты. К примеру, можно определить дату, на 2 месяца предшествующую сроку сдачи проекта, и использовать это значение в качестве напоминания о необходимости проверить текущее состояние проекта. Подобные относительные значения даты используются при проведении вычислений с обычными значениями даты, о чем подробнее будет рассказано далее в этом уроке. Значения даты и системные настройки Способ обработки информации о дате в некоторой степени зависит от системных настроек Windows, в особенности, от выбранных региональных стандартов. Помимо прочего, эти настройки определяют: • какой формат используется для сокращенного представления даты (месяц/день/год, день/месяц/год и т.д.); • какой при этом применен символ-разделитель; 116 Часть П. Суббота. Утро
• как интерпретируются значения года, представленные из двух цифр. По умолчанию значения от О до 29 интерпретируются как года в интервале от 2000 до 2029, а значения от 30 до 99 — как года 1930-1999. Значения даты всегда интерпретируются и вычисляются в соответствии с используемым системным календарем. В окне Региональные стандарты (Regional Options) предусмотрены также настройки, определяющие способ представления значений времени. Системные значения даты и времени Каждый компьютер имеет свои системные часы, с помощью которых отсчитываются системные значения даты и времени. Вы можете считывать и использовать эти значения в своих программах. Для считывания значений системных часов предусмотрены следующие функции: • Now: возвращает значения системной даты и времени как значение типа Date; • Date: возвращает значение системной даты (без времени); • Time: возвращает значение системного времени (без даты). Чтобы установить системные часы, используйте операторы Date и Time. Однако при написании программ Excel такая необходимость, как правило, не возникает. Если дата указана без обозначения года, в программе VBA используется текущий год, зафиксированный системными часами. Ф Для создания значений времени и присвоения их переменным типа Date применяются функции Time Value и TimeSerial. Они работают аналогично описанным выше функциям обработки информации о дате. Три оператора, показанных ниже, создают значение времени, соответствующее 17 часам 21 минуте (ноль секунд). TimeValue{"5:21PM") TimeValue("17:21") TimeSerial(17, 21, 0) Передаваемые функции TimeSerial значения обычно находятся в диапазоне 0-23 часов, и 0-59 минут и секунд. Значения, превышающие пределы правой границы указанного диапазона, пересчитываются; другими словами, значение 90 секунд соответствует 1 минуте и 30 секундам: TimeSerial(12, 15, 30) '12:15:30 РМ TimeSerial(12, 14, 90) 'тоже 12:15:30 РМ В Excel содержится одна ошибка, относящаяся к особенностям обработки информации о дате — 1900 год считается високосным. В функциях обработки значений времени и даты языка VBA этой ошибки нет. Вычисления со значениями даты и времени в VBA существует функция, позволяющая складывать и вычитать даты. Точ- JJJJJJJJ нее, эта функция предназначена для прибавления к дате или вычитания от даты заданного временного интервала (относительной даты). Например, ее можно использовать для определения даты, которая на восемь недель предшествует другой дате. Синтаксис функции показан ниже: DatеAdd(интервал, число, дата) Урок 8. Работа со значениями даты и времени 117
• интервал— строковое выражение, определяющее прибавляемый к дате интервал. Возможные значения этого аргумента приведены в табл. 8.1; • число — количество прибавляемых интервалов. Для вычитания интервала используйте отрицательное число; • дата — исходная дата. Таблица 8.1. Значения аргумента интервал для функции DateAdd Аргумент Интервал УУУУ q го у, W или d WW h n 8 Год Квартал (3 месяца) Месяц День года Неделя Час Минута Секунда Приведем несколько примеров использования функции DateAdd: DateAdd ("q", 2, Date) DateAdd("d", -60, #12/25/2003#) DateAdd("n", 1000, Time) дата через 2 квартала после сегодняшней дата за 60 дней до Рождества-2003 дата (время) через 1000 минут после текущего ' момента Функция DateAdd всегда возвращает корректную дату и учитывает високосные годы. Если вы напрямую работаете с числовым представлением даты, используйте тип данных Single. Вы можете присвоить значение даты непосредственно переменной типа Single и наоборот. Например: Dim d As Date Dim s As Single S e #l/l/2002# ' теперь значение переменной s равно числу 37257, это количество дней между 30 декабря 1899 года и 1 января 2002 года теперь переменная d содержит значение даты для 1/1/2002 Если вы работаете только со значениями даты, которые не содержат информацию о времени, можно также использовать тип данных Long. Информация о дате и времени Работая с датами, вы можете получить более подробную информацию об интересующей вас конкретной дате (например, на какой день недели она приходится). С этой целью используйте функции VBA DatePart и DateDif f. Функция DatePart позволяет решить ряд различных задач. Она имеет такой синтаксис: 118 Часть П. Суббота. Утро
DatePart (интервал, дата, первый__день_недели, первая__неделя__года) • интервал — требуемый интервал даты. Возможные значения этого аргумента были перечислены выше в табл. 8.1, но в данном случае у означает день года (1-365 или 366), d — день месяца (например, 1-31 для августа), aw — день недели (диапазон 1-7). • дата — значение типа Date, указывающее на требуемую дату. • первый_день_недели— константа, определяющая первый день недели. Возможные значения данного аргумента показаны в табл. 8.2. Этот аргумент не обязателен, по умолчанию первым днем считается воскресенье. • первая_неделя_года — константа, определяющая первую неделю года. Возможные значения этого аргумента приведены в табл. 8.3. Аргумент не обязателен, по умолчанию первой считается неделя, на которую приходится 1 января. Таблица 8.2. Константы для аргумента первый_деньнедели функции DatePart Константа (значение) Объяснение vbUseSystem (0) vbSunday(l) vbMonday(2) vbTuesday(3) vbWednesday(4) vbThursday(5) vbFriday(6) vbSaturday(7) Используются системные настройки Воскресенье (применяется по умолчанию) Понедельник Вторник Среда Четверг Пятница Суббота Таблица 8.3. Константы для аргумента первая_неделя_года функции PatePart Константа (значение) Объяснение VbUseSystem (0) vbFirst Jam (1) vbFirstFourDays(2) vbFirstFullWeek(3) Используются системные настройки Неделя, на которую приходится 1 января (применяется по умолчанию) Первая неделя, на которую приходится как минимум четыре дня нового года Первая полная (из 7 дней) неделя года э Осталось 10 минут Ниже приведены некоторые примеры использования функции DatePart: DatePart("у", #July 4, 2003#) ' Возвращает 185, так как 4 июля - ' 185-й день 2003 года Возвращает в, так как 4 июля 2003 - пятница, а по умолчанию первый день недели - воскресенье DatePart("W", #July 4, 2003#) Урок 8. Работа со значениями даты и времени 119
DatePartC'w", #July 4, 2003#, vbMonday) Возвращает 5, так как 4 июля 2003 - пятница, и, когда первым днем недели задан понедельник, пятница - это день 5 Dim d As Date d = DateAddC'm", 2, "7/4/2003") Возвращает 36, что указывает на дату через 2 месяца после DatePart("WW", d) 4 июля 2003 приходится на Зб-ю неделю года Функция DateDif f используется для вычисления количества указанных интервалов времени между двумя датами. Она имеет такой синтаксис: DateDif f (интервал, дата1, дата2, первый_день_недели, пер- вая__неделя__года) • интервал— определяет требуемый интервал времени в виде строкового значения (см. табл. 8.1). • дата1у дата2— интересующие даты, дата! должна быть более ранней, в противном случае функция возвращает отрицательное значение. • первый_день_недели— константа, определяющая первый день недели. Возможные значения аргумента показаны в табл. 8.2. Этот аргумент не обязателен, по умолчанию первым днем недели считается воскресенье. • первая_неделя_года — константа, определяющая первую неделю года. Возможные значения этого аргумента приведены в табл. 8.3. Аргумент не обязателен, по умолчанию первой считается неделя, на которую приходится 1 января. Функцию DateDif f можно использовать для создания функции, определяющей, является ли год високосным. Если между 1 января и 31 декабря данного года 364 дня, то год не високосный, если же это количество составляет 365 дней, значит, год високосный. Данная функция показана в листинге 8.1. Листинг 8.1. Функция, определяющая високосный год Function IsLeapYear(year As String) As Boolean ' Аргумент year - строка, определяющая требуемый год ' Например: "2003" ' Возвращает True, если год високосный. False - если нет. Dim dl As String, d2 As String dl = "1/1/" & year d2 = "12/31/" & year If DateDiff("d", dl, d2) = 365 Then IsLeapYear = True Else IsLeapYear = False End If End Function 120 Часть 11. Суббота. Утро
в табл. 8.4 описаны другие функции VBA, возвращающие определенную информацию о той или иной дате. В каждом случае используется дата, представленная значением типа Date или текстовым выражением, которое можно интерпретировать как дату. Таблица 8.4. Функции дат и времени в VBA Функция Описание Day (дата) Hour(дата) Minute{дата) Month(дата) Second(дата) Weekday(дата, первый_день_ недели) Year {дата) Возвращает значение в диапазоне 1-31, представляющее день месяца Возвращает значение в диапазоне 0-23, представляющее час дня Возвращает значение в диапазоне 0-59, представляющее минуту часа Возвращает значение в диапазоне 1-12, представляющее месяц года Возвращает значение в диапазоне 0-59, представляющее секунду минуты Возвращает значение в диапазоне 1-7, представляющее день недели. Необязательный аргумент определяет первый день недели; по умолчанию первым днем недели считается воскресенье (см. таблицу 8.2, где показаны другие значения этого аргумента) Возвращает год Форматирование значений даты и времени В VBA предусмотрены достаточно мощные возможности по отображению значений даты и времени. Без особых усилий со стороны программиста значения даты и времени можно отобразить с использованием сокращенного формата дат, определенного в системных настройках. В системе Windows 2000 в США этот формат имеет следующий вид: 12/01/2003 9:35:00 AM Настройки отображения данных устанавливаются на панели управления Windows (Control Panel) в разделе Язык и региональные стандарты (Regional Settings или Regional Options, в зависимости от версии Windows). Если вы решили применить другой способ отображения даты и времени, используйте функцию FormatDateTime. Она имеет такой синтаксис: FormatDateTime{Дата, ИменованыйФормат) Дата — это значение даты, которое необходимо представить в требуемом формате. ИменованыйФормат— это необязательная константа, определяющая способ форматирования даты. Возможные значения этой константы приведены в табл. 8.5. Функция возвращает строку, содержащую значение даты в отформатированном виде. Если функция FormatDateTime не позволяет представить информацию в необходимом вам формате, можете определить собственные форматы даты и времени, воспользовавшись функцией Format. Дополнительные сведения по этому вопросу предаавлены в документации VBA. j^Ofc 8. Работа со значениями даты и щпвмвн^ JLPJ
Таблица8.5. Константы для аргумента ИменованныйФормат функции Format- DateTime Константа (значение) Формат vbGeneralDate (0) Отображает дату (если она указана) в сокращенном формате, а время (если оно указано) — в расширенном формате. Эта настройка используется по умолчанию vbLongDate (1) Отображает дату в расширенном формате vbShortDate (2) Отображает дату в сокращенном формате дат vbLongTime (3) Отображает время в расширенном формате vbShortTime (4) Отображает время в сокращенном формате <э Обзор в языке VBA программирование с использованием значений даты и времени осуще- готово! ствляется относительно просто. Тип данных Date специально предназначен для хранения информации о дате и времени, а в ваше распоряжение предоставляется ряд функций по обработке и форматированию соответствующих значений. • Тип данных Date сохраняет значение даты/времени как число с плавающей точкой, в котором целая часть соответствует дате, а дробная — времени. • VBA способен распознавать текстовое представление даты многих распространенных форматов. Строки, которые должны интерпретироваться как значения даты и времени, необходимо заключать в символы #. • Функция DatePart — одна из нескольких функций VBA, предоставляющих подробную информацию о конкретной дате и времени. • Способ отображения даты и времени в некоторой степени зависит от системных настроек. • VBA автоматически форматирует значения даты и времени для последующего отображения, однако используемый по умолчанию способ форматирования можно изменить с помощью функции FormatDateTime. Проверьте себя 1. В каком виде информация о дате хранится в числовом значении типа Date? (См. раздел "Тип данных Date".) 2. Как преобразовать текстовое представление даты к значению типа Date? (См. раздел "Значения даты и времени".) 3. Какая функция предназначена для считывание даты по системным часам? (См. раздел "Значения даты и времени".) 4. Какая функция используется для определения дня недели, на который приходится конкретная дата? (См. раздел "Информация о дате и времени".) 5. Какая функция предоставляет наибольшее количество возможностей для определения специальных форматов отображения даты и времени? (См. раздел "Форматирование значений даты и времени".) 122 Часть П. Суббота. Утро
УРОК Работа с текстом Содержание урока ^ Отображение текстовых данных для просмотра пользователем ^ Получение данных от пользователя V Поиск текста ^ Сравнение строк ^ Работа со значениями ASCH ^ Изменение строк При написании программ Excel довольно часто возникает необходимость в обработке данных, представленных в виде текста (в языке VBA текстовые значения называются строками). В VBA предусмотрен специальный тип данных String — он ^Тминут предназначен для хранения текстовой информации. Кроме того, VBA предоставляет обширную коллекцию функций и операторов, позволяющих выполнять различного рода действия над текстовыми данными. Все эти вопросы будут подробно рассмотрены в настоящем уроке. Ввод и вывод текста в программах Excel иногда требуется получить определенную информацию от пользователя или отобразить на экране краткое сообщение. Инструменты VBA, предназначенные для этих целей, рассмотрены в данном разделе. Функция MsgBox Чтобы отобразить сообщение на экране, используйте функцию MsgBox. Эта функция отображает в небольшом диалоговом окне адресованное пользователю сообщение и возвращает значение, указывающее, как пользователь отреагировал на это сообщение. На рисунке 9.1 показан пример подобного диалогового окна.
Рис, 9.1, Сообщение» созданное с помощью функции MsgBox Функция MsgBox имеет следующий синтаксис: MsgBox(подсказка, кнопки, заголовок, файл^справки, контекст) • подсказка — строка, определяющая содержание выводимого на экран сообщения. • кнопки — константа, определяющая, какие кнопки и пиктограммы должны отображаться в диалоговом окне. От нее также зависит, какая кнопка нажимается по умолчанию (т.е. какая кнопка будет считаться нажатой при нажатии клавиши <Enter>). Возможные значение этой константы представлены в табл. 9.1. Если этот аргумент опущен, в диалоговом окне отображается только кнопка ОК. • заголовок— строка, определяющая заголовок диалогового окна (отображаемый на панели заголовка). Аргумент не обязателен; если он не задан, используется название приложения. • файл__справки— имя справочного файла, который предоставляет контекстно-зависимую справку по данному диалоговому окну (по нажатию клавиши <F1>). Необязательный аргумент. • контекст— идентификатор контекста для контекстно-зависимой справки диалогового окна. Аргумент не обязательный. Если задан аргумент файл_справкиу то аргумент контекст также должен быть определен (и наоборот). Таблица 9.1. Константы для аргумента кнопки функции MsgBox ' ' J ' Константа (значение) Описание Отображаются кнопки ОК и Cancel Отображаются кнопки Abort, Retry и Ignore Отображаются кнопки Yes, No и Cancel Отображаются кнопки Yes и No Отображаются кнопки Retry и Cancel Отображается значок критического сообщения (Critical Message) Отображается значок предупреждающего вопроса (Warning Query) Отображается значок предупреждающего сообщения (Warning vbOKCancel(1) vbAbortRetrylgnore(2) vbYesNoCancel(3) vbYesNo(4) vbRetryCancel(5) vbCritical(16) vbQuestion(32) vbExclamation(48) vbInformation(64) Отображается значок информационного сообщения (Information Message) vbDef aultButton2 (256) Вторая кнопка нажимается по умолчанию vbDef aultButton3 (512) Третья кнопка нажимается по умолчанию 124 Часть II. Суббота. Утро
Вопросы создания электронной справочной системы для приложений Excel рассматриваются в уроке 30. От значения, передаваемого аргументу кнопки, зависит следующее: какие кнопки отображаются в диалоговом окне, какой отображается значок и какая из кнопок (если отображается больше одной кнопки) нажимается по умолчанию (т.е. при нажатии пользователем клавиши <Enter>). Чтобы передать сразу два или три значения этому аргументу, объедините их с помощью оператора Or. Например, чтобы отобразить в диалоговом окне кнопки Yes, No и Cancel, значок предупреждающего вопроса и сделать вторую кнопку нажимаемой по умолчанию, используйте такой синтаксис: vbYesNoCancel Or vbQuestion Or vbdefaltButton2 Приведем пример, отображающий сообщение "Exit without saving?" с кнопками Yes, No и Cancel и значком предупреждающего вопроса, где по умолчанию нажимается кнопка No: Reply = MsgBoxC'Exit without saving?", vbYesNoCancel Or vbQuestion Or vbDefaultButton2) Функция MsgBox возвращает целое значение, позволяющее определить, какую кнопку выбрал пользователь для закрытия диалогового окна. Значения, которые может вернуть функция, представлены следующими константами; в скобках дано числовое значение каждой константы: vbOK (1) vbCancel (2) vbAbort (3) vbRetry (4) vbIgnore (5) vbYes (6) vbNo (7) Ниже показан пример, в котором используется такое значение. Dim reply As Integer reply = MsgBoxC'Exit without .saving?", vbYesNoCancel Or vbQuestion Or_ vbdefaultButton2) If reply = VbYes Then • Далее следует код для выхода без сохранения. Elseif reply = vbNo Then ' Далее следует код для сохранения и последующего выхода. Else ' Далее следует код для возвращения в программу. End If « Если для вас не важно, какое значение вернет функция MsgBox, можете его просто игнорировать — другими словами, вызовите функцию MsgBox как подпрограмму. Функция InputBox функция InputBox отображает на экране диалоговое окно с сообщением и поле для ввода текста пользователем. Текст, введенный пользователем, воз- Урок 9. Работа с текстом 125
вращается как значение в вызывающую программу. На рис. 9.2 показан соответствующий пример. ■л Ъ'^ Рис. 92. Диалоговое окно, созданное с помощью функции inputBox' - функция Input Box имеет такой синтаксис: InputBox(сообщение, заголовок, по^умолчанию, поз^х, поз^у, файл_^:,пра,в^^1^,,, крнтекст) • сообщение — сообщение, отображаемое в диалоговом окне. • заголовок— текст, отображаемый как заголовок диалогового окна. Необязательный аргумент; если заголовок не указан, отображается название приложения. • по__умолчанию— текст, отображаемый в поле для ввода при первом открытии диалогового окна. Аргумент не обязателен; по умолчанию используется пустая строка. • no3__Xj поз_у— числовые значения, определяющие позицию диалогового окна относительно верхнего левого угла экрана. Эти значения указываются в твипах (twip), на каждый дюйм приходится 1440 твипов. Оба аргумента не обязательны. Если опущено значение поз_Ху диалоговое окно центрируется по горизонтали. Если опущено значение поз_у^ диалоговое окно размещается приблизительно на треть от верхней границы экрана. • файл_справки— название справочного файла, который предоставляет контекстно-зависимую справку для данного диалогового окна (по нажатию клавиши <F1>). Необязательный аргумент. • контекст-^ контекстный идентификатор для контекстно-зависимой справки данного диалогового окна. Необязательный аргумент. Однако если задан аргумент файл_справкиу необходимо также указать значение аргумента контекст (и наоборот). В примере, показанном ниже, функция InputBox используется для получения от пользователя сведений о его любимом сорте мороженого, причем по умолчанию предлагается выбрать ответ "Шоколадное": flavor = InputBoxC'Bam любимый сорт?", "Мороженое", "Шоколадное") В уроках 19-22 будут рассмотрены методы использования средства User Forms для решения более сложных задач ввода данных. 126 Часть П. Суббота. Утро
ф Поиск текста Чтобы найти положение одной строки внутри другой, применяются функции ^201минут IriSt^ И InStrRev. Функция InStr начинает поиск с начала целевой строки, тогда как InStrRev ищет требуемый фрагмент текста, начиная с конца строки. Эти функции имеют следующий синтаксис: InStr(начало, строка!, строка2, сравнение) InStrRev{строка!, строка2, начало, сравнение) • начало— позиция символа, с которого начинается поиск. Аргумент не обязателен; если он опущен, поиск начинается с первой (функция InStr) или последней (InStrRev) позиции. Несмотря на то, что функция InStrRev выполняет поиск с конца строки, аргумент начало она воспринимает как позицию символа относительно начала строки. • строка! — строка, в которой выполняется поиск. • строка 2 — искомая строка. • сравнение — константа, определяющая способ сравнивания строк. Возможные значения этого аргумента представлены в табл. 9.2. Аргумент не обязателен. Если он не указан, выполняется бинарное (с учетом регистра) сравнение. Таблица 9.2. Константы для аргумента сравнение в функциях InStr и InStrJtmv Константа (значение) Объяснение vbUseCompareOption (-1) Используется настройка оператора Option Compare VbBinaryCompare (0) Выполняется бинарное (с учетом регистра) сравнение vbTextCompare (2) Выполняется текстовое (без учета регистра) сравнение Для определения длины строки применяется функция Len (см. далее в этом уроке). Данные функции возвращают позицию символа, с которого начинается строка2 в строка!, либо О, если искомая строка не найдена. Позиции символов всегда отсчитываются от начала строки, значение 1 соответствует первому символу. Кроме того, функции возвращают значение О в тех случаях, когда определенная строка имеет нулевую длину или когда значение аргумента начало больше, чем длина исходной строки. Выражение Option Compare определяет, как выполняется сравнивание строк в модуле VBA. Это выражение должно быть набрано в начале модуля, за пределами тела прочих процедур. Используйте выражение Option Compare Text для выполнения сравнивания строк без учета регистра или Option Compare Binary — для сравнивания с учетом регистра. В табл. 9.3 продемонстрированы некоторые примеры использования функций InStr и InStrRev. Чтобы найти второе и последующие вхождения одной ароки в другую* вызывайте функцию InStr несколько раз. Для второго и последующего вызовов устанавливайте значение аргумента начало на единицу большим, чем значение, полученное в результате предыдущего вызова. Урок 9. Работа с текстом 127
Таблица 9.3. Примеры использования функций inStru InStrRev Вызов функции Возвращаемое функцией значение InStr(, "Microsoft", "о") 5 InStrRev("Microsoft", "о") 7 InStrRev("Microsoft", "о", б) 5 InStr(, "Microsoft", "MICRO", vbBinaryCompare) 0 Сравнение строк Функция StrComp сравнивает две строки. Она имеет такой синтаксис: StrComp(стр1, стр2, сравнение) стр1 и стр2 — это две строки для сравнения, сравнение — это константа, определяющая способ сравнивания. Значения для этой константы будут теми же, что используются в функциях InStr и InStrRev (см. табл. 9.1). Функция StrComp возвращает: • -1, если стр1 меньше, чем стр2; • О, если стр1 и стр2 одного размера; • 1, если стр1 больше, чем стр2; • Nul 1, если одна из строк, стр1 или стр2у содержит в себе значение Nul 1. Понятия "больше" и "меньше" для строк определяются путем сравнения значений ASCII тех символов, из которых эти строки состоят. Значения ASCII присвоены символам с учетом их алфавитного порядка, причем, если используется бинарное сравнение, строчные буквы считаются большими, чем соответствующие им прописные буквы. Преобразование строк VBA обеспечивает ряд функций для преобразования строковых данных из одной формы в другую. Эти функции рассмотрены в настоящем разделе. Функция StrConv функция StrConv позволяет выполнить целый ряд различных преобразований. Она имеет следующий синтаксис: StrConv(строка, преобразование) Здесь строка — это текстовая строка, подлежащая преобразованию, а преобразование — константа, определяющая тип выполняемого преобразования (см. табл. 9.4). Функция возвращает преобразованную строку. Таблица 9.4. Константы для аргумента преобразование функции StrConv Константа (значение) Преобразование vbUpperCase (1) Преобразует все символы строки к верхнему регистру (см. также функцию UCase) VbLowerCase (2) Преобразует все символы строки к нижнему регистру (см. также функцию LCase) 128 Часть IL Суббота. Утро
Окончание табл. 9.4 Константа (значение) Преобразование VbProperrCase(3) Делает первые буквы каждого слова прописными (верхний регистр), а все остальные — строчными (нижний регистр) vbUnicode (64) Преобразует строку в набор символов системы Unicode VbFromUnicode (128) Преобразует строку Unicode к принятой по умолчанию системной кодировке Функция StrConv позволяет выполнить также некоторые другие преобразования, однако они не указаны в табл. 9.4, поскольку используются только в дальневосточном и японском регионах. Дополнительная информация по данному вопросу изложена в электронной документации VBA. Функции LCase и UCase Данные функции преобразуют все символы строки к верхнему регистру (UCase) или к нижнему регистру (LCase). Эти функции имеют такой синтаксис: LCase(строка) UCase(строка) строка — это любое строковое выражение. Небуквенные символы остаются без изменений. Функция Vol функция Val преобразует строку в ее числовой эквивалент. Синтаксис данной функции следующий: Val(строка) Функция возвращает числовое значение, соответствующее той части строки, которая может быть идентифицирована как число. Функция начинает с первого символа и движется по строке до тех пор, пока не будет найден нечисловой символ. Числовыми символами считаются цифры, символы "плюс" и "минус", десятичная точка, восьмеричные и шестнадцатеричные префиксы (&0 и &Н, соответственно). К числовым символам не относятся знак доллара и запятая. Пробелы и знаки табуляции игнорируются. Если функция не находит в строке числовых символов, она возвращает значение 0. Приведемлекоторые примеры: Val("55 23-я улица") ' возвращает значение 5523 Val("-1.12") ' возвращает значение -1.12 Val("1.000") • возвращает значение 1 Va;("A123") ' возвращает значение О ^JFVJI В некоторых регионах мира в качестве десятичного разделителя используется Яя^ш запятая, а не точка. Функция Val не признает этот символ, даже если в операци- ^иШУ онной системе установлены требуемые региональные настройки. В таком случае можно использовать функцию CDbl, чтобы преобразовать строку наподобие "1,234" в числовое значение. Однако, в отличие от Val, функция CDbl выдает ошибку, если строка содержит только нечисловые символы. Урок 9. Работа с текстом 129
функция Str функция Str преобразует числовое значение в строку. Она возвращает значение типа Variant, содержащее текстовое представление числа. Функция имеет такой синтаксис: Str(значение) Здесь значение — это любое числовое выражение. При обработке положительных чисел полученная строка начинается с пробела. Работа со значениями ASCII Во всех внутренних вычислениях компьютеры используют числовое представление данных. Текстовые строки могут быть представлены посредством присваивания числового значения каждой букве, цифре или символу. Очевидно, что для обеспечения корректной передачи текстовых данных с одного компьютера на другой необходимо использовать одинаковую кодировку. Первым широко распространенным стандартом был символьный набор АЗСП; в нем для представления букв, чисел, знаков пунктуации и символов используются значения от О до 127. Например, буквы от а до z в нижнем регистре представлены значениями от 97 до 122. Кодировка ANSI (American National Standard Institute — Американский национальный институт стандартизации) расширила код ASCII, добавив значения от 128 до 255, соответствующие менее популярным символам, а также используемым во многих языках буквам с диакритическими знаками (например, немецкие умлауты, французские ударения и т.п.). Кодировку ANSI иногда называют расшцре/iwou кодировкой ASCII. Значения от О до 31 кодов ASCII соответствуют таким непечатаемым символам, как перенос каретки, возврат каретки, табуляция. (ASCII расшифровывается как American Standard Code for Information Interchange — Американский стандартный код для обмена информацией.) Так как стало очевидным, что 255 возможных значений ANSI не достаточно для представления того количества символов, с которым работает компьютер, то был разработан стандарт Unicode, в котором для представления более широкого диапазона символов (в том числе математических и графических) используются значения от О до 65535. В настоящий момент задействованы лишь около 39000 значений этих кодов, что оставляет большой запас для дальнейшего расширения. В VBA предусмотрены функции для работы с кодами ASCII и Unicode. Отображение символов Unicode Windows поддерживает возможноаь отображения символов, предаавляемых кодами Unicode, но это не означает, что вы можете автоматически отобразить любой из них на экране (или распечатать его). Какие символы Unicode остаются доступными, зависит от выбранных региональных настроек операционной системы, в том числе и от установленных в системе языков. Функции AsCf AscB и AscW Ранее вы узнали, что во внутренних операциях VBA для представления букв, цифр и других символов используются числовые значения. Данные три функции возвращают числовой код, соответствующий символу. Представим их синтаксис: 130 Часть IL Суббота. Утро
Asc(строка) AscB(строка) AscW(строка) Аргумент строка — это строка, содержащая интересующий символ. Если строка содержит более одного символа, обрабатывается первый из них. Если строка пуста, возникает ошибка. Эти три функции характеризуются следующими отличиями: • As с возвращает код ASCII для данного символа; • AscB возвращает первый байт кода Unicode для данного символа; • AscW возвращает код Unicode для данного символа. Функция Asc применяется в тех случаях, когда необходимо определить, какие символы содержит строка. Например, вы хотите удостовериться, что введенный пользователем текст содержит только буквы и в нем нет цифр и знаков пунктуации. Конечно, для этого можно пройти по тексту по одному символу и сравнить каждый символ с буквами "а", "Ь" и т.д. до "z", однако такой путь вряд ли можно назвать эффективным. Функция Asc позволяет использовать тот факт, что буквам соответствуют коды, ледащие в диапазоне от 97 до 122 (нижний регистр) и от 65 до 90 (верхний регистр). Таким образом, значительно упрощается задача оценки введенных пользователем символов. Код, представленный в листинге 9.1, иллюстрирует такую ситуацию. Созданная функция проверяет, действительно ли строка представляет собой число, т.е. содержит только символы О, 1 и т.д. до 9. Функция возвращает логическое значение True, если полученная строка состоит только из цифр; иначе она возвратит значение False. В данном случае используется тот факт, что коды ASCII для цифр от О до 9 находятся, соответственно, в диапазоне от 48 до 57. Функция оценивает каждый символ строки и проверяет, находится ли значение ASCII для данного символа в указанном диапазоне. Если хотя бы один символ не удовлетворяет этому условию, строка не является числом, и функция возвращает значение False. В программе используются функции VBA Len и Mid. Вероятно, вы сможете сами определить, какие действия выполняют данные функции (см. далее в этом уроке). Листинг 9.1. Содержит ли строка числовое значение? Public Function IsNumber(s As String) As Boolean ' Возвращает значение True, если аргумент является числом, ' содержащим только цифры от О до 9. ' В противном случае возвращает значение False. Dim I As Integer Dim buf As String * 1 IsNumber = True ' Возвращает False, если была получена пустая строка. If Len(s) = О Then IsNumber = False Exit Function End If ' Цикл no всем символам в строке s. Урок 9. Работа с текстом 131
For i = 1 To Len(s) ' Извлекает i-й символ строки, buf = Mid(s, i, 1) If Asc(buf) < 48 Or Asc(buf) > 57 Then IsNumber = False Exit For End If Next i End Function Public Sub TestlsNumber0 Dim str As String Dim InputOK As Boolean ' По умолчанию переменные логического типа имеют значения False, ' однако явная инициализация этих переменных в программе не будет ' лишней. InputOK = False Do str = InputBox("Пожалуйста, введите целое число:") InputOK = IsNumber(str) Loop Until InputOK MsgBox "Спасибо!" End Sub Листинг 9,1 включает также процедуру под названием TestlsNumber, которая позволяет проверить работу функции IsNumber. В теле этой процедуры используется функция InputBox, она отображает на экране окно с предложением ввести целое число. Затем функция IsNumber проверяет, действительно ли является введенный пользователем текст числом. Цикл повторяется, пока пользователь не введет числовое значение. Попробуйте выполнить следующее: измените функцию IsNumber так, чтобы она принимала числа с десятичной точкой или начинающиеся со знака "минус". Чтобы запустить этот пример, выполните описанные далее действия. 1. Откройте редактор VBA. 2. Откройте окно редактирования кода для одного из модулей в окне Project Explorer. Так как программа не взаимодействует с рабочим листом, не имеет значения, какой модуль вы используете. 3. Вставьте код из листинга 9.1 в модуль. 4. Поместите курсор в любом месте процедуры TestlsNumber. 5. Нажмите <F5>, чтобы выполнить программу. В качестве альтернативы нажатию клавиши <F5> можете запустить процедуру VBA, щелкнув на кнопке Run Sub на панели инструментов или выбрав команду Run Sub из меню Run. 132 Часть II. Суббота. Утро
функция Chr Данная функция возвращает символ, соответствующий конкретному числовому коду. Она имеет такой синтаксис: Chr(код) Аргумент код — это имеющийся в вашем распоряжении числовой код. Функция возвращает строку, содержащую соответствующий ему символ. Если код выходит за пределы диапазона кодировки, возникает ошибка. Извлечение или изменение фрагментов строк Функции VBA, рассмотренные в этом разделе, используются для извлечения или %"минут изменения фрагментов строки. Функции Left и Right Эти функции извлекают заданное количество символов, начиная от левого или правого края строки. Синтаксис функций следующий: Left (строка, длина) Right(строка, длина) строка — это исходная строка, а длина — это количество символов, которое необходимо извлечь. Если значение аргумента длина превышает длину строки, функция возвращает всю строку. Как и другие функции VBA, предназначенные для работы со строками, функции Left и Right не изменяют исходную строку. Значение, которое возвращает функция, —- это новая строка с указанными изменениями. Функция Mid Функция Mid извлекает символы из середины строки. Она имеет такой синтаксис: Mid{строка, на чало, длина) строка — это исходная строка, из которой извлекаются символы, начало — это позиция символа, начиная с которого необходимо извлекать фрагмент строки, а значение аргумента длина определяет количество символов, которое следует извлечь. Аргумент длина не обязателен; если он не указан, функция возвращает все символы от позиции, заданной аргументом начало, и до конца строки. Если значение начало больше, чем длина исходной строки, функция возвращает пустую строку. Ниже представлены примеры использования функции Mid: MidC'Bill Gates", 4, 5) ' Возвращает "1 Gat" Mid("Bill Gates", 4) ' Возвращает "1 Gates" Mid("Bill Gates", 12) ' Возвращает "" (пустая строка) Выражение Mid Выражение Mid заменяет часть исходной строки другой строкой. Синтаксис выражения следующий: Mid(строка!, начало, длина) = строка2 Урок 9. Работа с текстом 133
• строка! — строка, которую необходимо изменить. • начало — позиция символа в исходной строке, начиная с которой требуется произвести замену символов. • длина — количество символов в исходной строке, которые необходимо заменить. Этот аргумент не обязателен; если он не задан, количество заменяемых символов равно длине строки2. • строка2 — строка, символы которой заменяют собой символы исходной строки. Вся строка или только часть символов из текстового выражения строка2 будет вставлена в исходную строку. Длина исходной строки остается без изменений. Необходимо помнить, что выражение Mid отличается от функции Mid, которая выполняет совсем другое действие. Функция Mid возвращает часть строки, не изменяя исходную строку, тогда как при использовании выражения Mid сама исходная строка изменяется. Обратите также внимание на то, что выражение Mid — единственный инструмент обработки строк в языке VBA, с помощью которого можно внести изменения в исходную строку. В табл. 9.5 продемонстрировано несколько примеров использования выражения Mid. Исходное значение строки во всех примерах — "123456789". Таблица 9.5. Примеры оператора Mid Оператор Результат Mid{s, 4) = "abed" Mid(s, 4, 2) = "abed" Mid(s, 8) = "abed" s содержит "1234abcd9" s содержит "1234ab789" s содержит "1234567ab" Другие функции работы со строками в табл. 9.6 перечислены остальные функции VBA, выполняющие действия над строками. Таблица 9.6. Дополнительные функции работы со строками Синтаксис Описание Пример Len(стр) Ltrim(стр) Возвращает длину (количество Len ("hello") возвращает 5 символов) строки Возвращает строку без направ- LTrim (" ABC " ) возвра- ляющих пробелов щает "ABC " RTrim {стр) Возвращает строку без конечных RTrim (" ABC ") возвра- пробелов щает " ABC" Spaee{n) Возвращает строку, состоящую из Spaee(5) возвращает ппробелов " " String {п, символ) Возвращает строку, состоящую из String (6, " ! ") возвращает п копий указанного символа "!!!!!!" Trim {стр) Возвращает строку, в которой Trim {" ABC ") возвраща- удалены направляющие и замы- ет "ABC" кающие пробелы 134 Часть II. Суббота. Утро
Обзор Одним из преимуществ языка VBA является его обширная коллекция функций Готово! работы СО строками. Трудно представить себе задачу, связанную с обработкой текста, которую нельзя решить в VBA. В ходе этого урока вы узнали следующее: • функция MsgBox отображает текстовое сообщение для пользователя; • функция InputBox служит для приема текстовых значений, вводимых пользователем; • можно выполнить поиск требуемого фрагмента строки от ее начала (функция InStr) или от ее конца (функция InStrRev); • сравнение строк может выполняться с учетом и без учета регистра символов; • символы имеют свое представление в виде числовых значений, а функции As с и Chr позволяют преобразовать символы в числовой код и наоборот; • функции Left, Right и Mid используются для извлечения фрагментов строк. Проверьте себя 1. Какую информацию содержит значение, возвращаемое функцией MsgBox? (См. подраздел "Функция MsgBox".) 2. Чем отличается функция Mid от выражения Mid? (См. подразделы "Функция Mid" и "Выражение Mid".) 3. Всегда ли строка "apple" в VBA считается равной строке "APPLE"? Поясните ответ. (См. раздел "Сравнение строк".) 4. Чем отличаются функции As с и AscW? (См. подраздел "Функции Asc, AscB и AscW".) 5. Какие функции используются для отбрасывания направляющих и замыкающих пробелов в текстовой строке? (См. раздел "Извлечение или изменение фрагментов строк".) Урок 9. Работа с текстом 135
УРОК Использование диапазонов и выделенных областей Содержание урока ^ Применение объекта Range ^ Понятие относительных диапазонов ^ Комментарии на рабочем листе ^ Использование столбцов и строк для определения положения и размера диапазона ^ Присвоение имен диапазонам Ф Многие действия, выполняемые программами VBA, относятся к определенной части рабочего листа. Разумеется, в подобных случаях возникает необходимость в использовании средств, позволяющих идентифицировать требуемые фрагмен- зТминут ты: как отдельную ячейку, так и целый рабочий лист Excel. Для выполнения этих задач в VBA предусмотрены объекты Range и Selection. Объект Range Объект Range предназначен для создания ссылки на группу ячеек рабочего листа. Это может быть одна ячейка или прямоугольный блок ячеек любого размера (вплоть до размеров самого рабочего листа). Если требуется выполнить над ячейками рабочего листа какое-либо действие, например, изменить их формат или ввести данные, то практически всегда вам придется начинать с создания объекта Range, ссылающегося на необходимый диапазон ячеек. Наиболее часто используемый способ создания ссылки Range состоит в обращении к свойству Range объекта Worksheet: wsRef.Range(ссылка)
в данном случае слово wsRef представляет собой ссылку на рабочий лист. Аргумент ссылка определяет, какие ячейки будут включены в диапазон (обратите внимание, что ссылки на диапазон ячеек записываются в виде строк, заключенных в кавычки). • Чтобы обозначить диапазон, состоящий из одной ячейки, укажите букву столбца и номер строки: " А8" или " Z2 9". • Чтобы обозначить диапазон, состоящий из многих ячеек, укажите через двоеточие координаты верхней левой и нижней правой ячеек: "А8:В12". в Альтернативный способ создания ссылки на диапазон из нескольких ячеек состоит в следующем: по отдельноаи определите верхнюю левую и нижнюю правую ячейки и разделите их запятой. Таким образом, ссылка Range ("А8", "В12") эквивалентна ссылке Range (" AS: В12"). Обратите также внимание, что в программе может быть определено любое требуемое количество объектов Range. Следующая строка ссылается на отдельную ячейку А8 в текущем активном рабочем листе: ActiveSheet.Range("А8") Эту ссылку можно использовать для выполнения различных действий, например, чтобы ввести в ячейку числовое значение 123 или текст "Hello": ActiveSheet.Range("А8") =123 ActiveSheet.Range("A8") = "Hello" Можно также создать переменную, которая будет ссылаться на определенную ячейку или диапазон ячеек: Dim MyRange As Range Set MyRange = ActiveSheet.Range("A8") Теперь переменная MyRange ссылается на ячейку А8 и может быть использована для работы с этой ячейкой. Если вы присваиваете диапазону конкретное значение (числовое или текстовое) и при этом диапазон ссылается более чем на одну ячейку, то это значение записывается во все ячейки данного диапазона. Изначально размещенные в этих ячейках значения заменяются новыми без уведомления. Присвоение диапазону некоторого значения равносильно использованию свойства Value объекта Range. Поэтому данная строка кода: ActiveSheet.Range("А8") = 123 работает подобно следующей: ActiveSheet.Range("A8").Value = 123 Работа с диапазонами Какие возможности открываются перед вами после определения ссылки на диапазон? Выше было показано, как можно размещать данные в ячейках диапазона — требуемые значения просто присваиваются этому диапазону. Таким образом можно поместить в ячейку числовые данные, текстовые данные или формулу. Чтобы вставить в ячейку формулу, наберите ее в виде строки. Обязательно начинайте строку со знака равенства, который укажет Excel, что эта строка является именно формулой, а не просто текстовой ин- 138 Часть II. Суббота. Утро
формацией. Следующий код помещает в ячейку В12 формулу, при вычислении которой складываются значения, содержащиеся в ячейках В10 и В11: ActiveSheet.Range("В12") = "=В10+В11" Дополнительную информацию об использовании формул в программах Excel вы найдете в уроках 12 и 13. В следующих подразделах описаны действия, которые можно выполнять над объектами Range. Относительные ссылки на диапазоны ячеек в рассмотренных ранее примерах диапазоны были "привязаны" к рабочему листу и всегда определялись по номерам строк и буквам столбцов данного листа. В Excel и VBA предусмотрена также возможность определения относительных ссылок на диапазоны. Подобные ссылки определяются не фиксированием конкретного положения на рабочем листе, а посредством указания позиции данного диапазона относительно другого диапазона. Такая возможность весьма полезна при создании программ, которые обращаются к разным ячейкам рабочего листа в зависимости от тех или иных обстоятельств. Рассмотрим такой пример: Dim range1 As Range Set rangel = ActiveSheet.Range("B3") Теперь диапазон rangel ссылается на ячейку ВЗ рабочего листа. Посмотрим на эту проблему иначе: диапазон rangel ссылается на ячейку, которая находится на один столбец правее и на две строки ниже по отношению к верхней левой ячейке рабочего листа (рис. 10.1). На один столбец вправо ^ На две строки вниз Рис. 10J. Позицию диапазона (в данном случае отдельной ячейки) можно рассматривать как позицию по отношению к верхней левой ячейке рабочего листа Предположим, что вместо свойства Range объекта Worksheet используется свойство Range уже существующего объекта Range. Например: Set range2 = rangel.Range("ВЗ") В этом коде "ВЗ" по-прежнему означает "на один столбец правее и на две строки ниже", однако на этот раз данная позиция задана по отношению к диапазону Урок 10. Использование диапазонов и выделенных областей 139
range 1, a не к рабочему листу. Если ссылка range 1 указывает на ячейку рабочего листа ВЗ (как в предыдущем фрагменте кода), то в результате ссылка range2 будет указывать на "один столбец правее и на две строки ниже от ячейки ВЗ", а в терминах рабочего листа — на ячейку С5 (рис. 10.2). На один столбец вправо Ff--'^^\ Pi" ^ СЕ :я-г:А-;>^ ^^"Ki - ' т ' ^ 1 мм у 1 _d На две строки вниз Рис. 10,2. Относительное положение диапазона определяется как его позиция по отношению к другому диапазону Если относительные ссылки определяются с использованием свойства Range, размер исходного диапазона не влияет на размер или положение относительного диапазона. Имеет значение только положение верхней левой ячейки исходного диапазона. Если вы хотите создать относительную ссылку на диапазон, состоящий из нескольких ячеек, укажите этот диапазон ячеек как аргумент свойства Range. Например: Dim rangel As Range, range2 As Range Set rangel = ActiveSheet.Range("B3") Set range2 = rangel.Range{"C4:E5") В последней строке кода часть "С4" аргумента определяет позицию нового диапазона относительно диапазона rangel, тогда как часть "Е5" определяет размер нового диапазона. В результате ссылка range2 указывает на ячейки D6 : F7. Опишем данный процесс подробнее. 1. Исходный диапазон, rangel, ссылается на ячейку ВЗ. 2. Часть "С4" аргумента сообщает программе: "на две ячейки вправо и на три строки вниз". Если отсчет ведется от исходной ячейки ВЗ, получаем ссылку на ячейку D6, которая становится верхней левой ячейкой нового диапазона. 3. Аргумент "С4:Е5" определяет диапазон, ширина которого составляет 3 столбца и высота — 2 строки. Поскольку новый диапазон начинается с ячейки D6, это означает, что он имеет протяженность до столбца F и строки 7; следовательно, диапазон range2 ссылается на ячейки D6: F7. Другой способ определения относительной ссылки на диапазон ячеек заключается в использовании свойства Offset объекта Range. Данный метод отличается от использования свойства Range объекта Range, поскольку в этом случае новый диапазон определяется как числовой сдвиг из исходного диапазона (а не 140 Часть П. Суббота. Утро
как представление в строках и столбцах). Кроме того, новый диапазон автоматически получает тот же размер, что и исходный. Синтаксис свойства Offset имеет следующий вид: OriginalRange. Off set (l?ovOff set, ColumnOffset) Аргументы RowOffset и ColumnOffset представляют числовые значения, которые определяют сдвиг вниз по строкам и вправо по столбцам относительно исходного диапазона OriginalRange. Чтобы выполнить сдвиг влево по столбцам или вверх по строкам, используются отрицательные значения. Например: Dim range1 As Range, range2 As Range Set rangel = ActiveSheet.Range("D4:E5") Set range2 = rangel.Offset(-2, 3) После выполнения этого кода ссылка range2 будет указывать на диапазон G2 : НЗ по следующим причинам. 1. Верхняя левая ячейка исходного диапазона — D4. 2. Аргумент ColumnOffset свойства Offset указывает на ячейку, "расположенную на 3 столбца вправо", т.е. на столбец G. 3. Аргумент RowOffset указывает "на 2 строки вверх", или на строку 2; следовательно, верхний левый угол нового диапазона находится в ячейке G2. 4. Исходный диапазон имел размер 2x2 ячейки, поэтому новый диапазон будет иметь тот же размер. В каких случаях возникает необходимость в использовании относительных ссылок на диапазоны ячеек? Данная возможность особенно полезна, когда необходимо написать код для выполнения определенных действий на рабочем листе, но при этом заранее не известно, по отношению к каким именно ячейкам рабочего листа эти действия должны выполняться. Предположим, что вы хотите отформатировать столбец чисел, определив для каждой второй ячейки полужирный шрифт. Чтобы решить подобную задачу, можно написать программу, работа которой будет начинаться с форматирования активной в данный момент ячейки, причем на пользователя возлагается обязанность сделать таковой первую ячейку обрабатываемого столбца. В таком случае форматирование можно будет применять к любому столбцу рабочего листа. Программа должна выполнять следующие действия. 1. Получить ссылку на активную ячейку. 2. Выбрать для нее полужирный шрифт. 3. Использовать свойство Offset, чтобы получить новую ссылку, которая будет указывать на ячейку, расположенную на две строки ниже от исходной ячейки. 4. Вернуться в п. 2 и повторять этот цикл до тех, пока не будет найдена пустая строка. Программа, показанная в листинге 10.1, демонстрирует это вариант использования относительной ссылки на диапазон ячеек. Чтобы использовать данную программу, выполните такие действия. 1. Заполните значениями (числовыми или текстовыми) какой-нибудь столбец рабочего листа. 2. Сделайте активной первую ячейку этого столбца. 3. Откройте редактор VBA. Урок 10. Использование диапазонов и выделенных областей 141
о 4. Используйте средство Project Explorer, чтобы открыть модуль. Можете использовать модуль, соответствующий рабочему листу, в котором были помещены данные, либо создать новый модуль. 5. Добавьте в этот модуль код из листинга 10.1. 6. Запустите программу одним из уже известных вам способов. Листинг 10.1. Пример использования относительных ссылок для форматирования ячеек рабочего листа гоминут Public Sub AlternateRowsBoldfaceO ' Начиная с активной ячейки, определяет полужирный шрифт для каждой ' второй ячейки столбца. Останавливается, когда встречает пустую ' ячейку Dim rl As Range ' rl фиксирует ссылку на активную ячейку. Set rl = ActiveCell ' Выполняет цикл, пока не будет найдена пустая ячейка. Do While rl.Value о "" ' Устанавливает полужирный шрифт. П. Font. Bold = True ' Получает ссылку на новую ячейку, ' расположенную на две строки ниже предыдущей. Set rl = rl.Offset(2,0) Loop End Sub Пустые ячейки Свойство Value для пустой ячейки, по идее, должно возвращать пустую строку (см. листинг 10.1); однако на самом деле данное свойство возвращает специальное значение Empty. Вы можете убедиться в этом, используя функцию IsEmpty: If IsEmpty(Range("В2").Value) Then ' ячейка В2 пуста. Else ' ячейка В2 не пуста. End If Другие способы получения ссылок на диапазоны в Excel и VBA предусмотрены и другие полезные способы получения ссылок для объектов Range. Они рассмотрены в табл. 10.1. Свойство CurrentRegion может оказаться весьма эффективным средством при обработке данных. Дело в том, что данные в большинстве рабочих листов Excel организованы в блоки или таблицы, разделенные пустыми строками и столбцами. Например, рассмотрим рабочий лист, изображенный на рис. 10.3. Как видно, на нем заданы две таблицы данных, разделенные пустыми строками. 142 Часть 11. Суббота. Утро
с помощью свойства CurrentRegion вы можете легко определить область, включающую всю таблицу, хотя ее точный размер заранее не известен. Таблица 10.1. Дополнительные способы получения ссылок Ссылка Возвращает объект Range, который ссылается на: Ключевое слово Ас - tiveWord Свойство CurrentRegion объекта Range Свойство UsedRange объекта Worksheet Активную ячейку в текущем активном рабочем листе Ссылку на диапазон, ограниченный (но не включающий) пустыми строками, а также столбцами и границами рабочего листа Наименьший диапазон, содержащий все непустые ячейки на рабочем листе шташшштшттш^тттттт^т^т^т. F13 ■' ■ '-r'j:-r-% i ' ®-^|Аг1а1Суг 1 3 А. 8 К 10 11 Ж щ. 14 В Продажи 2001 Кв1 Восточный регион 14 251 ,(Юр. Центральный регион 35 677,00р. Западный регион ; 35 435,00р. Продажи 2002 Кв1 Восточный регион ; 35 134,б0р. ^Центральный регион 24 565,00р. Западный регион 32 136,00р Кв2 25 334,00р. 57 461,00р. "■■ 65 464,00р^ КвЗ 35 521,00р. 56 544,00р. 53 308,0Ьр. Кв2 КвЗ 23 200,б0р ; 32 32Г00р. 23 455,00р. ; 35 413,00р. 213^2,()6р. ] 35 24i;00p^^^ Кв4 35 436,00р. 35 433,00р^ 56 659,00р. Кв4 25 744,00р. 32 453,00р. 35 445.00P Рис. 10.3. Данные Excel часто организованы в таблицы, разделенные пустыми строками и столбцами Предположим, вы знаете, что верхний левый угол таблицы находится в ячейке В2 (как на рис. 10.3), но вам не известно, сколько строк и столбцов содержит эта таблица. Вы можете создать объект Range, который ссылается на всю таблицу (предполагается, что рабочий лист, содержащий таблицу, активен). 1. Создайте объект Range, который ссылается на ячейку В2. 2. Воспользуйтесь свойством CurrentRegion объекта Range, созданного в п. 1. Ниже показан код, иллюстрирующий эти действия: Dim TableRange As Range Dim CellRange As Range Set CellRange = ActiveSheet.Range("B2") Set TableRange = CellRange.CurrentRegion Обратите внимание, что представленный выше код можно упростить, при этом будет получен тот же результат: Урок 10. Использование диапазонов и выделенных областей 143
Dim TableRange As Range Set TableRange = ActiveSheet.Range("B2").CurrentRegion После выполнения этого кода переменная TableRange ссылается на всю таблицу (ячейки В2: F5) и может быть использована для выполнения различных действий, например, для форматирования ячеек. Работа с комментариями Ячейка рабочего листа Excel может иметь вложенный комментарий. Когда ячейка, снабженная комментарием, становится активной, рядом с ней отображается рамка с текстом (как показано на рис. 10.4). Комментарии используются в различных целях: например, для описания данных, которые хранятся в ячейке, или для вывода подсказок пользователю. шт F10 г '.' - *.- Vdvrl.''I2l4^ тттшттш^ m ж к ц .в.- :С^-- жш. Продажи 2002 Кв1 Кв2 КвЗ Кв4 Восточный регион 35 134,00р. 23 200.р0р; 32 321.(Юр. 45 744,00р/ Центральный регион 24 565^0бр^ 23 455 66р! Г 35 413^о6р^ 32 453.00рГ ^Западный регион 32 13б.0рр 21 322,00р. 35 241,00р 35445.00р. Положительная тенденция. Рис. 10.4. Ячейки рабочего листа могут быть снабжены комментариями Чтобы добавить к ячейке комментарий, используется метод AddComment объекта Range: SomeRange.AddComment "Текст комментария" В Excel и VBA не предусмотрена возможность обычной обработки i^ommch- тариев. Другими словами, вы не можете просто изменить комментарий, отредактировав его текст или заменив новым. При вызове метода AddComment для ячейки, которая уже содержит комментарий, возникает ошибка. Следовательно, вначале необходимо проверить, содержит ли ячейка комментарий, и если содержит, удалить его. Только после этого можно добавить новый комментарий к этой же ячейке. Чтобы определить, присвоен ли ячейке комментарий, сравните ее свойство Comment со специальным значением Nothing. Это продемонстрировано в следующем примере: If SomeRange.Comment Is Nothing Then • В ячейке нет комментария. Else ' В ячейке есть комментарий. End If 144 Часть П. Суббота. Утро
Чтобы удалить комментарий, вызовите метод Clear Comments. Используйте этот метод с приведенным выше кодом, чтобы создать процедуру, добавляющую комментарий к ячейке (как показано в листинге 10.2). Обратите внимание на использование в этой программе логического оператора Not. Благодаря ему логическое значение, возвращаемое выражением г.Comment Is Nothing, заменяется на противоположное. В результате инструкции блока If выполняются только в том случае, если проверяемой ячейке уже присвоен комментарий. Листинг 10.2, Процедура добавления комментария к ячейке Public Sub AddComment(Comment As String, r As Range) ' Добавляет указанный комментарий к ячейке, ' на которую указывает объект г. Если ячейка уже имеет • комментарий, он удаляется. If Not г.Comment Is Nothing Then r.ClearComments End If r.AddComment Comment End Sub Прежде чем добавить комментарий к ячейке, убедитесь, что никакой другой комментарий для нее пока не создан. Чтобы прочитать добавленный к ячейке комментарий, используйте свойство Comment .Text. Если вы попытаетесь прочесть это свойство для ячейки, не имеющей комментария, возникнет ошибка; следовательно, необходимо вначале проверить, действительно ли данная ячейка снабжена комментарием (соответствующий код показан ниже). В этом фрагменте используется оператор Debug. Print, который выводит текст комментария в окне Immediate. If Not SomeRange.Comment Is Nothing Then Debug.Print SomeRange.Comment.Text End If Строка, столбец и размер диапазона Чтобы определить положение диапазона ячеек на рабочем листе, воспользуйтесь свойствами Column и Row объекта Range. Они работают следующим образом. • Column возвращает число, указывающее на первый столбец диапазона (крайний левый столбец) — 1 соответствует столбцу А, 2 — В и т.д. • Row возвращает номер первой (самой верхней) строки диапазона. Чтобы определить размер диапазона, используйте свойства Columns . Count и Rows.Count. Эти свойства возвращают для заданного диапазона количество столбцов и строк, соответственно. Считывание данных из диапазона ячеек Если объект Range ссылается на одну ячейку, его свойство Value возвращает содержимое этой ячейки. Но что происходит, если объект ссылается на блок из Урок 10. Использование диапазонов и выделенных областей 145
двух или более ячеек? Тогда свойство Value возвращает массив (типа Variant), в котором содержатся данные из всех ячеек диапазона. Если вы не уверены, что объект Range ссылается на одну ячейку, необходимо выполнить проверку и убедиться, что данные, возвращаемые свойством Value, представляют собой массив. Это задачу можно решить с помощью функции Is Array: Dim X X = SomeRange.Value If IsArray(x) Then ' SomeRange указьгоает на несколько ячеек, и х содержит массив. Else ' SomeRange указьгоает на одну ячейку, и х содержит одно значение. End If Массив, возвращаемый свойством Value, двухмерный, он имеет тот же размер, что и диапазон, на который ссылается данный объект Range. Первое значение размерности массива указывает на количество содержащихся в нем строк, второе значение размерности — на количество столбцов. Чтобы показать это на примере, рассмотрим выделенный диапазон (ячейки В4 : С7), представленный на рис. 10.5. Если создать объект Range, ссылающийся на этот диапазон ячеек, и обратиться к его свойству Value, мы получим следующий массив: • первое значение размерности массива равно числу 4, что соответствует четырем строкам диапазона; • второе значение размерности массива равно числу 2, что соответствует двум столбцам диапазона; • элемент (1,1) содержит значение 1; • элемент (2,1) содержит значение 2; • элемент (4,2) содержит значение 8. Р1И1ЯМ11Ш«Ш1ШРРЩ 1 В4 ' ''''■^^^:y]y/,fir i' rt [X •• ''■■ А • • ■^ШШ^^ЖШХ D 1 Га; 1: ••^- • г-у---5 Рис. 10S. Диапазон из нескольких ячеек, используемый в качестве примера Программа, которая представлена в листинге 10.3, позволяет считывать данные из диапазонов, состоящих из одной и нескольких ячеек. Используемый в этой программе оператор Debug. Print считывает значения из текущей выделенной области и отображает их в окне Immediate. Чтобы выполнить настоящую программу, выполните следующее. 146 Часть п. Суббота. Утро
1. Поместите код из листинга в модуль редактора VBA. 2. Перейдите в Excel и выделите диапазон, содержащий какие-либо значения. Это может быть одна ячейка или область из нескольких ячеек. 3. Запустите программу. Листинг 10,3. Чтение значений из диапазона, состоящего из одной и нескольких ячеек Public Sub DisplayRangeDataО Dim rl As Range Dim i As Integer, j As Integer Dim X As Variant Set rl = Selection If rl Is Nothing Then Debug.Print "Пожалуйста, вначале выделите ячейки" Exit Sub End If X = rl.Value If IsArray(x) Then Debug.Print "Был выделен диапазон из нескольких ячеек" For i = 1 То UBound(x, 1) For j = 1 То UBound(x, 2) Debug.Print "Ячейка " & j & "," & i &," содержит " & x(i,j) Next j Next i Else Debug.Print "Была выделена одна ячейка" Debug.Print "Ее значение " & х End If End Sub Пример возвращаемого этой программой результата показан на рис. 10.6. Такие сообщения были получены при обработке диапазона, представленного на рис. 10.5. ЯНМОТНРММЯМ 1 Был выделен Д1'1апазон из 1 Ячейка 1,1 содержит 1 1 Ячейка 2,1 содержит 5 1 Ячейка 1,2 содержит 2 1 Ячейка 2,2 содержит 6 1 Ячейка 1,3 содержит 3 1 Ячейка 2,3 содержит 7 1 Ячейка 1,4 содержит 4 1 Ячейка 2,4 содержит 8 1 liii} - мпмияннм нескольких ячеек ^^^^Щшп^ 4 ±Г1 Рис. 10.6. Результат выполнения программы, код которой показан в листинге 10.3 Урок 10. Использование диапазонов и выделенных областей 147
Присвоение имен диапазонам ячеек Любому определенному диапазону можно присвоить имя. Один из способов jOMtflfwn решения данной задачи состоит в использовании свойства Name объекта Range: SomeRange.Name = "Объемы продаж" Присвоенное имя должно быть уникально в пределах данной рабочей книги (т.е. оно не может совпадать с именами, ранее присвоенными другим диапазонам). Если диапазон получил название, к нему можно обращаться через коллекцию Range данной рабочей книги с использованием следующего синтаксиса: Range(ИмяДиапазона) Предположим, что в ячейке Вб необходимо отобразить сумму ячеек В1:В5. В следующем фрагменте программы для помещения формулы в ячейку В б используется именованный диапазон: Dim г As Range Set г = Range("Вб") г.Name = "Итоги" Range("Total").Value = "=Sum(Bl:В5)" Теперь ячейка В б содержит формулу =Sum (В1: В5). Присвоенные таким образом имена диапазонов существуют только во время выполнения программы. Другими словами, они не сохраняются в рабочей книге. Если же вы хотите определить для диапазонов постоянные имена, которые будут работать и при следующем сеансе работы с Excel, необходимо явно добавить их в коллекцию Names данной рабочей книги, используя ее метод Add: Names.Add Name:=имя, RefersTo:=ссылка имя— это имя диапазона ячеек, которое должно быть уникальным для данной рабочей книги; ссылка определяет ячейки, на которые ссылается объект имя. Значение аргумента ссылка должно быть строкой, включающей следующие части: • знак равенства; • название рабочего листа, содержащего ячейки; • восклицательный знак; • столбец и строку верхней левой ячейки диапазона; • двоеточие, за которым следуют столбец и строка нижней правой ячейки диапазона (необязательная часть для диапазонов из нескольких ячеек). Синтаксис метода Names .Add представлен с помощью именованных аргументов, он должен напомнить вам об этой возможности. Именованные аргументы можно указывать для любого метода ExceL кроме того, аргументы можно определить по их позиции, как это делалось во многих примерах настоящей книги. Создавая ссылки для ячеек, необходимо помнить о том, что они бывают относительными либо абсолютными. (Более детально различия между этими ссылками будут рассмотрены в уроке 11.) • Абсолютная ссылка указывает на конкретную ячейку рабочего листа, положение которой определяется номером строки и буквой столбца. Чтобы создать абсолютную ссылку, используйте знак доллара. Например, ссылка "$В$6" всегда ссылается на ячейку Вб. 148 Часть IL Суббота. Утро
• Относительная ссылка, подобно относительному диапазону, указывает на ячейку, смещенную относительно текущей активной ячейки на заданное количество строк и столбцов. Чтобы создать относительную ссылку, не набирайте символ доллара. Например, "В6" ссылается на ячейку, расположенную на пять строк ниже и один столбец правее относительно активной ячейки. Ниже представлены примеры создания постоянных именованных диапазонов в рабочей книге. Этим фрагментом кода создается именованный диапазон "Итоговые значения", который ссылается на ячейки В4 : F10 рабочего листа sheet 1: ActiveWorkbook.Names.Add Name:="Итоговые значения", RefersTo:="=sheetl!$B$4:$F$10") Следующим кодом создается именованный диапазон, который ссылается на ячейку, расположенную одной строкой ниже активной ячейки в активной рабочей книге: ActiveWorkbook.Names.Add Name:="Итоги" RefersTo:=ActiveSheet.Name & "!A2" К диапазонам, обозначенным таким образом, обращаются точно так же, как и к временным именованным диапазонам, рассмотренным выше. Например: Range("Итоги").Value = 123 Настоящий код эквивалентен следующему: Dim г As Range Set rl = Range("Итоги") rl.Value = 123 Свойство Selection Свойство Selection (выделенная область), подобно объекту Range, ссылается на диапазон, состоящий из одной или нескольких ячеек. В частности, это свойство ссылается на ячейку (ячейки), выделенные пользователем с помощью мыши или клавиатуры. На одном рабочем листе в определенный момент времени может быть выделена только одна область. Напротив, количество диапазонов, определяемых объектами типа Range, на рабочем листе не ограничено. Еще одно отличие свойства Selection от объекта Range состоит в том, что объект Range может ссылаться лишь на диапазон из одной или многих ячеек, тогда как свойство Selection может также ссылаться и на что-нибудь другое, например, на диаграмму, расположенную на рабочем листе. Чтобы убедиться, что свойство Selection ссылается на диапазон ячеек, используйте функцию Туре- Name. Получая свойство Selection в качестве аргумента, данная функция возвращает строку "Range", если выделена одна или более ячеек. Если же свойство ссылается не на ячейки (выделенной является, например, диаграмма), функция возвращает другую строку. (Если ничего не выделено, свойство Selection возвращает строку Nothing). Таким образом, поскольку нельзя однозначно предполагать, что свойство Selection ссылается на диапазон ячеек, необходимо использовать подобный код: If TypeName(Selection) = "Range" Then ' Выделенная область - диапазон. Else ' Выделенная область - не диапазон. End If Урок 10. Использование диапазонов и выделенных областей 149
Свойство Selection возвращает объект типа Range, который ссылается на выделенные ячейки. После того, как вы получите этот объект, можете использовать его для выполнения необходимых действий. Предыдущий фрагмент можно переписать таким образом: Dim rl As Range If TypeName(Selection) = "Range" Then Set rl = Selection ' Теперь rl можно использовать для работы с выделенными ' ячейками End If В каких случаях может возникнуть необходимость в использовании объект Selection вместо объекта Range? Пожалуй, лишь в одном: если вы хотите позволить пользователю выделить ячейки, с которыми будет работать программа. Чтобы пользователь мог определить диапазон подлежащих обработке ячеек, примените один из двух методов. Первый: сообщите пользователю, что ему необходимо вначале выделить диапазон ячеек и лишь затем запускать программу на выполнение. Применение данного метода подробнее рассмотрено в уроке 11. Второй метод заключается в использовании элемента управления Ref Edit, о чем будет рассказано в уроке 29. Выделение диапазона ячеек для пользователя Чтобы продемонстрировать пользователю выделенный диапазон, примените метод Range объекта Select. При этом диапазон будет выделен в рабочем листе, как если бы его выделил пользователь. Это позволит пользователю проверить, что выделен правильный диапазон. Необходимый код представлен ниже: Do Rangel.Select reply = MsgBox("Правильно ли выделен диапазон?", vbYesNo) If reply = vbYes Then ' Код для обработки диапазона Rangel Else ' Код для изменения диапазона Rangel End If Loop While reply <> vbYes Готово! Обзор Метод Range .Activate выделяет одну ячейку в верхнем левом углу диапазона, независимо от того, насколько он большой. Метод Range. Select выделяет весь диапазон. Для диапазона, состоящего из одной ячейки, методы Select и Activate эквивалентны. Объект Range является важнейшим инструмецтом при решении многих задач программирования в Excel. Объект Range может определять диапазон, включающий от одной ячейки до всего рабочего листа. В программе можно одновременно определить любое требуемое количество объектов Range. 150 Часть IL Суббота. Утро
Вы вправе присвоить название объекту Range и затем использовать это название, чтобы получать к нему доступ. Диапазон, на который ссылается объект Range, может быть определен как с помощью абсолютных обозначений столбца и строки, так и посредством обозначения его положения относительно другого диапазона. Свойство Range .Value используется для записи данных в ячейки диапазона и считывания данных из этих ячеек. Свойство Selection возвращает объект Range, который ссылается на текущую выделенную область. Проверьте себя 1. Сколько диапазонов может быть определено на заданном рабочем листе? (См. раздел "Объект Range".) 2. Сохраняется ли имя, присвоенное диапазону, при следующем открытии этой же рабочей книги? (См. раздел "Присвоение имен диапазонам ячеек".) 3. Как получить ссылку на активную ячейку? (См. подраздел "Другие ссылки на диапазоны".) 4. Сколько комментариев можно присвоить одной ячейке рабочего листа? (См. раздел "Работа с комментариями".) 5. Как определить, что свойство Value возвращает данные, содерж£1Щиеся более чем в одной ячейке? (См. раздел "Считывание данных из диапазона ячеек".) Урок 10. Использование диапазонов и выделенных областей 151
ЧАСТЬ Суббота. Утро. Обзор 1. Какой результат даст выражение 11 mod 3? 2. Если А имеет значение True, а В — False, то какой результат выражения А Or В? 3. Какой результат дает выражение сравнения "Smith" = "smith": True или False? 4. Предположим, что Ob j 1 и Ob j 2 — это объектные ссылки. Как определить, на один ли объект они ссылаются? 5. Одинаковый ли результат дают выражения 4 + 2*8и(4 + 2) *8? Поясните ответ. 6. Всегда ли выполняются все операторы VBA в рамках блока If . . . End? 7. Когда можно опустить часть Else в операторе Select Case? 8. Какие действия выполняет функция IIf? 9. Как можно обеспечить по крайней мере однократное выполнение операторов в цикле Do. . . Loop? 10. Когда используется оператор While. . . Wend? 11. Сколько операторов Exit For можно поместить в цикле For. . . Next? 12. Чем процедура-функция отличается от подпроцедуры? 13. Каково максимальное количество строк кода в процедуре? 14. Как передать массив в качестве аргумента процедуры? 15. Как определяется значение, которое должна возвращать функция? 16. Может ли локальная процедура "помнить" свое значение между вызовами процедуры? Если да, то что для этого необходимо? 17. VBA может идентифицировать даты принятых форматов, например, 12/25/2003. Как обозначить в программе VBA, что такое значение является датой? 18. Какая функция VBA используется для прибавления к дате интервала времени? 19. Какие две функции используются для поиска текста (поиска одной строки внутри другой)? 20. Каким образом можно преобразовать строку, чтобы первая буква каждого слова набиралась в верхнем регистре, а все остальные — в нижнем регистре? 21. Одинаковые ли значения кода ASCII имеют символы "А" и "а"? 22. Как извлечь определенное число символов с начала строки? 152 Часть II. Суббота. Утро. Обзор
23. Какой объект Excel используется для ссылки на блок ячеек рабочего листа в программе VBA? 24. Предположим, диапазон ссылается на одну ячейку рабочего листа. Как определить, что эта ячейка пустая? 25. На что ссылается свойство UsedRange объекта Worksheet? 26. Как можно добавить комментарий к ячейке? 27. Сколько объектов Selection может существовать на рабочем листе? 28. Чем отличается метод Range. Activate от метода Range .Select? Часть IL Суббота. Утро. Обзор 153
чшшш уббШШ ^ботШуше^^шш^тронти и ячей, ЩрШшЩшШШШшбш^ю форм^ шграммитшшшшшпользоеанием.жщ opMamupoBi |>Oltl
УРОК Работа со столбцами, строками и ячейками Содержание урока ^ Использование свойства Cells для ссылки на отдельные ячейки диапазона ^ Использование свойства SpecialCells для выделения ячеек на основании их содержимого •• Обработка отдельных строк и столбцов рабочего листа ^ Добавление и удаление строк и столбцов В предыдущем уроке вы узнали, как использовать объект Range для идентификации отдельных диапазонов рабочего листа и обработки содержащихся в них данных. Иногда при написании программ необходимо обратиться к столбцам, Осталось « т> ^ зоминут строкам ИЛИ каким-то конкретным ячейкам. В настоящем уроке будет показано, как решаются подобные задачи. Обращение к ячейкам с помощью свойства Cells Одним из наиболее эффективных средств, позволяющих обращаться к ячейкам рабочего листа, является свойство Cells объектов Range и Worksheet. Свойство Cells позволяет обратиться к отдельным ячейкам диапазона удобным, с точки зрения программиста, способом. Свойства Cells объектов Range и Worksheet подобны, но имеют некоторые отличия: • свойство Range .Cells ссылается только на ячейки данного диапазона; • свойство Worksheet. Cel 1 s может ссылаться на все ячейки рабочего листа (а не только на используемые).
Существует три способа применения свойства Cells (см. следующие подразделы). Объект Application также имеет свойство Cells. Оно функционирует практически таким образом, как и свойство Worksheet. Cells, однако всегда ссылается на ячейки активного рабочего листа. Ссылка на все ячейки Если свойство Cells используется без аргументов, то оно ссылается на все ячейки диапазона (свойство Range.Cells) или рабочего листа (свойство Worksheet .Cells). Поэтому следующую строку кода можно использовать для изменения шрифта и кегля всех ячеек указанного рабочего листа: Worksheets("Объемы продаж").Cells.Font.Name = "Arial" Worksheets("Объемы продаж").Cells.Font.Size = 10 Аналогично, приведенная ниже строка изменяет фоновый цвет ячеек, принадлежащих диапазону Range 1, на светло-лиловый: Rangel.Cells.Interior.Color = RGB(220, 220, 255) Вопросы изменения фонового цвета ячеек и определения других аспектов форматирования рабочих листов, включая выбор шрифта, подробно рассматриваются в уроке 14. Ссылка на ячейку по строке и столбцу Вы можете использовать свойство Cells для обращения к отдельным ячейкам, Осталось используя слодующий синтаксис: 20 минут Cells{Rowlndex, Columnlndex) Аргументы Rowlndex и Columnlndex — это числовые значения, определяющие ячейку по ее строке и столбцу. Значение 1 соответствует первой строке или первому столбцу диапазона; индексы отсчитываются далее вправо и вниз. Ссылка Cells (1,1) указывает на верхнюю левую ячейку диапазона. Данный способ применения свойства Cells позволяет организовать цикл для перебора всех ячеек диапазона. По сути, диапазон ячеек можно обрабатывать как двумерный массив. Эта процедура выглядит следующим образом. 1. Используйте свойство Range.Rows.Count, чтобы определить количество строк в диапазоне. 2. Примените свойство Range. Columns. Count, чтобы определить количество столбцов в диапазоне. 3. Создайте цикл For. . . Next для прохождения по всем строкам диапазона. 4. Внутри первого цикла For. . .Next создайте второй цикл, предназначенный для прохождения по всем столбцам диапазона. 5. Во внутреннем цикле выполните действие, которое необходимо предпринять по отношению к текущей ячейке. Например, для диапазона г1 этот цикл выглядит следующим образом: For г = 1 to rl.Rows.Count For с = 1 To rl.Columns.Count ' Здесь следуют коды для обработки ячейки rl.Cells(г, с) Next с Next г 156 Часть IIL Суббота. День
Объект Range имеет свойства Width и Height. Исходя из их названий, можно предположить, что они указывают на размер диапазона в строках и столбцах, однако это не так. Настоящие свойства определяют размер диапазона в пикселях. Для определения количества строк и столбцов диапазона необходимо использовать свойства Rows. Count и Columns. Count. В листинге 11.1 показан пример применения свойства Cells. Программа проходит по всем ячейкам текущей выделенной области и находит наибольшее и наименьшее значения, после чего на экране отображается диалоговое окно с полученными результатами (как показано на рис. 11.1). Листинг 11.1. Использование овойства Celb для прохождения по всем ячейкам диапазона Public Sub LargestSmallestValuesО ' Отображает диалоговое окно и обозначает наибольшее и наименьшее ' значения, содержащиеся в текущей выделенной области Dim row As Integer, col As Integer Dim largest_value, smallest_value Dim r As Range Dim s As String ' Проверка наличия выделенного диапазона If TypeName(Selection) <> "Range" Then MsgBox ("Нет выделенного диапазона") Exit Sub End If Set r = Selection • Проверка начинается со значения первой ячейки largest_value = r.Cellsd, 1) .Value smallest__value = r.Cellsd, 1) .Value ' Цикл no всем строкам For row = 1 To r.Rows.Count ' Цикл no всем столбцам For col = 1 To r.Columns.Count If r.Cells(row, col).Value > largest_value Then largest_value = r.Cells(row, col).Value End If If r.Cells(row, col).Value < smallest_value Then smallest__value = r.Cells(row, col) .Value End If Next col Next row s = "Наибольшее и наименьшее значения равны " S = S & largest_value & " и " & smallest_value MsgBox s End Sub Урок 11. Работа со столбцами, строками и ячейками 157
м MIcfosoft'Extet ^ Кйига1 ' ' ' • ' •' I $дйл Правка Бид Вставка Форват Сервис Данные Окно 01рав|« Q a?.«^a^iaQL:5^u Щ1,т'<^\^ ^-ftifii]U^ 100% ^mj- Arial Cyr /5^ 1 ^ш Штк Наибольшее и наименьшее значения равны 54 и 1 ОК Рис. 11.1. Результат выполнения программы, представленной в листинге 11.1 Чтобы посмотреть, как работает эта программа, выполните следующие действия. 1. Наберите представленный в листинге код в редакторе VBA. 2. Перейдите в Excel, заполните числовыми значениями ячейки необходимого диапазона рабочего листа. 3. Выделите диапазон, протащив над ним указатель мыши. 4. Выполните программу из диалогового окна макросов (<Alt4-F8>). Обновление экрана По умолчанию все изменения, внесенные на рабочем листе в ходе выполнения программы, немедленно отображаются на экране (разумеется, если этот рабочий лист виден). Если пользователю не обязательно просматривать промежуточные результаты вычислений, можете отключить возможность обновления экрана. Благодаря этому достигается дополнительное преимущество — программы работают быстрее. Чтобы отключить возможность обновления экрана, присвойте в начале программы свойству Application. ScreenUpdating значение False. Не забудьте вернуть ему значение True по завершении выполнения программы. Прежде чем запустить эту программу на выполнение, убедитесь, что все ячейки выделенного диапазона содержат числовые значения. Наличие пустых ячеек или текстовых значений станет причиной неправильной работы данной программы. Ссылка по позиции ячейки Третий способ обращения к ячейк£1М с помощью свойства Cells состоит в обозначении позиции данной ячейки в диапазоне. При этом используется такой синтаксис: Cells{CellPosition) 158 Часть Ш. Суббота. День
CellPosition — числовое значение, определяющее позицию ячейки в диапазоне. Нумерация ячеек начинается с номера 1 (верхняя левая ячейка) и увеличивается для ячеек, расположенных правее и ниже. Например, в диапазоне, состоящем из четырех столбцов и трех строк, ячейки первой строки имеют номера 1, 2, 3, 4 (слева направо). Следующая строка — 5, 6, 7,8; последняя строка — 9,10,11 и 12. Такой способ применения свойства Cells не предоставляет никаких преимуществ по сравнению с адресацией по строкам и столбцам, описанной в предыдущем подразделе. Пример использования возможности обращения к ячейкам по номерам их позиции в диапазоне с целью организации цикла представлен ниже (предполагается, что объект г указывает на интересующий нас диапазон). For pos = 1 То г.Colunuis.Count * г.Rows.Count ' Здесь наберите код для обработки ячейки г.Cells(pos). Next pos Метод SpecialCells Метод SpecialCells используется для выделения определенных ячеек диапазона на основании оценки их содержимого или других характеристик. В результате вы получаете возможность выполнить необходимые действия только по отношению к отобранным ячейкам. Метод имеет следующий синтаксис: SomeRange.SpeciailCells (Туре, Value) Аргумент Type — обязательный, он определяет тип ячеек, которые должны быть выделены. Возможные значения этого аргумента перечислены в табл. 11.1. Аргумент Value не обязателен, он используется только в том случае, если для аргумента Туре выбрано значение xlCellTypeConstants или xlCellTypeFor- mulas. Возможные значения аргумента Value представлены в табл. 11.2. Метод SpecialCells возвращает объект Range, который ссылается на выделенные ячейки. Полученный объект Range используется для обработки ячеек необходимым вам способом. Например, можно изменить формат ячеек, содержащих формулы, чтобы они визуально отличались от других ячеек. Таблица 11.1. Константы аргумента Туре для метода SpecialCells Константы Выделенные ячейки xlCellTypeAllFormatConditions Ячейки любого формата xlCellTypeBlanks Пустые ячейки xlCellTypeComments Ячейки, снабженные комментариями XlCellTypeConstants Ячейки, содержащие числовые или текстовые значения xlCellTypeFormulas Ячейки, содержащие формулы xlCellTypeLastCell Последняя ячейка данного диапазона xlCellTypeSameFormatConditions Ячейки, имеющие одинаковый формат xlCellTypeVisible Видимые ячейки Таблица 11.2. Константы аргумента Value для метода SpecialCells Константа Описание х1 Errors Ячейки формул с ошибками xlLogical Ячейки, содержащие логические формулы Урок 11. Работа со столбцами, строками и ячейками 159
Окончание табл. 11.2 Константа Описание xlTextValues xlNumbers Ячейки, содержащие текстовые данные Ячейки, содержащие числовые данные Ниже приведены примеры использования метода SpecialCells. Если курсор расположен над таблицей данных, то в результате выполнения данной строки кода активной становится последняя (правая нижняя) ячейка таблицы: ActiveCel1.CurrentRegion.SpecialCells(xlCellTypeLastCell).Activate Свойство CurrentRegion было рассмотрено в уроке 10. Следующий код записывает нулевые значения во все ячейки диапазона г1, которые содержат числовые данные: г1. SpecialCells(xlCellTypeConstants, xlNumbers).Value = О Код, представленный в листинге 11.2, является более сложным примером использования метода SpecialCells. Для выделенной области рабочего листа стиль начертания всех ячеек, содержащих текст, становится полужирным, а цвет шрифта всех ячеек, содержащих числовые значения, — синим. Благодаря этим преобразованиям пользователю легче будет отличить одни ячейки от других. Листинг 11.2. Использование метода SpedalCelb для выполнения избирательного форматирования Public Sub FormatRegion() Dim г As Range If TypeName(Selection) <> "Range" Then MsgBox "Выделите диапазон ячеек" Exit Sub End If Set r = Selection r.SpecialCells(xlCellTypeConstants, xlNumbers).Font.Color =, RGB(0, 0, 255) r.SpecialCells(xlCellTypeConstants, xlTextValues).Font.Bold = True End Sub Использование функции RGB для определения цвета описано в уроке 14. Работа со строками и столбцами Для обработки целых строк или столбцов используются свойства Columns Томинут ^ Rows. Они возвращают объект Range, который ссылается на один или несколько столбцов или на одну или несколько строк. Обратиться к этим свойствам можно тремя различными способами: 160 Часть III. Суббота. День \
свойство Application. Columns (Application. Rows) ссылается на столбцы (строки) активного рабочего листа; свойство Worksheet. Columns (Worksheet. Rows) ссылается на столбцы (строки) указанного рабочего листа; свойство Range.Columns (Range.Rows) ссылается на столбцы (строки) указанного диапазона. Поскольку объект Application в написанных под Excel программах VBA всегда является неявной ссылкой, обращение к свойствам Columns и Rows равносильно обращению к свойствам Application.Columns и Application.Rows, соответственно. Помните, что свойство Range. Columns возвращает ссылку не на целые столбцы, а лишь на ту их часть, которая попадает в указанный диапазон. То же справедливо и для свойства Range. Rows. Ссылка на целые строки и столбцы Для доступа к полным строкам и столбцам, принадлежащим определенному диапазону, можно применить свойства EntireRow и EntireColumn. Например, при использовании записи Range ("В1") .EntireColumn вы получаете ссылку на весь столбец В, а запись Range ("В9") . EntireRow ссылается на все ячейки строки 9. Пример использования этих свойств будет представлен ниже в данном уроке в разделе "Добавление и удаление строк и столбцов". Свойство Rows можно использовать как с аргументом, так и без него (равно как и свойство Columns): • Rows без аргумента возвращает ссылку, указывающую на все строки диапазона или рабочего листа; • Rows in) возвращает п-ю строку диапазона или рабочего листа. Ниже приведено несколько примеров. Ссылка на первый столбец активного рабочего листа: Columns(1) Ссылка на вторую строку диапазона г1: г1.Rows(2) Ссылка на все столбцы, принадлежащие диапазону г1: г1.Columns Ссылка на третий столбец (столбец С) указанного рабочего листа: Worksheets("Итоговый").Columns(3) Помните, что свойства Columns и Rows возвращают объект Range. Для работы со столбцами можно использовать любые свойства и методы объектов этого типа. Особенности работы с объектами Range были подробно рассмотрены в уроке 10. Более развернутый пример применения свойства Columns представлен в листинге 11.3. Данная программа преобразует к денежному (Currency) формату ячейки указанных столбцов активного рабочего листа. Урок 11. Работа со столбцами, строками и ячейками 161
Листинг 11.3, Использование свойства Columns Public Sub FormatColumnsAsCurrency(first As Integer, number As Integer) ' Преобразование к денежному формату столбцов активного рабочего листа. ' Аргумент "first" определяет крайний левый столбец (А=1 и т. д.) ' аргумент "number" определяет количество столбцов. Dim i As Integer For i = first To first + number - 1 Columns(i).NumberFormat = "$#,##0.00" Next i End Sub После набора этой процедуры в редакторе VBA вы не сможете просто запустить ее, поскольку ей необходимо передать значения аргументов. Чтобы использовать данную процедуру на практике, следует создать другую процедуру, вызывающую процедуру FormatColumnsAsCurrency. Эта вторая процедура может выглядеть, например, так: Sub Test О FormatColumnsAsCurrency 2, 3 End Sub Если передать процедуре указанные в этом примере значения аргументов, к денежному формату будут преобразованы ячейки столбцов В, С и D. Чтобы протестировать программу, наберите код процедуры Test в том же модуле, в котором записана процедура FormatColumnsAsCurrency, после чего запустите ее на выполнение. Добавление и удаление строк и столбцов Объект Range имеет свойства EntireColumn и EntireRow, которые позволяют обращаться к целым строкам и столбцам, а не только лишь к их фрагментам, принадлежащим данному диапазону. Эти свойства можно использовать для добавления и удаления строк и столбцов. Чтобы добавить столбцы или строки, выполните следующее. 1. Определите объект Range, охватывающий требуемое количество столбцов или строк в том месте, где должны быть добавлены новые столбцы или строки. 2. Вызовите метод EntireColumn. Insert или EntireRow. Insert объекта Range. При вставке новых столбцов существующие данные сдвигаются вправо. Например, рассмотрим следующий код: Range("В2:С2").EntireColumn.Insert В результате его выполнения: • вставляются 2 столбца (В и С); • ячейки исходного столбца В передвигаются на место столбца D, а 51чейки столбца С перемещаются в столбец Е. 162 Часть Ш. Суббота. День
При добавлении новых строк существующие строки подобным же образом сдвигаются вниз. Чтобы удалить строки или столбцы целиком, используются методы Еп- tireColumn.Delete или EntireRow.Delete. Например, следующим кодом удаляются строки с 5 по 10: Range("А5:А10").EnireRow.Delete о Обзор Рабочий лист состоит из ячеек, организованных в строки и столбцы. В данном готошо! уроке были рассмотрены некоторые инструменты, используя которые программист Excel может работать с ячейками, строками и столбцами. • Свойство Cells позволяет обращаться к отдельным ячейкам диапазона или рабочего листа. • Метод SpecialCells предоставляет возможность выделять 51чейки диапазона на основании их содержимого. С его помощью, например, можно выделить лишь те ячейки, в которых находятся числовые значения или формулы. • Свойства Columns и Rows используются для доступа к столбцам или строкам рабочего листа или диапазона. • Свойства EntireRow и EntireColumn позволяют обращаться к целым строкам или столбцам, входящим в диапазон. • Свойства EntireRow и EntireColumn используются также для добавления или удаления столбцов рабочего листа. Проверьте себя 1. На что ссылается свойство Cells, если оно используется без аргумента? (См. подраздел "Ссылка на все ячейки".) 2. Какой метод необходимо использовать для обращения только к тем ячейкам диапазона, которые снабжены комментариями? (См. раздел "Метод SpecialCells".) 3. Диапазон г1 ссылается на ячейки В1: С1. Ссылается ли г1. Columns на все ячейки столбцов В и С? (См. раздел "Работа со строками и столбцами".) 4. Диапазон г1 ссылается на ячейки А2:А4. На что ссылается г 1. EntireRow? (См. врезку "Ссылка на целые строки и столбцы".) 5. Вы вставляете новый столбец на место столбца В. Что происходит с данными, изначально записанными в ячейках столбца В? (См. раздел "Добавление и удаление строк и столбцов".) Урок 11. Работа со столбцами, строками и ячейками 163
УРОК Программирование с помощью формул Содержание урока ^ Создание в формулах ссылок на ячейки ^ Абсолютные и относительные ссылки ^ Ссылки на именованные диапазоны в формулах V Связывание формул с другими рабочими листами и рабочими книгами ^ Использование операторов в формулах Excel ^ Циклические ссылки ^ Контроль за выполняемыми формулой вычислениями Программы Excel довольно часто выполняют разного рода вычисления; для решения подобных задач программист может использовать два возможных подхода. Так, вычисления можно выполнить в программе VBA с использованием Осталось ^ 30минут операторов, рассмотренных в уроке 5, можно также осуществить вычисления на рабочем листе Excel путем вставки формул в ячейки рабочего листа. Второй подход является темой настоящего урока. Ссылки на ячейки в формулах В формулах Excel почти всегда используются данные, расположенные в других ячейках рабочего листа. Чтобы создавать собственные формулы, необходимо понимать, как выполняется ссылка на ячейки. Существует три возможных варианта: • относительная ссылка на ячейку; • абсолютная ссылка на ячейку; • именованный диапазон.
Относительные ссылки на ячейки Относительная ссылка на ячейку состоит из буквы столбца и цифры строки этой ячейки. Например, A3 — это относительная ссылка. В данном случае слово относительная означает, что подобная ссылка не всегда ссылается на конкретную ячейку A3. Рассмотрим это на примере. Предположим, что в ячейку А5 введена формула =:АЗ+А4. Это означает, что необходимо сложить значения в ячейках A3 и А4. На первый взгляд, не совсем понятно, почему эти ссылки относительные; однако в действительности для Excel это означает, что необходимо сложить значения двух ячеек, расположенных непосредственно над ячейкой с формулой. Этот аспект становится очевидным только при копировании формулы в другую ячейку. Предположим, что эту формулу копируют в ячейку В5. В таком случае Excel заменяет исходную формулу формулой =ВЗ+В4. Обратите внимание, что при этом сохраняется относительное значение данной формулы: необходимо сложить значения двух ячеек, расположенных непосредственно над текущей. Не важно, в какую из них будет скопирована формула; она изменяется таким образом, что всегда подсчитывает результат сложения двух ячеек над ячейкой, в которой записана формула. Относительные ссылки на ячейки используются в Excel по умолчанию, и это объяснимо. Относительные ссылки позволяют создавать формулы и копировать их в другие ячейки рабочего листа. Например, если необходимо сложить числа для двадцати столбцов, вы можете создать формулу для первого столбца и поместить ее в ячейке под этим столбцом; после этого можно скопировать формулу в ячейки под остальными столбцами, и ссылки автоматически изменятся таким образом, чтобы каждая формула суммировала числа своего столбца. Все формулы Excel начинаются со знака равенства. Это указывает Excel что в ячейке содержится именно формула, а не текстовые данные. Абсолютные ссылки на ячейки Абсолютные ссылки на ячейки, в отличие от относительных, не изменяются при копировании. Абсолютная ссылка всегда ссылается на одну и ту же ячейку рабочего листа. Чтобы создать абсолютную ссылку на ячейку, используйте символ доллара: $А$2. Приведем пример формулы, в которой используются абсолютные ссылки: =$А$3+$А$4 Если вы скопируете эту формулу в другую ячейку рабочего листа, ссылки не изменятся. Формула будет всегда складывать значения ячеек A3 и А4. Ссылка на ячейку может быть частично абсолютной (или частично относительной). Абсолютной бывает либо буква столбца, либо цифра строки. Например: • $АЗ — столбец абсолютный, строка относительная; • А$3 — строка абсолютная, столбец относительный. При копировании формулы, содержащей такую ссылку, относительная часть изменяется в соответствии с ее начальным относительным значением, тогда как абсолютная часть остается без изменений. В табл. 12.1 приведено несколько примеров. 166 Часть IIL Суббота. Ден^
Таблица 12.1. Сравнение относительных и абсолютных ссылок Формула в ячейке А2 При копировании в ячейку D6 =А1 =$А$1 =$А1 =А$1 =D5 = $А$1 =$А5 =D$1 Рассмотрим пример использования абсолютных ссылок на ячейки. Задача состоит в том, чтобы создать таблицу, вычисляющую объемы цилиндров различного размера. Возможные значения радиуса цилиндра перечислены в крайнем левом столбце таблицы, тогда как значения высоты цилиндра указаны в верхней строке. В каждой ячейке таблицы отображается объем цилиндра для соответствующего радиуса и высоты. Формула для вычисления объема цилиндра выглядит следующим образом: • 7t— геометрическая константа, число 3,1416; '*пи", равное приблизительно • г — радиус цилиндра; • h — высота цилиндра. Теперь посмотрим на рабочий лист, показанный на рис. 12.1. Какой должна быть формула в верхней левой ячейке результатов (ячейка С 5)? На языке псевдокода она будет выглядеть следующим образом: (число пи) умножить (ячейка В5 в квадрате) умножить (ячейка С4) рдддддщдщ!!!!!^^ С5 v-;-;;b-:/&; =nM(h$i35^2rw ■ р г 6 lL [Т Sl ПТ 1 .А.- :.i .,в-.:я^щ:>->:ол Jk- в u^f-^m-i^mm^mMi^ \ Высота : Hill зГ|4^^Т2^^9^2^1?57^1571^18!8^ >|И| 12,571 25,1Э 37,70; 50,27; 62,вЗ: 75,401 |НИ 28,27| 56,55i 84,82) 113,l6i 141,37| 169,65; Q. НН 56.27- т53; 150.80: 201,06^ 251;зэГ Зб1,59' яН 78,54: 157,08 235,62; 314,16: 392,70! 471,24; 1 ШШт 113.10| 226,19 339,29; 452,39 565,49} 678.58; Рис. 12.1. Таблица, при составлении которой были использованы частично абсолютные ссылки Некоторые программиаы считают, что прежде, чем приступать к написанию кода непосредственно в редакторе VBA, следует записать программу в ''псевдокоде". Псевдокод—это простые описания на русском языке (английском, французском и т.д.) для действий программы на каждом определенном этапе. Урок 12. Программирование с помощью формул 167
Обратите внимание, что значение числа "пи" можно получить, вызвав функцию Excel ПИ (). Исходная формула, записанная в ячейке С5, может иметь такой вид: =ПИ()*(В5^2)*С4 Если же скопировать эту формулу в другие ячейки таблицы, относительные ссылки изменятся, в результате новые формулы уже не будут ссылаться на требуемые ячейки. Например, при копировании данной формулы в ячейку D2 будет получен следующий результат: =ПИ()*(С6^2)*В5 Понятно, что такая формула не возвращает необходимый результат. Чтобы решить поставленную задачу, в формуле следует использовать частично абсолютные ссылки: =ПИ()*($В5^2)*С$4 При копировании такой формулы новые ссылки по-црежнему будут указывать на ячейки верхней строки и левого столбца таблицы (где содержатся исходные данные). Таким образом, в самой таблице будзгг отображаться требуемые значения. Ссылки на именованные диапазоны Как вы узнали из урока 10, диапазонам рабочей книги можно присваивать имена. В формулах для обращения к ячейке можно использовать данное имя, а не ссылку на ячейку. Это относится только к тем диапазонам, которые ссылаются на одну ячейку. Более детальная информация об использовавший именованных диапазонов представлена в уроке 10. Чтобы обратиться к именованной ячейке, просто используйте в формуле ее имя. Например, следующая формула вычисляет сумму значений, содержащихся в ячейках SubTotall и SubTotal2: =SubTotall+SubTotal2 Использование именованных ячеек вместо ссылок на эти ячейки имеет ряд преимуществ. Так, например, ссылки на ячейки не обновляются, если в рабочий лист добавляются (удаляются) строки или столбцы. Следовательно, если формула ссылается, скажем, на ячейку С5, и в рабочий лист над пятой строкой вставляется еще одна строка, данные, которые ранее находились в ячейке С5, теперь окажутся в ячейке D5. Все формулы, которые ссылались на ячейку С5, будут все равно обращаться именно к этой ячейке. Напротив, имя диапазона, каковым ранее являлась ячейка С5, после добавления строки будет соответствовать уже ячейке D5, и формула будет работать правильно. Кроме того, при переносе данных из одной части рабочего листа в другую имена диапазонов сохраняются за перемещаемыми данными. Диапазоны из нескольких ячеек можно использовать в некоторых встроенных функциях Excel рассмотренных в уроке 13. Осталось 20 минут Ссылка на ячейки других рабочих листов и книг Формула может ссылаться на ячейку другого рабочего листа (в пределах той же рабочей книги) с помощью такого обозначения: НазваниеЛиста \ СсылкаНаЯчейку 168 Часть III. Суббота. День
Например, следующая формула отображает результат умножения на число 10 значения ячейки А2 рабочего листа Лист 1: =10*Лист1!А2 Чтобы сослаться на ячейку из другой рабочей книги, которая в данный момент открыта в Excel, используйте такой синтаксис: [ИмяФайлаРабочейКниги] ИмяРабочегоМиста!СсылкаНаЯчейку Например, следующая формула отображает значение, вдвое меньшее значения ячейки D5 на листе Лист 1 в книге Продажи. х1 s: =0.5*[Продажи.хХз]Лист1!В5 Если название рабочей книги, на ячейку которой создается ссылка, содержит один или несколько пробелов, его необходимо заключить в одинарные кавычки: = 0.5*' [Объемы продаж.х18]Лист1' !D5 Если рабочая книга в данный момент не открьгга, при составлении ссылки необходимо указать полный путь к ее файлу, также заключенный в одинарные кавычки: =0.5*'С:\data\[Объемы продаж.х1з]Лист1'!D5 В Excel используйте команду Правка==>Связи, чтобы просмотреть все ссылки на источники, расположенные за пределами текущей рабочей книги. Нарушение ссылок между рабочими книгами В некоторых ситуациях ссылки между рабочими книгами могут нарушаться, и вам необходимо об этом помнить. Если исходная рабочая книга (та, в которой содержатся внешние данные) и целевая книга (в которой используются ссылки на эти данные) открыты, а вы используете команду Файл<=>Сохранить как для создания резервной копии. Excel автоматически обновляет целевые ссылки, заменяя старое название файла новым. Такие изменения могут оказаться нежелательными. Если вы переименуете исходную рабочую книгу, когда целевая книга закрыта, это новое название файла не будет отображено в ссылках. Операторы Excel предоставляет ряд математических, условных и логических операторов, которые используются при составлении формул. Вы вскоре убедитесь, что эти операторы практически идентичны операторам VBA. Математические операторы Математические операторы Excel подобны используемым в языке VBA. Они позволяют выполнять стандартные операции сложения (+), вычитания (-), умножения (*) и деления (/), а также некоторые другие действия, перечисленные ниже. • Целочисленное деление (\). Осуществляет деление и возвращает целую часть результата. Таким образом, 11\3 дает результат 3. • Возведение в степень (^). Возводит число в указанную степень. В VbA выражение 4^2 означает "четыре во второй степени", или 4^, что равно числу 16. • Остаток от деления, или модуль (mod). Выполняет деление и возвращает остаток. Например, 18 mod 5 дает результат 3. Числа с плавающей точкой при использовании оператора mod округляются до целых. Урок 12. Программирование с помощью формул 169
э в Excel отсутствует оператор присвоения. Знак равенства используется для обозначения формул, а также как оператор сравнения. Операторы сравнения Операторы сравнения Excel идентичны операторам сравнения VBA. Они осуществляют сравнение двух значений и возвращают логические значения True (TRUE) или False (FALSE). Например, с их помощью можно определить, больше, меньше или равны содержащиеся в ячейках значения по отношению к некоторым заданным для сравнения числам. Перечислим эти операторы сравнения: • = равно; • > больше; • < меньше; • >= больше или равно; • <= меньше или равно; • о не равно. Логические операторы Как отмечалось в уроке 5, логические операторы используются для работы со значениями True и False. В самом приложении Excel не предусмотрены логические операторы, но зато в распоряжение программиста предоставляются функции, выполняющие те же задачи, что и операторы AND, OR и NOT в языке VBA: • AND {усл1, усл2) — возвращает True, если выражения усл1 и усл2 также возвращают значение True; в противном случае возвращает значение False; • OR (усл1, усл2) — возвращает False, если усл1 и усл2 также возвращают значение False; в противном случае возвращает значение True; • NOT {уел) — возвращает True, если уел имеет значение False; возвращает False, если уел равно True. Дополнительные сведения о логических операторах и примеры их использования представлены в уроке 5. Как можно избежать циклических ссылок Циклическая ссылка возникает в тех случаях, когда формулы в двух или бо- jOMoIiwn ^^^ ячейках зависят друг от друга. Приведем простой пример: • формула в ячейке А2: =В2/2; • формула в ячейке В2: =А2 * 10. Очевидно, что значение в ячейке А2 зависит от значения ячейки В2, а значение в ячейке В2, в свою очередь, зависит от значения ячейки А2. Excel не может выполнить вычисления, если в формулах появляется циклическая ссылка. Если, набирая формулу вручную, вы создаете циклическую ссылку. Excel отображает на экране предупреждающее диалоговое окно. В этом случае вы можете открыть 170 Часть Ш. Суббота. День
панель инструментов Циклические ссылки (воспользовавшись командой Вид^ Панели инструментов'=с>Циклические ссылки), где также обозначается возникшая циклическая ссылка между ячейками. Пример создания циклической ссылки показан на рис. 12.2. Е8 ^ ;. \Л'^ =В2*123 Hi m Ш Ш IS m m Ш $E$8 Рис, 12,2. Excel не позволяет вводить циклические ссылки вручную Однако вы имеете возможность ввести циклическую ссылку из программы VBA. Значение для такой ячейки не вычисляется — в ней просто отображается 0. Чтобы обнаружить циклические ссылки в коде, используйте свойство CircularRef егепсе объекта Worksheet. Это свойство возвращает объект Range, который ссылается на первую циклическую ссылку на рабочем листе, либо Nothing, если циклические ссылки отсутствуют. Данное свойство можно использовать для выявления источника циклической ссылки на рабочем листе, как показано в программе из листинга 12.1. Листинг 12,1. Программа для обнаружения циклических ссылок Sub ShowCircularReferencesO If ActiveSheet.CircularRefегепсе = Nothing Then MsgBox "Ha этом листе циклических ссылок нет " & АсtiveSheet.Name Else ActiveSheet.CircularRefегепсе.Select End If End Sub При выполнении приведенного выше кода программа проверяет наличие циклических ссылок на активном рабочем листе. Если циклические ссылки не найдены, отображается соответствующее сообщение. Если же такая ссылка найдена, она выделяется на рабочем листе. При разработке программ свойство CircularRef егепсе используется не очень часто. Как программист вы можете применить код из листинга 12.1 или Урок 12. Программирование с помощью формул 171
аналогичный, чтобы проверить, не будут ли возникать в результате выполнения программы циклические ссылки на рабочих листах вашего проекта. Контроль за производимыми формулой вычислениями По умолчанию Excel автоматически пересчитывает все формулы рабочего листа. В большинстве случаев данный факт является положительным, поскольку пересчет выполняется настолько быстро, что не вызывает заметных задержек в работе программы и не приводит к появлению других проблем. Однако могут возникать ситуации, когда автоматический пересчет формул становится нежелательным. В частности, для пересчета большого количества формул и ссылок в больших и сложных рабочих книгах может понадобиться значительное время, даже при работе на мощном компьютере. В таких случаях Excel предлагает возможность ручного пересчета формул. В Excel вы сможете определить необходимый режим вычислений, если выберете команду Сервис^Параметры. На экране появится диалоговое окно Параметры, на вкладке Вычисления которого можно выбрать вариант автоматически или вручную (рис. 12.3). щшщт шштит. Междунвродиые I 0(1крШ1ение I f^xieepitt ош11бо«: j 0||фографий | Бвзопвсноаь Вцд d^j^^^Ilr Правка ]•'Общие ] Йврезед | Оиюси | Диафамиа j Цвет Вычисления ■- '■':''• -.■ - ■-■■"•■■■♦■■•■ ■■■■ ' (• ^|вгом8гйчес1сн ^''" •; ■ ■'.■ .'С авгомгтнчеош |афйе таблиц ' йыциспигь (F9) Пересчет £иста Г^)едельное «i^fcno >ггбрацив: jlOO р гбновлягь удаленные ссылки • Г* хо'чйооъ' «ак we ук^т:: •,- ■;••} -^^л'••;• .• *' Огноогге1№Н8я 1Ю13>вшносп>: 10,001 Р* сахракять 1начемия енеегикх смэей ■ л/V- - ' Огиенз! Рис. 12.3. Определите способ пересчета формул в Excel: автоматически или вручную При выборе режима ручного пересчета формул данная настройка распространяется на все открытые в этот момент рабочие книги. Режим пересчета формул является свойством приложения Excel, а не отдельных рабочих книг или листов. Оставаясь в Excel, выполните следующее: • нажмите <F9>, чтобы пересчитать формулы во всех открытых рабочих книгах; 172 Часть Ш. Суббота. День
• нажмите <Shift+F9>, чтобы пересчитать формулы только в активном рабочем листе. В программах VBA также можно определять режим выполнения вычислений для текущей рабочей книги. Чтобы выбрать ручной режим пересчета формул, присвойте свойству Calculation объекта Application значение xlCalcula- tionManual: Application.Calculation = xlCalculationManual Вы сможете вновь вернуться к режиму автоматического пересчета формул, если присвоите этому свойству значение xlCalculationAutomatic. В программе может быть установлен режим ручного пересчета формул, в таком случае перед выходом из данной программы обязательно необходимо вернуться к режиму автоматического пересчета. Если выбран режим ручного пересчета формул, программа может инициировать пересчет формул посредством вызова метода Calculate. Этот метод вызывается для трех перечисленных ниже объектов. • Объект Appl i cat ion выполняет пересчет для всех открытых рабочих книг. • Объект Worksheet выполняет пересчет для одного листа. • Объект Range выполняет пересчет для заданного диапазона. Приведем несколько примеров. Следующая строка кода выполняет пересчет формул во всех открытых рабочих книгах. Обратите внимание на следующее: поскольку ссылка на объект Application всегда подразумевается, можно использовать только ключевое слово Calculate: Calculate Представленный далее код вычисляет все формулы в рабочем листе Продажи активной рабочей книги: АсtiveWorkbook.Worksheets("Продажи").Calculate Код, отображенный ниже, вычисляет все формулы, которые содержатся в ячейках столбцов А, В, С и D активного рабочего листа: Activesheet.Columns{"A:D").Calculate Обзор Одним из наиболее существенных преимуществ Excel является возможность вы- Готоао! полнения необходимых пользователю вычислений посредством создания формул в ячейках рабочих листов. В настоящем уроке было рассказано о создании этих формул в программах VBA. • Во многих формулах при выполнении вычислений используются данные из других ячеек, такие формулы должны включать ссылки на эти ячейки. • Ссылка на ячейку может быть абсолютной или относительной. • В формулах допускается использование ссылок на ячейки других рабочих листов и рабочих книг. • Операторы, предназначенные для применения в формулах Excel, аналогичны операторам VBA. Урок 12. Программирование с помощью формул 173
Необходимо избегать появления циклических ссылок, в которых две ячейки ссылаются друг на друга. Формулы на рабочих листах могут вычисляться автоматически либо под управлением программы. Проверьте себя 1. Чем отличаются относительное ссылки на ячейки от абсолютных? (См. раздел "Ссылки на ячейки в формулах".) 2. Как в формуле можно указать ссылку на ячейку, расположенную на другом рабочем листе той же рабочей книги? (См. подраздел "Ссылка на ячейки других рабочих листов и книг".) 3. Существуют ли в Excel такие логические операторы, которые имеются в языке VBA? (См. подраздел "Логические операторы".) 4. Как определить присутствие на рабочем листе циклических ссылок? (См. раздел "Как можно избежать циклических ссылок".) 5. В каких случаях может возникнуть необходимость в использовании режима ручного пересчета формул? (См. раздел "Контроль за производимыми формулой вычислениями".) 174 Часть III. Суббота. День
УРОК Программирование с использованием встроенных функций Excel Содержание урока ^ Применение функций Excel в программе VBA ^ Обзор функций Excel ^ Объект WorksheetFunction Ф Вычислительный потенциал Excel не ограничивается возможностью создания формул (см. предыдущий урок). В частности, пользователь имеет доступ к библиотеке предустановленных функций, которые можно использовать для органи- 30минут зации вычислении на рабочем листе. Встроенные функции Excel В Excel вы найдете большую библиотеку предустановленных функций, которые можно использовать на рабочем листе. Каждая функция предназначена для выполнения какой-нибудь стандартной (или более специфической) вычислительной операции. Вы можете самостоятельно вычислять необходимые вам значения (например, размер выплаты по займу или сумму амортизационных отчислений), однако лучше использовать соответствующую функцию. Конечно, для этого необходимо знать, какие функции для каких целей предназначены, а потому настоящий урок будет посвящен рассмотрению некоторых наиболее популярных встроенных функций Excel. При работе непосредственно в Excel доступ к функциям осуществляется через панель функций. При щелчке на кнопке fx на экране отображается диалоговое
окно Мастер функций (рис. 13.1). В этом диалоговом окне можно выбрать функции, отобразив их в алфавитном порядке разбитыми по категориям, а также просмотреть краткое описание выделенной функции. Используя это диалоговое окно, вы можете быстро ознакомиться с функциями, предусмотренными в Excel. Iti^^ioi^^^^^ : '■■'.' ^ ' ^:' \:.S' .'■' t«.«iii»i;ii;^-'"'-^- '"'- ■ £вг€^(:^||я: Полный алфавитный перечень ▼[ ACOS ACOSH ASIN ASINH ATAN ATAN2 AIIS(M«CHo)- -^•■-.'^^^'": ;-^''.' ';../л'>-> /^^:;; возв|)8щаег модуль (]вбоб11Югнуи> вепичйну) тст. mwom.n^ Функции ок ( ■- ■■- ^ .—. 1* : Ш|Ш|Щ-щ1^\ 1 |{1|Ши 11 Огнена 11 Рис. 13.1. Диалоговое окно Мастер функций программы Excel Excel предлагает настолько большое количество функций, что все их невозможно будет рассмотреть в пределах одного урока. Во второй части настоящего урока представлены сведения о некоторых наиболее часто применяемых встроенных функциях и приведены примеры их использования, однако это лишь малая часть возможностей, которыми вы вправе воспользоваться. В справочной системе Excel или с помощью диалогового окна Мастер функций можно получить информацию о других функциях, не рассмотренных в этом уроке. Использование функций Excel при составлении формул Функция Excel состоит из названия, за которым следуют скобки. Почти все функции имеют один или несколько аргументов, принимающих значения, которые затем используются в процессе вычислений. Значениями аргументов могут быть строки, ссылки на ячейки, ссылки на диапазон или даже другие функции. Важно, чтобы тип передаваемого значения соответствовал типу аргумента, независимо от формы самого значения. К примеру, функция, выполняющая числовую операцию, не должна получать в качестве аргумента текстовые данные. Чтобы использовать функцию, включите ее в формуле и затем вставьте в нужную ячейку. Формула может содержать только функцию, как в приведенном ниже примере, где функция СУММ используется для суммирования значений ячеек В1 :В9 рабочего листа "Продажи" и отображения полученного результата в ячейке В10: Worksheets ("Продажи") .Range ("ЕЮ") = "=СУММ(В1 :В9) " 176 Часть IIL Суббота. День
э функция может также быть частью более сложной формулы, как в следующем примере, где суммируются значения ячеек В1 :В9 и полученный результат умножается на значение ячейки InterestRate: Worksheets("Продажи").Range("BIO") = "=СУММ(В1:В9)*InterestRate" Передаваемые функциям в качестве аргументов ссылки на ячейки и диапазоны действуют подобно ссылкам, используемым при составлении формул. Подробнее об этом рассказывалось в уроке 11. Обзор функций Excel в этом уроке представлены сведения по наиболее часто применяемым функциям, ^гсштт ^ также приведены некоторые примеры их использования. Встроенные функции Excel разбиты по категориям, и эта классификация соблюдается в данном уроке. Однако функции, относящиеся к более специфическим категориям (например, статистические функции), в настоящей книге не рассматриваются. Логические функции рассмотрены в уроке 12, а функции баз данных — в уроке 27. Финансовые функции Финансовые функции Excel предназначены для выполнения различных сложных вычислений, в том числе для определения суммы ежегодной ренты, амортизационных отчислений и т.п. Возможно, наиболее часто используется функция ПЛТ, вычисляющая размер выплат по займу. Например, если вы рассматриваете кредит на покупку автомобиля стоимостью 20000 долларов под 5% годовых на четыре года, то эта функция вычислит сумму ежемесячных выплат по такому кредиту. Синтаксис функции ПЛТ следующий: ПЛТ(ставка, кпер, пс, бс, тип) • ставка — процентная ставка за период; • кпер — количество периодов или срок кредита; • ПС — сумма кредита (текущая стоимость); • бс— необязательный аргумент; сумма, которую необходимо выплатить после всех периодических выплат (будущая стоимость). Для большинства кредитов эта сумма равна нулю, и потому нулевое значение используется для данного аргумента по умолчанию; • тип — необязательный аргумент; равен нулю (по умолчанию), если выплаты осуществляются в конце каждого периода. Равен числу 1, если выплаты осуществляются в начале каждого периода. Возвращаемое функцией значение — это сумма, которую необходимо выплачивать в каждом периоде. Важно, чтобы для аргументов ставка и кпер использовался один и тот же период. Для большинства кредитов применяется годовое значение процентной ставки, однако выплаты осуществляются ежемесячно. Чтобы решить предложенную выше задачу, необходимо выполнить такие вычисления: • 5% годовых — это то же самое, что О . 05/12 в месяц; • период в 4 года — это то же самое, что 4*12 месяцев. Урок 13. Программирование с использованием встроенных функций Excel 177
Ежемесячные выплаты по реальному кредиту могут отличаться от значений, возвращаемых функцией ПЛТ, так как в сами выплаты по кредиту могут быть включены дополнительные проценты. Формула для вычисления ежемесячных выплат по данному кредиту выглядит так: =ПЛТ(0.05/12, 4*12, 20000) Функция ПЛТ возвращает отрицательное значение для выплат по кредиту, поскольку это денежные затраты, а не денежные доходы. Чтобы получить положительное значение, просто поставьте знак "минус" перед формулой. Программа, код которой показан в листинге 13.1, является примером использования данной функции для создания рабочего листа, на котором вычисляются суммы выплат по кредиту. Кроме того, в этой программе продемонстрирован способ создания пользовательских приложений с помощью возможностей языка VBA. Этот способ состоит в написании программы, создающей рабочий лист вместе со всеми необходимыми заголовками, ячейками для ввода данных и формулами. Будучи выполненной один раз, программа больше не используется, а полученный в результате рабочий лист сам представляет собой пользовательское приложение. Листинг 13Л. Программа, создающая рабочий лист для вычисления выплат по кредиту Public Sub CreateLoanWorksheet() Dim wb As Workbook Dim ws As Worksheet ' Создание новой пустой рабочей книги Set wb = Workbooks.Add ' Изменение названия первого рабочего листа wb.Worksheets(1).Name = "Выплаты по кредиту" Set ws = wb.Worksheets("Выплаты по кредиту") ' Добавление заголовка на рабочем листе WS.Range("А1") = "Выплаты по кредиту" ' Размещение заголовков в столбце В ws.Range("В4") = "Сумма кредита" WS.Range("В5") = "Годовая процентная ставка" ws.Range("Вб") ='"Срок кредита в годах" ws.Range("В7") = "Ежемесячные выплаты" ' Увеличение ширины столбца В с целью полного ' отображения текста заголовков ws.Range("В1").EntireColumn.AutoFit ' Помещение формулы для вычисления выплат по кредиту в ячейку С7 ws.Range("С7").Value = "=-ПЛТ(05/12, сб*12, С4)" ' Сохранение рабочей книги wb.SaveAs FileName:="Кредитный__калькулятор" End Sub 178 Часть HI. Суббота. День
Дизайн создаваемого рабочего листа будет достаточно простым. На этом листе должно отображаться название приложения, еще три ячейки будут содержать названия параметров, значения которых необходимо определить пользователю (сумма кредита, процентная ставка, срок погашения), кроме того, необходима ячейка с названием вычисляемого результата. Результирующая ячейка содержит формулу ПЛТ, вычисляющую сумму ежемесячных выплат по кредиту. Итак, последовательность действий, выполняемых программой, выглядят следующим образом. 1. Создание новой рабочей книги. 2. Присвоение первому рабочему листу названия "Выплаты по кредиту", которое будет обозначаться на его корешке. 3. Вставка необходимых заголовков (названий) в требуемые ячейки. 4. Вставка формулы, использующей функцию ПЛТ, в результирующую ячейку. 5. Сохранение рабочей книги. Необходимо также выполнить еще одно действие. Названия приложения, параметров и вычисляемого результата, вставляемые в ячейки рабочего листа, шире, чем принятая по умолчанию ширина столбца. Следовательно, необходимо увеличить ширину столбца, чтобы эти названия полностью отображались на рабочем листе. Подобная проблема решается путем использования метода AutoFit, автоматически увеличивающего ширину столбца до размера, при котором помещенные в нем данные могут отображаться полностью. На рис. 13.2 показан рабочий лист, созданный в результате выполнения данной программы. Изначально в итоговой ячейке С7 будет отображаться значение ошибки #ДЕЛ/0 !, поскольку ячейки, значения которых используются в качестве параметров формулы ПЛТ, пусты, и функция не может корректно вычислить результат. При вводе чисел в эти три ячейки значение ошибки будет заменено вычисленным результатом. Процентные значения необходимо вводить в виде десятичных чисел. Например, вместо значения 5% следует ввести число 0.05. Из рис. 13.2 видно, что в способ оформления представленных на нем данных необходимо внести некоторые изменения. • Стиль этого рабочего листа слишком прост. Применив инструменты форматирования, можно сделать его более привлекательным. • Сумма кредита должна отображаться в денежном формате, а процентная ставка — в процентном. • Неосторожный пользователь может стереть или изменить содержащиеся в ячейках названия или формулу, вычисляющую результат. К этому проекту мы еще вернемся в последующих уроках. После ознакомления с некоторыми дополнительными аспектами программирования мы без труда сможем устранить все эти недостатки. э функции даты и времени В Excel информация о дате и времени отображается в том же формате, что и в языке uiMmm ^^^ ДЛЯ типа данных Date: обозначения даты и времени записываются как числа с плавающей точкой, где целая часть представляет собой количество дней, прошедших с 31 декабря 1899 года до указанной даты, а дробная часть — время в виде Урок 13. Программирование с использованием встроенных функций Excel 179
доли 24-часового дня. Самая ранняя дата, которую воспринимает Excel, — это 1 января 1900 года, ей соответствует первый порядковый номер (число 1). На рабочем листе можно вводить даты в любом общепринятом формате, и Excel автоматически распознает это значение как дату. Введенное значение будет преобразовано к соответствующему порядковому номеру, который затем используется при выполнении внутренних вычислений, однако на экране значение даты отображается в понятном для пользователя общепринятом формате. То же самое происходит и со значениями времени. О е^;в'Й:®|^а^?Г|Ж|^ 'ij:flA'il,\tu'M 100% Выплаты по кредиту :В4^-^4:^/? [Годовая проце^ 0,05 jCpoK кредита в годах 4[ ii?!*?!!^?^^!'^!^ !^ 230.29р \ < Ж и1\Выплаты по кредиту/Яй(рг2//^^ Рис. 13.2. Рабочий лист» созданный программой из листинга 13.1 В отличие от VBA, Excel не может обрабатывать отрицательные порядковые номера дат, используемые для представления дат до 1 января 1900 года. Функции даты и времени Excel в некоторой степени дублируют функции VBA. Их краткое описание представлено в табл. 13.1. Более подробные сведения о функциях Excel вы можете найти в справочной системе этого приложения. 180 Часть IIL Суббота. День
Таблица 13.1. Функции даты и времени Excel Функция Описание Date (ДАТА) Возвращает для даты, указанной в виде года, месяца и дня, соответствующий порядковый номер DateValue (ДАТАЗНАЧ) Преобразует строку, содержащую форматированную запись даты, соответствующий этой дате порядковый номер Day (ДЕНЬ) Возвращает день месяца (1-31) для указанной даты Hour (ЧАС) Возвращает час дня (0-23) для указанного времени Minute (МИНУТЫ) Возвращает минуту часа (0-59) для указанного времени Month (МЕСЯЦ) Возвращает месяц года (1-12) для указанной даты Now (ТДАТА) Возвращает текущую дату и время в формате дата/время Second (СЕКУНДЫ) Возвращает секунду минуты (0-59) для указанного времени Time (ВРЕМЯ) Преобразует час, минуты и секунды в значение времени Value (ВРЕМЗНАЧ) Преобразует строку, содержащую форматированную запись времени, в соответствующее этому времени значение Today (СЕГОДНЯ) Возвращает текущую дату в формате даты Weekday (ДЕНЬНЕД) Возвращает день недели (1-7) для указанной даты Year (ГОД) Возвращает год указанной даты Математические и тригонометрические функции Математические и тригонометрические функции Excel позволяют осуществлять целый ряд соответствующих вычислений. Например, в Excel содержатся все тригонометрические функции (в том числе синус или косинус). В программу также включены функции вычисления логарифмов, выполнения операций над матрицами, вычисления экспоненты и многие другие. Одной из наиболее часто используемых математических функций является СЛЧИС, возвращающая псевдослучайные числа. Ее синтаксис такой: СЛЧИС() функция возвращает псевдослучайное число, которое больше или равно О и меньше 1. Обратите внимание, что возвращаемое функцией значение изменяется при каждом пересчёте рабочего листа. Если в программе при тестировании необходимо использовать таблицу данных, содержащую набор случайных значений, можете заполнить ее ячейки с помощью функции СЛЧИС (). Если при этом случайные числа должны изменяться в диапазоне, отличном от диапазона от О до 1, добавьте в формулу множитель. Например, формула =СЛЧИС 0*100 возвращает случайные значения в диапазоне от О до 100. Неизменяющиеся случайные числа Особенноаь функции СЛЧИС () соаоит в том, что возвращаемые ею значения изменяются при каждом пересчете формул рабочего листа. Чтобы заполнить ячейки неизменяемыми случайными числами, используйте функцию RND языка VBA. Функция RND работает точно так же, т.е. возвращает псевдослучайное число, которое равно или больше нуля и меньше единицы. Однако, создав программу для заполнения ячеек этими значениями, вы получите таблицу данных, содержимое которой не изменяются при пересчете рабочего листа. Такая программа показана ниже. Урок 13. Программирование с использованием встроенных функций Excel 181
Public Sub RandomValues(r As Range, max As Single) ' Заполняет указанный диапазон рабочего листа случайными ' значениями в диапазоне от О до max Dim i As Integer, j As Integer For i = 1 To r.Columns.Count For j = 1 To r.Rows.Count r.Cells(j, i) = max * Rnd() Next j Next i End Sub Передайте этой процедуре диапазон и максимальное значение, и она заполнит этот диапазон случайными значениями, изменяющимися от нуля до заданного максимума. Текстовые функции Текстовые функции, предоставляемые Excel, обеспечивают практически те же возможности обработки текста, что и язык программирования VBA. Некоторые из них даже имеют одинаковые (в англоязычной версии) названия. В табл. 13.2 описаны некоторые текстовые функции Excel. Таблица 13.2. Описание некоторых текстовых функций Excel Функция Описание ПЕЧСИМВ (текст) Удаляет из текста все непечатаемые знаки РУБЛЬ {число, число_знаков) Округляет число до указанного количества десятичных знаков, преобразует его в текстовый формат и добавляет обозначение денежной единицы СОВПАЛ {текст!, текст2) Возвращает ИСТИНА, если текст! и текст2 одинаковы (с учетом регистра) ПОВТОР (текст, число_повторений) Повторяет текст указанное количество раз Т {значение) Если значение является текстом, возвращает этот текст. В противном случае возвращает пустую строку СЖПРОБЕЛЫ( текст) Удаляет из текста все пробелы, за исключением одинарных пробелов между словами ЗНАЧЕН (текст) Преобразует текстовое представление числа в числовое значение Предположим, вы решили просуммировать значения в ячейках А1: А10 и отобразить результат в денежном формате (например, "$1234 .00"). Чтобы решить эту задачу, используйте следующую формулу: =РУБЛЬ(СУММ(А1:А10), 2) Функции VBA или функции Excel? Функции VBA и Excel часто дублируют друг друга. Если задачу можно выполнить двумя способами, какой из них предпочесть? Обычно ответ на этот вопрос зависит от особенностей вашего проекта. 182 Часть Ш. Суббота. День
Если программа должна заполнять рабочий лист надписями и значениями, с которыми затем будет работать пользователь, то обычно для этих целей выбирают функции Excel. Поскольку функции Excel записаны в ячейках и их значения пересчитываются при каждом пересчете формул рабочего листа, все необходимые вычисления будут осуществляться без запуска программы VBA. Кроме того, функции Excel предпочтительнее использовать в тех случаях, когда результаты должны отображаться на рабочем листе. Использование функций VBA оказывается более предпочтительным, если программа не просто заполняет рабочий лист надписями и формулами, а выполняет гораздо более важные действия. Если возвращаемый функцией результат должен использоваться при выполнении внyтpeн^^иx вычислений, причем он не будет отображаться на экране, также советуем использовать функции VBA. Другой способ отобразить число в денежном формате заключается в применении формата Денежный к ячейке (см. урок 14). Это пример одной из многих задач, решение которых, благодаря возможностям Excel и VBA, может осуществляться альтернативными способами. Объект WorksheetFunction в Excel представлен целый ряд функций, не имеющих аналогов в VBA. Если вы хотите применить одну из них в своей программе, используйте объект WorksheetFunction. Данный объект позволяет вычислять в программе VBA значение, возвращаемое функцией Excel, не помещая эту функцию в ячейку рабочего листа. Такая возможность удобна, если программа должна использовать возвращаемый функцией результат, но он не должен отображаться для пользователя. Для объекта WorksheetFunction применяется следующий синтаксис: WorksheetFunction.ИмяФункции(аргументы) ИмяФункцииможет быть любым названием функции Excel. Список аргументов должен соответствовать набору значений, которые необходимо передавать функции в момент ее вызова. Например, в результате выполнения следующей строки переменной X присваивается минимальное значение из диапазонам: А10: X = WorksheetFunction.Min(ActiveSheet.Range("А1:А10")) Данная возможность действительно очень полезна, особенно если учесть тот факт, что в Excel содержится немало функций, не предусмотренных в языке VBA. Ф Обзор Excel предоставляет богатую библиотеку функций, предназначенных для вы- Готово! по л нения финансовых, математических и других вычислений. • Функции Excel могут использоваться в программе VBA посредством включения их в формулы, которые вставляются в ячейки. • Функции даты и времени Excel подобны функциям даты и времени VBA. Они также используют значения, представленные в виде порядковых номеров. • Объект WorksheetFunction позволяет применять функции Excel в программах VBA. Урок 13. Программирование с использованием встроенных функций Excel 183
Проверьте себя 1. Чем функция рабочего листа отличается от функции VBA? (См. врезку "Функции VBA или функции Excel?".) 2. Каким образом функция Excel может быть использована в формуле рабочего листа? (См. раздел "Использование функций Excel при составлении формул".) 3. Можно ли применять функции Excel для работы со значениями даты и времени, предшествующими дате 1 января 1900 года? (См. раздел "Функции даты и времени".) 184 Часть Ш. Суббота. День
УРОК Форматирование рабочего листа Содержание урока ^ Форматирование числовых значений ^ Форматирование шрифтов ^ Изменение выравнивания и ориентации текста ^ Добавление для диапазонов границ и фона ^ Изменение ширины столбцов и высоты строк Термин форматирование относится к внешнему виду рабочего листа. Поскольку форматирование рабочего листа никак не влияет на особенности его функционирования, некоторые считают саму возможность форматирования несуществен- 30минут НЫМ дополнением, которому не стоит уделять особого внимания. Это большая ошибка! Важным аспектом любого рабочего листа является его простота и дружелюбность по отношению к пользователю. Благодаря удачному применению форматирования рабочий лист не только становится более удобным в использовании, но при этом уменьшается также вероятность возникновения ошибок. В настоящем уроке рассматриваются наиболее важные аспекты форматирования рабочих листов. Форматирование ячеек Работая в Excel, вы будете чаще всего сталкиваться с форматированием ячеек, поскольку, в основном, изменяется именно формат отдельных ячеек. В Excel параметры форматирования ячеек можно определить в диалоговом окне Формат ячеек (см. рис. 14.1), которое открывается при выборе команды Формат=^Ячейки.
Каждая вкладка этого диалогового окна содержит опции, относящиеся к определенному типу форматирования. • Число. Эта вкладка используется для определения числового формата представленных в ячейках значений. • Выравнивание. Представленные на этой вкладке параметры отвечают за выравнивание содержимого ячейки по отношению к ее боковым, верхним и нижним границам, а также за его ориентацию (направление) внутри ячейки. • Шрифт. На этой вкладке можно определить стиль, цвет и размер шрифта, который используется для отображения данных ячейки. • Граница. Здесь определяется стиль отображения границ ячейки или выделенных ячеек. • Вид. Параметры этой вкладки определяют цвет и текстуру фоновой части ячеек. • Защита. Данная вкладка позволяет блокировать и скрывать отдельные ячейки. ''М^Х| Число I Вы{>&в»тв9ние | Шрифт | Граница Чиоювые формбш: рОбразем- Вид Защита Число десягициых знаков: Г~ Рааделигедь срулл рг»рядов (} ^рицагепькьк; мисла: Денежный [финансовый |дэта Время Процентный Дробный Экспоненциальный Текаовый Дополнительный (все форматы) (^(СЛОвой формат является наиболее общим способом представления чисел. Для вьюода денежных значений используются также форматы "Денежный** и "Финансовый"; Отмена Рис. 14.1. Каждая отдельная вкладка диалогового окна Формат ячеек соответствует определенному типу форматирования ячеек Для изменения формата ячейки в программе VBA необходимо получить ссылку на диапазон этой ячейки (ячеек) и затем использовать свойства данного объекта Range, чтобы определить требуемый формат. Эти свойства подробно рассмотрены в следующих разделах. Однако помните, что возможности форматирования Excel весьма разнообразны и довольно широки, поэтому в настоящей книге детально рассматривается лишь небольшая их часть. Примите к сведению следующие рекомендации. • Поработайте в Excel, чтобы ознакомиться с доступными возможностями форматирования. Оцените последствия выбора различных настроек в диа- 186 Часть III. Суббота. День
логовом окне Формат ячеек. Если необходимо, обратитесь за дополнительными разъяснениями к справочной системе Excel. Используйте возможность записи макросов, чтобы ознакомиться с кодом, необходимым для применения конкретных типов форматирования. Обратитесь к уроку 10 за дополнительной информацией о способах определения диапазонов. Действия, позволяющие выполнять запись макросов, были описаны в уроке 2. Используя возможность записи макросов, необходимо учитывать механизм ее реализации в программе Excel. Если для записи действия вы используете диалоговое окно Формат ячеек, то при изменении определенного аспекта форматирования макрос фиксирует не только его, но и все другие аспекты. Рассмотрим следующий пример. Запишем действие, включающее изменение выравнивания выделенных ячеек с принятого по умолчанию на выравнивание "по центру". Код созданного макроса выглядит следующим образом: Sub Macrol() • Macrol Macro • Macro recorded 1/30/2003 by Peter G. Aitken With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .Addlndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContent .MergeCells = False End With End Sub Единственной строкой кода, изменяющей прежний формат ячеек, будет приведенная ниже: .HorizontalAlignment = xlCenter Другие строки кода относятся к иным параметрам форматирования, которые расположены на той же вкладке диалогового окна Формат ячеек, что и параметр Выравнивание (Alignment). Несмотря на то, что эти параметры не изменялись. Excel включила их в записанный код макроса. Это означает следующее: если вы используете записанные макросы, чтобы узнать, как должен выглядеть код, изменяющий формат ячеек, необходимо обратить внимание именно на ту часть генерируемого программой кода, которая относится к этому изменению. Числовой формат Числовое форматирование позволяет определить способ отображения числовых значений на экране; этот вид форматирования не влияет на ячейки, содержащие текстовую информацию. Если вы применяете числовое форматирование с помощью диалогового окна Формат ячеек, то выберите один из предустановленных числовых форматов и определите его параметры (см. рис. 14.1). Однако в программе это сделать непросто. Числовые форматы устанавливаются с помощью кодов форматирования, использующих специальный синтаксис для описания того, как должно отображаться число. Эти коды форматов присваиваются Урок 14. Форматирование рабочего листа 187
свойству NumberFormat объекта Range. Например, чтобы отобразить число без разделителей разрядов и других специальных символов, причем с двумя знаками после запятой, необходимо использовать такую строку кода: SomeRange.NumberFormat = "0.00" Числовые форматы Excel обладают большой гибкостью и позволяют отображать числовые данные практически любым требуемым способом. В кодах программы каждый числовой формат представлен определенными символами, перечисленными в табл. 14.1. Таблица 14.1. Элементы кодов числовых форматов Символ Значение Пример кода Пример формата # Значимая цифра ## ♦ # 12.67 отображается как 12.7 О Незначимый нуль #.000 1.2 отображается как 1.2 О О Десятичная точка ##•## 12.34 отображается как 12.34 $ Денежный символ $#.## 21.98 отображается как $21.98 ^ Символ процента #.#% 0.05 отображается как 5.0% / Разделитель разрядов #/### 98000 отображается как 98,000 Кроме того, положительные и отрицательные числа также могут отображаться по-разному. Например, в бухгалтерских отчетах отрицательные значения отображаются красным цветом и/или заключаются в скобки. Чтобы определить подобный способ форматирования, обозначьте в коде каждый из параметров, разделив их точкой с запятой. Первый указанный параметр относится к положительным числам, второй — к отрицательным. Например: В этом случае положительные числа будут отображаться со знаком доллара и с двумя знаками после запятой. Отрицательные числа будут форматироваться аналогичным образом, но еще и заключаться в скобки. Чтобы изменить цвет отображения числового значения, в начале кода, определяющего способ форматирования, в квадратных скобках укажите название требуемого цвета. При этом можно использовать такие названия цветов: • Black (черный); • Cyan (голубой); • Magenta (пурпурный); • White (белый); • Blue (синий); • Green (зеленый); • Red (красный); • Ye 11OW (желтый). Например, следующий код отображает положительные значения цветом, принятым для ячеек по умолчанию, и отрицательные значения — красным цветом. $#.##;[Red]$#.## Цвет, заданный таким образом, имеет больший приоритет по отношению к цвету шрифта, заданного для ячейки (см. следующий подраздел, где рассмотрены вопросы форматирования шрифтов). 188 Часть Ш. Суббота. День
Осталось 20 минут За более детальной информацией о кодах форматирования обратитесь к справочной системе Excel. Форматирование шрифтов в Excel пользователь имеет полный контроль над параметрами шрифтов, используемых для отображения данных в ячейках рабочего листа. К числу таких параметров форматирования относятся: • стиль шрифта; • размер шрифта; • использование курсива, полужирного начертания и подчеркивания; • специальные эффекты: зачеркивание, верхний и нижний индексы и т.д. При работе в Excel определение параметров шрифта осуществляется с помощью вкладки Шрифт диалогового окна Формат ячеек (рис. 14.2). В VBA для этих же целей используется объект Font. Этот объект имеет ряд свойств, соответствующих различным параметрам шрифта. Свойства объекта Font описаны в табл. 14.2. шрифт I Г{}вн«мв I Вид I Звий« I Г" sewpiwyrbdl АаВЬБбЯя '^'Ш|йфг'М^'ТгиёТурё''Ш %дет использован Ш0т~вШр1^ <ж •:..Ome»d'' Рис, 14,2. Вкладка Шрифт диалогового окна Формат ячеек Таблица 14.2. Свойства объекта Font Свойство Описание Name Color Size Bold Название шрифта Цвет шрифта, указанный в значениях RGB Вертикальный размер шрифта в пунктах (1 пункт равен 1/72 дюйма, по умолчанию в Excel используется размер 10 пунктов) Значение True/False, определяющее необходимость применения полужирного начертания Урок 14. Форматирование рабочего листа 189
Окончание табл. 14.2 Свойство Описание Italic Значение True/False, определяющее необходимость применения курсивного начертания Underline Константа, определяющая необходимость подчеркивания, которая может принимать следующие значения: xlUnderlineStyleNone (нет подчеркивания), xlUnderlineStyleSingle (одна черта), xlUnder- lineStyleDouble (две черты) Strikethrough Значение True/False, определяющее необходимость применения эффекта зачеркивания (горизонтальная черта, проходящая через символы текста) Subscript Значение True/False, определяющее необходимость отображения текста в виде нижнего индекса Superscript Значение True/False, определяющее необходимость отображения текста в виде верхнего индекса Чтобы выбрать тот или иной шрифт, необходимо знать его название. В Windows и Excel поддерживается огромное количество шрифтов. Одни из самых популярных — Arial, Courier New, (]^eorgia, MS Sans Serif и Times New Roman. Можно наверняка предполагать, что эти и многие другие шрифты будут доступны на всех компьютерах, работающих под управлением Windows; менее распространенные шрифты могут быть установлены для конкретного приложения, но не для самой операционной системы. К счастью, свойство Font не является особо требовательным. Если ему присваивается несуществующее название шрифта, ошибки не возникает— текст отображается шрифтом, принятым по умолчанию в Excel (шрифт Arial). Свойство Color использует значение RGB, которое определяет требуемый цвет путем фиксирования его красной, зеленой и синей составляющих. Чтобы присвоить значение свойству Color, используйте функцию RGB: RGB (г, д, Ъ) Значения каждого аргумента функции RGB могут изменяться в диапазоне от О до 255. Они определяют относительное содержание красного, зеленого и синего компонентов в представляемом цвете. RGB (О, О, О) — это черный цвет, RGB (255, 255, 255) — белый, RGB (122, 122, 122) — нейтральный серый, RGB (О, О, 255) — синий И Т.Д. (поэкспериментируйте с разными значениями аргументов функции RGB и посмотрите, каким цветам они соответствуют). Например, показанная ниже строка кода делает цвет шрифта выделенных в текущий момент ячеек желто-зеленым: Selection.Font.Color = RGB(122, 255, 0) В языке VBA предусмотрен ряд стандартных констант, используемых для представления некоторых цветов. Это vbBlack, vbRed, vbGreen, vbYellow, vbBlue, vbMagenta, vbCyan и vbWhite. Указанные константы можно использовать вместо функции RGB для изменения свойства Color. Выравнивание и ориентация содержимого ячеек Содержащиеся в ячейках значения можно выравнивать как в горизонтальном, так и в вертикальном направлениях. На рис. 14.3 показаны различные варианты такого выравнивания. 190 Часть III. Суббота. День
Цвета RGB В модели RGB цвета определяются по содержанию в них трех основных оттенков: красного, зеленого и синего. Однако из уроков рисования вы наверняка помните, что первичными цветами являются красный, синий и желтый. В чем же дело? Красный, синий и желтый (точнее, пурпурный, голубой и желтый) -— это компоненты субтрактивной модели добавления цветов, которая действует, например, при смешивании красок. Напротив, красный, зеленый и синий являются компонентами аддитивной модели, которая используется, например, при воспроизведения изображений на мониторе компьютера. Поскольку каждый из трех компонентов данной модели может принимать до 256 различных значений, это позволяет воспроизводить более 16 миллионов разных оттенков. "^ВВ^ li^^-'^^SwKi 8иЛ.Вст||»й ^орт £$jp6iiic Q^kmd Qm> Справка '.^ ><чт i.->, v.- ^- * х fi, вертикально по центру D "Г вертикально по верхнему краю вертикально по центру ^^Я вертикально по нижнему краю горизонтально по верхнему краю горизонтально по центру горизонтально по нижнему краю Ш»Г{;:(.W:"'c~: j-^."-'- •i'^'i^'f к.f ?. >:' ;■ ' 1 >.r\ Рис. 14.3. Примеры разных способов выравнивания по горизонтали и по вертикали Чтобы изменить способ выравнивания, используйте следующие свойства объекта Range. • HorizontalAlignment. Принимает значения xlLeft (горизонтальное выравнивание по левому краю), xlCenter (по центру) или xlRight (по правому краю). • VerticalAlignment. Принимает значения xlTop (вертикальное выравнивание по верхнему краю), xlCenter (по центру) или xlBottom (по нижнему краю). По умолчанию в Excel используется выравнивание по нижнему краю (вертикальное выравнивание). По горизонтали числовые значения выравниваются по правому краю, а текстовые — по левому. Чтобы изменить ориентацию текста с принятой по умолчанию горизонтальной на вертикальную или на какую-либо промежуточную, используйте свойство Range.Orientation. Ориентация определяется как поворот в градусах против часовой стрелки от принятого по умолчанию горизонтального расположения. Например, ориентация 90° соответствует вертикальному положению текста, который читается снизу вверх. Значения, определяющие способ ориентации данных, могут изменяться в диапазоне от -90° до 90°. На рис. 14.4 показаны примеры различной ориентации текстовых значений. Урок 14. Форматирование рабочего листа 191
о Ф^ Правка Вид ^ Всгаюш Формат Сервис '^ ;'. .*;:| ArialCyr т 10 ^уЖН:\ШМ, !! ■ ' А1 ^ V^*---:;"'"a- "Н|Щ|Х| ГОГО! в о о о > :i: •3 / ч. :р_.т к < ГнКШп\л1ктг/{\iI J _t]r~l —Л Рис, 14.4. Данные в ячейке могут располагаться под разными углами После изменения ориентации данных в ячейке Excel не увеличивает автоматически высоту строки с целью полного отображения ее содержимого. Вам придется это сделать вручную. Границы ячеек Excel может добавлять обрамление вокруг отдельных ячеек или их группы. Для диапазонов из двух и более ячеек такое обрамление может содержать как рамку по внешнему краю, так и границы между ячейками внутри диапазона. Каждый объект Range имеет коллекцию Borders, значения которой определяют характер используемых для данного диапазона границ. Каждая отдельная граница представлена своим объектом Border, ей соответствует определенная константа (табл. 14.3). Таблица 14.3. Границы диапазона и соответствующие им константы Граница Константна Нижняя граница диапазона Верхняя граница диапазона Левая граница диапазона Правая граница диапазона Вертикальные границы внутри диапазона Горизонтальные границы внутри диапазона xlEdgeBottom xlEdgeTop xlEdgeLeft xlEdgeRight xlInsideVertical xlInsideHori zontal Работать с границами диапазона можно двумя способами. • Если используется коллекция Borders без аргументов, изменению подвергаются все границы диапазона. 192 Часть IIL Суббота. День
• Применяя коллекцию Borders с одной из констант, представленных в табл. 14.3, в качестве аргумента, вы воздействуете только на соответствующую границу. Например, следующая строка добавляет двойную границу по всем четырем краям текущей выделенной области и внутри нее: Selection.Borders.LineStyle = xlDouble Напротив, эта строка кода добавляет двойную границу только по верхнему краю выделенной области: Selection.Borders(xlEdgeTop).LineStyle = xlDouble Параметры отображения границ, которые можно изменять в программе, приведены в табл. 14.4. Таблица 14.4, Свойства объекта Border Свойство Описание Значения Color Цвет границы LineStyle Стиль границы, например: непрерывная линия,пунктирная линия, линия из точек и т.д. Weight Толщина границы: от очень тонкой до очень широкой Значение RGB (см. ранее в этом уроке); по умолчанию используется черный цвет xlContinuous, xlDash, xlDashDot, xlDashDotDash, xlDot, xlDouble, xlSlantDashDot, xlLineStyleNone xlHairLine, xlThin, xlMedium, xlThick Ш Чтобы удалить границу, присвойте ее свойству LineStyle значение xlLineStyleNone. В листинге 14.1 представлена программа, добавляющая границы вокруг ячеек рабочего листа. Также в этой программе использованы некоторые приемы форматирования шрифтов, рассмотренные ранее в этом уроке. Программа предназначена для форматирования таблицы данных, в которой содержится строка с заголовками столбцов и столбец с заголовками строк. Применяемый к заголовкам формат описан в комментариях, добавленных к коду программы. Программа форматирует таблицу (с помощью свойства CurrentRegion), в которой находится активная ячейка. На рис. 14.5 представлен полученный результат. Листинг 14.1. Программа для форматирования таблицы на рабочем листе Public Sub FormatTablel() Форматирует таблицу, в которой находится активная ячейка: - толстая граница под верхней строкой - толстая граница справа от левого столбца ~ тонкие горизонтальные границы между остальными ячейками - текст в верхней строке выделен жирным стилем и выровнен по центру ' - текст в левом столбце выделен жирным стилем и выровнен по правому краю Dim г As Range, rl As Range • Проверка, выделенная область является ли диапазоном Урок 14. Форматирование рабочего листа 193
If TypeName(Selection) <> "Range" Then MsgBox "Чтобы программа работала, сделайте активной какую- нибудь ячейку на рабочем листе" Exit Sub End If ' Получение области, содержащей всю таблицу Set г = Selection.CurrentRegion ' Добавление тонких горизонтальных границ внутри выделенной ' области г.Borders(xlInsideHorizontal).LineStyle = xlContinuous r.Borders(xlInsideHorizontal).Weight = xlThin ' Переход к верхней строке диапазона Set rl = г.Rows(1) ' Добавление толстой границы под верхней строкой П.Borders(xlEdgeBottom).LineStyle = xlContinuous rl.Borders(xlEdgeBottom).Weight = xlThick ' Выделение текста в строке жирным шрифтом и выравнивание его по центру rl.Font.Bold = True rl.HorizontalAlignment = xlCenter ' Переход к левому столбцу диапазона Set rl = г.Columns(1) ' Добавление толстой границы справа от столбца rl.Borders(xlEdgeRight).LineStyle = xlContinuous rl.Borders(xlEdgeRight).Weight = xlThick ' Выделение текста в столбце жирным шрифтом и выравнивание по правому краю rl.Font.Bold = True rl.HorizontalAlignment = xlRight End Sub Установка фона ячейки По умолчанию все ячейки рабочего листа Excel имеют белое фоновое напол- j?*w«wn нение. Можно заменить этот цвет каким-нибудь другим, а также выбрать фоновую текстуру. Фон ячейки или диапазона представлен объектом Interior. Этот объект имеет свойства, определяющие фоновый цвет и текстуру диапазона (табл. 14.5). В диалоговом окне Формат ячеек программы Excel существует параметр Защита ячейки, однако он определяет, скорее, особенности защиты данных на рабочем листе, нежели способ форматирования. Поэтому он будет рассмотрен в уроке 24. о 194 Часть IIL Суббота. День
тх. А17 •^Ш1^ I 4 в Та 8 ? 11 ЩЖ^ШШШЩ^^^Ш! ■и<^ттм^^Ш¥$ ' Газеты Радио TV Янв 21! 56! 64^ Фов 451 56; 531 Март 1 56' 74! 511 Алр 53 21 45 Май 54 54 54 Июнь 51 45 30 --*"| - г""'ч 1-1 rti'i""",i"i 'I'V'V'V'ii'Ti 141 iT"'ii""iii 'T'liirn'M-i ivii"-'iiTi'iiiii'(i''riii'"''vr"r''Ti"''''"'ii'ihi'riiiHiitivi'lH \"Пг\т"\яШ 1*'ТПГТТ-'ЯЙЯ Рис. 14.6. Таблица, отформатированная с помощью программы» представленной в листинге 14.1 Таблица 14.5. Свойства объекта Interior Свойство Описание Значения Color Цвет фона Значение RGB (см. ранее в этом уроке) Pattern Текстура Константа, определяющая применяемую текстуру. Может иметь следующие значения: xlPatternChecker, xlPatternDown, xlPatternHorizontal, xlPatternVer- ticalHxlPatternNone PatternColor Цвет текстуры (если для нее Значение RGB; по умолчанию использует- предусмотрена возможность ся черный цвет изменения цвета) Различные фоновые цвета могут облегчить для пользователя восприятие данных, представленных в ячейках рабочего листа. К примеру, можно выбрать другой фоновый цвет для строки заголовков таблицы, чтобы визуально отделить ее от представленных в таблице данных. Итак, вы уже изучили те инструменты, которые потребуются для улучшения внешнего вида таблицы, вычисляющей суммы выплат по кредиту (разработка соответствуюш;ей программы была начата в уроке 13). Теперь можно применить форматирование, чтобы сделать таблицу более наглядной и четко обозначить ячейки, в которых пользователь может (и должен) вводить данные. Выполните следующие действия: • заголовок рабочего листа в ячейке А1 отобразите более крупным шрифтом; • заголовки в ячейках В4: В7 выделите полужирным шрифтом; • для ячеек С4 : С7 выберите соответствующий числовой формат; • вся область рабочего листа должна иметь серый фоновый цвет, а три ячейки для ввода данных — белый. Урок 14. Форматирование рабочего листа 195
Программа, с помощью которой можно внести все эти изменения, представлена в листинге 14.2. Новый код, добавленный к исходной программе из урока 13, обрамлен комментариями "***". Листинг 14.2. Усовершенствованная программа, создающая рабочий лист для вычисления выплат по кредиту Public Sub CreateLoanWorksheet() Dim wb As Workbook Dim ws As Worksheet ' Создание новой пустой рабочей книги Set wb = Workbooks.Add ' Изменение названия первого рабочего листа wb.Worksheets(1).Name = "Выплаты по кредиту" Set ws = wb.Worksheets("Выплаты по кредиту") With ws ' Добавление заголовка на рабочем листе .Range("А1") = "Выплаты по кредиту" Изменение шрифта ячейки А1 Range("А1").Font.Size = 24 Range("Al").Font.Bold = True *** Размещение заголовков в столбце В Range("В4") = "Сумма кредита" Range("В5") = "Годовая процентная ставка" Range("Вб") = "Срок кредита в годах" Range("В7") = "Ежемесячные выплаты" Изменение шрифта в ячейках В4:В7 на жирный Range("В4:В7").Font.Bold = True Увеличение ширины столбца В с целью полного отображения текста заголовков Range("В1").EntireColumn.AutoFit Помещение формулы для вычисления выплат по кредиту в ячейку С7 Range("С7").Value = "=-ПЛТ(С5/12, сб*12, С4)" Выбор денежного формата для ячеек С4 и С7 Range("С4").NumberFormat = "$#,###.00" Range("С7").NumberFormat = "$#.##" Выбор процентного формата для ячейки С5 Range("С5").NumberFormat = "0.00%" Выбор серого фонового цвета для всех ячеек Range("A1:D9").Interior.Color = RGB(200, 200, 200) Выбор белого фонового цвета для ячеек ввода данных Range("С4:Сб").Interior.Color = vbWhite 196 Часть III. Суббота. День
End With ' Сохранение рабочей книги wb.SaveAs FileName:="Кредитный_калькулятор" End Sub Рабочий лист, полученный в результате выполнения обновленной программы, показан на рис. 14.6. Думаю, вы согласитесь, что такое приложение выглядит намного привлекательнее, чем его исходный вариант. Кроме того, работу пользователя значительно облегчает тот факт, что ячейки для ввода данных отличаются по виду от остальных ячеек рабочего листа. Однако приложение для вычисления выплат по кредиту можно улучшать и далее, о чем будет рассказано в уроке 24. @ Файл Правка бид Вст^ха Фррц^ Сервис Z^HNbie jj^KHb^ 0^ С7 ^ fir =-ПтГ(С5/12; С6М2; С4) ■■^^...&>^х^ ^ 10 ^Г|г;.^;|ш ига М 4 > Й |\Вы11ла1гь1 гго кредк^ J- ■■ ±jr NUM =J Рис. 14.6. Инструмент для вычисления выплат по кредиту, созданный программой из листинга 14.2 Изменение размера строк и столбцов Иногда возникает необходимость в изменении ширины столбцов и высоты строк рабочего листа, с тем чтобы содержащиеся в них данные полностью отображались на экране. Ширина столбца измеряется в единицах, соответствующие^ ширине символа О (ноль) для выбранного шрифта. Используемая по умолчанию ширина столбца составляет приблизительно 8,5 единиц. В кодах программы ширина столбца определяется с помощью свойства ColumnWidth. Если вы знаете, ширину какого столбца необходимо изменить, можете применить следующий метод. Используйте коллекцию Columns объекта Worksheets, чтобы обратиться к столбцам рабочего листа. Например, в приведенной ниже строке кода ширина столбца В активного рабочего листа устанавливается равной 16 единицам: ActiveSheet.Columns("В") = 16 Урок 14. Форматирование рабочего листа 197
Следующий код увеличивает вдвое ширину столбцов С, D и Е рабочего листа Лист1: With Worksheets("Лист!").Columns("С:Е") .ColumnWidth = .ColumnWidth * 2 End With Другой метод изменения ширины столбца заключается в использовании свойства EntireColumn, регулирующего ширину столбцов соответствующего диапазона. В данном слз^ае вы можете устанавливать ширину столбцов, даже если не знаете их букв. Например, следующим кодом ширина столбцов текущего выделенного диапазона устанавливается равной 15 единицам: Selection.EntireColumn.ColumnWidth = 15 Еще один весьма полезный способ состоит в определении ширины столбцов в зависимости от содержащихся в них данных. Для этого используйте метод Aut- oFit, он автоматически выбирает такую ширину столбца, при которой полностью отображаются все расположенные в нем значения. Метод AutoFit работает с данными, которые находятся в строке в настоящий момент. Если вы позже добавите значения, состоящие из большего количества символов, ширина аолбца автоматически увеличена не будет. Чтобы целиком отобразить эти новые значения, потребуется применить метод AutoFit еще раз. В следующем коде метод AutoFit используется для определения ширины столбцов А: Е активного рабочего листа: ActiveSheet.Columns("А:Е").AutoFit Приведенный ниже код изменяет ширину столбцов, принадлежащих заданному диапазону: SomeRange.EntireColumn.AutoFit Высота строки измеряется в пунктах; в одном дюйме — 72 пункта. Использовать такую единицу измерения действительно целесообразно, особенно если вспомнить, что высота шрифта также измеряется в пунктах, а высота строки обычно изменяется в зависимости от используемого шрифта. Excel автоматически увеличивает высоту строки, чтобы отобразить самый высокий символ строки, однако иногда может потребоваться изменить высоту строки по иным причинам. Объекты Range предлагают два свойства, имеющих отношение к высоте строки. Свойство Height доступно только для чтения и используется для получения информации о высоте строки. Свойство RowHeight доступно как для чтения, так и для записи. Оно используется для изменения высоты строки, а также для получения информации о текущей высоте. Как показано в табл. 14.6, возвращаемые этими свойствами значения имеют некоторые отличия. Таблица 14.6. Информация, возвращаемая свойствами RowHeight и Height Свойство Для диапазонов Для диапазонов из нескольких строк из одной строки RowHeight Высота строки Если все строки имеют одинаковую высоту — высота одной строки; если строки имеют неодинаковую высоту — Null Height Высота строки Общая высота всех строк диапазона 198 Часть Ш. Суббота. День
Приведенный ниже код изменяет высоту строк диапазона. Если все строки диапазона имеют одинаковую высоту, она увеличивается вдвое. В противном случае высота устанавливается равной 22 пунктам. If SomeRange.RowHeight > О Then SomeRange.RowHeight = SomeRange.RowHeight * 2 Else SomeRange.RowHeight = 22 End If Обзор \J^^ в этом уроке были рассмотрены наиболее важные аспекты форматирования ра- Готово! бочего листа Excel. • Числовые значения могут отображаться в различных форматах, соответствующих типу отображаемых данных. • Значения могут отображаться различными шрифтами. Размер, цвет и стиль шрифта также могут быть разными. • Значения в ячейках допускается ориентировать под любым углом, их положение может изменяться от горизонтального до вертикального. • Высота строк и ширина столбцов изменяется с целью полного отображения содержапдихся в ячейках рабочего листа значений. Проверьте себя 1. Назовите отличия между символами # и О, используемыми для определения числового формата. (См. подраздел "Числовой формат".) 2. Увеличивая размер шрифта для диапазона, необходимо ли изменять высоту строки, чтобы полностью отобразить более крупные символы? (См. раздел "Изменение размера строк и столбцов".) 3. Как установить ширину столбца в соответствии с самыми широкими значениями, которые в нем содержатся? (См. раздел "Изменение размера строк и столбцов".) 4. Что обозначает термин "пункт" при работе со шрифтами? (См. раздел "Форматирование шрифтов".) 5. Как в языке VBA определяется требуемый цвет? (См. раздел "Форматирование шрифтов".) Урон 14. Форматирование рабочего листа 199
УРОК Операции поиска и замены О Осталось ЗОмииут Содержание урока ^ Использование метода Find для поиска значений в диапазоне рабочего листа <• Управление параметрами поиска с помощью аргументов метода Find ^ Применение методов FindNext и FindPrevious для продолжения поиска ^ Вызов метода Replace для поиска и замены данных в диапазоне Excel и VBA предоставляют инструменты, позволяющие выполнить поиск требуемых значений на рабочем листе и (при необходимости) заменить их другими значениями. Изучению этих инструментов и будет посвящен настоящий урок. Поиск данных Существует три метода, которые используются для поиска данных на рабочем листе. • Find. Этот метод запускает операцию поиска и находит первое соответствие целевому фрагменту. • FindNext. Данный метод находит следующее соответствие целевому фрагменту при выполнении операции поиска. • FindPrevious. Метод, находящий предыдущее соответствие целевому фрагменту при выполнении операции поиска. В следующих разделах настоящего урока перечисленные выше методы будут рассмотрены более детально.
Метод Find Метод Find ищет данные в указанном диапазоне. Он достаточно сложен, однако вам придется его изучить, чтобы получить в свое распоряжение ряд полезных возможностей. Метод Find имеет такой синтаксис: SomeRange.Find(What, After, Lookin, LookAt, SearchOrder, Search- Direction, MatchCase, MatchByte) • Wnat — значение, которые необходимо найти; может принадлежать к любому типу данных Excel. Это единственный обязательный аргумент метода Find. • After— ячейка диапазона, начиная с которой должен осуществляться поиск. Аргумент не обязателен; если он не задан, то поиск начинается с верхней левой ячейки диапазона. • Lookin — тип данных, которые следует найти. Возможные значения этого аргумента: х1 Formula (поиск ячеек, содержащих формулы), х1 Values (поиск ячеек, содержащих текстовые или числовые значения) и х1 Comments (поиск комментариев ячеек). Аргумент не обязателен, по умолчанию используется значение xlValues. • LookAt — определяет, что необходимо найти: элемент данных целиком (х1 Whole) или его часть (xlPart). По умолчанию используется xlPart: при поиске слова "Jack" может быть найдено, например, слово "Jackson". • SearchOrder— определяет, в каком порядке осуществляется поиск по ячейкам диапазона: xlByColumns — по столбцам, xlByRows — по строкам. По умолчанию используется значение xlByColumns, т.е. поиск выполняется по ячейкам вправо, затем вниз. • SearchDirection— направление поиска: xlNext— вперед, xlPrevious — назад. По умолчанию используется xlNext. • MatchCase — значение True или False, которое определяет, учитывается ли в процессе поиска регистр символов. По умолчанию регистр не учитывается — значение False. • MatchByte— использование этого параметра имеет смысл лишь в том случае, если установлена поддержка двухбайтового языка. Значение True означает, что для двухбайтовых символов могут быть найдены только двухбайтовые символы, тогда как значение False означает, что двухбайтовым символам могут соответствовать однобайтовые символы. По умолчанию используется значение False. Ш При вызове метода Find значения, передаваемые аргументам Lookin^ LookAt, SearchOrder и MatchByte, сохраняются. Если вы не измените их явно, они будут использоваться при следующем вызове метода Find. Метод Find возвращает объект Range, ссылающийся на первую ячейку диапазона, для которой найдено соответствие. Если соответствие не найдено, метод возвращает значение Nothing. Рассмотрим программу, которая находит первое соответствие необходимому значению в заданном диапазоне. Бели соответствие найдено, ячейка выделяется. Если соответствие не найдено, отображается требуемое диалоговое окно. Код этой программы показан в листинге 15.1. В него включена также подпрограмма под названием Test Find, которая запускает для вызова процедуру FindDatalnRange. При необходимости измените аргументы, передаваемые процедуре FindDatalnRange. 202 Часть Ш. Суббота. День
Листинг 15.1. Программа для поиска и выделения данных в диапазоне Public Sub FindDataInRange(r As Range,, target As Variant) ' Поиск требуемого текстового значения в диапазоне г. ' Если соответствие найдено, ячейка выделяется. ' Если соответствие не найдено, отображается сообщение. Dim г As Range Set rl = г.Find(target) If rl Is Nothing Then MsgBox "Текст " & target & " не был найден." Else rl.Select End If End Sub Public Sub TestFindO ' Тестирует процедуру FindDatalnRange. FindDatalnRange ActiveSheet.Range("Al:G10"), "hello" End Sub Метод Find не обрабатывает возвращаемые формулами результаты. Другими словами, если ячейка содержит формулу, результатом которой является значение 6, при поиске значения "6" эта ячейка не будет найдена. Ф Методы FindNext и FindPrevious После вызова метода Find может возникнуть необходимость в продолжении поиска Осталось И нахождении других соответствий в данном диапазоне. Именно для этого и предна- 20минут значены методы FindNext и FindPrevious. Они работают одинаково, с той лишь разницей, что метод FindNext осуществляет поиск по следующим ячейкам, а метод FindPrevious — по предыдущим. Методы имеют следующий синтаксис: FindNext(After) FindPrevious(After) Аргумент After не обязателен. Это объект Range, определяющий ячейку, с которой начинается поиск. Как правило, в качестве аргумента методу передается ссылка на ячейку, ранее обнаруженную методом Find или найденную в результате предыдущих вызовов методов FindNext и FindPrevious. В таком случае поиск продолжается с того места, в котором он был закончен. Если аргумент After опущен, поиск начинается с первой ячейки диапазона. Оба метода возвращают объект Range, ссылающийся на ячейку, в которой было найдено соответствие, или Nothing, если соответствие найдено не было. Помните, что метод Find не запоминает, в каких ячейках поиск уже осуществлялся. По умолчанию при повторном вызове этот метод просто возвращается к первой ячейке диапазона и повторяет поиск сначала. Задача заключается в том, чтобы поиск по диапазону выполнялся только один раз. Для этого, используя свойство Range .Address, необходимо запомнить ячейку, в которой было найдено первое соот- Урок 15. Операции поиска и замены 203
ветствие. Адреса найденных в дальнейшем соответствий целевому тексту сравниваются с этим адресом; их совпадение обозначает то, что все ячейки диапазона просмотрены. После этого поиск начинает выполняться по второму кругу. Реализация данного приема продемонстрирована на примере функции CountStringsInRange в листинге 15.2. Функция получает в качестве аргументов диапазон и целевую строку, подсчитывает, сколько раз в диапазоне была найдена целевая строка, и возвращает результат в вызывaюп^yю процедуру. Листинг 15.2 включает также процедуру TestCountStrings, позволяющую проверить работу функции CountStringsInRange. Листинг 15.2. Определение количества повторов заданной строки в указанном диапазоне Public Function CountStringsInRange(г As Range, target As String) As Long ' Функция считает, сколько раз целевая строка будет найдена ' в указанном диапазоне, и возвращает полученный результат Dim count As Long Dim rl As Range Dim AddressOfFirstFind count = 0 ' Поиск первого соответствия Set rl = r.Find(target) ' Если строка не была найдена, возвращает О If rl Is Nothing Then CountStringsInRange = 0 Exit Function • Если строка найдена, запускается цикл для поиска других • соответствий End If ' Сохранение адреса первой найденной ячейки AddressOfFirstFind = rl.Address Do ' Увеличение общей суммы на 1 count = count + 1 ' Поиск следующего соответствия, начиная с ' ранее найденной ячейки Set rl = r.FindNext(rl) ' цикл, пока процесс поиска не вернется к месту первого ' соответствия Loop While rl.Address о AddressOfFirstFind ' Возвращение результата Countstringslnrange = count End Function Public Sub TestCountStrings0 Dim count As Long Dim target As String 204 Часть HI. Суббота. День
target = "Карандаш" count = CountStringsInRange(Selection, target) MsgBox "Строка '" & target & "' была найдена " & count & " раз" End Sub Чтобы проверить работу программы на практике, выполните следующие действия. 1. В редакторе VBA в тело модуля добавьте код из листинга. 2. Отредактируйте процедуру TestCountStrings, присвоив переменной target текстовое значение, которое необходимо найти на рабочем листе. 3. Перейдите в Excel и введите данные на рабочий лист (или откройте тот лист, который уже содержит данные). 4. Используйте мышь или клавиатуру, чтобы выделить диапазон, в пределах которого необходимо выполнить поиск. 5. Нажмите <Alt+F8>, чтобы открыть диалоговое окно Макрос. 6. Выберите макрос TestCountStrings и щелкните на кнопке Выполнить. Программа будет запущена, а на экране в диалоговом окне появится полученный результат (рис. 15.1). Рис. 15.1. Результат, возвращаемый функцией из листинга 15.2 Осталось 10 минут Выполните упражнение: измените функцию CountStringsInRange таким образом, чтобы поиск текстовых значений выполнялся с учетом регистра символов. Замена данных Для замены найденных в диапазоне фрагментов данных используется метод Replace. Он имеет такой синтаксис: SomeRange.Replace(What, Replacement, LookAt, SearchOrder, Match- Case, MatchByte) What — значения, которые необходимо заменить. Replacement — значения, которыми необходимо заменить найденные фрагменты. Все остальные аргументы являются не обязательными, они несут на себе ту же функциональную нагрузку, что и в методе Finci (описанном ранее в этом уроке). Метод Replace всегда возвращает True, поэтому возвращаемый им результат нельзя использовать для проверки выполнения какой-либо замены. Урок 15. Операции поиска и замены 205
в Если необходимо определить количество замен, произведенных в результате выполнения метода Replace, используйте методы Find и FindNext, чтобы подсчитать, сколько раз целевая строка встречается в диапазоне (как показано в листинге 15.1). Тогда вы узнаете количество замен, произведенных при использовании метода Replace. Метод Replace работает со всеми типами данных Excel. С его помощью можно заменять числовые значения, даже несмотря на то, что аргументы метода Replace указываются в виде строк. Например: Selection.Replace What:="1", Replacement:="9" Этот код заменяет все цифры 1 на цифры 9. Таким образом: • значение 1 заменяется значением 9; • значение 1.251 заменяется значением 9.259; • строка 15 Oak Street заменяется строкой 95 Oak Street; • формула =А1+1 заменяется формулой =А9+9. На примере программы из листинга 15.3 продемонстрирован пример использования метода Replace. Процедура ReplaceAllInActiveWorkbook просматривает все данные во всех листах активной рабочей книги и выполняет указанную замену. Процедура заменяет только содержащиеся в ячейках значения — формулы остаются без изменений (такой вариант используется методом Replace по умолчанию). Программа работает в следующим образом. 1. Используется ключевое слово ActiveWorkbook для получения ссылки на активную рабочую книгу. 2. Выполняется цикл по коллекции Worksheets для получения ссылки на каждый рабочий лист данной книги. 3. Для каждого листа используется свойство UsedRange для получения диапазона, который ссылается на используемую часть рабочего листа. 4. Вызывает метод Replace для этого диапазона. Листинг 15.3. Программа, выполняющая замену текста во всей рабочей книге Public Sub ReplaceAllInActiveWorkbook(target As String, __ replacement As String) Dim ws As Worksheet Dim r As Range ' Проверка корректности заданной искомой строки If target = "" Then Exit Sub For Each ws In ActiveWorkbook.Worksheets Set r = ws.UsedRange r.Replace target, replacement Next End Sub Public Sub TestReplaceAll0 Dim target As String, replacement As String 206 Часть III. Суббота. День
target = InputBox("Введите искомый текст (пустую строку для_ выхода):") If target = "" Then Exit Sub replacement = InputBox("Введите текст для замены найденных__ фрагментов:") ReplaceAllInActiveWorkbook target, replacement End Sub В листинг 15.3 включена также процедура TestReplaceAll, которая позволяет выполнить тестирование программы. Эта процедура использует функцию Input- Box для отображения адресуемых пользователю вопросов об искомых заменяемых текстовых фрагментах. Обратите внимание, что ввод пустой строки в качестве целевой завершает работу программы без выполнения каких-либо замен. Подробнее о функции InputBox было рассказано в уроке 9. Чтобы протестировать программу, выполните перечисленные ниже действия. 1. В редакторе VBA в теле модуля наберите код из листинга 15.3. 2. Откройте рабочую книгу, для которой следует произвести замену, либо введите новые данные в чистой рабочей книге. 3. Убедитесь, что необходимая рабочая книга (о которой говорится в п. 2) активна. 4. В Excel откройте диалоговое окно Макрос (<Alt4-F8>) и запустите макрос TestReplaceAll. Обзор (Ш ^Шр Объектная модель Excel предоставляет в ваше распоряжение методы, позво- готово! ляющие ВЫПОЛНЯТЬ ПОИСК и замену требуемых значений в пределах указанного диапазона. • Метод Range .Find позволяет найти первое соответствие искомой строке в указанном диапазоне. • Поиск может осуществляться по содержащимся в ячейках значениям, по формулам или по комментариям. • После вызова метода Find используйте методы FindNext и FindPrevious для продолжения поиска. • Метод Replace предоставляет возможность поиска и одновременной замены данных в указанном диапазоне. Проверьте себя 1. По умолчанию в каких ячейках рабочего листа осуществляется поиск при вызове метода Find? (См. раздел "Метод Find".) 2. Какие данные возвращает метод Find в вызывающую программу? (См. раздел "Метод Find".) Урок 15. Операции поиска и замены 207
3. Выполняет ли метод Replace замену значений с учетом регистра символов? (См. подраздел "Замена данных".) 4. Верно ли, что значение, возвращаемое методом Replace, соответствует количеству произведенных замен? (См. подраздел "Замена данных".) 208 Часть Ш. Суббота. День
УРОК Создание пользовательских панелей инструментов Содержание урока >/ Создание пользовательской панели инструментов ^ Добавление и удаление кнопок на панели инструментов ^ Запуск программы VBA щелчком на кнопке панели инструментов ^ Добавление пользовательских панелей инструментов к рабочим книгам V Управление видимостью и расположением панелей инструментов В Excel находится более десяти панелей инструментов, каждая из которых содержит набор кнопок для соответствующих команд рабочего листа. Панели Стандартная и Форматирование обычно отображаются все время, так как они Осталось и г\ с 30минут включают самыс необходимые команды. Остальные панели инструментов более специализированы, их команды предназначены для решения специфических задач: для работы со сводными таблицами, для рисования или использования XML. Вы можете изменить вид существующих панелей инструментов, а также создать собственные новые панели инструментов, которые будут соответствовать особенностям вашего приложения. Создание пользовательских панелей инструментов в Excel в Excel можно настраивать вид панелей инструментов. Данная возможность становится особенно полезной при создании рабочих книг, предназначенных для
конечных пользователей. Благодаря ей панели инструментов можно организовать и отобразить в рабочей книге максимально эффективным способом. Команды, необходимые пользователям, можно сгруппировать на панели инструментов вместе, тогда как менее важные (или совсем неиспЬльзуемые) команды вы вправе вообще убрать с панели инструментов. Отображение и скрытие панелей инструментов в Excel по умолчанию панели Стандартная и Форматирование отображаются, вдоль верхней части окна программы. Их можно расположить в две строки или объединить в одну общую. В последнем случае на экране обычно не помещаются все кнопки этих панелей инструментов, поэтому наименее часто используемые кнопки оказываются скрытыми. Чтобы получить к ним доступ, щелкните на стрелке в правой части панели инструментов. Определить, какие панели инструментов должны отображаться на экране, несложно. Выберите в строке меню программы Excel команду Вид=^ Панели инструментов. Откроется список доступных панелей инструментов, причем отображаемые в данный момент панели в этом списке будут отмечены флажками (рис. 16.1). Чтобы показать скрытую панель инструментов (или скрыть отображенную), просто щелкните на ее названии. Р^1Ш1Ш^Ш1Р есп;[вю Фор^ ^^аР«в*«с'. ■ Q^Mibie . Окно' (Зправю ;"''^ 1% х-Н к: 11:4 100% ^i@,iArlalCyr J Стандартная 3 Форматирование Visual Basic WordArt Jv Веб-узел {: Внешние данные - Граница ^ Диаграммы • > Зависимости .:/; Защита ;; Настройка изображения Область задач X Окно контрольного значения ^■!k Рецензирование ■^', Рисование 14 Сводные таблицы :;} Текст в речь ^; Формы ^;^: Элементы управления 'К- Настройка... ,...iL:L.UJ #:^- ^^■'Ш1!т1^.ШШШШШ^. Рис. 16,1. Определите перечень отображаемых панелей инструментов Отображаемую на экране панель инструментов можно закрепить вдоль одной из границ экрана либо оставить ее плавающей в главном окне программы. В табл. 16.1 перечислены действия, доступные при размещении панелей инструментов на экране. 210 Часть Ш. Суббота. День
Таблица 16.1. Управление расположением панелей инструментов Чтобы Сделайте следующее Сделать закрепленную панель Подведите курсор к вертикальной точечной линии, рас- инструментов плавающей положенной вдоль левого или верхнего края панели инструментов, и перетащите панель в нужное место Сделать плавающую панель Подведите курсор к заголовку панели инструментов и инструментов закрепленной переместите панель к краю экрана Скрыть плавающую панель Щелкните на кнопке закрытия окна (X), расположенной в инструментов верхнем правом углу панели Переместить плавающую па- Подведите курсор к заголовку панели и перетащите ее на нель инструментов новое место Скрыть закрепленную панель Выберите команду Вид<=>Панели инструментов, после чего инструментов уберите флажок, отображаемый напротив названия данной панели Изменить размер плавающей Подведите курсор к краю панели инструментов и затем панели инструментов переместите его, пока не достигнете требуемых размеров Создание новой панели инструментов в Excel можно создавать новые панели инструментов и добавлять к ним любые требуемые кнопки. Это могут быть кнопки, изначально предусмотренные для панелей инструментов Excel, которым уже соответствуют конкретные команды, либо пользовательские кнопки, для которых устанавливается связь с программами VBA. Создание подобных панелей инструментов как составной части приложения может оказаться весьма полезным для будущих пользователей. Чтобы создать новую панель инструментов, следуйте представленным ниже рекомендациям. 1. Выберите команду Вид=^>Панели инструментов'=>Настройка, в результате чего на экране будет отображено диалоговое окно Настройка. 2. Щелкните на корешке вкладки Панели инструментов (рис. 16.2). 3. Щелкните на кнопке Создать. Excel отобразит новое окно с предложением указать название создаваемой панели инструментов. 4. Назовите новую панель инструментов, после чего щелкните на кнопке ОК. Созданная панель инструментов изначально пуста. О том, как добавить к ней кнопки, рассказано в следующих двух подразделах. Названия пользовательских панелей инструментов отображаются вместе с названиями встроенных панелей Excel на вкладке Панели инструментов диалогового окна Настройка. Добавление и удаление кнопок на панели инструментов Вы можете добавить или удалить кнопки с любой панели инструментов Excel. 20*Ц5» Кроме того, в Excel предусмотрена возможность изменения порядка расположения уже имеющихся на панели инструментов кнопок. Существует два способа решения данной задачи. Первый способ, описанный ниже, состоит в копировании или перемещении кнопок с одной панели инструментов на другую. Урок 16. Создание пользовательских панелей инструментов 211 о
|к Форматирование In Visual Basic Г WordArt |Г~ В€б-узвп ^[Г" Внешние данные {Г" Во весь экран jF' Выход из режима конструетора [Г" Граница iT" Диаграмма f Диаграммы IF' Зависимости Y Защита [Г" Настройка изображения |Г' Настройка сбьемъ ^тт :■;■.••*; ■-■/■.:.;■ '"уц^-/'-'.^::,■%'-.,.. 1И^И11 Ijgiliiljll ||Щ|!|||1Ш||Ш||щ Я: ll^lllfllll Рис. 16.2. Вкладка Панели инструментов диалогового окна Настройка 1. Убедитесь, что на экране отображаются все необходимые панели инструментов. 2. Выберите команду Вид^Панели инструментов«=>Настройка, чтобы отобразить диалоговое окно Настройка. В этом случае Excel переходит к режиму настройки панелей инструментов. 3. Перетащите кнопку с одной панели инструментов на другую. Если вы хотите переместить кнопку, просто перетащите ее мышью на новое место. Чтобы скопировать кнопку, при перетаскивании удерживайте нажатой клавишу <Ctrl>. 4. При перемещении кнопки на другое место той же панели инструментов просто перетащите ее на новую позицию. 5. Чтобы убрать кнопку с панели инструментов, перетащите ее с панели инструментов и отпустите кнопку мыши. При этом курсор должен располагаться над любым участком экрана, но не над другой панелью инструментов. 6. Закончив работу, щелкните на кнопке Закрыть, чтобы закрыть диалоговое окно Настройка. Второй способ добавления кнопок заключается в перетаскивании их из диалогового окна Настройка. 1. Убедитесь, что панель инструментов, которую требуется изменить, в настоящий момент отображена на экране. 2. Выберите команду Вид'=>Панели инструментов^^Настройка, чтобы открыть диалоговое окно Настройка. 3. Щелкните на корешке вкладки Команды (рис. 16.3). 4. В списке Категории выберите категорию, к которой относится требуемая команда. В списке Команды отображается перечень всех команд, принадлежащих этой категории. 5. Перетащите команду из списка Команды на панель инструментов. Обратите внимание, что некоторые команды не имеют своей пиктограммы. В таком случае на панели инструментов отображается кнопка с названием команды. 212 Часть IIL Суббота. День
Панели ииструнекгоа Команды | Г^цм1негг(ш | Чтобы ;^о6авигь команду на пакет» }1нсгрумекгов, выбе|жгеЮггего^тю и первгшф^те: команда из этого окна на панель. Категории: Ког]ацфы: Сервис Данные Окна и справка Рисование Автофигуры Диаграмма Веб Формы Элементы управления Выделенная команда: d 3 Подчеркнутый '^ Формат по образцу 2, Двойное подчеркивание лв€ Зачеркнутый ^ Цвет текста % Перебор цветов шрифта ^ По левому краю ^: 1 ► ш ^писание f Изменить вудепентой объект ;*'{ о Закрытьу! Рис. 16.3. Вкладка Команды диалогового окна Настройка 6. Повторяйте эти действия до тех пор, пока все необходимые вам команды не окажутся добавленными на панель инструментов. 7. Щелкните на кнопке Закрыть, чтобы закрыть диалоговое окно Настройка. Запуск программ с помощью кнопок панелей инструментов Рассмотренные ранее способы настройки панелей инструментов заключались в добавлении или удалении команд, встроенных в Excel. Но в этой программе можно также создать пользовательские кнопки и поставить им в соответствие макросы или программы. Прежде всего, добавьте на панель инструментов пользовательскую кнопку. 1. Убедитесь, что панель инструментов, которую вы хотите изменить, в данный момент отображается на экране. 2. Выберите команду Вид'=>Панели инструментов^^Настройка, чтобы отобразить диалоговое окно Настройка. 3. Щелкните на кореп1ке вкладки Команды (см. рис. 16.3). 4. В списке Категории выберите категорию Макросы (рис. 16.4). 5. Из списка Команды перетащите на редактируемую панель инструментов элемент Настраиваемая кнопка. 6. Повторите эти действия, если на панель инструментов требуется добавить несколько пользовательских кнопок. 7. Щелкните на кнопке Закрыть, чтобы закрыть диалоговое окно Настройка. На этом этапе на панели 1^нструментов уже будет находиться пользовательская кнопка, но она пока не связана ни с какими программами или макросами. Кроме того, по умолчанию на кнопке, называющейся Настраиваемая кнопка, отображается значок-смайлик. Ниже перечислены действия, которые необходимо выполнить для решения данной задачи. Урок 16. Создание пользовательских панелей инструментов 213
ШрцрдЯИИШ^ -i-*^ л : Настраиваемая команда меню ©. Настраиваемая кнопка ^'г;.;!.;л:^^ Окна и справка Рисование |Автофигуры Диаграмма Веб |Фориы Эпемекты упрааления Всгроеинь№ меню Новое меню еьм|&шнн8Я комшдо .'. ' Длисание. '^:1|-:.Изм«Мь' вшм*^нкый объект.- \''->^Л- ''ШУ^ fML ^^'' Ai^felJ ® \3M|)Mtt.' а Рис. 16,4. Добавление пользовательской кнопки на панель инструментов Чтобы выбрать для кнопки значок, следуйте описанным ниже рекомендациям. 1. Щелкните на добавленной кнопке правой кнопкой мыши. 2. В открывшемся меню выберите команду Назначить макрос. На экране появится диалоговое окно Назначить макрос. 3. В списке Имя макроса выберите макрос, который должен соответствовать этой пользовательской кнопке. 4. Щелкните на кнопке ОК. Макросы можно назначить любой кнопке, имеющейся на панели инструментов, а не только пользовательской. Однако не советуем этого делать, поскольку для пользователей стандартные значки на кнопках панелей инструментов, как правило, ассоциируются с привычными для них командами. Если кнопке панели инструментов назначена какая-либо программа или макрос, щелчок на ней приведет к запуску этой программы (или макроса) подобно тому, как если бы она была выбрана в диалоговом окне макросов. Чтобы изменить название пользовательской кнопки, выполните следующие действия. 1. Щелкните на кнопке панели инструментов правой кнопкой мыши, чтобы отобразить на экране раскрывающееся меню (рис. 16.5). Выполните это действие, пока отображается диалоговое окно Настройка. 2. Третий пункт открывшегося меню — Имя. Щелкните в поле рядом с этим пунктом меню и укажите новое название кнопки. Чтобы назначить данной кнопке клавишу быстрого доступа, поставьте перед соответствующим символом названия знак амперсанда (&). 3. Щелкните за пределами раскрывающегося меню, чтобы убрать его с экрана. 214 Часть IIL Суббота. День
г Сброс ^ Удалить ^^^Щ&Настраивдемая кнопка ц- Копировать значок на кнопке %. Вставить значок для кнопки 1 Босхтановить значок на кнопке '$ Изменить значок на кнопке,.. '5 Выбрать значок для кнопки с Основной стиль |Ч Только текст (всегда) . : Только текст {в меню) Qi Значок и leKCT v: Начать группу \ f Назначить гиперссылку J4 Назнауить макрос... Рис. 16.5. Изменение названия пользовательской кнопки Клавиша быстрого доступа к кнопке панели инструментов — это символ (обычно буква), клавишу которого можно нажать на клавиатуре вместе с клавишей <Alt>, чтобы выбрать соответствующую кнопку (вместо того чтобы щелкнуть на ней кнопкой мыши). Символ, соответствующий клавише быстрого доступа, отображается в названии кнопки подчеркнутым. Клавиша быстрого доступа действует только в том случае, если на экране представлено название кнопки; если отображается только значок кнопки, клавиша быстрого доступа остается неактивной. Никогда не выбирайте для кнопок клавиши быстрого доступа, которые уже используются для доступа к стандартным командам меню программы Excel (например, клавиша <F> для File). Это может ввести пользователей в заблуждение. Чтобы изменить значок кнопки на панели инструментов, выполните следующие действия. 1. Щелкните правой кнопкой мыши на кнопке панели инструментов — в результате будет отображено раскрываюп^ееся меню (см. рис. 16.5). Выполните это действие, пока отображается диалоговое окно Настройка. 2. Чтобы использовать один из предустановленных значков, в открывшемся меню выполните команду Выбрать значок для кнопки, после чего выберите один из предложенных рисунков (рис. 16.6). 3. Чтобы отредактировать один из предлагаемых рисунков, выберите в меню команду Изменить значок на кнопке, в результате чего будет открыт редактор Редактор кнопок. 4. Измените рисунок по вашему желанию; затем закройте окно. Урок 16. Создание пользовательских панелей инструментов 215
Сброс Удалить Имя: ^Настраиваемая кнопка ! Копировать значок на кнопке Ваавить значок дня кнопки Восстановить значок на кнопке Изменить значок на кнопке... рш^^ШШ^^^^^Ш! Основной стиль Только текст (всегда) Только текст {в меню) \\^\ Значок и leKCT Начать группу I Назначить гиперссылку ► 1 Назначить макрос... @ (S) # db т й1 ^ ф) Д ji t» Р %м @ ¥ ♦ Ф ^ # с» S Л D ♦^ 4- -► 1^ Ч- ^ di Ш *>Х ^у* Щ ^ ж\ ♦ 1^ ц <^ф ^\ Рис. 16.6. Выбор значка для кнопки панели инструментов тш Рис. 16.7. Использование редактора кнопок для изменения рисунка на кнопке Использование редактора кнопок Редактор кнопок является простым и удобным средством редактирования значков, отображаемых на кнопках панелей инструментов. Значки кнопок имеют фиксированный размер 16x16 пикселей и ограничены 16 цветами. Отредактировать рисунок значков можно следующим образом. • Чтобы изменить цвет пикселей, выберите требуемый оттенок в поле Цвета, после чего щелкните или перетащите курсор по рисунку. • Чтобы аереть пиксели, щелкните на элементе Удалить в поле Цвета, а затем щелкните или перетащите курсор по рисунку. 216 Часть III. Суббота. День
Осталось 10 минут • Очищая весь рисунок, щелкните на кнопке Очистить. • Вы сможете передвинуть весь рисунок в пределах его ограничительной рамки, если щелкнете на кнопках со стрелками. • Щелкните на кнопке ОК, чтобы сохранить внесенные изменения, или на кнопке Отмена, чтобы закрыть окно, не изменяя прежнего рисунка. На кнопке панели инструментов может отображаться только ее значок, только ее название либо одновременно и значок, и название. Чтобы определить, что именно должно отображаться на кнопке, при открытом окне Настройка щелкните правой кнопкой мыши на кнопке панели инструментов— так вы получите доступ к раскрывающемуся меню. Далее выполните перечисленные ниже действия. • Выберите вариант Основной стиль, если хотите, чтобы на кнопке отображался только ее значок. • Выберите вариант Только текст (всегда), если необходимо, чтобы отображалось лишь название кнопки. • Выберите вариант Значок и текст, в результате чего отображаться будет и значок кнопки, и ее название. Добавление пользовательских панелей инструментов к рабочим книгам По умолчанию созданные пользователем панели инструментов хранятся как часть Excel, они не связаны с конкретной рабочей книгой. Чтобы сделать подобную панель инструментов составной частью приложения, ее необходимо присоединить к рабочей книге. Данная задача решается следующим образом. 1. Откройте рабочую книгу разрабатываемого приложения. 2. Выберите команду Вид'=>Панели инструментов'=>Настройка, чтобы открыть диалоговое окно Настройка. 3. Щелкните, если необходимо, на корешке вкладки Панели инструментов. 4. Щелкните на кнопке Вложить, после чего на экране появится диалоговое окно Управление панелями инструментов (рис. 16.8). Панели оольэошггедя: Специальные мнсгрумекты ж| Ввод данных --~-' ^;,.Jii^.i:i^ C^^^SSO |s|;v,l::'::; '■'■■2i^jllA-' k:^.:&S^.^h ^^<^^^^^Жtfe!t;Ч■S№S'^gi^^Д~У Рис, 16я. Присоединение пользовательской панели инструментов к рабочей книге Урок 16. Создание пользовательских панелей инструментов 217
5. Список в левой части окна отображает названия доступных пользовательских панелей инструментов. Выберите одно из названий и щелкните на кнопке Копировать, чтобы присоединить соответствующую панель инструментов к рабочей книге. 6. Повторите эти действия, если требуется включить в рабочую книгу несколько панелей инструментов. 7. Закончив работу, щелкните на кнопке ОК. Восстановление настроек по умолчанию для панелей инструментов Чтобы вернуть встроенные панели инструментов Excel к их первоначальному виду, удалив добавленные кнопки и восстановив удаленные, выполните перечисленные ниже действия. 1. Выберите команду Вид'=>Панели инструментов'=>Настройка, чтобы отобразить диалоговое окно Настройка. 2. Щелкните на корешке вкладки Панели инструментов. 3. В списке Панели инструментов укажите панель инструментов, которую решили восстановить. 4. Щелкните на кнопке Сброс. Вы не можете восстанавливать пользовательские панели инструментов, поскольку для них не существует состояний, заданных по умолчанию. Скрытие и отображение панелей инструментов из программы VBA Вы вправе выполнять различные действия над панелями инструментов непосредственно из программ VBA, в частности, скрывать и отображать их по мере необходимости. Благодаря этому вы получаете возможность достаточно точно настраивать свои приложения, отображая требуемые пользовательские панели инструментов именно в те моменты, когда это необходимо. В языке VBA панель инструментов рассматривается как командная панель. Су* ществует три типа командных панелей: панели инструментов, панели меню и меню быстрого доступа. К теме настоящего урока относятся только панели инструментов. Информация по всем командным панелям хранится в коллекции Command- Bars объекта Application. Здесь собраны сведения обо всех встроенных панелях инструментов Excel, а также о пользовательских панелях. Коллекция Сот- mandBars работает аналогично другим коллекциям, которые уже рассматривались в этой книге. Чтобы обратиться к отдельному элементу коллекции, необходимо указать номер его позиции: CommandBars(4) Однако зачастую такой подход не очень удобен. Рекомендуем ссылаться на элемент коллекции по его названию: CommandBars{имя) Чтобы отобразить панель инструментов на экране, присвойте ее свойству Visible значение True. Чтобы скрыть панель инструментов, присвойте этому свойству значение False. Например, следующая строка кода делает панель под названием Ввод данных видимой на экране: CommandBars("Ввод данных").Visible = True 218 Часть III. Суббота. День
Чтобы определить местоположение панели инструментов на экране, воспользуйтесь ее свойством Position. Значения, которые могут быть присвоены этому свойству, приведены в табл. 16.2. Таблица 16.2. Значения свойства Ров! tlon объекта CoxamandBare Константа Значение msoBarLef t Панель инструментов прикреплена к левому краю msoBarRight Панель инструментов прикреплена к правому краю msoBarTop Панель инструментов прикреплена к верхнему краю msoBarBottom Панель инструментов прикреплена к нижнему краю msoBarFloating Плавающая панель инструментов Программа, код которой показан в листинге 16.1, демонстрирует пример использования этих свойств. Данная программа может быть применена к приложению Excel, содержащему пользовательские панели инструментов под названиями Ввод данных и Статистика. При выполнении программы обе панели инструментов становятся видимыми и закрепляются вдоль верхней части области рабочего листа. Листинг 16.1. Программа для отображения и расположения пользовательских панелей инструментов Sub DisplayCustomToolbairs О CommandBars("Ввод данных").Visible = True CommandBars("Ввод данных").Position = msoBarTop CommandBars("Статистика").Visible = True CommandBars("Статистика").Position = msoBarTop End Sub В уроке 24 представлены сведения о том, как защитить пользовательские панели инструментов от изменений, вносимых пользователем. э Обзор В этбм уроке речь шла о создании пользовательских панелей инструментов и Готово! включении ИХ В состав приложения Excel. • В Excel можно добавлять любое требуемое количество пользовательских панелей инструментов. • Пользовательская панель инструментов содержит как предустановленные кнопки Excel, так и специальные пользовательские кнопки. • Вложенная пользовательская панель инструментов становится присоединенной к рабочему листу. • Для доступа к отдельным панелям инструментов в программе VBA необходимо использовать коллекцию CommandBars. • В языке VBA предусмотрена возможность отображения, скрытия и определения способа расположения на экране панелей инструментов. Урок 16. Создание пользовательских панелей инструментов 219
Проверьте себя 1. Назовите способы отображения и скрытия панели инструментов в программе Excel. (См. подраздел "Отображение и скрытие панелей инструментов".) 2. Сколько разных панелей инструментов могут содержать одну и ту же кнопку? (См. подраздел "Добавление и удаление кнопок на панели инструментов".) 3. Какие действия необходимо выполнить для включения пользовательской панели инструментов в состав рабочей книги? (См. раздел "Добавление пользовательских панелей инструментов к рабочим книгам".) 4. Как из программы VBA определить положение панели инструментов на экране? (См. раздел "Скрытие и отображение панелей инструментов из программы VB А".) 220 Часть III. Суббота. День
ЧАСТЬ Суббота. День. Обзор 1. Как определить количество столбцов и строк в диапазоне? 2. На что ссылается свойство Application. Columns? 3. Программа вставляет новый столбец в позицию В. Что происходит со старым столбцом В? 4. Предположим, что диапазон R ссылается на ячейки A1:D6. На какую ячейку ссылается R. Cel 1 s {6) ? 5. На что ссылается свойство Worksheet ("Объемы продаж") . Cells? 6. Как можно обратиться ко всем пустым ячейкам диапазона? 7. Ячейка А10 содержит формулу =SUM($A$1: $А$9). Как изменяется эта формула при копировании в ячейку F20? 8. Формула содержит ссылку на ячейку: А$10. Что происходит при копировании этой формулы в другую ячейку? 9. Как в формуле следует обратиться к ячейке, расположенной в другом рабочем листе? 10. Как Excel отличает формулы ячеек от текстовых значений? 11. Что такое циклическая ссылка? 12. Какая функция Excel используется для вычисления выплат по кредиту? 13. Какая функция Excel преобразует числовые значения к денежному формату? 14. Можно ли использовать функции Excel в кодах VBA? Если да, то как? 15. Как изменить формат отображения числовых данных для определенного диапазона? 16. Какие три основных цвета используются для определения цветов в Excel? 17. Какое свойство определяет фоновый цвет ячеек? 18. В каких единицах измеряется ширина столбцов рабочего листа? 19. Какой метод необходимо вызвать, чтобы изменить ширину столбца в соответствии с шириной хранящихся в нем данных? 20. Какой метод используется для поиска в пределах диапазона всех экземп- ^лвроз галвлзол строка? 21. Какое значение возвращает метод Find, если он не находит искомую строку? 222 Часть Ш. Суббота. День. Обзор
22. Как в Excel определить панели инструментов, которые должны отображаться на экране? 23. При создании новой панели инструментов, какие кнопки отображаются на ней по умолчанию? 24. Как назначить макрос для кнопки, расположенной на пользовательской панели инструментов? 25. Сохраняются ли пользовательские панели инструментов в файле рабочей книги автоматически? 2в. Назовите два основных варианта размещения панелей инструментов в Excel. Часть Ш. Суббота. День. Обзор 223
^мни
УРОК Основы построения диаграмм Содержание урока ^ Листы диаграмм и встроенные диаграммы ^ Определение данных, на основе которых должен строиться график ^ Выбор типа диаграммы ^ Добавление названия диаграмм и заголовков ее осей ^ Выбор шрифтов для диаграммы V Использование метода ChartWi zard ФВ Excel предусмотрены довольно мощные возможности для построения диаграмм. Вы можете создавать диаграммы самых разных типов, в том числе круговые и линейчатые диаграммы, графики, а также более специфические диаграм- зомшг>т ^^ — лепестковые, точечные или кольцевые. Диаграмма Excel связана с данными рабочего листа и автоматически обновляется в соответствии с изменениями исходных значений. Этот и следующий уроки будут посвящены рассмотрению возможностей языка VBA, предназначенных для работы с диаграммами Excel. Встроенные диаграммы и листы диаграмм Диаграмма на рабочем листе может быть представлена двумя способами: • как встроенная диаграмма на обычном рабочем листе, на котором также могут быть расположены данные и/или другие встроенные диаграммы; • на листе диаграммы — это специальный тип рабочего листа, который содержит только диаграмму. На рис. 17.1 и 17.2 показаны примеры этих двух вариантов.
||1Я111М11111111И К24 ШШШШШШШЕШ^^^^Шщ Ё^ЕШЖЖЖЖ; [РЦОбъем продаж '^^ -Г 7.'" '1 1^^9 20сю' ' "2661^ Денис i 535 758Р 4 761р. 409 419р.| I Игорь 442 734р. 530 8б6р^ 434 354р.: i Артур : 150 039р. 288 928Р ш щ IE® И 1в 181 19 68 086р. ^ ;Свргвй . 316 328Р 300190р. 117 536р.; 2002 2003 487 799Р 37 889р.- 199 175р.: 159124р. 160 999р.; 261 197р 413 753р"^ 3915 379рУ '"М 20 Й2 |1Ж Сергей Артур Игорь Денис 0| Объем продаж 5. 200 000р. 400 000р. 600 000р. ■ 2003| D2002 D2001 ■ 2000 ■ 19991 щЩ М ^"-'►''''мКЛист!/:^^ '4iLim±L Рис. 17.1. Рабочий лист с исходными данными и встроенной диаграммой i@ файл Оравка 8ид ваавка Форе^ Орвис Au^fpaMMa Окно Qipaepia^ . <% Объем продаж Сергей Артур Игорь Денис ■ 2003 D2002 П2001 ■ 2000 ■ 1999 lOOOOOp, 200000р. ЗОООООр. 400000р. 500000р. бОООООр. щ'1'^/Жаишгршииш1ШЖШШ7Шс^^1Г"^тШШт^ Pr^mKft-i^iv/iVniiMi ^ш!-1гмУ1Гт 1гг лу МШ Рис. 17.2. Та же диаграмма, что и на рис. 17.1, но размещенная на отдельном листе диаграммы 226 Часть IV. Суббота. Вечер
в обоих случаях свойства диаграмм и метод работы с ними остаются одинаковыми. Однако способы построения диаграмм первого и второго типа, а также методы обращения к ним имеют ряд отличий. Встроенные диаграммы Встроенные диаграммы создают в тех случаях, когда необходимо отобразить диаграмму вместе с ее исходными данными и/или вместе с дрз^гими данными и другими встроенными диаграммами. Каждая встроенная диаграмма представлена объектом Chart, который, в свою очередь, содержится в объекте ChartObj ect. Такая несколько усложненная, на первый взгляд, организация объясняется тем, что объект Chart сам по себе не обладает возможностями для определения размера или положения диаграммы — осуществление этих функций возлагается на объект ChartOb j ect. Каждый рабочий лист Excel располагает коллекцией ChartOb j ect, которая содержит по одному объекту для каждой встроенной диаграммы этого листа. Чтобы добавить на рабочий лист новую встроенную диаграмму, необходимо добавить в эту коллекцию объект ChartOb j ect. При этом используется следующий синтаксис: SomeWorksheet.ChartObjectS.Add(Left, Top, Width, Height) Параметры Left и Top определяют положение верхнего левого угла диаграммы, а параметры Width и Height определяют ее размер. Все четыре аргумента измеряются в пунктах (один пункт равен 1/72 дюйма). Метод возвращает ссылку на созданный объект ChartOb j ect. После этого можно использовать свойство Chart для обращения к соответствующей диаграмме. Например: Dim со As ChartObject Dim ch As Chart Set CO = Worksheets("ЛИСТ1").ChartObjects.Add(50, 50, 250, 165) Set ch = CO.Chart После выполнения этого кода на листе Лист 1 создается новая пустая встроенная диаграмма. Для ссылки на эту диаграмму используется переменная ch. Более подробно об объектах ChartOb j ect рассказывается далее в этом уроке. Если диаграмма закрывает собой расположенные на рабочем лиае значения, они по-прежнему остаются на листе, однако пропадают из виду. Чтобы вновь отобразить эти значения, переместите диаграмму или скройте ее. Листы диаграмм Листы диаграмм используются в тех случаях, когда необходимо сделать эту диаграмму максимально большого размера, но при этом параллельно отображать данные или другие диаграммы не требуется. Лист диаграммы, как и встроенная диаграмма, представлен объектом Chart. Но, в отличие от встроенной диаграммы, использовать объект ChartOb j ect не обязательно, так как положение самой диаграммы на листе диаграмм фиксировано, а ее размер зависит от размеров листа. Каждая рабочая книга содержит коллекцию Charts, в которой находятся все добавленные к ней листы диаграммы. Коллекция Charts рабочей книги не ссылается на встроенные диаграммы — только на листы диаграмм. Аналогичным образом, коллекция ChartObjects рабочего листа ссылается только на встроенные диаграммы, но не на листы диаграмм, которые могут быть созданы в этой рабочей книге. Чтобы добавить новый лист диаграммы в рабочую книгу, вызовите метод Add: Charts.Add Урок 17. Основы построения диаграмм 227
Данный метод возвращает ссылку на новую диаграмму. В результате выполнения представленного ниже фрагмента кода в активную рабочую книгу добавляется новый лист диаграмм, а сама программа получает ссылку на эту только что созданную диаграмму (которая, естественно, изначально пуста). Dim ch As Chart Set ch = ActiveWorkbook.Charts.Add После добавления указанного кода используйте переменную ch для обращения к созданной диаграмме. Объект Chart Рассмотренные ранее методы создания диаграмм позволяют создавать лишь пустые диаграммы. Следующий шаг будет заключаться в определении параметров созданной диаграммы, что поможет требуемым образом отобразить интересующую вас информацию. Этот процесс состоит из двух этапов: определения данных, на основании которых строится диаграмма, и определения типа самой диаграммы. Определение исходных данных Определяя данные, на основании которые будет строиться диаграмма, необходимо помнить об особенностях интерпретации этих данных программой Excel. Почти для всех типов диаграмм Excel принципиальное значение имеют понятия рядов данных (data series) и категорий (categories). Рассмотрим пример, изображенный на рис. 17.3. На этом рабочем листе рядами данных являются значения по каждому из регионов, причем всего представлено три ряда данных (Европа, Азия, Африка) — в каждом содержится по четыре значения. Значения по кварталам являются категориями, таким образом, всего представлено четыре категории, каждая из них содержит по три значения. fflWWW I §^^Ш^звт;От Встщ^ ФощзгРз Данные Окно О^раввш - ■ F14' ■^'С'у.'гА. & X Ж» В 'D't: Реализация мороженного Кв1 Кв2 КвЗ Кв4 Ваниль : [Шоколад; Вишня 1221; 633- 455 1665 780 560^ 1788 901* 838; 1244 812; 655 И ■; i - ^'^^''^K^\!*CTi^^ Idi Гопто. Jm Рис. 17.3. При построении диаграмм Excel различает исходные значения по рядам данных и категориям 228 Часть IV. Суббота. Вечер
Вовсе не обязательно, чтобы ряды данных были заданы в строках, а категории — в столбцах. На основании представленных на рис. 17.3 значений можно построить и другую диаграмму, для которой каждый столбец будет представлять ряд данных, а каждая строка — категорию. Таким образом, создавая диаграмму,^ вы должны знать, как именно организованы исходные данные. Чтобы определить, какие исходные данные используются для построения диаграммы, вызовите метод SetSourceData объекта Chart. Этот метод имеет такой синтаксис: SetSourceData(Source, PlotBy) Source — это диапазон рабочего листа, в котором содержатся исходные данные. Его можно указать, используя идентификаторы строк и столбцов. Если это именованный диапазон, наберите его имя. PlotBy— это константа, указывающая на расположение рядов данных: в строках (xlRows) или в столбцах (xlColumns). Рассмотрим в качестве примера данные рабочего листа, показанного на рис. 17.3. Код, определяющий исходные данные для построения диаграммы, будет выглядеть следующим образом (предполагается, что ch — ссылка на объект Chart): ch.SetSourceData Source:=Worksheets("ЛистХ").Range("B3:F6"), __ PlotBy:=xlRows Дописав другие требуемые коды, получим процедуру для создания встроенной диаграммы на основании данных, показанных на рис. 17.3. Код процедуры представлен в листинге 17.1, а полученная в результате его выполнения диаграмма отображена на рис. 17.4. Листинг 17.1. Процедура, создающая встроенную диаграмму на основании данных, представленных на рис, 17.3 Public Sub CreateEmbeddedChart() Dim со As ChartObject Dim ch As Chart Set CO = Worksheets("ЛИСТ1").ChartObjects.Add(50, 100, 250, 165) Set ch = CO.Chart ch. SetSourceData Source: =Worksheets ("Лист1") . Range ("B3 : F6 " ) , ___ PlotBy:=xlRows End Sub Данный пример имеет некоторые особенности, на которые следует обратить внимание. • Подписи рядов данных и категорий автоматически включаются в диаграмму. • Категории располагаются на диаграмме по горизонтальной оси; значения отображаются по вертикальной оси. • Автоматически создается легенда диаграммы, которая содержит ключи для определения рядов данных. • Масштаб вертикальной оси диаграммы определяется автоматически в соответствии с интервалом, в котором изменяются значения диапазона. • Если тип диаграммы не определен, по умолчанию создается гистограмма. Урок 17. Основы построения диаграмм 229
®Й^Т|&а5К8 Вид „Всшш® Oopi^Tfi. С^й>8ис. Д^ Е23 ^ .^><^^^Д ^M^i ^ ■ 3 Т jI 2 9 Ж 111 3? jl я в I ЕЕ ^.>"^ff!':^^..^ 1'! ''^'.'^'0....'Л''Г>1 ж^1 Реализация мороженного Кв1 Кв2 КвЗ Кв4 Ваниль I Шоколад I ' Вишня 1221 633! 455! 1665 780: 560; 1788 901; 8381 1244 812 655 2000-1 1500- 1000- 500 - 0 - Кв1 Кв2 КвЗ Кв4 ■ Ваниль ■ Шоколад а Вишня 1 1 ^fii^''''^^ Готово V'' ^--х^^-.тА''^^-. Ш' Рис. 17.4. Диаграмма, созданная процедурой из листинга 17.1 Осталось 20 минут Определение типа диаграммы Тип диаграммы определяется через свойство ChartType объекта Chart. В Excel предусмотрен набор констант, предназначенных для определения этого свойства. Каждая константа определяет не только базовый тип диаграммы (например, гистограмма, линейчатая диаграмма и т.п.), но и вариант каждого типа. От выбранного варианта зависит, в каком виде будет представлена диаграмма: в двухмерном или трехмерном. Общее количество доступных констант (соответственно, и возможных разновидностей диаграмм) слишком велико, поэтому далее будут представлены лишь отдельные из них. В табл. 17.1 перечислены константы некоторых наиболее часто используемых типов диаграмм, а информацию о других константах можно получить в справочной системе Excel. в Чтобы указать, какие типы диаграмм доступны в Excel используйте Мастер диаграмм и ознакомьтесь с предлагаемыми им вариантами. Диаграммы большинства типов могут быть представлены как в двухмерном, так и в трехмерном виде. Чтобы отобразить диаграмму в трехмерном виде, к соответствующей константе необходимо добавить символы 3D. Например, константа xlArea создает двухмерную диаграмму с областями, тогда как при использовании константы xlAreaSD будет создана трехмерная диаграмма того же типа. 230 Часть IV. Суббота. Вечер
Таблица 17.1. Наиболее часто используемые константы свойства ChartType Константа xlBar xlLine xlArea xlPie xlColumn xlPyramid Описание Линейчатая диаграмма График Диаграмма с областями Круговая диаграмма Гистограмма Пирамидальная диаграмма Определение типа диаграммы продемонстрировано на примере процедуры, код которой представлен в листинге 17.2. Данная процедура создает лист диаграммы для данных, показанных на рис. 17.3. На этом листе строится график с маркерами. Результат выполнения процедуры показан на рис. 17.5. Листинг 17.2. Процедура, создающая на отдельном листе график с маркерами Public Sub CreateChartSheetО Dim ch As Chart Set ch = ActiveWorkbook.Charts.Add ch.SetSourceData Source:=Worksheets{"ЛистХ").Range("B3:F6"),_ PlotBy:=xlRows ch.ChartType = xlLineMarkers End Sub I Область диагра... V / ; i; ^ KbI Kb2 Kb3 ■ Kb4 Puc, 17.5, Расположенный на отдельном листе диаграммы график с маркерами построен в результате выполнения процедуры, код которой показан в листинге 17.2 Урок 17. Основы построения диаграмм 231
Тип диаграммы можно изменить в любое время — в момент создания диаграммы или после этого. Определение внешнего вида диаграммы Помимо типа диаграммы, существует еще целый ряд других параметров, позволяющих управлять ее внешним видом. Некоторые параметры предназначены только для изменения способа отображения обрабатываемых данных, тогда как другие определяют, какая именно информация будет представлена пользователю. Отображение названия диаграммы Над каждой диаграммой может отображаться ее название. Внешний вид и содержание этого названия определяются с помощью двух свойств объекта Chart. • HasTitle. Свойство может принимать значения True и False, которые определяют, отображается ли заголовок на экране. • ChartTitle. Объект ChartTitle содержит всю информацию о названии диаграммы. Чтобы отобразить название диаграммы, необходимо присвоить требуемые значения свойствам объекта ChartTitle, а затем выбрать для свойства HasTitle значение True. Ниже приведен пример кода, в результате выполнения которого над диаграммой отображается название "Продажи за год" (предполагается, что диаграмма, на которую ссылается переменная ch, уже существует): Ch.HasTitle = True ch.ChartTitle.Text = "Продажи за год" Свойству HasTitle необходимо присвоить значение True перед тем. как определять значения свойства объекта ChartTitle. В противном случае возникает ошибка. Если вы просто укажете текст названия диаграммы, как в этом примере, то оно будет отображено с учетом параметров, используемых по умолчанию (шрифт, положение и т.п.). Чтобы изменить эти параметры, используйте свойства объекта ChartTitle, описанные в табл. 17.2. О том, как выбрать другой шрифт для названия диаграммы, рассказано далее в этом уроке. Таблица 17.2. Свойства объекта ChartTitle Свойство Описание AutoScaleFont Значение True/False, определяющее, изменяется ли размер шрифта названия автоматически при изменении размеров самой диаграммы. По умолчанию это свойство имеет значение True HorizontalAlignment Определяет способ горизонтального выравнивания названия диаграммы. Может принимать значения xlLef t (по левому краю), xlCenter (по центру) или xlRight (по правому краю) 232 Часть IV. Суббота. Вечер
Окончание табл. 17.2 Свойство Описание Left Расстояние в пунктах от левого края названия до левого края области диаграммы Тор Расстояние в пунктах от верхнего края названия до верхнего края области диаграммы Text Текст названия. По умолчанию это пустая строка Пример добавления названия к диаграмме показан в листинге 17.3, приведенном далее в этом уроке. Заголовки осей диаграммы Большинство диаграмм Excel имеют две оси (за исключением, например, круговой диаграммы). Горизонтальная ось — это ось категорий, а вертикальная — ось значений. По умолчанию ни одна ось не имеет заголовка, однако его при необходимости можно добавить. Чтобы обратиться к осям диаграммы, воспользуйтесь коллекцией Axes объекта Chart. Чтобы определить, к какой оси (значений или категорий) вы обращаетесь, используйте константы х1 Category и х1 Value. Таким образом, следующая строка ссылается на ось категорий диаграммы: SomeChart.Axes(xlCategory) Приведенная ниже строка ссылается на ось значений этой же диаграммы: SomeChart.Axes(xlValue) Чтобы добавить заголовок оси, присвойте свойству HasTitle значение True; после этого используйте свойство AxisTitle.Text, чтобы определить содержание заголовка. Предположим, что ch ссылается на существующую диаграмму: ch.Axes(х1Value).HasTitle = True ch.Axes(xlValue).AxisValue.Text = "Продажи no регионам" Чтобы удалить заголовок оси, присвойте свойству HasTitle значение False. Для изменения текста существующего заголовка следует соответствующим образом изменить значение свойства AxisTitle.Text. (Изменение шрифта заголовка оси будет рассмотрено далее в этом уроке.) Если вы удаляете заголовок оси путем присвоения свойству HasTitle значения False, то он не только исчезает с экрана— он удаляется полностью. Чтобы позднее вновь отобразить заголовок на экране, придется создать его заново. Прежде, чем обратиться к свойствам объекта AxisTitle, убедитесь, что свойству HasTitle присвоено значение True. В противном случае возникнет ошибка. В листинге 17.3 представлена усовершенствованная версия кода программы, рассмотренной ранее в этом уроке. В результате ее выполнения на основании данных, показанных на рис. 17.3, создается диаграмма, к которой добавлены заголовки осей и название самой диаграммы (рис. 17.6). Урок 17. Основы построения диаграмм 233
Листинг 17.3, Создание встроенной диаграммы с названием и заголовками Public Sub CreateEmbeddedChartWithTitlesО Dim со As ChartObject Dim ch As Chart Set CO = Worksheets("Лист1").ChartObjects.Add(50, 100, 250, 165) Set ch = CO.Chart ch.SetSourceData Source:=Worksheets("Лист1").Range("B3:F6"),_ PlotBy:=xlRows ' Добавление названия диаграммы ch.HasTitle = True ch.ChartTitle.Text = "Продажи no регионам" ' Добавление заголовка оси категорий ch.Axes(xlCategory).HasTitle = True ch.Axes(xlCategory).AxisTitle.Text = "Период" • Добавление заголовка оси значений ch.Axes(х1Value).HasTitle = True ch.Axes(xlValue).AxisTitle.Text = "Суммы продаж" End Sub '^^il^lXl . 1Щ Ш^^ I Древке,' £йд Basfm ' Фор1^ С^рвис^^' Д||аграмна'' Qgi^^^'Qvpssiei^ »>; 9 к ^ [Область диагра... ^ "^ - ;й^ l^jL^E^ijolZI. 10. 414. т 17, ii ш 21 А^' Реализация мороженного Ткв1 Ф ' а - Кв2 •КвЗ Кв4 Ваниль Шоколад Вишня , 1221 633 455 1665- 780 560 1788 901 838 1244 812 655 Продажи по регионам % 2000- 1 1500 2 1000 1 500- Ii; IB; Ii Кв1 Кв2 КвЗ Кв4 Период Ваниль Шоколад Jul ID Вишня ^'*>^<^*ТТ5Хлисг1/1^^ ^^£^.l.1.^aJ .1 АП Рис. 17,6. Диаграмма, созданная программой, код которой представлен в листинге 17.3 234 Часть IV. Суббота. Вечер
л Выбор шрифтов для диаграммы В программу VBA можно добавить коды, изменяющие шрифт любой имеющейся ^1о"минут ^^ диаграмме надписи. Любые аспекты отображения надписей на экране регулируются объектом Font, соответствующим конкретному текстовому элементу (название диаграммы, заголовок оси и т.п.). В табл. 17.3. показано, какой именно объект Font соответствует тому или иному элементу диаграммы. Таблица 173. Объекты Font, соответствующие различным элементам диаграммы Чтобы изменить шрифт такого „.используйте следующий объект Font: элемента как... Название диаграммы Chart. ChartTitle. Font Заголовок оси категорий Chart .Axes (xlCategory) .AxisTitle. Font Заголовок оси значений Chart .Axes (xlValue) .AxisTitle. Font Текст легенды Chart 1. Legend. Font Метки делений для оси категорий Chart. Axes (xlCategory) . TickLabels. Font Метки делений для оси значений Chart .Axes (xlValue) .TickLabels . Font Bee объекты, перечисленные в табл. 17.3, имеют свойство AutoScaleFont. Если этому свойству присвоено значение True (по умолчанию), размер шрифта автоматически изменяется при изменении размеров самой диаграммы. Следовательно, выбирая размер шрифта, вы будете всего лишь определяете его исходный размер по отношению к текущему размеру диаграммы. Фактический размер шрифта изменяется, если изменяется сама диаграмма. Метки делений на осях и заголовок оси — не одно и то же. Вернемся к примеру, показанному на рис. 17.6: слово "Период" является заголовком оси категорий, а "Кв1", "Кв2" и т. д. ■— это метки делений. В табл. 17.4 описаны свойства объекта Font, к которым вам, вероятнее всего, придется обращаться наиболее часто. Ниже приведены некоторые примеры. В следующем фрагменте программы для названия диаграммы выбран шрифт Arial полужирного начертания и размером 14 пунктов. With SomeChart.ChartTitle.Font .Name = "Arial" .Bold = True .Size - 14 End With В следующем фрагменте для легенды диаграммы выбран шрифт Times New Roman красного цвета и размером 10 пунктов: With SomeChart.Legend.Font .Name = "Times New Roman" .Color = RGB(255, 0, 0) .Size = 10 End With Более подробно об использовании функции RGB для определения цвета было рассказано в уроке 14. Урок 17. Основы построения диаграмм 235
Таблица 17,4. Наиболее часто используемые свойства объекта Font Свойство Описание Bold Значение True/False определяет, следует ли использовать для выбранного шрифта полужирное начертание Color Цвет шрифта, представленный значением RGB Italic Значение True/False определяет, следует ли применять для выбранного шрифта курсивное начертание Name Название выбранного шрифта В листинге 17.4 представлен еще один усовершенствованный вариант кода программы, создаваемой в этом уроке. В результате ее выполнения не только создается встроенная диаграмма (на основании данных, показанных на рис. 17.3), к которой добавляются название и заголовки осей, но также изменяется шрифт текстовых элементов, что делает ее внешний вид более привлекательным. Листинг 17.4. Программа, создающая встроенную диаграмму и изменяющая используемый по умолчанию шрифт текстовых злементов Public Sub CreateEmbeddedChart() Dim со As ChartObject Dim ch As Chart Set CO = Worksheets("ЛИСТ1").ChartObjects.Add(50, 100, 250, 165) Set ch = CO.Chart ch.SetSourceData Source:=Worksheets("Лист1").Range("B3:F6"),_ PlotBy:=xlRows ' Добавление названия диаграммы ch.HasTitle = True ch.ChartTitle.Text = "Продажи no регионам" ' Изменение его шрифта With ch.ChartTitle.Font .Name = "Arial" .Size = 14 iColor = RGB(0, 0, 255) End With ' Добавление заголовка оси категорий и установка его шрифта ' Изменение шрифта меток делений по оси значений With ch.Axes(х1Category) .HasTitle = True .AxisTitle.Text = "Период" .AxisTitie.Font.Name = "Arial" .AxisTitle.Font.Size = 10 .TickLabels.Font.Name = Arial .TickLabels.Font.Size = 8 End With • Добавление заголовка оси значений и установка его шрифта ' Изменение шрифта меток делений по оси значений With ch.Axes(х1Value) .HasTitle = True .AxisTitle.Text = "Суммы продаж" 236 Часть IV. Суббота. Вечер
.AxisTitie.Font.Name = "Arial" .AxisTitle.Font.Size = 10 .TickLabels.Font.Name = Arial .TickLabels.Font.Size = 8 End With ' Изменение шрифта легенды With ch.Legend.Font .Name = Arial .Size = 10 .Color = RGB(255, 0, 0) End With End Sub Полученная в результате диаграмма показана на рис. 17.7. Сравните ее с диаграммой, отображенной на рис. 17.4, и обратите внимание на изменение шрифтов текстовых элементов. Поскольку рисунки черно-белые, некоторые изменения вы заметить не сможете: например, название диаграммы отображается синим цветом, а текст легенды — красным. ■^^Н|щХ| №| файл Правка &1д Вст^кз Формат C^>bic Данные Ою^о 1!^равю - 9 ж A1 ▼ jfc Реализация мороженного Ш№^ вГ о J D J,^ 1,:..:.±..,....:£...,^ф"-^ --Ш Кв1 Кв2 КвЗ К84 Ваниль 1221 1665 1788 1244- Шоколад: 633 780: 901 812^ Вишня 455 560 838 655 Продажи по регионам в Ваниль ■ Шоколад D Вишня Кв1 Кв2 КвЗ Кв4 Период К 4 » и [\Л ист1 / ЛИСГ2 / ЛисгЗ /" l.iJ_ II ' I I щ Рис. 17.7. Диаграмма, созданная в программе, код которой представлен в листинге 17.4 Метод ChartWizard Если вы уже создавали графики в Excel, то, скорее всего, пользовались средством Мастер диаграмм. Подобно другим мастерам Microsoft, он предлагает Урок 17. Основы построения диаграмм 237
пользователю последовательность действий, с помощью которой можно определить вид создаваемой диаграммы. После этого в соответствии с полученными ответами создается диаграмма. На рис. 17.8 показано окно Мастер диаграмм, открываемое на первом шаге; в нем пользователю предлагается выбрать требуемый тип диаграммы. "CWHi^ii^^ i;lieaw«apw^ ^Mi щ Ш_ Ликейчатал Щ График |0 Круговая щ. Точечная У| С областями Ш Кольцевая Щ[ Лепестковая Ш Поверхность VtX Пузырьковая pai Биржевая \Ш 14илиндрическая J4 Коническая iil la Ш щ_ 1 ■ /Ьб^1м1н8Я гисгогрд№<&, слгображает npoic>forrp p<&fJai»niT9i: ^ т bpijBHa'^•• Y /''<-'Нтйй • j Далее>• | • &1ево ■ Рис. 17.8. Мастер диаграмм Excel упрощает задачу создания диаграммы в Excel В распоряжении программистов VBA имеется подобный инструмент — метод ChartWizard. Создав пустую диаграмму (как описано выше в этом уроке), вы можете вызвать метод ChartWizard и использовать его для определения данных, на основании которых должна строиться диаграмма, типа диаграммы, а также некоторых других аспектов отображения ее на экране. Иногда это выполнить проще, чем поочередно изменять значения отдельных свойств объекта Chart. Метод ChartWizard имеет следующий синтаксис: SomeChart.ChartWizard(Source, Gallery, Format, PlotBy, CategoryLa- bels, SeriesLabels, HasLegend, Title, CategoryTitle, ValueTitle) • Source — объект Range, ссылающийся на диапазон данных, на основании которых строится диаграмма. • Gallery — константа xlChartType, определяющая тип диаграммы: xlArea, xlBar, xlColunm, xlLine, xlPie, xlRadar, xlXYScatter, xlCombination, xl3DArea, xlSDBar, xl3DColumn, xlSDLine, xlSDPie, xl3DSurf ace, xlDoughnut или xlDef aultAutoFormat. • Format — числовое значение от 1 до л, определяющее встроенный автоформат, или подтип диаграммы. Количество доступных автоформатов, а следовательно, и максимально возможное значение п зависят от аргумента галерея. 238 Часть IV. Суббота. Вечер
PlotBy— константа, определяющая способ расположения рядов данных: в строках (xlRows, по умолчанию) или в столбцах (х1 Columns). В листингах программ этого урока настоящее свойство определялось под именем PlotBy. CategoryLabels — количество столбцов (если PlotBy — xlRows) или количество строк (если PlotBy = х1 Columns), содержащих метки категорий. SeriesLabels — количество строк (если PlotBy = xlRows) или количество столбцов (если PlotBy = х1 Columns), содержащих метки рядов данных. HasLegend — при выборе значения True на диаграмме отображается легенда; в противном случае (значение False) легенда не отображается. По умолчанию используется значение True. Title — текст названия диаграммы. Аргумент не обязателен; по умолчанию диаграмма не имеет названия. CategoryTitie — текст заголовка оси категорий. Аргумент не обязателен; по умолчанию ось категорий не имеет заголовка. ValueTitle — текст заголовка оси значений. Аргумент не обязателен; по умолчанию ось значений не имеет заголовка. о Обзор Вы закончили первый из двух уроков, посвященных созданию диаграмм Excel Готово! ^ ПОМОЩЬЮ ЯЗЫКа VBA. • Диаграмма Excel может находиться на отдельном листе диаграмм или быть встроенной в обычный рабочий лист. • Исходные данные, на основании которых строится диаграмма, организованы в ряды данных и категории. • В Excel поддерживаются диаграммы различных типов. • Для диаграммы можно отобразить название, а также заголовки ее осей. • Шрифт всех текстовых элементов диаграммы можно изменять. • Один вызов метода ChartWizard объединяет несколько действий по созданию диаграммы. Проверьте себя 1. Сколько отдельных диаграмм может быть расположено на листе диаграмм? (См. раздел "Встроенные диаграммы и листы диаграмм".) 2. Что происходит, если встроенная диаграмма закрывает собой данные на рабочем листе? (См. подраздел "Встроенные диаграммы".) 3. Какой текст отображается по умолчанию в качестве названия диаграммы Excel? (См. подраздел "Отображение названия диаграммы".) 4. Какие значения откладывается по горизонтальной оси большинства диаграмм Excel — рядов данных или категорий? (См. раздел "Объект Chart".) 5. Какое свойство используется для изменения шрифта названия диаграммы? (См. раздел "Выбор шрифтов для диаграммы".) Урок 17. Основы построения диаграмм 239
о УРОК Профессиональные средства построения диаграмм Содержание урока ^ Названия и ссылки на диаграммы V Предотвращение изменений диаграммы пользователем с помощью блокирования диаграмм ^ Работа с объектом ChartOb j ect ^ Использование точечных диаграмм ^ Вывод диаграмм на печать В предыдущем уроке вы познакомились с диаграммами Excel, а также изучили основные средства языка VBA, предназначенные для построения и редактирования этих диаграмм. В настоящем уроке рассматриваются более сложные приемы Осталось 30 минут программирования. Названия диаграмм Листам диаграмм в момент их создания автоматически присваиваются названия Chart 1, Chart2 и т.д. Точно так же автоматически присваиваются названия и встроенным диаграммам, однако эти названия формируются несколько сложнее. Отличия встроенных диаграмм от листов диаграмм были описаны в уроке 17.
• Объектам ChartObject присваиваются имена Chart 1, Chart 2 и т.д. Обратите внимание на наличие пробела перед порядковым номером. • Объекту Chart присваивается имя, состоящее из имени рабочего листа, на котором расположена соответствующая диаграмма, и имени объекта ChartObj ect, в котором он содержится (например, Sheetl Chart 13). Вы можете переименовать объект ChartObject, присвоив его свойству Name новое имя. Объект Chart, представляющий встроенную диаграмму, переименовать нельзя, хотя в документации Microsoft утверждается обратное. Данный факт не вызывает особых проблем, поскольку к встроенным диаграммам обращаются посредством свойства ChartObject .Name, а не Chart. Name. Если впоследствии вам понадобится обращаться к диаграмме в кодах программы, присвойте свойству ChartObject .Name какое-нибудь информативное имя. Чтобы обратиться к уже созданному листу диаграмм, используйте свойство Charts объекта Workbook. Это свойство возвращает коллекцию, содержащую все листы диаграмм данной рабочей книги. К отдельному листу диаграмм можно обратиться по его позиции в коллекции. Однако такая возможность вряд ли будет для вас полезной, поскольку вы можете и не знать, какую именно позицию в коллекции занимает требуемая диаграмма. Поэтому лучше ссылаться на диаграмму по названию листа диаграмм: Charts{ИмяДиаграммы) При попытке обратиться к несуществующему элементу коллекции возникает ошибка. Например, в результате выполнения приведенного ниже кода указанный лист диаграмм выводится на печать: Charts("Суммы продаж").Printout Чтобы получить доступ к конкретной встроенной диаграмме, к ней необходимо обратиться через объект ChartObject, принадлежащий коллекции ChartObject s данного рабочего листа. В следующей строкой удаляется указанный объект ChartOb j ect рабочего листа Лист1 (как и соответствующая диаграмма): Worksheets("Лист1").ChartObjacts("Итоги").Delete Непосредственно обратиться ко всем встроенным диаграммам рабочей книги невозможно — необходимо по отдельности обращаться к каждой отдельной встроенной диаграмме рабочего листа. Пример такого обращения будет представлен позднее в этом уроке в листинге 18.3. Блокирование диаграмм По умолчанию Excel позволяет изменять диаграмму пользователям, однако в некоторых ситуациях необходимо исключить такую возможность. Диаграмму можно заблокировать (другими словами, защитить), в результате чего конечный пользователь сможет ее лишь просматривать и выводить на печать, но при этом он будет лишен возможности вносить свои изменения. Чтобы заблокировать диаграмму, вызовите метод Protect объекта Chart: SomeChart.Protect{password) Здесь password — это необязательный аргумент, который определяет чувствительный к регистру пароль, позволяющий снимать защиту диаграммы. Если аргумент password не указан, пользователь (или какая-нибудь программа) может снять защи- 242 Часть IV. Суббота. Вечер
ту с листа, а затем свободно изменить саму диаграмму. Если же этот аргумент указан, то для снятия защиты необходимо ввести пароль посредством метода Unprotect: SomeChart.UnProtect{password) Аргумент password обязателен только в том случае, если диаграмма защищена с помощью пароля. Более детально о безопасности рабочего листа и защите данных будет рассказано в уроке 24. Не потеряйте пароль, используемый для защиты диаграммы. Без него снять защиту вы не сможете. Осталось 20 минут Объект ChartObject Как уже отмечалось в этом уроке, информация о встроенных диаграммах содержится в объектах ChartObject. Соответствующий диаграмме объект Chart- Object отвечает за определенные аспекты отображения этой диаграммы, от нее самой не зависящие (например, за расположение диаграммы на рабочем листе и за ее размеры). Свойства и методы объектов ChartObject описаны в табл. 18.1 и 18.2. Код программы, в которой используются некоторые свойства и методы, приведен в листинге 18.1. Таблица 18.1. Свойства объекта ChartObject Свойство Описание BottomRightCell Chart Height Left Placement PrintObject Top TopLeftCell Visible Width Возвращает объект Range, который ссылается на ячейку рабочего листа под нижним правым углом диаграммы. Свойство доступно только для чтения Возвращает ссылку на диаграмму, информация о которой содержится в данном объекте Высота диаграммы в пунктах Позиция левого края диаграммы по отношению к левому краю рабочего листа (в пунктах) Определяет, каким образом соответствующая диаграмма связана с ячейками рабочего листа, расположенными под ней. Свойство может принимать значения xlMoveAndSize (перемещение и изменение размера), xlMove (перемещение) и xlFreeFloating (диаграмма не привязана к ячейкам под ней) Если свойство имеет значение True (по умолчанию), диаграмма распечатывается при выводе на печать рабочего листа. Если False, диаграмма не распечатывается Позиция верхнего края диаграммы относительно верхнего края рабочего листа (в пунктах) Возвращает объект Range, который ссылается на ячейку рабочего листа под верхним левым углом диаграммы. Свойство доступно только для чтения Значение True/False, определяющее, отображается ли диаграмма на экране Ширина диаграммы в пунктах Урок 18. Профессиональные средства построения диаграмм 243
Таблица 18.2. Методы объекта ChartObject Метод ? Описание BringToFront Отображает диаграмму поверх остальных диаграмм, которыми она может перекрываться (если таковые имеются) Сору Копирует объект ChartOb j ect в буфер CopyPicture Копирует изображение диаграммы в буфер Cut Вырезает объект ChartOb j ect в буфер Delete Удаляет объект ChartOb j ect SendToBack Располагает диаграмму ниже остальных диаграмм, которыми она может перекрываться (если таковые имеются) Значение свойства Placement играет важную роль в тех случаях, когда в диапазон, занимаемый встроенной диаграммой, добавляются (или удаляются) ячейки. Предположим, что диаграмма занимает область, начиная со столбца В и заканчивая столбцом F, и в этот диапазон вставляют два новых столбца. Полученный результат будет зависеть от значения свойства Placement: • xlMoveAndSize. Размер и положение диаграммы изменяется с учетом добавляемых (диаграмма смещается и увеличивается в размерах) или удаляемых (диаграмма уменьшается в размерах) строк и столбцов. • xlMove. Положение диаграммы изменяется с учетом добавляемых или удаляемых строк и столбцов, однако ее размеры остаются прежними. • х1 Free Floating. Ни размер, ни положение диаграммы не меняются. В листинге 18.1 представлен код программы, на примере которой демонстрируется использование некоторых свойств и методов объекта ChartObject. Эта программа проходит по всем рабочим листам текущей рабочей книги. Все встроенные диаграммы копируются на новый лист. Название нового листа, а также размер копируемых диаграмм, указываются в виде аргументов процедуры. При этом программа выполняет описанную ниже последовательность действий. 1. Метод Worksheets .Add используется для добавления в рабочую книгу нового листа. 2. Свойству Name нового рабочего листа присваивается значение. 3. Выполняется цикл для коллекции Worksheets рабочей книги. 4. Оценивается значение свойства Name каждого рабочего листа — в результате отпадает необходимость обрабатывать добавляемый рабочий лист. 5. Выполняется цикл для коллекции ChartOb j ects каждого рабочего листа. 6. Используется метод Сору для копирования каждого объекта ChartOb j ect в буфер. 7. Метод Worksheet. Paste применяется для вставки скопированного объекта ChartOb j ect на новый рабочий лист. Листинг 18.1. Программа, копирующая встроенные диаграммы рабочей книги на новый лист Public Sub CopyEmbeddedChartsToNewSheet(name As String, __ width As Integer, height As Integer) • Копирует все встроенные диаграммы текущей рабочей книги ' на новый рабочий лист с указанным названием. При вставке диаграммы 244 Часть IV. Суббота. Вечер
• приобретают заданную ширину и высоту и располагаются в один ' столбец ' ' Расстояние между диаграммами по вертикали Const SPACE_BETWEEN__CHARTS = 20 Dim newWS As Worksheet Dim oldWS As Worksheet Dim CO As ChartObject Dim yPos As Integer Dim count As Integer • Отключение возможности обновления экрана ~ в результате ' при копировании ' диаграмм экран не будет мигать Application.ScreenUpdating = False ' Добавление нового рабочего листа и определение его названия Set newWS = Worksheets.Add newWS.name = name For Each oldWS In Worksheets ' He копировать диаграммы из нового листа If oldWS.name о name Then ' Цикл по всем объектам ChartObject ' данного рабочего листа For Each со In oldWS.ChartObjects ' Копирование диаграммы в буфер со.Сору newWS.Range("Al").Select ' Вставка диаграммы на новый лист newWS.Paste Next End If Next ' Изменение позиции и размера диаграмм count = О For Each со In newWS.ChartObjects CO.width = width CO.height = height ' Расстояние от левого края листа со.Left = 30 со.Тор = count * (height + SPACE_BETWEEN__CHARTS) + S PACE_BETWEEN__CHARTS count = count + 1 Next ' Включение возможности обновления экрана Application.ScreenUpdating = True End Sub Public Sub TestCopyEmbeddedCharts0 CopyEmbeddedChartsToNewSheet "Bee диаграммы", 240, 140 End Sub Урок 18. Профессиональные средства построения диаграмм 245
Обратите внимание, что программа присваивает свойству ScreenUpdating значение False, и это позволяет избежать мерцания изображения на экране при копировании и изменении размеров диаграмм. Разумеется, после выполнения всех требуемых действий этому свойству необходимо вновь присвоить значение True, чтобы все внесенные изменения были отображены на экране. Возможно, вам не совсем понятно, для чего программа выделяет ячейку А1 нового рабочего листа перед каждой операцией вставки. Дело в том, что при вставке на рабочий лист диаграмма выделяется. Если после этого попытаться вставить в этот же лист другую диаграмму. Excel может предположить, что вы хотите вставить ее в выделенную диаграмму. В результате программа выдаст ошибку. Выделение ячейки рабочего листа говорит о том, что диаграмма должна быть скопирована на рабочий лист, благодаря чему ошибка не возникнет. Поскольку процедура CopyEmbeddedChartsToNewSheet требует для себя значения аргументов, вы не можете запустить ее непосредственно, поэтому вам придется вызвать ее из другой процедуры. В листинг 18.1 включена такая тестовая процедура, TestCopyEmbeddedCharts. Возможно, вы захотите изменить аргументы вызова процедуры. Из листинга 18.1 видно, что в результате ее вызова новый рабочий лист получает название "Все диаграммы", а размер вставляемых диаграмм устанавливается равным 240x140 пунктов. При запуске данной программы на выполнение учтите следующие рекомендации. 1. В редакторе VBA наберите в теле модуля код, представленный в листинге 18.1. > 2. Если необходимо, измените передаваемые процедуре TestCopyEmbeddedCharts значения аргументов. 3. Откройте или создайте рабочую книгу, содержащую несколько встроенных диаграмм (желательно, расположенных на отдельных рабочих листах). 4. Нажмите клавиши <Alt+F8>, чтобы открыть диалоговое окно Макросы. 5. Выберите макрос TestCopyEmbeddedCharts и щелкните на кнопке Выполнить. На рис. 18.1 показан пример рабочего листа, созданного этой программой, на котором вы можете увидеть несколько скопированных диаграмм. Использование точечных диаграмм Точечная диаграмма (иногда называемая диаграммой XY) существенно отличается от диаграмм Excel других типов. В большинстве диаграмм по одной оси откладываются значения, по другой — категории. Например, если вы вернетесь к рис. 17.7 предыдущего урока, то увидите, что Суммы продаж — это значения, откладываемые по вертикальной оси, а Период — это категории, отображаемые по горизонтальной оси. В точечных диаграммах используется другой принцип: на двух осях, вертикальной и горизонтальной, откладываются значения. Существуют и другие типы данных, для отображения которых предпочтительнее использовать именно точечную диаграмму. Приведем некоторые примеры: • отображение зависимости средней годовой зарплаты от стажа работы; • построение графика зависимости роста и веса для определения типа диеты; • анализ зависимости количества проданных компьютеров от мощности установленных на них процессоров. 246 Часть IV. Суббота. Вечер
|«111ШИНН F27 :w ^:,-:г; ^- ^ 1- щ Ш mi :18 :кД"^:^рав-::':гДу,:-^о- D: ;^!ii:;^;;:.fefivif Продажи по регионам щ Готово \ ^ЖЖ|5^1б1Ш^| : Щ\ щ ^^- Ш- ш Рис. 18.1. Рабочий лист, содержащий несколько диаграмм, создан в результате выполнения программы, код которой представлен в листинге 18.1 Каждой точке в точечной диаграмме соответствуют значения по осям X и Y. Значение X определяет горизонтальную позицию, а значение Y — вертикальную. В примере, показанном на рис. 18.2, точке данных соответствует значение X, равное числу 2, и значение Y, равное числу 3. х = 2 А у = 3 + Рис. 18.2. Позиция точки данных на точечной диаграмме зависит от ее значений XuY Урок 18. Профессиональные средства построения диаграмм 247
Данные для точечной диаграммы организованы таким же образом, как и данные, на основании которых строятся диаграммы других типов. Единственное отличие состоит в том, что метки категорий заменяются значениями X. На рис. 18.3 показаны данные рабочего листа, организованные для вывода на точечную диаграмму. Первый столбец содержит значения X. Два других столбца содержат значения Y для двух рядов данных. @ Файл Правка Вид Вставка Фо|Р%зат С^жис К Q»<o QipasK^...-• ••••.'^•'- Дэнные -, •••. в ' О cs^ в аl^iatai^^ j^ ^ ^1 ^ Ч% 2: ^МШШ :vTi. |[ G15 ^ ^ 1 1 ^ Гд О] 1 ^ 7 10 11 12 и < 1 Гото А 1 . в 1 с . 1 D 1 ;- Е- Продажа компьютеров 2001 2002 S. 1,00 133 42 § 1,20 190 56 1 1,60 244 89 g- 1,80 178 168 iS 2,00 123 170 S 2,40 125 211 Т 2,80 90 159 ■■ i ► ►|[\Лист1/Лисг2/ЛистЗ,|4| во ; ••• .•.::•• ... . •:• • mm :.:-|.'.,Р 1 А ^ X. 1 ^щ ^ ^11 Рис. 18.3. Данные, организованные для вывода на точечную диаграмму Способ создания точечных диаграмм в программе VBA ничем не отличается от способов создания диаграмм других типов. Вам необходимо определить исходный диапазон данных и тип диаграммы; после этого можно применить форматирование, например, определить название диаграммы и заголовки осей (как было показано в уроке 17). В листинге 18.2 представлен код программы VBA, которая используется для создания встроенной точечной диаграммы на основании данных, показанных на рис. 18.3. Полученная в результате диаграмма изображена на рис. 18.4. Листинг 18.2. Программа, которая создает точечную диаграмму на основании данных, показанных на рис. 18.3 Public Sub CreateScatterChartО Dim со As ChartObject Dim ch As Chart Set CO = Worksheets("ЛИСТ1").ChartObjects.Add(50, 200, 250, 165) Set ch = CO.Chart ch.SetSourceData Source:=Worksheets("Лист1").Range("B3:DIO"),_ 248 Часть IV. Суббота. Вечер
PlotBy:=xlColumns ch.ChartType = xlXYScatterLines ' Добавление названия диаграммы ch.HasTitle = True ch.ChartTitle.Text = Worksheets("Лист1").Range("Al").Value • Добавление заголовка оси категорий With ch.Axes(xlCategory) .HasTitle = True .AxisTitle.Text = "Частота процессора(ГГц)" End With ' Добавление заголовка оси значений With ch.Axes(xlValue) .HasTitle = True .AxisTitle.Text = "Объем продаж" End With End Sub Продажа компьютеров -2001 -2002 0,00 1,00 2,00 3,00 Частота процессора (ГГц) Рис. 18.4. Точечная диаграмма была создана в результате выполнения программы, код которой показан в листинге 18.2 Осталось 10 минут Типы точечных диаграмм Точечная диаграмма, показанная на рис. 18.4, отображает каждую точку данных в виде символа (или маркера) и соединяет точки данных каждого ряда прямыми отрезками. Excel поддерживает несколько типов точечных диаграмм. Соответствующие константы ChartType и их описания представлены в табл. 18.3. Чтобы просмотреть различные типы точечных диаграмм, подставьте соответствующие константы в код программы, представленный в листинге 18.2. Таблица 18.3. Константы для различных типов точечных диаграмм Константна ChartType Описание xlXYScatter XlXYScatterLines XlXYScatterLinesNoMarkers Точки данных в виде маркеров, которые не соединяются прямыми отрезками Точки данных в виде маркеров, соединенные прямыми отрезками Точки данных без маркеров, соединенные прямыми отрезками Урок 18. Профессиональные средства построения диаграмм 249
Окончание табл. 18.3 Константа ChartType Описание XlXYScatterSmooth Точки данных в виде маркеров, соединенные сглаженными линиями xlXYScatterSmoothNoMarkers Точки данных без маркеров, соединенные сглаженными линиями Изменение диапазона осей Если вы внимательно посмотрите на диаграмму, представленную на рис. 18.4, то обратите внимание, что масштаб оси X (горизонтальной) выбран не совсем правильно. Диапазон значений оси — от О до 3, тогда как данные находятся в диапазоне от 1 до 3. В результате треть области диаграммы оказывается пустой и не используется по назначению. Это объясняется следующим: если все исходные данные положительны, то по умолчанию по оси откладываются координаты, начинающиеся с нулевого и заканчивающиеся максимальным значением. Вы можете изменить масштаб оси (вертикальной или горизонтальной), чтобы данные отображались правильно. Более детально о настройке параметров отдельных осей диаграммы было рассказано в уроке 17. Максимальное и минимальное значения осей заданы свойствами Maximum- Scale и MinimumScale объекта Axis. Например, чтобы установить значения для вертикальной оси диаграммы, используйте следующий код: With SomeChart.Axes("х1Value") .MinimumScale = 5 .MaximumScale =20 End With В коде программы, показанном в листинге 18.2, необходимо лишь сделать минимальное значение горизонтальной оси равным единице (максимальное значение оси Excel определит автоматически). Для этого требуется добавить такую строку кода: Ch.Axes(xlCategory).MinimumScale = 1 Эту строку кода необходимо вставить в программу сразу после строки, определяющей значение свойства ChartType. Полученная в результате диаграмма будет выглядеть значительно лучше (рис. 18.5). Продажа компьютеров -2001 -2002 1,00 2,00 3,00 Частота процессора (ГГц) Рис. 18.5. Новая диаграмма с измененным диапазоном горизонтальной оси 250 Часть IV. Суббота. Вечер
Несмотря на то, что горизонтальная ось в точечной диаграмме на самом деле не является осью категорий, ей все равно соответствует константа х1 Category. Будьте внимательны, изменяя диапазон оси вручную. Если минимальное значение будет установлено слишком большим или максимальное — слишком маленьким, некоторые данные могут не отображаться на диаграмме. Вывод диаграмм на печать Для вывода на печать диаграмм Excel, а также рабочих листов и книг, используется метод Printout. Вызовите метод Printout соответствуюп^его объекта, чтобы вывести на печать требуемую диаграмму (диаграммы). Обобщенные сведения по использованию метода Printout представлены в табл. 18.4. Таблица 18.4. Применение метода Printout для вывода диаграмм на печать Чтобы вывести на печать Необходимо вызвать Одну встроенную диаграмму или лист диа- Метод Printout соответствующего грамм объекта Chart Все встроенные диаграммы рабочего листа Метод Printout объекта Worksheet (вместе со всеми остальными данными, расположенными на этом листе) Все встроенные диаграммы активного рабо- Метод Printout объекта ActiveSheet чего листа (вместе со всеми остальным данными, расположенными на этом листе) Все листы диаграмм рабочей книги Метод Printout коллекции Charts рабочей книги Дополнительные сведения по использованию метода Printout представлены в уроке 3. Вероятно, вы обратили внимание на то, что невозможно вывести на печать все встроенные диаграммы рабочего листа, не распечатав при этом остальные данные, расположенные на этом же листе. Такое ограничение можно обойти с помощью короткой программы VBA, код которой показан в листинге 18.3. Настоящая процедура имеет один аргумент: ссылку на рабочий лист. В процессе своего выполнения она осуществляет цикл по коллекции ChartObjects данного рабочего листа и вызывает метод Printout для каждой встроенной диаграммы. Если этот рабочий лист не содержит встроенных диаграмм, ничего не происходит. Листинг 18.3. Вывод на печать всех встроенных диаграмм рабочего листа Public Sub PrintAllEmbeddedChartsOnSheet(ws As Worksheet) ' Выводит на печать все встроенные диаграммы указанного ' рабочего листа Dim со As ChartObject For Each со In ws.ChartObjects CO.Chart.Printout Next Урок 18. Профессиональные средства построения диаграмм 251
End Sub Public Sub TestPrintAllChartsO PrintAllEmbeddedChartsOnSheet ActiveSheet End Sub При выводе на печать содержимого рабочего листа необходимо помнить, что свойство PrintObject объекта ChartObject определяет, распечатываются ли вместе с другими данными встроенные диаграммы. Чтобы проверить, как работает эта процедура, необходимо создать еще одну процедуру, которая будет содержать строку кода, вызывающую основную процедуру и передающую ей ссылку на требуемый рабочий лист. Подобная тестовая процедура также включена в листинг 18.3. Благодаря ей на печать выводятся все листы активной рабочей книги. Если отдельные встроенные диаграммы выводятся на печать с помощью параметров, заданных по умолчанию, их размер автоматически изменяется таким образом, чтобы они заполняли собой всю страницу (независимо от исходных размеров этих диаграмм на рабочем листе). Обзор В Excel реализованы мощные возможности построения диаграмм, которые мож- Готошо! JJQ использовать при написании программ VBA. • Если вы присвоите название диаграмме, то впоследствии сможете обращаться к ней по этому названию. • Защитив или заблокировав диаграмму, можно исключить внесение в нее нежелательных изменений конечным пользователем. • Объект ChartObject используется для управления отдельными параметрами встроенных диаграмм, в том числе их размером и расположением. • Точечная диаграмма специально предназначена для вывода графиков со значениями по обеим осям. • Метод Printout используется для вывода диаграмм на печать. Проверьте себя 1. Каким образом в Excel генерируются используемые по умолчанию названия объектов Chart? (См. раздел "Названия диаграмм".) 2. Предположим, что, работая с защищенной диаграммой, вы забыли или потеряли ее пароль. Что можно предпринять в такой ситуации, если необходимо изменить диаграмму? (См. раздел "Блокирование диаграмм".) 3. Как определяется диапазон ячеек рабочего листа, над которым должна отображаться встроенная диаграмма? (См. раздел "Объект ChartObject".) 4. В названии некоторых типов точечных диаграмм присутствует слово "сглаженный" (smoothed). Что это означает? (См. подраздел "Типы точечных диаграмм".) 5. Существует ли возможность непосредственного обращения сразу ко всем встроенным диаграммам рабочей книги? (См. раздел "Названия диаграмм".) 252 Часть IV. Суббота. Вечер
УРОК Использование экранных форм для создания пользовательских диалоговых окон Содержание урока ^ Знакомство с формами ^ Добавление экранных форм в создаваемый проект ^ Дизайн экранных форм ^ Свойства и методы экранных форм ^ Отображение и скрытие форм ^ Пример создания экранной формы Программист Excel имеет возможность создавать пользовательские диалоговые окна для своих приложений VBA. Эти диалоговые окна, называемые экранными формами (user form), могут включать любые элементы, которые Осталось g. т^ , 30минут обычно встречаются В диалоговых окнах программы Excel и других приложений Windows. Экранные формы представляют собой очень мощный инструмент программирования, поскольку позволяют создать для приложений Excel визуальный пользовательский интерфейс любого требуемого вида. Данный урок и следующие три посвящены изучению приемов создания и использования экранных форм.
Знакомство с экранными формами Экранная форма состоит из трех непосредственно связанных друг с другом компонентов. • Форма как таковая представляет собой окно со строкой заголовка и другими компонентами, типичными для других окон операционной системы Windows. Эта форма представлена объектом UserForm. • Элементы управления, размещенные в окне формы, составляют ее визуальный и функциональный интерфейс. Каждый тип элементов управления представлен своим собственным классом. • Программа VBA является частью экранной формы. Экранная форма не обязательно должна содержать программу, однако в большинстве случаев формы снабжаются своими программами. Ограничения, которыми характеризуются экранные формы Экранная форма является обычным окном, однако для нее не предусмотрены некоторые характеристики, которые могут иметь окна многих программ. В частности: • пользователь не может вручную изменить размер формы (хотя это может быть сделано в программе VBA); • в окне формы отсутствуют кнопки Свернуть/Развернуть; • формы не имеют меню управления. Однако пользователь может переместить форму по экрану, перетащив строку заголовка. Объект UserForm, как и все размещенные в окне формы элементы управления, обладает свойствами и методами, определяющими их внешний вид и функциональные характеристики. Многие объекты могут также реагировать на события, а в большинстве случаев — на действия пользователя (например, на щелчок кнопкой мыши). Одновременно используя все эти элементы — свойства, методы и события — в программе VBA можно определить внешний вид и функциональные возможности экранной формы, которые будут точно соответствовать требованиями создаваемого приложения. Создать экранную форму в редакторе VBA несложно. Редактор форм позволяет проектировать форму визуально, по принципу WYSIWYG (What You See Is What You Get — что видишь, то и получаешь). Детально все эти вопросы рассмотрены в настоящем и двух последующих уроках. Основные характеристики редактора экранных форм Чтобы добавить новую экранную форму в проект Excel, сначала убедитесь, что в окне Project (Проект) выбран требуемый проект. В меню редактора VBA выполните команду lnsert=>User Form (Вставить'=>Экранную форму). В окне редактора будет открыта новая пустая экранная форма. Этот и другие компоненты среды создания экранных форм показаны на рис. 19.1, а ниже представлено их краткое описание. • Экранная форма (на рисунке пустая) — это место для размещения элементов управления, формирующих визуальный интерфейс. 254 Часть IV. Суббота. Вечер
Панель инструментов (Toolbox) — отображается при условии, что экранная форма активна. Содержит пиктограммы различных элементов управления, которые могут быть размещены в окне формы, а также кнопку со стрелкой, щелчок на которой позволяет выбирать для редактирования уже добавленные в окно формы элементы управления. Окно Properties (Свойства) — в нем отображаются свойства выделенного в данный момент объекта. Это может быть сама экранная форма либо расположенные на ней элементы управления. Окно Project (Проект) — в папке Forms (Формы) отображается список всех форм, созданных для данного проекта. Кнопки View Code (Показать код) и View Object (Показать объект) позволяют переходить от просмотра визуального интерфейса экранной формы кокну редактирования, где представлены соответствующие этой форме коды VBA. Окно Properties Панель инструментов Рис, 19Л, Элементы редактора экранных форм Проект VBA может содержать любое необходимое количество экранных форм, однако при условии, что они имеют уникальные названия. Урок 19. Использование экранных форм для создания... 255
Проектирование пользовательского интерфейса Прежде чем переходить к проектированию экранной формы, рекомендуем разобраться с тем, как должны функционировать имеющиеся на ней элементы управления и как она должна быть представлена на экране. О редактировании элементов управления рассказывается далее в этом уроке. В данный момент мы ознакомимся с основными принципами проектирования экранных форм. • Чтобы разместить в окне формы элемент управления, щелкните на его значке в панели инструментов, а затем перетащите этот значок на саму форму. • Чтобы выделить уже добавленный к форме элемент управления, щелкните на нем мышью. Вокруг выделенного элемента управления будет отображена рамка серого цвета с восемью белыми маркерами (рис. 19.2). Чтобы иметь возможность работать с уже добавленными к форме элементами управления, убедитесь, что на панели инструментов выделен значок стрелки. В этом режиме курсор мыши отображается в виде стрелки. Рис. 192. Вокруг выделенного элемента управления отображаются рамка и маркеры Чтобы изменить размер элемента управления, выделите его; перетаскивайте один из маркеров до тех пор, пока на получите рамку требуемых размеров. Вы сможете переместить элемент управления, если выделите его, расположите курсор над рамкой и перетащите ее на новое место. Чтобы удалить элемент управления, выделите его и нажмите клавишу <Delete>. Выделить форму несложно: щелкните на ее строке заголовка или в любом другом месте, где нет элементов управления. Чтобы изменить размер формы, выделите ее и перетащите один из ее маркеров. Чтобы определить, какой элемент управления соответствует тому или иному значку на панели инструментов, расположите курсор мыши над этим значком — через несколько мгновений рядом будет отображена экранная подсказка с названием этого элемента управления. 256 Часть IV. Суббота. Вечер
Положение формы на экране определяется не средствами перетаскивания, а с помощью указания значений свойств Тор и Left или свойства Start- UpPosition. Более детально вопросы разработки интерфейса экранных форм рассмотрены в уроках 20 и 21. Настройка свойств Если редактор экранных форм открыт и при этом выделен определенный объект (форма или элемент управления), в окне Properties отображается перечень свойств, соответствующих этому объекту. Окно Properties состоит из трех частей. • В раскрывающемся списке, расположенном в верхней части окна, представлен объектный тип, а также название выделенного объекта (оно выделено жирным шрифтом). Вы можете выбрать в этом списке другой объект. • На вкладке Alphabetic в алфавитном порядке перечислены все свойства выделенного объекта. • На вкладке Categorized перечислены все свойства, организованные по категориям — Appearance (Отображение), Data (Данные), Font (Шрифт) и т.д. Каждая вкладка состоит из двух столбцов. В левом столбце указано название свойства, тогда как в правом — его текущее значение. Чтобы изменить свойство, щелкните на его названии. Способ изменения значения зависит от особенностей самого свойства. • Для перечислимых свойств (которые могут принимать только одно из предустановленных значений) предусмотрен раскрывающийся список, отображаемый в правом столбце. Из него вы можете выбрать требуемое значение. • Для свойств True/False дважды щелкните мышью, чтобы перейти от значения True к значению False и наоборот. • Для свойства, принимающего текстовое или числовое значение, щелкните на правом столбце и введите новое значение или измените прежнее. • Для более сложных свойств в правом столбце отображается кнопка со значком в виде троеточия. Щелкните на этой кнопке, чтобы отобразить диалоговое окно данного свойства. Внесите необходимые изменения и закройте диалоговое окно, чтобы вернуться к окну Properties. Чтобы получить справку по определенному свойству, выберите это свойство в окне Property и нажмите клавишу <F1>. Свойства форм Каждая экранная форма имеет особый набор свойств, которые определяют %"минут ®® внешний ВИД И функциональные характеристики. Свойств форм насчитывается более тридцати, однако некоторые из них используются довольно редко. Помните, что значения всех свойств определяются в окне Properties. Их также можно прочитать и изменить в программе VBA (за исключением свойств, доступных только для чтения). Обращение к свойствам экранных форм выполняется таким же образом, как и к свойствам других объектов: ИмяФормы.ИмяСвойства.PropertyName Урок 19. Использование экранных форм для создания... 257
Каждой экранной форме в момент ее создания присваивается имя: UserForml, UserForm2 и т.д. Это имя (свойство Name) используется для обращения к форме в программе VBA. Рекомендуется сразу же после создания формы заменять назначаемое по умолчанию имя другим, более описательным, названием. Как правило, значения всех свойств экранной формы устанавливаются на этапе ее проектирования. Редактирование свойств формы в кодах программы обычно используется в целях изменения внешнего вида или поведения данной формы в ходе выполнения программы. Свойства, определяющие вид экранной формы Внешний вид экранной формы определяется перечисленными ниже свойствами. • BackColor. Фоновый цвет экранной формы. При его установке в окне Properties, выберите одно из доступных значений из набора предустановленных цветов. В программе данному свойству присваивается значение RGB, для этого используется функция RGB. • HordeгСоlor. Цвет границы формы (если она отображается). В программе этому свойству присваивается значение RGB. • BorderStyle. Стиль границы формы. Данному свойству может быть присвоено значение fmBorderStyleSingle (одинарная граница) или fmBor- derStyleNone (отсутствие границы). • Capt ion. Текст, который отображается в строке заголовка формы. • Font. Шрифт, используемый по умолчанию для отображаемой в окне формы текстовой информации. Более детально о работе со шрифтами рассказано в уроке 14. • ForeColor. Цвет, которым отображаются текстовые символы и который используется для рисования в окне форме. В программе этому свойству присваивается значение RGB. • SpecialEf f act. Это свойство управляет общим внешним видом содержимого формы. Возможные значения данного свойства перечислены в табл. 19.1. Таблица 19.1. Возможные значения свойства SpedalEffect объекта UserForm Константа Внешний вид содержимого формы fmSpecialEffectPlat Обычный fmSpecialEffectRaised Приподнятый fmSpecialEffectSunken Утопленный fmSpecialEffectEtched Граница с узором fmSpecialEff ectBumped Приподнятый — нижний и правый края, обычный — все остальные края Свойства, определяющие функциональность и расположение формы Перечисленные ниже свойства управляют функциональными особенностями, размером и расположением форм на экране. • Height. Высота формы в пунктах. 258 Часть IV. Суббота, вечер
• Left. Расстояние от левого края окна приложения до левого края формы, выраженное в пунктах. • ShowModal. Если этому свойству присвоено значение True (по умолчанию), пользователь должен закрыть форму, прежде чем он будет переходить к выполнению другого кода и использованию других частей приложения. Если же свойству присвоено значение False, пользователь может оставить эту форму отображаемой на экране и перейти к использованию других частей приложения (например, к другой форме). • StartUpPosition. Положение формы на экране при ее первом отображении. Возможные значения свойства показаны в табл. 19.2. • Тор. Расстояние от верхней части окна приложения до верхней части формы, выраженное в пунктах. • Width. Ширина формы в пунктах. Таблица 19.2. Возможные значения свойства StartUpPosition объекта UserForm Константа Действие Manual Позиция формы определяется свойствами Тор и Left CenterOwner Если открыто окно Excel, форма выравнивается по его центру. Если же окно Excel свернуто или закрыто, форма отображается по центру экрана CenterScreen Форма отображается по центру экрана WindowsDefault Форма располагается в верхней левой части экрана Обратите внимание, что свойства Тор и Left влияют на первоначальное положение формы только в том случае, когда для свойства StartUpPosition выбрано значение Manual. Если значения этих свойств изменяются уже после отображения формы на экране, ее положение изменяется соответствующим образом. Для свойства ShowModal обычно оставляют принятое по умолчанию значение True. Такая настройка подходит для большинства экранных форм, поскольку программа, как правило, не должна продолжать работу до закрытия формы (например, если форма используется для получения данных от пользователя). Однако иногда для этого свойства требуется установить значение False (например, когда форма создается для отображения инструкций по использованию программы, адресуемых пользователю). В таком случае желательно держать эту форму открытой, пока пользователь работает с другой формой. Методы форм Объект UserForm имеет несколько методов. Наиболее часто используемые методы описаны в табл. 19.3. Таблица 19.3. Некоторые методы объекта UserForm Метод Описание Hide Скрывает форму, если она отображена; ничего не выполняет в противном случае Move (Left, Top, Перемещает форму и изменяет ее размер согласно заданным ар- Width, Height) гументам. Аргументы не обязательны; значения незаданных аргументов не изменяются Урок 19. Использование экранных форм для создания... 259
Окончание табл. 19.3 Метод Описание Print Form Распечатывает форму на используемом по умолчанию принтере Show Отображает форму (предварительно запустив ее, если она еще не запущена) Вызов метода Move экранной формы равнозначен настройке ее свойств Тор, Left, Width и Height. Отображение, использование и скрытие форм Выполните перечисленные ниже действия, чтобы применить форму в приложении. Мы предполагаем, что дизайн формы уже завершен (или, как минимум, достаточно разработан для выполнения тестирования), свойству Name экранной формы присвоено значение MyUserForm. 1. Создайте экранную форму и объявите переменную, которая будет на нее ссылаться. * Dim frm As New MyUserForm 2. При необходимости используйте ссылку на форму для определения значений свойств как формы, так и размещенных на ней элементов управления. frm.BackColor = RGB(210, 210, 210) frm.TextBoxl.Value = "Какой-нибудь текст" 3. Отобразите форму на экране. frm.Show 4. На данном этапе пользователь может работать с формой: вводить данные, выбирать значения параметров и выполнять другие действия, предусмотренные ее дизайном. 5. По окончании работы пользователь выполняет определенное действие, которое позволяет закрыть форму. Обычно это щелчок на соответствующей кнопке формы. В кодах формы выполняется вызов метода Hide, который убирает ее с экрана. Me.Hide 6. Теперь программа может считывать информацию, сохраненную для элементов управления этой формы. Response = frm.TextBoxl.Value 7. Если вы не планируете использовать форму в дальнейшем, освободите выделенную для нее память, присвоив ссылке на эту форму значение Nothing. Set frm = Nothing В кодах, являющихся частью формы, для обращения к самой форме применяется ключевое слово Me (см. п. 5). Поскольку ссылка на форму является неявно заданной в ее кодах, названия свойств и методов можно использовать и без определителя Me. Таким образом, в строке кода в п. 5 можно просто указать метод Hide. 260 Часть IV. Суббота. Вечер
Обратите внимание, что только строка кода, показанная для п. 5, является частью формы. Весь остальной код набран в программе, которая входит в состав модуля VBA. Пример экранной формы Представленная в этом разделе экранная форма может служить иллюстрацией при- ^1о"ттт менения тех стандартных процедур, которые предназначены для создания и использования форм в приложениях Excel. Эта форма не выполняет никаких полезных действий; примеры действительно функциональных форм представлены в уроке 21. Форма содержит такие элементы управления. • Текстовое поле, где пользователь может набирать информацию, возвращаемую в программу. • Кнопку, перемещающую форму в левую верхнюю часть экрана. • Кнопку закрытия формы. Первый этап заключается в проектировании формы. 1. В редакторе VBA выберите команду lnsert'=>User Form (Вставитьс>Экранную форму), чтобы создать для текущего проекта новую экранную форму. 2. В окне Properties свойству Name данной формы присвойте значение Test- Form, а свойству Caption — Демонстрационная форма. 3. Щелкните на форме, чтобы активизировать ее. После этого щелкните на значке Command Button (Командная кнопка) панели инструментов. 4. Расположите на форме командную кнопку, перетащив курсор над требуемой позицией. 5. В окне Properties присвойте свойству Name этой кнопки значение cmdMove, а свойству Caption — nepeMecTA-b. 6. Опять щелкните на форме и добавьте еще одну командную кнопку. Присвойте ее свойству Name значение cmdClose, а свойству Caption — Закрыть. 7. Снова вернитесь к форме и добавьте текстовое поле TextBox. Оставьте значения свойства для этого элемента управления принятыми по умолчанию. 8. Щелкните на кнопке Save панели инструментов, чтобы сохранить проект. На этом этап разработки дизайна формы можно считать завершенным, хотя к ней еще требуется добавить некоторые коды. Созданная форма должна выглядеть приблизительно так, как показано на рис. 19.3. Следующий этап заключается в написании для формы требуемых кодов. Эти коды помещаются в процедуры обработки событий и выполняются автоматически, когда пользователь предпринимает определенные действия (в данном случае щелкает на командных кнопках). Позднее вы ознакомитесь с событиями и процедурами их обработки более детально, а пока следуйте приведенным инструкциям, чтобы завершить этот демонстрационный проект. Выделив экранную форму, щелкните на кнопке View Code (Показать код) окна Project. В результате на экране появится окно редактирования кодов данной формы. Обратите внимание, что в верхней части окна расположено два раскрывающихся списка. Эти списки используются следующим образом. • В списке слева содержится перечень всех элементов управления, расположенных в окне формы, в том числе и название самой экранной формы Урок 19. Использование экранных форм для создания... 261
(рис. 19.4). Кроме того, в нем находится пункт (General). Чтобы перейти к редактированию кодов одного из элементов управления или самой формы, выберите требуемый пункт из этого списка. Рис, 19.3. Пример экранной формы (General) cmdClose JcmdMove [TexlBoxl jUserFonn _^j^ I {(Declarations) ""|Щ1Д/С| :з 2Ш Рис. 19.4. Выберите объект» код которого необходимо отредактировать просмотреть или • В списке справа содержится перечень всех процедур обработки событий, доступных для выбранного в левом списке элемента управления. Укажите требуемое событие, и редактор автоматически добавит шаблон, соответствующий процедуре обработки этого события. Выберите в списке пункт (Declarations), чтобы набрать/отредактировать код, не принадлежащий ни одной из процедур. Вы сможете добавить код события к создаваемому демонстрационному проекту, если выполните следующие действия. 1. В левом списке в окне редактирования выберите пункт cmdClose. 2. В списке справа автоматически будет выбрано событие Click (щелчок), поскольку именно оно наиболее часто используется для элемента управления Command Button. В окне появится шаблон процедуры этого события, как показано на рис. 19.5. 262 Часть IV. Суббота. Вечер
cmdCiose jdJCI'd' *а®х| ^. Private Sub cradClose Click() I End Sub ^1Ш Рис. 19.5. В окне редактирования автоматически добавляется шаблон процедуры выбранного события 3. В теле процедуры между открывающей и закрывающей строками наберите Me. Hide. 4. В левом списке выберите пункт cmdMove. 5. В теле процедуры события, соответствующего кнопке cmdMove, наберите строку кода Me. Move 10, 10. 6. Щелкните на кнопке Save, чтобы сохранить проект. На этом этап создания экранной формы можно считать завершенным. Следующий и последний шаги будут состоять в добавлении к проекту кодов, предназначенных для отображения формы на экране и извлечения вводимых в ней данных. 1. В окне Project дважды щелкните на названии программного модуля, чтобы его код отобразился в окне редактирования. 2. Выберите команду lnsert«=t>Procedure (ВставитьсяПроцедуру), чтобы отобразить диалоговое окно Add Procedure (Добавить процедуру). 3. В качестве названия процедуры наберите TestUserForm, после чего щелкните на кнопке ОК. В окне редактирования появится шаблон пустой процедуры. 4. Введите в теле процедуры код, представленный в листинге 19.1. Листинг 19.1. Процедура для отображения и тестирования созданной экранной формы Public Sub TestUserFormО Dim s As String Dim frm As New TestForm frm.Show s = frm.TextBoxl.Value MsgBox "Вы набрали " & s End Sub Урок 19. Использование экранных форм для создания... 263
Готово! Демонстрационная версия экранной формы теперь полностью готова. Вы можете протестировать ее, запустив процедуру TestUserForm. После запуска процедуры на экране отображается созданная форма. Если вы щелкнете на кнопке Move, форма переместится в верхний левый угол экрана. Щелкните на текстовом поле, чтобы сделать его активным, наберите в нем какой-нибудь текст, а затем щелкните на кнопке Close. Программа отобразит на экране окно с текстом, который вы набрали ранее в окне формы. Это и будет подтверждением того, как программа VBA считывает данные, введенные в поле экранной формы. Итак, мы рассмотрели простой пример экранной формы. В уроках 20 и 21 будет представлена дополнительная информация об экранных формах и приведены примеры их использования. В уроке 22 описываются настоящие работающие формы, способные решить реальные задачи. Обзор В этом уроке вы научились создавать экранные формы Excel и применять их в качестве пользовательских диалоговых окон. В частности, вы узнали, что: • экранная форма содержит те же элементы управления, которые используются во многих других приложениях Windows; • проект VBА может включать любое необходимое количество экранных форм; • формы и элементы управления обладают свойствами, определяющими их внешний вид и особенности функционирования; • в редакторе VBA предусмотрены инструменты визуального дизайна, они позволяют разрабатывать пользовательский интерфейс создаваемой экранной формы; • форма будет отображена на экране, если вызвать ее метод Show в программе VBA; • в кодах формы для обращения к самой форме можно использовать ключевое слово Me. Проверьте себя 1. Экранная форма состоит из трех основных компонентов. Первые два — это сама форма и расположенные на ней элементы управления. Назовите третий компонент экранной формы. (См. раздел "Знакомство с экранными формами".) 2. Какое свойство определяет содержание надписи, отображаемой в строке заголовка экранной формы? (См. подраздел "Свойства, определяющие вид экранной формы".) 3. Относительно какой точки определяется положение формы на экране? (См. подраздел "Свойства, определяющие функциональность и расположение формы".) 4. В чем состоит отличие модальной формы от немодальной? (См. раздел "Свойства, определяющие функции и расположение форм".) 5. Как освободить выделенную для формы память после завершения использования этой формы в программе? (См. раздел "Отображение, использование и скрытие форм".) 264 Часть IV. Суббота. Вечер
УРОК Элементы управления экранных форм Содержание урока ^ Обзор элементов управления ^ Общие свойства элементов управления ^ Более подробно об элементах управления Элементы управления — это основа любой экранной формы. Существует более десяти элементов управления, которые могут использоваться при создании форм. Они позволяют решать ряд задач отображения и ввода данных. В настоя- Осталось , 30 минут щем уроке описаны элементы управления экранных форм, рассмотрены их свойства, а также приведены примеры их использования. Перечень элементов управления Excel предоставляет 15 элементов управления, предназначенных для размещения в экранных формах. Каждый элемент служит для решения определенной задачи и обладает особым набором свойств, методов и событий. В табл. 20.1 представлен краткий обзор доступных элементов управления. В следующих подразделах настоящего урока некоторые из перечисленных в этом списке элементов управления рассматриваются более подробно. Элементы управления, которые не будут описаны в этом уроке, обозначены в таблице звездочкой — информацию по ним вы можете найти в справочной системе.
Таблица 20.1. Краткий обзор элементов управления экранных форм Excel Элемент управления Функция Checkbox (Флажок) СогаЬоВох (Комбинированный список) CommandButton (Командная кнопка) Frame (Панель) Image*(Рисунок) Label (Метка) ListBox* (Выпадающий список) MultiPage* (Вкладки) OptionButton (Переключатель) RefEdit (Выделение диапазона) ScrollBar* (Полоса прокрутки) SpinButton* (Полоса значений) TabStrip* (Вкладки) TextBox (Текстовое поле) ToggleButton (Кнопка-переключатель) Отображает параметр, который можно включить или отключить Сочетает функции текстового поля Text Box и выпадающего списка ListBox Отображает кнопку, щелчок на которой влечет за собой выполнение определенного действия Используется для группирования других элементов управления, например, переключателей OptionButton Отображает рисунок Отображает текст, недоступный для изменения пользователем Отображает список, пункты которого может выбирать пользователь Отображает корешки двух или более вкладок вдоль края формы, что позволяет пользователю переходить от одной вкладки ("страницы") к другой Подобен CheckBox, за исключением того, что в пределах одной группы может быть выбран только один переключатель (тогда как флажков может быть выбрано несколько). Чтобы создать группу переключателей, поместите в окне формы элемент управления Frame (панель), а затем разместите на этой панели элементы управления OptionButton Позволяет пользователю выбрать диапазон ячеек на рабочем листе Отображает вертикальную или горизонтальную полосу прокрутки в окне формы Полоса, щелчок на которой позволяет увеличить или уменьшить значение параметра Элемент выполняет практически ту же функцию, что и Mul - tiPage, но предоставляет больше возможностей, а потому он более сложен в использовании Отображает текст, доступный для редактирования пользователем Кнопка, имеющая два состояния: "нажатое" и "отжатое"; используется для выбора и отключения элементов Стандартные свойства элементов управления Каждый элемент управления экранной формы обладает собственным набором свойств, однако существует ряд свойств, общих для всех или для большинства элементов управления. Чтобы не повторять их описание для всех рассматриваемых в этом уроке элементов управления, в табл. 20.2 представлен их краткий обзор. Другие свойства отдельных элементов рассматриваются в следующих подразделах настоящего урока. 266 Часть IV. Суббота. Вечер
Таблица 20,2, Стандартные свойства элементов управления Свойство Описание BackColor Значение RGB, определяющее фоновый цвет элемента управления ControlTipText Текст, который отображается при наведении курсора на данный элемент управления; по умолчанию не задан Enabled Если свойство имеет значение True, элемент управления активен и пользователь может с ним взаимодействовать. Если же это свойство имеет значение False, элемент управления отображается в сером цвете и остается не доступным для пользователя Forit Отвечает за шрифт, используемый для отображения текста в элементе управления ForeColor Значение RGB, соответствующее основному цвету элемента управления Locked Если свойство имеет значение True, элемент управления не доступен для редактирования и изменения. По умолчанию для данного свойства выбрано значение False Visible Если свойство имеет значение True, элемент управления отображается; чтобы скрыть элемент, присвойте данному свойству значение False Детальное описание элементов управления В этом разделе представлена более подробная информация о назначении и об особенностях функционирования различных элементов управления. Элемент управления CheckBox Элемент управления CheckBox (Флажок) представляет параметр или значение, которое пользователь может включить или отключить, нажав кнопку мыши. Он выглядит как небольшое поле, рядом с которым отображается надпись. Содержание надписи определяется свойством Caption. Свойство Value возвращает значение True, если флажок в поле установлен, и False — если поле пустое. Чтобы изменить состояние данного элемента управления, присвойте в кодах программы свойству Value значение True или False. Элемент управления СотЬоВох Элемент управления ComboBox (Комбинированный список) сочетает в себе возможности текстового поля TextBox и выпадающего списка ListBox. Пользователь может выбрать любой текстовый элемент, отображаемый в списке, либо набрать собственное значение в поле для ввода данных. Для комбинированного списка может быть выбран один из двух режимов, который определяется свойством Style. Значения этого свойства описаны в табл. 20.3. Таблица 20,3, Значения свойства style элемента управления СотЬоВох Константа Описание f mStyleDropDownCombo Пользователь может выбрать элемент из списка или набрать собственное значение в поле для ввода данных. Этот режим используется по умолчанию FmStyleDropDownList Пользователь может выбрать только один из элементов, представленных в списке Урок 20. Элементы управления экранных форм 267
Чтобы добавить элемент в комбинированный список, воспользуйтесь методом Add It em. Этот метод имеет такой синтаксис: ComboBox.Addltem Элемент Например, следующим кодом в комбинированный список можно добавить четыре элемента: ComboBox.Addltem "West" ComboBox.Addltem "East" ComboBox.Addltem "North" ComboBox.Addltem "South" Элементы нельзя добавить в комбинированный список на этапе проектирования формы, эту задачу можно выполнить лишь в кодах программы. Код, добавляющий элементы в список, рекомендуем поместить в процедуре события Initialize экранной формы (данная процедура будет рассмотрена далее в этом разделе). Каждый элемент, добавленный в комбинированный список, получает числовой индекс. Первый добавленный элемент имеет индекс О, второй элемент — 1 и т. д. Когда пользователь выбирает элемент в комбинированном списке или набирает свой текст в поле для ввода данных, свойство Value элемента управления возвращает текстовое значение (или пустую строку, если ни один из элементов не был выбран). Значение, возвращаемое свойством List Index, определяется описанным ниже образом. • Если пользователь выбрал элемент из комбинированного списка, свойство возвращает номер индекса данного элемента. • Если пользователь не выбрал элемент или набрал свой текст в поле для ввода данных, свойство возвращает значение -1. По умолчанию элемент управления ComboBox при первом отображении формы на экране остается пустым — пользователь должен открыть список и выбрать какой-нибудь элемент либо ввести в поле свой текст. Если в поле комбинированного списка изначально должно отображаться определенное значение, необходимо выполнить одно из следующих действий. • Присвойте свойству List Index элемента управления значение, соответствующее индексу элемента, который был добавлен в список. • Присвойте свойству Value исходное текстовое значение. Например, с помощью показанного ниже кода в комбинированный список экранной формы можно добавить четыре элемента; изначально в поле списка отображается значение Red: ComboBoxl.Addltem "Blue" ComboBoxl.Addltem "Red" ComboBoxl.Addltem "Green" ComboBoxl.Addltem "Brown" ComboBoxl.LiStIndex = 1 Далее приведен пример использования комбинированного списка в программе VBA. Выполните перечисленные действия, чтобы создать программу и запустить ее на выполнение. 1. В редакторе VBA выберите команду lnsert'=t>User Form, чтобы добавить к проекту новую экранную форму. 2. Присвойте свойству Name созданной формы значение ComboBoxDemo, а свойству Caption — значение ComboBox Demo. 268 Часть IV. Суббота. Вечер
3. Добавьте на форму элемент управления ComboBox; оставьте без изменений значения, принятые по умолчанию для свойств данного элемента. 4. Добавьте на форму элемент управления CommandButton и присвойте его свойству Caption значение Close (Закрыть). 5. В окне Project щелкните на кнопке View Code, чтобы отобразить окно редактирования кодов для данной формы. 6. Из списка в левой верхней части окна редактирования выберите пункт CommandBu 11 on1. 7. Редактор кодов может автоматически ввести процедуру события Click (поскольку это событие, выбираемое для командной кнопки по умолчанию). Если процедура не будет добавлена автоматически, выберите Click из списка в правой верхней части окна редактирования. 8. В теле процедуры события С1 ick наберите одну строку кода: Me. Hide. 9. Из списка в левой верхней части окна редактирования выберите пункт Us - erForm. 10. Из списка в правой верхней части окна редактирования выберите пункт Initialize. 11. В теле процедуры события Initialize наберите код, приведенный в листинге 20.1. 12. Сохраните проект. Листинг 20,1. Код процедуры события Initializer соответствующего экранной форме Private Sub UserForm_Initialize() ComboBoxl.Addltem "Ванильное" ComboBox1.AddItem "Шоколадное" ComboBoxl.Addltern "Кофейное" ComboBoxl.Addltem "Смородиновое" ComboBoxl.Addltem "Вишневое" ComboBoxl.ListIndex = 0 End Sub Ha этом этап проектирования экранной формы для демонстрации комбинированного списка завершается. Теперь необходимо создать программу, отображающую форму на экране и считывающую значение, выбранное пользователем из комбинированного списка. 1. Откройте окно редактирования кодов для модуля вашего проекта (или, если необходимо, выберите команду lnsertc:t>Module (Вставить'=>Модуль) для добавления нового модуля). 2. Выполните команду lnsert==>Procedure (Вставить'=>Процедуру), чтобы добавить новую процедуру. Назовите ее TestComboBoxDemo. 3. В теле добавленной процедуры наберите код, приведенный в листинге 20.2. Урок 20. Элементы управления экранных форм 269
Листинг 20.2. Процедура для тестирования экранной формы и расположенного на ней элемента управления СотЬоВох Public Sub TestComboBoxDemo() Dim frm As New ComboBoxDemo frm.Show MsgBox "Вы выбрали " & frm.ComboBoxl.Value End Sub При выполнении процедуры TestComboBoxDemo отображается ранее созданная экранная форма. Выберите элемент из комбинированного списка (рис. 20.1) и щелкните на кнопке Close. Программа отобразит окно сообщения, в котором будет указан выбранный вами вариант. ^^щ^^тт^^ 1 Ванильное! У| U; Шоколадное Кофейное Смородиновое Вишневое Закрыть ренесгкгь | 1:.„.!.{1:...;.::! '.1j. Ll..i...: ,. ...1 :..: .l... ig '|: Рис. 20.1. Выбор элемента из комбинированного списка Осталось 20 минут Элемент управления CommandButton Элемент управления CommandButton добавляет к экранной форме кнопку. Как правило, этот элемент управления используется для выполнения определенного действия после щелчка на соответствующей кнопке. Чтобы выполнить действие, поместите необходимый код в процедуру события Click этой командной кнопки. Пример такой процедуры был продемонстрирован в предыдущем разделе, где рассматривался комбинированный список. Иногда требуется, чтобы в окне формы была определена кнопка, выбранная по умолчанию, и кнопка отмены. Нажатие пользователем клавиши <Enter> равнозначно щелчку на кнопке, выбранной по умолчанию (если при этом не выбран никакой другой элемент управления). Кнопка отмены используется автоматически при нажатии пользователем клавиши <Esc>. • Чтобы сделать командную кнопку выбранной по умолчанию, присвойте ее свойству Default значение True. • Чтобы сделать командную кнопку кнопкой отмены, присвойте значение True ее свойству Cancel. Для каждой отдельной формы может быть выбрана только одна кнопка отмены и одна кнопка, используемая по умолчанию. Во многих диалоговых окнах присутствует командная кнопка с надписью ОК или подобная ей. Щелчок на данной кнопке приводит к закрытию формы, а вызывающая программа получает сообщение о возможности считать данные, введенные с помощью этой формы пользователем. Аналогичным образом, щелчок на 270 Часть IV. Суббота. Вечер
кнопке отмены (на которой обычно отображается слово Cancel) также приводит к закрытию формы, однако программа при этом получает сообщение, что указанные в форме данные необходимо проигнорировать. Но как вызывающая программа определяет, щелчком на какой из кнопок была закрыта экранная форма? Эта задача может быть решена путем создания для формы глобальной переменной типа Boolean. Такая переменная объявляется за пределами процедуры обработки события, следовательно, она остается доступной для любых кодов программы, на относящихся к самой форме. Чтобы создать такую переменную, откройте окно редактирования кодов для экранной формы и выберите пункт (General) из списка в левой верхней части окна. Наберите код объявления переменной, используя вместо ключевого слова Dim слово Public: Public Cancelled As Boolean Остановимся подробнее на использовании этой переменной. 1. В процедуре обработки события Click для кнопки ОК данной формы объявленной глобальной переменной присваивается значение False, после чего форма исчезает с экрана. 2. В процедуре обработки события Click для кнопки Cancel данной формы глобальной переменной присваивается значение True, после чего форма исчезает с экрана. 3. В кодах, вызывающих процедуру, проверяется значение этой переменной. Введенные пользователем данные считываются только в том случае, если переменной присвоено значение False. Если же переменная возвращает значение True, данные, введенные в форме, игнорируются. Ниже представлена программа, демонстрирующая применение такого приема. 1. Создайте в проекте новую экранную форму. 2. Присвойте ее свойству Name значение CommandButtonDemo, а свойству Caption — значение CommandButton Demo. 3. Добавьте к форме командную кнопку. Присвойте ее свойству Name значение cmdOK, свойству Caption — значение ОК и свойству Default — значение True. 4. Добавьте к форме вторую командную кнопку. Присвойте ее свойству Name значение cmdCancel, свойству Caption — значение Cancel (Отмена) и свойству Default — значение True. 5. Откройте окно редактирования кодов для формы и выберите пункт (General) из списка в левой верхней части окна. 6. Наберите строку кода Public Cancelled As Boolean. 7. Добавьте процедуры обработки события Click для каждой командной кнопки, после этого наберите в теле этих процедур код, показанный в листинге 20.3. Листинг 20,3. Код для процедур события Click двух командных кнопок Private Sub cmdCancel_Click() Cancelled = True Me.Hide Урок 20. Элементы управления экранных форм 271
End Sub Private Sub cmdOK_Click() Cancelled = False Me.Hide End Sub Теперь, когда форма готова к использованию, можно создать процедуру, отображающую ее на экране. В программном модуле проекта добавьте новую процедуру под названием TestCommandButtonDemo и наберите в ее теле код, показанный в листинге 20.4. Листинг 20.4. Код для запуска формы, демонстрирующей использование злементов управления CommandButton Public Sub TestCommandButtonDemoО Dim frm As New CommandButtonDemo frm.Show If frm.Cancelled = True Then MsgBox "Вы закрыли форму щелчком на кнопке Cancel" Else MsgBox "Вы закрыли форму щелчком на кнопке ОК" End If End Sub Элемент управления Frame Элемент управления Frame (Панель) используется для группирования других элементов управления; сам по себе он не несет никакой функциональной нагрузки, хотя может реагировать на событие Click. Элемент управления Frame выглядит как прямоугольное поле с рамкой и заголовком. После того, как вы разместите в окне формы такую панель, на ней можно располагать другие элементы управления. При этом вы получаете следующие возможности. • При перемещении элемента Frame (либо на этапе проектирования формы, либо при добавлении соответствующих кодов в теле программы) вместе с ним перемещаются все расположенные на нем элементы управления. • Если свойству Visible элемента управления Frame присваивается значение False, все расположенные на нем элементы также становятся невидимыми. Панель Frame чаще всего используется для создания группы переключателей OptionButton. Пример такого применения панели показан далее в этом уроке, в разделе, посвященном вопросам использования переключателей OptionButton. Элемент управления Label в элементе управления Label (Надпись) отображается текст, не доступный для редактирования пользователем. Например, надпись можно разместить рядом с текстовым полем, чтобы определить его назначение и указать, какие данные оно содержит. Пользователю не позволяется изменять текст элемента управления Label, но его можно изменить в кодах программы (используя свойство 272 Часть IV. Суббота. Вечер
Caption). Кроме того, элемент Label может реагировать на события Click, благодаря чему он используется как альтернативное командным кнопкам средство реагирования на действия пользователя. Элемент управления OptionButton Переключатель OptionButton подобен флажку CheckBox, так как он тоже позволяет отображать и выбирать значение типа True/False или да/нет. Обычно переключатель имеет вид маленького кружка, внутри которого отображается (если переключатель выбран) или не отображается (если переключатель не выбран) черная точка. Щелкая на переключателе, пользователь выбирает его или отменяет его выбор. Отличие переключателя OptionButton от флажка CheckBox состоит в том, что из группы может быть выбран только один переключатель (тогда как флажков, принадлежащих одной группе, допускается выбрать сразу несколько). Чтобы создать группу переключателей, поместите их на элементе управления Frame. Обратите внимание, что вначале необходимо добавить в окно формы панель Frame, а затем разместить на ней переключатели OptionButton. Чтобы сделать переключатель частью группы, его сразу же следует поместить на панель Frame. Таким образом перетащить уже созданный переключатель из окна формы на панель вы не сможете. Еще один способ создания группы переключателей состоит в использовании свойства GroupName. Все элементы управления OptionButton, свойство Group- Name которых имеет одинаковое значение, считаются частью одной группы. Выбор одного такого переключателя исключает возможность выбора других, даже если они не расположены на одной панели. Присвоение свойству Value переключателя значения True сопровождается автоматическим присвоением значения False этому же свойству других переключателей, относящихся к данной группе. Чтобы определить, какой переключатель группы был выбран, программа должна просмотреть все элементы OptionButton и найти тот из них, свойству Value которого присвоено значение True. Этот метод будет реализован в представленной ниже демонстрационной программе. В окне экранной формы можно создать несколько групп переключателей, поместив каждую из них на отдельной панели, представленной элементом управления Frame, или присвоив разные значения свойствам GroupName переключателей, принадлежащих к разным группам. Приведенная далее программа демонстрирует использование элементов управления OptionButton. Выполните следующие действия, чтобы создать экранную форму. 1. В редакторе VBA выберите команду lnsert=^User Form (Вставить'=> Экранную форму), чтобы добавить в проект новую экранную форму. 2. Присвойте свойству Name созданной формы значение OptionButtonDemo, а ее свойству Caption — значение OptionButton Demo. 3. Добавьте к форме элемент управления Frame и присвойте его свойству Caption значение Выбор цвета. 4. Добавьте на панель переключатель OptionButton. Присвойте его свойству Caption значение Синий, а свойству Name — значение optBlue. Урок 20. Элементы управления экранных форм 2 73
5. Добавьте на панель еще два переключателя, присвоив их свойству Name значения optRed и optGreen, а свойству Caption — значения Красный и Зеленый, соответственно. 6. Присвойте свойству Value одного из расположенных на панели переключателей значение True. 7. Добавьте к форме (но не на панель) командную кнопку CommandButton и присвойте ее свойству Caption значение ОК. 8. Дважды щелкните на элементе управления CommandButton, чтобы получить доступ к его процедуре обработки события Click. Наберите в теле процедуры строку Me. Hide. 9. Сохраните проект. Готовая форма должна быть подобна той, что представлена на рис. 20.2. Следующий шаг заключается в создании процедуры VBA, которая будет отображать форму на экране и считывать введенные пользователем данные. щ^шшшшш^^ш :Г ' ' . .-■'•• * "■ ' t ' ' jj 1 ■^ньюорipgra*:'"-' »!:■>»'«'".»'■'■ "ч*"" •• ;.-/.^ Зелв»*ый^-'':, :'•••- ,';.♦ L ;;„ „:„..^ ,; V :'::::::: - ' ' ' ■■' i'::':': •■:'■•''- ::Л \;4'':'-■. Рис. 20.2. Готовая форма Option- Button Demo 1. Откройте программный модуль проекта. 2. Используйте команду lnsert«=>Procedure (Вставить^^Процедуру), чтобы добавить процедуру под названием TestOptionButtonDemo. 3. В теле процедуры наберите код, показанный в листинге 20.5. Листинг 20.5. Процедура для тестирования экранной формы Option Button Demo Public Sub TestOptionButtonDemo0 Dim frm As New OptionButtonDemo Dim s As String frm.Show If frm.optBlue.Value = True Then s = "Синий" Elself frm.optRed.Value = True Then s = "Красный" Elself frm.optGreen.Value = True Then 274 Часть IV. Суббота* Вечер
s = "Зеленый" End If MsgBox "Вы выбрали " & s End Sub Запустите программу TestOptionButtonDemo, в результате чего на экране будет отображена созданная вами форма. Выберите один из переключателей (обратите внимание, что форма не позволяет выбрать сразу два переключателя). После щелчка на кнопке ОК программа отобразит на экране окно сообщения с указанием выбранного вами варианта. о Элемент управления RefEdit Элемент управления RefEdit предоставляет пользователю возможность выде- %"Muwm лять на рабочем листе диапазон ячеек. После выделения диапазона элемент управления возвращает его адрес в виде строки, содержащей название листа и абсолютные ссылки на ячейки. Элемент управления RefEdit может быть использован только в формах, которые отображаются модально (т.е. свойству ShowModal которых присвоено значение True). Элемент управления RefEdit в окне формы имеет вид кнопки, рядом с которой расположено текстовое поле. Когда пользователь щелкает на этой кнопке, экранная форма сворачивается, после чего можно использовать курсор для выделения диапазона ячеек на рабочем листе. Когда требуемый диапазон будет выделен, необходимо щелкнуть на кнопке, которая отображается в окне свернутой формы. Форма разворачивается до исходного размера, а в текстовом поле отображаются название рабочего листа и адрес ячеек выделенного диапазона. В кодах программы эта строка может быть считана как значение свойства Value элемента управления RefEdit. Если пользователь не выделил диапазон, свойство Value возвращает пустую строку. Применение элемента управления RefEdit рассмотрело на примере демонстрационной программы, показанной ниже. Эта программа отображает форму с элементом управления RefEdit и кнопкой Format. Пользователь должен щелкнуть на элементе управления RefEdit и выделить диапазон ячеек рабочего листа. Если вы возвратитесь к форме и щелкните на кнопке Format, то шрифт выделенных ячеек станет красным, появится окно сообщения с указанием адреса выделенного диапазона, и затем форма закроется. Чтобы создать экранную форму, выполните перечисленные ниже действия. 1. Выберите команду lnsert'=t>User Form, чтобы добавить в проект новую экранную форму. 2. Присвойте свойству Name экранной формы значение Ref EditDemo, а свойству Caption — значение RefEdit Demo. 3. Добавьте к форме элемент управления RefEdit и оставьте заданные по умолчанию значения свойств этого элемента без изменений. 4. Добавьте к форме кнопку Command Button. Присвойте ее свойству Caption значение Format. 5. Дважды щелкните на кнопке, чтобы открыть ее процедуру обработки события Click в окне редактирования кодов. 6. В теле процедуры наберите код из листинга 20.6. Урок 20. Элементы управления экранных форм 275
Листинг 20.6. Код формы RefEdit Demo Private Sub CommandButtonl_Click() Dim s As String Dim r As Range s = RefEdit1.Value ' Проверка, выделен ли диапазон ячеек If S = "•• Then MsgBox "Пожалуйста, выделите диапазон" Else * Форматирование ячеек выделенного диапазона Set г = Range(s) г.Font.Color = RGB(255, О, 0) ' Отображение адреса диапазона MsgBox "Был отформатирован диапазон " & s ' Закрытие формы Me.Hide End If End Sub Код экранной формы и является кодом всей программы, поэтому нам остается лишь создать процедуру для отображения этой формы. Создайте новую процедуру в модуле VBA (назовите ее, например, TestRef EditDemo) и наберите в ее теле следующий код: Dim frm As New RefEditDemo frm.Show Чтобы протестировать программу, выполните перечисленные ниже действия. 1. Запустите процедуру для отображения формы. 2. Щелкните на элементе управления RefEdit, чтобы свернуть форму и выделить диапазон ячеек рабочего листа. Желательно выделить диапазон, в ячейках которого содержатся какие-нибудь данные, чтобы можно было увидеть изменения в их форматировании. На рис. 20.3 показан рабочий лист со свернутой экранной формой и выделенным диапазоном ячеек. 3. Щелкните на кнопке, отображаемой в окне свернутой формы, чтобы вернуться к обычному размеру экранной формы. 4. Щелкните на кнопке Format, чтобы отформатировать выделенный диапазон и отобразить окно сообщения. 5. Закройте окно сообщения, экранная форма будет закрыта автоматически. Элемент управления TextBox Элемент управления TextBox, представляющий текстовое поле, является одним из наиболее удобных и полезных. В текстовом поле может отображаться текстовая информация, адресуемая пользователю. Кроме того, с его помощью пользователь может вводить собственные данные. По умолчанию в текстовом поле отображается одна текстовая строка. Если текст не помещается в текстовом поле целиком, то его часть оказывается скрытой за правым краем этого поля. Пользователь может перемещаться в пределах текстового поля с помощью обычных клавиш редактирования текста (к ним от- 276 Часть IV. Суббота. Вечер
носятся клавиши управления курсором, клавиши <End> и <Ноте>). Такой способ отображения текстовой строки будет использован даже в тех случаях, когда само поле имеет достаточную высоту, чтобы отобразить сразу несколько строк. Н Microsoft Excel - Книга1 1 ® файл Орабка Вид Встзвка Форват ] Qipaeica ВЗ W ^ L 1 .А„ ILlI щ [4 1 ы Щ И !|l2l щ Укгпсите ! в 1 с . :• |^;йг^;Ш;:' Г г чц \ 2 15: 'JIIZ'.^ Z.^...'.M. i 4- 17i, ; 5^ 18: jKIoS! $В$3 :$С<Т'""' Qp^^P 1\ Лисг1 \Лист2/Листз7 Сервис ш 1 "11 Е ^ Дэнные Окно 1 1 ним F .1 : j'"' И0 G Т1 Рис. 2(?.3. Использование элемента управления RefEdi t для выделения диапазона ячеек Если вы хотите отобразить в текстовом поле, представленном элементом управления TextBox, более одной текстовой строки, присвойте его свойству Mul - tiLine значение True. Тогда пользователь сможет продолжить набор текста с новой строки, нажав клавиши <Shift+Enter> (или просто <Enter>, в зависимости от значения свойства EnterKeyBehavior, как показано в табл. 20.4). Кроме того, в этом случае при достижении правого края текстового поля будет автоматически осуществляться переход на новую строку. Если вам не нужна возможность автоматического перехода на новую строку и вы хотите, чтобы этот переход осуществлялся только по нажатию пользователем клавиш <Shift-}-Enter>, присвойте свойству Wordwrap (элемента управления TextBox) значение False. Если в текстовом поле содержится больше строк, чем может поместиться, дополнительные строки будут скрыты за верхним и/или нижним краями текстового поля. Вы вправе добавить к текстовому полю полосы прокрутки; их можно будет использовать для просмотра остальной части текста. В этом случае необходимо присвоить свойству ScrollBars одно из следующих значений: • f mScrollBarsNone (нет полос прокрутки, используется по умолчанию); • f mScrollBarsHorizontal (горизонтальная полоса прокрутки); • f mScrollBarsVertical (вертикальная полоса прокрутки); • f mScrollBarsBoth (горизонтальная и вертикальная полосы прокрутки). В табл. 20.4 описаны свойства элемента управления TextBox. Урок 20. Элементы управления экранных форм 277
Таблица 20.4. Некоторые свойства элемента управления TextBox Свойство Описание EnterKeyBehavior MaxLength PasswordChar TabKeyBahavi or TextLength Если свойство имеет значение False (по умолчанию), то при нажатии <Enter> становится активным следующий элемент управления. Чтобы выполнить переход на новую строку в текстовом поле, пользователь должен нажать клавиши <Shift+Enter>. Если свойству присвоено значение True, клавишу <Enter> также можно использовать для перехода на новую строку Максимальное количество символов, которое может содержаться в текстовом поле. Если свойству присвоено значение О (по умолчанию), количество символов может быть любым Определяет символ-заполнитель, который используется для отображения других символов в текстовом поле. Например, чтобы в поле вместо обычных символов отображались звездочки, присвойте этому свойству значение " *". Это свойство пригодится при создании текстовых полей, предназначенных для ввода паролей, что позволит предотвратить нежелательный просмотр пароля другими лицами. По умолчанию свойству присвоена пустая строка, в результате все набираемые в текстовом поле символы отображаются в своем исходном виде Если для свойства выбрано значение True, при нажатии клавиши табуляции в набираемый текст вставляется символ табуляции (но только в том случае, если свойству MultiLine также присвоено значение True). Если же для свойства выбрано значение False (по умолчанию), то при нажатии клавиши табуляции фокус переходит к следуюпдему элементу управления Возвращает количество символов, содержащихся в текстовом поле Чтобы считать набранные в текстовом поле данные или отобразить в нем какую-то информацию, используйте его свойства Text или Value. Они абсолютно эквивалентны; старое свойство Text по-прежнему применяется для обеспечения совместимости с ранними версиями Excel. Пример использования элемента управления TextBox будет рассмотрен в уроке 22. Готово! Элемент управления ToggleButton Кнопка ToggleButton используется для выбора и отображения значений True/False. Функционально она практически идентична полю флажка Check- Box, однако выглядит она иначе. Кнопка ToggleButton имеет два состояния — "отжатое" и "нажатое", которые соответствуют значениям False и True. Свойство Value для кнопки-переключателя ToggleButton возвращает значения True или False в зависимости от ее состояния. При изменении свойства Value меняется и внешний вид кнопки. Обзор В этом уроке были рассмотрены элементы управления, используемые в экранных формах приложения Excel. • Существует 15 различных элементов управления. • Свойство Enabled определяет, может ли элемент управления быть изменен пользователем. 278 Часть IV. Суббота. Вечер
Свойство Visible определяет, отображается ли элемент управления в окне формы. Элемент управления TextBox (Текстовое поле) используется для отображения и ввода текстовых данных. Элементы управления ComboBox (Комбинированный список) и ListBox (Выпадающий список) отображают списки элементов, из числа которых пользователь может выбрать подходящее значение. Для включения/отключения свойств и значений используются элементы управления CheckBox (Флажок), OptionButton (Переключатель) и Тод- gleButton (Кнопка-переключатель). Элемент управления RefEdit предоставляет пользователю возможность выделить диапазон ячеек рабочего листа. Проверьте себя 1. Назовите главное отличие между элементами управления CheckBox и OptionButton. (См. раздел "Перечень элементов управления".) 2. Значения каких свойств элемента управления TextBox необходимо изменить, чтобы в текстовом поле сразу отображалось несколько строк? (См. подраздел "Элемент управления TextBox".) 3. Как осуществляется добавление элементов в список ComboBox? (См. подраздел "Элемент управления ComboBox".) 4. К каким последствиям может привести выбор значения True для свойства Default командной кнопки CommandButton? (См. подраздел "Элемент управления CommandButton".) 5. Опишите два способа создания группы переключателей OptionButton. (См. подраздел "Элемент управления OptionButton".) Урок 20. Элементы управления экранных форм 279
ЧАСТЬ Суббота. Вечер. Обзор 1. Назовите основное отличие встроенной диаграммы от листа диаграмм. 2. Как управлять размером и положением листа диаграмм? 3. Как добавить в рабочую книгу новый лист диаграмм? 4. Как указать, какие данные должны быть выведены на график? 5. Предположим, что переменная Ch ссылается на диаграмму. Как отобразить заголовок этой диаграммы курсивом? 6. Рабочая книга содержит лист диаграмм под названием "Итоги продаж". Какое выражение VBA требуется применить для вывода этой диаграммы на используемый по умолчанию принтер? 7. Как не допустить внесения изменений в диаграмму конечным пользователем? 8. Предположим, что рабочий лист содержит несколько встроенных диаграмм, которые накладываются друг на друга. Как обеспечить такое их расположение, чтобы конкретная диаграмма не оказалась закрытой остальными? 9. Назовите кардинальное отличие точечной диаграммы от большинства других диаграмм Excel. 10. Как вывести на печать все листы диаграмм рабочей книги? 11. Предположим, необходимо, чтобы определенная встроенная диаграмма распечатывалась при выводе на печать рабочего листа. Как это осуществить? 12. Из каких трех компонентов состоит экранная форма? 13. Что требуется предпринять, чтобы экранная форма в момент открытия отображалась по центру относительно окна приложения? 14. Как закрыть экранную форму? 15. Чем отличаются элементы управления OptionButton от CheckBox? 16. Как создать группу переключателей OptionButton? 17. Предположим, вы работаете над визуальным интерфейсом экранной формы. Назовите самый быстрый способ отобразить код используемого по умолчанию события для конкретного элемента управления. 18. Вы хотите, чтобы пользователь мог выбирать командную кнопку путем нажатия клавиши <Enter>. Как это осуществить? 19. Какой элемент управления позволяет пользователю выделить диапазон ячеек рабочего листа? 280 Часть IV. Суббота. Вечер. Обзор
20. Какой элемент управления предоставляет пользователю возможность вы брать требуемое количество ответов типа "да/нет"? 21. Какое свойство элемента управления определяет, может ли он быть доступным для пользователя и может ли изменяться пользователем? Часть IV. Суббота. Вечер. Обзор 281
^ BocKpe сенье
Часть V. Воскресенье. Утро Урок 21. Дополнительные средства создания экранных форм Урок 22. Пример экранной формы Урок 23. Обработка событий Урок 24. Вопросы защиты данных Урок 25. Отладка и распространение программ Урок 26. Определение и применение пользовательских классов Часть VL Воскресенье. День Урок 27. Обработка ошибок выполнения программы Урок 28. Задачи баз данных Урок 29. Создание надстроек Урок 30. Добавление к приложениям электронной справочной системы
УРОК » Дополнительные средства создания экранных форм Содержание урока у/ События элементов управления ^ Средства вьфавнивания элементов управления и настройки их размеров ^ Работа с Z-порядком ^ Порядок обхода элементов формы В двух предыдущих уроках были изложены основы проектирования экранных форм и описаны характеристики добавляемых к формам элементов управления. В настоящем уроке мы рассмотрим более сложные аспекты проектирования Осталось , 30минут И использования экранных форм. События элементов управления Элементы управления, применяемые в экранных формах, могут реагировать на события определенных типов. Эти события, как правило, являются результатом действий пользователя — щелчков на элементах управления или нажатий клавиш. С одним из таких событий— событием Click— мы уже встречались (см. примеры программ). События для экранных форм и расположенных на них элементов управления описаны в табл. 21.1. Обратите внимание, что это далеко не все события, доступные программистам, а лишь некоторые наиболее часто используемые.
Таблица 21.1. События экранных форм и элементов управления Событие Доступно для Происходит Click Форм; большинства элементов управления DblClick Форм; большинства элементов управления Change Checkbox, OptionButton, Com- boBox, TextBox и некоторых других элементов управления Enter Большинства элементов управления Exit Большинства элементов управления KeyDown TextBox и других элементов управления MouseMove форм; элементов управления Когда пользователь щелкает на объекте Когда пользователь дважды щелкает на объекте При изменении данных элемента управления Непосредственно перед тем, как фокус переходит к данному элементу управления Непосредственно перед тем, как элемент управления теряет фокус Когда элемент управления находится в фокусе и пользователь нажимает клавишу; процедура события получает сведения о том, какая клавиша была нажата Когда курсор мыши Перемещается над объектом Если в теле процедуры обработки событий вы не наберете код, соответствующий данному событию, это событие будет проигнорировано. События связываются с программой VBA с помощью процедур обработки событий. Процедура обработки события — это часть кодов, автоматически выполняемых при возникновении события. Процедура обработки события может быть идентифицирована по двум фрагментам информации: • по названию объекта (элемент управления или форма), к которому относится данное событие; • по названию события. Названия процедур обработки событий выглядят следующим образом: ИмяОбъекта_ИмяСобытия. Например, для командной кнопки, имеющей название cmdOK, процедура обработки события Click будет называться cmdOK_Click. Кроме названия, ничего более не требуется, чтобы привязать процедуру к данному событию. Интервал времени между двумя щелчками кнопкой мыши, при котором система распознает выполнение пользователем двойного щелчка (а не двух отдельных щелчков), устанавливается на панели управления Windows в разделе Мышь. Событие KeyDown заслуживает особого внимания, поскольку его удобно использовать в сочетании с элементом управления TextBox. В частности, оно позволяет оценить вводимые с клавиатуры символы перед тем, как они будут отображены в текстовом поле, и сразу же принять их или отвергнуть в зависимости от назначения данного элемента управления. Например, это событие может быть использовано для создания текстового поля, которое принимает только числовые данные. 286 Часть V. Воскресенье. Утро
в момент возникновения события KeyDown его процедура принимает значения двух аргументов: • KeyCode -— целое значение, определяющее нажатую клавишу; • Shift — целое значение, определяющее одновременное нажатие клавиш <Shift>, <Alt> или <Ctrl>. Для работы с аргументом KeyCode в процедуре обработки события обычно используются константы, которые определяются в языке VBA для каждой отдельной клавиши. Эти константы имеют форму vbKeyXX, где символы XX определяют клавишу. Например, vbKeyA — это клавиша А, vbKeyDown — клавиша Down, а vbKeyNumpadS — клавиша 5 на цифровой клавиатуре. Полный список значений KeyCode приведен в справочной системе VBA. Аргумент Shift определяет, какие из клавиш (<Shift>, <Alt> или <Ctrl>) были нажаты в момент нажатия основной клавиши. Этим трем клавишам соответствуют собственные константы: • f mShif tMask — клавиша <Shift>; • f mCtrlMask — клавиша <Ctrl>; • fmAl tMask — клавиша <Alt>. Если ни одна из этих клавиш не была нажата, то аргумент Shift принимает нулевое значение. Если одна из клавиш была нажата, значение аргумента Shift соответствует ее константе. Когда одновременно нажимается две или три клавиши, значение аргумента представляет собой результат выполнения логической операции AND для всех соответствующих констант. Например: If Shift = fmShiftMask And fmCtrlMask Then ' Были нажаты клавиши Shift и Ctrl End If Необходимо отметить, что аргумент KeyCode лишь определяет, какая клавиша была нажата, и ничего более. Например, если KeyCode равен vbkey7, то вы знаете, что была нажата клавиша <7> (на обычной клавиатуре). Однако, только оценив значение аргумента Shift, вы сможете определить, нажимал ли пользователь одновременно с клавишей <7> клавишу <Shift>, чтобы отобразить символ амперсанда (&). Определив, какая клавиша была нажата, в коде процедуры обработки события KeyDown можно выполнить одно из двух действий: • присвоить аргументу KeyCode нулевое значение, в результате чего нажатие клавиши будет проигнорировано; • оставить аргументу KeyCode полученное значение, и тогда событие, заключающееся в нажатии клавиши, окажет воздействие на элемент управления. В уроке 22 приведен пример использования процедуры обработки события Key- Down для отсеивания данных, вводимых в текстовом поле. Дополнительные приемы проектирования форм в уроке 19 были описаны некоторые базовые методы проектирования экранных %"ми1^т форм. Их вполне достаточно для проектирования относительно простых форм, но рано или поздно вы должны будете применить более сложные инструменты разработки пользовательского интерфейса. Некоторые из таких инструментов будут рассмотрены в настоящем разделе. Урок 21. Дополнительные средства создания экранных форм 287 л
Сетка формы Вероятно, вы уже обратили внимание на то, что при размещении элементов управления в окне формы или при изменении их размеров нельзя выбирать произвольное месторасположение или настраивать размер с точностью до пикселя. Позиция и размер любого элемента управления ограничены сеткой точек, отображаемой в окне формы. Другими словами, углы каждого элемента управления совмещаются с точками этой сетки, они не могут располагаться между точками. Данная функция довольно полезна, поскольку облегчает точное выравнивание элементов управления относительно друг друга и помогает осуществлять выбор совпадающих размеров. Чтобы отключить сетку или изменить ее размер, выберите команду ToolS'=^Options (Сервис^С^Параметры) в меню редактора VBA. В появившемся на экране диалоговом окне Options щелкните на корешке вкладки General (Общие) (рис. 21.1). В разделе Form Grid Settings (Параметры сетки) вы можете настроить значения перечисленных ниже параметров. • Show Grid (Отобразить сетку). Если этот параметр выбран, сетка в окне формы отображается. Обратите внимание, что сетка может отображаться, но не быть активной, или быть активной, но не отображаться. • Width (Ширина) и Height (Высота). Значения этих параметров определяют расстояние между точками сетки. По умолчанию используется величина в 6 пунктов, что соответствует 1/12 дюйма. • Align Controls to Grid (Привязка элементов управления к точкам сетки). Если выбран этот параметр, то размещение и размер элементов управления автоматически выравниваются по точкам сетки. Optiohs^^' Editor j Editor Format General j Docking | ~ Form Grid Settings—=— p Show Grtd Grtd Units: Points Width; Гб Height: p p' Align Controls to Grid •Edit ъпб СогШпое Г* Notify Before State Loss - Error Trapping С Break on АЙ Errors С Break in Class Module (m Break on Unhanded &ror$ p ShowToott'ips p* Collapse ProJ. Hides Windows r СотрЙе ' \ " I p* Compik On Demand p Background Compile OK Отмене Сгфавка Рис. 21.1. Установка параметров сетки при проектировании формы Изменение расстояния между точками сетки или включение сетки после ее отключения не влияет на расположение и размеры уже добавленных к форме элементов управления. Эти изменения оказывают воздействие на размер и расположение только тех элементов управления, которые будут добавляться позднее. 288 Часть V. Воскресенье. Утро
Инструменты размещения и выравнивания элементов управления в редакторе форм предусмотрено несколько весьма удобных инструментов, позволяющих точно размещать элементы управления в окне формы и определять их размер. Благодаря этим инструментам обеспечивается точность, которою трудно достичь вручную. Прежде чем применить эти инструменты, необходимо выделить несколько добавленных к форме элементов управления. 1. Щелкните на первом элементе управления, чтобы выделить его. Данный элемент управления будет служить ориентиром для всех остальных выделяемых элементов (подробнее об этом рассказано ниже). 2. Удерживая нажатой клавишу <Shift>, щелкните на втором элементе управления. 3. Повторяйте п. 2 до тех пор, пока не будут выделены все требуемые элементы. При выделении нескольких элементов управления вокруг первого выделенного элемента отображаются маркеры белого цвета, а вокруг остальных — черного (рис. 21.2). Белые маркеры указывают на главный элемент управления, который будет служить ориентиром для команд форматирования. Например, если вы используете команду выравнивания элементов управления, то все они будут выровнены относительно элемента, отмеченного маркерами белого цвета. Рис. 21.2. При выделении нескольких элементов управления вокруг главного элемента, используемого в качестве ориентира, отображаются белые маркеры Если выделено несколько элементов управления, щелкните в любом другом месте формы, чтобы отменить выделение. Группу из нескольких выделенных элементов управления можно перемещать как единое целое, перетаскивая с помощью мыши. Чтобы удалить их, нажмите клавишу <Delete>. Однако более полезными могут оказаться для вас команды меню Format, описание которых приведено в табл. 21.2. Таблица 21.2. Команды меню Format Команда Действие Align^^Lefts, Centers или Rights Выравнивает левый край, середину или правый край выделенных элементов управления относительно горизонтальной позиции главного элемента Урок 21. Дополнительные средства создания экранных форм 289
Окончание табл. 21.2 Команда Действие Align=^Tops, Middles или Bottom Allgn=>To Grid Make Same Size^^Wldth, Height или Both Horizontal Spacing<=>Make Equal Horizontal Spacing'=Mncrease или Decrease Horizontal Spacing=> Remove Vertical Spacing^Make Equal Vertical Spacing<^ Increase или Decrease Vertical Spacing=> Remove Center in Form «^Horizontally или Vertically Arrange Buttons'^Bottom Arrange Buttons^^ Right Выравнивает верхний край, середину или нижний край выделенных элементов управления относительно вертикальной позиции главного элемента Выравнивает позиции и размеры выделенных элементов управления по узлам текущей сетки Делает размеры (ширину, высоту либо оба размера) всех выделенных элементов равными соответствующим размерам главного элемента управления Устанавливает одинаковое горизонтальное расстояние между выделенными элементами управления Увеличивает (уменьшает) горизонтальное расстояние между выделенными элементами управления Удаляет горизонтальные интервалы между выделенными элементами управления Устанавливает одинаковое вертикальное расстояние между выделенными элементами управления Увеличивает (уменьшает) вертикальное расстояние между выделенными элементами управления Удаляет вертикальные интервалы между выделенными элементами управления Выравнивает выделенные элементы управления относительно центральной горизонтальной или вертикальной оси формы Располагает выделенные кнопки CommandButton вдоль нижнего края формы Размещает выделенные кнопки CommandButton вдоль правого края формы В следующем примере будут продемонстрированы варианты использования некоторых перечисленных команд. Этот проект нельзя считать настоящим, однако в нем используется экранная форма, для которой применяются описанные выше команды проектирования. 1. Выберите команду lnsert=>UserForm, чтобы добавить в проект новую экранную форму. 2. Добавьте к форме следующие элементы управления: четыре флажка CheckBox, одно текстовое поле TextBox, одну надпись Label и две кнопки CommandButton. Форма должна выглядеть приблизительно так, как показано на рис. 21.3. Не утруждайте себя изменением названий и других свойств добавляемых элементов управления. 3. Измените размер и положение элемента управления Label, сместив его в верхний левый угол формы. 4. Не отменяя выделение надписи Label, нажмите клавишу <Shift> и, удерживая ее нажатой, щелкните на текстовом поле TextBox. 5. Выберите команду Format«^AIIgn=>Tops (Формат«=>Выровнять«^Верхний край), чтобы выровнять элементы Label и TextBox по вертикали. 290 Часть V. Воскресенье. Утро
Li I . ^ labeCl t:::::::::::: ::: 1 ;d 1::: Г а»<*вах2 : —у у '^^у^ ::/. i 1::: г сьесйв<«4" :\-: ^ C6iinffiMndBiitt{»iZ 1 :j ^.,i>.^.^,^:;./.-r:.f..>..,^.).>.,..i;^ Рис. 21.3. Так выглядела форма до выравнивания элементов управления 6. Выполните команду Formats Маке Same Size'=^ Height (Форматс^Одинаковый размер«=>Высота), чтобы сделать высоту текстового поля равной высоте надписи. 7. Выберите команду Formats Horizontal Spacing'=> Remove (Формат'=> Горизонтальный интервал"=>Удалить), чтобы убрать расстояние между надписью и текстовым полем. 8. Переместите один из флажков CheckBox на выбранную позицию, чуть ниже надписи. Ели необходимо, измените его размер. 9. Не отменяйте выделение первого флажка, при этом, удерживая нажатой клавишу <Shift>, щелкните на трех остальных элементах CheckBox. Вокруг первого флажка появятся белые маркеры, тогда как маркеры остальных флажков будут окрашены в черный цвет. 10. Выберите команду Formatc^Aligrr:^Lefts (Формат'=>Выровнять«=>Левый край), чтобы выровнять все флажки относительно первого. 11. Выполните команду Format=>Make Same Size^^Both(Фopмaт^=>Oдинaкoвый размер«=>Высота и ширина), чтобы сделать все флажки одинакового размера. 12. С помощью команды Format=>Vertical SpacingolVIake Equal (Формат'=^ Вертикальный интервал ==>Сделать равным) сделайте вертикальные интервалы между всеми флажками одинаковыми. 13. Выберите одну из кнопок CommandButton; при необходимости измените ее размер. 14. Удерживая нажатой клавишу <Shift>, щелкните на другой кнопке. 15. Выберите команду Format'=i>Make Same Size=>Both, чтобы сделать размер обеих выделенных кнопок CommandButton одинаковым. 16. Выполните команду Format'=>Arrange Buttons=> Right (Формат'=>Выравнивание кнопок'=М1о правому краю), чтобы расположить две выделенные кнопки вдоль правого края формы. 17. Если необходимо, перетащите обе кнопки (не отменяя их выделение) на выбранную позицию. Окончательный вариант внешнего вида формы показан на рис. 21.4. Вручную так точно и аккуратно выровнять элементы пользовательского интерфейса было бы намного сложнее. Урок 21. Дополнительные средства создания экранных форм 291
•' ' "^ 1 • • labelJi 1 i . , Г* 0№скВшй i . ^ jP checkEke(2 • • 1 ; уГсНвскВохЗ : 1:: Г cbeckB«c4 : ^^^^^^^^^^^щ^^^^^^ CommandButtOfll J ; ;| ■ Сотгш1п<1В1йй)п2 | ! Л Рис. 21.4. Внешний вид формы после выравнивания добавленных к ней элементов управления Осталось 10 минут Перекрывающиеся элементы управления и г-порядок Как правило, элементы управления, добавляемые в окно формы, не перекрывают друг друга, поэтому особых проблем не возникает. (Одно из исключений из этого правила — использование панели Frame для группирования других элементов управления.) Однако при разработке некоторых форм может возникнуть необходимость в том, чтобы элементы перекрывали друг друга. Но как определить, какой из перекрывающихся элементов управления в какой момент времени должен находиться сверху? Расположение перекрывающихся элементов управления определяется их г-порядком. Элемент управления, расположенный сверху и полностью или частично закрывающий собой другие элементы, называют верхним в г-порядке. Аналогичным образом, элемент управления, расположенный ниже всех перекрывающихся элементов, называют нижним в г-порядке. Вы можете изменять z-порядок элементов на этапе проектирования формы и в кодах самой программы. Чтобы изменить позицию элемента управления в z-порядке, выделите этот элемент и выберите команду Format«=>Order (Формат^МТорядок). В данном подменю доступны четыре команды. • Bring to Front (Сделать верхним) — размещает элемент управления выше всех остальных. • Send to Back (Сделать нижним) — размещает элемент управления ниже всех остальных. • Bring Forward (Перенести вперед) — перемещает элемент на одну позицию вверх в z-порядке. • Send Backward (Перенести назад) — перемещает элемент на одну позицию вниз в z-порядке. В кодах программы сделать элемент управления верхним или нижним в z-порядке можно с помощью метода ZOrder. Синтаксис метода такой: ControlName.ZOrder(Position) Аргумент Posi tion принимает значения f тТор (вверх) или f mBottom (вниз). 292 Часть V. Воскресенье. Утро
Фокус и порядок обхода элементов формы Когда в ходе выполнения программы форма открывается на экране, один из элементов управления находится в фокусе. Визуально для разных элементов управления этот факт отображается по-разному, но чаще всего вокруг такого элемента или на самом элементе будет нарисована точечная линия. Например, в представленной на рис. 21.5 форме фокус принадлежит элементу CheckBox2. ^^ш^ш^ LaMi f^ Р CheckBoxl njchecfcBox?! Г" ChedcBoxS FOiedcBoe* CommandButtonl J Commancffltjtton2 I Рис. 21.5. Элемент управления, находящийся в фокусе, обычно обозначается границей из точек Расположенный в фокусе элемент управления соответствующим образом реагирует на действия пользователя. Например: • находящееся в фокусе текстовое поле принимает символы и команды редактирования, вводимые пользователем с клавиатуры; • расположенный в фокусе флажок или переключатель изменяет свое состояние (с True на False и наоборот) по нажатию клавиши пробела; • находящаяся в фокусе кнопка ComraandButton становится выделенной; • элементы содержащихся в фокусе комбинированных или выпадающих списков можно просматривать с помощью клавиш управления курсором. Когда форма отображается на экране, пользователь может щелкнуть на элементах управления, чтобы передать им фокус (щелчком также осуществляется выбор кнопок CommandButton). Кроме того, чтобы передать фокус другим элементам управления, можно нажать также клавиши <ТаЬ> или <Shift-l-Tab>. Порядок, в котором осуществляется передача фокуса от одного элемента к другому, называется порядком обхода элементов {tab order). Следует заметить, что нажатие клавиши <ТаЬ> сопровождается передачей фокуса элементу, расположенному следующим в порядке обхода, тогда как при нажатии клавиш <Shift+Tab> фокус переходит к предыдущему элементу. Если вы хотите, чтобы с помощью щелчка осуществлялся выбор командной кнопки (без передачи к ней фокуса), присвойте свойству TakeFocusOnClick данной кнопки значение False. Эта возможность пригодится вам в том случае, когда необходимо, чтобы щелчок на командной кнопке сопровождался выполнением определенного действия, этом сама форма оставалась отображенной на экране и фокус не переходил к выбранной кнопке. Урок 21. Дополнительные средства создания экранных форм 293
Для некоторых форм принципиальным может оказаться вопрос определения требуемого порядка обхода элементов управления. Например, в форме для ввода данных порядок обхода элементов должен соответствовать обычному порядку ввода данных. После ввода последнего значения фокус должен переходить к кнопке ОК. Два свойства элементов управления позволяют определять порядок их обхода. • Tabs top. Если этому свойству присвоено значение True, к данному элементу управления может переходить фокус при нажатии клавиши табуляции. Если для свойства выбрано значение False, фокус к этому элементу переходит только по щелчку на нем кнопкой мыши. По умолчанию для свойства Tabs top всех элементов управления выбрано значение True. • Tab Index. Числовое значение, определяющее позицию данного элемента управления в порядке их обхода. Первому элементу в этой последовательности соответствует индекс О. При добавлении к форме элементов управления, их свойству Tab Index присваивается следующее по порядку значение. Довольно часто в результате устанавливается неверный (не удовлетворяющий вашему замыслу) порядок обхода элементов. Существует три способа изменения этого порядка. Вы можете вручную изменить свойства Tab Index всех добавленных к форме элементов управления, однако такой метод обычно отнимает слишком много времени. Можно также использовать команду \/1е\/^=>ТаЬ Order (ВидОПорядок обхода элементов), при выборе которой на экране отображается диалоговое окно Tab Order (рис. 21.6). Чтобы изменить порядок обхода, выберите элемент управления в списке и используйте кнопки Move Up (Переместить вверх) и Move Down (Переметить вниз). iwg Tab Order ^ || ]OptionButton2 OptionButton3 h' '"" 0К>/' Cencel.: Puc.21.6. Диалоговое окно Tab Order позволяет определить требуемый порядок обхода элементов управления Существует еще один способ изменения порядка обхода элементов — в кодах программы следует вызвать метод SetDefaultTabOrder объекта User- Form. Этот метод определяет порядок обхода, при котором фокус переходит к расположенным правее и ниже элементам, начиная от элемента в верхнем левом углу формы. Данный метод можно вызвать и для элемента управления Frame, что позволит установить порядок обхода элементов, размещенных на данной панели. Использовать настоящий метод имеет смысл только в тех случаях, когда элементы управления в окне формы расположены в соответствии с требуемым порядком их обхода. 294 Часть V. Воскресенье. Утро
Готово! Элемент управления Label имеет свойство Tablndex, но он не может находиться в фокусе. Кроме того, этот элемент управления обладает свойством Tab- Stop. При нажатии клавиши <ТаЬ> фокус переходит к элементу управления, следующему за надписью Label в последовательности обхода элементов, а при нажатии клавиш <Shift+Tab> — к элементу, который предшествует этой надписи. При отображении формы на экране, в фокусе по умолчанию оказывается элемент, свойству Tablndex которого присвоено значение 0. Чтобы передать фокус к другому элементу управления, вызовите метод SetFocus этого элемента. Данный метод можно вызвать в любой момент, когда логика выполнения программы требует передачи фокуса соответствующему элементу управления. Элемент управления Frame и порядок обхода Если форма содержит панель Frame, на которой расположены другие элементы управления, то можно воспользоваться двумя независимыми порядками обхода элементов. • Сама форма имеет свой порядок обхода. Он включает все добавленные к ней элементы управления, в том числе и элемент Frame, но не содержит элементов, расположенных на панели Frame. • Для панели Frame предусмотрен собственный порядок обхода всех расположенных на ней элементов управления. При работе с такой формой нажатие клавиши табуляции будет сопровождаться переходом фокуса в соответствии с заданной последовательностью обхода элементов. Этот процесс будет продолжаться до тех пор, пока очередь не дойдет до панели Frame. Далее фокус переходит в пределах панели согласно ее собственному порядку обхода элементов. Наконец, фокус возвращается к следующему элементу формы (после обхода всех элементов панели Frame) и движется далее в соответствии с порядком обхода, определенным для формы. Особый порядок обхода элементов управления отображается в диалоговом окне Tab Order. Если выделена форма или один из ее элементов управления, в диалоговом окне Tab Order будет представлен порядок обхода, соответствующий самой форме (в этом порядке указаны все панели Frame). Обратите внимание, что в него не включены элементы управления, расположенные на панели (или панелях). Если же выделена панель или какой-либо расположенный на ней элемент управления, в диалоговом окне Tab Order отображается порядок обхода элементов, соответствующий данной панели. Обзор В этом уроке были рассмотрены довольно сложные аспекты проектирования и использования экранных форм. • Каждый элемент управления реагирует на определенные события (действия пользователя). В кодах программы вы можете написать процедуры, выполняемые при возникновении этих событий. • По умолчанию в окне формы элементы управления выравниваются по узлам ее сетки. Вы можете изменить расстояние между узлами сетки или отключить ее. • В меню Format редактора VBA содержится ряд команд, которые помогают облегчить точное размещение, выравнивание и изменение размеров добавляемых к форме элементов управления. Урок 21. Дополнительные средства создания экранных форм 295
Если два или более элемента управления перекрывают друг друга, особенности их отображения определяются выбранным для них z-порядком. Когда форма отображается на экране, нажатие клавиши <ТаЬ> сопровождается передачей фокуса от одного элемента управления к другому в последовательности, определенной порядком обхода элементов. Проверьте себя 1. Какое событие происходит при изменении данных в элементе управления? (См. раздел "События элементов управления*'.) 2. Как изменить расстояние между узлами сетки, используемой при проектировании формы? (См. подраздел "Сетка формы".) 3. По какому элементу управления выравниваются все остальные выделенные элементы? (См. подраздел "Инструменты размещения и выравнивания элементов управления".) 4. Каким образом в ходе выполнения программы можно сделать положение элемента управления верхним в z-порядке? (См. подраздел "Перекрывающиеся элементы управления и z-порядок".) 5. Какое свойство определяет возможность перехода фокуса к элементу управления при нажатии клавиши табуляции? (См. раздел "Фокус и порядок обхода элементов формы".) 296 Часть V. Воскресенье. Утро
УРОК Осталось Пример экранной формы Содержание урока ^ Планирование проекта ^ Создание рабочей книги ^ Проектирование формы м' Написание кодов ^ Проверка данных <• Тестирование проекта Планирование проекта в настоящем уроке будет рассмотрен пример программы Excel, в которой реали- Уо'минут зована экранная форма, облегчающая ввод данных пользователем. Подобные формы нередко используются в реальных проектах. Разумеется, пользователь всегда может ввести данные прямо в ячейки рабочего листа, а потому может возникнуть вполне справедливый вопрос: зачем вообще создавать экранную форму и писать для нее программу? Что ж, на это есть несколько причин. 1. Удобство пользователя. Если пользователь будет долго смотреть на сетку из строк и столбцов рабочего листа, он вскоре устанет и, как следствие, начнет непроизвольно допускать ошибки. Имеющая хороший дизайн экранная форма гораздо легче воспринимается пользователем, в результате ошибок при вводе данных становится меньше. 2. Обеспечение точности ввода данных. Можно добавить коды, которые обеспечат размещение каждого элемента вводимых данных в требуемой ячейке рабочего листа. При ручном вводе данных вероятность возникновения подобного рода ошибок гораздо выше.
3. проверка корректности данных. Коды экранной формы могут проверять корректность вводимых данных. Например, можно добавить код, который выполнит проверку, является ли введенное значение почтовым индексом (в США он должен состоять ровно из пяти цифр; индекс нового образца состоит из девяти цифр, разделенных дефисом). В некоторых случаях некорректность данных гораздо проще обнаружить в момент их ввода, чем позднее, в процессе их обработки. Сценарий нашего проекта заключается в следующем. Рабочая книга Адреса .xls используется для хранения информации о группе людей (имя и адрес). Рабочий лист, в котором располагаются данные, также называется Адреса, в нем изначально содержатся заголовки столбцов для различных элементов данных (рис. 22.1). Для удобства предположим, что все адреса американские. 'ВШх 10 $^ Д1рэвка Вид^ Вешка форгзат (^ис Дзнкые^Окно OipsBKa В2 ^ "^ \^ Фамилия 1 ± 8 . -С" ]■■ Р- 1 . Е--1'' G __Т Имя [Фамилия [Адрес Город Штат Иидн«с И '< ► ■мКмр«са/Лист2/Л1^|/'"':11] Готово NUM Рис. 22.1. Так выглядит рабочий лист Адреса В ходе выполнения программа решает следующие задачи. 1. Делает активным рабочий лист Адреса. 2. Находит первую пустую строку, в которую могут быть записаны данные. В рабочей книге уже могут содержаться некоторые данные, она также может быть пустой (рис. 22.1). 3. Отображает экранную форму, которая позволяет пользователю ввести данные для одного человека. 4. Продолжает отображать экранную форму, пока не будут введены все данные. 5. Сохраняет рабочую книгу и закрывает программу. Экранная форма должна иметь следующие характеристики. • Элементы управления TextBox для ввода имени, фамилии, адреса, города и почтового индекса, состоящего из пяти цифр. • Элемент управления ListBox для выбора штата США. • Командную кнопку Далее, щелчок на которой позволит сохранить рабочий лист и повторно отобразит форму для ввода информации о другом человеке. 298 Часть V. Воскресенье. Утро
э • Командную кнопку Готово, щелчок на которой позволит сохранить введенные данные, сохранить рабочую книгу и закрыть форму. • Командную кнопку Отмена, щелчок на которой сопровождается игнорированием добавляемых данных и закрытием формы. • Экранная форма должна выполнять проверку на предмет заполнения данными всех полей экранной формы. • Такая форма должна выполнять проверку правильности ввода почтового индекса. Шаг 1: создание рабочей книги Вначале необходимо создать рабочую книгу Адреса. Для этого выполните пере- ?o*wHw» численные ниже действия. 1. Запустите Excel, чтобы открыть новую пустую рабочую книгу. 2. Переименуйте лист Лист1 в Адреса: дважды щелкните мышью на корешке этого рабочего листа и наберите новое имя. 3. Введите заголовки столбцов, как показано на рис. 22.1. Можете изменить формат отображения заголовков по своему усмотрению, однако они обязательно должны находиться в ячейках А2 : F2. 4. Сохраните рабочую книгу, присвоив ей название Адреса. На этом этап создания шаблона рабочей книги будет завершен. Теперь можно переходить к проектированию экранной формы. Шаг 2: проектирование формы Чтобы создать новую пустую экранную форму и определить ее характеристики, выполните следующие действия. 1. Нажмите клавиши <Alt-(-Fl 1>, чтобы открыть редактор VBA. 2. В окне Project щелкните на пункте VBAProject (Адреса). 3. Выберите команду lnsert=>UserForm (Вставить=>Экранная форма), чтобы добавить к проекту новую экранную форму. 4. В окне Properties свойству Name экранной формы присвойте значение f rmAddresses, а свойству Caption — значение Ввод адресов. В результате выполнения перечисленных ниже действий будут добавлены текстовые поля для ввода данных, комбинированный список для выбора штата США, командные кнопки для выполнения требуемых команд и надписи, указывающие назначение всех текстовых полей и комбинированного списка. 1. Добавьте к форме элемент управления Text Box, присвойте его свойству Name значение txtFirstName. 2. Поместите рядом с этим текстовым полем надпись Label и присвойте ее свойству Caption значение Имя:. 3. Добавьте к форме еще четыре текстовых поля и присвойте их свойствам Name значения txtLastName, txtAddress, txtCity, txtZip. 4. Рядом с каждым из этих четырех полей разместите надписи и присвойте их свойствам Caption следующие значения: Фамилия:, Адрес:, Город:, Индекс:. Урок 22. Пример экранной формы 299
5. Добавьте к форме элемент управления ComboBox и присвойте его свойству Name значение cmbStates. Присвойте свойству Style этого комбинированного списка значение f mStyleDropDownList. 6. Разместите рядом со списком надпись Label, присвоив ее свойству Caption значение Штат:. 7. Добавьте к форме элемент управления CommandButton. Присвойте его свойству Name значение cmbDone, а свойству Caption — значение Готово. 8. Добавьте еще одну командную кнопку CommandButton, присвоив ее свойству Name значение cmdNext, свойству Caption — значение Далее и свойству Default — значение True. 9. Добавьте к форме третью командную кнопку. Присвойте ее свойству Name значение cmdCancel, свойству Caption— значение Отмена, свойству Cancel — значение True. Теперь в окне формы присутствуют все необходимые элементы управления. Используйте команды форматирования и инструменты редактора форм, чтобы выровнять расположение элементов управления и определить их размеры. Готовая форма должна быть подобна той, которая показана на рис. 22.2. Рис. 22.2. Внешний вид формы после добавления всех элементов управления Теперь, когда к форме добавлены все элементы управления, можно определить порядок их обхода. Вначале должны быть отображены шесть полей для ввода данных, за ними — три командные кнопки. Шаг 3: написание кода инициализации формы Код инициализации формы выполняет только одно действие: загружает список ComboBox с аббревиатурами всех штатов США. Для краткости в этом примере в список будут включены аббревиатуры только некоторых штатов; конечно же, при создании настоящего приложения в список ComboBox следовало бы включить аббревиатуры всех штатов. Далее описана процедура добавления кода инициализации. 1. Щелкните на кнопке View Code окна Project, чтобы открыть окно редактора кодов для экранной формы. 2. Из списка в левой верхней части окна выберите вариант UserForm. 300 Часть V. Воскресенье. Утро
3. Из списка в правой верхней части окна выберите вариант Initialize. 4. Наберите код листинга 22.1 в теле процедуры события Initialize. Листинг 22.1. Код инициализации экранной формы, с помощью которого в список СотЬоВох загружаются аббревиатуры штатов Private Sub UserForm_Initialize() ' Загружает комбинированный список с аббревиатурами штатов cmbStates.Addltem "АЛ" cmbStates.Addltem "АР" cmbStates.Addltem "КА" cmbStates.Addltem "КО" cmbStates.Addltem "ФЛ" cmbStates.Addltem "ЛА" cmbStates.Addltem "МД" cmbStates.Addltem "НК" cmbStates.Addltem "НИ" cmbStates.Addltem "ВВ" End Sub Шаг 4: проверка корректности почтового индекса Создаваемый проект можно усовершенствовать, добавив ограничение на ввод в поле почтового индекса только тех значений, которые состоят из цифр. Подобное ограничение можно рассматривать как метод проверки корректности вводимых данных. Чтобы не проверять данные после их ввода пользователем (как это будет сделано для некоторых других полей на следующем niare), целесообразнее изначально запретить вводить некорректных значений. Чтобы оценить вводимые с клавиатуры данные прежде, чем они достигнут элемента управления, воспользуйтесь событием KeyDown. Как вы уже знаете из урока 21, это событие получает значение аргумента, соответствующее нажатой клавише. Если нажата допустимая клавиша, информация передается далее к элементу управления; в противном случае нажатие клавиши игнорируется. В справочной системе VBA представлена таблица значений KeyCode, из которой следует, что клавишам 0-9 соответствуют коды 48-57. Следовательно, если процедура обработки события KeyDown получает для аргумента KeyCode значение, находящееся в диапазоне 48-57, это свидетельствует о нажатии цифровой клавиши. Такую информацию можно передать далее к элементу управления. Нажатие всех остальных клавиш должно игнорироваться. Вы можете установить ограничение на ввод в текстовом поле txtzip не более пяти символов, присвоив его свойству MaxLength соответствующее значение (в данном примере такие установки не производились). Чтобы добавить код, выполняющий проверку на корректность вводимых значений, откройте для формы окно редактора кодов, после чего добавьте для элемента управления txtZip процедуру обработки события KeyDown. В теле процедуры наберите код, показанный в листинге 22.2. Обратите внимание на исполь- Урок 22. Пример экранной формы 301
зование оператора Веер, благодаря которому при нажатии неправильной клавиши система издает звуковой сигнал. Листинг 22.2. Процедура обработки события KeyDown позволяет вводить в текстовом поле TextBox только цифровые значения Private Sub txtZip_KeyDown(ByVal KeyCode As_ MSForms.Returnlnteger, _ ByVal Shift As Integer) If KeyCode < 48 Or KeyCode > 57 Then KeyCode = 0 Beep End If End Sub Как видно из листинга 22.2, в текстовом поле могут быть введены только цифры, набранные с основных клавиш, но не с боковой цифровой клавиатуры. Попробуйте в качестве упражнения изменить программу так, чтобы почтовый индекс можно было набирать и с цифровой клавиатуры. Шаг 5: добавление кодов, проверяющих корректность вводимых данных к программе необходимо добавить коды, которые после щелчка пользователем на кнопках Далее или Готово будут проверять корректность введенных данных. В частности, эти коды должны проверить, что: • заполнены поля Имя, Фамилия, Адрес и Город; • выбран штат; • в поле почтового индекса содержится пять символов (поскольку в момент набора значения в этом поле выполнялась проверка на ввод только цифровых символов; теперь достаточно проверить только количество введенных символов). Если проверка корректности набранных данных завершается успешно, эти данные вводятся в ячейки рабочего листа. Поля формы очищаются, и она снова отображается на экране для ввода следующего набора данных (если пользователь щелкнул на кнопке Далее) либо закрывается (если пользователь щелкнул на кнопке Готово). Таким образом, проверка корректности набранных данных должна выполняться после щелчка пользователем на кнопке Далее или Готово, а потому код, выполняющий такую проверку, необходимо набрать не в процедуре обработки события Click отдельной кнопки, а в вашей собственной процедуре. Таким образом, процедуру проверки корректности данных можно вызывать из процедур обработки события С1 ick одной и второй кнопки. Выполните перечисленные ниже действия, чтобы создать процедуру проверки корректности набранных данных. 1. Откройте окно редактора кодов экранной формы. 2. Выберите команду lnsertt=>Procedure (Вставить'=>Процедуру), чтобы открыть диалоговое окно Add Procedure (Добавить процедуру). 302 Часть V. Воскресенье. Утро
3. Наберите название процедуры ValidateData, а затем в поле Туре выберите вариант Function. 4. Щелкните на кнопке ОК. Коды, выполняющие проверку корректности данных, набраны в теле функции (а не процедуры), благодаря этому вызывающей программе может быть возвращено требуемое значение. В нашем случае при условии успешного завершения проверки функция возвращает значение True; если же набранные пользователем данные некорректны — значение False. Код функции, выполняющей проверку корректности набранных пользователем данных, приведен в листинге 22.3. Обратите внимание, что в первой строке кодов этой функции добавлен определитель As Boolean, указываюпдий, значение какого типа будет возвращаться функцией. Добавьте к своей программе код, представленный в этом листинге. Листинг 22.3. Функция проверки корректности набранных данных Public Function ValidateData() As Boolean ' Возвращает True, если набранные пользователем данные корректны • В противном случае возвращает FaJLse и сообщает о возникшей ' проблеме If txtFirstName.Value = "" Then MsgBox "Укажите имя" ValidateData = False Exit Function End If If txtLastName.Value = "" Then MsgBox "Укажите фамилию" ValidateData = False Exit Function End If If txtAddress.Value = "" Then MsgBox "Укажите адрес" ValidateData = False Exit Function End If If txtCity.Value = "" Then MsgBox "Укажите город" ValidateData = False Exit Function End If If cmbStates.Value = "" Then MsgBox "Выберите штат" ValidateData = False Exit Function End If If txtZip.TextLength <> 5 Then MsgBox "Почтовый индекс должен состоять из пяти цифр" ValidateData = False Exit Function End If ValidateData = True End Function Урок 22. Пример экранной формы 303
Шаг 6: окончание проекта Осталось 10 минут Для завершения этого проекта остается только написать процедуры обработки событий Click для трех элементов управления CommandButton. Вспомним, какие действия должны происходить после щелчка пользователем на этих командных кнопках. • После щелчка на кнопке Далее программа проверяет корректность набранных данных. Если данные корректны, то они вводятся в ячейки рабочего листа, а поля формы очищаются для ввода следующих данных. Если данные некорректны, они продолжают отображаться в полях формы, с тем чтобы пользователь мог их исправить. • После щелчка на кнопке Готово программа выполняет те же действия, что и после щелчка на кнопке Далее. Отличие состоит в следующем: если набранные пользователем данные корректны, форма после ввода данных в ячейки рабочего листа закрывается. • После щелчка на кнопке Отмена программа закрывает форму без сохранения набранных данных. Как видите, щелчок на кнопках Далее и Готово приводит к выполнению ряда подобных действий: осуществляется проверка корректности набранных пользователем данных и ввод их в ячейки рабочего листа. Если существует необходимость выполнения в различных ситуациях одной и той же задачи, программист должен выделить соответствующие коды в самостоятельную процедуру. Создав процедуру, которая сохраняет набранные в полях формы данные в ячейках рабочего листа, вы сможете вызывать ее из процедур обработки события С1 ick обоих кнопок — Готово и Далее. Следует также написать код для очистки полей экранной формы. Такие действия должны выполняться после щелчка пользователем на любой из трех кнопок — Далее, Отмена и Готово. Несмотря на то, что форма удаляется с экрана методом Hide, все данные, набранные в ее полях, сохраняются при следующем ее отображении. Поэтому перед вызовом метода Hide все поля формы необходимо очистить. Для этого достаточно присвоить свойству Value каждого элемента управления, соответствующего текстовому полю, значение пустой строки. Код для удаления набранных в полях формы будет помещен в тело процедуры Clear Form (листинг 22.4). Добавьте эту процедуру к своему проекту. Листинг 22,4. Процедура ClearForm, удаляющая все данные из полей формы Public Sub ClearFormO ' Удаляет все данные, набранные в полях формы txtPirstName.Value = "" txtLastName.Value = "" txtAddress.Value = "" txtCity.Value = "" txtZip.Value = "" cmbStates.Value = "" End Sub Чтобы перенести набранные в полях формы данные в ячейки рабочего листа, программа должна найти первую пустую строку, предназначенную для сохране- 304 Часть V. Воскресенье. Утро
ния вводимых значений. Вы знаете, что заголовок первого столбца расположен в ячейке А2. Следовательно, первая пустая строка должна начинаться с ячейки A3 либо с любой другой, расположенной под ней. Существует несколько способов нахождения первой пустой строки. В настоящем примере используется способ, описанный ниже. 1. Поиск начинается с ячейки А2. 2. Свойство CurrentRegion используется для получения диапазона, содержащего строку заголовков и все ранее сохраненные данные. 3. С помощью метода Offset осуществляется смещение на количество строк, содержащихся в исходном диапазоне. Этот новый диапазон должен находиться на одну строку ниже исходного и включать в себя шесть ячеек первой пустой строки, предназначенной для ввода данных. 4. Свойство Cells используется для получения доступа к отдельным ячейкам диапазона и сохранения в них набранных пользователем значений. Код процедуры EnterDatalnWorksheet показан в листинге 22.5. Добавьте эту процедуру к кодам экранной формы, используя уже знакомые приемы. Листинг 22.5. Процедура EnterDatalnWorksheet Public Sub EnterDatalnWorksheet Dim r As Range, rl As Range Set-r = Worksheets("Адреса").Range("A2").CurrentRegion Set rl = r.Offset(r.Rows.Count, 0) rl.Cells(1).Value = txtFirstName.Value rl.Cells(2).Value = txtLastName.Value rl.Cells(3).Value = txtAddress.Value rl.Cells{4).Value = txtCity.Value rl.Cells(5).Value = cmbStates.Value rl.Cells(6).Value = txtZip.Value End.Sub Итак, мы написали процедуру для сохранения набранных данных в ячейках рабочего листа. Для завершения проекта потребуется лишь создать процедуры обработки события Click для трех командных кнопок. Код этих процедур показан в листинге 22.6. Обратите внимание, что каждая из трех процедур вызывает ранее созданную процедуру Clear Form. Добавьте эти коды к кодам экранной формы, и проект будет готов к работе. Листинг 22.6. Процедуры обработки события Click для командных кнопок Private Sub cmdCancel_Click() ClearForm Me.Hide End Sub Private Sub cmdDone Click() Урок 22. Пример экранной формы 305
If ValidateData = True Then EnterDatalnWorksheet ClearForm Me.Hide End If End Sub Private Sub cmdNext_Click() If ValidateData = True Then EnterDatalnWorksheet ClearForm End If End Sub Шаг 7: тестирование проекта Если экранная форма открыта в редакторе VBA, то для тестирования созданного проекта следует нажать клавишу <F5>. Можно также написать макрос, который будет отображать форму на экране путем вызова метода Show. На рис. 22.3 показана программа в действии. Поработав с ней, вы обнаружите, что экранная форма существенно облегчает ввод данных, а это гораздо удобнее, чем вручную вводить значения непосредственно в ячейки рабочей книги. ^ $айл Qji^ca fi^ Фо{^т ОврЩ Данные £2кно ^праекд ШП Имя ! Фамилия Город ;Штат Инднес Джорж Смит -12 авеню Балтимор |МД 12345: Джулия jРоберте i Набережная, 123а Литл-Рок :АР 54321] Билли :Л1жоис ia/я 143 Сан-Сити |НК 56474^ В ,Н Т Адрес [:••■■" ■'••.-. . ^ ^- :; _/.-. .у • • *; Г •.. гИкя: :J '•\:-;(■;• >\;| "" /..-.;,• .••'; Ь^ «амнпи»;'ч..\',:\д. il ■^'':у--: • ;••■Aдpв<йr■^•..;^•^•i^:.•;;|( /. р гop<w:^•:v'•^ -.;-( :/fv 1 fmtBfi'ij^ ^ ^:: •••• («»#4«л 1% ;/^^3mi#:;^ 1' '■[ '^г^'Щрт-: \ ',. "Ubm'i'i Н .:'("'^"*^иКАдВ5а^1Ё?7Ж|^^7":' ■ш. _.:_] ;.:-:Ы: Рис. 22.3. Выполнение программы для ввода адресов 306 Часть V. Воскресенье. Утро
о Обзор В настоящем уроке были описаны все этапы создания реальной программы, вы- Готово! полняющей ВВОД данных посредством использования экранной формы. • Прежде чем приступить к написанию кодов программы, необходимо составить план реализации данного проекта. • Проверка корректности набираемых данных является важной частью любой программы, выполнение которой подразумевает ввод данных пользователем. • Проверку корректности вводимых данных можно осуществлять как в момент их набора пользователем, так и позднее, на этапе их обработки. • Если определенный код планируется использоваться в программе многократно, выделите его в отдельную процедуру. Проверьте себя Какие преимущества использования экранной формы для ввода данных вы можете назвать? (См. раздел "Планирование проекта".) Для чего создаются коды инициализации формы? (См. раздел "ШагЗ: написание кода инициализации формы".) В тело процедуры обработки какого события необходимо вставить коды, которые определяют ограничения на характер данных, набираемых в текстовом поле? (См. раздел "Шаг 4: проверка корректности почтового индекса".) Урок 22. Пример экранной формы 307
УРОК Обработка событий Содержание урока V Категории событий Excel V Создание процедур обработки событий ^ Включение и отключение событий V События на уровне рабочих книг, рабочих листов и приложений ^ Использование событий, не связанных с объектом События являются важной частью программирования в Excel. Некоторые сведения о событиях уже были представлены в уроке 21, в котором были описаны элементы управления экранных форм и отдельные события, на которые они могут зо"минут реагировать. Однако это лишь часть общей картины. Вы должны уметь эффективно использовать события Excel, чтобы разрабатывать интерактивные и удобные для конечного пользователя приложения. Категории событий События, на которые отвечает программа Excel, могут быть классифицированы двумя способами. В первом случае основой классификации является объект, который получает информацию о наступлении события: • события приложений; • события рабочих книг; • события рабочих листов; • события экранных форм и их элементов управления; • необъектные события.
Необъектные события — это специальная категория, к которой относятся события, не связанные с конкретным объектом. События для элементов управления экранных форм были рассмотрены в уроке 21. Второй способ классификации заключается в оценке действий, которые становятся причиной возникновения того или иного события. В этом случае все события могут быть разделены на три категории: , • события, возникающие исключительно как результат действий пользователя (например, после щелчка на элементе управления или после нажатия определенной клавиши); • события, которые могут быть вызваны действиями пользователя либо работой программы VBA (например, открытие рабочей книги или активизация диаграммы); • события, не имеющие отношения к действиям пользователя (например, наступление определенного момента времени — по системным часам). Предусмотренных в Excel событий должно быть достаточно для решения любой задачи, возникающей в процессе написания программ. Процедуры обработки событий Чтобы программа отреагировала на событие, необходимо добавить соответствующие коды в процедуру обработки данного события (event handler). Процедура обработки событий представляет собой процедуру VBA специального типа, которая автоматически выполняется при наступлении соответствующего ей события. Правило именования таких процедур строго определено: название процедуры обработки события записывается в форме ИмяОбъекта_ИмяСобытия. Например, элемент управления TextBox (Текстовое поле) может реагировать на событие Click; для текстового поля под названием txtАдрес процедура обработки события Click должна иметь название txtAflpec_Click. Соблюдение данного правила является обязательным условием, поскольку имя процедуры указывает программе, при наступлении какого события эта процедура должна выполняться. В большинстве случаев редактор VBA сам создает шаблон (состоящий из первой и последней строки) процедуры обработки события. Если окно редактора кодов открыто, в верхней его части отображается два выпадающих списка (рис. 23.1). В списке объектов (в верхней левой части окна) содержатся названия объектов, для которых можно создать код обработки события. В списке событий (верхняя правая часть окна) перечислены события, на которые может реагировать объект, выбранный в левом списке. При выборе события в окне редактора кодов будет автоматически добавлен шаблон процедуры обработки данного события. Вы можете самостоятельно набрать эти коды, однако возможность их автоматического ввода позволит вам сэкономить свое время и уменьшить вероятность возникновения ошибок. Если в программу не добавлена процедура обработки того или иного события либо соответствующая процедура события не содержит кодов. Excel игнорирует факт возникновения данного события. 310 Часть V. Воскресенье. Утро
Список объектов Список событий Private Sub TextBoxl_Change() End Sub №iJJ 2Ы Puc. 23.1. Автоматическое добавление шаблона процедуры обработки события в окне редактора кодов Где именно в программе необходимо располагать коды процедуры обработки событий? Если коды процедуры будут размещены в неверном месте, программа не отреагирует на данное событие, даже если сама процедура названа правильно. В следующих разделах подробно рассказывается о том, где именно следует размещать коды обработки тех или иных событий, а пока примите к сведению некоторые общие правила. • Процедуры обработки событий, относящиеся к экранной форме (и к ее элементам управления) всегда должны располагаться в модуле этой экранной формы. • Процедуры обработки событий, относящиеся к рабочей книге, рабочему листу или к диаграмме всегда должны размещаться в проекте, соответствующем данной рабочей книге. • Если названия объекта и события отображаются в соответствующих списках в верхней части окна редактора кодов, процедуру обработки события можно поместить в текущем модуле. • Никогда не помещайте процедуры обработки событий в модуле кодов (эти модули проекта перечислены в узле Modules в окне Project). Последовательности событий Работая с событиями, необходимо иметь в виду, что некоторые действия становятся причиной возникновения сразу нескольких событий в Excel. Эти несколько событий происходят в определенном порядке. В некоторых ситуациях необходимо учитывать данный порядок, чтобы правильно определить, какую из процедур следует использовать в программе. Приведем пример: добавление в рабочую книгу нового рабочего листа становится причиной возникновения трех событий на уровне приложения, следующих в таком порядке: Урок 23. Обработка событий 311
• событие WorkbookNewSheet возникает при добавлении нового рабочего листа; • событие SheetDeactivate возникает, когда предыдущий активный лист перестает быть активным; • событие Sheet Activate возникает, когда активным становится новый рабочий лист. Аналогичная ситуация происходит, когда пользователь щелкает на элементе управления в окне формы: при этом поочередно возникают события MouseDown, MouseUp и Click. Добавив в процедуру обработки событий оператор Debug.Print, вы сможете определить также порядок возникновения данных событий. Осталось 20 минут Включение и отключение событий По умолчанию в Excel все события активны. Большинство событий можно отключить, присвоив свойству EnableEvents объекта Application значение False. В результате будут отключены все события, кроме событий экранной формы и расположенных на ней элементов управления. В каком случае следует отключать события? Такая необходимость возникает, когда коды в процедуре обработки события, прямо или косвенно, приводят к повторному вызову этого же события. Рассмотрим пример. Событие Worksheet_Change возникает при каждом изменении данных на рабочем листе. Это событие можно использовать для проверки корректности введенных данных. Например, с его помощью можно проверить, принадлежит ли новое значение, введенное в определенной ячейке, указанному диапазону. Если значение находится за пределами этого диапазона, программа отображает на экране соответствующее сообщение и очищает ячейку, чтобы пользователь мог набрать в ней новые данные. Проблема состоит в следующем: вследствие очистки ячейки вновь возникает событие Work- sheet_Change, в результате чего порождается бесконечный цикл событий Work- sheet_Change. Чтобы избежать этой проблемы, измените код в процедуре обработки события так, чтобы выполнялись следующие действия: • свойству EnableEvents присваивалось значение False; • очищалась ячейка рабочего листа; • свойству Enabl eEvents вновь присваивалось значение True. Поскольку свойство EnableEvents принадлежит объекту Application, оно распространяется на все открытые рабочие книги. Выборочно отключить события только для определенной книги невозможно. События рабочих книг в Excel предусмотрено несколько событий, возникающих на уровне рабочей книги. Наиболее часто используемые из них приведены в табл. 23.1. Чтобы приступить к работе с событиями, возникающими на уровне рабочей книги, откройте в проекте модуль ЭтаКнига. Выберите Workbook в списке объектов; в списке событий будут содержаться названия всех перечисленных в табл. 23.1 событий, а также некоторых других. В следующих подразделах подробнее рассматриваются наиболее часто используемые события, представленные в этом списке. 312 Часть V. Воскресенье. Утро
Таблица 23.1. События, возникающие на уровне рабочей книги Событие Когда происходит Activate BeforeClose BeforePrint BeforeSave Deactivate NewSheet Open SheetActivate SheetChange SheetDeactivate .SheetSelectionChange Рабочая книга становится активной Перед закрытием рабочей книги Перед выводом на печать всей рабочей книги или ее части Перед сохранением рабочей книги Рабочая книга перестает быть активной При создании нового рабочего листа При открытии рабочей книги Любой лист рабочей книги становится активным Содержимое любого листа рабочей книги изменяется вследствие действий пользователя или в ходе выполнения программы Лист рабочей книги перестает быть активным Изменяется выделенная область любого рабочего листа Событие Open Open является наиболее широко используемым событием, возникающем на уровне рабочей книги. Оно происходит при открытии рабочей книги и может быть применено для выполнения самых разнообразных задач, некоторые из которых перечислены ниже. • Открытие других рабочих книг. • Переход к требуемому рабочему листу. • Настройка пользовательских панелей инструментов. • Отображение сообщений с приветствием, напоминанием или инструкцией по использованию программы. Обратите внимание на следующее: если в момент открытия книги пользователь удерживает нажатой клавишу <Shift>, событие Open не активизируется. Параметры защиты данных, выбранные в Excel могут инициировать запрет на выполнение макросов. Дополнительная информация о безопасном использовании макросов представлена в уроке 24. Процедура обработки события, код которой представлен в листинге 23.1, является примером использования события Open для выполнения еженедельного резервного копирования рабочей книги. В момент открытия рабочей книги процедура обработки события Open проверяет текущий день недели и, если это пятница, выполняет резервное копирование. В данном случае для создания резервной копии рабочей книги используется метод SaveCopyAs, сохраняющий создаваемый файл на сетевом диске. В этом примере сетевым диском является диск G. Листинг 23.1. Использование процедуры обработки события Open для еженедельного резервного копирования рабочей книги Private Sub Workbook_Open() ' Если сегодня пятница, на сетевом диске создается резервная копия ' рабочей книги Урок 23. Обработка событий 313
If Weekday(Now) = vbFriday Then ThisWorkbook.SaveCopyAs "g:\backups\" & ThisWorkbook.Name End If End Sub Для создания резервной копии можно было бы также использовать процедуру обработки события Workbook_Close. В таком случае в резервной копии будут сохраняться последние изменения, внесенные в рабочую книгу. Событие NewSheet Событие NewSheet возникает при добавлении в книгу нового рабочего листа. Процедура обработки этого события в качестве аргумента получает значение, указывающее на новый рабочий лист. Сама процедура имеет следуюпдий синтаксис: Private Sub Workbook_NewSheet(ByVal sh As Object) End Sub В теле процедуры ссылка на новый рабочий лист может использоваться для выполнения различных действий (например, для вставки в требуемые ячейки рабочего листа заголовков строк и столбцов будущей таблицы). В показаниям ниже примере процедура обработки события NewSheet применяется для отображения окна, в котором пользователь может указать название нового рабочего листа, после чего введенное название присваивается свойству Name данного листа. Благодаря этой процедуре новым рабочим листам не будут присваиваться названия, принятые по умолчанию. Код процедуры показан в листинге 23.2. Листинг 23,2, Использование события NewSheet для отображения окна с предложением указать название добавляемого рабочего листа Private Sub Workbook_NewSheet(ByVal Sh As Object) Dim sheetname as String Do sheetname = InputBox("Введите название нового рабочего листа") Loop Until sheetname о "" sh.Name = sheetname End Sub События рабдчих листов События, возникающие на уровне рабочего листа, представлены в табл. 23.2. Таблица 23,2, Часто используемые события рабочих листов Событие Когда происходит Activate Рабочий лист становится активным Calculate Выполняется пересчет формул рабочего листа Change Изменяются данные рабочего листа Deactivate Рабочий лист перестает быть активным SelectionChange Изменяется выделенная область на рабочем листе 314 Часть V. Воскресенье. Утро
Процедуры обработки событий, вoзникaюп^иx на уровне рабочих листов, должны быть помещены в модуль соответствующего рабочего листа. Чтобы добавить в него п1аблон процедуры обработки события, выберите вариант Worksheet из списка объектов, расположенного в верхнем левом углу окна редактора кодов. После этого в списке событий справа укажите требуемое событие. Событие Change Событие Change возникает вследствие изменения содержимого ячеек рабочего листа. Такие изменения могут быть вызваны действиями пользователя, а могут быть внесены в ходе выполнения программы VBA. Однако не все изменения инициируют возникновение события Change. Обратите внимание на следующие моменты: • изменение комментариев не приводит к возникновению события Change; • событие Change не возникает вследствие изменения формата ячеек (но в то же время выбор команды Правка'=>Очистить'=>Форматы приводит к появлению этого события); • если нажать клавишу <Delete> для удаления содержимого ячеек, событие Change возникнет даже в том случае, если сами ячейки изначально были пусты; • выбор некоторых команд Excel сопровождается возникновением события Change (например Сервис=>Орфография), тогда как при выборе других это событие не возникает (например, Данные'=>Сортировка). Событие Change можно использовать для отслеживания изменений, вносимых в содержимое рабочего листа. Однако в Excel предусмотрена команда Сервис'=>Исправления, которая прекрасно справляется с задачей отслеживания вносимых в рабочий лист изменений. Таким образом, отпадает необходимость в программировании. Тем не менее, если речь идет о проверке корректности данных, событие Change становится действительно полезным инструментом. Несмотря на то, что в Excel реализована встроенная возможность проверки корректности данных, она имеет некоторые ограничения, которые решаются путем использования события Change (см. следующий пример). Использование события Change для проверки корректности данных в этом примере мы снова вернемся к листу с таблицей вычисления суммы выплат по кредиту, который был рассмотрен в уроке 14. В этой таблице пользователь указывает сумму кредита, размер процентной ставки и срок погашения кредита. На основании этих значений программа вычисляет сумму ежемес51чных выплат по данному кредиту. Этот проект можно усовершенствовать, добавив проверку корректности значения, которое вводится пользователем в поле процентной ставки. Размер процентной ставки по кредиту обычно находится в некотором ограниченном диапазоне. Например, размер процентной ставкой по кредиту колеблется в пределах 2-10%, тогда как ставка в размере 50% практически никогда не используется. Цель вносимых на данном этапе изменений — проверка корректности значения, введенного пользователем в ячейке Годовая процентная ставка. При каждом изменении содержимого этой ячейки программа должна проверять, принадлежит ли новое значение диапазону 2-10%. Если данное ограничение не выполняется, программа отображает для пользователя сообщение с предложением повторить ввод значения процентной ставки по кредиту. Таблица вычисления суммы выплат по кредиту показана на рис. 23.2. Размер процентной ставки указывается в ячейке С5. Урок 23. Обработка событий 315
шшсгШ^тшщщ^' ШЩШЩ^' ЩЛ файл Правка Вид Вставка Формат Сервис Данные ^кно Справка ^ - «9 х D ^ У d: ^ #Г4 *^- г^ %| а-<^ ^ - - -<i^ s . й1 ^i ш% 100% -®. ж : С4 ▼ >S^ в с;- 2 i ; 3 : / ■ 4 ..^ ' 5 ^ 6 , ' 7 ^ 8 '■ 9 ; , 10 " 11 12' 1з": 14 is; N ^ ► И:\вь1плать1 ПО кредиту/Лист2/Лиа(5 J Готово ЛГ\ NUM Рис. 23.2. Таблица вычисления суммы выплат по кредиту Если вы не сохранили рабочий лист с таблицей вычисления суммы выплат по кредиту, вернитесь к уроку 14 и запустите программу, код которой представлен в листинге 14.2. В результате выполнения этой программы рабочий лист с указанной таблицей будет создан вновь. Процедура обработки события Change в качестве аргумента получает объект Range, указывающий на диапазон ячеек, в которые были внесены изменения. Программа проверяет свойство Address данного объекта Range и определяет, какая именно ячейка была изменена. Если изменялась ячейка С5, то это свойство возвращает значение $С$5. В результате остается просто проверить значение данной ячейки. Если оно выходит за пределы требуемого диапазона, на экране отображается соответствующее сообщение и ячейка выделяется. •Чтобы добавить в программу код выполнения проверки корректности введенных данных, следуйте приведенным ниже рекомендациям. 1. Откройте лист, содержащий таблицу для вычисления суммы выплат по кредиту. 2. Нажмите клавиши <Alt+Fll>, чтобы открыть редактор VBA. 3. В окне Project дважды щелкните на элементе Лист1 (Выплаты по кредиту), чтобы открыть окно редактора кодов для данного рабочего листа. 4. В верхней части окна редактора кодов объектов выберите вариант Worksheet, а в списке событий — вариант Change. 5. В тело процедуры обработки события Worksheet_Change добавьте код, показанный в листинге 23.3. 316 Часть V. Воскресенье. Утро
Листинг 233. Программа проверки корректности значения процентной ставки по кредиту Private Sub Wor}csheet_Change (ByVal Target As Range) With Target If .Address = "$C$5" Then If .value < 0.02 Or .Value < 0.1 Then MsgBox "Пожалуйста, проверьте значение процентной ставки" .Select End If End If End With End Sub После добавления этого кода, вернитесь к рабочему листу и введите новые данные. Если вы укажете процентную ставку на уровне менее 2% (значение О . 02) или более 10% (значение 0.10), на экране появится предупреждающее сообщение, показанное на рис. 23.3. S Microsoft Excel - Нредитный.. наяькулятор ' ' ^ ^ "" ^ (JQQ 'в !$айл Правка бид Вставка Формат С^ис Данные Окно р1равка . ff х i* 2:^i[i5[ii|l^ 100% -.©J ж F Т Готово Невыплаты по 1федиту/Лист2/Лиа|^ 1 ^^ NUM А Рис. 23.3. Проверка корректности размера процентной ставки События приложения Область действия событий на уровне приложения не ограничена какой-то одной рабочей книгой или одним рабочим листом, она распространяется на все рабочие книги данного проекта. Наиболее часто используемые события этого уровня представлены в табл. 23.3. Урок 23. Обработка событий 317
Таблица 23.3. Часто используемые события, возникающие на уровне приложений Событие Когда происходит NewWorkbook Создание новой рабочей книги Sheet Activate Рабочий лист становится активным Sheet Change Рабочий лист изменяется (пользователем или в программе) SheetDeactivate Рабочий лист перестает быть активным WorkbookActivate Рабочая книга становится активной WorkbookBef oreClose Перед закрытием рабочей книги WorkbookDeactivate Рабочая книга перестает быть активной WorkbookNewSheet В рабочую книгу добавляется новый рабочий лист Обратите внимание, что некоторые из этих событий возникают также на уровне рабочей книги или рабочего листа. Например, когда рабочая книга становится активной, возникает событие Application.WorkbookActivate, а процедура его обработки в качестве аргумента получает ссылку на данную рабочую книгу. Далее запускается событие Activate данной рабочей книги. Поскольку процедура обработки второго события имеет непосредственное отношение к конкретной рабочей книге (к той, которая только что стала активной), нет необходимости передавать ей в качестве аргумента ссылку на эту книгу. Какое из этих двух событий — глобальное на уровне приложения или локальное на уровне рабочей книги — использовать в программе, зависит только от целей написания программы и от задачи, которую должна решать вызываемая процедура обработки события. Создание процедур обработки событий на уровне приложения Написание процедур обработки событий, возникающих на уровне приложения, требует специальных навыков программирования. Поскольку все модули проекта VBA соответствуют либо конкретной рабочей книге, либо конкретному рабочему листу, то вы не можете использовать их для написания кодов, действие которых должно распространяться на все приложение Excel. Чтобы добавить такие коды, выполните следующее. 1. Выберите команду lnsertf=t>Class Module (Вставить==С>Модуль класса), чтобы добавить к форме новый модуль класса. 2. Если хотите, можете вместо принятого по умолчанию значения Class 1 присвоить свойству Name модуля класса другое значение (например, AppEvents). 3. В окне редактора кодов нового модуля добавьте следующую строку (вы можете заменить название AppEvents любым другим подходящим для вас названием, допустимым в языке VBA): Public WithEvents xlApp As Application 4. Выберите команду lnsert'=^Module (Вставить'=>Модуль), чтобы добавить в проект новый программный модуль, либо откройте уже существующий модуль. 5. На уровне модуля (вне тела всех процедур) добавьте следующую строку кода. Вы можете заменить XL любым другим допустимым в языке VBA названием. Вместо AppEvents используйте имя, присвоенное модулю класса в п. 2. Dim XL As New AppEvents 318 Часть V. Воскресенье. Утро
6. Свяжите объявленный объект с существующим объектом Application. Этот фрагмент кода можно поместить в любом модуле, но обычно он находится в теле процедуры обработки события Workbook_Open модуля ЭтаКнига: Set XL.xlApp = Application 7. Вернитесь к модулю класса, чтобы создать необходимые процедуры обработки событий, возникающих на уровне приложения. Если из расположенного в верхнем левом углу окна редактора кодов выбрать название созданного объекта (в данном примере — xlApp), в списке событий справа будет отображаться перечень всех возможных событий, предусмотренных для объекта Аррlication. В следующем примере продемонстрированы этапы использования процедуры обработки события, возникающего на уровне приложения. э Событие WorkbookBeforeClose в данном примере событие WorkbookBeforeClose используется для отображения ??мш1>то ^^ экране вопроса, адресуемого пользователю, при закрытии рабочей книги. Процедура обработки события WorkbookBeforeClose имеет следующий синтаксис: Private Sub o6be2<:T_WorkbookBef oreClose (ByVal Wb As Workbook, __ Cancel As Boolean) Когда возникает событие WorkbookBeforeClose и вызывается процедура его обработки, аргументу Wb передается ссылка на закрываемую рабочую книгу. Если аргументу Cancel передается значение True, книга не закрывается. Таким образом, эту процедуру вполне можно использовать для добавления в нее кода, отображающего запрос о подтверждении пользователем необходимости закрытия рабочей книги. 1. Откройте уже существующую рабочую книгу, которую хотите использовать с этим проектом, либо создайте новую. 2. Нажмите клавиши <Alt-l-Fll>, чтобы открыть редактор VBA. 3. Выберите команду lnsert'=t>Class Module, чтобы добавить в проект новый модуль класса. Присвойте его свойству Name значение AppEvents. 4. В теле модуля класса добавьте такую строку кода: Public WithEvents xlApp As Application 5. Выполните команду lnsert«=>Module, чтобы добавить в проект новый программный модуль, либо используйте уже существующий модуль. 6. На уровне модуля (вне тела всех процедур) добавьте следующую строку кода: Public XL As AppEvents 7. Дважды щелкните на узле ЭтаКнига, чтобы открыть окно редактора кодов для данной рабочей книги. 8. Вставьте процедуру обработки события Open для объекта Workbook, после чего добавьте в тело этой процедуры следующую строку кода: Set XL.xlApp = Application 9. Вернитесь к окну редактора кодов модуля класса. 10. Вставьте процедуру обработки события WorkbookBeforeClose для объекта х1 Арр. 11. В теле этой процедуры наберите код, представленный в листинге 23.4. Урок 23. Обработка событий 319
Листинг 23Л. Процедура обработки события WorkbookBeforeClose запрашивает подтверждение о необходимости закрытия рабочей книги Private Sub xlApp_Work±)ookBeforeClose(ByVal Wb As Workbook, Cancel_ As Boolean) Dim reply As Integer ' reply = MsgBox("Закрыть" & Wb.Name & "?", vbYesNo) If reply = vbNo Then Cancel = True End If End Sub Выполнив описанные выше действия, закройте рабочую книгу, после чего снова откройте ее. Данное действие необходимо, поскольку значительная часть кодов расположена в теле процедуры обработки события Open данной рабочей книги, и эти коды выполняются только в момент открытия рабочей книги. На этом этапе вы можете открыть и попробовать закрыть любую другую рабочую книгу либо попытайтесь закрыть книгу, с которой работали вначале. На экране будет отображено диалоговое окно с предложением подтвердить необходимость закрытия рабочей книги. 1. Рабочая книга содержит класс под названием AppEvents. В этот класс включена переменная xlApp типа Application— другими словами, переменная может содержать ссылку на само приложение Excel. 2. В кодах модуля объявлена переменная XL, которая ссылается на новый экземпляр класса AppEvents. Это означает, что объект AppEvents действительно существует, равно как и переменная xlApp (см. п. 1). 3. При открытии исходной рабочей книги (содержапдей данную программу) вызывается созданная для нее процедура обработки события Open. В кодах этой процедуры переменной xlApp присваивается ссылка на объект Application. На данном этапе переменная xlApp будет ссылаться на работающее приложение Excel. 4. При попытке закрыть рабочую книгу возникает событие WorkbookBeforeClose и запускается соответствующая процедура его обработки. Фрагмент xlApp в названии этой процедуры указывает на приложение Excel (см. п. 3), а остальная часть -— на само событие. Пока исходная рабочая книга открыта, попытка закрыть любую другую рабочую книгу будет сопровождаться отображением запроса о подтверждении необходимости закрытия. Другие события В завершение мы рассмотрим события, не относящиеся к какому-то конкретному объекту. Существует два таких события: OnTime и ОпКеу. Событие OnTime Событие OnTime возникает, когда наступает заданное время суток. Чтобы определить событие OnTime, используйте метод OnTime объекта Application: OnTime(EarliestTime, Procedure, LatestTime, Schedule) 320 Часть V. Воскресенье. Утро
• EarliestTime— обязательный аргумент, определяющий время возникновения данного события. • Procedure — обязательный аргумент, который определяет название процедуры, запускаемой в результате возникновения данного события. Эта процедура должна находиться в модуле программы. • LatestTime— необязательный аргумент, определяющий самое позднее время, когда может возникнуть данное событие. • Schedulе — необязательный аргумент, принимающий значения True/False. При выборе значения True (используется по умолчанию) назначается новое событие; при выборе значения False ранее назначенное событие удаляется. Аргумент LatestTime используется по той причине, что Excel инициирует событие OnTime только в режиме Ready. Если в тот момент, когда должно произойти событие OnTime, выполняется другая процедура, то процедура обработки события OnTime откладывается до окончания работы текущей процедуры. Если аргумент LatestTime не указан. Excel ожидает столько, сколько необходимо, после чего запускает процедуру обработки события OnTime. Если же этот аргумент задан, Excel ждет только до указанного времени, после наступления которого процедура обработки события OnTime не запускается. В следующей строке Excel получает указание запустить определенную процедуру в 17:00: Application.OnTime TimeValue("5:ООРМ"), "НекотораяПроцедура" В этом фрагменте отменяется событие, определенное выше: Application.OnTime TimeValue("5:ООРМ"), "НекотораяПроцедура", , False В следующей строке указано, что процедура должна быть запущена через 10 минут после текущего момента: Application.OnTime Now + TimeValue("00:10:00"), "НекотораяПроцедура" Приведенная ниже программа является примером использования этого события. Данная программа напоминает сотрудникам о необходимости сделать перерыв на кофе в 10 часов утра и в 3 часа дня. Вы можете создать этот проект в любой рабочей книге, выполнив следующие действия. 1. Откройте рабочую книгу, затем откройте редактор VBA. 2. Откройте окно редактора кодов для модуля ЭтаКнига. 3. Вставьте код из листинга 23.5 в процедуру события Workbook_Open. 4. Откройте программный модуль для данной рабочей книги или, если это необходимо, создайте новый модуль (команда lnsert'=>Module). 5. В теле процедуры наберите код, показанный в листинге 23.6. Листинг 23.5. Код процедуры обработки события WorkbookJOpen Private Sub WorkbookJOpen() Application.OnTime TimeValue("10:00AM"), "BreakReminder" Application.OnTime TimeValue("3:00PM"), "BreakReminder" End Sub Урок 23. Обработка событий 321
Листинг 23.6. Процедура BreakReminder запускается в 10 часов утра и 3 часа дня Public Sub BreakReminder() MsgBox "Время пить кофе!" End Sub После создания этого проекта сохраните и закройте рабочую книгу, затем снова откройте ее, чтобы сработала процедура обработки события Workbook_Open. В указанное время (сверяемое по системным часам) на экране будет отображено сообщение с напоминанием о необходимости сделать перерыв в работе. Событие ОпКеу Событие ОпКеу возникает при нажатии определенной клавиши (или комбинации клавиш); оно может реагировать на любые комбинации клавиш Excel. Это событие имеет более высокий приоритет по отношению к событиям, относящимся к элементам управления экранных форм и возникающим в результате нажатия клавиш (например, событие KeyDown). Вы можете создать процедуру обработки события ОпКеу, которая будет выполняться при нажатии пользователем определенной клавиши или комбинации клавиш. Для этого используйте метод ОпКеу объекта Appl icat ion: Appl i cat ion. ОпКеу (А:еу, Procedure) Здесь key — это клавиша или комбинация клавиш, нажатие на которых должно генерировать событие ОпКеу, а Procedure — это название процедуры, которая должна выполняться вследствие возникновения такого события. Аргумент key передает значение в виде строки, формируемой следующим образом. • Чтобы указать клавишу буквы или другого символа, используется этот символ. • Для представления прочих клавиш применяются коды, приведенные в табл. 23.4. • Чтобы указать комбинацию клавиш, перед кодом обычной клавиши наберите символ + (для представления клавиши <Shif t>), ^ (для представления клавиши <Ctrl>) и символ / либо % (для представления клавиши <Alt>). Таблица 23.4. Коды клавиш для метода ОпКеу Клавиша ^ Код BACKS РАСЕ {BACKS РАСЕ} или {BS} BREAK {BREAK} CAPS LOCK {CAPSLOCK} CLEAR {CLEAR} DELETE ИЛИ DEL {DELETE} ИЛИ {DEL} END {END} ENTER (на цифровой клавиатуре) {ENTER} ENTER -- (тильда) ESC {ESCAPE} ИЛИ { ESC} 322 Часть V. Воскресенье. Утро
Окончание табл. 23.4 Клавиша Код HELP НОМЕ INS NUM LOCK PAGE DOWN PAGE UP RETURN SCROLL LOCK TAB ОтР1доР15 Стрелка вверх Стрелка вниз Стрелка влево Стрелка вправо {HELP} {HOME} {INSERT} {NUMLOCK} {PGDN} {PGUP} {RETURN} {SCROLLLOCK} {TAB} От {Fl} ДО {F15} {UP} {DOWN} {LEFT} {RIGHT} В следующей строке указывается, что при нажатии пользователем клавиш <CtrH-B> должна выполняться процедура под названием Backup: Application.ОпКеу("^b", "BackUp") Чтобы отменить событие ОпКеу и вернуть клавише ее обычное назначение, вызовите метод ОпКеу, не передавая значение аргументу Procedure. Например, если ранее вы установили соответствие между нажатием клавиши <PgUp> и выполнением определенной процедуры, то следующей строкой кода это соответствие будет отменено. Клавише <PgUp> возвращаются обычные функции, предусмотренные для нее в программе Excel: Application.ОпКеу("{PgUp}") Внимательно относитесь к использованию событий ОпКеу. Переопределив функциональность комбинаций клавиш, обычно используемых в Excel (например, <Ctrl+P> для вывода документов на печать или <Ctrl+l> для форматирования ячеек), вы, скорее всего, создадите лишние неудобства для конечных пользователей вашей программы. э Обзор Если вы хотите поставить в соответствие определенной процедуре комбинацию клавиш <СЫ'¥клавиша>, то советуем воспользоваться не методом ОпКеу, а диалоговым окном Макрос. Более детальная информация по данному вопросу представлена в уроке 2. В настоящем уроке были рассмотрены вопросы использования событий Excel в Готово! приложениях VBA. • События могут возникать на уровне приложения, рабочей книги или рабочего листа. • Чтобы событие оказало влияние на ход выполнения программы, соответствующий код необходимо поместить в процедуре обработки данного события. Урок 23. Обработка событий 323
Чтобы отключить все события Excel, присвойте свойству Application . EnableEvents значение False. Некоторые события сопровождаются запуском процедур обработки событий сразу на нескольких уровнях (например, на уровне рабочей книги и рабочего листа). Используйте событие OnTime, чтобы запустить необходимую процедуру в конкретное время суток. Проверьте себя 1. Верно ли утверждение о том, что все события возникают в результате действий пользователя? Поясните. (См. раздел "Категории событий".) 2. Чем отличаются события Workbook. SheetChange и Worksheet. Change? (См. разделы "События рабочих книг" и "События рабочих листов".) 3. Все ли без исключения изменения на рабочем листе становятся причиной возникновения события Change? (См. подраздел "Событие Change".) 4. Где необходимо разместить коды процедур обработки событий, возникающих на уровне рабочих листов? (См. раздел "События рабочих листов".) 5. Какое событие возникает при добавлении в открытую рабочую книгу нового рабочего листа? (См. раздел "События рабочих книг".) 324 Часть V. Воскресенье. Утро
УРОК Вопросы защиты данных Содержание урока V Защита всей рабочей книги S/ Запрет на внесение изменений в диапазоны рабочих листов ^ Запрет на просмотр и изменение кодов VBA конечными полызователями ^ Безопасное использование макросов V Подпись проектов цифровыми сертификатами Вопросы безопасности и защиты данных имеют важное значение практически для всех проектов Excel. Один из аспектов защиты данных касается содержимого рабочих книг. Это могут быть, например, вопросы, связанные с запретом на вне- 30минут сение конечным пользователем изменении в содержимое ячеек рабочей книги. Второй аспект связан с применением программ VBA, в том числе для создания цифровых подписей, подтверждающих достоверность кодов VBA. Более детально эти вопросы рассмотрены в настоящем уроке. Защита рабочих книг Защита всей рабочей книги осуществляется двумя способами. Во-первых, можно определить пароль на открытие и просмотр рабочей книги. Во-вторых, вы вправе установить пароль, позволяющий изменять и сохранять рабочую книгу. Чтобы назначить один или оба пароля для рабочей книги Excel, выполните следующие действия. 1. Выберите команду Файл«=>Сохранить как. 2. В диалоговом окне Сохранить как в расположенном вверху справа меню Сервис выберите вариант Общие параметры. Excel отобразит на экране диалоговое окно Параметры сохранения (рис. 24.1).
IIS'&МЗЙ11Йй^^ "^^ TEi **«**4:l** ^^ipayrt TD^|^«0JinR НГ^бИИИ \ OK 1 v;t)we«ft'^ I Рас. 24.i. Установка паролей на открытие и изменение рабочей книги 3. Введите пароль в поле Пароль для открытия и/или поле Пароль для изменения, после чего щелкните на кнопке ОК. 4. На запрос о подтверждении паролей повторите их ввод. 5. Вернувшись к окну Сохранить как, укажите имя создаваемого файла и щелкните на кнопке Сохранить. Чтобы защитить рабочую книгу паролем в программе VBA, используйте метод SaveAs. Аргумент Password определяет пароль, позволяющий открывать рабочую книгу, а аргумент WriteResPassword— пароль, предоставляющий возможность внесения изменений и сохранения рабочей книги. Метод SaveAs подробно описан в уроке 3. Осталось 20 минут Например, при добавлении в программу представленного далее кода активная рабочая книга будет сохранена с паролем "коньяк", который позволит открывать ее для просмотра, и с паролем "вермут", предоставляющим возможность вносить в нее изменения. АсtiveWorkbook.SaveAs FileName:= "PWProtected.xls",_ FileFormat:=xlNormal, _ Password:="коньяк", WriteResPassword:="вермут", __ ReadOnlyRecommended:=False Защита рабочих листов Возможность защиты рабочих листов позволяет устанавливать запрет на изменение содержимого их отдельных ячеек. Прежде всего, данная возможность используется для предотвращения несанкционированного изменения конечным пользователем значений тех ячеек рабочего листа, которые должны оставаться без изменений. Вернемся к таблице, вычисляющей суммы выплат по кредиту, которая была создана в уроке 14. На рабочем листе содержатся три ячейки, предназначенные для ввода данных конечным пользователем; во всех остальных ячейках подписи и формулы пользователь изменять не должен. Используя возможность защиты рабочего листа, вы вправе разрешить конечному пользователю изменять значения только трех указанных выше ячеек (^то будет продемонстрировано далее в этом уроке). Используя возможность защиты рабочего листа, примените дополнительное форматирование для визуального выделения ячеек, значения которых могут изменяться конечным пользователем, а также ячеек, содержимое которых заблокировано. Как правило, с этой целью изменяют цвет заливки ячеек. 326 Часть V. Воскресенье. Утро
Существует два уровня защиты рабочих листов. На первом уровне можно заблокировать или отменить блокирование отдельных ячеек, при этом все остальные ячейки рабочего листа остаются заблокированными. Однако, кроме ячеек, необходимо заблокировать весь рабочий лист, что, собственно, и является вторым уровнем защиты. Возможность защиты рабочего листа по умолчанию отключена; следовательно, чтобы разрешить конечному пользователю изменять содержимое только отдельных ячеек рабочего листа, выполните следующее. 1. Выделите ячейку или ячейки, содержимое которых могут изменять конечные пользователи. 2. Выберите команду Формат=>Ячейки, чтобы открыть диалоговое окно Формат ячеек, и перейдите на вкладку Защита (рис. 24.2). Чт»щт«,_'»>»»т w.i,.,.,,ii.,,M.«i,<...i..iw>.f,Wi.>«ww^^^^ у- ■■'''-■ ■ "' "••. • ^ .••.. • . .-• '^^ ':•'■ . -< '•'-• .,.,._..^...^„..„_. ,^^.^....,_,„^._ Мною 1 ВйлвнйвдИйв j шрифт] l>wwie| • ^ВИД^:'. |'3aij^J|^'.f:^'^;;-;-.:';| 1 3»ц|1ггв ячеек iim скрытие фори)/п ^(^^Ш^^1ку(г<^яы(0 nod»' защкты: ;..'\f-.'.-" '''.Г "*• \ | 1 листа.Дг»заи#гшдисгавыбврктё«омдцд^ .".'^;-<. ' V Г1 1 'Ч^рвис^ затей выпадшиге iK№iai«iy *39и|кпт« п^\ Пр» зго» > \ 11 1 можноустаиошт»пароль. ,'.. -у ■■' . •^"^•' "-И |i 1 ■'■■':':^':"■.■■■': / • |i ;....-: ; ^ '... . ■'__■___ LJ^....:..., ,;'ок :; 1 :;^OT«e»«:V|;-j ... •■■.-• - •. ■ '-. .;.: '.'■•• .:' '-it Рис. 24.2. Установка свойства Защищаемая ячейка для ячеек рабочего листа 3. Отключите параметр Защищаемая ячейка, после чего щелкните на кнопке ОК. 4. Если необходимо, повторите пп. 1-3, чтобы отключить блокирование других ячеек. 5. Выполните команду Сервис'=>3ащита'=>Защитить лист, чтобы отобразить на экране диалоговое окно Защита листа (рис. 24.3). 6. Чтобы конечный пользователь не смог снять защиту рабочего листа, укажите пароль. Если это не имеет принципиального значения, оставьте соответствующее поле пустым. 7. Щелкните на кнопке ОК. Чтобы отменить защиту рабочего листа, выберите команду Сервис'=^3ащита'=^ Снять защиту листа. Если при включении защиты был установлен пароль, для ее отмены необходимо ввести этот пароль. Урок 24. Вопросы защиты данных 327
Р" Защитить лист и ^^де{»к11Ное 99иФШ4вемых ячеек Пароль для отклюменкя защиты лиаа: ^ Г^арещмгь у|^к тйьзовагед»! этого листа: ■ тр^ выделение незаблокированиых ячеек L форматирование ячеек «Г* форматирование столбцов р форматирование арок р вставку столбцов р вставку строк vT вставку гиперссылок ff~" удаление столбцов |Г" удаление строк zl Отмен» Рис, 24,3. Установка защиты рабочего листм Вы должны всегда использовать защиту рабочих листов в рабочих книгах, которые будут распространяться в составе готовых программных продуктов. Конечно, можно полагаться на то, что пользователи не внесут изменения там, где этого делать нельзя, однако лучше учесть и такой вариант. Если вы устанавливаете защиту рабочего листа с помощью пароля, обязательно запишите его. Если вы забудете пароль, отменить защиту листа будет невозможно. Программа VBA и защита рабочих листов Возможность защиты рабочих листов можно активизировать путем написания соответствующих кодов VBA. Для этого используется такая процедура. 1. Определите диапазон ячеек, значения которых должны оставаться доступными для редактирования. 2. Присвойте свойству Locked объекта Range значение Fal se. 3. Если необходимо, повторите пп. 1-2 для отмены блокирования других ячеек. 4. Вызовите метод Protect объекта Worksheet, передав ему в качестве аргументов соответствующие значения. Аргументы метода Protect не являются обязательными. Если при вызове метода значения аргументов не передаются, рабочий лист блокируется обычным образом без применения пароля. Если вы хотите назначить пароль, используйте аргумент Password. Другие аргументы определяют параметры блокирования и предоставляют те же варианты, что и диалоговое окно Защита листа (см. рис. 24.3). Дополнительную информацию об этих аргументах можно найти в справочной системе VBA. Если вы используете коды VBA для блокирования рабочего лиаа с помощью пароля, необходимо защитить также от несанкционированного доступа и сами коды (как это сделать, будет показано далее в этом уроке). В противном случае конечный пользователь сможет узнать пароль, просто просмотрев коды вашей программы. 328 Часть V. Воскресенье. Утро
Параметры защиты Если вы вернетесь к рис. 24.3, то увидите, что в нижней части диалогового окна Защита листа отображается ряд опций, соответствующих различным параметрам защиты рабочего листа. Эти параметры позволяют точно определить, что позволяется делать конечному пользователю в случае блокирования листа. По умолчанию пользователь может выделять заблокированные или свободные ячейки и изменять значения последних. Внесение любых других изменений запрещено для всех ячеек листа, а не только для заблокированных. В частности, к таким изменениям относится удаление или добавление строк и столбцов, форматирование ячеек и изменение уже примененного форматирования. Такая "жесткая" защита является вполне оправданной, когда все действия пользователя должны быть ограничены вводом и/или редактированием значений отдельных ячеек рабочего листа. Однако в других случаях может потребоваться предоставить пользователю большую свободу действий. Чтобы сделать это,установите флажки соответствующих параметров в диалоговом окнеЗащита листа. Защита рабочего листа с таблицей, вычисляющей суммы выплат по кредиту Чтобы продемонстрировать использование возможностей языка VBA для защиты рабочего листа, вернемся к приложению, вычисляющему суммы выплат по кредиту (см. урок 23). Как вы помните, это приложение создает таблицу, в которой пользователь вводит информацию о кредите (сумма кредита, процентная ставка, срок погашения). На основании введенных данных вычисляется размер ежемесячных выплат по данному кредиту. На рабочем листе присутствуют три ячейки, предназначенные для ввода пользователем исходных данных (С4:Сб); все остальные ячейки необходимо защитить от несанкционированного изменения их содержимого. Чтобы внести соответствующие изменения в код программы (см. листинг 14.1), добавьте в него коды из листинга 24.1. Новый код необходимо поместить в конце процедуры — перед строкой, выполнение которой сохраняет рабочую книгу. Листинг 24,1. Включение защиты рабочего листа, содержащего таблицу для вычисления суммы выплат по кредиту ' Защита рабочего листа ws.Range("C4:Сб").Locked = False ws.Protect Password;="кредит" В ходе выполнения программы конечный пользователь не сможет изменить рабочий лист, он имеет возможность лишь ввести данные в ячейках С4 : Сб. Защита кодов VBA Завершив работу над проектом VBA, вы, естественно, захотите защитить его коды от изменения конечным пользователем. Кроме того, можно вообще запретить просмотр кодов пользователями, чтобы никто не мог воспользоваться результатами вашего труда при написании собственных программ. Если заблокировать проект VBA и присвоить ему пароль, конечные пользователи смогут запускать этот проект, но будут лишены возможности просматривать или изменять его коды. Урок 24. Вопросы защиты данных 329
Чтобы защитить свой проект VBA, выполните следующие действия. 1. В редакторе VBA убедитесь, что требуемый проект активен. 2. Выберите команду Tools=>XXXX Project Properties (где ХХХХ-— название проекта). 3. В диалоговом окне Project Properties (Свойства проекта) перейдите на вкладку Protection (Защита) —- рис. 24.4. П'^'^ ' |oф^PloJбaШv^^^ 1^^^^"^вйЩ^^^'-^ Щ;т^^''г:^4::. Ж;Шю f'- ''^'1ifl''»iiiii#iffttiV Рис. 24.4. Защита кодов VBA от просмотра и изменения пользователями Осталось 10 минут 4. Выберите параметр Lock Project for Viewing (Запретить просмотр кодов проекта); введите и подтвердите пароль. 5. Щелкните на кнопке ОК. Если проект защищен, то при попытке открыть его в редакторе VBA пользователю будет предложено ввести пароль. Рекомендуется всегда защищать коды проектов VBA, создаваемых для сторонних пользователей. Вряд ли когда-нибудь возникнут действительно уважительные причины, по которым пользователям необходимо будет получить доступ к кодам программы. Безопасное использование макросов Поскодьку VBA является довольно мощным языком программирования, неправильное использование его возможностей может стать причиной нанесения серьезного ущерба. Несознательные программисты VBA могут со злым умыслом создавать макросы, которые принесут вред конечным пользователям, внеся помехи в работу системы или даже создав серьезные проблемы, связанные с удалением данных или файлов операционной системы. Учитывая то обстоятельство, что Excel может выполнять некоторые макросы автоматически в момент открытия 330 Часть V. Воскресенье. Утро
рабочей книги, проблема безопасности становится еще более острой. Разумеется, нежелательно позволять своей системе выполнять все макросы без ограничений. Чтобы определить параметры выполнения макросов в Excel, воспользуйтесь командой Сервис'=>Макрос'=>Безопасность. Эти параметры частично зависят от наличия цифровой подписи макросов, о чем детальнее будет рассказано далее в этом уроке. Если макрос снабжен цифровой подписью, источник его появления можно идентифицировать. В зависимости от надежности этого источника, вы вправе разрешить либо запретить выполнение данного макроса. Чтобы установить уровень безопасности использования макросов Excel, выполните следующие действия. 1. В Excel выберите команду Сервис=^Макрос«=>Безопасность, чтобы открыть диалоговое окно Безопасность. 2. В открывшемся диалоговом окне перейдите на вкладку Уровень безопасности (рис. 24.5). щт\ f»Np^x« принимаете» тпьаго9тщ/1Щ^^'у\ ^^^ ;^ [ь1г'^' ^' . {гояйо при нвличин ^MMpyoMt |фа1}М« и tibmdfii \ h >|увврв1#юя|;и вбвюодсиосЫ «««aiiqpwHwwibe^^ i J- U ' ■•>•■ Рис. 24.5, Определение уровня безопасности использования макросов в Excel 3. Выберите требуемый уровень безопасности (см. список ниже) и щелкните на кнопке ОК. Вы можете выбрать один из следующих уровней (или степеней) безопасности использования макросов. • Высокая. Выполняются только подписанные макросы из надежных источников. • Средняя. Автоматически запускаются макросы, поступившие из надежных источников. Пользователь получает запрос на выполнение других макросов (снабженных подписями от других источников или вообще неподписанных). • Низкая. Все макросы выполняются без ограничений. Урок 24. Вопросы защиты данных 331
Некоторые компьютерные вирусы распространяются в виде макросов Excel и могут быть обнаружены компьютерными антивирусными программами. В целях безопасного использования Excel, других приложений Office и системы в целом, необходимо установить один из таких программных продуктов и регулярно обновлять антивирусные базы. (В диалоговом окне Безопасность на вкладке Уровень безопасности отображается сообщение, указывающее, установлена ли для вашей системы антивирусная программа.) Создание списка надежных источников Если выбрана средняя или высокая степень безопасности использования макросов, при открытии рабочих книг или надстроек, содержащих макросы с цифровыми подписями. Excel сравнивает их с подписями, включенными в текущий список надежных источников. Если указанного источника нет в списке. Excel отображает соответствующий запрос. При выборе пользователем варианта Всегда доверять макросам из этого источника данный источник добавляется в список надежных. Удаление источника макросов из списка надежных источников Если необходимо удалить какой-либо источник из списка надежных, выполните следующие действия. 1. В Excel выберите команду Сервис=>Макрос'=>Безопасность, чтобы отобразить диалоговое окно Безопасность. 2. Перейдите на вкладку Надежные источники. 3. Выберите источник и щелкните на кнопке Удалить. 4. Щелкните на кнопке ОК. Использование цифровых сертификатов для подписи макросов Чтобы получить возможность подписывать макросы цифровыми сертификатами, необходимо приобрести такой сертификат и установить его в своей системе (см. врезку "Цифровые сертификаты"). Далее следует выполнить перечисленные ниже действия. 1. Откройте проект, сделайте его активным в редакторе VBA и выберите команду Tools'=>Digital Signature (Сервис«=^Цифровая подпись), чтобы открыть диалоговое окно Цифровая подпись (рис. 24.6). В этом диалоговом окне отображается название сертификата, который в данный момент используется для подписи проекта, либо надпись [нет сертификата], если проект не подписан. 2. Щелкните на кнопке Выбрать, чтобы отобразить список доступных сертификатов. 3. Выберите желаемый сертификат и щелкните на кнопке ОК, чтобы вернуться к диалоговому окну Цифровая подпись. Теперь в окне будет отображаться название выбранного сертификата. 4. Щелкните на кнопке ОК. 332 Часть V. Воскресенье. Утро
даршщр 1Щ Текущая пюдгакь а|юе)сгё \1А; • ^.. ^, Имя €^т|ф|мвг9;; : - СИ^ ^^{т1фмБатд] Подгеюь: имя се(Ш«|»Н1шт»; {нет tB^n^wmdil УЯйЛ5^ть~ [j^^^^_gbi6pgTb». Рис. 24.6. Присвоение цифровой подписи макросам Обязательно защитите паролем коды проекта VBA, который снабжается цифровой подписью и передается сторонним пользователям. В противном случае конечный пользователь сможет изменить вашу программу и использовать проект со старой цифровой подписью. Цифровые сертификаты Цифровые сертификаты можно рассматривать в качестве электронной идентификационной карты. Сертификаты создаются организациями, имеющими на то полномочия, а потому они содержат информацию и о вас, и о выпустившей их организации. Для защиты сертификатов от подделки используются различные системы кодирования. Чтобы проверить достоверность представленной в сертификате информации, обратитесь за подтверждением через Internet к выпустившей его организации. Вы можете выполнить поиск по ключевым словам "цифровой сертификат" или "digital certificate", чтобы найти дополнительную информацию о сертификатах и о выпускающих их организациях. Готово! Обзор Настоящий урок был посвящен рассмотрению тех инструментов Excel и VBA, которые предназначены для улучшения безопасности использования ваших проектов. • Вы вправе защитить паролем возможности открытия рабочей книги, просмотра и изменения содержащихся в ней данных. • Блокирование диапазонов и защита рабочего листа позволяют ограничить свободу действий пользователя; разрешается лишь изменять значения отдельных ячеек. • Вы можете защитить коды своего проекта VBA от просмотра и внесения изменений конечным пользователем. • Предусмотренные в Excel параметры безопасного использования макросов позволяют защититься от макросов, способных причинить вред вашей системе. • Вы можете подтвердить подлинность своих кодов VBA, добавив к ним цифровую подпись. Урок 24. Вопросы защиты данных 333
Проверьте себя 1. Каким образом можно разрешить конечным пользователям открывать и просматривать рабочую книгу, но запретить изменять содержащиеся в ней данные? (См. раздел "Защита рабочих книг".) 2. При установке защиты рабочего листа какие ячейки блокируются по умолчанию? (См. раздел "Защита рабочих листов".) 3. Как можно установить защиту рабочего листа в программе VBA? (См. подраздел "Программа VBA и защита рабочих листов".) 4. В каких случаях необходимо защищать коды проектов VBA, предназначенных для передачи сторонним пользователям? (См. раздел "Защита кодов VBA".) 5. Если установлена высокая степень безопасности использования макросов Excel, как выполнить макросы, к которым не добавлена цифровая подпись? (См. раздел "Безопасное использование макросов".) 334 Часть V. Воскресенье. Утро
УРОК Отладка и распространение программ Содержание урока ^ Общие сведения о программных ошибках ^ Избежание ошибок 'Z Инструменты отладки в языке VBA ^ Распространение приложений Excel Практически в каждой программе содержится как минимум од на-две ошибки. В VBA реализованы превосходные инструменты, предназначенные для выявления и исправления подобных ошибок. В данном уроке речь пойдет о программ- %"минут ^Ь1Х ошибках, методах борьбы с ними, а также будут рассмотрены некоторые вопросы, связанные с распространением уже готовых приложений. Отладка приложений Перед тем, как распространить свое приложение Excel среди конечных пользователей, необходимо устранить все имеющиеся в нем ошибки, т.е. выполнить отладку. Только в исключительно простой и примитивной программе может не быть ошибок, в противном случае слишком велика вероятность того, что ошибок останется вами незамеченной и их обнаружат только конечные пользователи. Следовательно, вам как программисту необходимо серьезно отнестись к изучению и освоению инструментов VBA, предназначенных для обнаружения и устранения программных ошибок. Что такое программные ошибки Ошибка (bug) — это фрагмент кода, который становится причиной неправильного функционирования программы. В англоязычной литературе различают ошибки как
таковые (bugs) и ошибки выполнения программы (error), хотя эти два термина иногда употребляются как взаимозаменяемые, все же в их значении существуют различия. Ошибка выполнения программы (error, или runtime error) — это проблема, которая приводит к остановке выполнения программы. Если подобная ошибка не будет своевременно обнаружена и исправлена, она может привести к сбою в работе программы на этапе ее выполнения. Более детально об ошибках выполнения программы будет рассказано в уроке 27. В отличие от ошибок выполнения программы, обычные программные ошибки не становятся причиной прекращения работы программы — если они существуют, то программа неправильно функционирует либо возвращает неверный результат. Например, программа ввода данных, которая вставляет значения не в те ячейки рабочего листа, в которые требуется, содержит ошибку. Аналогично, если программа, выполняющая числовые вычисления, возвращает неправильный результат, она также содержит ошибку. Перечислить или описать все ошибки, которые могут возникнуть в программе Excel, невозможно, поскольку их число не ограничено. Таким образом, ошибка — это причина неправильного выполнения задач, для решения которых предназначена программа. Редактор VBA выдает отчеты об ошибках выполнения программы, однако подобных механизмов отслеживания обычных ошибок не предусмотрено. Единственный способ обнаружить ошибку — протестировать программу на практике. Кроме того, выработаны некоторые приемы программирования, способствующие уменьшению вероятности возникновения ошибок. Детальнее они будут рассмотрены в следующем подразделе. Приступив к тестированию программы на наличие ошибок, советуем подключить к этому занятию других специалистов. Они могут обнаружить ошибки, которые ускользнули от вашего внимания. Как избежать ошибок Первое, что вы можете сделать для уменьшения вероятности возникновения ошибок— это использовать Выражение Option Explicit. Если он включен, каждая переменная в программе должна быть явно объявлена. При попытке использования необъявленной переменной редактор VBA выдает сообщение об ошибке. Это позволяет отслеживать ошибки, связанные с неправильным написанием имен переменных. Если выражение Option Explicit не используется, неправильно набранное название будет воспринято просто как имя новой переменной, в результате непременно возникнет программная ошибка. Выражение Option Explicit и его применение внутри создаваемого проекта было рассмотрено в уроке 4. Итак, вы можете использовать выражение Option Explicit для уменьшения вероятности возникновения программных ошибок. Кроме того, вам следует придерживаться таких правил и рекомендаций. • Если программа состоит из большого количества кодов, разделите ее на относительно небольшие процедуры. Чем больше кодов было набрано для процедуры, тем выше вероятность возникновения ошибок, и кроме того, устранять их также становится гораздо сложнее. Четкого критерия относительно того, какую процедуру считать "большой'*, не существует, но если она включает более 25-30 строк кода, следует подумать о том, чтобы разделить ее на две или несколько меньших процедур. 336 Часть V. Воскресенье. Утро
Осталось 20 минут Используйте переменные с областью видимости global и public только в тех случаях, когда это действительно необходимо. Действительно, применение переменных с такой областью видимости упрощает решение некоторых задач программирования, однако оно может стать причиной возникновения многих проблем. Практически все задачи, в которых кажется необходимым использование глобальной переменной или переменной public, эффективно решаются с помощью аргументов процедур и значений, возвращаемых функциями. Обязательно при объявлении числовых переменных используйте тип данных с плавающей точкой. Применение целочисленных типов данных в определенных ситуациях может привести к возникновению ошибок, связанных с округлением значений до целого числа. Инструменты отладки программ результат двух причин, проявляющихся по отдельности Почти все ошибки или одновременно: • оказывается неверным ход выполнения программы; • одна или несколько переменных принимают неправильные значения. Инструменты отладки VBA предназначены для выявления и первой, и второй причины. Точки прерывания в редакторе VBA вы можете установить точку прерывания {breakpoint) на любой строке кода. Когда выполнение программы доходит до этой строки, VBA переходит к режиму прерывания, что позволяет осуществлять различные методы отладки (о которых будет рассказано ниже). Чтобы установить точку прерывания, переместите курсор на необходимую строку кода и нажмите клавишу <F9>. Выполните то же действие, чтобы убрать ранее установленную точку прерывания. Строка с точкой прерывания отображается в виде светлого текста на темном фоне, а напротив этой строки на границе окна появляется значок круга (рис. 25.1). Вы можете установить в программе столько точек прерывания, сколько необходимо. Чтобы изменить формат отображения точек прерывания и других элементов программы, воспользуйтесь вкладкой Editor Format диалогового окна Options, открывающегося при выборе команды Tools^^Options. Точки прерывания удобно использовать для отслеживания хода выполнения программы. Когда VBA находится в режиме прерывания, вы можете применить другие методы отладки (см. следующие подразделы). Во время остановки выполнения программы в точке прерывания данная строка кода выделяется желтым цветом. Ход выполнения программы прерывается непосредственно перед выполнением строки, отмеченной точкой прерывания. Другими словами, в момент остановки программы в точке прерывания строка, содержащая эту точку, еще не будет выполнена. Кроме того, устанавливать точки прерывания можно только в тех строках, которые содержат выполняемый код. В частности, точки прерывания нельзя устанавливать в строках, содержащих операторы Dim. VBA не позволит уставить точку прерывания в невыполняемой строке. Глава 25. Отладка и распространение программ 337
UGenerai) ^} jCreateLoanWorksheet 'HJSiXi jd Public Sub CreateLoanWorksheetO Dim wb As Workbook Dim ws As Worksheet Set wb = Workbooks.Add wb.Worksbeetsd} ,r^ame = "Выплаты no кредиту" Set ws = wb.Worksheets{"Выплаты no кредиту") a With ws .Range {"Al") = 'Вьшлаты no кредиту" .Калде("Л1").Font.size ^ 24 .Range ("Al") .Font. Bo id = Тпзе .Range("B4") = "Сумма кредита" .Range("В5"} = "Годовая процентная ставка" .Range("В6") = "Срок кредита в годах" .Range("В7"} = "Ежемесячные выплаты" 2П Рис. 25.1. Строка с точкой прерывания отображается на темном фоне, напротив нее располагается небольшой кружок Пошаговые команды Остановив выполнение программы VBA в точке прерывания и оценив полученные промежуточные результаты, можно продолжать выполнение программы. Для этого воспользуйтесь одним из способов, представленных в табл. 25.1. Таблица 25.1. Выполнение команд в режиме прерывания Команда Вызов команды Описание Continue Run^^Continue, или <F5> Reset Run=> Reset Step Into Debugs Step Into, или <F8> Step Over Debug'=>Step Over, или <Shif t + F8> Step Out Debug=>Step Out, или <Ctrl + Shift + F8> Run to Cursor Debug=^Run to Cursor, или <Ctrl + F8> Продолжает выполнение программы в нормальном режиме Останавливает выполнение программы и сбрасывает полученные результаты Обрабатывается следующее выражение, после чего выполнение программы снова останавливается Если следующим выражением является вызов процедуры, команда выполняет всю процедуру, после чего останавливается на первом выражении после выражения выхода из процедуры. В противном случае обрабатывается следующее выражение, и выполнение программы снова останавливается Если ход выполнения программы был остановлен внутри тела процедуры, команда выполняет оставшуюся часть процедуры и останавливается на первом выражении после выхода из процедуры. В противном случае обрабатывается следующее выражение, и выполнение программы снова останавливается Продолжает выполнение программы до той строки, в которой расположен курсор 338 Часть V. Воскресенье. Утро
Использование команд, название которых начинается со слова Step, зависит от задач, решаемых в процессе сеанса отладки. Например, если необходимо проследить за выполнением каждой строки кода, можете использовать команду Step Into. Если вы уже определили, что в кодах определенной процедуры ошибки нет, можете использовать команду Step Over для выполнения этой процедуры и остановки в том месте, где ее выполнение заканчивается. Если вы считаете, что обнаружили ошибку и хотите внести исправления в код программы, используйте команду Reset для завершения выполнения программы. Исправление кодов в режиме прерывания VBA позволяет изменять коды программы в режиме прерывания. Эта возможность пригодится вам в том случае, когда вы нашли ошибку и хотите сразу же ее исправить. Однако после внесения некоторых исправлений редактор VBA не может продолжать выполнение программы с того места, в котором оно было остановлено, а потому промежуточные результаты выполнения программы сбрасываются и она запускается снова. В подобных ситуациях VBA отображает предупреждающее сообщение. Использование наблюдаемых выражений Наблюдаемое выражение (watch) позволяет определить значение определенной переменной в ходе выполнения программы. Советуем проверять значение переменной в режиме прерывания. Достаточно навести курсор мыши на название переменной в кодах программы, и на экране появится небольшое окно с ее текущим значением. Если этой возможности не достаточно, воспользуйтесь более сложными инструментами наблюдения за значениями переменных. VBA отображает значение любой переменной или выражения в процессе отладки программы. Наблюдаемым может быть любое выражение VBA, в том числе переменная, свойство объекта или вызов функции. Определив наблюдаемое выражение, вы имеете возможность проследить за изменением текущего значения переменной или свойства и увидеть, как и каким образом оно изменяется. Наблюдаемые выражения можно использовать несколькими способами. • С их помощью просматривают текущее значение. Visual Basic отображает значение выражения в окне Watches (это окно отображается автоматически при добавлении наблюдаемого выражения). Значение обновляется при каждом входе программы в режим прерывания. • Существует возможность определить необходимость перехода программы в режим прерывания всякий раз, когда значение наблюдаемого выражения изменяется. • Можно определить, что программа должна входить в режим прерывания всякий раз, когда значения наблюдаемого выражения принимает значение True. Чтобы установить наблюдаемое выражение, выберите команду Debug«=>Add Watch (Отладка=>Добавить наблюдаемое выражение). На экране будет отображено диалоговое окно Add Watch, показанное на рис. 25.2. Далее выполните следующие действия. 1. Введите наблюдаемое выражение в поле Expression (Выражение). Если в данный момент курсор расположен над названием переменной (свойства) или если вы предварительно выделили требуемое выражение в кодах программы, оно автоматически будет введено в поле Expression. Глава 25. Отладка и распространение программ 339
схяА&а-" }Pxix»^mi I CresteloanWorksheet 5j t/iofj^r;- |лист1 "^ ^ jd!'' Omcei He^ . • <• ^ Watch €x|»«s8bn • Й •: К ^b •' Рис. 25.2. Диалоговое окно Add Watch 2. Не изменяйте настройки параметров, обозначенных словом Context. 3. В области Watch Туре (Тип наблюдаемого выражения) выберите требуемый тип наблюдаемого выражения. 4. Щелкните на кнопке ОК. Каждое добавленное вами наблюдаемое выражение отображается в отдельной строке в окне Watches (рис. 25.3). Значок в левой части строки идентифицирует тип наблюдаемого выражения (Watch Experession — просмотр значения. Break when Value Changes — прерывание при изменении значения. Break when Value Is True — прерывание при получении значения True). В столбцах окна Watches отображается следующая информация. • Expression. Выражение, значение которого наблюдается. • Value. Текущее значение выражения, или <Out of Context>, если программа не выполняется или переменная находится за пределами области видимости. • Туре. Тип данных выражения, если это имеет значение. • Context. Фрагмент (часть) проекта, внутри которого вычисляется значение наблюдаемого выражения. &5 Count W X E>gf&ssa<Hi ejVaiue^ <Out of context> j^Z lC<?ntgxt Variant/Empty /iMcrlWorksheet^Change <Out of context> Emfrty Лист1. Wofk8heet_Change Puc. 25.3. В окне Watches отображается информация обо всех наблюдаемых выражениях При выполнении программы, для которой определены наблюдаемые выражения, представленная в окне Watches информация обновляется каждый раз, когда программа переходит в режим прерывания. 340 Часть V. Воскресенье. Утро
Осталось 10 минут Если на экране не отображается окно Watches, выберите в меню редактора VBA команду View'=>Watch Window. В табл. 25.2 перечислены примеры некоторых наблюдаемых выражений, используемых для решения различных задач в процессе отладки программ. Таблица 25.2. Примеры наблюдаемых выражений Задача Тип контрольного выражения Контрольное выражение Просмотр значения, которое хранится в переменной Strl Просмотр длины текстовой строки, набранной в текстовом поле txtNarae Прерывание выполнения программы, если переменная Count принимает значение, меньшее нуля Прерывание выполнения программы при изменении свойства Value элемента управления ListBox, имеющего название Listl Прерывание выполнения программы, если значение переменной X становится большим значения переменной Y Watch Expression stri Watch Expression txtName . TextLength Break when Value Is True count < о Break when Value Changes Listl.Value Break when Value is True x > y Возможность быстрого просмотра Возможность быстрого просмотра (quick watch) используется с целью быстрого просмотра значений, принимаемых переменной или выражением. Когда программа находится в режиме прерывания, поместите курсор над названием требуемой переменной (свойства) либо выделите выражение, значение которого необходимо оценить. Нажмите клавиши <Shift+F9> или выберите команду Debug'=>Qulck Watch (Отладка'=>Быстрый просмотр), в результате на экране появится диалоговое окно Quick Watch (рис. 25.4). В этом диалоговом окне будет отображено текущее значение указанной переменной или выражения. Щелкните на кнопке Add, чтобы добавить переменную или выражение в окно Watches в качестве обычного наблюдаемого выражения. - Context VBAProjecL/l исгХ .CreateLo«nV/orla^ve€t Expression - - X -"Vblue - 12 Add Cftncet Hefp Рис. 25.4. Окно Quick Watcli Глава 25. Отладка и распространение программ 341
Распространение готовых приложений Процесс распространения приложений Excel среди конечных пользователей может быть как простым, так и достаточно сложным. Если приложение предназначено для внутреннего использования в пределах небольшого офиса, данный процесс может заключаться только лишь в размещении рабочей книги на сервере и сообщении информации о новом приложении своим коллегам. В других случаях, когда, например, создаваемое приложение предназначено для свободного распространения через Internet или же для использования внутри большой организации со сложной внутренней структурой, задача может серьезно усложниться. Например, для работы с приложениями Excel необходимо, как минимум, чтобы на компьютерах конечных пользователей была установлена программа Excel. Специальных версий Excel, которые позволяли бы создавать приложения, работающие без установки Excel, пока не существует. Передача приложения конечным пользователям связана с предоставлением им доступа к файлу рабочей книги Excel, в котором это приложение содержится. Некоторые приложения включают в себя сразу несколько рабочих книг, а некоторые содержат также дополнительные файлы, каковыми, например, являются файлы справочной системы. Поскольку вы сами работали над созданием приложения, то вам должно быть известно, какие именно файлы требуются для его функционирования. Некоторые приложения целесообразнее распространять в виде надстроек, о чем подробнее рассказывается в уроке 29. Вопросы добавления к приложению электронной справочной системы рассмотрены в уроке 30. Вопросы совместимости Excel Существует несколько версий ExceL последняя из которых называется Excel 2003. Помните, что не все пользователи обновляют свое программное обеспечение сразу же в момент появления новой версии. Для многих предприятий более эффективным является использование предыдущих версий Excel позволяющих решать все актуальные для этих предприятий задачи. Другими словами, многие по-прежнему используют версии Excel 2002, Excel 2000 и даже Excel 97. Некоторые из них могут быть потенциальными пользователями вашего приложения. Разработчики Microsoft приложили немало усилий для обеспечения максимально возможной совместимости между различными версиями Excel. Что касается программирования на языке VBA, то в объектную модель Excel и сам язык VBA были внесены лишь незначительные изменения. Следовательно, многие программы VBA, созданные для последней версии Excel, вероятнее всего, будут работать и с более ранними версиями; однако однозначно в этом убедиться можно только на практике. Обзор В этом уроке были рассмотрены способы использования инструментов отладки Готово! приложений VBA, а также вопросы, связанные с передачей уже готовых приложений конечным пользователям. • Программная ошибка — это фрагмент кодов, являющийся причиной неправильного выполнения программы. • Большинство ошибок возникает вследствие принятия переменными неправильных значений и/или по причине неверного хода выполнения программы. 342 Часть V. Воскресенье. Утро
в любом месте в кодах программы можно установить точку прерывания, при достижении которой выполнение программы будет приостановлено. После перехода программы в режим прерывания вы можете пошагово выполнить ее последуюш;ие выражения и попытаться обнаружить причину возникновения ошибки. Наблюдаемые выражения VBA позволяют отслеживать текуш;ее значение переменных в ходе выполнения программы. Проверьте себя 1. В чем заключается различие между программными ошибками и ошибками выполнения программы? (См. подраздел "Что такое программные ошибки**.) 2. Как установить точку прерывания в кодах программы? (См. подраздел "Точки прерывания**.) 3. Чем отличается команда Step Into от Step Over? (См. подраздел "Пошаговые команды**.) 4. Опишите способы просмотра текуш;его значения переменной в режиме прерывания. (См. подраздел "Использование наблюдаемых выражений**.) 5. Как следует поступить, если вы не уверены, что все конечные пользователи вашего приложения будут работать с последней версией Excel? (См. врезку "Вопросы совместимости Excel**.) Глава 25. Отладка и распространение программ 343
УРОК Определение и применение пользовательских классов Содержание урока ^ Общие сведения о классах VBA ^ Преимущества использования классов ^ Создание свойств класса ^ Определение методов класса ^ События классов Программирование в Excel основано на классах, предоставленных объектной моделью Excel. Наверняка вы уже убедились в том, насколько полезным может быть использование классов. Дополнительные преимущества обеспечивает воз- Осталось 30 минут МОЖНОСТЬ определения пользовательских классов и их дальнейшее применение при написании программ VBA. Более детально эти вопросы освещены в настоящем уроке. Основные сведения о классах Класс, который вы как пользователь самостоятельно создаете в VBA, во многом подобен любому другому классу. По сути, это шаблон объекта, который будет использоваться для решения определенных задач, возникающих в ходе выполнения программы. Как только класс будет определен, его можно использовать так же, как и любой другой класс или тип данных VBA (вы вправе создать любое требуемое количество экземпляров (объектов) этого класса). Определенные программистом пользовательские классы также могут иметь свойства и методы. Кроме того, существует возможность создавать процедуры обработки событий этого класса. Однако подобные классы не имеют визуального интерфейса.
Если вам необходим специальный пользовательский интерфейс, вы можете создать экранную форму (см. уроки 19-22). Несмотря на то, что экранные формы не являются классами, некоторые их характеристики совпадают с характеристиками классов. Благодаря поддержке классов, о языке VBA с некоторой натяжкой можно говорить как о "настоящем" языке объектно-ориентированного программирования, однако, с другой стороны, в нем отсутствуют некоторые важные свойства (например, возможность наследования классов). Определение класса VBA осуществляется в модуле класса. Модуль может содержать только один класс. Чтобы добавить к проекту VBA новый класс, в редакторе VBA выберите команду lnsertt=>Class Module (Вставить'=>Модуль класса). Новому классу автоматически присваивается имя, используемое по умолчанию (например, Classl, Class2 и т.д.). Измените это имя, выбрав более описательное название, поскольку вам придется использовать его в программе для создания экземпляров класса. Чтобы изменить имя класса, измените его свойство Name в окне Properties. Созданный класс изначально будет пуст, т.е. он не содержит в себе кодов. Код класса, в основном, составляют его свойства и методы, о чем подробнее будет рассказано далее в этом уроке. Преимущества классов В каких случаях необходимо создавать классы для использования в проекте VBA? При написании программ VBA практически все задачи можно решить и без помощи классов. Однако применение классов дает ряд преимуществ, которые условно можно разделить на три следующие группы. • Простота в использовании. Определив класс, использовать его при написании программы очень легко и удобно. Создать экземпляр класса и затем вызывать его свойства и методы — что может быть проще? • Возможность повторного использования. Хорошо спроектированный класс — самодостаточная единица, позволяющая решать определенные задачи. Вы можете без каких-либо ограничений использовать уже созданный класс при написании других проектов VBA. • Уменьшение вероятности возникновения ошибок. Класс по своей природе изолирован от остальной части программы, за исключением специально создаваемых свойств и методов. Таким образом, уменьшается вероятность появления ошибок, возникающих вследствие некорректного взаимодействиями между различными фрагментами кодов программы. Как уже отмечалось, классы VBA не имеют визуального интерфейса. В таком случае возникает вопрос: для чего они могут использоваться? Возможности, предоставляемые классами, с успехом применяются для решения практически любых задач, не требующих наличия визуального интерфейса. Однако на практике классы чаще всего используются для хранения и обработки данных. Построение класса, как правило, основано на воссоздании свойств реального объекта, данные о котором подлежат обработке. Например, программа, обрабатывающая информацию о сотрудниках определенной организации, может использовать класс Сотрудник. Для каждого отдельного человека будет создан один экземпляр класса. Свойства класса содержат информацию об этом человеке, например, его имя, ад- 346 Часть V. Воскресенье. Утро
pec и номер телефона. Методы класса осуществляют действия, связанные с обработкой информации об этом человеке, например, выводят на печать его анкетные данные. Чтобы внести в список нового сотрудника, необходимо создать новый экземпляр класса Сотрудник, и все возможности данного класса сразу же станут доступными и смогут использоваться для сохранения и обработки информации об этом человеке. Создание экземпляров класса Класс, который вы сами можете создать с помощью возможностей языка VBA, аналогичен любому другому классу — это шаблон, предназначенный для создания объектов. Чтобы использовать класс, необходимо создать экземпляр класса, другими словами, обтьект этого класса. Синтаксис создания экземпляров пользовательского класса идентичен синтаксису других классов объектной модели Excel: Dim ИмяПеременной As New ИмяКласса ИмяПеременной— это любое допустимое в языке VBA имя переменной, ИмяКласса — название класса. Предположим, что ранее вы определили класс под названием Сотрудник. Теперь вы можете набрать такие коды: Dim Петров As New Сотрудник Dim Иванов As New Сотрудник Dim Степашов As New Сотрудник В результате будет создано три экземпляра класса Сотрудник — три объекта, которые можно использовать в программе. После завершении работы с объектом необходимо освободить выделенную для него память, присвоив ссылке на этот объект специальное значение Nothing. Свойства классов Свойство — это отдельный фрагмент информации, сохраняемый для объектов данного класса. При определении свойства можно использовать любой встроенный тип данных VBA. Например, для класса Сотрудник вы можете определить свойства типа String (в которых будут сохраняться имя и фамилия сотрудника), свойство типа Currency (где будет храниться значение, соответствующее размеру его заработной платы) и свойство типа Date для фиксировании информации о дате приема его на работу. Многие свойства классов доступны для чтения и для записи, т.е. программа может и присваивать свойству новое значение, и считывать уже присвоенное. Для работы со свойствами такого типа в модуле класса должны присутствовать следующие три элемента. • Переменная класса для хранения значения свойства. Эта переменная должна быть объявлена на уровне модуля (вне тела всех процедур), причем с использованием ключевого слова Private. • Процедура Property Get применяется в программе для считывания значения свойства. Процедура Property Get является на самом деле функцией, которая возвращает значение, соответствующее значению данного свойства. • Процедура Property Let используется в программе для присвоения свойству нового значения. Урок 26. Определение и применение пользовательских классов 347
Создание процедур для работы со свойствами Процедуры для работы со свойствами (Let и Get) могут быть добавлены в класс автоматически. Для этого необходимо выполнить следующее. 1. В редакторе VBA сделайте модуль класса активным и выберите команду Insertt^Procedure (BcTaBHTbi^OПроцедуру), чтобы отобразить на экране диалоговое окно Add Procedure (рис. 26.1). 2. В поле Name (Имя) укажите название свойства. 3. В разделе Туре (Тип) выберите вариант Property (Свойство). 4. Щелкните на кнопке ОК. ^ет^^^ fieme: j .-•Type - — Г Sub Г FuncUon I (• Properly [ ! <• Public |: . Г Private f P AHLocatvartabtes ^^^m •' (•- as statics ^T- Cancel 'yrr^TS - Puc. 26.1. Используйте диалоговое окно Add Procedure для добавления в модуль класса процедур, предназначенных для работы со значениями свойств Редактор VBA вставит в модуль класса шаблоны процедур Get и Let. Ниже показан код таких процедур, добавляемых при создании свойства под названием Фамилия: Public Property Get Фамилия() As Variant End Property Public Property Let Фамилия(ByVal vNewValue As Variant) End Property Обратите внимание на перечисленные ниже особенности этих процедур. • Процедура Get возвращает значение. По умолчанию оно имеет тип Variant, на что указывает фрагмент кода As Variant. Это и есть зна"чение свойства, возвращаемое в программу, которая его запросила. • Процедуре Let передается значение аргумента vNewValue, также по умолчанию имеющего тип Variant. Когда программа изменяет значение свойства, это новое значение передается объекту посредством данного аргумента. 348 Часть V. Воскресенье. Утро
Обе процедуры не содержат кодов— их еще только предстоит связать со свойством (подробнее см. далее в настоящем уроке). Ш Оставлять принятый по умолчанию тип данных Variant для свойства следует только в том случае, когда этот тип соответствует характеру сохраняемых в свойстве данных. В противном случае необходимо выбрать другой, более подходящий тип данных VBA. (» Переменная свойства Классу требуется место для хранения значений, которые присваиваются свойст- ^Muwm ®^^ объектов. Процедуры свойств этой возможности не предоставляют — их функции сводятся к обеспечению связи между свойствами объектов и кодами программы, расположенными за пределами данного класса. В большинстве случаев значение свойства хранится в определенной переменной, объявленной на уровне модуля. При этом используется следующий синтаксис: Private ИмяПеременной As ТипДанных Этот оператор необходимо поместить в теле модуля, за пределами процедур свойств или методов класса. В объявлении используются следующие элементы. • Ключевое слово Private ограничивает область видимости переменной модулем класса. Другими словами, за пределами класса доступ к такой переменной получить невозможно. • ИмяПеременной является любым допустимым в языке VBA названием переменной. • ТипДанных определяет тип этого свойства. Можно указать любой тип данных VBA или тип, определенный пользователем. Более детально о типах данных, определяемых пользователем, было рассказано в уроке 4. Разумеется, для переменной свойства необходимо выбрать тип данных, соответствующий типу этого свойства. Для свойства Фамилия вполне подходящим будет тип String, а потому объявление переменной этого свойства будет иметь следующий вид: Private рФамилия As String Переменная, используемая для хранения значений свойства, отличается от обычных переменных только лишь тем, что она связана с процедурами этого свойств (о чем подробнее будет рассказано в следующем подразделе). Для нее можно выбрать любое название, допустимое в языке VBA, однако таким переменным удобнее присваивать имена, начинающиеся с префикса р. Префикс указывает на тот факт, что переменная используется для хранения значений свойства объекта, а по остальной части названия можно определить, какого именно свойства.. Связь между свойствами и их процедурами Последний шаг в создании свойства класса будет заключаться в установке связи между переменной свойства и процедурами, предназначенными для работы со значениями этих свойств. Урок 26. Определение и применение пользовательских классов 349
1. Измените тип данных аргумента процедуры Let в соответствии с типом данных переменной, в которой сохраняется значение этого свойства. Если это тип Variant, вносить изменения не потребуется. 2. Измените тип значения, возвращаемого процедурой Get, в соответствии с типом данных переменной этого свойства. И снова, если это тип Variant, вносить изменения не нужно. 3. Добавьте в тело процедуры Get коды, которые возвращали бы в вызывающую программу значение переменной данного свойства. 4. Добавьте в тело процедуры Let коды, которые присваивали бы значение, передаваемое этой процедуре в качестве аргумента, переменной данного свойства. В листинге 26.1 показаны коды уже готовых к использованию процедур, предназначенные для работы со значениями свойства Фамилия, а также код объявления переменной, в которой будет храниться значение данного свойства. Сохранение данных, содержащихся в объектах Сохранение данных, представленных как значения свойств объектов, ничем не отличается от сохранения любых других данных, используемых в программах VBA. Программы VBA в большинстве случаев сохраняют свои данные на рабочем листе или в рабочей книге, оставляя их скрытыми для конечного пользователя. Эту же технику можно использовать при работе с модулями классов. Листинг 26.1, Коды для работы со свойством Фамилия Private рФамилия As String Public Property Get Фамилия() As String Фамилия = рФамилия End Property- Public Property Let Фамилия(ByVal vHoBoe3Ha4eHHe As String) рФамилия = vHoBoe3Ha4eHHe End Ptoperty Свойства-массивы Иногда возникает необходимость в создании свойств, представляющих собой массивы. Например, такой прием используется в том случае, если свойство должно хранить не одно, а несколько значений. Вы сможете достичь необходимого результата, если добавите дополнительный аргумент в обе процедуры — Get и Let. Этот аргумент будет служить индексом внутри массива. Разумеется, сама переменная, в которой хранятся значения свойства, должна быть объявлена как массив. Например: Private pArrayProperty(100) As Variant В таком случае коды процедур Get и Let могут иметь вид, представленный ниже. Обратите внимание, что обе процедуры — Get и Let — проверяют значение переменной index с целью определить, не превышает ли оно количества элементов свойства-массива. 350 Часть !/• Воскресенье. Утро
Public Property Get ArrayProperty(ByVal index As Integer) As Variant If index >= LBound(pArrayProperty) And index <=_ UBound(pArrayProperty) Then ArrayProperty = pArrayProperty(index) Else ArrayProperty = Null End If End Property Public Property Let ArrayProperty(ByVal index As Integer, _ ByVal vNewValue As Variant) If Index >= LBound(pArrayProperty) And index <=_ UBound(pArrayProperty) Then pArrayProperty(index) = vNewValue End If End Property Чтобы создать процедуры Get и Let для свойства-массива, используйте команду Inserted Procedure (см. ранее в этом уроке), в результате в коды программы будут добавлены шаблоны процедур. Затем следует внести изменения в коды процедур: добавьте в них требуемый аргумент, используемый для представления индекса элементов массива. Работая со свойством-массивом, необходимо указать индекс требуемого элемента массива, чтобы получить доступ к его значению: X = Obj.ArrayProperty(5) Obj.Property(10) = "Smith" Обратите внимание, что в предыдущем примере процедура Get возвращала значение Null, когда программа запрашивала значение элемента по индексу, выходящему за пределы массива. Это важно, поскольку в таком случае вызывающая программа может определить, что корректное значение свойства получено не было. Свойства, доступные только для чтения Свойство можно сделать доступным только для чтения, удалив его процедуру Let. Программа будет считывать значение такого свойства, но не может изменить его. Как правило, доступное только для чтения свойство не имеет своей переменной в модуле класса. Вместо этого, значение свойства заново вычисляется или генерируется при каждом его считывании. Пример доступного только для чтения свойства будет показан немного позднее в этом уроке. Ключевое слово Null Ключевое слово Null —• это специальное значение VBA, которое используется для обозначения некорректности данных. Если существует вероятность получение некорректных данных (обозначаемых значением Null), программа должна будет выполнить проверку на соответствие передаваемого ей значения значению Null. Такого результата вы не достигнете с помощью обычных операторов сравнения, так как выражение If НекотороеВыражение = Null Урок 26. Определение и применение пользовательских классов 351
всегда будет возвращать False, независимо от значения оцениваемого выражения. Поэтому необходимо использовать функцию IsNull: If IsNull(НекотороеВьфажение) Доступ к значениям свойств в кодах программы Доступ к свойствам определенных пользователем классов осуществляется так, как и к любым другим свойствам — посредством использования синтаксиса ИмяОбъекта.ИмяСвойства. Предположим, вы создаете экземпляр класса Сотрудник: Dim Некто As New Сотрудник Тогда можно определить значения свойств нового объекта следующим образом: Некто.Имя = "Сергей" Некто.Фамилия = "Дергачев" Аналогично выполняется также считывание свойства таких объектов: str = Некто.Имя Методы классов Наверное, вы можете удивиться, узнав, что о методах классов уже знаете все. Дело в том, что метод представляет собой процедуру внутри модуля класса — отличие заключается только в терминологии. Все, что вы узнали о процедурах VBA в уроке 7, в равной мере относится и к методам. Метод может быть функцией, возвращающей значение, либо подпрограммой, которая значение не возвращает. Используйте команду lnsert'=>Procedure для добавления методов в модуль класса, как вы это делаете при добавлении процедуры в обычный программный модуль. По умолчанию методы класса имеют область видимости Public и могут быть вызваны кодами программы, расположенными за пределами класса. Можно также создать вспомогательные методы, которые не видны за пределами класса и которые вызывают только код£1МИ с£1Мого класса. Чтобы создать такой вспомогательный метод, замените ключевое слово Public ключевым словом Private. Например: Private Sub ВспомогательныйМетодО Вспомогательный метод предназначен исключительно для решения определенных задач внутри класса. Если коды обычного (Public) метода становятся слишком объемными и сложными, подумайте о создании одного или нескольких вспомогательных методов. Кроме того, если какая-либо задача должна выполняться для двух или нескольких методов Public одного класса, коды решения этой задачи также целесообразно разместить в теле вспомогательного метода. При необходимости вы можете вызвать его из методов Public. Определять вспомогательные методы следует с помощью ключевого слова Private. Если вспомогательный метод оказывается доступным за пределами своего класса, это может стать причиной возникновения разнообразных проблем. Проверка корректности свойств Процедура свойства используется для проверки корректности значения этого свойства. В частности, процедура Let может включать коды, проверяющие передаваемое свойству объекта значение на предмет его соответствия установленным критериям. Например, для свойства ТелефонныйНомер можно осупдествлять 352 Часть V. Воскресенье. Утро
проверку передаваемых ему значении и принимать только те из них, которые заданы в формате ппп~ппп-пппп. Если передаваемое свойству значение не удовлетворяет заданному условию, коды процедуры Let могут выполнять соответствующие определенной ситуации действия, например, отображать на экране адресованное пользователю сообщение. Пример проверки корректности передаваемых свойству значений приведен в конце этого урока. События классов Для модулей класса VBA предусмотрены указанные ниже события. • Initialize. Возникает в момент создания экземпляра класса. • Terminate. Возникает в момент перед освобождением памяти, выделенной для объекта. Процедура события Initialize может использоваться для инициализации значений переменных в объекте или для осуществления других требуемых действий. Например, может возникнуть необходимость в считывании для объекта данных, расположенных на рабочем листе. Этот код вы вправе поместить в процедуру события Initialize. Кроме того, процедура события Terminate используется для решения любых завершающих задач, в том числе для сохранения данных удаляемого обтьекта. Повторное использование класса После того как класс был определен в одном проекте VBA, его можно использовать в любом другом проекте. Для этого необходимо выполнить следующее. 1. В редакторе VBA сделайте активным модуль класса. 2. Выберите команду File":^Export File (Файл«^Экспортировать файл), чтобы отобразить диалоговое окно Export File. 3. Укажите путь к экспортируемому файлу. По умолчанию в качестве названия файла используется имя класса, к которому добавлено расширение . CLS. Вы можете изменить название файла, но не его расширение. 4. Щелкните на кнопке Save. 5. Откройте второй проект; если он уже открыт, сделайте его активным. 6. Выполните команду File==t>Import File (Файл'=t>Импортировать файл), чтобы открыть диалоговое окно Import File. 7. Выберите файл, который ранее был экспортирован, и щелкните на кнопке Open. Изменения, внесенные в коды исходного класса, автоматически не распространяются на проекты, в которые этот класс был импортирован. Чтобы обновить коды класса в других проектах, повторите процедуру экспорта/импорта. Демонстрация класса в этом разделе описан процесс создания полностью рабочего класса Сотрудник, %"ми1^т который является примером использования всех рассмотренных ранее принципов программирования классов. Как вы уже знаете, работу над созданием класса следует начинать с составления небольшого плана. Итак, класс Сотрудник должен состоять из следующих компонентов. Урок 26. Определение и применение пользовательских классов 353
Доступных для чтения и записи свойств Имя и Фамилия. Доступного только для чтения свойства ПолноеИмя, которое создается в ходе выполнения программы путем объединения значений свойств Имя и Фамилия, разделенных пробелом. Свойства Email для адреса электронной почты. Процедура Let включает в себя код проверки корректности передаваемых этому свойству значений (его задача состоит в отсеивании некорректно указанных адресов электронной почты). Метода PutDatalnCell, который помещает данные по каждому отдельному человеку в заданную ячейку рабочего листа (ссылка на которую передается в метод как объект Range). Термин компоненты (members) часто используется для обозначения совокупности всех свойств и методов класса. В этом классе для всех свойств можно использовать тип данных String. Однако в настоящем примере вместо этого применен тип Variant, и вот по какой причине. В приложениях, создаваемых для обработки данных, обычно с целью проверки корректности передаваемых значений используют специальное значение Null. Свойства типа String не могут хранить значение Null, тогда как свойства типа Variant с этой задачей справляются. Чтобы использовать данную возможность, свойствам изначально необходимо присвоить значения Null. Коды, предназначенные для решения этой задачи, помещены в процедуру события Initialize модуля класса. Код модуля класса Сотрудник представлен в листинге 26.2. Поскольку вы уже знаете, какие действия необходимо выполнить для создания класса, приведенная далее инструкция представлена в обобщенном виде, без излишней детализации. 1. В редакторе VBA выберите команду lnsert=>Class Module, чтобы добавить в проект новый модуль класса. Присвойте его свойству Name значение Сотрудник. 2« Добавьте выражение Option Explicit и объявите три переменные, которые будет использоваться для хранения значений свойств (точный синтаксис см. в листинге). 3. Используйте команду lnsert'=>Procedure, чтобы добавить процедуры для свойств Имя, Фамилия, Email и ПолноеИмя. Не забудьте удалить процедуру Let свойства ПолноеИмя, поскольку оно должно быть доступно только для чтения. В тело процедур добавьте коды, представленные в листинге. 4. Используйте команду lnsert^=^Procedure, чтобы добавить подпрограмму (метод) под названием PutDatalnCell. В ее тело добавьте коды, включая объявление аргумента, как показано в листинге. Проверка корректности адресов электронной почты В рамках данной программы проверка адреса электронной почты не ставит целью определять фактическое функционирование передаваемого объекту адреса. Наибольшее, на что можно рассчитывать в нашем случае, ~ это проверка корректности формата адреса. Например, запись aaa®bbb. com может считаться корректной. Итак, требуется проверить следующее: 354 Часть V. Воскресенье. Утро
• адрес должен содержать символ @, который не может быть первым символом в строке; • адрес должен содержать как минимум одну точку (.); между ней и символом ® необходимо набрать по крайней мере два других символа. В листинге показано, как была реализована такая проверка в процедуре Let свойства Email. Листинг 26.2. Класс Сотрудник Option Explicit Private рИмя As Variant Private рФамилия As Variant Private pEmail As Variant Public Property Get Имя{) As Variant Имя = рИмя End Property Public Property Let Имя(ByVal vNewValue As Variant) рИмя = vNewValue End Property Public Property Get Фамилия 0 As Variant Фамилия = рФамилия End Property Public Property Let Фамилия(ByVal vNewValue As Variant) рФамилия = vNewValue End Property Public Property Get Email() As Variant Email = pEmail End Property Public Property Let Email(ByVal vNewValue As Variant) Dim pos As Integer ' Проверка корректности адреса электронной почты ' Адрес должен содержать символ "®", ' но он не должен быть первым в строке pos = InStr(vNewValue, "®") If InStr(vNewValue, "®") < 2 Then MsgBox "Некорректный адрес электронной почты: " & vNewValue Exit Property End If ' Адрес должен также содержать не менее одной точки, которая ' набрана как минимум после двух символов после ® If InStгRev(vNewValue, ".")Некорректный адрес электронной почты: " & vNewValue Exit Property End If ' Данные корректны - присвоить свойству указанное значение pEmail = VNewValue End Property Public Property Get ПолноеИмяО As Variant Урок 26. Определение и применение пользовательских классов 355
' Это свойство доступно только для чтения ' Возвращает Null, если данные некорректны If 1зЫи11(рИмя) Or IsNull(рФамилия) Then ПолноеИмя = Null Else ПолноеИмя = рИмя & " " & рФамилия End If End Property Private Sub Class__Initialize рИмя = Null рФамилия= Null pEmail = Null End Sub Public Sub PutDatalnCell(r As Range) ' Записывает полное имя сотрудника и адрес его электронной почты • в заданную ячейку рабочего листа. Если данные некорректны, ' записывает в ячейку строку <некорректные данные> If IsNull(рИмя) Or IsNull(рФамилия) Or IsNull(pEmail) Then r.Value = "<некорректные данные>" Else r.Value = ПолноеИмя & " - " & pEmail End If End Sub После набора всех кодов для класса Сотрудник напишите небольшую программу, тестирующую этот класс. Пример подобной программы показан в листинге 26.3. Эти коды необходимо поместить в обычном программном модуле. Как видно, данная программа создает два объекта класса Сотрудник, присваивает значения свойствам этих объектов и вызывает метод PutDatalnCell, вставляющий данные в ячейки активного рабочего листа. На рис. 26.2 показан результат выполнения данной программы. Листинг 26.3. Программа для тестирования класса Сотрудник Public Sub ТестСотрудникО Dim pi As New Сотрудник Dim p2 As New Сотрудник pi.Имя = "Игорь" pi.Фамилия = "Медведев" pi.Email = "igor@somewhere.com" pi.PutDatalnCell (ActiveSheet.Range("Al")) р2.Имя = "Елена." p2.Фамилия = "Крутая" p2.Email = "lena@whatever.com" p2.PutDatalnCell (ActiveSheet.Range("A2")) End Sub 356 Часть V. Воскресенье. Утро
1^^^Шб^ЯМ1ШЯ1ММ^Я11Ш1^^^^ [©файл Правю Ви^ Формат Сервис Данные:Qkhq р Dipaeka :У-': '■'■ ■"""•'• •• • * '^ | 1 115 ^--:'Д-..> [ 1 •'^••• 12 1 Т О] • А- |. ^ В \ С 'l:- ;0.^.^.i;;.€r- [, ,f > 1-. сг1[ Игорь Медведев-|дог@50пгюу^ i Елена крутая - tena@whatever.com 1 . ▼II |и ^ ► ►!|\ли€т1 /Яисг2/листз/ hi : 1 Jiir 1 || Готово ^ / • тш ^1 Рис. 26.2. Рабочий лист после выполнения программы, тестирующей использование класса Сотрудник Готово! Обзор В настоящем уроке была описана имеющаяся в языке VBA возможность создания пользовательских классов, а также рассмотрены примеры их использования при написании программ. • Определение класса помещается в модуле класса. • Класс VBA не имеет визуального интерфейса. • Классы VBA могут обладать свойствами, предназначенными для хранения данных, и методами, используемыми для решения различных задач. • Как и в случае с обычными классами, для использования класса VBA необходимо создать его экземпляр. • Каждому классу соответствуют собственные события Initialize и Terminate, первое из которых возникает в момент создания экземпляра класса, а второе — непосредственно перед освобождением выделенной для этого экземпляра памяти. Проверьте себя 1. Сколько классов может быть определено в модуле класса? (См. раздел "Основные сведения о классах".) 2. Назовите основные преимущества использования классов. (См. раздел "Преимущества классов".) 3. Как определить доступное только для чтения свойство? (См. подраздел "Свойства, доступные только для чтения".) 4. Для чего используется ключевое слово Null? (См. врезку "Ключевое слово Null".) 5. Чем метод класса отличается от обычной процедуры VBA? (См. раздел "Методы классов".) Урок 26. Определение и применение пользовательских классов 357
ЧАСТЬ Воскресенье. Утро. Обзор 1. Когда возникает событие Exi t элемента управления? 2. Как в программе VBA можно изменить интервал времени для двойного щелчка? 3. Верно ли, что процедура обработки события KeyDown может с помощью аргумента Key Code отличать ввод пользователем символов 4 и $? 4. Как в кодах процедуры обработки события KeyDown можно отменить нажатие клавиши? 5. Назовите самый быстрый способ выровнять расположение элементов управления в окне экранной формы. 6. Предположим, что один элемент управления скрыт другим перекрывающим его элементом управления. Как сделать скрытый элемент управления видимым в ходе выполнения программы? 7. Как не допустить переход пользователя к элементу управления экранной формы по табуляции? 8. Какие правила используются при определении названий процедур обработки событий? 9. Какие события не отключаются вследствие присвоения свойству Application . EnableEvents значения False? 10. Какое событие возникает при внесении пользователем изменений в рабочий лист? 11. Как пользователь может предотвратить возникновение события Open при открытии рабочей книги? 12. Что представляет собой проверка корректности данных? 13. Где должны располагаться процедуры обработки событий, возникающих на уровне рабочих книг? 14. Как создать код, который должен выполняться в определенное время дня? 15. Как позволить конечным пользователям просматривать рабочую книгу, но не изменять ее? 16. Верно ли, что защита рабочей книги с помощью пароля не позволит конечным пользователям просматривать коды VBA? 17. Верно ли, что ошибки программы приводит к остановке ее работы? 358 Часть V. Воскресенье. Утро. Обзор
18. В каких случаях в программе необходимо использовать оператор Option Explicit? 19. Что такое точка прерывания? 20. Чем отличается команда отладки Step Over от команды Step Into? 21. Как в процессе отладки программы можно быстро определить текущее значение определенной переменной? 22. Верно ли, что значения в окне Watches постоянно обновляются по ходу выполнения программы? 23. Каким образом VBA отображает отчеты об ошибках (bugs)? 24. Верно ли утверждение о том, что для запуска ваших приложений Excel конечный пользователь должен иметь установленную версию Excel? 25. Где должен быть помещен код пользовательского класса VBA? 26. Верно ли, что пользовательский класс VBA может включать визуальный интерфейс? 27. Как создать доступное только для чтения свойство? 28. Верно ли, что значение, которое возвращает процедура Property Get, должно иметь тот же тип данных, что аргумент процедуры Property Let? 29. Как выполнить проверку корректности данных для свойств, которые могут принимать только определенные значения? 30. Каким образом обращаются к свойству объекта в кодах программы? 31. Чем метод класса отличается от обычной процедуры VBA? 32. Что такое вспомогательный метод? 33. Какое событие возникает непосредственно перед уничтожением объекта? Часть V. Воскресенье. Утро. Обзор 359
чАст ■ВШШШШШ»^' Уронит. УртШ МШтёаЩу т
УРОК Обработка ошибок выполнения программы Содержание урока ^ Понятие ошибок выполнения программы и причины их возникновения ^ Организация перехвата ошибок в процедуре ^ Использование объекта Err ^ Написание кодов обработки ошибок ^ Откладывание обработки ошибок %^ Использование ошибок как инструмента программирования Ошибками выполнения программы называются ошибки, возникающие в ходе ее выполнения. Если их вовремя не устранить, они способны привести к полной остановке работы программы. В настоящем уроке описываются как сами ошибки Осталось ^ -, 30минут выполнения, так И методы их обработки. Что такое ошибка выполнения программы Ошибка, возникающая в процессе выполнения программы, называется ошибкой выполнения (runtime error). Важно понимать, что ошибка выполнения программы (которую далее мы будем называть просто ошибкой) отличается от ошибок двух других типов, возникающих в программах VBA: • ошибка (bug) — это логический дефект программы, который становится причиной ее неправильной работы или получения неправильных результатов. В отличие от ошибок выполнения, ошибки такого типа не приводят к остановке выполнения самой программь!;
• синтаксическая ошибка (syntax error) — это ошибка, нарушающая правила синтаксиса языка VBA. Редактор VBA обнаруживает и выделяет синтаксические ошибки в процессе набора кодов программы, поэтому они, как правило, сразу же устраняются и в дальнейшем не влияют на ход выполнения программы. Если возникла ошибка, а в программе не содержатся коды для ее обработки, ход выполнения программы останавливается и на экране отображается диалоговое окно с описанием данной ошибки (рис. 27.1). Как правило, продолжить работу программы после возникновения ошибки, коды обработки которой не были созданы, невозможно, поэтому такие ошибки особенно неприятны. Как минимум это приводит к недовольству пользователей, как максимум — к потере данных. Run-ttn» «тог *9'; Subscript out of range &(i \ [[^ ,ig^?n| iNp Рис. 27.1. VBA сигнализирует о возникновении необработанной ошибки путем отображения такого диалоговое окна В диалоговом окне представлена краткая информация о возникшей ошибке, а также указан ее номер (рис. 27.1). Каждая ошибка VBA имеет собственный номер. В данном примере ошибка называется Subscript out of range, возникает она при попытке обращения программы к несуш;ествующему элементу массива; номер ошибки — 9. Из рис. 27.1 видно также, что в этом диалоговом окне имеются четыре кнопки, две из которых не доступны. Представим краткое описание этих кнопок. • Continue (Продолжить). Для некоторых ошибок предусмотрена возможность продолжения выполнения программы. При появлении такой ошибки данная кнопка становится доступной, однако, как правило, ошибки приводят к прекращению работы программы. • End (Завершить). Эта кнопка завершает работу программы. • Debug (Отладка). Если программа была запущена из редактора VBA, щелчок на данной кнопке сопровождается остановкой выполнения программы и выделением той строки кода, в которой эта ошибка содержится. Однако если программа защищена паролем (как большинство приложений, передаваемых в распоряжение конечных пользователей), кнопка Debug остается недоступной. • Help (Помощь). Данная кнопка отображает информацию об ошибке, в том числе перечень возможных причин ее возникновения. Таким образом, для конечного пользователя, как правило, единственным вариантом ответа на возникновение необработанной ошибки является завершение работы программы. Разумеется, это крайне нежелательный вариант! Подобные ситуации вообще не должны возникать ни при каких обстоятельствах. 362 Часть VL Воскресенье. День
Причины возникновения ошибок Некоторые ошибки выполнения программы возникают по причине неправильно набранных кодов. Например, довольно часто ошибка выполнения программы происходит при попытке обратиться к несуществующему элементу массива: Dim MyArray(lOO) As Single MyArray(150) =1.2 ' Происходит ошибка Еще одна довольно распространенная ошибка, связанная с кодами программы, возникает в том случае, когда используется объектная переменная, которая не была инициализирована (т.е. в этом случае сам объект еще не создан). В показанном ниже примере г — это переменная, которая может содержать ссылку на объект Range. Ранее она не была инициализирована, а потому не ссылается ни на какой диапазон. В результате следующий код содержит ошибку: Dim г As Range г.Value = "Data" Другие ошибки могут быть вызваны проблемами, связанными с аппаратным обеспечением. Операции с файлами часто становятся причиной возникновения ошибок. Например, ошибка происходит при попытке записи программой данных на диск, на котором отсутствует свободное место, или на съемный носитель, который не вставлен в дисковод. Навыки программирования помогут избежать ошибок, вызываемых кодами программы, однако некоторые ошибки остаются полностью неподвластными воле программиста. Таким образом, программа VBA всегда должна содержать коды обработки ошибок. Ошибки и объектная модель Excel Некоторые объекты Excel имеют собственные встроенные процедуры обработки ошибок. Это означает, что объект перехватывает ошибку еще до того, как она сможет повлиять на ход выполнения программы. Например, объект Workbook содержит собственные процедуры обработки ошибок. При попытке открытия рабочей книги, которая отсутствует на диске, или же при попытке сохранения рабочей книги на несуществующем диске объект Workbook перехватывает такую ошибку и отображает собственное диалоговое окно (рис. 27.2). Таким образом, перехват подобных ошибок в вашей программе никогда не будет реализован. К сожалению, Microsoft не предоставляет информации о том, какие ошибки перехватываются самими объектами, а какие передаются на обработку программе VBA. Все, что вы можете сделать, — это поэкспериментировать и проследить на практике, какие ошибки необходимо отслеживать в самой программе, а какие можно проигнорировать, так как они изначально обрабатываются объектами Excel. Как избежать ошибок Существуют наработанные приемы программирования, позволяющие избегать возникновения ошибок в процессе написания кодов программы. Они во многом подобны методам, описанным в уроке 25, однако повторение в данном случае не будет лишним. • Всегда используйте выражение Option Explicit. Поскольку в таком случае объявление переменных будет обязательным, это позволит вам избежать многих ошибок, связанных с неправильным написанием названий переменных. Урок 27. Обработка ошибок выполнения программы 363
жтт^^шш Run-time error '1004*: He удалось нзйти 'd:\test.xls'. Проверьте задание имени и меаопспоженйя файла. При попытке сткрыгия файла с жпользованием списка недавно йспользовакных файлов из межо "Файл" у6едитеа>, что файл не был переименован^ перемещен или удален. gnu J5ebug 1 й€1р Рис. 27.2. Некоторые объекты Excel сами обрабатывают возникающие ошибки и отображают собственное диалоговое окно • Старайтесь не использовать переменные типа Object и Variant для хранения ссылок на объекты. Их применение вместо конкретного объектного типа данных не позволяет в языке VBA изначально определить, какими методами и свойствами будет обладать объект, что в результате может стать причиной возникновения самых разнообразных ошибок. • При работе с массивом может существовать вероятность использования индекса, выходящего за пределы корректного диапазона. В таком случае прежде, чем считывать или изменять значения элементов массива, обязательно используйте функции UBound и Lbound, чтобы проверить, принадлежит ли индекс допустимому диапазону. • Всегда выполняйте проверку вводимых пользователем данных. Довольно часто ошибки возникают именно вследствие ввода пользователем некорректных значений (например, строки вместо числа). Проверяя поступающие от пользователя данные на этапе их ввода, вы сможете избавиться от ошибок этого типа. ш Перехват ошибок Ошибки в языке VBA обрабатываются путем перехвата (trapping). При перехва- 2о"ми1^т '^^ ошибок VBA получает такую инструкцию: в случае возникновения ошибки не отображать принятое по умолчанию диалоговое окно и не останавливать программу, а переходить к выполнению специального набора кодов — обработчика ошибок (error handler). Ошибки перехватываются с помощью оператора On Error Goto, имеющего такой синтаксис: On Error Goto метка Здесь метка представляет собой программную метку (название. За которым следует двоеточие), которая определяет начало кодов обработчика ошибок. Оператор On Error Goto и коды обработчика ошибок всегда должны быть расположены в пределах одной и той же процедуры. Следовательно, структура процедуры, содержащей в себе коды обработчика ошибок, должна иметь приблизительно такой вид: Public НекотораяПроцедура() ' Коды объявления переменных On Error Goto ErrorHandler 364 Часть VL Воскресенье. День
' Код основной процедуры Exit Sub ErrorHandler: ' Код обработчика ошибок End Sub Советуем вам обратить внимание на такие детали. • Метка кодов обработчика ошибок не обязательно должна называться ErrorHandler :; это может быть любое корректное в языке VBA название метки. • Оператор Exit Sub используется для того, чтобы выполнение процедуры не переходило в коды обработчика ошибок. Благодаря использованию данного оператора процедура обработки ошибок выполняется только в случае возникновения ошибки. Прежде чем перейти к рассмотрению особенностей кодов обработчика ошибок, необходимо ознакомиться с объектом Err. Поскольку коды одних процедур VBA не влияют на коды других процедур, вы можете использовать в разных процедурах одну и ту же ^^етку для обозначения кодов обработчика ошибок. Процедуры и обработка ошибок Обработка ошибок в программах VBA всегда выполняется на уровне процедур, и этого изменить нельзя, поскольку оператор перехвата ошибок и соответствующий ему код обработчика ошибок всегда должны быть расположены в пределах одной и той же процедуры. Эта система успешно функционирует, поскольку в каждой конкретной процедуре можно написать такие коды обработчика ошибок, которые будут соответствовать ошибкам, возникающим именно в этой процедуре. Например, в процедуре, выполняющей математические вычисления, необходимо обратить внимание на ошибки переполнения и деления на ноль. В то же время можно проигнорировать ошибки, возникающие при работе с файлами, поскольку очевидно, что они не могут произойти в ходе выполнения данной процедуры. В программах VBA одни процедуры часто вызывают другие процедуры. Если в одной из процедур обработчик ошибок отсутствует, все ошибки, возникающие в ходе ее выполнения, передаются далее в вызывающую процедуру. Таким образом, если Про1 вызывает Про2, а в Про2 отсутствует обработчик ошибок, то ошибки, возникающие в ходе выполнения Про2, передаются в Про1 и обрабатываются там. Если в Про1 также отсутствует обработчик ошибок, то они передаются далее на более высокий уровень. Принятый в VBA по умолчанию механизм обработки ошибок запускается только в том случае, когда ошибка достигает верхнего уровня — процедуры, которая не вызвалась другой процедурой. Такая возможность "передачи" ошибок VBA вызывающим процедурам может подтолкнуть вас на то, чтобы собрать коды всех обработчиков ошибок в одной или нескольких отдельных процедурах. Тем не менее, подобная практика является нежелательной: гораздо предпочтительнее, чтобы каждая процедура имела собственный обработчик ошибок. Принцип обработки ошибок одинаков для всех процедур VBA, в том числе для функций и для методов классов. Урок 27. Обработка ошибок выполнения программы 365
Объект Err Объект Err является частью языка программирования VBA и всегда доступен в программах. В определенный момент времени объект Err содержит информацию о последней ошибке программы. Объект Err имеет следующие свойства и методы. • Number. Номер последней ошибки или О, если ошибок не было. • Description. Краткое описание последней ошибки или пустая строка, если ошибок не было. • Clear. Удаляет информацию об ошибке из объекта. Полный список ошибок, возникающих в ходе выполнения программы, и соответствующие им числовые коды представлены в справочной системе VBA. При возникновении ошибки объект Err можно использовать для получения информации об этой ошибке. Свойство Number содержит код ошибки, а свойство Description предоставляет информацию, которую, при желании, можно отобразить для пользователя. Если необходимо удалить из объекта Err информацию о предыдущей ошибке, вызовите метод Clear. Свойство Description объекта Err содержит то же описание ошибки, которое представлено в отображаемом по умолчанию диалоговом окне ошибки VBA. Кроме того, свойство Number объекта Err является свойством, используемым по умолчанию. Таким образом, выражение If Err = О эквивалентно выражению If Err.Number = 0. Код обработки ошибок Код обработки ошибок создается с целью решения следуюш;их задач. 1. Идентификация ошибки (с помощью объекта Err). 2. Выполнение соответствующих действий (например, отображение сообщения для пользователя). 3. Продолжение выполнения программы. Чтобы идентифицировать конкретную ошибку, необходимо иметь представление о том, какие именно ошибки могут возникнуть в ходе выполнения данной процедуры. Вы должны выполнить проверку свойства Err.Number на соответствие коду каждой из этих потенциальных ошибок. Если результат положительных выполняется действие, соответствующее данной ошибке. Рассмотрим такой пример. Предположим, что программа пытается открыть файл рабочей книги, расположенный на общем сетевом диске. При этом могут возникать такие ошибки: • ошибка 53, file not found (файл не найден); • ошибка 76, path not found (путь не найден); • ошибка 68, device not available (устройство не доступно); • ошибка 75, path/file access error (ошибка пути/доступа к файлу). В зависимости от того, какая ошибка произошла, вы можете предоставить пользователю следующие варианты: повторить попытку, связаться с сетевым администратором или предпринять другое действие. В самой задаче обработки 366 Часть VI. Воскресенье. День
ошибок нет ничего сверхъестественного. Необходимо знать, какие ошибки могут произойти, что можно сделать для их устранения (если что-то возможно сделать), и что означает данная ошибка в контексте вашей программы. При возникновении некоторых ошибок вы сможете лишь проинформировать пользователя об этой ошибке и завершить работу программы. Однако многие другие ошибки позволяют продолжить выполнение программы. Это означает, что часть кодов обработчика ошибок представляет собой инструкции по продолжению работы программы. Существует три возможных варианта. • Resume. Продолжить выполнение программы, повторив попытку выполнить оператор, который вызвал ошибку. Используйте оператор Resume в случаях, когда ошибка может быть исправлена пользователем (например, пользователь вставил дискету в дисковод А). • Resume Next. Продолжить выполнение программы, начиная с оператора, который следует за оператором, вызвавшим ошибку. Resume Next используется в тех случаях, когда ошибку нельзя исправить, однако оставшаяся часть процедуры может быть выполнена. • Resume метка. Продолжить выполнение программы, начиная с оператора, обозначенного меткой (которая должна находиться в той же процедуре). Используйте выражение Resume метка в тех случаях, когда применить операторы Resume и Resume Next невозможно. При выполнении любого из операторов Resume значения свойств объекта Err автоматически сбрасываются. Другими словами, информации об ошибке удаляется так же, как при вызове метода Err.Clear. Кроме того, значения свойств объекта Err сбрасываются при каждом выходе из процедуры. Осталось 10 минут Откладывание обработки ошибок Еще один метод обработки ошибок заключается в откладывании этого процесса. Другими словами, VBA не перехватывает ошибку, а просто игнорирует ее. После этого программа считывает значения свойств объекта Err для определения, имела ли место ошибка и какая именно. Чтобы отложить обработку ошибки, используйте выражение On Error Resume Next. Любые дальнейшие ошибки (в пределах процедуры) будут проигнорированы, а информация об ошибке — сохранена в объекте Err. Программа может использовать эту информацию для идентификации возникшей ошибки и определения, какие действия в связи с этим требуется предпринять. Структура кодов программы в таком случае будет иметь такой вид: On Error Resume Next ' Код, который может вызвать ошибку ' Если ошибка не произошла, то свойство Err.Number равно О If Err.Number > О Then ' Код, определяющий номер ошибки и описывающий ' действия, которые в связи с этим необходимо предпринять End If Подобный метод используется только для тех ошибок, обработку которых можно отложить. Он не подходит для ошибок, которые нельзя временно проигнорировать. Не существует способа точно определить, какие именно ошибки попадают в эту категорию — в одной программе ошибка является серьезной и должна быть Урок 27. Обработка ошибок выполнения программы 367
сразу же обнаружена и обработана, тогда как в другой она может оказаться вполне допустимой. И опять-таки, сам программист должен учесть все вероятные ошибки, которые могут произойти, и определить, какой статус они будут иметь в контексте конкретной создаваемой программы. После использования выражения On Error Resume Next ни один оператор Resume не может быть использован при обработке возникшей ошибки. Их применение допустимо лишь в кодах обработчика ошибок, переход к которому осуществляется с помощью выражения On Error Goto. Примеры обработки ошибок Задачи, связанные с обработкой ошибок в программе VBA, решаются гораздо проще и эффективнее, если у вас уже есть определенный опыт в этой области. Именно с этой целью в настоящем разделе рассматриваются примеры использования возможностей VBA для обработки ошибок. Игнорирование ошибки Метод Excel Special Cells позволяет получить ссылку на те ячейки заданного диапазона, которые соответствуют определенному критерию. Например, на ячейки, содержащие формулы или снабженные комментариями. Если такие ячейки не были найдены, возникает ошибка. Во многих ситуациях эту ошибку можно просто проигнорировать, поскольку она не влияет на успешность выполнения программы. Метод SpecialCells был рассмотрен в уроке 11. В листинге 27.1 показана процедура, которая выделяет все снабженные комментариями ячейки текущей выделенной области. Если в пределах выделенной области отсутствуют ячейки с комментариями, то возникшая в результате ошибка будет проигнорирована благодаря использованию выражения On Error Resume Next, a сама выделенная область останется без изменений. Если ошибка не возникает, то выделяются ячейки, имеющие комментарии. Листинг 27Л. Использование выражения On Error Resume Next с целью игнорирования возникающей ошибки Public Sub SelectCellsWithCommentsО Dim г As Range On Error Resume Next Set r = Selection.SpecialCells(xlCellTypeComments) If Err = 0 Then r.Select End Sub Информирование пользователя о возникшей ошибке Продолжая предыдущий пример, предположим, что вы решили проинформировать пользователя о том, что процедура не нашла ячеек с комментариями. 368 Часть VL Воскресенье. День
Можно изменить коды и использовать выражение On Error Goto, благодаря добавлению которого на экране будет отображено требуемое сообщение (листинг 27.2). Листинг 27.2. Использование выражения On Error Goto для информирования пользователя о возникшей ошибке Public Sub SelectCellsWithCommentsО Dim г As Range On Error Goto ErrorHandler Set r = Selection.SpecialCells(xlCellTypeComments) Exit Sub ErrorHandler: MsgBox "B текущей выделенной области не было найдено ячеек с комментариями" End Sub Использование ошибок в качестве инструмента программирования Возможности обработки ошибок VBA в некоторых ситуациях используются как инструмент программирования. Появление ошибки может свидетельствовать о возникновении определенной ситуации или условия, что должно повлечь за собой выполнение соответствующих действий. В качестве примера рассмотрим следующий фрагмент: Dim wb As Workbook Set wb = Workbooks("Статистика") Если рабочая книга под названием Статистика открыта, программа функционирует должным образом. Если же книга закрыта, возникает ошибка. Этот факт можно использовать в тех ситуациях, когда заранее не известно, будет ли открыта требуемая рабочая книга. В листинге 27.3 показана функция, возвращающая ссылку на рабочую книгу, если она открыта, и Nothing, если книга закрыта. Программа может вызывать эту функцию и проверять значение, которое она возвращает. Если это значение Nothing, программа выполняет действия, требуемые для открытия данной рабочей книги. Листинг 27.3. Использование ошибок в качестве инструмента программирования Public Function GetReferenceToWorkbook(wbName As String) As_ Workbook Dim wb As Workbook On Error Resume Next Set wb = Workbooks(wbName) If Err = 0 Then ' Книга wbName открыта. Set GetReferenceToWorkbook = wb Else ' Книга wbName не открыта, функция возвращает • Nothing Урок 27. Обработка ошибок выполнения программы 369
Set GetReferenceToWorkbook = Nothing End If End Function Обзор XJPr в этом уроке были рассмотрены методы использования инструментов обработки Готошо! ошибок VBA, которые применяются в работе с ошибками, возникающими в ходе выполнения программы. • Необработанная ошибка останавливает программу и может привести к потере данных. • Перехват ошибок VBA реализуется посредством использования одного из операторов On Error. • Обработка ошибок VBA выполняется на уровне процедур. • Информация о возникшей ошибке содержится в объекте Err. • Обработку ошибки можно отложить, используя выражение On Error Resume Next. • В некоторых случаях ошибки применяются в качестве инструментов программирования . Проверьте себя Какие ошибки можно оставлять необработанными? (См. раздел "Что такое ошибка выполнения программы".) Все ли потенциальные причины возникновения ошибок могут быть устранены программистом? (См. подраздел "Причины возникновения ошибок".) Можно ли поместить выражение On Error Goto метка в одной процедуре, а коды обработчика ошибки — в дрзтой? (См. раздел "Перехват ошибок".) Какое значение имеет свойство Err. Number, если ошибок не было? (См. раздел "Объект Err".) Как в кодах обработчика ошибок продолжить выполнение программы именно с того оператора, который вызвал ошибку? (См. раздел "Код обработки ошибок".) 370 Часть VL Воскресенье. День
УРОК Задачи баз данных Содержание урока ^ Базы данных в Excel V Основные понятия баз данных ^ Сортировка записей ^ Фильтрация записей ^ Создание и использование форм для ввода данных ^ Использование статистических функций баз данных О Несмотря на то, что Excel является приложением электронных таблиц, в нем также предусмотрены инструменты, обеспечивающие функциональные возможности для работы с базами данных. В этом уроке описано, что Осталось ^ о ^ ' 30 минут представляют собой приложения баз данных, и как можно использовать Excel для решения задач, связанных с обработкой баз данных. Базы данных в Excel Программы баз данных, без сомнения, принадлежат к категории наиболее распространенных компьютерных приложений. Они используются везде, где осуществляется управление информацией, хотя многие пользователи об этом даже не подозревают. • Когда вы применяете электронный каталог библиотеки для нахождения требуемой книги, то вы пользуетесь приложением базы данных. • Когда вы делаете телефонный заказ на доставку одежды, программного обеспечения, бытовой техники или других товаров, торговый представитель, с которым вы разговариваете, использует приложение баз данных, чтобы проверить наличие товара на складе и принять заказ.
• Используя Quicken или другую финансовую программу для ведения домашнего хозяйства и записи текущих доходов и расходов вы также работаете с приложением базы данных. Большинство приложений баз данных имеют узкую специализацию и рассчитаны исключительно на решение каких-то конкретных задач. Будучи приложением электронных таблиц. Excel не имеет подобных возможностей, а потому многие задачи баз данных не могут быть решены средствами и инструментами Excel. Тем не менее, инструменты баз данных Excel обладают достаточно широкой функциональностью, что позволяет решать более простые задачи баз данных. Кроме того, в этом также есть свой позитивный момент: поскольку возможности баз данных Excel ограничены, их легче изучить и применить на практике. Основные понятия баз данных Термин база данных (database) указывает на специальный способ организации и представления информации. Этот способ так или иначе использовали все, даже те, которые никогда не работали с компьютером. У вас есть записная книжка? Это база данных, хотя и ручная, а не компьютерная. База данных основана на следующих концепциях записей и полей. • Запись содержит информацию об отдельном элементе, сведения о котором содержатся и обрабатываются в базе данных. В списке адресов, например, запись соответствует одному человеку. В инвентаризационном списке автозапчастей запись соответствует одной отдельной запчасти. • В поле содержится отдельный фрагмент информации, соответствующий той или иной записи. В базе данных адресов, например, в полях будут храниться имя, фамилия, адрес, телефонный номер и другие данные о конкретном человеке. Важной особенностью баз данных является то, что каждая отдельная запись содержит те же поля, что и все прочие записи. Разумеется, значения, сохраненные в одних и тех же полях разных записей, отличаются друг от друга, однако сам перечень полей для разных записей одинаков. Вероятно, вы уже обратили внимание на то, что структура базы данных и структура рабочей книги Excel совпадают. Используя строки рабочей книги в качестве записей, а столбцы в качестве полей базы данных, можно без проблем разместить данные из базы данных на листе рабочей книги Excel. В верхней строке обычно располагаются названия полей, а в строках под ней — фактические значения, содержащиеся в базе данных. На рис. 28.1 показан пример базы данных в Excel. На данном рабочем листе названия полей выделены жирным шрифтом, однако это сделано исключительно для удобства визуального восприятия представленных данных. Возможно, некоторые читатели подумают: ну и что в этом такого? Возможность создания списков данных на рабочем листе мало кого удивит. Это действительно так, однако интерес представляют специальные инструменты Excel, которые предназначены для обработки данных, сохраненных в виде записей и полей. Термин таблица (table) нередко используется для обозначения данных, представленных в виде совокупности записей и полей (т.е. организованных в виде базы данных). Некоторые базы данных состоят из нескольких таблиц. В Excel иногда вместо термина таблица используется термин список (list). 372 Часть VL Воскресенье. День
^ш^ш^^^^^^^^^^^^ш^^^^^^ш^шшш \Щ ^йл Оравка Вид бсцвка Фор£зат A1 ▼^ : /ь fe:^: 1 2 . О.. 1 ± |V ^-'^Ы,:-:^ .в [ -. ' 'с:'-\ ■■ 1 Имя Фамилия Адрес Андрей Белый Шевченко, 12 Дмитрий Сухой -Гонты. 25 Алена Крутая Независимое™, Василий Дикий Победы. 11 |м ^ ► И|\Лист1/Лид;2/^^ {готово -' ' ; , ' ''• ''' "'■■ ^ШШ^^^Щщщщшщ9'^^^Щ^^|ЩщЩЩ^^^i^^^ :'^'- i ft г . «:^;|Ц-«100% у;-ШШ Город Область .Индекс ; Ужгород .Закарпатская- 24346; Одесса | Одесская . 54215 45 Берди^юв Хмельниу^^ 36365 Умань ; Черкасская j 65437 • " "■"" "■ т-ш-т [Plplg ill ■ " II Рис. 28.1. Концепция записей и полей таблицы базы соответствует принятым в Excel правилам использования строк и столбцов Сортировка данных Данные в таблице сортируют по значениям одного или нескольких полей. Например, список сотрудников можно сортировать по полю Фамилия, расположив значения этого поля в алфавитном порядке. Чтобы осуществить сортировку данных в Excel, поместите курсор в любой ячейке таблицы и выберите команду Данные'=>Сортировка. Excel автоматически выделит таблицу данных и отобразит диалоговое окно Сортировка диапазона (рис. 28.2). I ^ 1 <• по возрасгв|{1|ю С поу6ыван»чй I ^ I <• по ^jK^^acntHKia 8 посявдаюю очередь, по -/ - - ; •■ г I 71 <• по «^иктанию г поу^увакйю 11дедгифццировать поля по - - (• оодписям (первая строка д»ктазон&) С обоэноиемти столбцов лиаа Пар»к€ггры... Отиена Рис. 28.2. Использование команды Сортировка для сортировки таблицы данных Если в верхней строке таблицы содержатся названия полей (что является обычной практикой), в каждом из трех выпадающих списков диалогового окна будет отображаться перечень этих названий. В списке Сортировать по выберите Урок 28. Задачи баз данных 373
поле, по которому необходимо отсортировать данные, содержащиеся в таблице. Для выполнения дополнительной сортировки по другим полям используйте списки Затем по и В последнюю очередь по. Значения этих полей будут учитываться при сортировке записей, если значения первого поля совпадают. Чтобы осуществить сортировку данных из программы VBA, используйте метод Sort объекта Range. Он имеет такой синтаксис: SomeRange.Sort Keyl, Orderl, Кеу2, Order2, Header Метод включает следующие аргументы. • SomeRange, Объект Range ссылается на диапазон значений, подлежащих сортировке. Объект может ссылаться на весь диапазон или на одну его ячейку (в последнем случае Excel автоматически выделяет весь диапазон, содержащий данные). • Keyl. Объект Range ссылается на столбец, по значениям которого должна осуществляться сортировка всего диапазона. Этот объект может ссылаться на любую ячейку требуемого столбца. • Orderl. Необязательная константа, определяющая порядок сортировки. Можно выбрать значение xlAscending (значения столбца будут отсортированы по возрастанию от А до Z; используется по умолчанию) или xlDescending (обратный порядок сортировки). • Кеу2. Необязательный объект Range, ссылающийся на второй столбец, по значениям которого должна осуществляться сортировка. • Order2. Необязательный аргумент, определяющий порядок сортировки по второму столбцу. • Header. Необязательная константа, указывающая, имеет ли таблица строку заголовка с названиями полей. Константа может принимать значения xlYes (да), xlNo (нет) или xlGuess (по умолчанию). Если выбрано значение xlGuess, Excel анализирует таблицу данных и самостоятельно определяет, есть ли в ней строка заголовков. В представленном выше синтаксисе метода Sort опущены некоторые необязательные аргументы, рассмотрение которых выходит за рамки настоящей книги. Поэтому при вызове метода всегда используйте именованные аргументы. Ниже показан пример использования уметода Sort для сортировки таблицы. Предположим, что рабочий лист содержит таблицу, имеющую строку заголовков, и что ячейка А2 принадлежит этой таблице. Следующий код осуществляет первичную сортировку данных таблицы по значениям поля, расположенного в столбце В, и вторичную сортировку по значениям поля, расположенного столбце D. Worksheets("ОбъемПродаж").Range("А2").Sort Кеу1:= _ Worksheets("ОбъемПродаж").Range("В2"), Кеу2:= _ Worksheets("ОбъемПродаж").Range("D2"), Header:=xlYes Фильтрация данных Термин фильтрация означает отбор определенных данных, содержащихся в таблице. Например, путем применения фильтра к базе данных почтовых адресов можно отобрать все записи, соответствующие адресам в Калифорнии. В Excel реализована возможность применения автофильтра (auto filter). Чтобы ее можно было использовать, таблица данных должца включать строку за- 374 Часть VL Воскресенье. День
головка, содержащую названия полей. Автофильтр используется следующим образом. 1. В Excel расположите курсор в любой ячейке таблицы данных. 2. Выберите команду Данные'=>Фильтрс>Автофильтр. В результате рядом с каждым названием поля появится кнопка с направленной вниз стрелкой. 3. Щелкните на стрелке рядом с названием поля, по значениям которого вы хотите отфильтровать данные. Excel отобразит список доступных фильтров (рис. 28.3): • (Все): отменяет действие предыдущего фильтра и отображает все записи; • (Первые 10...): выбирает десять наиболее часто встречаемых значений этого поля; • (Условие...): отбор значений по специально заданному условию; • конкретное значение: фильтр по этому значению (на рисунке — по значению Смирнофф). $аил Правка Вид Возвка <|К)рйте-^Сй)ёйсг^^|^ В2 ▼Л^;;;^/:^^^" Фамилия 3 *1лаз ±^мш. Имя ▼|Фамил(^ Андрей . „ (Первые 10...) Дмитрий (Устрвие...) Алена ^^""J Дикий Василий круп-ая [Сухой [Адрес ^jГород ▼)Область >^)Индек<>| Шевченко, 12 Ужгород [Закарпатская: 243461 Гонты, 25 РДвсса [Одесская j 54215 i Независимости, 45 :Бердичев1 Хмельницкая; 36365; Победы, 11 :У^а"ь ; Черкасская 654371 И 4 . Г1и]\Ли<т1 Готово'' ■": '. ■'-.'^''-''^ ■/'■": ;'^^^.v ±] нт ш Рис. 28.3. Применение автофилътра 4. Чтобы отменить действие автофильтра и отобразить все записи, повторно используйте команду Данные«=?>Фильтр'=оАвтофильтр. В раскрывающихся списках автофильтра содержатся команды Сортировка по возрастанию и Сортировка по убыванию. Их выбор является быстрым способом сортировки таблицы при условии использования автофильтра. В результате применения фильтра некоторые содержащиеся в таблице записи как будто исчезают. Не беспокойтесь, на самом деле записи не удаляются из таблицы, они лишь будут временно скрыты. Чтобы применить фильтр в программе, используйте метод AutoFiIter. 5omei?ange.AutoFiIter(Field, Criterial, Operator, Criteria2,_ Vi s ibleDropDown) Урок 28. Задачи баз данных 375
• SomeRange. Объект Range, идентифицирующий диапазон, к которому должен применяться фильтр. Объект может ссылаться на весь диапазон или на одну его ячейку (в таком случае Excel автоматически выделяет весь диапазон, содержащий данные). • Field. Необязательное числовое значение, указывающее поле, по которому выполняется фильтрация. Значение является индексом поля; крайнему левому полю соответствует индекс 1. • Criterial. Необязательный аргумент, определяющий критерий выполнения фильтрации. Если он опущен, будут отобраны все записи. • Operator. Необязательная константа, определяющая способ интерпретации критерия, заданного аргументом Criterial (и в некоторых случаях критерия, заданного аргументом Criteria2) — подробно см. табл. 28.1. • Criteria2. Необязательный аргумент, определяющий второй критерий выполнения фильтрации. • VisibleDropDown. Необязательное значение True/False. Если это значение равно True (по умолчанию). Excel отображает на рабочем листе для полей, по которым производится фильтрация, кнопки со стрелками, позволяющими пользователю вручную работать с фильтром. Если это значение равно False, кнопки не отображаются. Таблица 28.1. Константы для аргумента Operator метода AutoFUter Константа Значение xlAnd Отобранные записи должны соответствовать обоим критериям, заданным аргументами Criterial и Criteria2 (эта константа используется по умолчанию) хЮг Записи должны соответствовать либо Criterial, либо Crite- ria2 (либо обоим критериям) xlBottomlOItems Отбирается 10 наиболее редко встречаемых элементов х1 Bot toml О Percent Отбирается 10 процентов наиболее редко встречаемых элементов xlToplOItems Отбирается 10 наиболее часто встречаемых элементов xlTopl О Percent Отбирается 10 процентов наиболее часто встречаемых элементов Вызов метода AutoFiIter, в котором не передаются значения аргументов, сопровождается включением/отключением отображения кнопок со арелками для данного диапазона. Если к диапазону применен автофильтр, арелка кнопки того поля, по которому производился отбор данных, меняет свой цвет с черного на синий. Критерием для метода AutoFiIter является строка, определяющая значение, по которому выполняется фильтрация. Например, если аргументу Criterial передано значение "NY" и отбор выполняется по полю Штат, отобранными окажутся все записи, соответствующие штату NY (Нью-Йорк). Предусмотрены также специальные значения, которые можно использовать для определения критерия отбора: • = — отбираются все записи, для которых данное поле является пустым; • о — отбираются все записи, для которых данное поле не является пустым. Способы воздействия аргумента Operator на порядок выполнения фильтрации перечислены в табл. 28.1. Значения xlAnd и хЮг используются в тех случаях, когда отбор записей производится по двум полям, определенным аргументами 376 Часть VL Воскресенье. День
Criterial и Criteria2. Другие значения применяются для специальных фильтров, в которых критерии не указываются. Ниже приведены примеры использования представленной на рис. 28.1 таблицы базы данных, причем предполагается, что в этой таблице должно содержаться достаточно большое количество записей, кроме того, активная ячейка должна быть одной из ячеек таблицы. Следующий код определяет фильтр, в результате применения которого отображенными в таблице остаются только записи, соответствующие городу Нью-Йорк: Selection.AutoFilter Field:=4, Criterial:="Нью-Йорк" Следующий код определяет фильтр, после применения которого остаются отображенными записи людей из десяти штатов, встречаемые в таблице реже всего: Selection.AutoFilter Field:=5, Operator:=xlBottomlOIterns Этот код определяет фильтр, который отбирает записи всех людей с фамилией Смирнофф или Кулик: Selection.AutoFilter Field:=24, Criterial:="Смирнофф", _ Criteria2:="Кулик", Operator:=xlOr Формы для ввода данных При работе с таблицей баз данных вводить и редактировать значения непосредственно на рабочем листе не всегда удобно. Гораздо предпочтительнее иметь специальную форму, в которой в определенный момент времени отображаются значения полей одной записи, представленные в удобном для восприятия формате. При разработке более сложных приложений баз данных может возникнуть необходимость в создании экранной формы (см. уроки с 19 по 22), которая позволяет не только реализовать все возможности визуального интерфейса, но и включить проверку корректности вводимых данных. Для решения более простых задач вам вполне может подойти форма, которую Excel генерирует автоматически. Расположив курсор в одной из ячеек таблицы базы данных, выберите команду Данные^=^>Форма, в результате чего Excel автоматически создаст и отобразит форму, построенную на основе полей вашей таблицы. Соответствующий пример показан на рис. 28.4. Рис. 28.4. Форма, созданная Excel автоматически для таблицы базы данных почтовых адресов Урок 28. Задачи баз данных 377
Кнопки этой формы позволяют пользователю выполнить следующие действия. • Добавить. Ввод данных для новой записи (которая добавляется в нижнюю часть таблицы). • Удалить. Удалить текущую запись. • Вернуть. Отменить последнюю команду Удалить. • Назад. Перейти к предыдущей записи (если она есть). • Далее. Перейти к следующей записи (если она есть). • Критерии. Определить критерии для фильтрации таблицы. • Закрыть. Закрыть форму. Чтобы отобразить автоматически создаваемую форму из программы VBA, необходимо вызвать метод ShowDataForm объекта Worksheet. Например: ActiveSheet.ShowDataForm При вызове этого метода работа макроса приостанавливается до тех пор, пока пользователь не закроет форму. Только после этого выполняются следующие операторы макроса. Функции баз данных Excel предоставляет ряд встроенных функций, которые специально предназначены для работы с данными, сохраненными в таблице. Эти функции называются статистическими функциями баз данных. Их названия начинаются с буквы Б или Д, что указывает на их отношение к базам данных. Каждой функции баз данных соответствует другая аналогичная функция, выполняющая ту же задачу за пределами баз данных. Например, функции баз данных БД СУММ соответствует функция СУММ, функции ДСРЗНАЧ — функция СРЗНАЧ и т.д. Функции баз данных перечислены в табл. 28.2. Таблица 28.2. Статистические функции баз данных в Excel Функция Описание ДСРЗНАЧ Вычисляет среднее значение БСЧЁТ Подсчитывает количество записей ДМАКС Находит максимальное значение ДМИН Находит минимальное значение ДСТАНДОТКЛ Оценивает стандартное отклонение БДСУММ Вычисляет сумму БДДИСП Оценивает дисперсию Все функции баз данных имеют следующий синтаксис: ИмяФункции (база__данных, поле, критерий) Далее мы представим описание этих аргументов: • база_данных— диапазон, в котором содержится таблица базы данных (например, Аб : F3 0); • поле — поле базы данных, значения которого участвуют в вычислениях. Это может быть строка, содержащая название поля, или число, которое 378 Часть VL Воскресенье. День
определяет порядковый номер данного поля, отсчитываемый от левого края таблицы (первому столбцу соответствует номер 1); • критерий — диапазон, содержащий критерий (например, А1: А2). Третий аргумент вызывает наибольшие сложности в использовании функций баз данных. Критерий определяют в диапазоне из двух ячеек рабочего листа, расположенных одна над другой: • верхняя ячейка содержит название поля, к которому должен применяться этот критерий; • нижняя ячейка содержит сам критерий, заданный с помощью оператора сравнения VBA. Предположим, таблица базы данных содержит поле под названием Возраст. Вы решили создать критерий, согласно которому должны отбираться только те записи, значение которых в этом поле превышает число 40. Верхняя ячейка диапазона, определяющего критерий, должна содержать значение Возраст, а нижняя—>40. ^ Приведенный ниже пример применения статистических функций баз данных основывается на использовании таблицы, показанной на рис. 28.5. ^ W V- [Щ Шайл Op^wa ВйдУ F13 v>'',^-^^i 100% i ®-i110 щ "ШШЕЩШк > i Имя Фамилия Возраст CTfUR ;Ртд«п Андрей Белый 28 12 мес. Продаж Дмитрий Сухой 25 Змее :Маркетинга Алена Крутая 29 24 мес Продаж Василий Дикий 32 17 мес Рекламы Игорь Соболь 24 22 мес. Продаж iЗарплата : ^450'00 ' €350,00 € 480,00 ' € 390.00' €490.00 14 Рис. 28.5. Таблица базы данных, используемая для демонстрации применения функций баз данных Предположим, вам необходимо определить количество сотрудников, работающих в отделе продаж, и их среднюю заработную плату. Для решения данной задачи вам потребуется выполнить следующие действия. • Определите критерий в ячейках А1: А2. Введите значение Отдел в ячейке А1, чтобы указать, к какому полю относится данный критерий. • Введите значение Продаж в ячейке А2. Урок 28. Задачи баз данных 379
• в ячейке СЗ наберите слова Всего служащих. • В ячейке С4 наберите Средняя зарплата. • Введите в ячейке Е2 формулу =БСЧЁТ (А7 : F15; "Зарплата" ; А1: А2). • Введите в ячейке ЕЗ формулу =ДСРЗНАЧ (А7 : F15; "Зарплата " ; А1: А2). • На панели инструментов Excel щелкните на кнопке Денежный формат, чтобы применить к ячейке ЕЗ денежный формат. Полученный рабочий лист показан на рис. 28.6. Как видите, в ячейках, в которые были введены формулы баз данных, отображаются полученные результаты. Если данные в таблице изменяются, возвращаемые функциями баз данных результаты обновляются автоматически. Однако обратите внимание, что при добавлении в таблицу новых записей формулы не будут учитывать этих изменений. Все дело в том, что диапазон, содержащий таблицу, жестко определен в самих формулах. Поэтому если возникнет такая необходимость, вам придется изменить формулы самостоятельно. Щ} $^ Ор&вт Вид Во^бка Фор{§аг С^врвйс Данные р№к> 0^^ ЕЗ ' ' M^S:^^- lb =ДСРЗНАЧ(А7:Р 15;"Зарплата-;А1 :А2) ^ЯНХ! ±: Отдел Продаж ,Ш-^|:.хоО' -:| ■• н •• |: .— Всего служащих : Средняя зарплата [^ 3 € 473.33| н Фамилия Возраст Стаж Имя Андрей Дмитрий Алена Василий 12J Игорь 14: .Готово V••-: ;:'v' ••'■^''' '•' .'•"•* • "• Белый Сухой Крутая Дикий ; Соболь 28 12мвс. 25 3 мес 29 24мес. 32 17 мес. 24 22 мес. Отдел Продаж Маркетинга Продаж Рекламы Продаж ;Зарплата €450,00 €350.00 : €480.00 : €390,00 € 490,00 _J 1Г тм Рис, 28.6. Рабочий лист, на котором отображаются результаты, возвращаемые функциями баз данных Готово! Обзор В ЭТОМ уроке вы узнали, как использовать Excel и VBA для обработки информации, содержащейся в базах данных. • Информация в базе данных организована в виде записей и полей. • В Excel записи представлены строками, а поля — столбцами. • Чтобы выполнить сортировку записей таблицы, используйте метод Range.Sort. 380 Часть VI. Воскресенье. День
• Чтобы отфильтровать представленные в таблице записи, примените метод AutoFilter. • Статистические функции баз данных используются для получения итоговых показателей по таблице. Проверьте себя 1. Что расположено в верхней части каждого столбца таблицы базы данных? (См. раздел "Основные понятия баз данных".) 2. Значения какого количества столбцов могут учитываться при выполнении сортировки? (См. раздел "Сортировка данных".) 3. Какой метод VBA следует выбрать, чтобы применить фильтр к таблице базы данных? (См. раздел "Фильтрация данных".) 4. Предположим, вы не хотите разрабатывать экранную форму для использования с таблицей базы данных. Существуют ли другие варианты ввода данных? Если да, то какие? (См. раздел "Формы для ввода данных".) 5. Как определяется критерий, применяемый при вызове статистических функций баз данных? (См. раздел "Функции баз данных".) Урок 28. Задачи баз данных 381
УРОК Создание надстроек Содержание урока ^ Основные отличия надстроек от рабочих книг ^ Создание надстроек ^ Передача надстроек конечным пользователям ^ Использование менеджера надстроек Excel ^ Использование событий в надстройках ^ Управление надстройками из программы VBA Большинство приложений Excel распространяются в виде рабочих книг, о чем рассказывалось в уроке 25; однако наряду с этим существует еще один способ представления приложений — в виде надстроек {add'ins)^ создание которых Осталось ^ <? -г» 30 минут В некоторых случаях более предпочтительно, чем создание рабочих книг. В настоящем уроке речь пойдет о создании и использовании надстроек Excel. Основные отличия надстроек от рабочих книг Чтобы принять правильное решение о том, в каком виде следует разрабатывать то или иное приложение (в виде надстройки или рабочей книги), необходимо знать, чем одна возможность отличается от другой. Рабочие книги и надстройки имеют довольно много общего. Разработка надстройки начинается с создания рабочей книги, которая может содержать рабочие листы с сохраненными на них данными и программы VBA. Рабочая книга преобразуется в надстройку на конечном этапе, когда приложение готово к передаче конечным пользователям. Excel содержит несколько надстроек, являющихся инструментами решения специальных задач. К числу таких надстроек принадлежат, например, инструменты Пакет анализа и Пересчет в евро.
По ряду параметров надстройка отличается от обычной рабочей книги. • Окно рабочей книги-надстройки скрыто и не может быть отображено. Это означает, что данные на рабочем листе, который является частью надстройки, не видны для конечного пользователя, если только они не были скопированы на отображаемый рабочий лист. • Программы (макросы) надстройки не отображаются в диалоговом окне Excel Макросы. • Надстройка устанавливается не с помощью обычной команды Файл"=>Открыть, а путем использования менеджера надстроек (см. далее в этом уроке). • Свойство IsAddIn объекта ThisWorkbook имеет значение True. Надстройку можно использовать для любых задач, решаемых с помощью обычных рабочих книг, исключение составляет лишь отображение данных и диаграмм. Однако надстройки могут содержать и экранные формы. Ниже перечислены три наиболее распространенные причины, в связи с которыми предпочтительнее использовать именно надстройки, а не рабочие книги. • С целью предоставления пользователю возможности запускать программы VBA (макросы). Например, надстройка может содержать набор процедур VBA, в результате выполнения которых к ячейкам рабочего листа применяется специальное форматирование. • С целью предоставления функций, предназначенных для использования на рабочих листах. Надстройка может содержать специализированные функции бухгалтерского учета, которые пользователь будет использовать на своем рабочем листе подобно обычным встроенным функциям Excel. • С целью предоставления данных, доступ к которым необходим в процессе выполнения приложения, однако их не обязательно отображать для пользователя. Надстройка может содержать, например, рабочий лист с несколькими таблицами процентных и амортизационных ставок, которые будут использованы в приложении. Несмотря на то, что макросы надстроек не отображаются в диалоговом окне Макросы, вы можете запустить их, введя название макроса в поле Имя макроса этого диалогового окна. Однако не стоит обременять конечных пользователей необходимостью выполнения макросов таким способом. Для этой цели- следует создать специальные кнопки на панели инструментов. Итак, в каких же случаях предпочтительнее передавать созданное приложение конечным пользователям в виде надстройки, а не в форме обычной рабочей книги? Если приложение не содержит данных или диаграммы, которые должен видеть пользователь, следует сделать выбор в пользу надстройки. Надстройки имеют ряд потенциальных преимуществ. ♦ Снижение вероятности появления недоразумений. Поскольку рабочие листы надстроек всегда скрыты, пользователь не сможет перепутать их с листами собственной рабочей книги. • Более простой доступ к приложению. Будз^и установленной в системе пользователя, надстройка остается постоянно доступной благодаря менеджеру надстроек Excel. Надстройка может также загружаться автоматически при запуске Excel. 384 Часть VL Воскресенье. День
• Более простой доступ к пользовательским функциям. Функции надстройки можно вызывать без необходимости согласовывать их названия с названием рабочей книги. Помните, однако, что не всегда можно сделать однозначный выбор между надстройкой и рабочей книгой. Многие приложения распространяются и в том, ив другом варианте, таким образом, решить поставленную задачу можно несколькими способами. Создание надстроек Создание надстройки — несложный процесс. Порядок разработки самого приложения не зависит от того, в каком виде оно будет распространяться: в виде рабочей книги или надстройки. Если приложение содержит макросы, необходимо учесть способ их запуска, поскольку, как уже отмечалось в этом уроке, они не будут доступны из окна Excel Макросы. Как правило, эта задача решается путем добавления специальной панели инструментов, создание которой было рассмотрено в уроке 16. Обязательно протестируйте приложение на работоспособность, открыв другую рабочую книгу, поскольку именно в таких условиях будет использоваться надстройка (надстройка никогда не является активной рабочей книгой). Завершив тестирование надстройки, используйте приемы, рассмотренные в уроке 24, для защиты кодов приложения от просмотра и изменения. Рабочая книга, сохраняемая в качестве надстройки, должна содержать как минимум один рабочий лист, даже если он будет пустым. Файлам надстроек принято давать расширение .х1а. Это условие не является обязательным, вы вправе при желании указать другое расширение, но во избежание путаницы рекомендуется придерживаться этого соглашения. Чтобы создать надстройку, выполните следующие действия. 1. В Excel выберите команду Файл'=>Свойства, чтобы отобразить диалоговое окно Свойства данной рабочей книги. Перейдите на вкладку Документ (рис. 29.1). 2. Введите название надстройки в поле Название и ее описание в поле Заметки. Эта информация будет отображаться в менеджере надстроек, она может пригодиться для конечного пользователя. Щелкните на кнопке ОК, чтобы закрыть диалоговое окно Свойства. 3. Выберите команду Файл^=>Сохранить как. 4. Из списка Тип файла выберите вариант Надстройка Microsoft Excel. 5. Если необходимо, укажите, в какой папке должен быть сохранен файл, и введите название в поле Имя файла. 6. Щелкните на кнопке Сохранить. Осталось 20 минут Передача надстроек конечным пользователям Процесс распространения надстроек заключается в передаче конечным пользователям копии созданного вами файла .х1а. Чтобы открыть менеджер надстроек, выберите в меню Excel команду Сервис=>Надстройки. В диалоговом окне Надстройки (рис. 29.2) вы увидите перечень доступных в данный момент надстроек, причем все уже установленные надстройки будут отмечены флажками. Урок 29. Создание надстроек 385
^i'^1 Общие :/ON>icyH€»«T Iсгвг»т«и| Состав! П{^^ Нгвввние:" ' ~ ■ Teiiat Автор: Рук&в<щкгедь: Учреждение: Группа: ' ' Ключевые слова: • • -Заиетхи: • .' • • . ^- .1' . '•. •••.■-; \ Пользовательские функции : | BOSS ^ i . _ J Надстройка для вычисления выплат по | кредиту! ' возе ■ -^ - '-. ' . ; 1 ••,:.•! шперссыл!»: • J . t.iJ56ndf' ■ . ■ ":.'■■." "■' ■ ;•-".••■ 1 F СОЗД5Ш» рисунок ^предваркгельного просмотра ок Отмена Рис. 29.1. Ввод информации о свойствах надстройки Ш8!ШВ111111ЯИ1Н1Я 1 floCTYfWi^e'надстройки; •' Р Мастер подстановок ""^ . Р Мастер суммирования Ir' Пакет анализа L ^^ресчет в евро 1^ Поиск решения ji Помощник по Иктернету •••>-V. - •■ OK ■ Jl O^p... Двтоматизамия.., 1 •г/Ла1у8ЙТоЫ1=^-У8А---7;:- • - '■■■-■--'- :••: 5 \.\ '' :-- Фртцт VBA для'работы пакета анализа |1 •./ ;■>.: : ; ■"'"'^ ' __/-:_ ;,....,;' ^ ,., ...J Рис. 29.2. В диалоговом окйе Надстройки отображен перечень всех доступных надстроек, а уже установленные надстройки отмечены флажками Excel автоматически обнаруживает надстройки, расположенные в используемой по умолчанию папке Library, путь к которой имеет приблизительно такой вид: C:\Program files\Microsoft Office\Officell\Library. Чтобы сообщить Excel о надстройке, расположенной в другой папке, выполните следующие действия. 1. Щелкните на кнопке Обзор, чтобы открыть диалоговое окно Обзор. 2. Перейдите к папке, в которой содержится данная надстройка. 3. Выделите файл надстройки и щелкните на кнопке ОК. Открытие надстроек с помощью команды Файл'=>Открыть Надстройку можно открыть в Excet используя команду Файл^^Открыть. При этом надаройка открывается как обычная рабочая книга и ее рабочие листы становятся доступными для просмотра. Однако надстройка, открытая таким образом, не считается уаановленной. Поскольку конечные пользователи, как правило, не должны открывать надстройки таким способом, лучше хранить файлы надстроек не в той папке, в которой расположены файлы рабочих книг. После того, как Excel обнаружит надстройку, ее название (определенное в диалоговом окне Свойства на этапе создания надстройки) будет отображено в диалоговом окне Надстройки. Чтобы установить надстройку и сделать ее команды и функции доступными для открытой рабочей книги, в диалоговом окне Надстройки рядом с ее названием установите флажок. Сняв его, вы отмените установку данной надстройки и освободите выделенную для нее память. 386 Часть VI. Воскресенье. День
Все установленные надстройки автоматически загружаются при следующем запуске Excel. Если вы не хотите, чтобы надстройка загружалась, ее придется специально отключить. Надстройки и события Существует несколько событий рабочих книг, которые имеют особое значение при работе с надстройками (хотя эти события используются также и в обычных рабочих книгах). Это события WorkbookOpen и WorkbookBef oreClose. Как уже отмечалось в этом уроке, макросы надстроек не отображаются в диалоговом окне Excel Макросы. Следовательно, возникает необходимость учитывать способ запуска макросов конечными пользователями (предполагается, что надстройка имеет свои макросы, хотя это справедливо не для всех надстроек). Обычно такая задача решается путем создания специальной панели инструментов, кнопки которой соответствуют макросам надстройки. Именно в теле процедуры события WorkbookOpen помещают коды для создания и отображения этой панели инструментов, а в теле процедуры события WorkbookBef oreClose помещают коды, скрывающие данную панель (при отключении надстройки). Использование этих процедур показано на примере демонстрационной надстройки, рассмотренной далее в этом уроке. Функции в надстройках Один из наиболее популярных вариантов использования надстроек состоит в предоставлении специальных функций для рабочих листов. Например, можно создать надстройку с коллекцией специальных функций, предназначенных для выполнения бухгалтерских расчетов. После установки надстройки эти функции, наряду со встроенными функциями Excel, становятся доступными для использования в формулах рабочих листов. Чтобы функции надстроек стали доступными на рабочем листе, они должны удовлетворять следующим требованиям. • Коды функции должны быть расположены в программном модуле внутри надстройки, а не в модуле ЭтаКнига или модуле, соответствующем какому-либо рабочему листу. • Функция должна быть объявлена с использованием ключевого слова Public (как это принято по умолчанию в VBA). • Функция должна быть именно процедурой-функцией, т.е. возвращать определенное значение. После загрузки надстройки все функции Public, которые содержатся в ее программных модулях, отображаются в диалоговом окне Excel Вставка функции в категории Определенные пользователем. Здесь будут представлены не только функции надстроек, но и все прочие функции, объявленные с помощью ключевого слова Public. Взгляните, например, на рис. 29.3. В диалоговом окне Вставка функции при выборе категории Определенные пользователем отображаются названия четырех функций. Три из них определены в рабочей книге PERSONAL.XLS; четвертая, под названием OneHalfOf, определена в установленной надстройке. Обратите внимание, что в этом окне нельзя установить место определения функции (в надстройке или в текущей рабочей книге), поскольку в любом случае ее название никак не соотносится с названием рабочей книги. Урок 29. Создание надстроек 387
Тем не менее, на практике это не имеет значения, так как порядок использования функций все равно одинаков. jSiOTuropm: Определенные пот>зова[телем ▼ J Выберите jliyHKuwo:.;. ;•: PERSONALS.x)s!IsNumber OneHalfOf PERSONALS.xls{Modul€l.RefEdit P£RS0liAtSjd5iCoiifitStrin90 EI OTg^yo m ar^ff Фшт OK Огйенв Рис. 29.3. Функции надстроек перечислены в диалоговом окне Вставка функции Надстройка вполне может содержать функции, предназначенные исключительно для применения внутри самой надстройки, а не для использования на рабочем листе. Чтобы предотвратить отображение этих функций в диалоговом окне Вставка функции, при их объявлении используйте вместо слова Public ключевое слово Private. Если на рабочем листе используется функция, определенная в надстройке, но данная надстройка при этом не установлена, в соответствующей ячейке отображается значение ошибки #имя?. Использование VBA для работы с надстройками Коллекция Addlns объекта Application содержит все надстройки, обнаруженные Excel (их названия перечислены в диалоговом окне Надстройки). Чтобы добавить надстройку в эту коллекцию, воспользуйтесь ее методом Add. Вызов данного метода равнозначен выбору этой надстройки в диалоговом окне Надстройки (см. ранее в этом уроке). Синтаксис метода Add следующий: Add Filename, Copy Filename — это название файла надстройки (с указанием пути к этому файлу), а Сору— это необязательный аргумент, принимающий значения True/False и определяющий, необходимо ли файл надстройки копировать в папку Excel Library. По умолчанию аргументу Сору передается значение False. Если файл надстройки расположен на съемном носителе, обязательно выберите для этого аргумента значение True, которое, впрочем, можно выбирать и во всех остальных случаях. 388 Часть 1/7. Воскресенье. День
Прямого способа удалить надстройку из коллекции Addlns не существует. Для этого необходимо в кодах программы присвоить свойству Installed значение False. Чтобы использовать надстройку, ее необходимо установить. Для этого присвойте свойству Installed данной надстройки значения True. К членам коллекции Addlns обращаются по значению свойства Name данной надстройки, которое совпадает с ее названием в диалоговом окне Надстройки. Например, следующей строкой кода устанавливается надстройка Пакет анализа: Application.Addlns("Пакет анализа").Installed = True Бели указанная надстройка не доступна (т.е. она отсутствует в коллекции Addlns), возникает ошибка Out of Range (код ошибки 9). Таким образом, данную ошибку необходимо перехватить и обработать. В листинге 29.1 показан код процедуры, устанавливающей надстройку и отображающей сообщение для пользователя в случае недоступности надстройки. Листинг 29Л. Процедура для установки надстройки Public Sub InstallAddIn(AddInName As String) On Error Resume Next Addlns(AddlnName).Installed = True If Err = 9 Then MsgBox "Надстройка " & AddlnName & " не доступна." End If' End Sub Средства перехвата и обработки ошибок в УВАбыли рассмотрены в уроке 27. Если надстройка уже установлена, присвоение ее свойству Installed значения True не сопровождается никакими изменениями. "^^^ЩР Демонстрация надстройки Далее мы подробно рассмотрим последовательность практических действий, ко- jOMUHwn торые предпринимаются с целью создания и использования надстроек Excel. Чтобы упростить пример, в надстройку будет включено только два элемента: функцию, которую можно использовать на рабочем листе, и короткую программу, вызываемую для форматирования отдельных фрагментов рабочего листа. При установке надстройки на экране отображается панель инструментов, которая поможет пользователю запустить эту программу. Первый шаг — запуск Excel. Используйте новую чистую рабочую книгу, создаваемую при запуске Excel. Создаваемая нами надстройка не требует рабочих листов, однако помните, что каждая надстройка обязательно должна включать хотя бы один рабочий лист. Чтобы уменьшить размеры файла надстройки, удалите Лист2 и ЛистЗ. 1. Сделайте рабочий лист активным. 2. Выберите команду Правка=>Удалить лист. Урок 29. Создание надстроек 389
3. Если вам будет предложено подтвердить необходимость удаления рабочего листа, щелкните на кнопке Удалить. 4. Повторите эти действия для второго рабочего листа. Прежде чем продолжить, выберите команду Файл^^Сохранить и сохраните рабочую книгу, указав для файла название AddlnDemo. wks. Программирование функции Функция создаваемой надстройки делит исходное значение на два. Она может использоваться на рабочем листе наравне с другими функциями Excel. Разумеется, такая функция на практике вряд ли окажется для кого-то полезной, однако настоящий демонстрационный пример создается исключительно с целью пошагового рассмотрения процесса создания надстройки. Итак, выполните следующие действия. 1. Нажмите клавиши <Alt-l-Fl 1>, чтобы открыть редактор VBA. 2. В окне проекта щелкните правой кнопкой мыши на строке VBAProject (AddlnDemo.xls) и в открывшемся меню выберите пункт VBAProject Properties, чтобы отобразить диалоговое окно Project Properties (рис. 29.4). тщштт General |protec^nj ? ;;, 1 • Project Наше: ~:v 1 Project Oescriptjcmt i 1 ': .HeipFttelidme; MWHiiil 1 Conditionat Compltatton Arguments: 1 1 ' • h ;'"": : ■ ■; '■ ;"■.'■■•' ■•■''•"•''•' 1 1 : f_ :„.. ^ . ^x ^,^_i„....i».j_ '•••' ]f <ж .■: •■^■^f :'••• ••■'■•л^; J 0т«№и шттт ^''''■S'': '■:'■ ••'•'•/ \^\ -.•••••• pro^Heip Context Ю: : t. "{Mf;>i-'^.. Щ '^■■m ..•'••.i.. •:• Спрввка. Il P,uc. 29.4. Измените название проекта для создаваемой надстройки 3. В поле Project Name замените исходное название проекта названием AddlnDemoPrO j ect и щелкните на кнопке ОК. 4. Выберите команду lnsert'=>Module, чтобы добавить в проект новый программный модуль 5. Воспользуйтесь командой Insert':^Procedure, чтобы добавить к модулю функцию под названием OneHalf Of. 6. Добавьте в тело функции коды, показанные в листинге 29.2. 390 Часть VI. Воскресенье. День
Листинг 29.2. Функция OneHalfOf Public Function OnHalfOf(value) OneHalfOf = value / 2 End Function Код программы Программу, или, другими словами, макрос для данной надстройки также создать довольно просто. В нашем случае программа будет выделять текущую область жирным шрифтом (к этой области принадлежат ячейки, расположенные вокруг активной ячейки и содержащие в себе данные). Чтобы создать такой макрос, воспользуйтесь командой lnsert'=>Procedure для добавления в программный модуль процедуры под названием FormatBoldFace. После этого отредактируйте процедуру, как показано в листинге 29.3. Листинг 29.3. Процедура FormatBoldFace Public Sub FormatBoldFace() Dim r As Range Set r = Selection.CurrentRegion r.Font.Bold = True End Sub Создание панели инструментов Пользователь должен иметь возможность самостоятельно запускать макрос FormatBoldFace. Выполните перечисленные ниже действия, чтобы создать пользовательскую панель инструментов с кнопкой для вызова этого макроса. 1. Выберите команду Вид'=оПанели инструментов'=с>Настройка, чтобы отобразить на экране диалоговое окно Настройка. 2. Щелкните на корешке вкладки Панели инструментов. 3. Щелкните на кнопке Создать, после чего Excel предложит вам указать название создаваемой панели инструментов. 4. Введите название МояПанель и щелкните на кнопке ОК. После выполнения этих действий в Excel появится новая панель инструментов, причем диалоговое окно Настройка с расположенной на переднем плане вкладкой Панели инструментов по-прежнему будет отображаться на экране. Далее на новую панель инструментов необходимо добавить кнопку и поставить в соответствие этой кнопке макрос FormatBoldFace. 1. В диалоговом окне Настройка щелкните на корешке вкладки Команды. 2. В разделе Категории выберите пункт Макросы, как показано на рис. 29.5. 3. Из раздела Команды перетащите элемент Настраиваемая кнопка (ее значок имеет вид смайлика) на ранее созданную панель инструментов. Урон 29. Создание надстроек 391
Насфбика^ Пднепи йнсгру»екгов команды | Параметры | Чтобы добавить кокднду на п&нель »карунекго8, выб8р»(ге категорию и перетащите команду из этого окна на памет». Катесории: Окна и справка Рисование Авгофигуры Дкаграима Веб Формы Элемект ы управпения Встроенные меню Новое меню "3 Коцанды: Наараиваемая команда меню (^ Настраиваемая кнопка "3 d JUM5!«*fTbCiW4e;i5;H?{bl« 0§Ъ<г5С? '^1 1Э Закрыть J Рас. 29.5. Добавление кнопки на созданную панель инструментов 3. Щелкните правой кнопкой мыши на добавленной кнопке и в открывшемся меню выберите команду Назначить макрос. 4. В отображенном на экране диалоговом окне Назначить макрос выберите макрос FormatBoldFace и щелкните на кнопке ОК. 5. В диалоговом окне Настройка, щелкните на корешке вкладки Панели инструментов. 6. Снимите флажок, отображаемый напротив названия панели МояПанель, чтобы она не появлялась на экране по умолчанию. 7. Щелкните на кнопке Закрыть. В этом проекте в качестве значка кнопки на созданной панели инструментов остается используемый по умолчанию "смайлик". О том, как изменить значок кнопки на панели инструментов, было рассказано в уроке 16. Итак, необходимая панель инструментов уже создана. Теперь следует написать программу, которая будет отображать эту панель в момент установки надстройки и скрывать ее после отключения надстройки. 1. В редакторе VBA дважды щелкните на элементе Эта Книга проекта Addln- DemoProject. 2. В окне редактирования в списке объектов (вверху слева) выберите пункт Workbook. VBA автоматически добавит шаблон процедуры обработки события Workbook_Open. 3. В теле процедуры обработки события наберите следующую строку кода: Toolbars("МояПанель").Visible = True 4. Из списка событий (в окне редактирования вверху справа) выберите пункт Before Close. VBA добавит шаблон процедуры обработки события Work- book__BeforeClose. 5. В теле этой процедуры наберите следующую строку кода: Toolbars("МояПанель").Visible = False 392 Часть VL Воскресенье. День
Защита кодов и сохранение надстройки Как отмечалось ранее в этом уроке, вы должны обязательно защитить коды VBA созданной надстройки, чтобы не допустить их просмотр или изменение конечными пользователями. Для этого выполните следующие действия. 1. Щелкните правой кнопкой мыши на элементе AddlnDemoProject в окне Project и выберите в открывшемся меню вариант VBAProject Properties. 2. В диалоговом окне Project Properties (Свойства проекта) щелкните на корешке вкладки Protection (Защита). 3. Установите флажок опции Lock Project for Viewing (Защита от просмотра). 4. Укажите пароль и затем подтвердите его, набрав пароль повторно. 5. Щелкните на кнопке ОК. Наконец, необходимо сохранить рабочую книгу в виде надстройки. 1. В Excel выполните команду Файл«=>Сохранить как. 2. В списке Тип файла выберите вариант Надстройка Microsoft Excel. 3. При необходимости перейдите к другой папке и/или к другому диску. 4. Оставьте для файла предлагаемое по умолчанию название AddlnDemo. xla (так как рабочая книга была сохранена как AddlnDemo. wks) 5. Щелкните на кнопке ОК. Создание надстройки завершено, и она готова к тестированию. Тестирование надстройки Чтобы протестировать надстройку, закройте рабочую книгу AddlnDemo. Можно также выйти из Excel и запустить программу снова. Затем выполните перечисленные ниже действия. 1. Выберите команду Сервис'=>Надстройки, чтобы отобразить диалоговое окно Надстройки. 2. Если файл надстройки был сохранен в используемой по умолчанию папке надстроек Excel, надстройка AddlnDemo будет отображена в списке диалогового окна, а вы сможете перейти к п. 5; в противном случае переходите к выполнению п. 3. 3. Щелкните на кнопке Обзор и перейдите к папке, в которой был сохранен файл AddlnDemo .xla. 4. Выберите файл и щелкните на кнопке ОК. Теперь надстройка AddlnDemo отображается в списке диалогового окна Надстройки. 5. Установите флажок напротив названия только что созданной надстройки. 6. Щелкните на кнопке ОК, чтобы закрыть диалоговое окно Надстройки. В окне Excel отобразится пользовательская панель инструментов. Чтобы протестировать ее работу, заполните данными одну из областей рабочего листа, сделайте активной одну из ячеек этой области и щелкните на кнопке панели инструментов. В результате содержимое всех ячеек данной области окажется выделенным жирным шрифтом. Чтобы протестировать функцию, используйте ее в одной из ячеек рабочего листа. Функщ1я OneHalf Of отображается также в диалоговом окне Вставка функции. Урок 29. Создание надстроек 393
Чтобы завершить тестирование, выберите команду Сер.вис=>Надстройки и в открывшемся диалоговом окне Надстройки снимите флажок, отображаемый напротив строки AddlnDemo. Пользовательская панель инструментов данной надстройки исчезнет с экрана. э Обзор В данном уроке был рассмотрен процесс создания надстроек Excel, а также перечис- Готошо! лены причины, ПО которым разработка приложений в виде надстроек может оказаться более предпочтительной, чем создание приложений в виде рабочих книг. • Надстройка отличается от рабочей книги в первую очередь тем, что рабочие листы надстройки не видны конечному пользователю. • Чтобы создать надстройку на основе рабочей книги, воспользуйтесь командой Сохранить как и сохраните книгу в виде надстройки Excel. • Надстройка загружается в Excel путем выбора команды Сервис«=> Надстройки. • Функции Public, определенные в кодах надстройки, могут использоваться аналогично встроенным функциям Excel. • Коды VBA надстройки необходимо блокировать с целью защиты их от несанкционированного просмотра и внесения изменений конечными пользователями. Проверьте себя 1. Если приложение включает лист диаграммы, который предназначен для просмотра пользователями, стоит ли сохранять это приложение в виде надстройки? Поясните ответ. (См. раздел "Основные отличия надстроек от рабочих книг".) 2. Вы хотите создать функцию надстройки, которая будет доступна для использования на рабочем листе. В каком модуле VBA необходимо поместить код этой функции? (См. раздел "Функции в надстройках".) 3. Как пользователь должен запускать программу, содержащуюся в надстройке? (См. раздел "Основные отличия надстроек от рабочих книг".) 4. Как создать для надстройки функцию VBA, которая не должна быть доступна для использования на рабочем листе? (См. раздел "Функции в надстройках".) 5. Какое событие возникает в момент установки надстройки? (См. раздел "Надстройки и события".) 394 Часть VL Воскресенье. День
УРОК Добавление к приложениям электронной справочной системы Содержание урока ^ Включение справки как элемента рабочего листа ^ Предоставление справочной информации на отдельном рабочем листе ^ Предоставление справочной информации с использованием экранных форм S/ Добавление к приложению ссылок HTML V Получение справки через Internet Практически все компьютерные приложения имеют собственную справочную систему, представленную в той или иной форме. Приложения Excel в этом плане — не исключение. Возможно, для некоторых простых приложений создавать Осталось - « j. 30 минут справочную систему не обязательно, но если предоставление справочной информации необходимо, воспользуйтесь одним из нескольких доступных вариантов. Электронная справочная система Excel Термин электронная справочная система (online help) свидетельствует о том, что справочная информация доступна пользователю на его компьютере во время использования приложения — другими словами, ему не придется искать и перелистывать печатный справочник. Во многих случаях электронная справочная система содержит контекстно-зависимые элементы, а это значит, что справочная информация, отображаемая в данный момент, имеет непосредственное отношение к текущим действиям
пользователя. Если на определенном этапе работы с приложением его использование перестает быть интуитивно понятным, вам как разработчику необходимо подумать о создании электронной справочной системы. Существует несколько способов добавления справочной информации к приложениям Excel. В некоторых случаях для этих целей используют только программу Excel и ее компоненты; в других ситуациях применяют внешние компоненты, являющиеся частью операционной системы Windows. Рассмотрим эти способы поочередно. Использование компонентов Excel для создания справочной системы Возможности и гибкость инструментария Excel позволяют создавать справочную систему приложений и без использования другого программного обеспечения. Более Того, Excel обеспечивает несколько способов создания справочной системы. Размещение справочной информации на рабочем листе Один из самых простых подходов — представить справочную информацию непосредственно на рабочем листе приложения. Если необходимо объяснить пользователю, какое значение требуется ввести в ячейку рабочего листа, поместите соответствующую информацию в соседней ячейке. Она всегда будет отображаться на экране, и пользователю не придется искать необходимую подсказку в другом месте. Однако такой способ размещения справочной информации накладывает ограничения на шаблон рабочего листа, а большое количество надписей занимает слишком много места на экране. Довольно простым методом является добавление текстовых комментариев к соответствующим ячейкам. Выделите ячейку, затем выберите команду Вставка^^^Примечание. Когда курсор мыши окажется расположенным над ячейкой, снабженной комментарием, сам комментарий будет отображен автоматически. Остальное время в правом верхнем углу ячейки находится небольшой красный треугольник, указывающий на наличие для этой ячейки комментария. (В общих инструкциях, прилагаемых к приложению, вы можете проинформировать пользователей о том, что более подробная справочная информация находится в комментариях ячеек.) Помимо того, что при таком способе представления справочной информации используется минимальное количество пространства рабочего листа, положительным является также тот факт, что все фрагменты справочной информации непосредственно связаны с соответствующими ячейками. На рис. 30.1 показана таблица для вычисления суммы выплат по кредиту. К таблице добавлены комментарии со справочной информацией. 396 Часть VL Воскресенье. День
файл Оравка Вид Всг^ка Фо^аат С^>в^ Данные ©ою Справка I D G*.e dgt ©]# а ^ *^^ 1&г.^,| !f>'.t:T">i*:^ -Si' ii|ttf# 100% т © J. 10 С6 V, jR заполнении этой ячейки помните, что числу 0,06 соответствует значение 6% М 4 ► Готово ►i|\Выплаты по кредиту/листа/Ли<пЗ / \'±\ ±Jfl; Рис. 30.1. Предоставление справочной информации посредством добавления к ячейкам комментариев Размещение справочной информации на отдельном рабочем листе Вы можете не размещать справочную информацию на рабочем листе вместе с другими компонентами создаваемого приложения. Вместо этого выделите для справочной системы один или несколько отдельных рабочих листов. Присвоив рабочему листу подходящее название, например Справка, вы укажете пользователям, где искать справочную информацию. Использование рабочего листа для предоставления справочной информации обеспечивает гораздо больше возможностей, чем может показаться на первый взгляд. При этом не обязательно придерживаться обычной структуры в виде строк и столбцов, которая принята по умолчанию для рабочих листов. Например, вы вправе объединить две или несколько ячеек с целью создания более привлекательного шаблона. Кроме того, можно использовать панель инструментов Элементы управления, чтобы поместить на рабочий лист другие элементы, такие, например, как рисунки или поля со списком. Панель инструментов Рисование используется для добавления различных графических элементов (например, организационных диаграмм или картинок). Работа с панелями инструментов Рисование и Элементы управления в этой книге не рассматривается. Необходимую информацию вы можете найти в справочной системе Excel. Для объединения двух или нескольких ячеек выделите их, нажмите клавиши <Ctrl+l>, чтобы отобразить диалоговое окно Формат ячеек, затем на вкладке Выравнивание установите флажок опции Объединение ячеек. Урок 30. Добавление к приложениям электронной справочной системы 397
ф Если вы собираетесь распространять приложение в форме надстройки, справочную информацию нельзя располагать на рабочем листе, так как листы надстроек всегда остаются скрытыми. Чтобы добавить к электронной справочной системе надаройку, воспользуйтесь одним из методов, описанных далее в этом уроке. Если справочная информация расположена на отдельном рабочем листе, можете предоставить пользователю возможность отображать ее не только обычным способом (т.е. щелчком на корешке этого листа). Для перехода к листу со справочной информацией может использоваться специгшьная командная кнопка. Например, вы вправе создать несколько справочных листов, информация на каждом из которых будет относиться к отдельной части приложения. Затем можно разместить командные кнопки на ключевых позициях рабочих листов приложения, чтобы пользователь мог таким образом сразу же перейти к требуемой справочной информации. Чтобы продемонстрировать прием отображения справки, основывающийся на использования командных кнопок, вернемся к примеру с таблицей для вычисления суммы выплат по кредиту, который рассматривался в предыдущих уроках. Добавим к этому приложению справочную информацию. В нашем примере будет создана только одна кнопка и один справочный рабочий лист, однако другие справочные листы добавляются подобным образом. Для начала запустите Excel и откройте рабочую книгу с таблицей вычисления суммы выплат по кредиту (см. урок 24). После этого выполните следующее. Осталось 1. Перейдите на ЛистЗ и выберите команду Правка'=^Удалить лист, чтобы уда- минут лить этот рабочий ЛИСТ, в нашем случае третий лист не понадобится, поэтому его удаление сделает создаваемое приложение более упорядоченным. 2. Перейдите на Лист2, дважды щелкните на его корешке и наберите для него новое название — Справка. 3. Наберите на листе любую необходимую справочную информацию и отформатируйте ее по своему усмотрению. 4. Перейдите на рабочий лист Выплаты по кредиту. 5. Выберите команду Сервис^^Защита'=>Снять защиту листа и укажите пароль. Эти действия выполнить необходимо, поскольку к заблокированному листу нельзя добавлять элементы управления. 6. Выберите команду Вид'=^Панели инструментов'=>Элементы управления, чтобы отобразить панель Элементы управления, показанную на рис. 30.2. 7. На панели Элементы управления щелкните на значке Кнопка, затем протащите курсор над тем участком рабочего листа, на котором должна быть расположена кнопка. 8. Щелкните на добавленной кнопке правой кнопкой мыши и выберите в открывшемся меню команду Свойства. Excel отобразит диалоговое окно Properties (Свойства) для данного элемента управления (рис. 30.3). 9. Измените свойство Caption, присвоив ему значение Справка. 10. Щелкните на кнопке закрытия окна Properties, расположенной в его верхнем правом углу. 11. Дважды щелкните на добавленной кнопке, чтобы открыть окно редактирования кодов в редакторе VBA. В этом окне вы увидите шаблон процедуры обработки события Click (это событие выбрано для кнопок по умолчанию). 398 Часть VL Воскресенье. День
[811Ж1^||Щ,1Р111И11Р№Р11|^ ет файл JDlpaeKa Вид Возрш !Фо^щ^ Id fis^ и а s• #а ^-^'i^ffe^^["'^^-'&^|i!-X>fi;ji|Mf'« 100% -m^j C4 ' ▼ > Д 1^ Per Hv i 8 rfcT pi II Гото ^^Ayt^-^^ II iiii;;!!»!»! iifiiiiM^Piii ш №1^'^''^^'' ^^^^^^^^^^^ИН^^ i ► wlVВыплаты no кредиту/Лик*т2/л»1аЗ/ \< j ;^ % V^^ BO " . - - д-- '^ ^ . ' - ' -. . , -vix-F с mm HUM щщ^^щ Puc. 30.2. Добавление кнопки на лист Выплаты по кредиту llcommandBtfttonl CommandButton ^^ III 1 Alphabeec jcetegortzedj , ' V > | 1 |(Name) CommandButtonl III lAcceierstor 1 1 j^^toLoad' ; False || }ИШИИ1^«>^е jj II ГваскСоки- □ &H80O0OOOF8i llj IBeckStyie .1 - fmBackStyteOpaque U {Caption CommandButtonl 1 lEnabled True 1 jFont Arlal Cyr 1 IForeColor ■ 8iH80066012& 1 IHeight 14,4 1 iLeft 184,8 1 Locked Tf4ie ll iMouselGon (None) 1 jMousePomter 0 - fmMousePolnterOefault || 1 iPtcture (None) 1 1 [PicturePoslbon 7 - fmPlcturePoslttonAboveCenter 11 IPiacement 2 |l 1 jPrlntOb^ect True 1 1 jshadow False 1 1 JTekeFocusOnClick True 1 JTop 111,6 1 ivisible True I Iwkfth 63 1 1 IwordWrap False 1 Puc. 30.3. Окно Properties (Свойства) добавленной командной кнопки Урок 30. Добавление к приложениям электронной справочной системы 399
12. В теле процедуры обработки события Click наберите cлeдyюп^ий код: Worksheets("Справка").Activate 13. Вернитесь к приложению Excel. 14. Щелкните на кнопке Выход из режима конструктора, расположенной на панели Элементы управления вверху слева. Excel выйдет из режима конструктора, в котором можно было добавлять и перемещать элементы управления, и сделает кнопку активной. Теперь п;елчок на кнопке будет сопровождаться запуском соответствующей ей процедуры обработки события С1 ick. 15. Щелкните на кнопке закрытия панели Элементы управления, расположенной в ее верхнем правом углу. 16. Выберите команду Сервис'=с>3ащита'=>3ащитить лист, чтобы вновь установить защиту рабочего листа (в ответ на запрос укажите пароль). 17. Выполните команду Файл'=>Сохранить, чтобы сохранить изменения в рабочей книге. Вы можете определить, находится ли Excel в режиме конструктора, по внешнему виду кнопки Режим конструктора, расположенной на панели Элементы управления. В режиме конструктора эта кнопка нажата, тогда как при работе в обычном режиме она остается отжатой. Теперь рабочая книга готова; она должна выглядеть приблизительно так, как показано на рис. 30.4. Протестируйте внесенные изменения, щелкнув на кнопке Справка — при этом рабочий лист Справка должен стать активным. И ^ ► И К^Вышиты п^ Готово NUM ^ Рис. 30.4. Готовый рабочий лист с кнопкой Справка Аналогичным образом, на рабочий лист Справка можно добавить еще одну командную кнопку, щелчок на которой будет возвращать пользователя на главный рабочий лист приложения. 400 Часть VL Воскресенье. День
Размещение справки в окне экранной формы Еще одним способом предоставления справки с использованием компонентов Excel является создание экранной формы. Преимущество данного приема состоит в том, что справка отображается в отдельном окне, не зависимом от рабочего листа, что позволяет одновременно просматривать рабочий лист и справочную информацию. Присвоив свойству ShowModal экранной формы значение False, вы предоставите пользователю возможность оставить справочную информацию на экране при переключении обратно к приложению Excel. В самом приложении экранная форма может отображаться по щелчку на кнопке, расположенной на панели инструментов, по нажатию соответствующей комбинации клавиш или по щелчку на командной кнопке. Методы создания экранных форм были рассмотрены в уроках 19-22. Осталось 10 минут Создание справочной системы с помощью внешних компонентов Создавая некоторые приложения, электронную справочную систему целесообразно добавлять с помощью средств, не доступных в Excel. В данном разделе описаны наиболее популярные способы использования подобных внешних инструментов. Справка HTML в настоящий момент применение языка HTML является стандартным приемом создания справочной системы приложений, разрабатываемых под Windows. Такая справочная система называется справкой HTML, поскольку предоставляемая информация организована в виде одного или нескольких файлов HTML (hypertext markup language). Перед включением справочной системы в состав готового программного продукта файлы HTML и связанная с ними информации (такая, например, как содержание и предметный указатель) компилируются в один сжатый файл справки, имеющий расширение . chm. Представленную в таком формате справочную информацию можно просматривать с помощью утилиты HTML Help Viewer, являющейся компонентом операционной системы Windows и доступной для всех приложений. В настоящее время электронная справочная система большинства приложений, написанных под Windows^ представлена в виде справки HTML. Одно из преимуществ справочной системы HTML состоит в том, что каждому фрагменту информации в справочном файле можно присвоить отдельный числовой идентификатор, называемый контекстным справочным идентификатором (help context ID), Такой идентификатор используется для отображения конкретного фрагмента справочной информации. Поскольку тема разработки и создания справочной системы с помощью языка HTML выходит за рамки настоящей книги, обратитесь за подробной информацией по данному вопросу на Web-сайт компании Microsoft www. msdn. microsoft. com и выполните поиск по словам "HTML Help". Существует несколько специальных приложений, предназначенных для разработки справочной системы HTML которые упрощают решение этой довольно сложной задачи. Воспользуйтесь утилитой HTML Help Workshop. Коммерческие продукты предоставляют своим пользователям более широкие возможности, однако за определенную плату. Урок 30. Добавление к приложениям электронной справочной системы 401
Созданную справочную систему HTML необходимо связать с приложением. Для этого воспользуйтесь настройкой свойства проекта. 1. Щелкните правой кнопкой мыши на названии проекта в окне Project и выберите в открывшемся меню пункт VBAProject Properties. 2. На вкладке General (Основные) (рис. 30.5) в поле Help File Name (Файл справки) наберите название скомпилированного файла справочной системы. Если файл справки сохранен не в той папке, что и само приложение, укажите путь к нему. 3. Щелкните на кнопке ОК. %у '> i.iit.iii niiiiiir г Пи irtwi iiWhfi[ II iimiiniirriifmrfii'pr n«.<>nrtifi»iiiii II11 тммаихчтй»! iKt in iTiimi iiiiri [ 11Г111И|Г[|-у«^ ~ П^^Щ^^^^'^^^^Ш' \<%^Ж®1даЖ#^-^ Щ\^^'^^^Т'''^^^Ш ш. Рис, 30.5. Присоединение файла справочной системы к приложению Excel Тот же результат может быть достигнут, если в кодах VBA присвоить требуемое значение свойству HelpFile созданного проекта. Соответствующий код можно поместить в теле процедуры обработки события Worlcbook__Open: ThisWorkbook.VBProject.HelpFile = ThisWorkbook.Path & _ "\\Кредитныи_калькулятор.chm" Обратите внимание, что в данном коде свойство Path используется для определения папки, в которой установлено приложение. При этом предполагается, что файл справочной системы установлен в той же папке, поскольку именно там он обычно и устанавливается. Чтобы отобразить справку HTML для приложения, вызовите в кодах VBA метод Help. Используйте при этом следующий синтаксис: Application.Help HelpFile, HelpContextID Здесь HelpFile — это название скомпилированного файла справочной системы. Данный аргумент не обязателен. Однако если он будет опущен, вызов метода Help приведет к отображению окна справочной системы Excel. Аргумент HelpContextID представляет собой идентификатор раздела справки, который необ- 402 Часть VL Воскресенье. День
ходимо отобразить. Если этот аргумент не указан, отображается принятый по умолчанию раздел* справки (который был определен при создании файла справочной системы). Клавиша <F1> традиционно ассоциируется с электронной справочной системой. Ее нажатие в Excel сопровождается отображением окна справочной системы Excel. Существует несколько способов отображения справочной системы приложения с помощью метода Help, любой метод выполнения кодов VBA является приемлемым. Итак, выберите один из вариантов. • Макрос VBA, назначенный кнопке на пользовательской панели инструментов. • Код VBA, выполняемый при воздействии пользователем на элемент управления (например, командная кнопка, расположенная на рабочем листе). • Код VBA, выполняемый при воздействии на элемент управления, расположенный в окне экранной формы. • Макрос, выполняемый после нажатия соответствующей комбинации клавиш. Получение справки через Internet Последний метод создания справочной системы для приложений Excel основан на использовании Internet и возможности вставки гиперссылок на рабочий лист. Данный метод подразумевает размещение справочной информации на одной или нескольких Web-страницах, представленных в виде документов HTML и доступных локально или с Web-сервера. Если страницы со справочной информацией присоединены локально, т.е. без использования подключения к Internet, их необходимо предоставлять конечным пользователям вместе с самим приложением. Если же эти страницы предполагается предоставлять через сеть Internet, конечные пользователи для получения к ним доступа, сами должны быть подключены к Internet. В настоящее время последний вариант становится все более распространенным. Прием предоставления справки через Internet особенно удобен для организаций, имеющих локальную сеть, так как при этом становится возможным контроль за доступом к такой информации. Метод предоставления справки через Internet обладает одним существенным преимуществом— вы можете обновлять справочный материал, не передавая пользователям новые файлы. Однако такая форма организации справочной системы имеет и недостаток: пользователи должны подключаться к Internet чтобы просмотреть необходимую им информацию. В этой книге не будут рассматриваться вопросы разработки Web-страниц и их размещения в сети Internet. Чтобы применить представленные ниже приемы, необходимо узнать URL (Web-адрес) страницы или страниц, которые содержат справочную информацию (что потребуется для определения ссылок). После этого выполните следующее. 1. Выделите ячейку рабочего листа, в которой необходимо отобразить ссылку на страницу со справочной информацией. 2. Выберите команду Вставка<=>Гиперссылка, чтобы отобразить диалоговое окно Добавление гиперссылки (рис. 30.6). Урок 30. Добавление к приложениям электронной справочной системы 403
«BXj CBS&stbCi Теш:]Справочн&я информация ® файлои,веб- сгрвниией f!»f«»i О Мои документы ШУ:1 дмунеиГ» ||^осногре«- ^?Ц^ Мнхявдаие; текущая папка -^:Ф>ММ:, Ш Мои видеозаписи Щ Мои рисунки Щ Моя музыка te AddlnDemo т PERSONALS fe Кредитный_калькулятор I http://www.pghelp.com .:ik>if/pi\;-' OK Отмена Рис. 30.6. Вставка гиперссылки в ячейку рабочего листа 3. В разделе Связать с выберите вариант файлом, веб-страницей. 4. В поле Текст наберите текст, который должен отображаться в ячейке рабочего листа. 5. В поле Адрес укажите полный URL-адрес файла справочной системы, доступного через Internet, например: http://www.mycompany.com/help/ finance. html. Для локальной ссылки укажите полный путь к файлу, например: c:\documents\help\finance.htm. Кроме того, можно использовать управляющие элементы в центре диалогового окна чтобы осуществить поиск требуемого файла. 6. Щелкните на кнопке ОК. Если вы указываете локальный адрес файла, на компьютере пользователя соответствующий файл справочной системы должен быть установлен в той же папке. Текст гиперссылки на рабочем листе отображается подчеркнутым и выделяется специальным цветом (как правило, синим). Когда курсор мыши оказывается расположенным над гиперссылкой, его значок приобретает форму рз^ки. Щелчок на гиперссылке сопровождается открытием в Web-браузере (обычно это Microsoft Internet Explorer) соответствующего файла. Это отдельное окно, поэтому пользователь может, работая с книгой, видеть на экране справочную информацию. Готошо! Обзор Вам не удастся выделить ячейку с гиперссылкой посредавом щелчка, так как это приведет к активизации ссылки. Необходимо удерживать кнопку мыши нажатой в течение нескольких секунд пока для курсора значок руки не поменяется на перекрестие. В этом зфоке были рассмотрены методы создания электронной справочной системы для приложений Excel. 404 Часть VL Воскресенье. День
Электронная справочная система обеспечивает предоставление информации на экране компьютера, что освобождает пользователя от поиска ответа на возникший вопрос в книгах или журналах. Справочную информацию можно поместить прямо на рабочем листе в виде комментариев к ячейкам или как текст в самих ячейках. Чтобы отобразить справочную информацию, можно создать одну или несколько экранных форм. Справочная информация отображается после щелчка на кнопке, расположенной на панели инструментов, или на командной кнопке, размещенной непосредственно на рабочем листе. В проекте Excel справочная система может быть организована в виде справки HTML, что является обычной практикой для приложений, написанных под Windows. Создавая на рабочем листе гиперссылки, допускается определять ссылки на справочную информацию, предоставляемую через сеть Internet. Проверьте себя 1. В чем состоит преимущество справочной информации, предоставляемой путем добавления к ячейкам соответствующих комментариев? (См. подраздел "Размещение справочной информации на рабочем листе".) 2. Какие приемы предоставления справочной информации не подходят для приложений, распространяемых в виде надстроек? (См. подраздел "Размещение справочной информации на рабочем листе".) 3. В чем заключается преимущество размещения справочной информации в окне экранных форм по сравнению с расположением ее на рабочем листе? (См. подраздел "Размещение справки в окне экранной формы".) 4. Как в приложениях Excel выполняется отображение требуемых разделов справки HTML? (См. подраздел "Справка HTML".) Урон 30. Добавление к приложениям электронной справочной системы 405
ЧАСТЬ Воскресенье. День. Обзор 1. Что происходит при возникновении ошибки, обработка которой в кодах программы не предусмотрена? 2. Где должен быть помещен код обработки ошибки? 3. Какой элемент отсутствует в приведенной ниже процедуре обработки ошибок? Public SomeProcedure() • Код объявления переменных On Error Goto ErroHandler • Код процедуры ErrorHandler: ' Код обработки ошибки End Sub 4. Процедура А содержит код обработки ошибок, а процедура В— нет. Что произойдет, если процедура А вызывает процедуру В, и в ходе выполнения процедуры В возникнет ошибка? 5. Если свойство Err. Number равно нулю, о чем это говорит? 6. Как организованы данные в базе данных? 7. Сколько ключей может быть указано при использовании для сортировки данных метода Range. Sort? 8. Что означает термин фильтрация по отношению к базе данных? 9. Как автоматически создать форму для ввода данных в таблицу базы данных? 10. Необходимо ли удалять все пустые рабочие листы из рабочей книги, которая будет распространяться в виде надстройки? 11. Верно ли утверждение о том, что справочную систему HTML можно создать в Excel? 406 Часть IV. Воснресенье. День
ПРИЛОЖЕНИЕ Ответы на вопросы в обзорах частей Данное приложение содержит ответы на вопросы, которые были заданы к каждой части книги. Ответы на вопросы к части ''Пятница. Вечер'' 1. Набор инструкций компьютеру. 2. Нажать клавиши <Alt+Fll> или выбрать команду Сервис=>Макрос=> Редактор Visual Basic. 3. Из меню редактора VBA выбрать команду lnsert'=^Module. 4. Экспортировать модуль из первого проекта; затем импортировать его в другой проект. 5. Фрагмент информации, определяющий или контролирующий один из аспектов внешнего вида или поведения объекта. 6. Путем добавления символ доллара ($) перед буквой столбца и номером строки. 7. Свойство представляет со^ой фрагмент информации, имеющий отношение к объекту; метод выполняет определенное действие. 8. Нет. Если вы используете именованные аргументы, их можно располагать в произвольном порядке. 9. Оператор For Each... Next. 10. Никогда. Объект Application всегда доступен как неявная ссылка. 11. Вызвать метод SaveCopyAs объекта Workbook. 12. Метод Workbook. Printout. 13. Вызвать метод Workbook .Act iveSheet. 14. Изменить значение свойства Name соответствующего объекта Worksheet. 15. Присвоить свойству DisplayAlerts значение False.
16. Значение Nothing присваивают переменной, содержащей ссылки на объекты, которая в данный момент ни на один объект не ссылается. 17. Использовать свойство Worksheets . Count. 18. Если этому свойству присвоено значение True, при каждом сохранении рабочей книги создается ее резервная копия. 19. Считать значение свойства Workbook. Ful IName. 20. Вызвать метод Activate этой рабочей книги. 21. Сохранялась, если свойство Saved объекта Workbook равно True. 22. Символ продолжения строки можно использовать везде, кроме текста, набранного в кавычках. 23. Вопрос с подвохом: таких правил не существует. Отступы можно использовать для улучшения визуального восприятия кодов, но они никак не влияют на ход выполнения программы. 24. Как количество дней с 30 декабря 1899 года. 25. Из 101 элемента, индексы которых отсчитываются от О до 100. 26. Использовать функции UBound и LBound. 27. Под этим термином следует понимать совокупность всех фрагментов программы, в пределах которых данная переменная видна и может быть использована. 28. Ее следует объявить на уровне модуля с помощью ключевого слова Publ iс. Ответы на вопросы к части ^'Суббота. Утро'' 1. 2. Число 11, деленное на 3, дает 3 с остатком 2, поэтому ответ 2. 2. True. 3. Это зависит от значений свойств. По умолчанию такое выражение дает результат False, но если действует оператор Option Compare Text, то выражение равно True. 4. Использовать оператор Is:Objl Is Obj2. 5. Нет. 4 + 2 * 8 дает 20 по правилу приоритетов операторов, так как первым выполняется умножение, а затем — сложение. Выражение (4 + 2) * 8 дает результат 48, так как скобки указывают на то, что первым должно быть выполнено сложение. 6. Нет. Если в операторе отсутствует условие Else, то, возможно, что в блоке If. . . End If не будет выполнен ни один оператор. 7. Если никакие действия не должны выполняться программой в том случае, когда ни один из операторов Case не соответствует заданному условию, часть Else можно опустить. 8. Функция Ilf вычисляет значение условия и возвращает одно значение, если условие равно True, и другое значение, если условие равно False. 9. Операторы гарантированно выполняются один раз, если условие помещено в конце цикла. 10. Никогда. Этот оператор поддерживается, но его заменил более гибкий оператор Do. . . Loop. 408 Приложение А
11. Ограничения не существует. 12. Функция возвращает значение в программу, а подпроцедура — нет. 13. Ограничений не существует, однако советуем создавать не очень длинные процедуры. Разумно ограничивать процедуры 30-40 строками кода. 14. За названием массива следуют пустые скобки. 15. Значение присваивается имени функции. 16. Да. Необходимо объявить переменную с помощью ключевого слова Stat ic. 17. Значение следует заключить в символы #. 18. Функция DateAdd. 19. InStrnlnStrRev. 20. Вызвать функцию StrConv с аргументом vbProperCase. 21. Нет. Версии одной и той же буквы в верхнем и нижнем регистре имеют разные значения кода ASCII. 22. Использовать функцию Lef t. 23. Объект Range. 24. Свойство Value объекта Range возвращает пустую строку. 25. На самый меияенький диапазон, который содержит все используемые ячейки рабочего листа. 26. Получить объект Range, который ссылается на ячейку, после чего вызвать метод AddComment. 27. Только один. 28. Для диапазонов из одной ячейки они совпадают. Для диапазонов из нескольких ячеек Activate выделяет одну ячейку в верхнем левом углу диапазона, а Select выделяет весь диапазон. Ответы на вопросы к части ^'Суббота. День" 1. Использовать свойства Range. Rows . Count и Range. Columns. Count. 2. Ha столбцы активного рабочего листа. 3. Он перемещается вправо и становится столбцом С. 4. На ячейку В2. Свойство Cells при использовании с одним числовым аргументом отсчитывает ячейки по направлению вправо, затем вниз. 5. На все ячейки рабочего листа Объемы продаж. 6. Использовать метод Range.SpecialCells с аргументом xlCellType- Blanks. 7. Она не изменяется, поскольку содержит только абсолютные ссылки на ячейки. 8. Ссылка на столбец изменяется в соответствии с новой ячейкой, но ссылка на строку остается прежней. 9. Использовать синтаксис ИмяЛиста! СсылкаНаЯчейку. 10. Все формулы начинаются с символа =. 11. Это ссылка, при которой формула в одной ячейке ссылается на другую ячейку, а та, в свою очередь, прямо или косвенно ссылается на первую ячейку. Ответы на вопросы в обзорах частей 409
12. Функция РМТ (в русскоязычной версии Excel ПЛТ). 13. Функция DOLLAR (в русскоязычной версии Excel РУБЛЬ). 14. Можно, если использовать объект Worksheet Function. 15. Изменить значение свойства Range. NumberFormat. 16. Красный, зеленый и синий. 17. Свойство Range. Interior. Color. 18. За единицу принята ширина символа используемого по умолчанию шрифта. 19. МетодAutoFit. 20. Необходимо вызвать два метода: Find, чтобы найти первый экземпляр, соответствующий заданному шаблону; затем FindNext, чтобы найти следующие экземпляры. 21. Значение Nothing. 22. Выбрать команду Видс> Панели инструментов и затем в открывшемся диалоговом окне указать, какие из доступных панелей инструментов должны быть отображены или скрыты. 23. Кнопок на новой панели инструментов нет, изначально она пуста. 24. При отображенном диалоговом окне Настройка щелкните правой кнопкой мыши на кнопке, затем выберите в открывшемся меню команду Назначить макрос. 25. Нет. Для присоединения пользовательской панели инструментов к рабочей книге необходимо использовать команду Присоединить. 26. Панель инструментов может быть плавающей либо закрепленной. Ответы на вопросы к части 'Хуббота. Вечер'' 1. Встроенная диаграмма расположена на обычном рабочем листе вместе с данными и другими диаграммами. Лист диаграммы представляет собой отдельный лист рабочей книги и не содержит в себе других данных или элементов. 2. Вы не можете этого делать. 3. Вызвать метод Add коллекции Charts. 4. Вызвать метод SetSourceData объекта Chart. 5. Использовать выражение Ch. Chart Title. Font. It alios = True. e. Charts("Итоги продаж").Printout. 7. Вызвать метод Protect объекта Chart. 8. Вызвать метод ChartObj ect. BringToFront для этой диаграммы. 9. Для точечной диаграммы по горизонтальной оси откладываются значения, а не категории. 10. Вызвать метод Printout коллекции Charts рабочей книги. 11. Присвоить свойству ChartOb j ect. PrintObj ect этой диаграммы значение False. 12. Сама форма, расположенные на ней элементы управления и коды VBA этой формы. 410 Приложение А
13. Присвоить свойству UserForm.StartUpPosition значение Center- Screen. 14. Вызвать метод User Form. Hide. 15. В группе переключателей OptionButton в определенный момент времени может быть выбран только один элемент. Что касается флажков CheckBox, их может быть выбрано несколько. 16. Расположить элементы управления OptionButton на элементе управления Frame. 17. Дважды щелкнуть на этом элементе управления. 18. Присвоить свойству Default элемента управления CommandButton значение True. 19. Элемент управления Re f Edi t. 20. Элемент управления CheckBox. 21. Свойство Enabled. Ответы на вопросы к части ''Воскресенье. Утро" 1. Непосредственно перед тем, как фокус переходит с данного элемента на другой элемент управления. 2. Этот интервал не изменяется в программе. Он задан в параметрах операционной системы Windows. 3. Нет. Аргумент KeyCode определяет только саму клавишу. Чтобы определить, была ли при этом нажата также клавиша <Shift>, используйте аргумент Shift. 4. Необходимо присвоить аргументу KeyCode нулевое значение. 5. Использовать команды выравнивания Align, расположенные в меню Format. е. Вызвать метод ZOrder с аргументом f тТор для скрытого элемента. 7. Присвоить свойству Tabs top данного элемента управления значение False. 8. За именем объекта следует символ подчеркивания и далее — название события. 9. События экранных форм. 10. Событие Workbook. Sheet Change. 11. Удерживать нажатой клавишу <Shift>. 12. Проверка данных -— это процесс определения, не вводит ли пользователь некорректные значения, например, текст вместо чисел. 13. В модуле ThisWorkbook. 14. Набрать его в процедуре обработки события OnTime. 15. В меню Tools диалогового окна Save As установить пароль на внесение изменение. Ответы на вопросы в обзорах частей 411
16. Нет. Проект VBA должен быть заблокирован отдельно от рабочей книги, что выполняется с помощью вкладки Protection диалогового окна Project Properties. 17. Нет. Ошибки (bugs) приводят к неправильной работе программы, но не прерывают ее выполнение. 18. Это рекомендуется делать всегда, поскольку использование оператора Option Explicit позволяет избежать возникновения многих ошибок в программе. 19. Точка прерывания приостанавливает выполнение программы в указанной строке кода. 20. Команда Step Over выполняет весь код в процедуре и останавливает выполнение программы при выходе из процедуры. Команда Step into в любом случае выполняет следующую строку и приостанавливает выполнение программы. 21. Задержать курсор мыши над названием переменной. 22. Нет. Контрольные выражения обновляются только при входе программы в режим прерывания. 23. Программа не выводит отчеты об ошибках. Ошибки можно обнаружить только путем тестирования программы. 24. Верно. Приложение Excel нельзя запустить без установленной программы Excel. 25. В модуле класса. 26. Нет. Пользовательские классы VBA не могут иметь визуальных элементов. 27. Удалить его процедуру Property Let. 28. Да. 29. Поместить код в процедуре Property Let, чтобы проверить новое значение свойства и принять его только при том условии, что оно корректно. 30. Используется стандартный синтаксис ИмяОбъекта. ИмяСвойства. 31. Ничем, кроме того, что он находится в модуле класса. 32. Метод, который будет вызываться только из класса, и не будет использован программой за пределами этого класса. 33. Событие Terminate. Ответы на вопросы к части ^'Воскресенье. День'' 1. Отображается диалоговое окно с информацией об ошибке, и выполнение программы завершается. 2. В процедуре, где может произойти эта ошибка. 3. Чтобы выполнение программы не переходило к кодам обработки ошибки в случае, если эта ошибка не произошла, в процедуре перед меткой Ег- rorHandler: должен находиться оператор Exit Sub. 4. Ошибка передается из процедуры В в процедуру А и обрабатывается там. 5. Ошибка не произошла. 6. Каждая строка информации является записью, и все записи имеют одинаковые поля. 412 Приложение А
7. Не более двух. 8. Отображение только тех записей, которые соответствуют определенному критерию. 9. Поместить курсор в любом месте таблицы, затем выбрать команду Данные'=>Форма. 10. Нет. Чтобы представить рабочую книгу в форме надстройки, она должна содержать хотя бы один рабочий лист, даже если он пуст. 11. Нет. Для создания такой справочной системы необходимо специальное приложение. Ответы на вопросы в обзорах частей 413
ПРИЛОЖЕНИЕ Описание Web<auma в этом приложении представлена информация, которую можно найти на Web-сайте этой книги — www .wiley. com/compbooks/aitken. Данный Web-сайт включает: • тест для самооценки; • загрузочные файлы с примерами упражнений из книги. Тест для самооценки Если вы хотите определить уровень ваших знаний в области программирования в Excel, можете пройти этот тест. Он состоит из 83 вопросов, на каждый из которых предлагаются возможные варианты ответа. Вопросы разделены по темам, после прохождения теста будут автоматически подсчитаны набранные вами баллы. Файлы примеров с упражнениями из книги Все листинги программ (их англоязычные версии), приведенные в книге, можно загрузить с данного Web-сайта. Решение вопросов Если у вас возникнут проблемы при работе с Web-сайтом, позвоните по номеру службы поддержки клиентов: (800) 762-2974. Если вы находитесь за пределами США, звоните по телефону 1 (317) 572-3994. Кроме того, можно связаться со службой поддержки клиентов по электронной почте: texhsupdum@wiley.com. Сотрудники Wiley Publishing, Inc. предоставляют техническую поддержку только по вопросам использования теста и по другим общим вопросам, касающимися контроля качества. Чтобы получить техническую поддержку в области использования самих программ, обращайтесь к их разработчикам и распространителям.
Предметный указатель ANSI, 130 ASCII, 130 О OLE-автоматизация, 30 Option Compare Text, 91; 127 Option Explicit, 69; 336 Option Private, 113 Option Private Module, 79 ReDim, 75 Resume, 367 Type...End Type, 77 With...End With, 95 наблюдаемое, 339 Выражение, 66 z-порядок,292 Автоматизация, 30 Автофильтр, 375 Аргумент необязательный, 107 обязательный, 107 процедуры, 107 База данных, 372 запись, 372 поле, 372 применение фильтра, 374 таблица, 372 Бесконечный цикл, 99 в Возможность Auto List, 72 защита рабочего листа, 326 обновление экрана, 158 ручной пересчета формул, 172 форматирование, 185 Выражение, 88 Enum...End Enum, 78 Mid, 133 On Error Resume Next, 367 Option Basel, 74 Option Compare Binary, 127 Д Данные внешние, 27 внутренние, 27 Диаграмма блокирование, 242 встроенная, 225 выбор шрифтов, 235 вывод на печать, 251 заголовки осей, 233 категории, 228 название, 232; 241 ряды данных, 228 тип,230 точечная, 246 и Имена в языке VBA, 68 Именованные аргументы, 52 К Класс, 29; 345 Collection, 53 метод, 352 определение, 346 свойство, 347 событие, 353 Ключ объекта, 53 Ключевое слово ActiveWord, 143 Active Workbook, 58 ByRef, 108
ByVal, 109 Call, 109 Const, 67 Dim, 79 Else, 96 Elself, 97 Me, 260 Nothing, 62 Null, 351 ParamArray, 108 Preserve, 75 Private, 79; 113 Public, 79; 113 REM, 66 Set, 72 Static, 112 String, 70 Sub, 106 This Workbook, 58 Коды ASCII, 90 Коллекция, 53 Addlns, 388 Borders, 192 ChartObject, 227 Charts, 227 CommandBars, 218 Sheets, 53; 55 Workbooks, 55 Комментарии, 66; 144 Компоненты, 30 Конкатенация, 89 Константы, 67 литеральные, 67 символьные, 67 л Лист диаграммы, 225; 227 м Макрос, 30; 38; 44; 105 безопасность, 331 запись, 45 запуск,47 Массив, 73 динамический, 75 одномерный, 74 статический, 73 Метод, 52; 105 AutoFilter, 375 AutoFit, 198 Chart Wizard, 238 Find, 202 FindNext, 203 FindPrevious, 203 Printout, 251 Replace, 205 SetSourceData, 229 SpecialCells, 159; 368 вспомогательный, 352 Модуль импортирование, 40 экспортирование, 40 Надстройка, 384 н о Область видимости переменных, 78 процедуры, 112 Обработчик ошибок, 364 Объект, 29 Application, 55 Border, 192 Chart, 227; 228 ChartObject, 227; 243 Err, 366 Font, 189 Interior, 194 Range, 137 Sheet, 55 UserForm, 254 Workbook, 55; 60 Worksheet, 60 WorksheetFunction, 183 открытый, 30 Объектная модель Excel, 30; 51 Объектно-ориентированное программирование, 29 Оператор, 87 Веер,302 Do...Loop, 99 For Each In, 54 For Each...Next, 102 For...Next, 101 Goto, 103 If...Then, 96 Is, 91 Предметный указатель 417
like, 91 On Error Goto, 364 Resume, 367 Select Case, 97 While... Wend, 100 конкатенации, 89 присвоения, 87 строковый, 89 Операторы логические, 89; 170 математические, 169 сравнения, 90; 170 условные, 95 цикла, 95 числовой, 88 Ошибка, 335; 361 выполнения программы, 336; 361 перехват, 364 синтаксическая, 362 события, 106 Процедура-функция, 105; 110 Псевдокод, 167 Рабочая книга активная, 58 вывод на печать, 58 закрытие, 57 отправка по электронной почте, 59 Рабочий лист, 60 добавление, 61 копирование, 62 отображение, 61 удаление, 61 Размер массива, 73; 76 Редактор VBA, 28; 44 Редактор кнопок, 216 п Панель инструментов, 209 присоединение к рабочей книге, 217 создание, 211 Пароль, 325 Переменные, 27; 68 даты, 71 локальные, 111 объявление, 68 строковые, 70 типа Boolean, 72 типа Object, 71 типа Variant, 72 числовые, 69 Подпрограмма, 105 Порядок обхода элементов, 293 Привязка поздняя, 71 ранняя, 71 Программа, 27 объектно-ориентированная, 29 создание, 32 Проект VBA, 38 Процедура, 32; 37; 105 Property Get, 347 Property Let, 347 обработки события, 286 свойства, 105 Свойство, 42; 51 ActiveSheet, 62 Calculation, 173 Cells, 155 CircularReference, 171 Columns, 160 Comment, 144 Count, 53 CurrentRegion, 143 DisplayAlerts, 61 EntireColumn, 161 EntireRow, 161 IsAddIn, 384 NumberFormat, 188 Offset, 140 Rows, 160 Selection, 149 UsedRange, 143 доступное только для чтения, 351 События Change, 315 KeyDown, 286 NewSheet, 314 ОпКеу, 322 OnTime, 320 Open, 313 WorkbookBeforeClose,319; 387 418 Предметный указатель
Workbook_Open, 387 отключение, 312 процедура обработки, 310 События классификация, 309 необъектные, 310 порядок возникновения, 311 приложения, 317 сом-компоненты, 30 Ссылка абсолютная, 46; 148; 166 на объект, 52 на рабочую книгу, 57 относительная, 46; 139; 148; 166 циклическая, 170 Стандарт Unicode, 130 Статистические функции баз данных, 378 Строки переменной длины, 70 фиксированной длины, 70 Твип,126 Тип Date, 115 определенный пользователем, 77 перечислимый, 77 Точки прерывания, 337 у Управляющие конструкции, 95 Ф Форматирование числовое, 187 шрифтов, 189 ячеек, 185 Функция Asc, 131 CDbl, 129 Chr, 133 CSng,110 Date, 117 DateAdd, 117 DateDiff, 120 DatePart, 118 DateSerial, 116 DateValue, 116 Format, 121 FormatDateTime, 121 Ilf, 97 InputBox, 125 InStr, 127 ! InStrRev, 127 IsArray, 146 IsEmpty, 142 IsNull, 352 LBound, 76 LCase, 91;129 Left, 133 Mid, 133 MsgBox, 123 Now, 117 RGB, 190 Right, 133 RND, 181 Str, 130 StrComp, 128 StrConv, 128 Time, 117 TimeSerial, 117 TimeValue, 117 TypeName, 149 UBound, 76 UCase,91;129 Val, 129 ПИ, 168 ПЛТ, 177 СЛЧИС, 181 Ц Цвета RGB, 191 Цифровые сертификаты, 333 ш Шестнадцатеричная система исчисления, 67 Экземпляр класса, 29 Экранная форма, 253 методы, 259 свойства, 257 Элемент управления, 265 CheckBox, 267 Предметный указатель 419
CommandButton, 270 JJ Frame, 272; 295 Label, 272 Язык программирования OptionButton, 273 Microsoft Visual Basic, 28 RefEdit, 275 VBA, 28 TextBox, 276 ToggleButton, 278 свойства, 266 420 Предметный указатель
Научно-популярное издание Питер Эйткен Интенсивный курс программирования в Excel за выходные Литературный редактор Верстка Художественный редактор Корректоры О.В, Ожигова О.В. Линник С.А. Чернокозинский ЛЛ. Гордиенко J 0,В. Мишутина^ Л.В. Пустовойтова Издательский дом "Вильяме". 101509, Москва, ул. Лесная, д. 43, стр. 1. Подписано в печать 27.09.2004. Формат 70X100/16. Гарнитура Times. Печать офсетная. Усл. печ. л. 21,9. Уч.-изд. л. 23,7. Тираж 3000 экз. Заказ № 730. Отпечатано с диапозитивов в ФГУП "Печатный двор" Министерства РФ по делам печати, телерадиовещания и средств массовых коммуникаций. 197110, Санкт-Петербург, Чкаловский пр., 15.