Microsoft ЕхсеГ 2010 Профессиональное программирование на VBA Джон Уокенбах г На компакт-диске: • файлы примеров для всех упражнений книги • электронная англоязычная версия книги Microsoft л Excel 2010 Профессиональное программирование на VBA Excel 2010 Power Programming with VBA by John Walkenbach WILEY Wiley Publishing, Inc. Microsoft - Excel 2010 Профессиональное программирование на VBA Джон Уокенбах ДИАЛЕКТИКА Москва ♦Санкт-Петербург • Киев 2012 ББК 32.973.26-018.2.75 У62 УДК 681.3.07 Компьютерное издательство “Диалектика” Главный редактор С.Я. Тригуб Зав. редакцией В.Р. Гинзбург Перевод с английского и редакция А.П. Сергеева По общим вопросам обращайтесь в издательство “Диалектика” по адресу: [email protected], http://www.dialektika.com Уокенбах, Джон. У62 Excel 2010: профессиональное программирование на VBA.: Пер. с англ. — М. : ООО “И.Д. Вильямс”, 2012. — 944 с. : ил. — Парал. тит. англ. ISBN 978-5-8459-1721-8 (рус.) ББК 32.973.26-018.2.7S Все названия программных продуктов являются зарегистрированными торговыми марками соответст­ вующих фирм. Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механические, включая фотокопирование и запись на магнитный носитель, если на это нет письменного разрешения издательства Wiley Publishing, Inc. Copyright © 2012 by Dialektika Computer Publishing. Original English language edition Copyright © 2010 by Wiley Publishing, Inc. All rights reserved including the right of reproduction in whole or in part in any form. This translation is pub­ lished by arrangement with Wiley Publishing, Inc. Научно-популярное издание Джон Уокенбах Excel 2010: профессиональное программирование на VBA Литературный редактор Верстка Художественный редактор Корректор JI.H. Красножон, ЕД. Давидян О. В. Романенко Е.П. Дынник Л.А. Гордиенко Подписано в печать 06.04.1012. Формат 70x100/16 Гарнитура Times. Печать офсетная Уел. печ. л. 76,11. Уч.-изд. л. 52,8 Доп. тираж 1000 экз. Заказ № 3107 Первая Академиская типография “Наука” 199034, Санкт-Петербург, 9-я линия, 12/28 ООО “И. Д. Вильямс”, 127055, г. Москва, ул. Лесная, д. 43, стр. 1 ISBN 978-5-8459-1721-8 (рус.) ISBN 978-0-470-47535-5 (англ.) © Компьютерное изд-во “Диалектика”, 2012, перевод, оформление, макетирование © Wiley Publishing, Inc., 2010 Оглавление Об авторе Введение 25 26 Часть I. Введение в Excel 33 Глава 1. Excel 2010: история программы Глава 2. Основные элементы Excel Глава 3. Особенности формул Глава 4. Файлы Excel 35 49 77 101 Часть II. Разработка приложений Excel Глава 5. Приложения электронных таблиц Глава 6. Принципы разработки приложений электронных таблиц Часть III. Visual Basic for Applications Глава 7. Введение в VBA Глава 8. Основы программирования на VBA Глава 9. Работа с процедурами VBA Глава 10. Создание функций Глава 11. Приемы и методы программирования на VBA 123 125 137 159 161 211 253 287 325 Часть IV. Пользовательские формы 385 Глава 12. Создание собственных диалоговых окон Глава 13. Работа с пользовательскими формами Глава 14. Примеры пользовательских форм Глава 15. Дополнительные приемы работы с пользовательскими формами 387 405 439 473 Часть V. Профессиональные методы программирования 515 Глава 16. Разработка утилит Excel с помощью VBA Глава 17. Работа со сводными таблицами Глава 18. Управление диаграммами Глава 19. Концепция событий Excel Глава 20. Взаимодействие с другими приложениями Глава 21. Создание и использование надстроек 517 537 553 603 637 659 6 Часть VI. Разработка приложений Оглавление 685 Глава 22. Работа с лентой Глава 23. Работа с контекстными меню Глава 24. Предоставление справки в приложениях Глава 25. Разработка пользовательских приложений 687 719 737 757 Часть VII. Дополнительные темы 771 Глава 26. Вопросы совместимости Глава 27. Управление файлами с помощью VBA Глава 28. Управление компонентами Visual Basic Глава 29. Модули классов Глава 30. Работа с цветом Глава 31. Часто задаваемые вопросы о программировании в Excel 773 785 813 835 849 873 Часть VIII. Приложения Приложение А. Интерактивные ресурсы Excel Приложение Б. Справочник по операторам и функциям VBA Приложение В. Коды ошибок VBA Приложение Г. Содержимое компакт-диска Предметный указатель 905 907 913 921 925 941 Содержание Об авторе Введение 25 26 Часть I. Введение в Excel 33 Глава 1. Excel 2010: история программы Краткая история электронных таблиц Все начиналось с VisiCalc Lotus 1-2-3 Quattro Pro Microsoft Excel Современный рынок электронных таблиц Почему программа Excel так удобна разработчикам Место Excel в стратегии Microsoft 35 35 35 36 39 40 45 46 47 Глава 2. Основные элементы Excel Объектное мышление Рабочие книги Рабочие листы Листы диаграмм Листы макросов XLM Диалоговые листы Excel 5/95 Пользовательский интерфейс Excel Лента Контекстные меню и мини-панель инструментов Диалоговые окна Комбинации клавиш Смарт-теги Область задач Настройка окна программы Ввод данных Формулы, функции и имена Выделение объектов Форматирование Параметры защиты Защита формул от перезаписи Защита структуры рабочей книги Защита книги с помощью пароля Защита VBA-кода с помощью пароля Диаграммы Фигуры и рисунки SmartArt Доступ к базам данных 49 50 50 51 52 52 53 54 55 60 61 62 62 62 63 64 64 66 66 67 68 69 69 70 70 71 71 8 Содержание Базы данных рабочих листов Внешние базы данных Excel и Интернет Инструменты анализа Надстройки Макросы и программирование Файловые форматы Справочная система Excel 72 72 72 73 75 75 75 76 Глава 3. Особенности формул О формулах Вычисление формул Ссылки на ячейки и диапазоны Зачем нужны неотносительные ссылки О ссылках в стиле R1С1 Ссылки на другие листы или рабочие книги Использование имен Присвоение имен ячейкам и диапазонам Применение имен к существующим ссылкам Пересечение имен Присвоение имен столбцам и строкам Определение области действия Присвоение имен константам Присвоение имен формулам Присвоение имен объектам Ошибки в формулах Excel Формулы массивов Пример формулы массива Создание календаря с помощью формулы массива Достоинства и недостатки формул массивов Подсчет и суммирование Примеры формул подсчета Примеры формул суммирования Другие инструменты подсчета Работа со значениями даты и времени Ввод значений даты и времени Использование дат до 1900 года Создание мегаформул 77 77 78 79 79 80 81 82 82 84 85 85 85 85 87 88 89 90 90 91 91 92 93 94 95 95 95 96 96 Глава 4. Файлы Excel Запуск Excel Типы файлов Форматы файлов Excel Форматы текстовых файлов Форматы файлов баз данных Другие форматы файлов Работа с файлами шаблонов Просмотр шаблонов % 101 101 104 104 105 106 107 108 108 Содержание Создание шаблонов Создание шаблонов рабочих книг Содержимое файла Excel Структура файла Почему файловый формат столь важен Файл OfficeUI Файл XLB Файлы надстроек Настройки Excel в системном реестре Кратко о системном реестре Настройки Excel 9 * Часть II. Разработка приложений Excel 109 111 112 112 115 116 117 117 118 118 119 123 Глава 5. Приложения электронных таблиц О приложениях электронных таблиц Разработчик и конечный пользователь Кто такие разработчики и чем они занимаются Классификация пользователей электронных таблиц Для кого предназначены приложения электронных таблиц Решение проблем с помощью Excel Основные типы электронных таблиц Электронные таблицы “на скорую руку” Электронные таблицы “не для посторонних глаз” Однопользовательские приложения Приложения-“спагетти” Приложения-утилиты Надстройки с функциями рабочих листов Одноблоковые бюджеты Модели “что если” Электронные таблицы для хранения данных и доступа к ним Клиентские приложения баз данных Приложения “под ключ” 125 125 126 126 128 128 129 130 131 131 131 132 132 133 133 134 134 134 135 Глава 6. Принципы разработки приложений электронных таблиц Этапы разработки приложения Определение потребностей пользователя Проектирование приложения с учетом потребностей пользователя Определение удобного пользовательского интерфейса Настройка ленты Настройка контекстных меню Комбинации клавиш Создание пользовательских диалоговых окон Использование элементов управления ActiveX на рабочем листе Разработка собственно приложения Работа с конечным пользователем Тестирование приложения 137 137 138 139 142 143 144 144 145 146 147 148 148 10 Как сделать приложение отказоустойчивым Создание привлекательных и интуитивно понятных приложений Создание пользовательской справочной системы Документирование усилий, затраченных на разработку Распространение приложения среди пользователей Обновление приложения Другие вопросы разработки приложений Версия Excel, установленная у пользователя Трудности, касающиеся поддержки языка Быстродействие системы Видеорежимы Часть III. Visual Basic for Applications Глава 7. Введение в VBA Основы языка BASIC Обзор VBA Объектные модели Сравнение VBA и XLM Основы VBA Знакомство с редактором Visual Basic Отображение вкладки Разработчик Запуск VBE Окно VBE Работа с Project Explorer Добавление нового модуля VBA Удаление модуля VBA Экспорт и импорт объектов Работа с окнами кода Сворачивание и восстановление окон Сохранение кода VB А Ввод кода VBA Настройка среды VBE Вкладка Editor Вкладка Editor Format Вкладка General Вкладка Docking Средство записи макросов Что записывается Абсолютный или относительный Параметры записи Улучшение записанных макросов Об объектах и коллекциях Иерархия объектов О коллекциях Ссылки на объекты Свойства и методы Содержание 150 151 153 154 154 155 155 155 156 156 156 159 161 161 162 162 163 163 166 166 167 167 168 170 170 170 170 171 171 172 177 178 181 182 183 183 184 185 188 188 190 190 191 191 192 Содержание 11 Свойства объекта Методы объекта Объект Comment: пример использования Справочные сведения об объекте Comment Свойства объекта Comment Методы объекта Comment Коллекция Comments О свойстве Comment Объекты, вложенные в Comment Содержит ли ячейка примечание Добавление нового объекта Comment Некоторые полезные свойства объекта Арр 1 i с a t i on Работа с объектами Range Свойство Range Свойство Cells Свойство Offset Что следует знать об объектах Важные концепции для запоминания Узнайте больше об объектах и свойствах 192 193 194 194 196 196 197 198 198 199 200 200 202 202 204 206 207 207 208 Глава 8. Основы программирования на УВА Обзор элементов и конструкций VBA Комментарии Переменные, типы данных и константы Определение типов данных Объявление переменных Область действия переменной Работа с константами Управление строками Работа с датами Операторы присваивания Массивы Объявление массивов Объявление многомерных массивов Объявление динамических массивов Объектные переменные Пользовательские типы данных Встроенные функции Управление объектами и коллекциями Конструкция With - End With Конструкция For Each - Next Контроль за выполнением кода Оператор GoTo Конструкция If- Then Конструкция Select Case Циклическая обработка инструкций 211 211 213 215 216 218 220 223 225 225 226 229 229 229 230 230 231 232 235 235 236 237 238 238 242 245 12 Содержание Глава 9. Работа с процедурами VBA О процедурах Объявление процедуры Sub Область действия процедуры Выполнение процедуры Выполнение процедуры с помощью команды Run Sub/UserForm Выполнение процедуры в диалоговом окне Макрос Выполнение процедуры с помощью комбинации клавиш Выполнение процедуры с помощью ленты Выполнение процедуры из пользовательского контекстного меню Выполнение процедуры из другой процедуры Выполнение процедуры по щелчку на объекте Выполнение процедуры по событию Выполнение процедуры в окне отладки Передача аргументов процедурам Обработка ошибок Перехват ошибок Примеры обработки ошибок Реальный пример Цель Требования к проекту Исходные данные Подход Что необходимо знать Некоторые предварительные соображения Подготовка Написание кода Создание процедуры сортировки Дополнительное тестирование Устранение проблем Доступность Оценка проекта 253 253 254 255 256 257 257 258 259 259 259 263 265 265 265 269 269 270 273 274 274 274 275 275 276 277 278 279 282 282 285 286 Глава 10. Создание функций ' Процедуры и функции Назначение пользовательских функций Простой пример функции Использование функции на рабочем листе Использование функции в процедуре VBA Анализ пользовательской функции Синтаксис функции Область действия функции Выполнение функций Аргументы функций Примеры функций Функции без аргументов Функция с одним аргументом 287 287 288 288 289 290 291 292 293 294 297 297 298 300 Содержание 13 Функция с двумя аргументами Функция с аргументом в виде массива Функция с необязательными аргументами Функция VBA, возвращающая массив Функция, возвращающая значение ошибки Функция с неопределенным количеством аргументов Имитация функции СУММ Расширенные функции для работы с датами Отладка функций Работа с диалоговым окном Мастер функций Использование метода M a c ro O p tio n s Определение категории функции Добавление описания функции вручную Использование надстроек для хранения пользовательских функций Использование функций Windows API Примеры функций Windows API Определение папки Windows Определение состояния клавиши <Shift> Дополнительная информация о функциях Windows API 302 303 304 305 307 309 310 312 314 315 316 317 319 320 320 321 321 322 323 Глава 11. Приемы и методы программирования на VBA Учимся на примерах Работа с диапазонами Копирование диапазона Перемещение диапазона Копирование диапазона переменного размера Выделение или определение типов диапазонов Запрос значения ячейки Ввод значения в следующую пустую ячейку Приостановка работы макроса для определения диапазона пользователем Подсчет выделенных ячеек Определение типа выделенного диапазона Просмотр выделенного диапазона Удаление всех пустых строк Дублирование строк Определение диапазона, находящегося в другом диапазоне Определение типа данных ячейки Чтение и запись диапазонов Более эффективный способ записи в диапазон Перенесение одномерных массивов Перенесение диапазона в массив типа V a r i a n t Выбор ячеек по значению Копирование несмежных диапазонов Управление рабочими книгами и листами Сохранение всех рабочих книг Сохранение и закрытие всех рабочих книг Частичное сокрытие элементов рабочего листа 325 325 326 326 327 328 328 330 331 332 334 335 336 339 339 341 341 342 343 345 345 346 347 348 348 349 350 14 Синхронизация рабочих книг Методы программирования на VBA Переключение значения булева свойства Определение количества страниц для печати Отображение даты и времени Отображение списка шрифтов Сортировка массива Обработка последовательности файлов Полезные функции для программ VBA Функция FileExists Функция FileNameOnly Функция PathExists Функция RangeNameExists Функция Sheet Exists Функция WorkbookI sOpen Получение значения из закрытой рабочей книги Полезные функции в формулах Excel Получение информации о форматировании ячейки Беседа с рабочим листом Отображение даты сохранения файла или вывода файла на печать Основы иерархии объектов Подсчет количества ячеек между двумя значениями Определение последней непустой ячейки в столбце или в строке Соответствует ли строка шаблону Возвращение из строки n-го элемента Преобразование чисел в текст Универсальная функция Функция SheetOf f set Возвращение максимального значения всех рабочих листов Возвращение массива случайных целых чисел без повторов Расположение значений диапазона в произвольном порядке Вызов функций Windows API Определение связей с файлами Определение буквы диска Определение параметров принтера по умолчанию Определение текущего видеорежима Добавление звука в приложение Чтение и запись параметров системного реестра Часть IV. Пользовательские формы Глава 12. Создание собственных диалоговых окон Перед созданием диалоговых окон... Использование окон ввода данных Функция InputBox в VBA Метод Excel InputBox Функция VBA MsgBox Содержание 351 352 352 352 353 354 356 357 358 359 359 359 360 360 360 361 362 363 364 364 365 366 367 368 369 370 370 371 372 373 374 376 376 377 377 378 379 381 385 387 387 388 388 389 392 Содержание 15 Метод Excel G e tO p e n F ile n a m e Метод Excel G e ts a v e As F i 1 ename Получение имени папки Отображение диалоговых окон Excel Отображение формы ввода данных Доступ к формам ввода данных Отображение формы ввода данных с помощью VBA 395 398 399 399 401 401 403 Глава 13. Работа с пользовательскими формами Обработка пользовательских диалоговых окон в Excel Вставка новой формы UserForm Добавление элементов управления в пользовательское диалоговое окно Элементы управления в окне Toolbox 405 405 406 407 408 408 408 409 409 409 409 409 409 410 410 410 410 410 410 410 412 414 414 415 416 418 418 Checkbox ComboBox CommandButton Frame Image Label ListBox MultiPage OptionButton RefEdit ScrollBar SpinButton TabStrip TextBox ToggleButton Настройка элементов управления пользовательского диалогового окна Изменение свойств элементов управления Работа с окном Properties Общие свойства Советы по использованию клавиатуры Отображение пользовательского диалогового окна Отображение немодальной формы Отображение пользовательского диалогового окна на основе значения переменной Загрузка пользовательского диалогового окна О процедурах обработки событий Закрытие пользовательского диалогового окна Пример создания пользовательского диалогового окна Создание пользовательской формы Создание кода для отображения диалогового окна Тестирование диалогового окна Добавление процедур обработки событий Проверка правильности введенных данных Ура, заработало! 419 419 419 420 421 421 423 424 425 427 427 16 Содержание События объекта UserForm Получение дополнительных сведений о событиях События объекта UserForm События элемента управления SpinButton Совместное использование элементов управления SpinButton и TextBox Ссылка на элементы управления пользовательского диалогового окна Настройка панели инструментов Тoolbox Добавление новых страниц Настройка или комбинирование элементов управления Добавление элементов управления ActiveX Создание шаблонов диалоговых окон Вопросы для самоконтроля 427 428 429 429 431 433 435 435 435 436 437 438 Глава 14. Примеры пользовательских форм Создание “меню” с помощью объекта UserForm Использование элементов управления CommandButton Использование элемента управления List Box Выбор диапазона в пользовательской форме Создание заставки Отключение кнопки закрытия пользовательского диалогового окна Изменение размера диалогового окна Масштабирование и прокрутка листа в пользовательском диалоговом окне Использование элемента управления ListBox Добавление опций в элемент управления ListBox Определение выделенного элемента списка Определение нескольких выделенных элементов списка Несколько списков в одном элементе управления ListBox Передача опций элемента управления ListBox Перемещение опций в списке элементов управления ListBox Работа с многоколоночными элементами управления ListBox Использование элемента управления ListBox для выделения строк на листе Использование элемента управления ListBox для активизации листа Применение элемента управления Mul t iPage Использование внешних элементов управления Анимация элемента управления Label 439 439 440 440 441 443 445 446 448 449 450 455 455 457 457 459 460 462 464 466 468 470 Глава 15. Дополнительные приемы работы с пользовательскими формами Немодальные диалоговые окна Отображение индикатора текущего состояния Создание отдельного индикатора текущего состояния Отображение сведений о текущем состоянии с помощью элемента управления 473 474 477 478 MultiPage Отображение индикатора текущего состояния без применения элемента управления Mul t iPage Создание мастеров Настройка элемента управления Mul t iPage Добавление кнопок 481 484 484 486 487 Содержание Программирование кнопок Программирование зависимостей Выполнение задачи Имитация работы функции MsgBox Код функции MyMsgBox Как это работает Использование функции MyMsgBox Диалоговое окно Use г Form с перемещаемыми элементами управления Диалоговое окно UserForm без строки заголовка Имитация панели инструментов с помощью диалогового окна UserForm Диалоговое окно UserForm с изменяемыми размерами Несколько кнопок с одной процедурой обработки событий Диалоговое окно выбора цвета Отображение диаграммы в пользовательском диалоговом окне UserForm Сохранение диаграммы в виде GIF-файла Изменение свойства Picture элемента управления Image Создание полупрозрачной формы ввода данных Расширенная форма ввода данных Подробнее о расширенной форме ввода данных Установка надстройки Enhanced Data Form Игра в “пятнашки” Играем в видеопокер в окне UserForm Часть V. Профессиональные методы программирования Глава 16. Разработка утилит Excel с помощью УВА Об утилитах Excel Создание утилит с помощью VB А Признаки хорошей утилиты Утилита Text Tools Обоснование Назначение проекта Рабочая книга утилиты Как работает утилита Пользовательская форма утилиты Модуль Modulel Модуль кода UserForml Повышение эффективности утилиты Сохранение настроек утилиты Отмена ранее выполненных действий Отображение файла справки Добавление кода RibbonX Оценка проекта Принципы работы утилиты Дополнительно об утилитах Excel 17 487 489 490 491 492 493 494 494 495 497 499 503 505 507 508 508 509 510 512 513 513 514 515 517 517 518 518 519 520 520 521 522 522 523 525 527 528 530 532 533 534 535 535 18 Содержание Глава 17. Работа со сводными таблицами Вводный пример Создание сводной таблицы Просмотр созданного кода Усовершенствование записанного кода сводной таблицы Создание сложных сводных таблиц Код сводной таблицы Принцип работы сводной таблицы Создание нескольких сводных таблиц Создание обратной сводной таблицы 537 537 538 539 540 542 544 545 546 549 Глава 18. Управление диаграммами Кратко о диаграммах Расположение диаграмм Диаграммы и функция записи макроса Объектная модель диаграммы Создание внедренной диаграммы Размещение диаграммы на листе диаграммы Активизация диаграммы с помощью кода VBA Перемещение диаграммы Деактивизация диаграммы Определение активности диаграммы Удаление объектов из коллекции ChartObj ects или Charts Циклический просмотр диаграмм Изменение размеров и выравнивание диаграмм Экспорт диаграммы Экспорт всех изображений Изменение применяемых в диаграмме данных Изменение данных диаграммы на основе активной ячейки Определение используемых в диаграмме диапазонов данных с помощью VBA Отображение подписей для данных на диаграмме Отображение диаграммы в пользовательском диалоговом окне События диаграмм Пример использования событий объекта Chart Поддержка событий для встроенных диаграмм Пример использования событий объекта Chart во встроенной диаграмме Тонкости создания диаграмм Печать встроенных диаграмм на всю страницу Отображение/сокрытие рядов данных Создание фиксированной диаграммы Отображение подсказки Анимирование диаграмм Прокрутка диаграммы Создание диаграммы с графиком гипоциклоиды Создание диаграммы часов Создание интерактивной диаграммы без написания макросов Получение данных приложения 553 554 554 555 555 556 558 558 559 561 561 562 562 564 565 566 567 568 570 573 575 577 578 581 582 584 584 584 585 588 590 591 592 593 595 596 Содержание 19 Создание переключателей на рабочем листе Создание списка городов Создание диапазона данных для интерактивной диаграммы Создание интерактивной диаграммы Спарклайны 597 597 598 598 599 Глава 19. Концепция событий Excel Типы событий Excel Понимание последовательности событий Размещение процедур обработки событий Отключение событий Ввод кода процедуры обработки события Процедуры обработки событий, которые используют аргументы События уровня объекта Workbook Событие Open Событие Activate Событие Sheet Activate Событие NewSheet Событие BeforeSave Событие Deactivate Событие BeforePrint Событие Bef oreClose События объекта Worksheet Событие Change Событие Sе 1е с t ionChange Событие BeforeDoubleClick Событие Bef oreRightClick События объекта Chart События объекта App 1 iс a t ion Включение событий уровня объекта Applicat ion Определение факта открытия рабочей книги Отслеживание событий уровня объекта Appl icat ion События объекта UserForm События, не связанные с объектами Событие OnTime Событие ОпКеу 603 603 604 605 606 607 608 610 611 611 612 612 612 613 613 615 616 617 622 622 623 624 626 627 627 629 630 631 631 633 Глава 20. Взаимодействие с другими приложениями Запуск другого приложения из Excel Использование функции Shell Использование API-функции She 11 Execute Активизация другого приложения с помощью Excel Инструкция АррАс ti vat е Активизация приложения Microsoft Office Запуск аплетов папки Панель управления и мастеров Автоматизация Работа с внешними объектами 637 637 637 640 641 641 642 642 643 644 20 Содержание Раннее и позднее связывание Простой пример позднего связывания Управление приложением Word из Excel Управление программой Excel из другого приложения Отправка почтовых сообщений с помощью Outlook Отправка почтовых вложений с помощью Excel Использование метода SendK eys 644 647 648 650 653 655 657 Глава 21. Создание и использование надстроек Определение надстройки Сравнение надстройки со стандартной рабочей книгой Основные причины создания надстроек Использование диспетчера надстроек Excel Создание надстройки Пример надстройки Добавление описания в надстройку Формирование надстройки Установка надстройки Тестирование надстройки Распространение надстройки Изменение надстройки Сравнение файлов XLAM и XLSM Членство в коллекциях Отображение окон файлов XSLM и XLAM Рабочие листы и листы диаграмм в файлах XLSM и XLAM Получение доступа к VBA-процедурам надстройки Управление надстройками с помощью кода VBA Добавление элемента в коллекцию Addins Удаление элемента из коллекции Addins Свойства объекта Addin Получение доступа к надстройке как к рабочей книге События объекта Addin Оптимизация производительности надстроек Проблемы, связанные с использованием надстроек Правильная установка Ссылки на другие файлы Указание правильной версии Excel 659 659 660 661 662 663 664 665 666 667 668 668 668 670 670 670 671 672 675 675 676 677 679 680 680 681 681 683 684 Часть VI. Разработка приложений Глава 22. Работа с лентой Начальные сведения о ленте Управление лентой с помощью VBA Доступ к элементам управления на ленте Как работать с лентой Активизация вкладки Настройка ленты 685 687 687 690 691 692 694 695 Содержание 21 Простой пример кода RibbonX Усовершенствование простого примера кода RibbonX Еще один пример кода RibbonX Демонстрация возможностей элементов управления ленты Пример элемента управления Dynami cMenu Некоторые замечания о настройке ленты Создание “старомодных” панелей инструментов Ограничения, присущие “старомодным” панелям в Excel 2010 Код панели инструментов 695 698 702 705 710 713 714 715 715 Глава 23. Работа с контекстными меню Обзор объекта CommandBar Типы объектов CommandBar Отображение контекстных меню Ссылки на объекты CommandBar Установка ссылок на элементы управления в объекте CommandBar Свойства элементов управления CommandBar Отображение всех элементов контекстного меню Настройка контекстных меню с помощью VBA Сброс контекстных меню Отключение контекстного меню Отключение элементов контекстного меню Добавление нового элемента в контекстное меню ячейки Добавление подменю в контекстное меню Контекстные меню и события Автоматическое добавление и удаление меню Отключение или сокрытие элементов контекстного меню Создание нового контекстного меню 719 719 720 720 721 721 723 723 726 726 726 727 727 729 731 732 733 733 Глава 24. Предоставление справки в приложениях Справка в приложениях Excel Диалоговая система Справочная система, созданная с помощью компонентов Excel Использование примечаний к ячейке для предоставления справки Применение текстового поля для предоставления справки Использование рабочего листа для отображения справки Отображение справки в пользовательском диалоговом окне Отображение справки в окне браузера Использование HTML-файлов Использование файла MHTML Использование средства HTML Help Метод Help Связывание файлов справочного руководства с приложением Связывание раздела справочного руководства с функцией VBA 737 737 738 740 740 742 743 743 748 748 748 750 752 753 754 Глава 25. Разработка пользовательских приложений Что такое приложение, ориентированное на пользователя Мастер расчета займа 757 757 758 22 Содержание Использование мастера Структура рабочей книги Как это работает Концепции разработки приложений 759 759 761 768 Часть VII. Дополнительные темы 771 Глава 26. Вопросы совместимости Концепция совместимости Проблемы совместимости Избегайте использования новых возможностей Поддержка платформы Macintosh Использование 64-разрядной версии Excel Создание интернациональных приложений Многоязычные приложения Язык в VBА Использование “локальных” свойств Идентификация настроек системы Параметры настройки даты и времени 773 773 774 775 776 777 779 780 781 781 782 784 Глава 27. Управление файлами с помощью VBA Часто выполняемые операции с файлами Управление файлами с помощью функций VBA Использование объекта F ile S y s te m O b je c t Отображение расширенной информации о файле Работа с текстовыми файлами Открытие текстового файла Чтение текстового файла Запись в текстовый файл Получение номера файла Определение или установка позиции в файле Операторы чтения и записи в файл Примеры управления текстовыми файлами Импортирование данных из текстового файла Экспортирование диапазона в текстовый файл Импортирование текстового файла в диапазон Протоколирование операций в Excel Фильтрация текстового файла Экспортирование диапазона в формат HTML Экспортирование диапазона в XML-файл Архивирование и разархивирование файлов Архивирование файлов Разархивирование файла Модель ADO 785 785 786 790 793 794 795 796 796 796 797 797 798 798 798 801 802 802 803 806 808 808 810 811 Глава 28. Управление компонентами Visual Basic Введение в IDE Объектная модель IDE 813 813 816 Содержание 23 Коллекция VBPro jects Отображение всех компонентов проекта VBA Отображение всех процедур VBA, содержащихся в рабочей книге Замещение модуля обновленной версией Использование VBA для создания кода VBА Добавление элементов управления в диалоговое окно UserForm на этапе разработки Управление диалоговыми окнами UserForm на этапе разработки и этапе выполнения Добавление 100 элементов управления CommandButton на этапе разработки Программное создание диалоговых окон UserForm Простой пример Более сложный пример 816 818 819 820 822 824 825 826 828 828 830 Глава 29. Модули классов Определение модуля класса Пример создания модуля класса Вставка модуля класса Добавление кода VBA Использование модуля класса NumLockClass Дополнительные сведения о модулях классов Программирование свойств объектов Программирование методов объектов События модуля класса Модуль класса CSVFileClass Переменные уровня модуля класса Процедуры свойств Процедуры методов Использование класса CSVFileClass 835 835 836 837 837 839 840 840 842 842 843 843 844 844 846 Глава 30. Работа с цветом Определение цвета Цветовая модель RGB Цветовая модель HSL Преобразование цветов Оттенки серого Преобразование цветов в оттенки серого Просмотр диаграмм в оттенках серого Экспериментирование с цветами Темы документа Концепция темы документа Цвета темы документа Отображение всех цветов темы Работа с фигурами Фоновый цвет фигуры Фигуры и цвета темы Другие типы заливки фигур Изменение цветов диаграммы 849 849 850 851 851 854 854 855 857 858 858 859 863 864 865 867 869 870 & 24 Глава 31. Часто задаваемые вопросы о программировании в Excel Списки часто задаваемых вопросов Общие вопросы об Excel Редактор Visual Basic Процедуры ' Функции Объекты, свойства, методы и события Пользовательские диалоговые окна Надстройки Пользовательский интерфейс Часть VIII. Приложения Содержание 873 873 874 879 881 886 888 896 901 903 905 Приложение А. Интерактивные ресурсы Excel Справочная система Excel Техническая поддержка со стороны компании Microsoft Варианты поддержки База знаний Microsoft Начальная страница Microsoft Excel Начальная страница Microsoft Office Группы новостей Доступ к группам новостей с помощью программы чтения новостей Доступ к группам новостей с помощью браузера Поиск в группах новостей Веб-сайты The Spreadsheet Page Блог, посвященный Excel Сайт Йона Пелтиера Сайт Чипа Пирсона Сайт Contextures Блог Pointy Haired Dilbert Сайт Дейвида Макритчи Мистер Excel 907 907 908 908 908 908 908 909 909 909 910 911 911 911 911 912 912 912 912 912 Приложение Б. Справочник по операторам и функциям VBA Вызов функций Excel с помощью операторов VBA 913 916 Приложение В. Коды ошибок VBA 921 Приложение Г. Содержимое компакт-диска Системные требования Использование компакт-диска Файлы и программы, находящиеся на компакт-диске Электронная версия книги Файлы примеров Решение проблем 925 925 926 926 926 926 940 Предметный указатель 941 Об авторе Джон Уокенбах — автор более 50 книг, посвященных электронным таблицам. Живет в штате Аризона. Посетите его веб-сайт h t t p : / / s p r e a d s h e e t p a g e . com. Введение Рад приветствовать вас, уважаемые читатели! Если вы разрабатываете электронные таблицы, предназначенные для других пользователей, или просто хотите серьезно изу­ чить Excel, то, купив эту книгу, вы сделали правильный выбор. О чем эта книга Предмет рассмотрения этой книги — язык программирования Visual Basic for Applications (VBA), который встроен в Excel, а также в другие приложения, входящие в состав Microsoft Office. Здесь подробно описано создание программ, автоматизирую­ щих выполнение различных задач в Excel, а также рассматривается широкий круг других тем — от написания простейших макросов до создания сложнейших приложений и ути­ лит, рассчитанных на взаимодействие с пользователем. В этой книге нет описания программного пакета Microsoft Visual Studio Tools for Office (VSTO). Он представляет собой воплощение относительно новой технологии, ис­ пользующей Visual Basic .NET и Microsoft Visual С#. Технология VSTO также может применяться для управления поведением программы Excel и других приложений Microsoft Office. Что необходимо знать Книга не предназначена для начинающих пользователей Excel. Если у вас нет опыта работы с этим приложением, то прочтите сначала мою книгу Excel 2010. Библия пользо­ вателя (Диалектика, 2011), в которой подробно рассказывается обо всех возможностях Excel (она адресована пользователям всех уровней). Чтобы извлечь из книги максимум полезной информации, необходимо быть доста­ точно опытным пользователем Excel. Я не уделяю особого внимания выполнению про­ стых операций. Предполагается, что вы умеете следующее: • создавать рабочие книги, вставлять листы, сохранять файлы и т.д.; • перемещаться по рабочей книге; • работать с лентой Excel; • вводить формулы; • использовать функции рабочих листов Excel; • давать имена ячейкам и диапазонам; • пользоваться основными средствами Windows, такими, например, как буфер обмена и Проводник. Если вы не знаете, как все это делать, то, возможно, некоторая информация окажется для вас довольно сложной. Итак, считайте, что вас предупредили. Если же вы опытный пользователь электронных таблиц, но еще не работали с Excel 2010, изучите краткий обзор возможностей этой программы в главе 2. Введение 27 Что вам понадобится Для эффективной работы с книгой нужно иметь копию Excel 2010. Несмотря на то что большая часть сведений, изложенных в книге, применима к Excel 2003 и 2007, предполага­ ется, что вы работаете именно с Excel 2010. И хотя программы Excel 2007 и Excel 2010 ра­ дикальным образом отличаются от своих предшественниц, среда разработки VBA не слишком изменилась. Если вы планируете разрабатывать приложения, которые ориентиро­ ваны на более ранние версии Excel, не используйте в качестве среды разработки Excel 2010. Кроме того, материал книги в основном применим и к Excel для Macintosh. Впрочем, я не проводил испытаний на совместимость с версией для Мае (оставляю это для вас). Достаточно иметь компьютерную систему на основе платформы Windows, но лучше приобрести компьютер с большим объемом оперативной памяти. Excel — сложная про­ грамма, и ее использование в низкопроизводительной системе или в системе с неболь­ шим объемом памяти не доставит вам удовольствия. Рекомендуется установить разрешение экрана 1280x1024 пикселей, а еще лучше — 1600x1200 пикселей. Для достижения оптимальных результатов воспользуйтесь систе­ мой на основе двух мониторов, на одном из которых будет отображаться окно програм­ мы Excel, а на другом — окно редактора Visual Basic Editor. Для просмотра примеров на прилагаемом к книге компакт-диске понадобится привод для чтения компакт-дисков. Соглашения, используемые в книге Найдите время, чтобы просмотреть этот раздел и узнать о некоторых соглашениях, используемых по всей книге. Команды Excel После версии Excel 2007 на сцену вышел новый, лишенный меню пользовательский интерфейс. На смену прежней системе меню пришла контекстная система на основе лен­ ты. Вдоль верхнего края ленты отображаются названия вкладок (например, Вставка (Insert), Вид (View) и т.д.). После щелчка мышью на вкладке отображаются пиктограм­ мы, соответствующие кнопкам команд данной вкладки. Каждой пиктограмме соответст­ вует имя, которое обычно отображается правее или ниже значка пиктограммы. Совокуп­ ность пиктограмм образует группы, ниже которых отображаются их имена. В соответствии с соглашением, используемым в данной книге, сначала указывается название вкладки, за которым следует имя группы, а завершает все это название пикто­ граммы. Например, команда, определяющая перенос слов в ячейке таблицы, записывает­ ся следующим образом: Главная^Выравнивание^Перенос текста (Horned Alignment^Wrap Text). После выбора первой вкладки, называемой Файл (File), на экране появляется окно представления Backstage. В левой его части отображается ряд вкладок, включающих раз­ личные команды для работы с файлами, печати и т.д. Для обозначения команд, находя­ щихся в окне представления Backstage, применяется слово “Файл”, за которым следует название команды. Например, после вызова на выполнение следующей команды ото­ бражается диалоговое окно Параметры Excel (Excel Options): Файл^Параметры Excel (File1^ Excel Options). 28 Введение Команды редактора VBA Редактор VBA представляет собой окно, в котором осуществляется работа с кодом VBA. В этом окне применяется традиционный интерфейс, предусматривающий исполь­ зование меню и панелей инструментов. Например, ниже приведена команда, суть кото­ рой заключается в выборе меню Tools (Сервис) с последующим выбором элемента меню References (Ссылки): Tools'^ References. Ввод данных с клавиатуры Все, что вводится с клавиатуры, отображается полужирным шрифтом, например “введите =СУММ(В2 :В50) в ячейку В51”. Длинное вводимое значение располагается в отдельной строке, и для него использу­ ется моноширинный шрифт. Например, вы можете получить указание ввести следую­ щую формулу: =VLOOKUP(StockNumber,PriceList,2) Код VBA В этой книге вы будете сталкиваться с фрагментами кода VBA, а также с листингами процедур. В каждом листинге используется моноширинный шрифт, а каждая строка кода занимает в тексте книги отдельную строку. Чтобы код было удобнее читать, используют­ ся отступы. Конечно, задавать отступы не обязательно, но они помогают отделять друг от друга операторы, находящиеся рядом. Если строка кода не помещается в одной строке книги, то используется стандартный для VBA метод продолжения строки: в конце строки вводится пробел, после которого располагается символ подчеркивания. Это означает, что данная строка кода продолжает­ ся следующим фрагментом. Например, приведенные ниже две строки текста представ­ ляют единую строку кода. If Right(ActiveCell, 1) = "!" Then _ ActiveCell = Left(ActiveCell, Len(ActiveCell) - 1) Этот код можно ввести или так, как показано выше (т.е. в двух строках), или в одной строке, не используя символ подчеркивания. Функции, имена файлов и именованные диапазоны Для отображения функций рабочих листов Excel используется верхний регистр моно­ ширинного шрифта (например, “В ячейку С20 введите формулу СУММ”)- Имена, свойства, методы и объекты процедур VBA отображаются моноширинным шрифтом (“Выполните процедуру G e tT o ta ls ”). В таких именах, чтобы они легче читались, нередко одновре­ менно используются и нижний, и верхний регистры. Моноширинный шрифт также применяется для обозначения названий файлов и имено­ ванных диапазонов (“Откройте файл myf i l e . x lsm и выберите именованный диапазон”). Что означают пиктограммы По всей книге слева от абзацев можно встретить пиктограммы. Они используются для того, чтобы привлечь ваше внимание к особо важной информации. Введение 29 Новинка Эта пиктограмма обозначает новые возможности, которые появились в Excel 2010. Примечание Я пользуюсь этой пиктограммой, чтобы подчеркнуть важность принципа, ко­ торый поможет вам легко справиться с задачей или понять изложенную да­ лее информацию. Совет Эта пиктограмма указывает на более эффективный способ выполнения че­ го-либо или на прием, который, возможно, не является очевидным. Компакт-диск Этой пиктограммой обозначаются описанные в книге примеры, которые можно найти на прилагаемом компакт-диске (см. приведенный далее раз­ дел “О компакт-диске” ). Предупреждение Эта пиктограмма используется для описания операции, которую следует выполнять осторожно во избежание возможных проблем. © Перекрестная ссылка Эта пиктограмма используется для того, чтобы предоставить ссылки на дру­ гие главы, в которых о том или ином предмете говорится более подробно. Структура книги Главы книги сгруппированы в восемь частей. Часть I. Введение в Excel В этой части представлены основы изучаемой программы. В главе 1 излагается краткая история электронных таблиц. Таким образом, вы сможете определить место Excel в мире про­ граммного обеспечения. В главе 2 предложен концептуальный анализ Excel 2010 — доста­ точно полезный для тех опытных пользователей электронных таблиц, которые только переходят к использованию Excel. Что же касается главы 3, то в ней вкратце рассматри­ ваются формулы и, кроме того, рассказывается о некоторых новых приемах. В главе 4 отмечены достоинства и недостатки разных форматов файлов, поддерживаемых и созда­ ваемых в Excel. Часть II. Разработка приложений Excel Данная часть включает две главы. В главе 5 в общих чертах рассматривается созда­ ние приложений электронных таблиц. В главе 6 этот вопрос освещен более глубоко: в ней описаны типичные действия по разработке приложений электронных таблиц. 30 Введение Часть III. Visual Basic for Applications В эту часть входят главы 7-11. Здесь речь идет о подготовке к изучению VBA. Вы ознакомитесь с VBА, с основами программирования и более подробно — с разработкой процедур и функций VBA. В главе 11 предлагаются примеры использования VBA для решения повседневных задач. Часть IV. Пользовательские формы В этой части речь идет о пользовательских диалоговых окнах. В главе 12 описывают­ ся альтернативные методы создания пользовательских диалоговых окон. О пользова­ тельских формах и различных элементах управления, используемых при создании этих форм, рассказывается в главе 13. В главах 14 и 15 приведены примеры пользовательских диалоговых окон, начиная от простых и заканчивая достаточно сложными. Часть V. Профессиональные методы программирования В этой части рассматриваются дополнительные методы программирования, которые, на первый взгляд, невероятно сложны для понимания. Из первых трех глав вы узнаете, как создавать утилиты и использовать VBA для работы со сводными таблицами и диаграмма­ ми, а также со спарклайнами, которые появились в Excel 2010. В главе 19 речь идет о про­ цессе обработки событий, который позволяет выполнять процедуры автоматически, при­ чем именно тогда, когда происходят определенные события. Из главы 20 вы узнаете о спо­ собах взаимодействия с другими приложениями (такими, например, как Word). Часть V заканчивается главой 21, в которой подробно описаны способы создания надстроек. Часть VI. Разработка приложений Эта часть посвящена важным этапам создания приложений, ориентированных на ко­ нечных пользователей. В главе 22 рассматриваются методы изменения ленты, в главе 23 обсуждается работа с контекстными меню Excel, в главе 24 описываются способы подго­ товки интерактивной справочной системы для приложений и в главе 25 приводятся све­ дения о разработке приложений, ориентированных на пользователей. Часть VII. Дополнительные темы В этой части освещаются дополнительные темы, которые будут вам полезны. Инфор­ мация о совместимости приведена в главе 26. В главе 27 обсуждаются способы применения VBA для работы с файлами. Что же касается главы 28, то в ней объясняется, как с помо­ щью VBA управлять такими компонентами Visual Basic, как пользовательские диалоговые окна и модули. В главе 29 речь идет о модулях классов. Глава 30 посвящена методам рабо­ ты с цветом в Excel. Заканчивается данная часть полезной главой 31, в которой приводятся ответы на многие часто задаваемые вопросы о программировании в Excel. Часть VIII. Приложения Завершают книгу четыре приложения. В приложении А вы найдете полезную инфор­ мацию о ресурсах Интернета, посвященных Excel. Приложение Б — это справочное ру­ ководство по всем ключевым словам VBA (операторам и функциям). Коды ошибок VBA Введение 31 приведены в приложении В. Наконец, в приложении Г описаны файлы, которые содер­ жатся на прилагаемом к книге компакт-диске. О компакт-диске К данной книге прилагается компакт-диск с файлами примеров, рассматриваемых в книге. Я убежден, что любые знания лучше получать, изучая конкретные примеры, ко­ торые могут пригодиться в будущем. Несомненно, теоретический материал, изложенный в книге, очень важен, но без практического применения он не стоит и ломаного гроша. На самом деле на подготовку файлов примеров понадобилось намного больше времени, чем на написание текста книги. Файлы примеров на прилагаемом компакт-диске не заархивированы, поэтому можете открывать их, не копируя на жесткий диск компьютера. © Перекрестная ссылка Дополнительные сведения о файлах, находящихся на прилагаемом компактдиске, приведены в приложении Г. О пакете Power Utility Рак Популярный программный пакет Power Utility Рак — это непревзойденная коллекция полезных утилит Excel, а также новых функций рабочих листов. Он был разработан мною исключительно для совместного использования с VBA. Я надеюсь, что этот программный продукт будет весьма полезен в вашей повседнев­ ной работе с Excel. Можете также приобрести полный набор исходных кодов VBA за номинальную плату. Изучив код, вы сможете овладеть рядом полезных методик про­ граммирования. Пробную 30-дневную версию пакета Power Utility Рак можно загрузить на сайте http://spreadsheetpage.com. Как пользоваться этой книгой Вы можете работать с книгой, как вам удобно. Ваше решение прочесть ее от корки до корки я могу лишь поприветствовать. Но так как материал книги достаточно сложен, то порядок чтения глав часто не имеет значения. Подозреваю, что большинство читателей будут “перескакивать” от одной части к другой, выискивая то тут, то там полезные “лакомые кусочки”. Если же вы столкнулись с трудностями, то сначала загляните в ог­ лавление — нет ли в книге решения именно вашей проблемы. Как связаться с автором Мой издатель и я очень любим получать письма. Если вы являетесь счастливым об­ ладателем этой книги, выделите несколько минут в своем напряженном рабочем графике для посещения сайта Wiley Publishing. И не просто посетите его, а оставьте на нем свои комментарии. (Перейдите по адресу www. wiley.com и щелкните на ссылке Contact Us.) Пожалуйста, будьте объективны в процессе оценивания. Если вы считаете, что в главе от­ сутствует нужная информация, дайте нам об этом знать. Конечно, как и все мы, я не слишком люблю получать отрицательные отзывы, но все же лучше “горькая правда”. 32 Введение От читателей моих книг я каждый день получаю по электронной почте не менее деся­ ти вопросов. Благодарю вас за сотрудничество! К сожалению, у меня просто нет времени отвечать на них. В приложении А приведен полный список источников, которые помогут вам в решении той или иной проблемы. Можете также посетить мой сайт, на котором найдете много разнообразной инфор­ мации об Excel: http://spreadsheetpage.com . Ждем ваших отзывов! Вы, читатель этой книги, и есть главный ее критик. Мы ценим ваше мнение и хотим знать, что было сделано нами правильно, что можно было сделать лучше и что еще вы хотели бы увидеть изданным нами. Нам интересны любые ваши замечания в наш адрес. Мы ждем ваших комментариев и надеемся на них. Вы можете прислать нам бумаж­ ное или электронное письмо либо просто посетить наш веб-сервер и оставить свои заме­ чания там. Одним словом, любым удобным для вас способом дайте нам знать, нравится ли вам эта книга, а также выскажите свое мнение о том, как сделать наши книги более интересными для вас. Отправляя письмо или сообщение, не забудьте указать название книги и ее авторов, а также свой обратный адрес. Мы внимательно ознакомимся с вашим мнением и обяза­ тельно учтем его при отборе и подготовке к изданию новых книг. Наши электронные адреса: E-mail: [email protected] WWW: http://www.dialektika.com Наши почтовые адреса: в России: в Украине: 127055, г. Москва, ул. Лесная, д. 43, стр. 1 03150, Киев, а/я 152 Часть Введение в Excel В этой части... Глава 1 Excel 2010: история програм м ы Глава 2 Основные элементы Excel Глава 3 Особенности формул Глава 4 Файлы Excel Excel 2010: история программы Вэтой главе... ♦ Краткая история электронных таблиц ♦ Почему программа Excel так удобна разработчикам ♦ Место Excel в стратегии Microsoft Краткая история электронных таблиц Многие склонны воспринимать электронные таблицы как нечто само собой разу­ меющееся. На самом же деле, хотя это, возможно, и трудно осознать, были времена, ко­ гда таких таблиц не было. Тогда вместо них люди использовали громоздкие ЭВМ или калькуляторы и тратили часы на работу, которую сейчас выполняют за минуту. Все начиналось с VisiCalc Первый в мире процессор электронных таблиц — программа VisiCalc — был создан Дэном Бриклином и Бобом Фрэнкстоном в 1978 году, когда в офисах еще даже не слы­ шали о персональных компьютерах. VisiCalc была написана для компьютера Apple II — интересного маленького компьютера, игрушки по нынешним меркам. (Правда, в свое время Apple II днями напролет держал меня в состоянии гипноза.) VisiCalc в целом стала основой будущих электронных таблиц, а ее структуру строк и столбцов (а также синтак­ сис формул) до сих пор можно увидеть в современных электронных таблицах. VisiCalc быстро стала востребованной, и многие дальновидные компании приобретали Apple II лишь для того, чтобы создавать свои бюджетные планы с ее помощью. Со временем про­ грамме VisiCalc часто ставили в заслугу то, что именно она обеспечила компьютерам Apple II большую часть их первоначального успеха. Часть I. Введение в Excel 36 Тем временем появился новый вид персональных компьютеров, в которых использо­ валась операционная система СР/М. Компания Sorcim разработала SuperCalc — процес­ сор электронных таблиц, который также привлек многих последователей. И когда в 1981 году на сцене появился компьютер IBM PC, который вывел персо­ нальные компьютеры на массовый рынок, компания VisiCorp не стала медлить с перено­ сом VisiCalc в новую аппаратную среду. Вскоре за ней последовала и Sorcim с версией SuperCalc, специально созданной для ПК. По нынешним стандартам и VisiCalc, и SuperCalc — чрезвычайно незрелые програм­ мы. Например, текст, вводимый в ячейку, не должен был выходить за ее пределы, т.е. длинный заголовок приходилось вводить в несколько ячеек. Но как бы там ни было, воз­ можность автоматизировать бюджетную рутину была по достоинству оценена — бумаж­ ным кассовым книгам тысячи бухгалтеров предпочли гибкие диски. Совет Копию оригинальной программы VisiCalc, созданной Дэном Бриклином, можно загрузить с его веб-сайта (www.bricklin.com). Даже 30 лет спустя после разработки этой программы (размером всего лишь 27 Кбайт) ее мож­ но использовать на современных компьютерах (рис. 1.1). 123473 БУ833 I n come . Expenses, щШ *>3660 Net ЩЩШ? 1 »v-4 ^ ’ V, * " ‘Y (j* f К* .Vv -it-*' - Рис. 1.1. Программа VisiCalc, выполняемая в среде DOS на компьютере под управлением Windows ХР Lotus 1 -2-3 Оценив успех VisiCalc, небольшая группа компьютерных гениев из компании, только что основанной в Кембридже, штат Массачусетс, решила усовершенствовать концепцию электронных таблиц. Под руководством Митча Капора и Джонатана Сакса эта организа­ ция разработала новый продукт и провела первую в компьютерной отрасли законченную маркетинговую подготовку. Я помню, как рассматривал в The Wall Street Journal рекламу Lotus 1-2-3, напечатанную крупным шрифтом. Это был первый на моей памяти случай, когда в прессе появилась реклама программного продукта. Выпущенный в январе 1983 года компанией Lotus Development Corporation, этот про­ дукт имел мгновенный успех. Несмотря на этикетку с ценой 495 долларов (да, люди дей­ ствительно платили столько за программный продукт), что эквивалентно современной тысяче долларов, он по степени популярности быстро обогнал VisiCalc, взлетел на вер­ шину продаж и остался там на многие годы. Глава 1. Excel 2010: история программы 37 Причины успеха Lotus 1 -2-3 Процессор электронных таблиц Lotus 1-2-3 не только превосходил VisiCalc и SuperCalc по всем основным параметрам, но и стал первой программой, использовавшей но­ вые уникальные возможности мощной 16-разрядной архитектуры IBM PC АТ. Напри­ мер, программа Lotus 1-2-3 игнорировала медленные вызовы DOS и передавала данные непосредственно в видеопамять, производя впечатление невероятной производительно­ сти, довольно необычной на то время. Прорывом была также интерактивная справочная система, а хитроумные “движущиеся” панели меню стали стандартом на многие годы. Впрочем, существовала возможность, которая действительно выделяла Lotus 1-2-3 среди остальных процессоров электронных таблиц. Речь идет о средстве создания мак­ росов — поистине мощном инструменте, который позволял пользователям электронных таблиц записывать выполняемые ими операции и таким образом автоматизировать мно­ гие процессы. Когда выполнялся указанный макрос, записанные в нем операции переда­ вались в приложение. И хотя ему далеко до нынешних инструментов записи, в Lotus 1-2-3 был заложен фундамент будущих технологий, интегрируемых во все процессоры электронных таблиц. Lotus 1-2-3 — первый (и к тому же успешный) интегрированный пакет, в котором система производительных электронных таблиц (1) сочеталась с элементарной графи­ кой (2) и ограниченными, но невероятно удобными средствами управления базами дан­ ных (3). Теперь понятно, почему “1-2-3”? Компания Lotus постаралась, чтобы вслед за первым выпуском пакета Lotus 1-2-3 в апреле 1983 года последовал выпуск 1А. Этот новый программный продукт имел ог­ ромный успех и предоставил Lotus завидное положение монополиста на рынке процес­ соров электронных таблиц. В сентябре 1985 года выпуск 1А был заменен выпуском 2, а в июле следующего года — выпуском 2.01 с исправленными ошибками. Выпуск 2, в отли­ чие от предыдущих, поддерживал надстройки (add-ins) — специальные программы, ко­ торые можно интегрировать в приложение, чтобы расширить его возможности. Кроме того, в выпуске 2 содержалась усовершенствованная система управления памятью, пред­ лагалось больше функций, а максимальное количество строк увеличилось в четыре раза по сравнению с предыдущими версиями. В данной версии также поддерживался матема­ тический сопроцессор и содержался усовершенствованный макроязык, популярность ко­ торого превысила самые смелые мечты его разработчиков. Не удивительно, что успех Lotus 1-2-3 способствовал появлению клонов— похожих программных продуктов, в которых обычно предлагалось несколько дополнительных возможностей и которые, как правило, продавались намного дешевле. Среди более или менее заметных стоит упомянуть Twin компании Mosaic Software и серию VP Planner компании Paperback Software. В конце концов, за нарушение авторских прав (копиро­ вание внешнего вида Lotus 1-2-3) компания Lotus возбудила против Paperback Software судебное дело. Исход этого дела, успешный для Lotus, по сути, привел к банкротству Paperback. Летом 1989 года Lotus выпустила DOS- и OS/2-варианты долгожданной версии 3. К электронным таблицам, состоящим из уже ставших привычными строк и столбцов, этот продукт добавил новое измерение. Такое “расширение парадигмы” было достигнуто путем увеличения количества страниц в электронных таблицах. Впрочем, новой данная мысль в действительности не была. Идея трехмерных электронных таблиц впервые при­ менялась в относительно малоизвестном продукте Boeing Calc; ее также реализовали в таких программах, как SuperCalc 5 и CubeCalc. 38 Часть I. Введение в Excel В версии 3 пакета Lotus 1-2-3 содержались многие полезные пользовательские инст­ рументы, которые в конце концов стали стандартными. Речь идет о многоуровневых электронных таблицах, одновременной работе с большим количеством файлов, их свя­ зывании, усовершенствованной графике и прямом доступе к внешним файлам баз дан­ ных. Однако в этой версии отсутствовала важная возможность, о которой мечтали мно­ гие пользователи: не был реализован высококачественный вывод информации. Версия 3 начала свой путь с малого рыночного потенциала, поскольку требовала для нормальной работы компьютер на базе процессора 80286 с минимальным объемом опе­ ративной памяти 1 Мбайт — требования довольно “жесткие” для 1989 года. И тут Lotus вытащила туз, припрятанный в ее корпоративном рукаве. Одновременно с объявлением о появлении версии 3 компания удивила буквально всех, заявив об усовершенствовании версии 2.01 (усовершенствованный продукт материализовался через несколько месяцев в виде Lotus 1-2-3 версии 2.2). Вопреки ожиданию большинства аналитиков версия 3 не за­ менила версию 2. Вместо этого компания Lotus сделала блестящий ход, разбив рынок про­ цессоров электронных таблиц на два сегмента: тот, который работает на высокопроизводи­ тельном оборудовании, и тот, для которого по карману более скромный компьютер. Слишком мало, слишком поздно... Конечно, для фанатов электронных таблиц версия 2.2 продукта Lotus 1-2-3 панацеей не стала, но все-таки она значительно расширила возможности пользователей. Самой важной возможностью этой версии была надстройка Allways, которая позволяла “творить” привле­ кательные отчеты, выполненные с использованием разнообразных шрифтов, обрамлений и заливок. Кроме того, просмотр полученных результатов на экране выполнялся в режиме WYSIWYG (What You See Is What You Get — что видишь, то и получаешь). Впрочем, ко­ гда пользователи просматривали и редактировали свою работу в этом режиме, они не могли управлять данными электронных таблиц. Но, несмотря на такое суровое ограни­ чение, большинство пользователей Lotus 1-2-3 было вне себя от радости, потому что, имея в арсенале такую новую возможность, они наконец-то смогли создавать документы почти типографского качества. В мае 1990 года компания Microsoft выпустила Windows 3.0. Как вы, возможно, знаете, эта система привела к изменению принципов использования персонального компьютера. Видимо, специалисты, принимавшие в Lotus решения, не считали Windows серьезным про­ дуктом, и компания не спешила презентовать свою первую программу, работающую с электронными таблицами в Windows. Такая программа— Lotus 1-2-3 для Windows — была выпущена только в конце 1991 года. Хуже того, этот продукт, если судить объектив­ но, оказался неудачным. Он не смог использовать преимущества среды Windows и разо­ чаровал многих пользователей. Эта программа также разочаровала по крайне мере одного автора компьютерных книг. Моя первая книга называлась PC World 1-2-3 For Windows Complete Handbook, причем продать удалось менее тысячи экземпляров. В результате программа Excel, которая уже заявила о себе как о “главном” в Windows процессоре электронных таблиц, стала единоличным лидером на рынке подобных Windows-программ (и с тех пор никогда не сдавала этой позиции). Что касается Lotus, то в июне 1993 года вышла очередная ее версия: Lotus 1-2-3 версии 4 для Windows. Она бы­ ла значительно лучше своего оригинала. Версия 5 этой программы для Windows появи­ лась в середине 1994 года. В то же время Lotus выпустила версию 4.0 этого продукта для DOS (Lotus 1-2-3 Release 4.0 for DOS). Многие аналитики (и я в том числе) ожидали появления продукта, Глава 1. Excel 2010: история программы 39 более совместимого с Windows. Однако мы ошиблись; эта версия стала лишь более усо­ вершенствованной по сравнению с версией 3.4. Поскольку операционная система Windows получила невероятное распространение, это оказалась последняя версия Lotus 1-2-3 для DOS, которая увидела свет. Со временем электронные таблицы стали для Lotus менее важными (ее ведущим про­ дуктом стал Notes). В середине 1995 года компания IBM приобрела Lotus Development Corporation. Появились еще две версии Lotus 1-2-3, но это, как говорится, был тот слу­ чай, когда “и слишком мало, и слишком поздно”. Excel явно доминирует на рынке про­ цессоров электронных таблиц, a Lotus 1-2-3 продолжает терять свои позиции. Quattro Pro Еще одним заслуживающим внимания игроком в сфере электронных таблиц является (или, лучше сказать, являлась) компания Borland International. В 1994 году компания Novell купила у WordPerfect International и у Borland весь их бизнес, связанный с процес­ сорами электронных таблиц. А в 1996 году и WordPerfect, и Quattro Pro были выкуплены компанией Corel Corporation. На ниве электронных таблиц компания Borland начала ра­ ботать в 1987 году, выпустив продукт, называемый Quattro. Внутри компании код этой программы назывался Buddha, поскольку эта программа позиционировалась как достой­ ный конкурент Lotus (лидера рынка). Это, по сути, был клон Lotus 1-2-3, который имел несколько дополнительных средств и, возможно, более хорошую систему меню. Кроме того, указанный продукт был значительно дешевле. Важно еще и то, что пользователи могли выбрать систему меню, похожую на применяемую в Lotus 1-2-3, и, таким образом, использовать знакомые команды, а также обеспечивать совместимость с макросами Lotus 1-2-3. Осенью 1989 года компания Borland начала продавать Quattro Pro— более мощный продукт, созданный на базе, отличной от исходной Quattro, и превосходивший Lotus 1-2-3 буквально во всех аспектах. Например, первая версия Quattro Pro позволяла работать с большим количеством рабочих листов, находящихся в окнах, которые можно было пере­ мещать и размеры которых можно было менять. Даже при том, что у программы не было графического пользовательского интерфейса. Еще одна деталь: Quattro Pro создавалась на основе малоизвестного продукта Surpass, приобретенного Borland. В конце 1990 года была выпущена версия 2.0 программы Quattro Pro (Quattro Pro Version 2.0), которая уже имела поддержку трехмерной графики и обеспечивала связь с базами данных Paradox от Borland. Всего лишь полгода спустя — к большому огорче­ нию конкурентов — появилась версия Quattro Pro 3.0, в которой по желанию можно бы­ ло настраивать графический пользовательский интерфейс и допускался просмотр данных в режиме слайд-шоу. Весной 1992 года появилась версия 4, в которой предлагались на­ страиваемые “быстрые” панели, а также новая возможность — применение аналитиче­ ской графики. Что касается версии 5, вышедшей в 1994 году, она характеризовалась единственным новшеством, которое можно назвать серьезным, — наличием блокнотов рабочих листов (т.е. трехмерных рабочих листов). Как и Lotus, компания Borland не спешила переходить на сторону Windows. Впрочем, когда осенью 1992 года Quattro Pro для Windows поступила в продажу, она составила до­ вольно серьезную конкуренцию двум другим Windows-программам, работавшим с элек­ тронными таблицами: Excel 4.0 и Lotus 1-2-3 версии 1.1 для Windows. Важно то, что в Quattro Pro для Windows предлагалась новая возможность, известная как UI Builder 40 Часть I. Введение в Excel (построитель пользовательского интерфейса). Она позволяла разработчикам и опытным пользователям легко создавать индивидуальные варианты пользовательского интерфейса. Кроме того, ни к чему не привела судебная тяжба между Lotus и Borland. Вначале Lotus ее выиграла, заставив Borland удалить из Quattro Pro поддержку макросов Lotus 1-2-3 и возможность создания таких же меню, как и в Lotus 1-2-3. Однако со временем, в конце 1994 года, это решение было пересмотрено, и теперь в Quattro Pro в полной мере поддер­ живаются средства, обеспечивающие совместимость с Lotus 1-2-3 (как будто они действи­ тельно кому-то нужны). На эту долгую борьбу обе стороны потратили миллионы долларов, а когда пыль улеглась, то настоящего победителя так и не оказалось. Позднее Borland выпустила оригинальную версию 5 программы Quattro Pro для Windows. После того как компания Novell получила от Borland все, что касалось процес­ соров электронных таблиц, версия 5 была модернизирована до версии 6. В 1996 компания Corel Corporation приобрела продукты WordPerfect и Quattro Pro. На момент написания этой книги выпущена версия Quattro Pro 14, которая входит в состав пакета WordPerfect Office Х4. Для разработчиков электронных таблиц пакет Quattro Pro долгое время был пределом совершенства, но затем появилась программа Excel 5. Microsoft Excel А теперь пришло время поближе познакомиться с героем нашего романа. Многие читатели не знают, что по части электронных таблиц кампания Microsoft ста­ ла приобретать опыт еще в начале 1980-х годов. И за эти годы соответствующие про­ граммы Microsoft прошли долгий путь развития: все началось с MultiPlan, отвечавшей лишь минимальным требованиям, и закончилось Excel 2010, представляющей последние разработки в этой области. Сначала MultiPlan В 1982 году Microsoft выпустила программу MultiPlan— свой первый продукт для работы с электронными таблицами. Предназначенная для компьютеров, которые рабо­ тают под управлением операционной системы СР/М, программа вскоре была перенесена на другие платформы, в том числе на Apple И, Apple III, XENIX и MS-DOS. MultiPlan преимущественно игнорировала стандарты пользовательского интерфейса для программ. Сложная для изучения и применения, эта программа так никогда и не приобрела в США особой популярности. И не удивительно, что ее достаточно быстро обогнала Lotus 1-2-3. Пришествие Excel От MultiPlan берет свое начало программа Excel, впервые зарекомендовавшая себя на платформе Macintosh в 1985 году. Как и все Mac-приложения, Excel являлась гра­ фической программой (в отличие от текстовой MultiPlan). В ноябре 1987 года компа­ ния Microsoft выпустила первую версию Excel, предназначенную для Windows (она была названа Excel 2.0 для Windows, чтобы сохранить преемственность с номером версии, выпущенной для Macintosh). Поскольку тогда операционная система Windows не имела широкого распространения, то в состав Excel 2.0 вошла исполняемая версия Windows, предназначенная исключительно для обеспечения работы Excel. Менее чем че­ рез год Microsoft выпустила новую версию Excel — 2.1 (Excel Version 2.1). В июле 1990 го­ да компания предложила небольшое обновление (2.lb), совместимое с Windows 3.0. Глава 1. Excel 2010: история программы 41 И хотя версии 2.x были по современным меркам довольно ограниченными (рис. 1.2) и не имели эффектного внешнего вида последних версий, они все равно привлекли пусть и небольшую, но верную группу поддержки и заложили прекрасный фундамент для будущих разработок. Microsoft Excel RST0 60.XLS Microsoft Excel Chart! Hour H an d Now Л Chart3 Hour 1)01 A n g le Нм 3 .Length llfctl Is h o r t ЯАЖВ Рис. 1.2. Оригинальная программа Excel 2.1 для Windows (фотография предоставлена компанией Microsoft) Программа Excel имела встроенный макроязык (XLM), который состоял из функций, обрабатываемых одна за другой. Этот макроязык был достаточно мощным, но сложным для изучения и применения. Как вы увидите, на смену XML пришел VBA, которому и по­ священа настоящая книга. Но в то же время даже Excel 2010 под держивает макросы XLM. Кроме того, компания Microsoft разработала версию Excel (под номером 2.20) для OS/2 Presentation Manager. Она была выпущена в сентябре 1989 года, и примерно десять месяцев спустя появилось ее обновление (версия 2.21). Впрочем, несмотря на усилия со стороны IBM, операционная система OS/2 никогда не пользовалась особой популярностью. В декабре 1990 года Microsoft выпустила Excel 3 для Windows со значительными усо­ вершенствованиями как внешнего вида, так и возможностей (рис. 1.3). Среди новинок были панель инструментов, средства рисования, мощный инструмент поиска решения, поддержка надстроек и технологии OLE (Object Linking and Embedding— связывание и внедрение объектов), трехмерные диаграммы, кнопки для макросов, упрощенная кон­ солидация файлов, редактирование в составе рабочих групп и перенос по словам текста внутри ячейки. Кроме того, в Excel 3 существовала возможность работать с внешними базами данных (с помощью программы Q+E). Пять месяцев спустя появилось обновле­ ние Excel для OS/2. Часть I. Введение в Excel 42 M icrosoft Excel REVENUE.XL3 Options Macro Is&indow idelp F orm al Qata ■ ЕП« £ d it Formula FT Г ~ Г ~ Г Г Г Г 1Normal w a r n г г г - В П r 1 F36 | | Рю Forma Income Statement Five-year Projection г Revenues • а0 North America • в1 Europe . • (1 France Germany Other European United Kingdom Australia Japan Korea Taiwan Fat East ' ‘" 1 1 1992 1993 1994 1995 184,845 49,292 1.232,300 203,330 49,785 1.355.530 223,663 50,283 1,219,977 246,029 50,786 1,341,975 270,632 51,294 1,476,173 M ■ 1,468,437 1,808,645 1.493.923 1,638,790 1.798.099 (Ц 184,845 308.075 61.615 61.615 194.087 369,690 92,423 67,777 203,791 373.387 184.846 74,555 213.981 410.726 258.784 82.011 224.680 414,833 382,298 90,212 l i ■ ■ [fj 616,150 723,977 53,231 P7Qoco О ( 4j,OD4L 65,990 1 82,488 6 rest increase I 965,502 from 1991 1 64.409 1,092,023 48,392 XOQQOII 43.993 65,990 (m thousands) Canada Mexico United States m m am m —| 1991 103.110 |>287.641 ■N8.478 12Щ 8 598.306 1.081.571 2,020,373 2.629.41ь 2.680.893 3.414.193 4.350,875 5.233.708 1,34(^.447 1.474.492 1,621,941 1.7.84,135 70,850 2,973,933 222.717 161,110 — Total Revenue Cost of Goods Sold fJ Щ ■ ■ 1 6,318.732 • 1.962.549 |§ \m Рис. 1.3. Программа Excel 3 была существенно улучшена по сравнению со своей предше­ ственницей (фотография предоставлена компанией Microsoft) Версию 4, выпущенную весной 1992 года, было не только легче использовать. Она явля­ лась более мощной и содержала большее количество инструментов, предназначенных для опытных пользователей (рис. 1.4). Буквально в каждом обзоре компьютерных журналов, где сравнивались процессоры электронных таблиц, Excel 4 оказывалась на самом почетном месте. Тем временем отношения между Microsoft и IBM изменились к худшему; Excel 4 для операционной системы OS/2 так никогда и не была выпущена, a Microsoft прекратила вы­ пуск версий Excel, предназначенных для этой системы. Рождение VBA Версия Excel 5 предстала перед публикой в начале 1994 года и сразу же получила восторженные отзывы. Как и ее предшественница, она занимала верхнюю строчку во всех рейтингах процессоров электронных таблиц, публиковавшихся ведущими коммер­ ческими журналами. Несмотря на жесткую конкуренцию с Lotus 1-2-3 выпуска 5 для Windows и Quattro Pro для Windows — а ведь и тот, и другой продукты могли решить бу­ квально любую задачу, которую подбрасывали им электронные таблицы, — Excel 5 все равно продолжала задавать тон. Кстати, эта версия была первой, в которой использовал­ ся язык VBA. Версия Excel 95 (известная также как Excel 7) была выпущена одновременно с Microsoft Windows 95. Microsoft специально пропустила шестой номер, чтобы продукты, входящие в ее пакет Office, имели одинаковые номера версий. На первый взгляд, Excel 95 незначи­ тельно отличается от Excel 5. Однако существенная часть кода ее ядра была переписана, а во многих местах наблюдалось заметное увеличение быстродействия. Важно и то, что Глава 1. Excel 2010: история программы 43 в Excel 95 использовался тот же формат файлов, что и в Excel 5. Это был первый случай, когда усовершенствованной версии Excel не предоставили новый формат файла. Впро­ чем, совместимость не стала до конца полной, поскольку в языке VBA появились неко­ торые усовершенствования. Следовательно, с помощью Excel 95 можно было разрабаты­ вать приложения, которые загружались в Excel 5 (хотя и не работали так, как положено). Ц File Edit Microsoft Excel - 60SEC.XLS Format Data Options Macro Window Formula Help Noimal Exotic Excursions ■ Exotic Excursions 1992 Q1 Q2 Q3 Q4 Golf 1,000 1,100 1,200 1,300 Safari 2,000 2,200 2,400 2,600 Tennis 3,000 3,300 3,600 3,900 AutoFormat Table Format: Classic 1 Classic 2 Classic 3 Financial 1 Financial 2 Financial 3 Colorful 1 индии Colorful 3 Jan Feb East West South Total 7 6 S 18 7 4 7 18 Mar Total 5! 8 9 22- O p tio n s » | List 1 2 Рис. 1.4. Версия Excel 4 являлась еще одним шагом вперед, хотя до Excel 5 ей было далеко (фотография предоставлена компанией Microsoft) В начале 1997 года Microsoft выпустила интегрированный пакет программ Office 97, в состав которого входила Excel 97 (Excel 97 еще называется Excel 8). Эта версия харак­ теризовалась многими общими изменениями, а также абсолютно новым интерфейсом для разработки приложений на основе VBA. Был также предложен совершенно новый способ разработки пользовательских диалоговых окон (которые теперь назывались не диалоговыми листами, а пользовательскими формами). Microsoft попыталась сделать Excel 97 совместимой с предыдущими версиями, но эта совместимость оказалась дале­ кой от совершенства. Чтобы многие приложения, разработанные с помощью Excel 5 или Excel 95, могли работать в Excel 97 или более поздних версиях, приходилось прибегать к определенным уловкам. © Перекрестная ссылка Вопросы совместимости будут рассмотрены в главе 26. Программа Excel 2000 была выпущена в начале 1999 года; она продавалась как часть интегрированного офисного пакета Office 2000. Усовершенствования, которые пред­ 44 Часть I. Введение в Excel ставлены в Excel 2000, относятся в основном к работе в Интернете, хотя некоторые зна­ чительные изменения заметны и в области программирования. Excel 2002 (известная также под названием Excel ХР) появилась на рынке в середине 2001 года. Как и ее предшественница, новыми возможностями, которые можно назвать серьезными, эта программа не располагала. Впрочем, появились некоторые новшества и были внесены незначительные корректировки в уже имеющиеся возможности. Вероят­ но, самая существенная из них — это способность восстанавливать поврежденные файлы и сохранять работу пользователя при аварийном завершении Excel. Excel 2003 (выпущенная осенью 2003 года) стала одним из самых разочаровывающих обновлений в линейке Excel. В ней оказалось очень мало новинок. Компания Microsoft усиленно рекламировала возможность импорта и экспорта файлов XML (extensible Markup Language— расширяемый язык разметки) и привязки данных к конкретным ячейкам листа, но, по правде говоря, все это требовалось очень небольшому числу поль­ зователей. Кроме того, Microsoft немного расширила возможности управления правами доступа к различным элементам рабочей книги (позволив, например, задавать пользова­ телей, которым разрешен просмотр конкретных листов). В Excel 2003 появилась также новая справочная система (содержимое справки выводилось теперь на панель задач), ко­ торую дополнило новое средство поиска на панели задач. Примечание По определенным причинам компания Microsoft решила продавать две подверсии Excel 2003. Поддержка XML и прав доступа реализована в отдельно продаваемой версии Excel, а также в версии Excel, входящей в состав пакета Office 2003 Professional. В результате разработчики Excel вынуждены были решать проблемы совместимости в пределах одной версии. Новый пользовательский интерфейс В конце 2006 года появилась программа Excel 2007 (версия 12), которая входила в пакет Microsoft Office 2007. В этой версии процессора электронных таблиц пользова­ тельский интерфейс претерпел радикальные изменения. На смену прежним меню и пане­ лям инструментов пришел пользовательский интерфейс в виде ленты. Размер сетки, со­ стоящей из ячеек, в Excel 2007 в тысячу раз больше, чем размер сетки в предыдущих версиях, а для рабочих файлов предложен новый формат Open XML. Другие изменения коснулись таблиц и условного форматирования, многочисленным косметическим улуч­ шениям подверглись диаграммы и темы документов. Реакция пользователей на появление нового интерфейса была весьма противоречивой. Одни горячо его полюбили, другие же, наоборот, возненавидели. Некоторые компании даже разработали специальные надстройки, с помощью которых пользователи Excel 2007 могут вернуться к привычным старым меню. Конечно, для начинающих программа Excel 2007 проще, но опытные пользователи потратят массу времени на поиск своих любимых команд. Программа Excel 2010, рассматриваемая в этой книге, является частью пакета Microsoft Office 2010. И что интересно, разработчики из Microsoft перестраховались. По­ рядковый номер версии новой программы должен был стать 13, но сработал эффект страха перед числом 13, и версия новой программы Excel получила номер 14. В Excel 2010 существенно расширились возможности сводных таблиц, условного форматирования и коррекции изображений. Появились компактные диаграммы, зани­ мающие одну-две ячейки, которые получили название спарклайны. В процессе вставки данных теперь можно предварительно увидеть, что из всего этого получится. Новое Глава 1. Excel 2010: история программы 45 представление Backstage включает ряд команд, рассчитанных на работу с документами, например сохранение и печать. Также пользователи Excel получили возможность на­ страивать ленту. И наконец, в распоряжении пользователей оказались десятки новых функций рабочего листа, большинство из которых относятся к категории высокоспециа­ лизированных, пришедших на смену прежним функциям, при использовании которых возникали определенные проблемы с точностью вычислений. Современный рынок электронных таблиц Итак, более чем 30-летняя история разработки электронных таблиц уместилась всего лишь на нескольких страницах. Это был достаточно интересный обзор, и мне приятно, что я был свидетелем всех этих процессов. Времена меняются. Сегодня Microsoft не просто доминирует на рынке электронных таблиц, она полностью его контролирует. Небольшая конкуренция имеет место в нише программ “с открытым исходным кодом”, например OpenOffice и StarOffice. Наверное, вы слышали о многообещающих электронных таблицах в Интернете, таких как Google Spreadsheets (рис. 1.5). В ответ на это Microsoft предложила пользователям собственную веб-версию Excel и других приложений Office 2010. 4* с .Л Google Документы ПраЗДНИЧНЫвДнИ Файл Вставить Формат 123» 10pt ▼ В © ГЧ Изменить nt ► D-. А - hltp:/ 'spreadsheets.googJe.corn('ctc?key=tD?dSTCLaSZMv-Gq2Hnv ☆ Почта Календарь Документы Веб Reader еше ▼ Просмотр А р. % Формула: -(Четверг Старая версия | [email protected] | Настройки ▼ | Выйти ЙЛичное для владельца Форма А* Инструменты А , Сохранено тольк< Сохранено ^Добавить в общие ; » Справка 03» ш* ........................... . 2010 <-Введите год Праздничные дни Праздничный день Новый год Восьмое марта Первое мая День Победы День конституции День независимости Описание Первый день января Международный женский день Международный день солидарности трудящихся День победы в ВОВ День принятия конституции Украины День независимости Украины Дата День недели 01 01 2010 Пятница 08 03 2010 Понедельник 01 05 2010 Суббота 09 05 2010 Воскресенье 28.06 2010 Понедельник 26 08 2010 (Четверг —1 Лист1 S Лист2 ЛистЗ Лист4 РЯРР1 Четверг Рис. 1.5. Веб-версия электронной таблицы от Google На самом деле подобные конкуренты не представляют серьезной угрозы для Microsoft. Фактически самый серьезный конкурент для компании Microsoft — она сама. Пользователи предпочитают работать с определенной версией Excel и очень редко пере­ ходят на новую версию. Заставить их перейти на совершенно новую версию Excel — наибольший вызов для компании Microsoft. Часть I. Введение в Excel 46 Почему программа Excel так удобна разработчикам Программа Excel обладает исключительной гибкостью с точки зрения программиро­ вания и является наилучшим выбором для разработки приложений электронных таблиц. Ниже перечислены ключевые свойства Excel с точки зрения разработчика. • Файловая структура. Благодаря “многолистовой” структуре облегчается органи­ зация элементов приложения и их хранение в отдельном файле. Например, в со­ став единственного файла рабочей книги может входить произвольное число ра­ бочих листов и листов диаграмм. Здесь же хранятся пользовательские формы и модули VBA, которые невидимы для конечного пользователя. • Visual Basic for Applications. С помощью этого макроязыка можно создавать структу­ рированные программы непосредственно в Excel. Именно использованию этого языка, представляющего собой сочетание мощи и простоты, посвящена данная книга. • Упрощенный доступ к элементам управления. В Excel до предела упрощено добавление новых элементов управления на рабочий лист, таких как кнопки, спи­ ски и кнопки выбора. При этом создавать макросы зачастую вообще не требуется. • Пользовательские диалоговые окна. Используя такое средство, как окна U s e rForms, можно легко создавать профессиональные диалоговые окна. • Пользовательские функции рабочего листа. С помощью VBA можно создавать пользовательские функции рабочего листа, упрощающие формулы и вычисления. • Настраиваемый пользовательский интерфейс. Разработчики получили воз­ можность контролировать пользовательский интерфейс. В предыдущих версиях они могли создавать пользовательские меню и панели инструментов. Начиная с версии Excel 2007 можно изменять ленту. Изменить внешний вид ленточного интерфейса не столь просто, как в предыдущих версиях, но вполне возможно. • Настраиваемые контекстные меню. С помощью VBA можно настроить контек­ стные меню, вызываемые щелчком правой кнопки мыши. • Мощные команды, применяемые для анализа данных. Благодаря сводным таблицам Excel облегчается суммирование больших объемов данных, не требуя особых усилий со стороны пользователя. • Microsoft Query. Получить доступ к важным данным можно непосредственно из программы электронных таблиц. В качестве источников данных применяются стандартные форматы файлов баз данных, тестовые файлы, а также веб-страницы. • Расширенный набор параметров защиты. Ваши приложения могут быть кон­ фиденциальными, а также защищаться от изменений со стороны случайных поль­ зователей. • Возможность создания подключаемых модулей. Выполнив одну-единственную команду, можно создать файлы подключаемых модулей, которые добавляют но­ вые возможности в Excel. • Поддержка автоматизации. С помощью VBA можно контролировать другие приложения, которые поддерживают автоматизацию. Например, VBA-макрос мо­ жет генерировать отчет в Microsoft Word. Глава 1. Excel 2010: история программы 47 • Возможность создания веб-страниц. HTML-документ можно создать на основе рабочей книги Excel. Конечно, HTML-код станет чрезмерно “раздутым”, но зато будет восприниматься веб-браузерами. Место Excel в стратегии Microsoft В настоящее время большинство копий Excel продаются в составе Microsoft Office — прикладного пакета, включающего множество других программ (состав пакета зависит от версии Office). Это удобно, поскольку облегчает взаимодействие программ, и именно эту тенденцию поощряет компания Microsoft. Все приложения Office имеют похожий интерфейс пользователя, и все они поддерживают VBA. Таким образом, приобретя навыки программирования на VBA в Excel, вы сможете применить их и в других приложениях — понадобится лишь изучить объектную модель для этих приложений. А Глава ■ 2 1 Основные элементы Excel Вэтой главе... ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ Объектное мышление Рабочие книги Пользовательский интерфейс Excel Настройка окна программы Ввод данных Формулы, функции и имена Выделение объектов Форматирование Параметры защиты Диаграммы Фигуры и рисунки SmartArt Доступ к базам данных Excel и Интернет Инструменты анализа Надстройки Макросы и программирование Файловые форматы Справочная система Excel Эта глава посвящена рассмотрению основных понятий, связанных с Excel. Здесь же рассматриваются новые возможности, которые появились в Excel 2010. 50 Часть I. Введение в Excel Объектное мышление Планируя разработку приложений с помощью Excel (особенно с помощью VBA), следует проанализировать концепцию объектов — элементов Excel, которыми можно манипулиро­ вать напрямую или с помощью макросов. Ниже приведены примеры объектов в Excel: • само приложение Excel; • рабочая книга Excel; • лист в рабочей книге; • диапазон или таблица в рабочем листе; • элемент управления L i s t Box (список) в пользовательской форме (пользователь­ ское диалоговое окно); • диаграмма на листе диаграммы; • ряд данных на диаграмме; • отдельная точка данных на диаграмме. Обратите внимание, что в приведенном списке соблюдается иерархия объектов: объект Excel содержит объекты рабочих книг, в которых находятся объекты рабочих листов, а те, в свою очередь, включают объекты диапазонов ячеек. Подобная иерархия составляет объектную модель Excel. В Excel насчитывается около двухсот классов объектов, и этими объектами можно управлять непосредственно или с помощью VBA. Собствен­ ные объектные модели имеют и другие программные продукты Microsoft Office. Примечание При разработке приложений один из наиболее важных моментов — кон­ троль над объектами. На протяжении книги рассматриваются способы ав­ томатизации контроля над объектами Excel, в том числе с помощью VBA. Все это подробнее рассматривается в следующих главах. Рабочие книги Среди объектов Excel самым распространенным является рабочая книга. Все, что вы делаете в Excel, происходит в рабочей книге, которая хранится в файле, имеющем по умол­ чанию расширение XLSX. В рабочей книге Excel может содержаться любое количество листов (предел зависит от объема оперативной памяти). Все они делятся на четыре вида: • рабочие листы; • листы диаграмм; • листы макросов XLM (устаревшие, но досих пор поддерживаемые); • диалоговые листы (также устаревшие,но до сих пор поддерживаемые). Можно открыть любое количество рабочих книг (каждую в своем окне), но в любой момент только одна из них может быть активной. Аналогично, активным листом может быть только один из листов рабочей книги. Чтобы активизировать лист, щелкните на его ярлыке, расположенном в нижней части экрана. Для изменения имени листа дважды щелкните на ярлыке и введите новое название. Если на ярлыке щелкнуть правой кнопкой мыши, то появится контекстное меню, команды которого позволяют изменить цвет яр­ лыка, скрыть лист и т.д. Глава 2. Основные элементы Excel 51 Для сокрытия окна рабочей книги воспользуйтесь командой Вид^Окно1^ Скрыть (View^ Window^ Hide). Скрытая рабочая книга остается открытой, но невидимой для пользователя. Для отображения скрытой рабочей книги воспользуйтесь командой Вид^Окно^Отобразить окно (View^Window^Unhide). Одна и та же рабочая книга может отображаться в различных окнах (для этого выберите команду Вид^Окно1^ Новое окно (View1^ W indow^New Window)). В окнах могут отображаться разные рабо­ чие листы либо различные области одного и того же листа. ОКНО Рабочие листы Самыми распространенными объектами являются рабочие листы. Говоря об элек­ тронной таблице, пользователи обычно подразумевают рабочий лист. Он состоит из яче­ ек, которые содержат данные и формулы. Каждый рабочий лист в Excel 2010 состоит из 16 384 столбцов и 1 048 576 строк. Можно временно скрыть ненужные строки и столбцы, но вам не удастся превысить пре­ дел, ограничивающий максимальное число строк и столбцов. Примечание В версиях, предшествующих Excel 2007, использовался двоичный файловый формат XLS, и рабочие листы содержали до 65 536 строк и 256 столбцов. При открытии подобного файла Excel 2010 переходит в режим совместимо­ сти, в котором выбирается меньший размер сетки рабочего листа. Для пре­ образования подобного файла в новый формат сохраните его в виде XLSXили XLSM-файла. Затем закройте рабочую книгу и повторно откройте ее. Насколько велик ваш рабочий лист Иногда полезно оценить физические размеры рабочего листа. Умножив количе­ ство столбцов на количество строк (16384x1048576), получим величину, равную 17 179 869 184 ячейкам. Причем это количество относится только к одному рабочему листу. А в рабочей книге содержится несколько рабочих листов. Если выбрано разрешение экрана 1600x1200 пикселей, а высота строк и ширина столбцов оставлены заданными по умолчанию, на экране одновременно смогут ото­ бражаться 24 столбца и 49 строк (либо 1176 ячеек) — примерно 0,000068% от общего числа ячеек рабочего листа. Другими словами, информация, находящаяся на одном рабочем листе, займет более 14,6 млн. экранов. Если в каждую ячейку рабочего листа введена одна цифра и пользователь просмат­ ривает клип со скоростью одна ячейка в секунду, у него уйдет более 500 лет на про­ смотр всех ячеек рабочего листа. Для вывода на печать всех просмотренных ячеек по­ надобится более 36 млн. листов бумаги, которые образуют стопку высотой около 4 км. Нетрудно предположить, что заполнить всю книгу значениями просто невозможно. Нереально даже приблизиться к этому. Даже если вы используете 64-разрядную вер­ сию Excel, размер свободной памяти исчерпается моментально, a Excel завершит свое выполнение отображением сообщения об ошибке. Предоставляемая возможность применения в рабочей книге большого количества ра­ бочих листов ценна даже не тем, что вы получаете доступ к большему числу ячеек. Пре­ имущество заключается в другом — большое количество рабочих листов позволяет лучше организовать документ. Ранее, когда файл содержал только один рабочий лист, разработчики теряли немало времени, пытаясь организовать рабочий лист так, чтобы 52 Часть I. Введение в Excel информация в нем хранилась наиболее рационально. Теперь можно хранить ее в любом количестве рабочих листов и все равно иметь к ней мгновенный доступ (для этого по­ требуется щелкнуть на ярлыке нужного листа). Примечание Создаваемые рабочие книги по умолчанию состоят из трех рабочих листов. На практике чаще всего требуется один рабочий лист, остальные же легко добавляются в случае необходимости. Для изменения количества рабочих листов, заданного по умолчанию, выполните команду Файл^Параметры Excel (File^Excel Options), выберите вкладку Общие (General) и задайте со­ ответствующее значение в списке Число листов (Include This Many Sheets). В ячейке рабочего листа находится постоянное значение или результат выполнения фор­ мулы. В качестве значения может использоваться число, дата, булево значение (“истина” или “ложь”) или текст. Кроме того, каждый рабочий лист имеет скрытый графический слой, который позволяет вставлять графические объекты (такие, например, как диаграммы, фигуры, рисунки SmartArt, элементы управления пользовательских форм, рисунки и встроенные объекты). Можно полностью контролировать ширину столбцов и высоту строк— есть даже возможность скрывать строки и столбцы (так же, как и целые рабочие листы). Текст внутри ячейки может отображаться вертикально (или под углом) и даже переноситься по словам, занимая в пределах ячейки более одной строки. Примечание Ранее палитра цветов в Excel имела размер 56 ячеек. Начиная с Excel 2007 количество цветов практически не ограничено. Кроме того, в Excel 2007 поя­ вились темы документов. Полностью изменить внешний вид документа, применив к нему тему, можно единственным щелчком мыши. Листы диаграмм Лист диаграммы обычно содержит одну диаграмму. Эти листы игнорируются многи­ ми пользователями, которые предпочитают сохранять диаграммы на графическом слое рабочего листа. Использовать листы диаграмм необязательно, но они облегчают печать, если на странице печатается только диаграмма. Кроме того, листы диаграмм можно эф­ фективно использовать при создании презентаций. На рис. 2.1 показан лист диаграммы, на котором находится круговая диаграмма. Листы макросов XLM Лист макросов XLM (который еще называется листом макросов MS Excel 4), в сущности, является тем же рабочим листом, но со своими стандартными настройками. В частности, на листе макросов XLM отображаются сами формулы, а не результаты их вычисления. Кроме того, стандартная ширина его столбцов больше ширины обычного рабочего листа. Как можно понять из названия, лист макросов XLM предназначен для хранения мак­ росов XLM. Система макросов XLM является “пережитком”, доставшимся нам от пре­ дыдущих версий Excel (4.0 и более ранних). Впрочем, разработчики Excel 2010 из сооб­ ражений совместимости предусмотрели поддержку макросов XLM, однако сохранить их не удастся. В этой книге система макросов XLM не рассматривается. Основное внимание уделено более мощной системе макросов VBA. Глава 2. Основные элементы Excel 53 Рис. 2.1. На листе диаграммы находится круговая диаграмма Диалоговые листы Excel 5 /9 5 В Excel 5 и Excel 95 пользовательское диалоговое окно создавалось путем вставки специального диалогового листа. Несмотря на то что Excel 97 и более поздние версии также поддерживают применение этих листов, существует более удачная альтернати­ ва— пользовательские формы (UserForm). В редакторе Visual Basic управление осуще­ ствляется именно пользовательскими формами. Когда вы открываете рабочую книгу с диалоговым листом, созданным в Excel 5/95, то этот лист выглядит, как лист рабочей книги. Учтите, что в данной книге вы не найдете информации о диалоговых листах Excel 5/95. Что нового в Excel 2010 Ниже приводится краткий обзор новых возможностей Excel 2010. • 64-разрядная версия. Если ваш компьютер и версия Windows являются 64-разрядными, установите 64-разрядную версию Excel, которая позволяет создавать огром­ ные рабочие книги. В этом случае могут возникать проблемы из-за несовместимо­ сти некоторых макросов и надстроек. Например, макросы, которые реализуют вы­ зовы 32-разрядной библиотеки Windows API, могут не работать в 64-разрядной среде Excel 2010. Но в большинстве случаев можно изменить код таким образом, чтобы вызовы API-функций могли корректно выполняться в обеих версиях Excel. • Спарклайны. Внедряемые в отдельные ячейки графики, обеспечивающие графи­ ческое представление выделенных диапазонов данных. • Срезы. С помощью срезов обеспечивается новый способ фильтрации и отображе­ ния данных в сводных таблицах. • Новые возможности форматирования сводных таблиц. Пользователи Excel 2010 получили большую степень контроля над внешним видом отчетов сводных таблиц. 54 Часть I. Введение в Excel • Мутация кнопки Office. Вместо большой круглой кнопки Office, использующейся в Excel 2007, появилась кнопка Файл (File), которая отображается слева от вкладок. После щелчка на ней отображается окно представления Office Backstage, в котором можно выполнять различные операции с рабочими книгами. Представление Back­ stage сменило традиционные меню Файл (File) и Печать (Print), но при этом облада­ ет большими возможностями. • Усовершенствованное условное форматирование. Цветовые шкалы условного форматирования теперь могут заливаться сплошным цветом, а само условное форматирование стало более точным и поддерживает отрицательные значения. • Усовершенствованные функции. Улучшена точность ряда финансовых и стати­ стических функций рабочего листа Excel. Эти функции получили новые имена, хотя в целях обеспечения совместимости остались старые версии функций. • Новые возможности коррекции изображений. У пользователей Excel 2010 поя­ вились новые функции коррекции изображений, вставленных в рабочую книгу, включая возможность удаления второстепенных фрагментов фона изображения. • Средство создания экранных снимков. Теперь можно легко создать снимок окна любой открытой программы, а затем вставить полученное изображение в рабочий лист. • Оперативный просмотр вставки. В случае копирования диапазона данных ко­ манда Вставить (Paste) отображает различные варианты вставки в режиме опера­ тивного просмотра. Благодаря этому вы сможете увидеть результат вставки еще до ее фактического выполнения. • Настройка ленты. Теперь пользователи могут настраивать ленту путем добавле­ ния на нее новых вкладок и групп. К сожалению, настраивать ленту средствами VBA невозможно. • Редактор формул. Можно создавать и вычислять математические формулы и внедрять их на рабочий лист. • Более быстрая работа. Компания Microsoft внесла улучшения в механизм вычис­ лений; также была ускорена загрузка файлов. • Новые возможности обеспечения безопасности. Рабочие книги, загруженные из Интернета или полученные в виде вложений в электронные письма, открываются в защищенном режиме. Если придать рабочим книгам статус доверенных, отпадет необходимость их хранения в специальных “карантинных” папках. • Надстройка Поиск решения (Solver). В Excel 2010 появилась новая версия над­ стройки Поиск решения. • Усовершенствования в VBA. Теперь появилась возможность с помощью макро­ сов VBA выполнять операции, которые раньше были подвластны лишь старым мак­ росам XLM. Помимо этого, стала доступной запись макросов, которые выполняют такие операции, как форматирование диаграмм и фигур. Пользовательский интерфейс Excel Пользовательский интерфейс — это средство взаимодействия между пользователем и компьютерной программой. В состав пользовательского интерфейса входят такие эле­ менты, как меню, панели инструментов, диалоговые окна, комбинации клавиш и т.п. С появлением версии Excel 2007 традиционные меню и панели инструментов ушли в прошлое. Современный пользовательский интерфейс Excel включает следующие элементы: Глава 2. Основные элементы Excel 55 • лента; • контекстные меню; • диалоговые окна; • клавиатурные сокращения; • смарт-теги; • области задач. Лента В Office 2007 компания Microsoft представила миру совершенно новый пользователь­ ский интерфейс. Меню и панели инструментов остались в прошлом, уступив место ин­ терфейсу пользователя, основанному на ленте с вкладками. Просто щелкните на вклад­ ке, находящейся в верхней части меню (обозначена словом Главная (Ноте), Вставка (Insert) или Разметка страницы (Page Layout)), и лента отобразит команды для этой вкладки. Программа Office 2007 стала первой в истории, использующей этот новый ин­ терфейс. В настоящее время несколько компаний внедрили этот новый стиль пользова­ тельского интерфейса в свои продукты. Количество команд, отображаемых на ленте, изменяется в зависимости от ширины окна Excel. Если окно слишком узкое для отображения всего, что требуется, команды адаптируются, причем создается впечатление, будто часть из них теряется. Но на самом деле это не так. На рис. 2.2 показана вкладка ленты Главная (Ноше), на которой нахо­ дятся все элементы управления. На рис. 2.3 показана лента для более узкого окна Excel. Обратите внимание на отсутствие части описательного текста при сохранении всех пик­ тограмм. На рис. 2.4 показан экстремальный случай, когда окно чрезвычайно узкое. Не­ которые из групп содержат единственную пиктограмму, после щелчка на которой ото­ бражаются все команды для этой группы. в щ о - е- 6 £ Вствдетк ^ Книг»? - Mktoioft Еке! V Гяавма* бег»»*» ftmwTK* гтрвмкцы • {0 т * ж / J • Буфер еб*ен» . ’ А‘ * >• Д - Щ - Шрифт Формулы Джим* : * Ш' Ш Ш Ш V » .» Pturxntpoumtc Вмр»»тм»и« Вид • а 0 Надстройки ш т Щ ■ % воо t tf -*3 форматирование Форматировать Ч*сло --.г»: 9 а " Вставить э*уд— тьФормат * с |? £3 S * а- h 'W Jflk я® e ra Сортировка найти и U ' «фильтр* . ........ . .. Рис. 2.2. Вкладка ленты Главная * Ф* g jiH i▼ * Главная С Книга2 - Microsoft Excel Вставка Разметка страницы Calibri £ . Ж »j l l к » |j Ч ’ ! а ‘ Буфер обме... 1 |±1 ^ 1 Д ’ сэ ИЗ Рецензирование ♦,0 ,00 .00 *,0 rj Вид Надстройки Л t* ” |^ Главная Число Ц * Удалить v а ^Ф орм ат <2 т Стили Размет* Calibri r Вставить • i Ж Q ч - | буфер обм... Щ - ! <3* П* Шрифт Д к Данные Ячейки Редактирование % к Число Ш iW 9/* - 17, а Реценз*, Вид ■ -0 3 = » ]ll К . <$ Формул 23 22 & Л Сортировка Найти и и фильтр ^ выделить » ' Книга2 - Microsoft Excel Вставка сэ # А Рис. 2.3. Вкладка ленты Главная для суженного окна Excel f f l l H 4 ~ 0 а*“ Вставить ж Щ * % ооо Гм Выравнивание Шрифт Q Данные Общий ш Ш Ш а Вставить W Формулы Выравнивание Надстрс Л 0 А т Стили Ячейки Q Рис. 2.4. Вкладка ленты Главная для самого узкого окна Excel 13 й сэ [£j0 £3 Е а - • {Рк - Редактиро... Часть I. Введение в Excel 56 Совет Если нужно скрыть ленту для увеличения рабочего пространства, дважды щелк­ ните на любой из вкладок. После этого лента исчезнет, а в вашем распоряжении окажутся примерно четыре дополнительные строки рабочего листа. Если вы за­ хотите воспользоваться лентой снова, просто щелкните на любой из вкладок. Для отображения/сокрытия ленты можно также нажать комбинацию клавиш <Ctrl+F1> либо щелкнуть на пиктограмме в виде направленной вверх стрелки, находящейся слева от пиктограммы справки в верхней правой части окна. Контекстные вкладки Помимо обычных вкладок в Excel имеются контекстные вкладки. Подобная вкладка содержит набор инструментов, отображаемый при выделении какого-либо объекта (диаграмма, таблица, рисунок либо графический элемент SmartArt). На рис. 2.5 показаны контекстные вкладки, которые появляются в случае выделения встроенной формулы. При этом Excel отображает две контекстные вкладки: Формат (Format) (для работы с объектами) и Конструктор (Design) (для работы с уравнениями). Обратите внимание на то, что в строке заголовка Excel отображается описание групп контекстных вкладок (Средства рисования (Drawing Tools) и Работа с формулами (Equation Tools)). В случае отображения контекстных вкладок можно продолжать поль­ зоваться всеми остальными вкладками. у *) » О • ; * Главная ofll Книга? Microsoft Е«сЯ ветка Разметка страницы Формулы Данные Рецензирование Вид Надстройки П ж f z z — ‘ ШВШШИИШШВВВеЗц § е* Vx С £ «» * TextBox 1 FS 1 3 * ‘ * ' U 1*•■■•! Дробь Индекс Радикал Интеграл Крупный Скобка Функция пiim *ао ▲ ВО Предел и Оператор Матрица A ' ~f— ] -----СИ i............i i........... ........... ......... -b±y/ lh2 — 4 ac tX m 4.... =7? tr ii ; 1 ---i zzzl | .......j — fcH -... t .... I--+ -H .....1 ziztzz: r..... 1 .... j j —-f...; .. |...... * 9 ---------- J 6 7 ........ ■ .............. ............... ............... 4- 1™ ----- 8 ;.......... 10 * ---------------------- ------------- — о ----- If 12 13 ------------ !-------- О ; . ------------ !............... ................ is _______ ' 17 |-----------IS 21 ; ------------ ------------ 23 |_........... 25 .............I............ j.............!........-... j............!........— j......— i... - ....... |... 1 27 Ц *HLftHJ:. SSS. /Vct3 . к; ......... ». Рис. 2.5. После выделения объекта отображаются контекстные вкладки, содержащие ин­ струменты для работы с этим объектом Типы команд ленты В большинстве случаев команды ленты выполняют то, чего вы от них ожидаете. Ниже описаны основные команды, на практике же встречаются различные стили этих команд. • Простые кнопки. Щелкните на кнопке для выполнения связанной с ней команды. Примером может служить кнопка Увеличить размер шрифта (Increase Font Глава 2. Основные элементы Excel 57 Size) в группе Шрифт (Font) вкладки Главная (Ноте). Одни кнопки выполняют связанное с ними действие немедленно; другие отображают диалоговое окно, в котором можно ввести дополнительную информацию. Кнопки могут также со­ провождаться текстом. • Переключатели. Переключатель допускает щелчок мышью, а также отобража­ ет некоторый тип информации двумя цветами. Примером подобной кнопки яв­ ляется кнопка Полужирный (Bold) в группе Шрифт (Font) вкладки Главная (Ноше). Если активная ячейка не выделена полужирным, кнопка Полужирный окрашена в обычный цвет. Если же активная ячейка выделена полужирным, эта кнопка окрашена в другой фоновый цвет. После щелчка на этой кнопке переклю­ чается атрибут Полужирный для выделенной области. • Простые списки. Если команде ленты соответствует маленькая указующая вниз стрелка, значит, тип этой команды — список. Щелкните на нем, и ниже появятся до­ полнительные команды. Примером простого списка может служить команда Объе­ динить и поместить в центре (Merge and Center) в группе Выравнивание (Align­ ment) вкладки Главная (Ноте). После щелчка на этом элементе управления отобра­ зятся четыре элемента, обеспечивающие центрирование и объединение данных. • Комбинированные кнопки. Этот вид элемента управления представляет собой комбинацию обычной кнопки (в верхней части) и раскрывающегося списка (в нижней части). После щелчка в верхней части вызывается соответствующая ко­ манда. Если щелкнуть на нижней части, отображается список связанных команд. Идентифицировать комбинированную кнопку можно по двум цветам, отображаю­ щимся при установке указателя мыши над этой кнопкой. В качестве примера можно рассмотреть команду Вставить (Paste), находящуюся в группе Буфер обмена (Clipboard) ленты Главная (Ноте). После щелчка на верхней части этой кнопки вставляются данные, находящиеся в буфере обмена. Если же щелкнуть на нижней части, отображается перечень команд, связанных с операцией вставки (рис. 2.6). • Флажки. Флажок позволяет выбрать состояние “включено/выключено”. Приме­ ром может служить флажок Сетка (Gridlines) в группе Показать или скрыть (Show/Hide) вкладки Вид (View). Если этот флажок установлен, на листе отобра­ жаются линии сетки. Если этот флажок не установлен, сетка не отображается. • Счетчики. Примеры счетчиков можно найти в группе Вписать (Scale to Fit) вкладки Разметка страницы (Page Layout). Щелкните на верхней части счетчика для увеличения его значения; щелкните на нижней части счетчика для уменьше­ ния его значения. © Перекрестная ссылка Дополнительные сведения о настройке ленты Excel можно найти в главе 22. В правой части некоторых групп ленты находятся маленькие значки, с помощью ко­ торых открываются диалоговые окна. Например, подобный значок находится в группе Выравнивание (Alignment) вкладки Главная (Ноте) (рис. 2.7). После щелчка на этом значке отображается диалоговое окно Формат ячеек (Format Cells) с выбранной вклад­ кой Число (Number). Здесь можно найти параметры, отсутствующие на ленте. Часть I. Введение в Excel 58 аIн Главная * 0 Вставка П< Ж К ч - Разметка страницы 11 ЧАТ а а»- д - D Вставить значения р£2Г1 ГТ£*Г"1 р£5П И тт Другие параметры вставки наша Специальная вставка... Рис. 2.6. Команде Вставить соответ­ ствует комбинированная кнопка Новинка Пользователи Excel 2007 не могли изменять ленту по своему усмотрению, тогда как пользователи Excel 2010 получили возможность добавлять и уда­ лять команды ленты. Дополнительные сведения о настройке ленты можно найти в главе 22. Рис. 2.7. После щелчка на этом маленьком значке отображается окно, содержащее дополнительные параметры Панель быстрого доступа На панели быстрого доступа находятся чаще всего используемые команды. Эта па­ нель всегда отображается на экране независимо от выбранной в данный момент вкладки ленты. Обычно панель быстрого доступа находится в левой части строки заголовка. При желании ее можно переместить ниже ленты. Для этого щелкните на ней правой кнопкой мыши и в контекстном меню выберите команду Разместить панель быстрого доступа под лентой (Show Quick Access Toolbar Below the Ribbon). Изначально на панели быстрого доступа находятся следующие команды: Сохранить (Save), Отменить (Undo) и Повторить (Redo). Можно также добавить другие команды, которые наиболее часто используются в повседневной практике. Если нужно перемес­ Глава 2. Основные элементы Excel 59 тить команду с ленты на панель быстрого доступа, щелкните на этой команде правой кнопкой мыши и выберите пункт меню Добавить на панель быстрого доступа (Add То Quick Access Toolbar). В Excel существуют команды, которые не отображаются на ленте. Единственный способ воспользоваться этими командами — добавить их на панель быстрого доступа. Обратите внимание на рис. 2.8, на котором показан раздел Панель быстрого доступа (Quick Access toolbar) диалогового окна Параметры Excel (Excel Options). С помощью этого раздела обеспечивается быстрая настройка панели быстрого доступа. Для быстрого перехода в раздел щелкните правой кнопкой мыши на панели быстрого доступа и выбе­ рите пункт Настройка панели быстрого доступа (Customize Quick Access Toolbar). ■ Параметры Excel 1 □Ш ттттяшшшшшшшшиштят■мним шяяшшшяшш ... .... Общие н Настройка панели быстрого доступа. Формулы Правописание Выбрать команды и з:© Настройка панели быстрого доступа;© ■Часто используем! | Для всех документов (по умолчанию} Сохранение < Разделитель > Язык Быстрая печать Дополнительно Настройка ленты С* Вернуть а Вставить & Панель быстрого доступа Надстройки ш т V Вставить Ц I Iц |> Сохранить Отменить С Вернуть ► Вставить рисунок из файла Вставить сводную таблицу Вставить столбцы на лист Вставить строки на лист Центр управления безопасностью h * Вставить функцию Вставить ячейки... Вырезать 9 Выровнять по центру ЕВ Границы _ \Л ш Диспетчер имен J Р А* ш ш ш 1? ш мо■ Задать Закрепить области >| Копировать ► Макросы Настраиваемая сортировка... Обновить все ■ Объединить и поместить в центре Орфография... Открыть Открыть последний файл... О т м тш п !_________ ______________________ ]>■ Настройки: CftpOC | Рис. 2.8. Добавление новых значков на панель быстрого доступа с помощью раздела Па­ нель быстрого доступа диалогового окна Параметры Excel Быстрый доступ к ленте с помощью клавиатуры На первый взгляд кажется, что работать с лентой можно исключительно с помощью мыши. Это впечатление подкрепляется еще и тем, что в названиях команд отсутствуют подчеркнутые буквы, соответствующие клавишам, с помощью которых (в комбинации с клавишей <Alt>) вызываются эти команды. На самом деле лента тесно “дружит” с кла­ виатурой. Для отображения подсказок клавиш нажмите клавишу <Alt>. Каждому эле­ менту управления, находящемуся на ленте, соответствует своя клавиша. Совет В процессе ввода букв, соответствующих подсказке клавиши, вовсе не обя­ зательно нажимать клавишу <Alt>. 60 Часть I. Введение в Excel На рис. 2.9 показана вкладка Главная (Ноше) после нажатия клавиши <Alt> (для отображения подсказок клавиш). Если нажать клавишу, отображаемую одной из подска­ зок клавиш, отобразятся дополнительные подсказки клавиш. Например, если с помощью клавиатуры нужно выровнять по левому краю содержимое ячейки, нажмите сначала кла­ вишу <Alt>, затем — клавишу <Н> (для выбора вкладки Главная (Ноте)), после чего — сочетние клавиш <А> и <L> (для выравнивания влево (Align Left)). Если вы относитесь к категории компьютерных фанатов (вроде меня), то через несколько минут вспомните комбинацию клавиш для вызова той или иной команды. Рис. 2.9. Для отображения подсказок клавиш нажмите клавишу <Alt> После нажатия и удерживания клавиши <Alt> можно воспользоваться клавишами « —> и <—» для прокручивания вкладок. Выбрав нужную вкладку, нажмите клавишу <1> для перехода к ленте. Также используйте клавиши « —> и <—» для перебора команд ленты. После выбора нужной команды нажмите клавишу <Enter>. Этот метод не столь эффективный, как использование комбинаций клавиш, но зато с его помощью можно быстро просмотреть все варианты, предлагаемые лентой. Примечание Программа Excel 2010 поддерживает комбинации клавиш Excel 2003, пред­ назначенных для быстрого вызова меню. Поэтому вы, как и раньше, сможете воспользоваться подобными комбинациями клавиш, например <Alt+ES> (для перехода в диалоговое окно Специальная вставка (Paste Special)). Контекстные меню и мини-панель инструментов Единственный вид меню, оставшийся в Excel, — это контекстные меню. Этот тип меню вызывается после выбора одного или нескольких объектов и щелчка правой кнопкой мы­ ши. Эти меню контекстно-зависимы. Другими словами, отображаемое содержимое на эк­ ране меню зависит от того, в каком месте экрана находится указатель мыши в данный мо­ мент. Правой кнопкой мыши можно щелкнуть практически везде — на ячейке, на границе строки или столбца, на строке заголовка рабочей книги, на панели инструментов и т.п. После щелчка правой кнопкой мыши на некоторых объектах над контекстным меню отображается мини-панель инструментов. С ее помощью обеспечивается доступ к наи­ более распространенным командам форматирования. На рис. 2.10 показана мини-панель инструментов, появляющаяся при выборе ячейки. Хотя с помощью VBA невозможно настроить ленту, средствами этого языка можно настроить любое из контекстных меню. Также с помощью VBA невозможно изменить внешний вид мини-панели инструментов. Перекрестная ссылка Дополнительные сведения о настройке контекстных меню можно найти в главе 23. Глава 2. Основные элементы Excel А 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 61 В С Calibri D ▼J]ч Ж * * 154,541 * F Е ' A ' i' S ’ H т- А ^Ш G Л ОА ОП О fcart yftj У* <8 <9 Вырезать Копировать Параметры & вставки: ш Специальная вставка.,. Вставить... Удалить... Очистить содержимое Фильтр ► Сортировка ► -Л Вставить примечание Я1 Формат ячеек... Выбрать из раскрывающегося списка... Присвоить имя... я, Гиперссылка... ........ ; : i Рис. 2.10. После щелчка правой кнопкой мыши на некото­ рых объектах отображается мини-панель инструментов Диалоговые окна При вызове на выполнение некоторых команд ленты отображаются диалоговые окна. Во многих случаях эти окна включают дополнительные элементы управления, которые недоступны при использовании одной ленты. В Excel существуют два вида диалоговых окон. • Модальные диалоговые окна. Если на экране отображается модальное диалого­ вое окно, при вызове какой-либо команды его нужно закрыть. Примером подоб­ ного окна может служить диалоговое окно Формат ячеек (Format Cells). Если в нем выбран какой-либо параметр, его невозможно применить до тех пор, пока вы не щелкнете на кнопке ОК. Если изменения не предусмотрены, щелкните на кноп­ ке Отмена (Cancel) для закрытия диалогового окна. • Немодальные диалоговые окна. Эти диалоговые окна всегда находятся поверх других окон. Например, если вы работаете с диаграммой и используете диалого­ вое окно Формат (Format), выполняемые в этом окне настройки немедленно отра­ зятся на диаграмме. Эти диалоговые окна практически всегда содержат кнопку Закрыть (Close) вместо кнопки ОК, а также кнопку Отмена (Cancel). Многие из диалоговых окон Excel напоминают записную книжку, в результате чего одно диалоговое окно заменяет несколько окон. В прежних диалоговых окнах эти вклад­ ки находились в верхней части. В современном диалоговом окне (пример которого пока­ зан на рис. 2.11) вкладки находятся слева. Разработчики могут создавать пользовательские диалоговые окна с помощью элемен­ та UserForm (пользовательские формы). В дальнейшем будет рассмотрено создание самых разных диалоговых окон, включая диалоговые окна с вкладками. Часть I. Введение в Excel 62 Формат рисунка Заливка Заливка С Нет заливки О Оплошная заливка О Градиентная заливка Цвет линии Тип линии Тень © О Отражение Свечение и сглаживание ! Формат объемной фигуры Рисунок или текстура Узорная заливка Текстура: £ - I Вставить из: I Поворот объемной фигуры | буфер обмена | Картинка... j Ш Преобразовать рисунок в текстуру Настройка рисунка Параметры мозаики-------------------------------------------Цвет рисунка Художественные эффекты | Смещение по X: jo irr ^ Масштаб по X: 1100% Ц | Смещение по У: |0пт ~ ||j Масштаб по Y: | l 0 0 % J j | Обрезка [по верхнему и левому краю Размер Свойства Тип отражения: [Йёт I Надпись фоэрачность: W у &Г-Щ Повернуть вместе с фигурой Замещающий текст Закрыть j Рис. 2.11. Диалоговые окна с вкладками обеспечивают простой доступ к находящимся на них параметрам © Перекрестная ссылка Дополнительные сведения о пользовательских формах можно найти в части IV. Комбинации клавиш Пользователям программы Excel доступно множество комбинаций клавиш. Напри­ мер, если нужно скопировать содержимое ячейки в находящуюся ниже выделенную ячейку, нажмите <Ctrl+D>. Если вы начинающий пользователь Excel или хотите повы­ сить скорость выполнения операций в программе, просмотрите разделы справочной сис­ темы, посвященные комбинациям клавиш. Знание комбинаций клавиш — ключ к успеш­ ному использованию возможностей Excel. В файлах справочной системы приведены таблицы, в которых собраны все полезные советы по использованию клавиатуры для реализации часто выполняемых операций. И как уже отмечалось, с помощью клавиатуры можно получить доступ к командам ленты. Смарт-теги Смарт-тег — это небольшой значок, который автоматически появляется на рабочем листе при выполнении определенных действий. После щелчка на смарт-теге на экране отображается своеобразное контекстное меню, в котором перечислены специальные ко­ манды. Например, при копировании и вставке диапазона ячеек на рабочий лист вы уви­ дите смарт-тег в правом нижнем углу вставляемого диапазона (рис. 2.12). Область задач Впервые область задач появилась в Excel 2002. Это многофункциональное средство, прикрепляемое к правому краю окна, значительно улучшило пользовательский интер­ фейс программы. Область задач используется для выполнения самых разных операций. Глава 2. Основные элементы Excel 63 Среди них— отображение содержимого буфера обмена, вывод списка полей сводной таблицы, вставка клипов, упрощение поиска, а также установка соответствия с данными XML (extensible Markup Language). Посмотрите на рис. 2.13, на котором показана об­ ласть задач Картинка (Clip Art). Картинка Искать: Искать объекты: I Все файлы мультимедиа □ Включить контент сайта Office.com I ...... С в А н G Е D 1 J_ 9 4 /8 4 9 9 ,2 ! JL 1 0 4 ,5 ; 1 э м А JL 8 «H I ............7 s ] 9 Mia- * 1° 11 j -------------- ]........................4 ш 12 \jm т s т Ъ ---- 13 —15 -------------- L iz : 1-------------- t~------------- 1 17 it ---- а ■ а -----i « s a ia .............’"1 ------------1...... £) Дополнительно на сайте Office.com Q Советы по поиску картинок i....... ..z .. Рис. 2.12. Смарт-тег, отображаемый в процессе вставки скопированного диапазона ячеек Рис. 2.13. Поиск клипов— это лишь одна из многочисленных функций области задач Картинка Что нового в Visual Basic Editor А ничего. Доступ к большинству компонентов обновленной объектной модели Excel 2010 обеспечивается посредством кода VBA, хотя модуль VB Editor остался точно таким же, как и в предыдущих версиях Excel. Все входящие в состав Microsoft Office приложения используют новый ленточный интерфейс пользователя, а работа с редактором VB Editor по-прежнему осуществляется с помощью устаревших меню и панелей инструментов. Возможно, в будущих версиях VB Editor мы увидим обновленное меню, но пока что все остается без изменений. Настройка окна программы Окно Excel на ходу перестраивается в зависимости от типа отображаемых данных (строка состояния, строка формул, панели инструментов и т.д.). Соответствующие ко­ манды находятся на вкладке Вид (View). Фактически с помощью Excel можно отображать данные таким образом, что они бу­ дут совершенно не похожи на электронную таблицу. Например, если выбрать команду Вид^Режимы просмотра книги^Полноэкранный режим (View^Workbook Views^ Full Screen), на экране останется только строка заголовка. Этот режим просмотра следует 64 Часть I. Введение в Excel выбирать в том случае, когда нужно вывести на экран как можно больше информации. Для выхода из этого режима щелкните правой кнопкой мыши на любой ячейке и в кон­ текстном меню выберите команду Вернуть обычный режим (Close Full Screen). Обратите внимание на ползунок изменения масштаба, отображаемый в правой части строки состояния. С помощью этого ползунка можно легко масштабировать изображе­ ние на экране. Помимо этого, можно щелкнуть правой кнопкой мыши на строке состоя­ ния и выбрать тип просматриваемой информации. Ввод данных Вводить данные в среде Excel достаточно просто. Каждое введенное в ячейку значе­ ние интерпретируется программой Excel как один из следующих элементов: • числовое значение (им может быть значение даты и/или времени); • текст; • булево значение (“истина” или “ложь”); • формула. Формулы начинаются знаком равенства (=). При этом разработчики Excel учли склонность пользователей Lotus 1-2-3 вводить в начале формулы знак “собачки” (@), плюс (+) либо минус (-). Эти знаки автоматически преобразуются в знак равенства после нажатия клавиши <Enter>. Формулы, функции и имена Именно благодаря формулам создается структура, именуемая электронной таблицей. Программа Excel включает ряд связанных с формулами свойств, которые не слишком известны широкой публике. Эти свойства обеспечивают создание массивов формул, включение оператора пересечения, ссылок, а также создание мегаформул (авторский термин, означающий длинные и малопонятные, но очень эффективные формулы). Перекрестная ссылка Подробнейшее описание формул ожидает вас в главе 3. Приложение Excel включает ряд полезных свойств, облегчающих идентификацию ошибок, а также отслеживание логики в громоздких электронных таблицах. Для получе­ ния доступа к этим свойствам воспользуйтесь командами в группе Формулы ^Зависи­ мости формул (Formulas^Formula Auditing). Весьма полезной является команда Формулы ^Зависимости формула Проверка наличия ошибок (Formulas^Formula Auditing^Error Checking). В процессе ее выполне­ ния осуществляется сканирование рабочего листа с целью выявления “неправильных” формул. На рис. 2.14 показано, что Excel идентифицирует некорректную формулу, а также предлагает пользователю ряд решений, позволяющих устранить обнаруженную проблему. Благодаря использованию функций рабочего листа обеспечивается выполнение вы­ числений и операций, которые были бы невозможны при использовании других методов. Программа Excel поддерживает огромное количество встроенных функций. Простейший способ найти требуемую функцию заключается в обращении к диалого­ вому окну Мастер функций (Insert Function), которое показано на рис. 2.15. Для получе­ Глава 2. Основные элементы Excel 65 ния доступа к этому окну щелкните на кнопке Вставить функцию (Insert Function), ко­ торая находится в строке формул, либо нажмите комбинацию клавиш <Shift+F3>. После этого на экране появится диалоговое окно Аргументы функции (Function Arguments), которое облегчает назначение функциональных аргументов. Г 142 142 142 142 142 196 177 196 180 196 254 136 136 136 *6 136 143 143 136 106 106 106 У6 106 106 106 106 148 222 148 148 148 148 127 127 143 127 127 127 150 150 150 150 150 150 190 190 190 190 190 190 114 114 114 114 114 114 102 102 654 102 102 765 167 167 167 167 167 167 2146 5357| 1585 2299 142 1578 1633 J I М к N О . Ошибка в ячейке Е 13 Скопировать формулу едим =СУММ(В13:013)___ Олравка по зтой еаиибке Согласующаяся формула..... Формула в этой ячейке отличается от других формул в этой области таблицы. Пропустить ошибку J Изменить в строке формул Рис. 2.14. Программа Excel может выявлять ошибки в формулах Мастер функций - шаг 1 из 2 Поиск функции: Введите краткое описание действия, которое нужно (выполнить, и нажмите кнопку "Найти’ Категория; Математические ABS ACOS ASIN ASINH ATAN ATAN2 ________ из м АС05Н( число) Возвращает гиперболический арккосинус числа. Рис. 2.15. Наилучший способ включения функции в формулу — воспользоваться этим окном П р и м ечан ие Начиная с версии Excel 2007 функции, ранее входившие в состав надстрой­ ки Analysis ToolPak (Пакет анализа), получили статус “встроенных” . Другими словами, вы можете получить доступ к этим функциям, даже если надстрой­ ка Analysis ToolPak не установлена. ЗЗак. 3107 Часть I. Введение в Excel 66 © Перекрестная ссылка Пользователи Excel могут также создавать собственные функции рабочего листа с помощью средств VBA. Дополнительные сведения по этой теме при­ ведены в главе 10. Имя — это идентификатор, с помощью которого можно ссылаться на ячейку, диапазон, значение, формулу либо графический объект. Если при создании формул используются имена, подобные формулы легче воспринимаются (по сравнению с использованием ссылок на ячейки). Еще проще создавать формулы, которые используют именованные ссылки. © Перекрестная ссылка Имена подробно рассматриваются в главе 3. Там же описан процесс обра­ ботки имен, который происходит несколькими уникальными способами. Выделение объектов Обычно объекты выделяются с помощью стандартных методов, принятых в Windows. Диапазон ячеек можно выделить с помощью мыши, щелкнув и затем обведя необходи­ мые ячейки. Если щелкнуть на объекте, который расположен на графическом слое, то объект будет выделен. Чтобы выделить ряд объектов или несмежных ячеек, при выделе­ нии каждого из них нажмите клавишу <Ctrl>. Если следует выделить большой диапазон, щелкните на ячейке, расположенной в одном из углов этого диапазона, прокрутите до­ кумент до противоположного угла диапазона, а затем, нажав клавишу <Shift>, щелкните мышью на последней ячейке диапазона. Примечание После щелчка на диаграмме выделяется объект в составе диаграммы. Если же нужно выделить всю диаграмму, удерживайте нажатой клавишу <Ctrl> во время щелчка на диаграмме. Если объекту сопоставлен макрос, этот макрос будет запущен после щелчка на объек­ те. Если нужно просто выделить подобный объект, щелкните на нем правой кнопкой мыши и нажмите клавишу <Esc> для сокрытия контекстного меню либо во время щелчка на объекте нажимайте клавишу <Ctrl>. Форматирование В Excel выполняется форматирование двух видов: числовое и стилистическое. Числовое форматирование определяет вид, который принимает значение в ячейке. Вы можете не только выбрать формат из заранее определенного списка, но и создать собственный формат (рис. 2.16). Эта процедура подробно описана в справочной системе программы. Некоторые числовые форматы задаются автоматически в зависимости от вводимого значения. Например, если введено значение с принятым у вас символом валюты (в США таким символом является знак доллара), то будет использован числовой денежный фор­ мат. Можно также воспользоваться возможностью условного числового форматирова­ ния, которое определяет вид ячейки с числовым значением в зависимости от величины этого значения. Глава 2. Основные элементы Excel 67 JJiSl Число JВыравнивание JШрифт | Граница | З а те ка JЗащита j Числовые форматы: "3: Дополнительные форматы предназначены для работы с базами данных испиосами адресов. Отмена Рис. 2.16. Параметры числового форматирования в Excel весьма гибкие Стилистическим называется форматирование, применяемое с целью улучшения внешнего вида листа. Многие кнопки на вкладках ленты обеспечивают прямой доступ к основным возможностям форматирования, но иногда требуется доступ к диалоговому окну Формат (Format) для выбранного объекта, в котором содержится весь спектр пара­ метров форматирования. Простейший способ вывести необходимое диалоговое окно и задать формат объек­ та— выделить объект и нажать комбинацию клавиш <Ctrl+l>. Можете также щелкнуть на объекте правой кнопкой мыши и выбрать из контекстного меню команду Формат ххх (Format ххх), где х х х — это название выделенного объекта. В результате появится диалоговое окно с несколькими вкладками. В нем можно задать любое форматирование, какое только можно присвоить выделенному объекту. В Excel часто используется такая возможность, как условное форматирование. До­ ступ к соответствующим параметрам можно получить, выполнив команду Главная1^ Стили^Условное форматирование (Horned Styles^Conditional Formatting). Эта сред­ ство позволяет задать форматирование, которое будет применяться только при опреде­ ленных условиях. Например, можно выделить другим цветом те ячейки, значения в ко­ торых превышают указанную величину. В Excel 2007 появилось много новых возможностей условного форматирования, включая гистограммы, цветовые шкалы и наборы значков. Первая из этих возможностей иллюстрируется на рис. 2.17— непосредственно в ячейках отображается гистограмма условного формата. Параметры защиты В Excel предлагается несколько способов защиты данных рабочего листа. Например, можно защитить от изменения либо перезаписи только формулы, структуру рабочей кни­ ги или VBA-код. 68 Часть I. Введение в Excel ' 1 2 Январь 3 Февраль 4 Март Апрель б Май 7 Июнь " ...... В 21 -9 _” 3 M 5 3 Июль 9 Август 10 Сентябрь И Октябрь 12 Ноябрь_________ 13 Декабрь_________ 14 15 с ■ i !■ шш м ■ 14 -19 -19 -7 1— шшшашшшж ШШШШвШЯ___ 53 ШШШШЯШ 49 ---------- -------------------- L 16 17 ....... Рис. 2.17. Условное форматирование, выпол­ няемое с помощью гистограмм Защита формул от перезаписи Во многих случаях нужно защитить формулы от перезаписи или изменения. Для это­ го выполните следующие действия. 1. Выберите ячейки с формулами, которые нужно защитить от изменения. 2. Щелкните на них правой кнопкой мыши и в контекстном меню выберите команду Формат ячеек (Format Cells). 3. Находясь в диалоговом окне Формат ячеек (Format Cells), выберите вкладку Защита (Protection). 4. На вкладке Защита отмените установку флажка Защищаемая ячейка (Locked). 5. Щелкните на кнопке ОК для закрытия диалогового окна Формат ячеек. 6. Выполните команды Рецензирование^Изменения1^Защитить лист (Review^ Changes^Protect Sheet). После этого появится диалоговое окно Защита листа (Protect Sheet), показанное на рис. 2.18. 7. В диалоговом окне Защита листа укажите параметры, которые обеспечивают выполнение соответствующих действий, введите пароль (при необходимости) и щелкните на кнопке ОК. Примечание По умолчанию все ячейки заблокированы (защищены). Подобная блокиров­ ка не дает эффекта до тех пор, пока защищен рабочий лист. Можно также скрыть формулы, обычно отображаемые в строке формул Excel при выделении ячейки. Для этого выделите ячейки с формулами и убедитесь в том, что уста­ новлен флажок Скрыть формулы (Hidden) на вкладке Защита (Protection) диалогового окна Формат ячеек (Format Cells). Глава 2. Основные элементы Excel 69 Защита структуры рабочей книги Если структура рабочей книги защищена, вы не сможете добавлять либо удалять ра­ бочие листы. Для начала следует открыть диалоговое окно Защита структуры и окон (Protect Structure and Windows), воспользовавшись командой Рецензирование^Изменения^Защитить книгу (Review^Changes1^ Protect Workbook). Результат наших усилий можно увидеть на рис. 2.19. Установите флажок Структуру (Structure). Если при этом также будет установлен флажок Окна (Windows), вы не сможете перемещать либо изме­ нять размеры окна рабочей книги. Р Защитить лист и содержимое защищаемых ячеек Пароль для отключения защиты листа: Разрешить всем пользователям этого листа: р ншиишяшшшшшшяшш Jjxj W выделение незаблокированных ячеек | П форматирование ячеек Г* форматирование столбцов Г* форматирование строк Г” вставку столбцов Г" вставку строк Г вставку гиперссылок Г" удаление столби» Г” удаление строк_______________ Защитить кн и гу ----- Р структуру Г зкна Пароль (не обязателен): OK Рис. 2.18. В этом окне можно уста­ новить защиту для своего рабоче­ го листа I Отмена | Рис. 2.19. Диалоговое окно Защи­ та структуры и окон Защита книги с помощью пароля В некоторых случаях нужно блокировать доступ к книге для сторонних пользовате­ лей, воспользовавшись паролем. Для сохранения файла рабочей книги с паролем выберите команду Файл^Сведения1^ Защитить книгу «^Зашифровать паролем (File^Info^Protect Workbook^Encrypt With Password). В появившемся на экране окне Шифрование документа (Encrypt Document) ука­ жите пароль и щелкните на кнопке ОК (рис. 2.20). После этого сохраните рабочую книгу. Шифрование до кум ента Шифрование содержимого этого файла Пароль: Г~ ” '| Внимание! Забытый пароль восстановить невозможно. Список паролей рекомендуется хранить в надежном месте. Следует также помнить, что при вводе пароля учитывается регистр букв. Рис. 2.20. Воспользуйтесь диалого­ вым окном Шифрование документа для сохранения рабочей книги с паролем Часть I. Введение в Excel 70 Защита VBA-кода с помощью пароля Если в состав рабочей книги входит VBA-код, можно воспользоваться паролем для защиты этого кода от просмотра и изменения. Для этого перейдите в среду VBE (нажмите комбинацию клавиш <Alt+Fl 1>) и выберите проект в окне Projects (Проекты). Выполните команду Tools^xxx Properties (здесь ххх— имя проекта). На экране поя­ вится диалоговое окно свойств проекта. Находясь в окне свойств проекта, выберите вкладку Protection (Защита) (рис. 2.21). Установите флажок Lock Project for Viewing (Защитить проект от просмотра) и дважды введите пароль. Щелкните на кнопке ОК и сохраните файл. Пароль понадобится для просмотра либо изменения кода при повторном открытии файла. Рис. 2.21. Защита VBA-проекта в диалоговом окне Project Properties (Свойства проекта) Предупреждение Важно знать, что безопасность данных в Excel поддерживается на недостаточно высоком уровне. Возможности защиты (даже при наличии пароля), конечно, предотвратят доступ к важным данным в рабочей книге со стороны случайного пользователя, но они не спасут от посягательств опытного хаке­ ра, вооруженного программами взлома паролей (либо знающего парочку секретов программы). Диаграммы Программа Excel наиболее часто применяется для создания диаграмм. Как упомина­ лось ранее, диаграммы могут находиться на листах диаграмм либо “расплываться” на весь рабочий лист. Вы также имеете возможность создавать диаграммы сводных таблиц. Такая диаграмма связана с соответствующей сводной таблицей и позволяет просматри­ вать в графическом виде сводные данные— при этом используются те же методы управления, что и в самой сводной таблице. Пользователи Excel 2010 получили возможность создавать диаграммы нового типа — спарклайны. Эти небольшие диаграммы полностью помещаются в одной ячейке. Не пу­ тайте их со стандартными диаграммами Excel. На рис. 2.22 показан рабочий лист, на ко­ тором находятся спарклайны различных типов. Глава 2. Основные элементы Excel 71 Графики Кодф А -13 103,98 98,92 88,12 86,34 75,58 71,2 С-09 212,74 218,7 202,18 198,56 190,12 181,74 К-88 75,74 73,68 69,86 60,34 64,92 59,46 W-91 91,78 95,44 98,1 99,46 98,68 105,86 324,48 309,14 313,1 287,82 276,24 260,9 М-ОЗ Столбцы 10 ■ ■ И А -13 ■ ■ Январь ■ Ф евраль М арт А п р ел ь м ай Спарклайны Ию нь 103,98 98,92 88,12 86,34 75,58 71,2 212,74 218,7 202,18 198,56 190,12 181,74 69,86 60,34 64,92 59,46 14 W -91 ................ !........в д 91,78 73,68 95,44 98,1 99,46 98,68 105,86 15 М-03 324,48 309,14 313,1 287,82 276,24 12 С-09 13 К-88 Ш ж шшшт_____ и Ш ЯЯшт_____ ' — mi — И 260,9 ■ т т _ _____ 16 17 Выигрыш/проигрыш 18 Код фонда Январь М арт А п р ел ь И ю нь Май Спарклайны 19 А -13 103,98 98,92 88,12 86,34 75,58 -71,2 20 С-09 212,74 218,7 -202,18 198,56 190,12 181,74 21 К-88 75,74 73,68 69,86 60,34 -64,92 22 W-91 91,78 95,44 98,1 99,46 98,68 59,46 105,86 — — 23 М-03 -324,48 309,14 313,1 287,82 276,24 — 260,9 24 Рис. 2.22. Рабочий лист с добавленными спарклайнами Фигуры и рисунки SmartArt Как уже отмечалось, каждый рабочий лист включает невидимый графический слой, на котором находятся диаграммы, рисунки, элементы управления (например, кнопки и списки), а также фигуры. Программа Excel позволяет легко нарисовать огромное количество геометрических фигур непосредственно на рабочем листе. Для получения доступа к коллекции фигур воспользуйтесь командой Вставка^Иллюстрации^Фигуры (Insert^Illustrations^Shapes). Эти фигуры могут изменяться произвольным образом и допускают добавление текста. Можно также сгруппировать объекты, образовав единый объект, который проще пере­ мещать, а также изменять его размеры. В пакете Office 2007 появился новый вид иллюстраций — рисунки SmartArt. Благода­ ря этим рисункам обеспечивается создание настраиваемых диаграмм. Пример рисунка SmartArt показан на рис. 2.23. Доступ к базам данных В течение многих лет процессоры электронных таблиц предоставляли пользователям возможность работать с простыми таблицами реляционных баз данных. Не является ис­ ключением и программа Excel — она также предлагает инструменты управления реляци­ онными базами данных. Базы данных, создаваемые в процессорах электронных таблиц, делятся на две категории. • Базы данных рабочих листов. Вся база данных хранится на рабочем листе, ог­ раничивающем ее размеры. • Внешние базы данных. Данные хранятся в одном или нескольких файлах на дис­ ке и загружаются по мере необходимости. 72 Часть I. Введение в Excel Цикл обновления ПО Рис. 2.23. Пример рисунка SmartArt Базы данных рабочих листов Обычно в качестве базы данных рабочих листов принимается прямоугольный диапа­ зон данных, включающий заголовки столбцов. Еще в версии Excel 2007 появилась возможность обозначить диапазон данных в каче­ стве таблицы. Для этого достаточно выделить любую ячейку в прямоугольном диапазоне данных и выбрать команду Вставка^Таблицы ^Таблица (Insert^Tables^Table). Бла­ годаря таблицам обеспечивается масса преимуществ: автоматически вычисляемая ниж­ няя строка, простая фильтрация и сортировка, автозаполнение формул в столбцах, а так­ же упрощенное форматирование. Кроме того, если на основе таблицы создается диа­ грамма, она будет автоматически расширяться по мере добавления строк в таблицу. Ряд преимуществ дает возможность работы со столбцами данных в таблице. Каждый заголовок столбца фактически является раскрывающимся списком, обеспечивающим простой доступ к возможностям сортировки и фильтрации (рис. 2.24). Строки таблицы, которые не соответствуют критериям фильтрации, временно скрываются. Внешние базы данных Для работы с внешними базами данных используйте команды из группы Данные1^ Получить внешние данные (Data^Get External Data). Программа Excel 2010 поддер­ живает работу с большим числом внешних баз данных. Excel и Интернет В Excel представлен набор функций, помогающих управлять ресурсами Интернета. Например, есть возможность сохранить рабочий лист или всю рабочую книгу в формате HTML, поддерживаемом веб-браузерами. Кроме того, непосредственно в ячейки можно вставлять гиперссылки, активизируемые щелчком мыши (в том числе и адреса электрон­ ной почты). Глава 2. Основные элементы Excel 73 ---- ...................... ■ Столбец! Q Стол6ец2 Щ СтолбецЗ Q Столбец4 Q Стол6ец5 Q Столбецб Q Столбец7 Q Столбец ЛI Сортировка от А до Я [Ян«ор» 3 Продажи J | Сортировка от Я до А Г ___ 4 £ортировка по цвету 30,336,00р. 33,370,00р. 36,707,00р. 100,413,00р. 40,377,00р. 44,415,00р. 48,856,С Удалить фильтр с 'Столбец!* 20,572,00р. 22,629,00р. 24,892,00р. 68,093,00р. 27,381,00р. 30,119,00р. 33,131,С | ''ifc 6 j Текстовые фильтры 0 (Выделить все) Щ 0Ана»»и относительной прибыли I ; 0 Западное ЬИ И тоге 0 Итого по накладным расхода* Щ 0 Итого по продажам j- 0 Итого по сумме проданных тоеаро г 0 Итого по чистой прибьим 0 Международное | | 15. 16 17 Итого по е 18 1 ^ 94,473,00р.'' 103,920,00р. 114,312,00р. 126,739,00р. 139,413,00р. 153,354,00р. [Поиск 9 Итого по 1 Квартал 1 131,685,00р. 144,854,00р. 159,339,00р. Фильтр «о цвету И 8 Март Февраль _____________ А пр ел е Июню Май 1 . I 11 435,878,00р. 175,273,00р. 192,800,00р. 212,080,С 312,705,00р. 125,744,00р. 138,318,00р. 152,150,С | 419,506,00р. 168,690,00р. 185,559,00р. 204,414,С |403,805,00р. 444,186,00р. 488,604,00р. 1,336,595,00р. 537,465,00р. 591,211,00р. 650,631,(j | ,1............ .а..^ d ж 0*1 гЪшт'А 10,341,00р. 11,272,00р. 12,286,00р. 33,899,00р. 13,392,00р. 14,597,00р. 15,911,С 6,546,00р. 7,135,00р. 7,777,00р. 21,458,00р. 8,477,00р. 9,240,00р. 10,072,е 65,843,00р. 71,769,00р. 78,228,00р. 215,840,00р. 85,269,00р. 92,943,00р. 101,308,С 63,967,00р. 69,724,00р. 75,999,00р. 209,690,00р. 82,839,00р. 90,295,00р. 72,314,00р. 78,822,00р. 85,916,00р. 237,052,00р. 93,649,00р. 102,077,00р. 111,264,( 219,011,00р. 238,722,00р. 260,206,00р. 98,421,0 717,939,00р. 283,626,00р. 309,152,00р. 19 Накладны 20 Северн ое 21,529,00р. 23,036,00р. 24,649,00р. 69,214,00р. 26,374,00р. 28,220,00р. 30,196,С 21 Ю ж ное 15,946,00р. 17,062,00р. 18,257,00р. 51,265,00р. 19,535,00р. 20,902,00р. 22,365,С 27,554,00р. 29,483.00р. 31,547,00р. 88,584,00р. 33,755,00р. 36,118,00р. 38,646,С ■ 22 и ] ПистГ Лист2 J^ ctS Г ПнстЧ Лист5 Рис. 2.24. Таблицы в Excel облегчают сортировку и фильтрацию строк © Предупреждение В предыдущих версиях Excel формат HTML выступал в качестве универсаль­ ного файлового формата. Другими словами, можно было сохранить рабо­ чую книгу в формате HTML и повторно открыть ее в Excel, и ничего при этом не терялось. С появлением Excel 2007 эта возможность больше не поддер­ живается. Теперь HTML рассматривается исключительно в качестве форма­ та для экспорта. Можно также создавать веб-запросы, предназначенные для выборки данных, находя­ щихся в локальной сети или в Интернете. Подобные запросы могут обновляться по мере загрузки на сайт новой информации. Пример такого запроса показан на рис. 2.25. Инструменты анализа Что касается задач анализа, то Excel справляется с ними довольно неплохо (именно по этой причине большинство пользователей обращаются к электронным таблицам). Некоторые задачи анализа решаются с помощью формул, однако Excel предлагает и другие варианты. • Структуры. Режим структуры рабочей таблицы зачастую является эффективным средством управления иерархически упорядоченными данными (такими, напри­ мер, как бюджет). Excel автоматически создает структуру (горизонтальную, вер­ тикальную или смешанную), а также позволяет получать ее вручную. Единожды создав структуру, в дальнейшем можно разворачивать и сворачивать ее для ото­ бражения разных уровней детализации. • Analysis ToolPak (Пакет анализа). В предыдущих версиях Excel надстройка Analysis ToolPak предназначалась для поддержки специальных инструментов ана­ лиза и функций рабочего листа, которые в основном предназначались для выпол­ нения статистических расчетов. Начиная с версии Excel 2007 эти инструменты и функции встроены, благодаря чему Excel может применяться профессионалами в области статистики. 74 Часть I. Введение в Excel 1ш ~3 1nyqs| 9 Адрес! I http://wvw^ftTm arlcetco^ Щелкните значки 0 [+1 Валюта USDЛ 3 J Q В Параметры. таблиц, которые нужно выбрать, и нажмите кнопку ’ Импорт". шшшашдн/гз —I II Регион Р*г» В Время 16.03.10 16.03.10 16.03,10 16.03.10 16.03.10 16.03.10 16.03.10 16.03.10 16.03.10 16.03.10 16.03.10 09:27 09:38 09:41 09:31 09:13 09:01 09:04 09:02 08:57 08:58 09:00 7.9900 8.0000 7.9910 7.9900 7.9900 7.9900 7.9900 7.9900 7.9900 7.9900 7.9900 8.0100 8.0100 8.0100 8.0100 8.0100 8.0100 8,0100 8.0Ю0 8,0100 8.0100 8,0100 044-5374827 044 5314142 044 3932563 044 3902586 044 4540185 064 2351835 032 2422131 062 9490965 048 7343721 -00 0000001 0552464941 БГ БАНК АРТЕМ-БАНК Бизнес Стандарт Актив-Банк Богуслав БТАЛО БТАКМД БГАМО БТАОМД БТАСО БГАХО Киев Киев Киев Киев Киев Луганская обл. Львовская обл. Донецкая обл. Одесская обл. Республика Крым Херсонская обл. Днепропетровская обл. Черновиисая обл. 16.03.10 08:56 7.9900 8.0100 056 7135720 БТАДМД 16.03.10 09:03 7.9900 8.0100 037 2558293 БТАЧМД 16.03.10 09:38 7.9950 8.0100 16.03.10 09:26 7.9950 8,0080 16.03.10 09:37 7.9630 8.0070 16.03.10 08:45 7.9630 8.0130 044 2371920 Захидинкомбанк Киев КФ 044 2558104 РОДОВИД БАНК Киев Днепропетровская 056 7911845 КРЕДИТ ДНЕПР обл. Киев 044 2879586 Легбанк 16.03.10 09:39 7,9950 8.0100 044 2380921 16.03.10 09:23 7.9800 8,0100 Киев Капитал 044 2075515 Проминвестбанк Киев С и йпк лтш л э- Рис. 2.25. Создание веб-запроса, предназначенного для импорта данных в рабочий лист • Сводные таблицы. Одним из самых мощных инструментов Excel являются свод­ ные таблицы. Они позволяют сводить данные в виде удобной таблицы, которую можно приспособить для решения сложных задач. Кроме того, объектами сводной таблицы можно управлять, используя возможности языка VBA. Данные этой таб­ лицы импортируются из базы данных, которая находится на рабочем листе или за­ гружается из внешнего хранилища, и хранятся в специальной кэш-памяти, позво­ ляющей быстро выполнять пересчет данных после каждого изменения сводной таблицы. Пример сводной таблицы представлен на рис. 2.26. Ф • Перекрестная ссылка Обратитесь к главе 17 для получения сведений о работе со сводными таб­ лицами с помощью VBA. Поиск решения. Для решения специальных линейных и нелинейных задач в Excel применяется надстройка Поиск решения (Solver), которая использует структуры “что если” для подбора данных в одних ячейках на основе ограничений, наклады­ ваемых на другие ячейки. Новинка w ffigp В Excel 2010 модуль Поиск решения изменил свой внешний вид, а также стал более производительным. Глава 2. Основные элементы Excel А 75 с О тчею продажах А 1 ! .......D ................. ] Е ...... Г 7 ” ! 1 2 з Значения 4 Названия строк 5 в Австралийская баранина С ум м а по полю Кв. 1 Сум ма по полю Кв. 2 Су*(ма п о полю Кв. 3 Сум ма по полю Кв. 4 2667,6 4013,1 4836 6087,9 0 702 0 0 BER6S 312 0 0 0 BOLID 0 0 0 1170 0 б ANTON 7 8 9 В ВОТТМ 1170 0 0 10 ERNSH 1123,2 0 0 2607,15 11 G OD OS 0 280,8 0 0 12 HUNGC 62,4 0 0 о о 13 PICCO 0 1560 936 14 RATTC 0 592,8 0 15 REGGC 0 0 0 741 16 SAVEA 0 0 3900 789,75 17 SEVES 0 877,5 0 0 18 WHITC 0 0 0 780 ВШ ВКЩ Щ ! 19 в Английский эль 0 551,6 665 0 20 ANTON 0 560 0 о 21 SAVEA 0 0 0 554,4 140 22 THEBI 23 TO M SP 24 VAFFE 25 WHITC 0 0 0 179,2 105 0 0 0 0 196 372,4 0 0 0 о Рис. 2.26. Сводные таблицы Excel имеют множество применений Надстройки Надстройкой называется программа, внедренная в Excel с целью расширения функ­ циональных возможностей программы. Чтобы подключить надстройку, воспользуйтесь разделом Надстройки (Add-Ins) в диалоговом окне Параметры Excel (Excel Options). Кроме надстроек, которые поставляются вместе с Excel, существуют и другие, загру­ жаемые с веб-сайта компании Microsoft (h t t p : / / o f f i c e . m i c r o s o f t . c o m ). Более того, на рынке представлены надстройки сторонних производителей; их можно покупать или загружать из Интернета. Вы также имеете возможность создавать собственные над­ стройки, о чем подробно рассказывается в главе 21. Макросы и программирование В Excel имеются два встроенных языка программирования макросов: XLM и VBA. Изначально был создан язык XLM, но на сегодняшний день он устарел и полностью за­ менен на VBA. В Excel 2010 можно запускать большинство XLM-макросов, а также соз­ давать макросы этого типа. Но при этом невозможно записывать XLM-макросы. Поэто­ му для создания макросов следует использовать VBА. © Перекрестная ссылка Язык VBA подробно рассматривается в части III. Файловые форматы При разработке всех версий Excel во главу угла ставится совместимость между форма­ тами файлов. В версиях от Excel 97 до Excel 2003 включительно использовался один и тот же файловый формат, поэтому проблем совместимости не возникало. С появлением Excel 2007 возник новый файловый формат, который применяется и в версии Excel 2010. 76 Часть I. Введение в Excel К счастью, компания Microsoft разработала “пакет совместимости”, который доступен для более ранних версий Excel. Благодаря этому пакету более ранние версии Excel могут счи­ тывать и записывать файлы в новом формате XLSX. Важно понимать разницу между совместимостью файлов и совместимостью свойств. Например, хотя пакет совместимости дает возможность открывать в Excel 2003 файлы, созданные в Excel 2007, он не заменяет свойства, внедренные в более новой версии. Перекрестная ссылка Обратитесь к главе 4 для получения дополнительных сведений о файловых форматах Excel, а также прочтите главу 26, в которой рассматриваются во­ просы совместимости с точки зрения разработчиков. Справочная система Excel Один из наиболее важных компонентов Excel — справочная система. Щелкните на вопросительном знаке под строкой заголовка (либо нажмите клавишу <F1>), и появится окно справки Excel, в котором можно найти ответ на возникший вопрос или воспользо­ ваться содержанием. Совет Кнопка Поиск (Search) в окне справки фактически является раскрывающим­ ся списком. Используйте этот список для сужения диапазона поиска либо для указания источника поиска (рис. 2.27). Справка: Excel ® © Л © а & М # 0 « P Excel 2010 Dwetoper Reference > Object 11* ф S3 t Поиск - - Контент с сайта Office.com Все Excel Welcome to the Object Libr This reference contarts conceptual ov in developing solutions based on Micr< We welcome your comments or quest [email protected]. ^ Publish date of this reference: March This documentation is accessible from Excel Справка 2010 Excel Шаблоны ?rences to guide you Excel Обучение :to Контент с данного компьютера Excel Справка Справка для разработчиков • From the product: To view the version of this reference that is induded with Office 2010, dkk the Help button in any Office product, and then dick the Search drop-down arrow. Under Content from this computer, dick Developer Reference. • From the MSDN Library: To view the most recent version И your browse-, see the Object Library Reference for Microsoft Office 2010 in the MSDN Library. The documentation contains the following sections: • • W hat's Hew: Provides fists of new objects, enumerations, and members. Concepts: Provides important concepts for developing custom Office solutions. • How Do I: Provides a fist of how-to topics for developing custom Office solutions. • Reference: Provides reference materials for the Office object model. Related Links Microsoft Office Developer Center AccessibilitY in Microsoft Products Document Conventions in Office Developer Documentation Object Library Reference for Microsoft Office 2010 Copyright Notice Microsoft Online Privacy Statement Справка для разработчиков j Рис. 2.27. Окно справки Excel j ^ Автономная работа I 2 Глава Особенности формул В этой главе... ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ О формулах Вычисление формул Ссылки на ячейки и диапазоны Использование имен Ошибки в формулах Excel Формулы массивов Подсчет и суммирование Работа со значениями даты и времени Создание мегаформул Формулы используются во многих сложных приложениях, созданных с помощью электронных таблиц. Создание формул можно рассматривать как своего рода “програм­ мирование”. Примечание Исчерпывающая информация о создании и применении формул приведена в моей книге Формулы в M icrosoft Excel 2010 (Диалектика, 2011). О формулах Формулы — это основа электронной таблицы. Если в таблице нет формул, то она представляет собой просто статический документ (который можно создать с помощью текстового процессора, обеспечивающего прекрасную поддержку статических таблиц). Ниже приведены элементы, которые представляют часть введенной в ячейку формулы: • операторы + (сложение) и * (умножение); • ссылки на ячейки (в том числе имена ячеек и диапазонов); Часть I. Введение в Excel 78 • значения или строки; • функции рабочих листов (например, СУММ или СРЗНАЧ). Формула в Excel 2010 может содержать до 8192 символов. После введения формулы в ячейку последняя отображает результат выполнения формулы. Впрочем, если ячейку активизировать, то в строке формул появится сама формула. Для просмотра длинной формулы можно перетащить в вертикальном направлении границу строки формул. Вычисление формул Вы, возможно, заметили, что формулы в рабочем листе вычисляются сразу. И если изменить ячейку, которая используется в формуле, то результат будет пересчитан без вашего участия. Это происходит в тех случаях, когда значение параметра Вычисления (Excel Calculations) равно Автоматически (Automatic). Режим, задаваемый этим значе­ нием, установлен по умолчанию. Вычисления в рабочем листе, которые выполняются в этом режиме, характеризуются следующими правилами. • Когда вы вносите изменения (например, вводите или редактируете данные либо формулы), Excel немедленно вычисляет значения формул уже с учетом новых или отредактированных данных. • Иногда Excel временно приостанавливает процесс длительного вычисления фор­ мул, чтобы вы могли выполнить другие задачи, связанные с управлением рабочим листом. Когда же вы заканчиваете свои действия, вычисление возобновляется. • Формулы вычисляются в естественном порядке. Другими словами, если формула в ячейке D12 зависит от результата вычисления формулы в ячейке Dl 1, то сначала вычисляется значение в ячейке Dl 1 и только затем — в ячейке D12. Впрочем, иногда контроль над вычислением значений формул в Excel вам, возможно, придется брать на себя. Например, создавая рабочий лист с тысячами сложных формул, вы заметите, что при вычислении их значений скорость обработки данных резко снижа­ ется. В таком случае рекомендуется установить ручной режим вычислений. Для этого пе­ рейдите в группу Формулы ^Вычисление (Formulas^Calculation) и щелкните на кнопке Параметры вычислений (Calculation Options). Если при работе в ручном режиме вычислений рабочий лист содержит невычисленную формулу, то в строке состояния будет отображено сообщение Вычислить (Calculate). Для пересчета значений формул можно использовать следующие клавиши. • После нажатия клавиши <F9> вычисляются значения формул во всех открытых рабочих книгах. • После нажатия комбинации клавиш <Shift+F9> вычисляются значения формул только в активном рабочем листе. В других рабочих листах этой же рабочей книги вычисления не выполняются. • После нажатия комбинации клавиш <Ctrl+Shift+F9> пересчитывается абсо­ лютно все. Эта комбинация клавиш является ^задокументированной. Используй­ те ее, если Excel по какой-либо причине явно рассчитывает данные неправильно или если существует необходимость пересчитать формулы, в которых применяют­ ся пользовательские функции, созданные на языке VBА. Глава 3. Особенности формул 79 • После нажатия комбинации клавиш <Ctrl+Alt+Shift+F9> происходит проверка всех зависимых формул, а также вычисляются значения во всех ячейках всех рабо­ чих книг (включая те ячейки, для которых необходимость вычисления не указана). Примечание В Excel невозможно выбрать свой особый режим вычислений для отдельно­ го рабочего листа. При изменении режима вычислений затрагиваются все открытые рабочие книги, а не только активная рабочая книга. Ссылки на ячейки и диапазоны В большинстве формул присутствуют ссылки не более чем на одну ячейку. Такие ссылки задаются с помощью адреса или имени (если оно задано), определяющего как ячейку, так и диапазон ячеек. Ссылки на ячейки бывают четырех типов. • Относительная. Ссылка является полностью относительной. Когда формула ко­ пируется, то ссылка изменяется в соответствии с новым местоположением форму­ лы (например, А1). • Абсолютная. Ссылка является полностью абсолютной. Когда формула копирует­ ся, ссылка не изменяется (например, $А$1). • Абсолютная строка. Ссылка является частично абсолютной. Когда формула ко­ пируется, та часть ссылки, которая указывает столбец, изменяется в соответствии с новым местоположением формулы, а строчная часть ссылки остается неизмен­ ной (например, А$1). • Абсолютный столбец. Ссылка является частично абсолютной. Когда формула копируется, то строчная часть ссылки меняется в соответствии с новым местопо­ ложением формулы, а та часть ссылки, которая указывает столбец, остается неиз­ менной (например, $А1). По умолчанию все ссылки на ячейки и диапазоны являются относительными. Чтобы изменить тип ссылки, следует вручную добавить к ней знаки доллара. Можно сделать и по-другому: когда ячейка редактируется в строке формул, переместите курсор к нуж­ ному адресу, а затем нажимайте клавишу <F4> до тех пор, пока методом подбора не по­ лучите необходимый тип ссылки. Зачем нужны неотносительные ссылки Единственная причина, по которой когда-либо придется изменить тип ссылки, — это необходимость скопировать формулу (рис. 3.1). Пусть в ячейке СЗ находится'следующая формула: =$ВЗ*С$2 Данная формула вычисляет площадь прямоугольника для различных значений его ширины (перечисленных в столбце В) и длины (перечисленных в строке 3). Введенную формулу скопировали сначала вниз, в ячейку С7, а затем вправо, в ячейку F7. Поскольку в формуле используются ссылки (одна — с абсолютной строкой 2, другая — с абсолют­ ным столбцом В, остальные части этих ссылок являются относительными), каждая ско­ пированная формула все равно будет давать правильный результат. Если в формуле при­ меняются только относительные ссылки, то в результате ее копирования все ссылки из­ менятся, что приведет к неправильным результатам. 80 Часть I. Введение в Excel А 1 2 3 4 5 6 7 8 9 10 в D С F Е G Ширина Я Z S >° 2,5 1,0 1,5 2,0 2,5 1,5 1*5 2,3 3,0 3,8 2,0 2,0 3,0 4,0 5,0 2,5 2,5 3,8 5,0 6,3 3,0 3,0 4,5 6,0 7,5 1,0 1,5 - ____ £0 Рис. 3.1. Пример использования неотносительных ссы­ лок в формулах О ссылках в стиле R1С1 Как правило, в Excel используется формат записи ссылок А1. Каждый адрес ячейки, ото­ бражаемый в таком формате, состоит из буквы, которая обозначает столбец, и числа, которое соответствует строке. Впрочем, в Excel также поддерживается формат записи ссылок R1C1. (Здесь R означает “row”, т.е. “строка”, а С — “column”, т.е. “столбец”.) В этом формате ячейка А1 обозначается как R1C1, а ячейка А2 — соответственно как R2C1 и т.д. Чтобы перейти к формату R1C1, перейдите в раздел Формулы (Formulas) диалогово­ го окна Параметры Excel (Excel Options). Установите флажок Стиль ссылок R1C1 (R1C1 Reference Style). После этого вы обнаружите, что все буквы столбцов заменены числами. Более того, соответствующим образом в созданных ранее формулах изменяют­ ся все ссылки на ячейки и диапазоны. В табл. 3.1 приведены примеры формул, использующих стандартный формат записи и формат R1C1. Предполагается, что каждая из этих формул находится в ячейке В1 (также известной как R1C2). Таблица 3.1. Простые формулы, выведенные в одном из двух форматов записи Стандартный = А 1 +1 R1C1 =$А$1+1 =R1C1+1 =$А1+1 =RC1+1 =А$1+1 = R 1 C [ - 1 ] +1 =СУММ( А 1 :А 1 0 ) =СУММ(RC [ - 1 ] =СУММ( $ А $ 1 : $ А $ 1 0 ) =СУММ( R 1 C 1 :R 1 0 C 1 ) = R C [ - 1 ] +1 :R [ 9 ] С [ - 1 ] ) Если формат записи ссылок R1C1 кажется вам весьма запутанным, то знайте, что вы не одиноки в своих умозаключениях. Он применяется для введения абсолютных ссылок, но когда используются относительные ссылки, от квадратных скобок легко сойти с ума. Числа в квадратных скобках обозначают относительное местоположение ссылок. На­ пример, ссылка R [-5] С [-3] указывает на ячейку, которая находится на пять строк выше и на три столбца левее той ячейки, в которой расположена текущая ссылка. С дру­ гой стороны, ссылка R [5] С [3] обозначает ячейку, которая расположена на пять строк ниже и три столбца правее текущей. Если квадратных скобок нет, то это указывает на ту Глава 3. Особенности формул 81 же самую строку или тот же самый столбец. Например, R [5] С указывает на ячейку, рас­ положенную на пять строк ниже в текущем столбце. Скорее всего, формат R1C1 не станет для вас используемым по умолчанию, однако он все же вам пригодится. С его помощью можно легко отыскать формулу с ошибкой. Если вы используете формат R1C1, то любые копии одной и той же формулы будут оди­ наковыми. Это относится ко всем типам применяемых вами ссылок на ячейки (относительных, абсолютных или смешанных). Можете перейти в режим R1C1 и прове­ рить скопированные формулы. И если какая-либо из них отличается от остальных, то, скорее всего, она и является неправильной. Кроме того, создавая код V B A для получения формул рабочих листов, вы, возможно, предпочтете формат R1C1. Ссылки на другие листы или рабочие книги Ячейки и диапазоны, на которые задаются ссылки в формуле, не обязательно должны находиться в том же листе, что и сама формула. Если в формуле требуется указать ячей­ ку из другого листа, то перед ссылкой на саму ячейку введите имя этого листа, а после имени — восклицательный знак. Ниже приведен пример формулы со ссылкой на ячейку, расположенную в другом рабочем листе (Лист2). =Лист2 ! А1 + 1 Кроме того, можно создавать формулы со ссылками на те ячейки, которые располо­ жены в другой рабочей книге. Для этого перед ссылкой на саму ячейку введите имя ра­ бочей книги (в квадратных скобках), имя рабочего листа и восклицательный знак. = [Бюджет . x l s x ] Л и с т 1 ! А1 Если в имени рабочей книги, используемом в ссылке, содержатся пробелы, то его (вместе с именем рабочего листа) необходимо заключить в одинарные кавычки. = ' [Бюджет на 2 0 1 0 г о д . x l s x ] Л и с т 1 ' !А1 Указанная в ссылке рабочая книга может быть закрыта, тогда в ссылке следует ука­ зать полный путь к этой книге. ='С :\Б ю дж еты \Ф айлы E x c e l \[Б ю д ж е т на 2 0 1 0 г о д . x l s x ] Л и с т 1 1 !А1 В формулах ссылки на рабочие книги указываются в виде пути. Однако вы вправе ис­ пользовать метод указания мышью. Для этого исходный файл должен быть открытым. В данном случае создаются абсолютные ссылки на ячейки (если вы собираетесь копиро­ вать формулу в другие ячейки, то ссылки обязательно измените на относительные). Предупреждение Работа со ссылками может показаться сложной. Например, если для создания резервной копии исходной рабочей книги вы используете команду Файл^Сохранить как (File^Save As), то формулы со ссылками автоматиче­ ски изменятся, чтобы обращаться к указанному файлу (но имеющему новое имя). Существует еще одна возможность нарушить ссылки: переименуйте исходную рабочую книгу, когда не открыта зависящая от нее рабочая книга. Ссылки в таблицах Начиная с версии Excel 2007 появился специальный тип диапазона, который назы­ вается таблицей (для включения таблицы в свой документ Excel воспользуйтесь коман­ дой Вставка^Таблицы^Таблица. Благодаря таблицам возможности формул сущест­ венно расширились. 82 Часть I. Введение в Excel При вводе формулы в ячейку таблицы Excel автоматически копирует ее во все ос­ тальные ячейки данного столбца (это происходит в том случае, если столбец пуст). По­ добный столбец называется вычисляемым. Если в таблицу добавить новую строку, формула вычисляемого столбца автоматически будет вводиться в новую строку. В большинстве случаев именно это и нужно. Если же программа не должна вводить данные вместо вас, воспользуйтесь смарт-тегом, появляющимся после ввода формулы вычисляемого столбца, для отключения этого свойства. В Excel также имеется поддержка “структурированных ссылок” , с помощью которых устанавливаются ссылки на ячейки в таблице. Соответствующий пример показан на приведенном ниже рисунке (эта таблица называется Т а б л и ц а !). Можно также создавать формулы, которые ссылаются на ячейки таблицы с помо­ щью заголовков столбцов. В некоторых случаях это будет способствовать облегчению понимания происходящего. Однако реальное преимущество заключается в том, что формулы остаются корректными после добавления (удаления) строк таблицы. Ниже приведены примеры корректных формул. = Т а б л и ц а 1 [[#Totals], [Д о х о д ы ] ] =SUM(Т а б л и ц а 1 [Д о х о д ы ] ) = Т а б л и ц а 1 [[#Totals], [Д о х о д ы ] ]- Т а б л и ц а 1 [[#Totals], =SUM(Т а б л и ц а 1 [Д о х о д ы ] )-С У М М (Т а б л и ц а 1 [ И з д е р ж к и ] ) [И з д е р ж к и ] ] =СУМ М ЕСЛИ(Таблица1 [Ш т а т ] , " О р е г о н " , Т а б л и ц а 1 [Д о х о д ы ]) = Т а б л и ц а[@ И зд е р ж ки ] В последней формуле используется символ который означает “в этой строке” . Эта формула будет корректной в том случае, если одна из строк относится к таблице. Использование имен Одна из самых существенных возможностей программы Excel — это назначение самым разным элементам содержательных имен. Имена можно присваивать ячейкам, диапазонам ячеек, строкам, столбцам, диаграммам и другим объектам. Преимущество, которым обладает только Excel, позволяет присваивать имена тем значениям или формулам, которые даже не отображаются в ячейках рабочего листа (см. раздел “Присвоение имен константам”). Присвоение имен ячейкам и диапазонам В Excel доступно несколько методов присвоения имен ячейкам либо диапазонам. • Выберите команду Формулы^Определенные именам Присвоить имя (Formulas1^ Named Cells^Name a Range) для отображения диалогового окна Создание имени (New Name). Глава 3. Особенности формул 83 • Воспользуйтесь диалоговым окном Диспетчер имен (Name Manager). Для его вы­ зова выполните команду Формулы^Определенные имена^Диспетчер имен (Formulas ^Defined Names О Name Manager) либо нажмите клавиши <Ctrl+F3>. Ко­ нечно, этот метод нельзя назвать наиболее эффективным, поскольку требуется допол­ нительно щелкнуть на кнопке Создать (New) в диалоговом окне Диспетчер имен (Name Manager) для отображения диалогового окна Создание имени (New Name). • Выделите ячейку или диапазон, введите имя в поле Имя (Name) и нажмите кла­ вишу <Enter>. По сути, поле Имя представляет собой раскрывающийся список, который отображается в левой части строки формул. • Если рабочий лист включает текст, который вы хотите использовать в качестве имен смежных ячеек либо диапазонов, выделите его (вместе с именуемыми ячей­ ками) и выполните команду Формулы^Определенные имена^Создать из выделенного фрагмента (Formulas■=>Defined Names^Create from Selection). На­ пример, на рис. 3.2 диапазон ВЗ:ЕЗ называется 'С ев ер ', В4:Е4— 'Юг' и т.д. В направлении по вертикали диапазон ВЗ:В6 называется ' Квартал2 ' , СЗ:С6 — 1Квартал2 ' и т.д. Обратите внимание на то, каким образом Excel изменяет имена, чтобы сделать их корректными (использование дефиса в именах не допускается). .............^ ... ... i в 1 С | о 1 L£ [ Е G н 1 ! j к L N Щ М _L 2 ...............................1Квартал! Квартал 3 Север Ц Й t; 4 Юг 5 6 Восток Запад КварталЗ Квартал^ 1[ 690Э 6858 8204 7S87 L 8168 7015 7387 6812 8SG9 г Ж71 9029 6649 775? 7408 7903 тж 7 8 I I 1 ...........J ....... 9 _________________ 10 j-------------------------- И 12 13 14 15 ...* выделенного диапа ___________1 Щ Ш Ш ,_________ ________ iTb имена из значении: - ........... 1р ............ т в строке awwej F |в столбце сеева в строке ниже : г в столбце qpaea - В Я 16 17 ____ ] OK | Отмена 1 ;............... I................ 18 19 г ail 1 21 22 23 £ i > и ! Пист1 Пист2 ........... п<; > i\ Рис. 3.2. Программа Excel позволяет создавать имена на основе описательного текста в рабочем листе Использование имен особенно эффективно при написании кода VBA, в котором при­ меняются ссылки на отдельные ячейки или диапазоны. Почему же так важны имена? От­ вет заключается в следующем: если ячейку (или диапазон), на которую ссылается опера­ тор VBA, переместить в другое место, то в VBA-коде эти ссылки автоматически обнов­ ляться не будут. Например, если в VBA-коде значение записывается в ячейку С4, заданную как Range (" С4" ), то после вставки новой строки над этой ячейкой или ново­ го столбца слева от нее данные будут записываться не в требуемую ячейку. Чтобы не возникало подобных проблем, применяйте ссылки на именованные ячейки, например R ange( " I n t e r e s t R a t e " ). 84 Часть I. Введение в Excel Применение имен к существующим ссылкам Когда ячейке или диапазону ячеек назначается имя, Excel не сможет автоматически использовать его вместо ссылок на ячейку или диапазон, которые уже содержатся в формулах. Предположим, в ячейке F10 находится такая формула: = А 1-А 2 Если для А1 вы зададите имя Доходы, а для А2 — Расходы, то формула автомати­ чески не будет превращена в следующую формулу: =Д оходы -Расход ы Впрочем, заменить именами ссылки на ячейки и диапазоны несложно. Вначале выде­ лите диапазон, в котором необходимо сделать изменения. Затем выполните команду Формулы^Определенные имена*=>Присвоить имя (Formulas^Defined Names^Apply Names). В появившемся диалоговом окне выделите имена, которые следует применить при замене, и щелкните на кнопке ОК. В результате все ссылки на ячейки и диапазоны, имеющие имена, будут заменены ссылками на имена. Скрытые имена Отдельные макросы и надстройки Excel создают скрытые имена. Так называются имена, которые находятся в рабочей книге, но не отображаются в диалоговом окне Диспетчер имен (Name Manager). Например, большое количество скрытых имен созда­ ет надстройка Поиск решения (Solver). Эти скрытые имена можно игнорировать. Впро­ чем, иногда они создают проблему. При копировании листа в другую рабочую книгу ко­ пируются также скрытые имена, создавая трудно обнаруживаемые ссылки. Для удаления из рабочей книги всех скрытых имен используйте следующую проце­ дуру VBA. Sub D e le te H id d e n N a m e s () D im n As Name D im C o u n t As I n t e g e r F o r E ac h n I n A c tiv e W o r k b o o k .N a m e s I f N o t n . V i s i b l e Then n . D e le te Count = C ount + 1 End I f Next n MsgBox C o u n t & " скрытых имен у д а л е н о ." End Sub Примечание К сожалению, не существует способа “отключения” имен. Другими словами, если в формуле используется имя, его нельзя преобразовать в явную ссылку на ячейку либо диапазон. Хуже того, если удалить имя, используемое в формуле, то программа не вернется к обычному способу адресации ячейки или диапазона ### и выведет сообщение об ошибке #имя?. Воспользуйтесь разработанной мною настройкой Power Utility Рак, в состав которой входит утилита, сканирующая все формулы в выделенной области, автоматически заменяя имена адресами ячеек. Глава 3. Особенности формул 85 Пересечение имен В программе Excel существует специальный оператор пересечения. Он вступает в действие, когда возникает необходимость в управлении несколькими диапазонами яче­ ек. Этим оператором является символ пробела. Используя оператор пересечения вместе с именами, можно легко создавать достаточно содержательные формулы. Для наглядно­ го примера обратитесь к рис. 3.2. Если в ячейку ввести такую формулу: =Квартал2 Юг то результатом будет 7015 — пересечение диапазонов Кварта л 2 и Юг. Присвоение имен столбцам и строкам Программа Excel предоставляет возможность присваивать имена отдельным строкам и столбцам. В последнем примере имя Квартал 1 присвоено диапазону ВЗ:В6. Однако это имя можно присвоить всему столбцу В, имя Квартал2 — столбцу С и т.д. То же са­ мое можно сделать и по горизонтали: имя Север поставить в соответствие строке 3, Юг — строке 4 и т.д. Оператор пересечения используется в данном случае так же, как и раньше, но теперь в рабочий лист можно добавлять другие регионы или кварталы, не изменяя при этом су­ ществующих имен. Присваивая имена столбцам и строкам, проверяйте, чтобы в самих строках и столб­ цах не было лишних данных. Помните, что если вы, например, вставите значение в ячей­ ку С7, то оно попадет в диапазон Квартал 1. Определение области действия Областью действия именованной ячейки или диапазона обычно является рабочая кни­ га. Другими словами, имя можно использовать на любом рабочем листе рабочей книги. Существует и другой вариант — создание имен, областью действия которых является рабочий лист. Для этого перед самим именем должно стоять имя рабочего листа, а за ним— восклицательный знак (например, Лист1!Продажи). Если имя применяется в том листе, для которого оно предназначено, то при обращении к нему упоминание о рабочем листе можно опустить. Впрочем, обращаться можно и к тем именам уровня ра­ бочего листа, которые определены в другом листе. В таком случае перед выбранным именем следует добавить имя рабочего листа. Диалоговое окно Диспетчер имен (Name Manager) (вызывается командой Формулы^ Определенные имена^Диспетчер имен (Formulas^Defined Names^Name Manager)) обеспечивает идентификацию имен по их области действия (рис. 3.3). Обратите внима­ ние на возможность сортировки имен в этом диалоговом окне. Например, достаточно щелкнуть на заголовке столбца Область (Scope), и будет выполнена соответствующая сортировка. Присвоение имен константам Каждый опытный пользователь Excel знает, как создавать имена ячеек и диапазонов (хотя не все пользователи Excel применяют это на практике). Заметим, что, кроме всего прочего, имена можно применять для обращения к значениям, которые не встречаются в рабочем листе (т.е. для обращения к константам). Часть I. Введение в Excel 86 Предположим, в нескольких формулах рабочего листа используется конкретное зна­ чение процентной ставки. Вы можете вставить это значение в ячейку и дать ему имя (например, С тавка), чтобы впоследствии применять его в своих формулах. Например, обратимся к нему в следующей формуле: = С т а в к а *А З И И ИВ) Фильтр ’ | [д ис пе тче р имен £оздать».. j йзнемить... J Удалить 1Диатазом Имя j Область j Лр <ЮВосток ШЗапад {Я Ъ509Я;Я8321Я;Я 90". =ЛистЗ!$В$5:$Е$5 Книга {”7903"; *6968"; "77,.. = ПистЗ' S£?S6: SES6 Книга О кваотал ! <DКвартал2 {"в909':,81б8':’85... Гб858*:"7015*:*83... =Лист 3* SBS3: SBS6 Книга =ЛистЗ! $С$3: $С$6 Книга ШКварталЗ {’а204":ж7387":,90... =ЛисгЗ! $D£3: Ю$б Книга <31)Квартал4 ШСевер n 9 8 7 “:"6812“:"66.r =ЛисгЗ! $Е$3: $Е$б Книга f6 9 0 9 ’ ;"6858*;*82... =ЛистЗ? $8$3: $Е$3 Книга 133 Таблица 1 {"Январь"; "Вашинг... =/1ист2! $Д$2: $D$8 Книга <1)Юг f8168*;*7015,,;*73... =ЛистЗ<|8$4:$Е$4 Книга I 1 Диапазон: J | =лист3|$8$3:$8$6 ш Закрыть .........: r ~ : r : k Рис. 3.3. Диспетчер имен отображает область действия для каж­ дого определенного имени Существует и другой способ— открыть диалоговое окно Создание имени (New Name) и ввести значение процентной ставки в поле Диапазон (Refers То) (рис. 3.4). Для открытия этого окна выполните команду Формулы ^Определенные именам Присвоить имя (Formulas ^Defined Names^Define Name). Затем назначенное процентной ставке имя можно использовать в формулах так, как если бы оно хранилось в ячейке. В случае изменения процентной ставки всего лишь измените определение имени Ставка — и все ячейки, в которых оно содержится, будут обновлены. Зй ш и я м ШШЯЯШВШ JtlJd Ставка Область: Книга - - з Примечание: щ . ш __ я Диапазон: =0,0725 ОК | Отмена J А Рис. 3.4. В Excel можно присваивать имена константам, причем эти име­ на не отображаются в ячейках рабо­ чего листа Глава 3. Особенности формул 87 Совет О Данный прием также используется для текстовых данных. Например, можно определить имя МКП для значения М еж дународная К о р п о р ац и я П р о с т а ­ ко в . После этого введите в ячейку формулу =мкп, и вместо нее отобразится полное название. Присвоение имен формулам Имена можно присваивать не только ячейкам, диапазонам и константам, но и форму­ лам. Важно также понимать, что именованная формула, как упоминалось выше, задается не в ячейке, а в оперативной памяти. Вы также вправе ввести формулу в поле Диапазон (Refers То) диалогового окна Создание имени (New Name). •к Примечание А теперь минутку внимания. Введенная вами формула имеет относительные ссылки, если рассматривать ее с точки зрения ячейки, в которой она нахо­ дится (активной ячейки). На рис. 3.5 показана формула (=А1^В1), введенная в поле Диапазон (Refers То) диа­ логового окна Создание имени (New Name). В этом случае активна ячейка С1, поэтому формула обращается к двум ячейкам, которые находятся левее (обратите внимание, что ссылки на ячейки являются относительными). Если после определения имени ввести в какую-либо ячейку формулу =С тепень, то значение, находящееся на две ячейки левее, будет возведено в степень, указанную в ячейке слева. Например, если в ячейках В 10 и СЮ находятся соответственно 3 и 4, то ввод следующей формулы в ячейку D10 приве­ дет к выводу значения, равного 81 (3 в 4-й степени): =Степень А 1 В 3 С 2 2 3 4 5 6 | D Е F G Н 1! J • Щ-X? I| iаl l Имя: --------- Степень Область: Примечание: & Диапазон: jJ i 7 8 9 10 11 12 щ | ок | о™ » 1 13 14 Рис. 3.5. Формуле можно присвоить имя, которое не отображается на рабочем листе Открыв после создания именованной формулы диалоговое окно Диспетчер имен (Name Manager), вы обнаружите, что в столбце Диапазон (Refers То) отображается фор­ мула, которая является относительной для активной ячейки. Например, если активна ячейка D32, то в столбце Диапазон появится следующая формула: =Лист1 ! В 3 2 а Л и с т 1 ! С32 Часть I. Введение в Excel 88 Обратите внимание, что в ссылки добавлено имя рабочего листа. Таким образом, ес­ ли именованную формулу использовать за пределами рабочего листа, в котором она оп­ ределена, то ее значения могут быть неправильными. Если же требуется применить име­ нованную формулу в ином листе, чем Лист1, то из формулы придется удалить все ссыл­ ки на лист (однако сохранив восклицательные знаки). Пример приводится ниже. =!А1а !В1 Разобравшись с именованными формулами, вы, возможно, найдете для них новое применение. Неоспоримое преимущество наблюдается в том случае, если в формулу не­ обходимо внести изменения. Можно просто изменить определение формулы, а не редак­ тировать каждый ее экземпляр на рабочем листе. Компакт-диск На прилагаемом компакт-диске содержится рабочая книга с несколькими при­ мерами именованных формул. Эта книга называется named formulas.xlsx. Совет О В диалоговом окне Создание имени (New Name) поле Диапазон (Refers То) обычно находится в режиме указателя. В этом случае облегчается ввод ссылки на диапазон — достаточно щелкнуть на рабочем листе. После нажатия клави­ ши <F2> происходит переключение в режим редактирования, в котором мож­ но редактировать формулу с помощью клавиш управления курсором. Что представляют собой имена ячеек и диапазонов Опытные пользователи Excel часто говорят об именованных диапазонах и имено­ ванных ячейках. В данной главе мы часто употребляем эти термины. Однако эта терми­ нология не совсем точна. Итак, откроем секрет, чем же в действительности являются имена. Создавая в Excel имя для ячейки или диапазона ячеек, вы на самом деле создаете именованную формулу, т.е. формулу, которой нет в ячейке. Именованные форму­ лы находятся не в ячейках, а в буфере Excel. Когда вы работаете в диалоговом окне Создание имени (New Name), то в поле Диа­ пазон (Refers То) отображается формула, а в поле Имя (Name) — ее название. Примеча­ тельно, что содержимое поля Диапазон (Refers То) всегда начинается знаком равенст­ ва — он и делает содержимое поля формулой. Если вы будете помнить этот “секрет” , вам несложно будет разобраться в действи­ ях, происходящих при создании и использовании имен в рабочих книгах. Присвоение имен объектам Разрешается присваивать содержательные имена не только ячейкам и диапазонам, но и таким объектам, как, например, сводные таблицы и фигуры. К ним будет проще обра­ щаться, особенно в коде VBA. Для изменения имени объекта, не являющегося диапазоном, воспользуйтесь полем Имя (Name), которое находится в левой части строки формул. Просто выделите объект, введите новое имя в поле Имя и нажмите клавишу <Enter>. Глава 3. Особенности формул 89 Примечание Чтобы введенное вами имя не исчезло, недостаточно щелкнуть на рабочем листе после ввода имени в поле Имя. Обязательно нажмите клавишу <Enter>. В силу некоторых соображений при работе в Excel не допускается применение поля Имя для переименования диаграммы. Для этого служит команда Работа с диаграммами^Макет^Свойства^Имя диаграммы (Chart Tools^Layout^Properties^Chart Name). Ошибки в формулах Excel Нередко бывает так, что, введя формулу, вы в ответ получаете значение, которое со­ общает об ошибке. Формулы возвращают такое значение, если в ячейке, на которую они ссылаются, находится ошибочное значение. Это называется цепной реакцией — единст­ венное ошибочное значение вызывает образование целого ряда ошибочных значений в других ячейках, в которых содержатся формулы, зависящие от ячейки с исходным зна­ чением. Инструменты, которые помогают отслеживать источники ошибок в формулах, находятся в группе Формулы ^Зависимости формул (Formulas1^ Formula Auditing). В табл. 3.2 перечислены значения — сообщения об ошибках, которые могут появить­ ся в ячейках с формулами. Таблица 3.2. Типичные ошибки в формулах Excel Сообщение об ошибке Описание #д е л / о ! В формуле предпринимается попытка деления на нуль (эта операция запре­ щена законами математики). Подобное сообщение появляется и в том слу­ чае, когда в формуле осуществляется деление на содержимое пустой ячейки Формула ссылается (прямо или косвенно) на ячейку, в которой используется функция рабочего листа, для которой недоступны исходные данные. Кроме того, значение # н / д возвращается функцией п р о с м о т р , которая не смогла найти значение В формуле используется имя, которое неизвестно программе Excel. Это происходит в том случае, когда определенное в формуле имя удалено или в тексте не совпадает количество открывающих и закрывающих кавычек В формуле применяется пересечение двух диапазонов, которые на самом деле не пересекаются (об этом рассказывалось ранее) Проблема связана с аргументом функции; например, если функция к о р е н ь пытается вычислить квадратный корень отрицательного числа. Это сообще­ ние об ошибке также появляется в том случае, когда вычисляемое значение слишком велико или мало. Программа Excel не поддерживает ненулевые значения, которые по модулю меньше, чем 1Е-307, либо больше, чем 1Е+308 В формуле определена ссылка на недопустимую ячейку. Это может произой­ ти в том случае, когда ячейка удалена из рабочего листа В формуле имеется аргумент либо операнд некорректного типа. Операнд — это значение (или ссылка на ячейку), используемое формулой для вычисления результата. Кроме того, такая ошибка появляется в том случае, когда в форму­ ле имеется пользовательская VBA-функция, которая также содержит ошибку Эти символы отображаются в ячейке в следующих двух случаях: столбец не­ достаточно широк для отображения результата и формула возвращает отри­ цательные значения даты или времени # н /д #имя? #пусто ! #число! #ссыл! #знач ##### ! Часть I. Введение в Excel 90 Формулы массивов Массив — это коллекция ячеек или значений, которой управляют как единым целым. Формулой массива является формула специального вида, которая обрабатывает массивы данных. Результатом выполнения формулы массива может быть как единичный резуль­ тат, так и набор значений, причем каждое из них помещается в отдельную ячейку (Excel допускает расположение в одной ячейке только одного значения). Например, если вы умножаете массив размером 1x5 на массив размером 1x5, то в ре­ зультате получаете массив, который имеет размер 1x5. Другими словами, результат вы­ полнения подобной операции занимает пять ячеек рабочего листа; каждый элемент пер­ вого массива умножается на соответствующий элемент второго массива. Вы получите пять новых значений, каждое из которых будет занимать собственную ячейку. Следую­ щая формула массива умножает значения массива А1:А5 на соответствующие значения массива В1:В5. Такая формула должна вводиться одновременно в пять ячеек. {= А 1 : А 5 * В 1 : В 5 } Примечание Формула массива вводится после нажатия комбинации клавиш <Ctrl+Shift+ Enter>. Для указания того, что в строке формул содержится формула массива, используются фигурные скобки, в которые она заключена. Именно таким об­ разом будут выделяться формулы массивов, представленные в этой книге. При самостоятельном вводе формул массивов фигурные скобки не нужны. Пример формулы массива В Excel с помощью формул массивов можно выполнять отдельные операции над ка­ ждой ячейкой диапазона, причем во многом таким же образом, как и посредством цик­ лических структур языка программирования. Если вам еще не приходилось использовать формулы массивов, то внимательно рассмотрите описанный далее пример. На рис. 3.6 представлена электронная таблица с текстом в ячейках А1:А5. Цель дан­ ного упражнения состоит в том, чтобы создать единственную формулу, которая возвра­ тит сумму, равную общему количеству символов в этом диапазоне. Если не требовать выполнения этой задачи с помощью единственной формулы, то можно создать формулу с функцией ДЛСТР, скопированной во все ячейки столбца В, а затем с помощью функции СУММ сложить результаты промежуточных формул. В1 - ш 2 4.А кролик койот j n перепелка 4 олень Л * пекари - (* ' *]{=СУММ(ДЛСТР(А1:А5))} шшхыь ^ ш т в ш i .1 , 1 .'-«'.’ ...4 а 31 31 31 31 6 JL А Рис. 3.6. В ячейке В1 находится формула массива, которая возвращает общее число символов, содержащихся в диапа­ зоне А1 :А5. Обратите внимание на скобки в строке формул Глава 3. Особенности формул 91 Для того чтобы убедиться в том, что формула массива может занимать несколько ячеек, создайте рабочий лист, показанный на рис. 3.6, а затем выполните следующие действия. 1. Выделите диапазон ячеек В1:В5. 2. Введите следующую формулу: =ДЛСТР(А 1 :А 5 ) 3. Нажмите комбинацию клавиш <Ctrl+Shift+Enter>. Эти действия выполняются для введения единственной формулы в пять ячеек. Затем введите формулу СУММ, которая складывает длины значений из ячеек В1:В5, и тогда вы увидите, что в ячейках А1:А5 находится всего 31 символ. Главное в этом примере то, что полученные пять элементов массива в ячейках В1:В5 отображать не обязательно, так как массив может храниться в памяти. Помня об этом, вы вправе в любую пустую ячейку ввести следующую формулу (обязательно с помощью комбинации клавиш <Ctrl+Shift+Enter>): {=СУММ (ДЛСТР ( А 1 : А 5 ) ) } Указанная формула создает (в памяти) массив из пяти элементов, которыми являются значения длины каждой строки массива, расположенного в ячейках А1:А5. Этот массив значений используется в качестве аргумента функции СУММ — и в результате формула возвращает значение 31. Создание календаря с помощью формулы массива На рис. 3.7 показан рабочий лист с календарем для любого месяца. Календарь созда­ ется с помощью единственной формулы массива, которая занимает 42 ячейки. Формула массива, введенная в ячейки В5:Н10, имеет следующий вид. (=ЕСЛИ (МЕСЯЦ (ДАТА (ГОД (ВЗ) ;МЕСЯЦ(ВЗ) ; 1) ) оМ Е С Я Ц (ДАТА (ГОД (В3 ) ; М ЕСЯЦ(ВЗ); 1 ) - (Д Е Н Ь Н Е Д (Д А Т А (Г О Д (В З );М Е С Я Ц (В З );1 )) - 1 ) + { 0 : 1 : 2 : 3 : 4 : 5 } * 7 + { 1 ; 2 ; 3 ; 4 ; 5 ; 6 ; 7 } - 1 ) ; " " ; Д А ТА ( Г О Д (В З ) ; М ЕСЯЦ(ВЗ); 1 ) - (Д Е Н Ь Н Е Д (Д А Т А (Г О Д (В З );М Е С Я Ц (В З ) ; 1 ) ) . 1) + { 0 :1 : 2 : 3 : 4 : 5 } * 7 + { 1 ; 2 ; 3 ; 4 ; 5 ; 6 ; 7 } - 1 ) } Формула возвращает набор последовательных числовых значений, соответствующих датам, поэтому для корректного отображения дат следует отформатировать ячейки с по­ мощью пользовательского числового формата (“d”). ГЧ Компакт-диск № ц На прилагаемом компакт-диске находится рабочая книга с примером календаря, а также ряд других примеров формул массивов. Соответствующий файл называется array examples .xlsx. Помимо этого, на компакт-диске находится рабочая книга yearly calendar .xlsx, которая реализует пол­ ный календарь на весь год. Достоинства и недостатки формул массивов Ниже перечислены преимущества формул массивов в сравнении с формулами для одной ячейки: • зачастую требуют меньше памяти; • позволяют выполнять вычисления намного эффективнее; 92 Часть I. Введение в Excel • не требуют промежуточных формул; • предоставляют возможность выполнять операции, которые реализовать по-другому трудно или вообще невозможною. В ! С D Пн Вт JL 2 3 4 Е f G Н Чт Пт Сб 1 2 3 8 9 10 I Июль, 2010 Вс Ср 5 6 4 7 11 8 18 9 25 26 5 6 7 12 13 14 15 16 17 19 20 21 22 23 24 27 28 29 30 31 10 11 12 13 14 15 Рис. 3.7. С помощью единственной формулы массива можно создать календарь, отображающий любой месяц любого года Впрочем, у формул массивов имеются и недостатки: • некоторые формулы существенно замедляют пересчет электронной таблицы; • мешают другим пользователям разобраться в созданной вами таблице; • формула массива вводится с помощью специальной комбинации клавиш <Ctrl+ Shift+Enter>. Подсчет и суммирование Довольно часто пользователям Excel приходится выполнять задачи, заключающиеся в условном подсчете или суммировании. В этом разделе приведен ряд примеров удобных формул, с помощью которых выполняется подсчет различных данных рабочего листа на основе одного или нескольких критериев. Эти формулы достаточно гибкие и легко могут быть адаптированы под нужды конкретного пользователя. П р и м ечан ие В Excel 2007 появились две новые функции подсчета и суммирования, кото­ рые отсутствовали в предыдущих версиях: с ч ё т е с л и м н (COUNTIFS) и с у м м е с л и м н (SUMIFS). Поэтому в книге будут представлены два варианта одних и тех же формул: версия для Excel 2007 и версия для формулы массива, ко­ торая работает во всех предыдущих версиях Excel. На рис. 3.8 показан простой рабочий лист, демонстрирующий формулы подсчета и суммирования в действии. Определены следующие имена диапазонов: • М есяц — А2:А10; • Р еги о н • Продажи — В2:В10; — С2:С10. Глава 3. Особенности формул D С Е 93 F 1 н О писание Север 100 3 Количество продаж п о региону 3 Январь Юг 200 2 Количество продаж с суммой=300 4 Январь Запад 300 2 Количество продаж с суммой>300 5 Февраль Север 150 8 Количество продаж с сум м о й <>100 6 Февраль Юг 250 6 7 Февраль Запад 350 3 Количество регионов, в названиях которых буква "с” 2 Январь G В с0 в в р ск и 8 Март 9 Март 10 Март 200 1 Юг 300 1 Запад 400 Север И 12 Количество регионов, в названиях которых есть 5 букв 1 Количество продаж в м еся це "Январь" и суммой>200 1 Количество продаж в м еся це "Январь" в регионе "Север" 2 2 Количество продаж в м есяце "Январь" в регионах "Север" ли б о "Юг” 4 4 Количество продаж, сум м а которых находится м еж д у 300 и 400 13 Г Все 14 15 версии 1,600 С ум м а по продаж ам, б о льш им 300 16 600 Сум м а по продаж ам в м еся це "Январь" 17 1,350 С ум м а по продаж ам в месяцах “Январь" и "Ф евраль” 18 19 100 100 С ум м а по продаж ам в м еся ц е "Январь” в р егион е "Север" 500 500 С ум м а по продаж ам в м еся ц е "Январь” в регион е о "Север" 20 500 21 1,350 500 С ум м а по продаж ам >=200 в м еся ц е "Январь" 1,350 Сум м а по продаж ам, величины которых находятся м еж ду 300 и 400 1 Ж Рис. 3.8. Этот простой рабочий лист демонстрирует некоторые полезные формулы подсчета и суммирования Компакт-диск Эта рабочая книга (включая примеры формул) доступна на прилагаемом компакт-диске (в файле c o u n t i n g a n d summ ing e x a m p le s . x l s x ) . Примеры формул подсчета В табл. 3.3 представлены формулы, которые демонстрируют различные методы подсчета. Таблица 3.3. Примеры формул подсчета Формула =СЧЁТЕСЛИ (R e g io n ; "С е в е р " ) Описание Подсчет строк, для которых выполняется условие R e g io n = "Север" =СЧЁТЕСЛИ (S a le s ; 3 00 ) Подсчет строк, для которых выполняется условие S a le s = 300 =СЧЁТЕСЛИ (S a le s ; " >3 00 ") Подсчет строк, для которых выполняется условие S a le s > 300 =СЧЁТЕСЛИ (S a le s ; " < > Ю 0 " ) Подсчет строк, для которых выполняется условие S a le s <> 100 Подсчет строк, в которых название региона состоит из пяти букв =счётесли ( R e g io n ; " * с * ") Подсчет строк, в которых в названии региона имеется буква ‘С’ (формула нечувствительна к регистру символов) =СЧЁТЕСЛИМН (M o nth ; Подсчет строк, В которых M onth = "Январь" и S a le s > "Январь"; S a l e s ;" >200 ") 200 (только для Excel 2007 и более поздних версий) {=сумм ( (Month= "Я нварь") * Формула массива, которая подсчитывает строки с услови(Sales>200) ) } ем M onth = "Январь " и S a le s > 200 =СЧЁТЕСЛИМН (M o n th ; Подсчет строк, В которых M onth = "Январь" и R e g io n = "Январь"; R e g io n ;" С ев ер ") ис е в е р " (только для Excel 2007 и более поздних версий) =счётесли (R e g io n ;" ? ? ? ? ? " ) Часть I. Введение в Excel 94 Окончание табл. 3.3 Формула Описание {=С УМ М ((M o n th = "Я нварь") ( R e g i o n = " C e B e p " )) } Формула массива, которая подсчитывает строки с услови­ ем M o n t h = " Я н в а р ь " и R e g i o n = " С е в е р " Подсчет строк, для которых выполняется условие M o n t h = " Я н в а р ь " и R e g i o n = " С е в е р " либо "Юг" (только ДЛЯ Excel 2007 либо более поздних версий) =СЧЁТЕСЛИМН(M o n th ; "Январь " / R e g io n ; С евер 11)+ СЧЁТЕСЛИМН(M o n th ; "Я нварь" ; R e g io n ; "Ю г") { =СУММ( (M o n th = "Я нварь' ) * ( (R e g io n = " С е в е р ")+ (R e g io n = " I0 r" ) ) ) } =СЧЁТЕСЛИМН( S a le s ; " > = 3 0 0 " ; S a l e s ; "< = 4 0 0 " ) {=С УМ М (( S a l e s > = 3 0 0 ) * ( S a l e s < = 4 0 0 )) } Формула массива, которая подсчитывает количество строк с условием M o n th = "Я н в а р ь " и R e g i o n = "С е в е р " либо "Юг" Подсчет строк, в которых значение переменной S a l e s на­ ходится между 300 и 400 (только для Excel 2007 либо более поздних версий) Формула массива, которая подсчитывает строки, в которых значение параметра S a l e s находится между 300 и 400 Примеры формул суммирования В табл. 3.4 приведены примеры формул, демонстрирующих различные методы сум­ мирования. Таблица 3.4. Примеры формул суммирования Формула Описание Сумма по всем продажам, превышающим 200 =СУММЕСЛИ( M o n t h ; " Я н в а р ь " ; Сумма по всем продажам, для которых M o n t h =СУММЕСЛИ(S a l e s ; " Ц 0 0 " ) S a le s ) =СУММЕСЛИ( M o n t h ; "Я нварь"; S a l e s ) +СУММЕСЛИ (M o n th ; "Ф евраль" ; S a l e s ) =СУММЕСЛИМН(Продажи; М есяц; "Я нварь" ; Р е г и о н ; " С ев ер ") "Я нварь" Сумма по всем продажам, для которых M o n t h = " Я н в а р ь " или " Ф е в р а л ь " Сумма продаж, для которых M o n t h = " Я н в а р ь " и Р е г и ­ он = " С е в е р " Сумма продаж, для которых M o n th =" Я н в а р ь " и R e g i o n = "С е в е р " (только для Excel 2007 либо более поздних версий) {= СУММ ((M o n th = " Я н в а р ь " ) * Формула массива, которая возвращает сумму продаж, для (R eg io n = "C e B ep ") * S a l e s ) } KOTOpbixMonth = " Я н в а р ь " и R e g i o n = " С е в е р " =СУММЕСЛИМН( S a l e s ; M on th ; Сумма продаж, для которых M o n th = " Я н в а р ь " и R e g i o n <> "Я н в а р ь " ; R e g i o n ; " о С е в е р " ) "С е в е р " (только для Excel 2007 либо более поздних версий) {=СУММ(( M o n th = " Я н в а р ь " ) * Формула массива, которая возвращает сумму продаж, для ( R e g i o n o " C e B e p " ) * S a l e s ) } KOTOpbixMonth = " Я н в а р ь " и R e g i o n <> " С е в е р " =СУММЕСЛИМН( S a l e s ; M o n t h ; Сумма продаж, для которых M o n th = " Я н в а р ь " и S a l e s >= " Я н в а р ь " ; S a l e s ;">=2 0 0 " ) 200 (только для Excel 2007 либо более поздних версий) {=СУММ (( M o n th = " Я н в а р ь " ) * Формула массива, которая возвращает сумму продаж, для ( S a l e s > = 2 0 0 ) * ( S a l e s ) )} KOTOpbixMonth = " Я н в а р ь " и S a l e s >= 200 =СУММЕСЛИМН(S a l e s ; S a l e s ; Сумма продаж, величины которых находятся между 300 и " > = 3 0 0 " ; S a l e s ; "< =400") 400 (только для Excel 2007 либо более поздних версий) {= СУММ (( S a l e s > = 3 0 0 ) * Формула массива, возвращающая сумму продаж, величины ( S a l e s < = 4 0 0 ) * ( S a l e s ) )} которых находятся между 300 и 400 =СУММЕСЛИМН ( S a l e s ; M o n t h ; " Я н в а р ь " ; R e g i o n , " С е в е р ") Глава 3. Особенности формул 95 Другие инструменты подсчета Ниже перечислены дополнительные способы подсчета количества или суммирования содержимого ячеек, удовлетворяющих определенным критериям: • фильтрация (с помощью таблиц); • расширенная фильтрация; • применение функций БСЧЁТ (DCOUNT) и БДСУММ (DSUM); • работа со сводными таблицами. ^ Для получения дополнительных сведений обратитесь к справочной системе. Работа со значениями даты и времени Для хранения значений даты в Excel применяется система последовательной нумера­ ции. Самой ранней датой, которую “понимает” программа Excel, является 1 января 1900 года. Этой дате соответствует число 1. Дата “2 января 1900 года” равна следующему значению числовой последовательности — 2 и т.д. Вам не придется анализировать, каким же числом представлена интересующая вас дата. Достаточно ввести дату в привычном формате, a Excel позаботится о ее корректной обработке. Например, если требуется задать 15 августа 2010 года, то просто введите 1 5 а в г у с т а 2 0 1 0 г (или используйте другой стандартный формат представления даты). Программа Excel интерпретирует введенные данные и сохранит их в виде значения 40405, которое и является числовым значением для указанной даты. Примечание В этой главе даты представлены в формате, характерном для русской вер­ сии Excel 2010. Он несколько отличается от принятого в США (и в англий­ ской версии Excel) формата Ьредставления дат. Например, в США эта же да­ та записывается в виде August 15, 2010. Ввод значений даты и времени Работая со значениями времени, вы вводите в ячейку одно из них, пользуясь для это­ го одним из стандартных форматов. Система представления даты, применяемая в Excel, заключается в расширенном форматировании. При этом в него добавляется дробная часть, которая обозначает долю суток, отмеренную введенным временем. Другими сло­ вами, Excel представляет время, пользуясь для этого той же системой, что и при пред­ ставлении дат, независимо от того, в каких единицах измеряется это время: в часах, ми­ нутах или секундах. Например, числовое значение даты “15 августа 2010 года” — 40405. А вот полдень (середина суток) представлено значением 40405,5. Заметьте, что вам не потребуется вводить дробные числовые значения для определенного времени суток. Поскольку дата и время хранятся в виде числовых значений, над ними допускается выполнять любые вычисления. Например, можно ввести формулу для подсчета количе­ ства дней между двумя датами. =А2 - А1 Часть I. Введение в Excel 96 Совет Когда дело доходит до подсчета времени, ситуация усложняется. Если вре­ мя вводится без даты, в качестве даты берется 0 января 1900 года (соответствует значению 0). Это не проблема, если только в результате под­ счетов не получится отрицательное значение времени. В подобном случае Excel выведет сообщение об ошибке (в виде #########). Что делать в такой ситуации? Перейти к формату дат 1904 года. Перейдите в диалоговое окно Параметры Excel (Excel Options), выберите раздел Дополнительно (Advanced) и установите флажок Использовать систему дат 1904 (Use 1904 Date System). Не забывайте, что переход к этой системе может привести к неадекватному толкованию дат, ранее введенных в текущий рабочий лист или в связанные рабочие книги. О Совет Иногда значения времени используются для представления длительности времени. Например, может возникнуть необходимость подсчитать количе­ ство рабочих часов в неделе. При складывании значений времени обнару­ живается, что нельзя получить значение, которое больше 24 часов. Для каж­ дого 24-часового периода Excel добавляет к дате еще один день. Решить данную проблему можно путем изменения числового формата — выделите квадратными скобками ту часть значения, в которой указано количество ча­ сов. Например, ниже представлен числовой формат, в котором может ото­ бражаться более 24-х часов. [ ч ч ]:м м Использование дат до 1900 года Как вы понимаете, мир начал свое существование не с 1 января 1900 года. И тем, кто использует Excel для работы с исторической информацией, часто приходится иметь дело с датами, намного более ранними, чем 1 января 1900 года. К сожалению, для управления та­ кими датами подходит только один способ — их необходимо вводить в ячейку, как текст. Например, Excel не будет против, если в ячейку вы введете дату 4 июля 1776 года. Впрочем, над датами, введенными, как текст, нельзя выполнять никаких операций. На­ пример, изменить формат даты вы не сможете, как не сможете определить день недели, на ко­ торый эта дата приходится, а также подсчитать дату, отстоящую от текущей на семь дней. Но все не так уж и печально, поскольку в VBA поддерживается расширенный набор дат. Я воспользовался рядом функций рабочего листа VBA, которые могут работать с датами до 1900 года. Результаты применения этих функций показаны на рис. 3.9. Перед вами превосходный пример расширения возможностей Excel с помощью VBA. Перекрестная ссылка Дополнительные сведения по работе с дополнительными функциями дат можно найти в главе 10. Создание мегаформул Зачастую для получения необходимого результата в электронных таблицах исполь­ зуются промежуточные формулы, т.е. формула может зависеть от других формул, кото­ рые, в свою очередь, зависят от еще каких-либо формул. Добившись, чтобы все они ра­ Глава 3. Особенности формул 97 ботали правильно, вы получите возможность удалить промежуточные формулы и при­ менить вместо них единственную формулу, которая называется мегаформулой. Каковы ее преимущества? Используется меньше ячеек (и, следовательно, рабочий лист не так за­ громожден), а также данные пересчитываются быстрее. Основной недостаток заключа­ ется в том, что такую формулу совершенно невозможно понять или изменить. А С В D Е F G Н f Кол-во дней Кол-во лет День недели т ..... 1 Эт а рабочая кни га вклю чает восемь ф ункций VBA, 2 кот орые м огут р аб от ат ь с д а т а м и до 190 0 года. 4 Примеры: дни рождения президентов США 5 6 Президент Год Месяц День День рождения 7 Дж ордж Вашингтон 1732 2 22 22 февраля, 1732 101,678 278 8 Дж он Адам с 1735 10 30 30 октября, 1735 100,332 274 Воскресенье 9 Томас Джефферсон 1743 4 13 13 апреля, 1743 97,610 267 Суббота Пятница Вторник 10 Дж еймс М эдисон 1751 3 16 16 марта, 1751 94,716 259 11 Дж еймс М о н р о 1758 4 28 28 апреля, 1758 92,116 252 Пятница 12 Джон Иуинси Адам с 1767 7 11 11 июля, 1767 88,755 243 Суббота 13 Эндрю Д ж ексон 1767 3 15 15 марта, 1767 88,873 243 Воскресенье 14 Мартин Ван Бюрен 1782 5 декабря, 1782 83,129 227 Четверг 1773 12 5 15 Уильям Генри Гаррисон 2 9 9 ф е в р ал я ,1773 86,715 237 Вторник 16 Джон Тайлер 1790 3 29 29 марта, 1790 80,458 220 Понедельник 17 Дж еймс Нол к Полк 1795 11 2 2 ноября, 1795 78,414 214 П онедельник 18 Закари Т ей лор 1784 11 24 24 ноября, 1784 82,409 225 Среда Вторник 19 М и ллорд Ф ил м о р 1800 1 7 76,887 210 20 Франклин Пирс 1804 11 23 23 ноября, 1804 75,106 205 Пятница 21 Дж еймс Бью кенен 1791 4 23 23 апреля, 1791 80,068 219 Суббота 22 Авраам Л инкольн 1809 2 12 12 февраля, 1809 73,564 201 Воскресенье 23 Эндрю Дж онсон 1808 12 29 29 декабря, 1808 73,609 201 Четверг 24 Улисс Симпсон Грант 1822 4 27 27 апреля, 1822 68,742 188 Суббота 7 января, 1800 Рис. 3.9. Дополнительные функции для работы с датами позволяют работать с датами до 1900 года Рассмотрим пример. Представьте себе рабочий лист со столбцом, в котором перечис­ лены имена (и фамилии) людей. Предположим, что из этих имен с фамилиями следует убрать все вторые имена и инициалы. Однако не у всех людей в списке есть такие имена и инициалы. На редактирование ячеек вручную уйдут многие часы работы, причем даже команда Excel Данные1^Работа с данными^Текст по столбцам (Data^Data Tools^ Convert Text to Table) не особо поможет. Поэтому необходимо прибегнуть к помощи формул. Данная задача не так уж и трудна, но для ее решения обычно требуется исполь­ зовать несколько промежуточных формул. На рис. 3.10 представлен результат довольно удачного решения — применено шесть промежуточных формул, перечисленных в табл. 3.5. Имена с фамилиями находятся в столбце А, а конечный результат — в столбце Н. Что же касается столбцов В-G, то в них как раз и содержатся промежуточные формулы. D 2 Е F И Я 1 Иван Иванов Иван Иванов 5 Н G Ф о рм ул а 6 Результат ЙЗНАЧ! 5 Иван Иванов Иван Иванов Степан Степанов 3 Степан П. Степанов Степан П. Степанов 7 10 10 Степан Степанов 4 Р эм Ильич Иванов 4 10 10 Рэм Иванов Р эм Иванов 5 Сэм Иванович Иванов С э м Иванович Иванов 4 13 13 Сэм Иванов С э м Иванов 6 Джон И. Бартер Д ж он И. Бартер 5 8 8 Дж он Бартер Д ж он Бартер 7 Р.Дж Смит Р.Дж См ит 5 #ЗНАЧ! 5 Р-Дж См ит Р. См ит Р. Смит Тим Д ж он с Тим Дж онс Рэм Ильич Иванов 8 Р. Джей Смит Р. Д ж ей См ит 3 9 Т им Д ж онс 4 Тим Джонс 8 #ЗНАЧ! 8 4 1I Р.Дж Смит 10 11 Рис. 3.10. Для удаления отчества и инициалов потребуется шесть промежуточных формул 43ак. 3107 98 Часть I. Введение в Excel Таблица 3 .5. Промежуточные формулы, введенные в столбцах B:G Столбец Промежуточная формула Выполняемые функции В D =СЖПРОБЕЛЫ (А2) =НАЙТИ ( 11 " , В2 , 1) =НАЙТИ(" " , В2, С2+1) Е =ЕСЛИ(ЕОШИБКА(D2) , С2, D2) F G Н =ЛЕВСИМВ(В2,С2) =ПРАВСИМВ(В2, LEN(В2) -Е2) =F2&G2 Удаляет лишние пробелы Находит первый пробел Находит второй пробел. Возвращает значение #ЗНАЧ! в случае отсутствия второго пробела Использует первый найденный пробел, если неуайден второй Выделяет имя Выделяет фамилию Объединяет два имени с Можно избавиться от всех промежуточных формул, создав мегаформулу. Для этого выполните следующее: создав промежуточные формулы, перейдите к конечной резуль­ тирующей формуле и замените в ней каждую ссылку на ту или иную ячейку копией фор­ мулы, которая в этой ячейке находится (копия вводится без знака равенства). К счастью, для копирования и вставки можно использовать буфер обмена. Повторяйте эти действия до тех пор, пока в ячейке Н2 не исчезнут все ссылки, кроме ссылок на ячейку А2. В ко­ нечном итоге у вас в одной ячейке получится следующая мегаформула. =Л ЕВСИ М В(СЖ П Р О БЕЛ Ы (А2 ) , НАЙТИ (" " , С Ж П Р О Б Е Л Ы ( А 2 ) , 1 ) ) &П Р А В С И М В (С Ж П Р О Б ЕЛ Ы (А 2 ) , Д Л С Т Р ( С Ж П Р О Б Е Л Ы (А 2 )) - Е С Л И ( Е О Ш И Б К А (Н А Й Т И (" " , СЖПРОБЕЛЫ(А 2 ) , Н А Й Т И (" " , СЖ П Р О Б ЕЛ Ы (А2 ) , 1 ) + 1 ) ) , Н А Й Т И (" " , СЖПРОБЕЛЫ(А 2 ) , 1 ) , Н А Й Т И (" " , СЖПРОБЕЛЫ(А 2 ) , НАЙТИ (" " , СЖПРОБЕЛ Ы(А2) , 1 ) + 1 ) ) ) Убедившись, что мегаформула работает, можете удалить столбцы с промежуточными формулами, поскольку последние вам больше не понадобятся. Мегаформула выполняет те же самые задачи, что и все промежуточные формулы, од­ нако понять, как она работает, может только ее автор. Если вы собираетесь использовать мегаформулы, то перед их созданием проверьте, правильно ли работают промежуточные формулы. Или еще лучше — сохраните отдельно копию этих формул (на тот случай, ес­ ли в расчетах обнаружится ошибка или в их алгоритм потребуется внести изменения). Еще один способ решения этой проблемы заключается в создании пользовательской VBAфункции рабочего листа. Затем мегаформула заменяется следующей простой формулой: =NOM IDDLE( А 1 ) Фактически я создал функцию, которая сравнима с промежуточными формулами и мегаформулой. Ниже приводится ее листинг. F u n c t i o n N O M ID DLE(n) A s S t r i n g D im F i r s t N a m e A s S t r i n g , L a s t N a m e A s S t r i n g n = A p p lic a tio n .W o r k s h e e tF u n c tio n .T r im ( n ) F irstN a m e = L e f t ( n , I n S t r ( l , n, " ")) LastN am e = R ig h t ( n , L e n (n ) - I n S t r R e v ( n , " ")) N O M ID D LE = F i r s t N a m e & L a s t N a m e End F u n c t io n Компакт-диск Рабочая книга, которая содержит промежуточные формулы, мегаформулу и VBA-функцию n o m i d d l e , находится на прилагаемом компакт-диске. Соот­ ветствующий файл называется m e g a f o r m u l a . x l s m . Глава 3. Особенности формул 99 Сложность мегаформул наталкивает на мысль, что при их использовании вычисления могут существенно замедляться. На самом деле это не так. Создадим рабочий лист, в ко­ тором мегаформула использовалась 175000 раз. Затем создадим другой рабочий лист, в котором применено шесть промежуточных формул. Вы увидите, что мегаформула ра­ ботает существенно быстрее и создает файл намного меньшего размера (табл. 3.6). Таблица 3.6. Сравненное быстродействия в случае применения мегаформул и промежуточных формул Метод Продолжительность вы­ числения, с Размер файла, Мбайт Промежуточные формулы Мегаформула 5,8 3,9 12,6 2,95 Фактические результаты зависят от скорости системы, количества оперативной памя­ ти, а также обрабатываемой формулы. Функция VBA выполняется намного медленнее — автор прервал ее выполнение по­ сле 5 минут тестирования. Как правило, VBA-функции выполняются медленнее встроен­ ных функций Excel. Глава Файлы Excel В этой главе... ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ Запуск Excel Типы файлов Работа с файлами шаблонов Содержимое файла Excel Файл OfficeUI Файл XLB Файлы надстроек Настройки Excel в системном реестре А теперь рассмотрим, как устроены файлы Excel, и начнем с ответа на вопрос “Каким же образом можно запустить саму программу Excel?” Запуск Excel Программа Excel может запускаться по-разному в зависимости от способов ее уста­ новки: можно щелкнуть на значке, находящемся на рабочем столе, воспользоваться кнопкой Пуск (Start) либо дважды щелкнуть мышью на значке файла, связанного с при­ ложением Excel. Независимо от выбранного метода происходит запуск исполняемого файла e x c e l . ехе. После запуска Excel происходит следующее: ♦ считываются настройки, находящиеся в системном реестре Windows; ♦ считываются и применяются настройки панели быстрого доступа либо ленты, на­ ходящиеся в файле E x c e l . o f f i c e U I ; ♦ открывается файл настройки меню/панели инструментов с расширением * . x lb ; ♦ открываются все установленные надстройки (выбраны в диалоговом окне Над­ стройки (Add-Ins)); 102 Часть I. Введение в Excel • открываются все рабочие книги, находящиеся в каталоге X L S t a r t ; • открываются все рабочие книги, находящиеся в альтернативном каталоге автоза­ пуска (указывается в разделе Дополнительно (Advanced) в диалоговом окне Па­ раметры Exce^Excel Options)); • определяется наличие сбоя при последнем запуске Excel (в этом случае отобража­ ется перечень автоматически восстановленных рабочих книг); • отображается пустая рабочая книга, если только пользователь не указал открывае­ мую рабочую книгу либо один или более файлов находятся в каталоге X L S t a r t или в альтернативном начальном каталоге. Программа Excel может быть установлена в любом месте. Но в большинстве случаев исполняемый файл Excel находится в каталоге установки, заданном по умолчанию: C : \P r o g r a m F ile s \M ic r o s o f t O ff ic e \O f fic e l4 \E X C E L .E X E Можно создать один или более ярлыков, соответствующих этому выполняемому файлу, причем сами ярлыки могут быть настроены путем изменения различных парамет­ ров, которые также называются переключателями командной строки. Эти переключатели перечислены в табл. 4.1. Таблица 4.1. Переключатели командной строки Excel Переключатель имя_файла / г имя_файла / 1 имя_файла / п имя_файла /е /р /s /ш кат алог Выполняемая функция Открытие указанного файла. Параметр имя_файла не требует переклю­ чателя командной строки Открытие указанного файла в режиме чтения Открытие указанного файла в виде шаблона Открытие указанного файла в виде шаблона (аналогичен предыдущему переключателю) Запуск Excel без создания рабочей книги и без отображения всплы­ вающего экрана Выбор в качестве активного пути каталога, который отличается от ката­ лога, заданного по умолчанию Запуск Excel в безопасном режиме, который не предусматривает за­ грузку надстроек или файлов, находящихся в каталоге X L S t a r t или в альтернативных каталогах автозапуска Программа создает рабочую книгу с единственным макролистом Microsoft Excel 4.0 (устаревший объект) Можно поэкспериментировать с этими переключателями в окне, открывающемся по­ сле выполнения команды Пуск1^ Выполнить (Start^Run). Заключите путь, ведущий к выполняемому файлу Excel, в кавычки, и введите пробел и переключатель командной строки. Соответствующий пример показан на рис. 4.1. Один из способов выбора переключателя командной строки заключается в редак­ тировании свойств ярлыка, используемого для запуска Excel. Например, если у вас есть время и желание изменить каталог автозапуска на c : \ x l f i l e s , можете настро­ ить ярлык Windows. В этом случае следует указать переключатель /р , а также задать имя папки. Глава 4. Файлы Excel 103 Введите имя программы, папки, документа или ресурса Интернета, которые требуется открыть. j ш Открыть; | "C:\Program Files\M»crosoft O ffk e \O ffk e 14\EXCEL.EXEi Ф Это задание будет создано с правами администратора £ L jS L .J L Отмт j | O 6jop... J Рис. 4.1. Запуск Excel из диалогового окна Выполнить (Run) © Примечание Приведенные ниже инструкции относятся к Windows 7. Начнем со значка, используемого для запуска Excel. Щелкните на нем правой кноп­ кой мыши и в контекстном меню выберите пункт Свойства (Properties). Находясь в диа­ логовом окне Свойства ярлыка (Shortcut Properties), выберите вкладку Ярлык (Shortcut) и в поле Объект (Target) (рис. 4.2) введите следующую информацию: "C:\Program F i le s \ M i c r o s o f t O ffic e \O ffic e l4 \E X C E L .E X E " / р c : \ x l f i l e s Рис. 4.2. Настройка свойств ярлыка, приме­ няемого для запуска Excel Имейте в виду, что путь, ведущий к файлу e x c e l . ехе, может отличаться в зависи­ мости от выбранного способа установки и версии Excel. 104 Часть I. Введение в Excel Можно также определить клавишу быстрого доступа, с помощью которой запускает­ ся Excel. Если программа Excel уже выполняется, нажатие этой клавиши приведет к ее активизации. Примечание Можно одновременно выполнять несколько копий Excel на одной системе. При этом каждая копия будет интерпретироваться в качестве отдельной за­ дачи. Для беспроблемной работы следует устанавливать различные копии Excel в порядке их выпуска. Типы файлов По умолчанию в Excel 2010 используются файлы рабочих книг XLSX, но они не яв­ ляются единственными. В следующем разделе приводится обзор типов файлов, с кото­ рыми может работать Excel 2010. Примечание Начиная с версии Excel 2007 компания Microsoft не поддерживает форматы файлов электронных таблиц Lotus и Quattro Pro. Форматы файлов Excel С появлением Excel 2007 в обиход вошел новый стандартный файловый формат, ко­ торый продолжает применяться и в версии Excel 2010. Несмотря на вышесказанное две новейшие версии Excel не утратили способности считывать и изменять файлы, сохра­ ненные в более старых файловых форматах Excel. Совет Для изменения параметров сохранения файлов, заданных по умолчанию, выберите команду Файл ^Параметры Excel (File«=>Excel Options) и выберите раздел Сохранение (Save) в диалоговом окне Параметры Excel (Excel Options). В этом разделе находится раскрывающийся список, в котором можно вы­ брать файловый формат, заданный по умолчанию. В табл. 4.2 перечислены типы файлов, поддерживаемых Excel 2010. Имейте в виду, что рабочая книга Excel либо файл надстройки может иметь любое расширение. Други­ ми словами, при сохранении файлов этого типа не обязательно использовать стандарт­ ные расширения, указанные в таблице. Таблица 4.2. Форматы файлов Excel Тип файла Расширение Открытие/ Примечание Сохранение Рабочая книга Excel x ls x Да/Да Рабочая книга Excel с поддержкой макросов xlsm Да/Да Файловый формат Excel 2010, за­ данный по умолчанию. Не преду­ сматривает сохранение макросов VBA или XLM Файловый формат Excel 2010, при­ меняемый для сохранения рабочих книг с макросами Глава 4. Файлы Excel 105 Окончание табл. 4.2 Тип файла Расширение Открытие/ Примечание Сохранение Двоичная рабочая кни­ га Excel x ls b Да/Да Шаблоны x ltx Да/Да Шаблоны с поддержкой макросов x ltm Да/Да Надстройки Excel xlam Да/Да Рабочая книга Excel 97Excel 2003 x ls Да/Да Шаблоны Excel 97-Ехcel 2003 x lt Да/Да Надстройки Excel 97Excel 2003 x la Да/Да Рабочая книга Microsoft Excel 5.0/95 x ls Да/Да Электронная XML-таблица, совместимая сExcel 2003 xml Да/Да Двоичный файловый формат Excel 2010 (BIFF12). Представляет собой обнов­ ленную версию предыдущего фор­ мата XLS (BIFF8) Файловый формат Excel 2010, пред­ назначенный для хранения шабло­ нов. Не поддерживает хранение макрокода VBA либо XLM Файловый формат Excel 2010, пред­ назначенный для хранения шабло­ нов с макросами Файловый формат Excel 2010, пред­ назначенный для хранения надстро­ ек. В этом файле могут также хра­ ниться макросы VBA или XLM Двоичный файловый формат Excel (BIFF8), который совместим с рабочи­ ми книгами от Excel 97 до Excel 2003 Двоичный формат шаблонов Excel (BIFF8), который совместим с шаб­ лонами от Excel 97 до Excel 2003 Двоичный файловый формат Excel (BIFF8), предназначенный для хране­ ния настроек, совместимых с Excel 97Excel 2003 Двоичный файловый формат Excel (BIFF5), совместимый с Excel 5.0 и Excel 95 Файловый формат Microsoft XML Spreadsheet 2003 (XMLSS) Примечание Пользователи Microsoft Office ХР и Office 2003 могут установить пакет Microsoft Office Compatibility Pack, с помощью которого можно открывать и сохранять документы с использованием файловых форматов Office 2007 и Office 2010. Этот пакет доступен на веб-сайте h t t p : / / o f f ic e . m ic r o s o f t . com. Форматы текстовых файлов При открытии текстового файла в Excel появится диалоговое окно мастера импорта текста (Text Import Wizard), которое призвано помочь пользователю в нелегком деле преобразования формата текстового файла. Часть I. Введение в Excel 106 Совет Если помощь мастера импорта текста не требуется, во время щелчка мы­ шью на кнопке ОК нажмите клавишу <Shift>. В табл. 4.3 перечислены типы текстовых файлов, которые поддерживаются в Excel 2010. Для всех текстовых файлов имеет место ограничение — единственный рабочий лист. Таблица 4.3. Типы текстовых файлов Тип файла Расширение Открытие/ Примечание Сохранение CSV (значения, разделенные запятыми) csv Да/Да Отформатированный текст р гп Да/Да Текст tx t Да/Да Формат обмена данными (Data Interchange Format — DIF) Символическая ссылка (Sym­ bolic Link — SYLK) d if Да/Да s lk Да/Да Столбцы визуально разделены запятыми, а строки — симво­ лами возврата каретки. В Excel также поддерживаются подти­ пы этого формата для Macintosh и MS-DOS Столбцы разделены пробела­ ми, а строки — символами возврата каретки Столбцы разделены символом табуляции, а строки — симво­ лом возврата каретки. В Excel поддерживаются подтипы это­ го формата для Macintosh, MSDOS и Unicode Формат обмена данными (Data Interchange Format — DIF) Символическая ссылка (Symbo­ lic Link — SYLK) Форматы файлов баз данных В табл. 4.4 перечислены типы баз данных, которые поддерживаются Excel 2010. Для всех файлов баз данных имеет место ограничение — единственный рабочий лист. Таблица 4.4. Типы файлов баз данных Тип файла Расширение Открытие/ Примечание Сохранение Access Да/Нет Можно открыть одну таблицу из базы данных Да/Нет Этот файловый формат был разработан компанией Ashton-Tate Используя команды из группы Данные«=> Получить внешние данные (Data^Get Exter­ nal Data), можно импортировать данные из различных источников данных. При этом используются текущие подключения к этим источникам либо запросы, определенные в вашей системе dBase mdb, mde, accdb, a c cd e dbf Другие базы Различные данных Да/Нет Глава 4. Файлы Excel 107 Другие форматы файлов В табл. 4.5 перечислены другие форматы файлов, поддерживаемые в Excel 2010. Таблица 4.5. Другие форматы файлов Тип файла Расширение Открытие/ Примечание Сохранение Язык гипертекстовой разметки (Hypertext Markup Language — HTML) htm, htm l Да/Да Веб-страница в одном файле (Single File Web Page) mht, mhtml Да/Да Электронная таблица OpenDocument ods Да/Да Формат переносимого документа (Portable Document Format — PDF) XML-спецификация формата PDF (XML Paper Specification PDF) pdf Нет/Да xps Нет/Да Начиная с версии Excel 2007 от­ сутствует непосредственная под­ держка HTML-файлов. Если сохра­ нить подобный файл в Excel, а за­ тем попытаться его открыть, возможна потеря данных Также известен как архивирован­ ная веб-страница (Archived Web Page). Единственные браузеры, которые могут отображать эти файлы, — Microsoft Internet Explorer и Opera Файловый формат, разработанный компаниями Sun Microsystems и OASIS. Может считываться про­ цессорами электронных таблиц с открытым кодом, такими как OpenOffice Этот файловый формат разрабо­ тан фирмой Adobe Альтернативный PDF формат, раз­ работанный компанией Microsoft Файлы рабочих областей Файл рабочей области — это специальный тип файла, в котором содержатся сведе­ ния о рабочей области Excel. Например, если ваш проект содержит две рабочие книги, причем окна этих книг нужно расположить определенным образом, опишите конфигу­ рацию этих окон в XLW-файле. После этого, независимо от того, будете ли вы открывать XLW-файл, Excel настраивается на выбранную рабочую область. Для сохранения файла рабочей области выберите команду Вид^Окно^Сохранить рабочую область (View^Window^Save Workspace) и после отображения соответствую­ щего запроса введите имя файла. Для открытия файла рабочей области воспользуйтесь командой Файл^Открыть (F\\e^ Open) и выберите файл рабочей области (файлы с расширением xlw ) в раскрываю­ щемся списке Тип файлов (Files of Type). Учтите, что файл рабочей области не содержит каких-либо рабочих кни г—только конфигурационная информация, которая приводит к отображению этих рабочих книг ввашей рабочей области Excel. Поэтому, если вы намереваетесь передать кому-либо файл рабочей области, не забудьте наравне с файлами XLW включить файлы необходи­ мых рабочих книг. Часть I. Введение в Excel 108 Работа с файлами шаблонов Шаблон — это, по сутс4, модель, которая служит основой для выполнения дальней­ ших действий. Шаблон Excel — это рабочая книга, которая применяется для создания других рабочих книг. В качестве шаблона можно использовать любую рабочую книгу (сохранив ее с расширением XLTX). Подобная практика применяется в том случае, когда приходится регулярно создавать похожие файлы. Например, предположим, что ежеме­ сячно формируется отчет по продажам. В этом случае стоит потратить немного времени и создать шаблон, который содержит все формулы и диаграммы, используемые в отчете. Теперь, после создания файла на основе этого шаблона, достаточно будет ввести требуе­ мые значения. Просмотр шаблонов Программа Excel 2010 предоставляет своим пользователям доступ к целому набору шаблонов. Для просмотра шаблонов Excel выберите команду Файл ^Создать (File^New), после чего на экране появится диалоговое окно Доступные шаблоны (Available Templates). В разделе Шаблоны Office.com (Office Online Templates) находится множество кате­ горий шаблонов. После щелчка на категории перед вами появится перечень доступных шаблонов. Для использования требуемого шаблона выберите его и щелкните на кнопке Загрузить (Download). На рис. 4.3 показаны некоторые шаблоны, доступные в категории Счета (Invoices). _1У ДД Д Д t*' и Главна» о В£3 > Ш Книга1 - Microsoft Excel Данные Разметка страницы Рецензирование Вид Разработчик. Квитанция на оплату услуг ЖКХ Доступные шаблоны ♦ •* . ■ <2 Домой Шаблоны Office.com Надстройки J i Отправить отчет об этом шаблоне в Майкрософт * |Понск шаблонов на сайте Office.] • ■* ж (Сем предоставлен; Андрей Бобров Размер: 19 Кбайт Оценка: (5 6 голосов) Счет на продажу с расчетом Рис. 4.3. На основе этих шаблонов можно создавать различные счета Категория Microsoft Office Online включает великое множество шаблонов, однако не все из них эффективны. Поэтому, если вам до сих пор попадались шаблоны не лучшего Глава 4. Файлы Excel 109 качества, не расстраивайтесь. Даже посредственный шаблон путем несложных манипу­ ляций можно существенно улучшить. Этот путь зачастую намного проще, чем создание рабочей книги “с нуля”. / ■к Примечание Местонахождение папки шаблоны варьируется в зависимости от версии Excel. Для поиска этой папки воспользуйтесь следующим VBA-кодом: MsgBox Application.TemplatesPath Создание шаблонов В Excel поддерживаются следующие три типа шаблонов. • Шаблон рабочей книги, заданный по умолчанию. Этот шаблон применяется в качестве основы для создания рабочих книг. Соответствующий файл именуется кн и га1. x ltx . • Шаблон рабочего листа, заданный по умолчанию. Используется для создания рабочих листов, включаемых в рабочую книгу. Соответствующий файл именуется ЛИСТ1 .x ltx . • Пользовательские шаблоны рабочих книг. Как правило, в данном случае речь идет о готовых к применению рабочих книгах, которые включают формулы, а их структура определяется пользователем. При использовании подобного шаблона пользователю останется подставить необходимые значения и получить требуемый результат. Использование шаблона для изменения рабочей книги, заданной по умолчанию Каждая созданная вами рабочая книга имеет ряд настроек, заданных по умолчанию. Например, она включает три рабочих листа, на которых видны линии сетки, для ввода текста используется шрифт Calibri размером 11 пунктов, ширина столбцов составляет 8,43 см и т.д. Если вам не подходят стандартные значения, можете их изменить. Изменение стандартных настроек в рабочей книге Excel, заданной по умолчанию, не представляет особого труда, а также позволяет сэкономить массу времени. Ниже описа­ ны выполняемые в этом случае действия. 1. Откройте новую рабочую книгу. 2. Добавьте или удалите рабочие листы, после чего их количество будет равно же­ лаемому. 3. Выполните другие изменения, включая настройку ширины столбцов, именованных стилей, параметров страницы, а также многих других параметров, доступных в разде­ ле Дополнительно (Advanced) диалогового окна Параметры Excel (Excel Options). Для изменения стандартного форматирования, примененного к ячейке, выберите команду Главная^Стили^Стили ячеек (Home^Styles^Cell Styles), после чего измените настройки для стиля Обычный (Normal). Например, можно изменить шрифт, заданный по умолчанию, его размер либо числовой формат. 4. Как только рабочая книга приобретет нужный вид, выберите команду Файл1^ Сохранить как (Office^Save As). Часть I. Введение в Excel 110 5. В диалоговом окне Сохранение документа (Save As) в поле Тип файла (Save As Туре) выберите запись Шаблон Excel (Template (*.xltx)). 6. Введите имя фай^а книга . x l t x . 7. Сохраните файл в папке \XLStart (не в папке Шаблоны). 8. Закройте файл. Совет Для определения точного местонахождения папки \XLStart воспользуй­ тесь следующим VBA-кодом: MsgBox Application.StartupPath После выполнения всех описанных выше действий новая рабочая книга предстанет пред ваши светлы очи после запуска Excel на базе шаблона рабочей книги книга . x l t x . Для создания рабочей книги на основе подготовленного шаблона можно также нажать клавиши <Ctrl+N>. Если же возникнет необходимость вернуться к стандартной рабочей книге, заданной по умолчанию, просто удалите файл книга . x l t x . Примечание Если после выбора команды Файл^Создать (File^New) в диалоговом окне Создание книги (New Workbook) выбрать пункт Новая книга (Blank Workbook), будет создана рабочая книга не на основе шаблона к н и г а . x l t x . Использование шаблона для изменения рабочего листа, заданного по умолчанию После вставки нового рабочего листа в рабочую книгу программа Excel использует настройки рабочего листа, заданные по умолчанию. Здесь имеются в виду такие пара­ метры, как ширина столбца, высота строки и т.д. Для изменения стандартных настроек выполните следующие действия. 1. Создайте рабочую книгу, в которой удалите все рабочие листы, за исключением одного. 2. Выполните все изменения, включая настройку ширины столбцов, именованных стилей, параметров страницы, а также настроек в диалоговом окне Параметры Excel (Excel Options). 3. После завершения настройки рабочей книги выберите команду Файл^Сохранить как (File^Save As). 4. В диалоговом окне Сохранение документа (Save As) в поле Тип файла (Save As Туре) выберите запись Шаблон Excel (Template (*.xltx)). 5. Введите имя файла лист. x l tx. 6. Сохраните файл в папке \XLStart (не в папке Шаблоны). 7. Закройте файл. 8. Завершите и снова запустите Excel. По окончании этой операции все новые листы, которые включаются в рабочую книгу после щелчка на кнопке Вставить лист (Insert Worksheet) (эта кнопка находится правее от ярлыка последнего листа), будут отформатированы в соответствии с шаблоном Глава 4. Файлы Excel 111 лист. x l t x . Для вставки нового рабочего листа можно также нажать клавиши <Shift+Fll>. / Создание шаблонов рабочих книг Шаблоны к н и г а .x l t x и л и с т , x l t x , рассмотренные в предыдущих разделах, представляют собой специальные типы шаблонов, которые определяют настройки, за­ данные по умолчанию, для новых рабочих книг и рабочих листов. Теперь же поговорим о других типах шаблонов, называемых шаблонами рабочих книг и представляющих со­ бой обычные рабочие книги, на основе которых создаются новые рабочие книги либо рабочие листы. Для чего нужен шаблон рабочей книги? Главным образом для того, чтобы избавить вас от рутинной работы. Предположим, требуется создать ежемесячный отчет о прода­ жах, который содержит данные о продажах вашей компании по регионам, а также ре­ зультаты вычислений и диаграммы. В этом случае можно создать шаблон, который вы­ полняет все эти операции (за исключением ввода начальных данных). Как только потре­ буется создать очередной отчет, откройте рабочую книгу, основанную на созданном шаблоне, заполните пустые поля и можете отдыхать. Примечание Можно воспользоваться предыдущим ежемесячным отчетом о продажах, сохранив его под новым именем. При этом велика вероятность ошибки, по­ скольку можно просто забыть о команде Сохранить как (Save As) и случайно перезаписать файл, содержащий данные ежемесячного отчета за прошлый месяц. Еще одна возможность заключается в использовании команды Из существующего документа (New From Existing), значок которой находится в окне Создание документа (New Workbook). При этом создается рабочая книга на основе существующей, причем этой книге автоматически дается новое имя, исключающее возможность случайной перезаписи. При создании рабочей книги на основе шаблона ее имя (заданное по умолчанию) об­ разуется на основе имени шаблона, к которому добавляется число. Например, при созда­ нии рабочей книги на основе шаблона О тчет о продажах . x l t x заданным по умол­ чанию именем для рабочей книги будет О тчет о продажах1 .x l s x . При первом со­ хранении рабочей книги, созданной на основе шаблона, отображается диалоговое окно Сохранение документа (Save As). В это время можно переименовать шаблон, если вы того желаете. Пользовательский шаблон — это, по сути, обычная рабочая книга, поэтому можно воспользоваться всеми возможностями, предоставляемыми Excel (диаграммами, форму­ лами и макросами). Обычно шаблон устанавливается таким образом, что пользователь может вводить значения и тут же получать результаты. Другими словами, большинство шаблонов включают все необходимое, кроме данных, вводимых пользователем. % Примечание Если шаблон содержит макросы, его следует сохранить в формате шаблон с п о д д ер ж ко й м акр о с о в (Excel Macro-Enabled Template) с расши­ рением XLTM. Excel 112 Часть I. Введение в Excel Содержимое файла Excel В Excel 2010 используется XML-формат, на основе которого создаются рабочие кни­ ги, шаблоны и надстройю!. Фактически эти файлы представляют собой ZIP-архивы. При необходимости они могут быть разархивированы и просмотрены. В версиях Excel, предшествующих Excel 2007, применялся двоичный файловый фор­ мат. И хотя спецификации этого формата известны, работать с двоичными файлами со­ всем непросто. С другой стороны, файловый XML-формат относится к категории так на­ зываемых открытых форматов. Подобные файлы могут создаваться и обрабатываться с помощью любых программ, не относящихся к Office 2010. Структура файла В настоящем разделе описаны компоненты типичного файла рабочей книги с поддерж­ кой макросов Excel (XLSM). Соответствующая рабочая книга, именуемая s a m p le .x lsm , показана на рис. 4.4. Она состоит из одного рабочего листа, одного листа диаграммы и про­ стого макроса на языке VBA. Рабочий лист включает таблицу, кнопку (из группы элемен­ тов управления Формы (Forms)), рисунок SmartArt, а также фотографию цветка. Рис. 4.4. Перед вами пример простой рабочей книги Компакт-диск Рабочая книга s a m p le . x ls m находится на прилагаемом компакт-диске. Для просмотра “внутренностей” файла Excel 2010 откройте окно Проводника Windows и добавьте расширение ZIP в список имен файлов. После этого файл s a m p le . x lsm будет переименован в sam p le .x ls m . z ip . Затем можно открыть этот файл с помощью любой программы, выполняющей разархивирование. Автор использовал свойство разархивирова­ ния, встроенное в Windows 7. Глава 4. Файлы Excel 113 Примечание Если в вашей системе выбран режим сокрытия расширений файлов, отклю­ чите его. В окне Проводника выберите пункты меню Сервис^Параметры па­ пок (Tools^Folder Options) и перейдите на вкладку Вид (View). В разделе Файлы и папки (File and Folders) отмените установку флажка Скрывать рас­ ширения для зарегистрированных типов файлов (Hide Extensions For Known File Types). Совет О Возможно, вы захотите разархивировать сжатые файлы, поскольку при этом об­ легчается их просмотр. При работе в Windows для этого достаточно щелкнуть правой кнопкой на имени файла и выбрать пункт Извлечь файлы (Extract Files). Первое, что бросается в глаза при просмотре файла, — это наличие структуры ката­ логов. На левой панели на рис. 4.5 показана полностью развернутая структура каталогов файла рабочей книги. Причем она может изменяться в зависимости от просматриваемой рабочей книги. /W Файл ► Компьютер ► НОВЫЙ ТОМ (G:) » samplejdsm- ► Правка Вид Упорядочить ▼ Сервис Общий доступ ▼ • igii Библиотеки Щ Видео > ШДокументы >(ь* Изображения > Музыка * -*■j 4-f • | Поиск: sampk.xtsm~ Р ■ Справка Записать на оптический диск Новая папка » Дата изменения Тип ii.re is 1507201011:50 Папка с файлами Щ ьcustomXmt £ docProps 15.07.201011:50 Папка с файлами 1507201011:50 Папка с файлами ш* 1507201011:50 ИЙ [C ontent_Types}jcml П & Папка с файлами Документ XML Компьютер > Локальный дис> i> Локальный дно * т НОВЫЙ ТОМ (G ▻ ЩPicsExcei2010 Щ PicsHTML J t Pics0ffice2010 £» |(, samplejtkm~ £>Ч|р Сеть Рис. 4,5. Структура каталогов файла рабочей книги За небольшими исключениями все используемые файлы являются текстовыми XMLфайлами. Их можно просматривать в окне текстового редактора, XML-редактора, веб­ браузера либо даже в окне Excel. На рис. 4.6 показано содержимое такого файла, про­ сматриваемого в окне браузера Firefox. Файлы формата, отличного от XML, включают графические файлы и VBA-проекты (хранятся в двоичном формате). Рассматриваемый XML-файл включает три корневые папки; некоторые из них вклю­ чают подпапки. Обратите внимание, что многие папки включают папку _ r e l s . Здесь находятся XML-файлы, которые определяют связи с другими компонентами пакета. 114 Часть I. Введение в Excel Файл Правка §ИД Журнал Закладки - с х :д а ijfei Самые популярные Ф Инструменты Справка file:/IfF:/sample. xism --/к!/worksbee to/sh eet1. xml Начальная страница _ ................................: 2_ 43" .... Последние заголовки I -ini xi . p\ 1Me:///R/<3fflHe~»sheets/riKetLxinl Щг С этим X M L -файлом не связана ни одна таблица стилей. Ниже показано дерево - - worksbeet mc:Igaorabie="il4ac”> <sbeetPr codeName=*Sheetl7> • dim ension ref^T 2G 9 ”/> —<sheetViews> <sheetView showGr*dLiBes="0" tabSelected 1" workbookViewId-"0"> </sk«etViews> <sbeetFormatPr defaeltRowHeigbt^" 15" xl4ac:dyDesceBt="0 257> —<cob> <co! шп="Г m ax = T widtb=”l Г cmsto«iWidtk=" 1"/> <col шш='6" mai="6e widtb="12" c*stora\Vidtb=" 17> <col шют=’ Т т жх="Т widtfc=" 11.140625" c«stomWidA="17> </cols> <sbeetData> - <row r="2" spa*s="6 7’ il4ac:dyDesceet="0.251’> <c r= T 2" s = T *=V> <v > 7</y > <t> — <c r="G2" t= V > <v>6</v> <Jt> </row> - <row r="3" 5pams="6 7" rl4ac:dyDesce*t="0 25"> - < c r = T 3 " t= V > <v>0</v> Готово ж Рис. 4.6. Просмотр XML-файла в окне веб-браузера Ниже перечислены папки, входящие в состав файла рабочей книги s a m p le . xlsm . • _ r e l s . Здесь можно найти сведения о связях в пакете. • doc P ro p s. XML-файлы, которые описывают свойства файла и настройки прило­ жения. • x l. Эта папка является “сердцем” файла. Ее имя изменяется в зависимости от типа документа Office (x l, p p t, w ord и т.д.). Здесь находится несколько XML-файлов, содержащих настройки для рабочей книги. Если в состав рабочей книги включен VBA-код, он будет находиться в двоичном файле с расширением BIN. Эта папка включает несколько подпапок (количество подпапок изменяется в зависимости от выбранной рабочей книги). • c h a r t s . Здесь находится XML-файл для каждой диаграммы, включающий описание ее настроек. • c h a r t s h e e t s . Здесь содержится XML-файл, включающий данные для каждо­ го листа диаграммы в рабочей книге. • d ia g ra m s . Здесь находятся XML-файлы, в которых содержится описание диа­ грамм (рисунков SmartArt) в рабочей книге. • d ra w in g s . Здесь содержится XML-файл, включающий данные для каждого “рисунка”. Здесь под этим термином подразумеваются кнопки, диаграммы и изображения. • m edia. Здесь содержатся внедренные медиаклипы, например GIF- и JPG-файлы. Глава 4. Файлы Excel 115 • t a b l e s . Включает XML-файл, содержащий данные для каждой таблицы. • them e. Содержит XML-файл, включающий данные о теме рабочей книги. • w o r k s h e e ts . Включает XML-файл для каждого рабочего листа в книге. © Совет Если добавить расширение z i p к файлу Excel, его, как и раньше, можно бу­ дет открыть в Excel, поскольку работа этой программы не зависит от расши­ рения открываемого файла. Также можно сохранить рабочую книгу с рас­ ширением z i p . Для этого в диалоговом окне Сохранение документа (Save As) добавьте расширение z i p и заключите имя файла в двойные кавычки, например “МояРабочаяКнига.х^х^р” . Почему файловый формат столь важен “Открытые” файловые XML-форматы, появившиеся в Microsoft Office 2007, пред­ ставляют собой огромный шаг вперед, важный для всего компьютерного сообщества. Самое главное — рабочие книги Excel в этих форматах относительно легко считывать и записывать посредством ряда программ, отличных от Excel. Например, вполне возможно написать такую программу, которая будет изменять тысячи рабочих книг Excel, причем сама программа Excel не потребуется. Подобная программа может вставлять новые ра­ бочие листы в каждый такой файл. Конечно, разработчик такой программы должен в со­ вершенстве знать структуру XML-файла, но даже если он не знаком с этими вопросами, изучить их не составит особого труда. Важно также то, что новые форматы файлов более устойчивы к возможным повреж­ дениям (по сравнению с устаревшими двоичными форматами). Я сохранил файл рабочей книги и удалил один из XML-файлов рабочего листа. При попытке повторного открытия этого файла в Excel отобразилось сообщение, показанное на рис. 4.7. В нем говорится о том, что файл был поврежден и данные в нем отличаются от данных в файлах с расши­ рением . r e s . Причем Excel способна “отремонтировать” и открыть файл. При этом уда­ ленный рабочий лист будет помещен на место, хотя и окажется пустым. ЦЙЦ ЯУ В книге Т1роверкаВосстановления. xlsm. zip* обнаружено содержимое, которое не удалось прочитать. Попробовать восстановить содержимое книги? Если вы доверяете источнику этой книги, нажмите кнопку "Да*. Рис. 4.7. Программа Excel может сама “отремонтировать” поврежденный файл рабочей книги Кроме того, размер заархивированного XML-файла зачастую меньше размера со­ ответствующего двоичного файла. И еще одно преимущество заключается в том, что структурированная природа файла позволяет извлекать отдельные его элементы (например, графику). Как правило, у пользователя Excel не возникает потребности в просмотре либо изме­ нении XML-компонентов файла рабочей книги. Но если вы являетесь разработчиком, то вам придется создавать код, который изменяет компоненты пользовательского “ленточного” интерфейса Excel. При этом следует хотя бы поверхностно знать структуру XML-файла рабочей книги. Часть I. Введение в Excel 116 © Перекрестная ссылка Обратитесь к главе 22 за дополнительными сведениями о способах измене­ ния ленты. Файл OfficeUI В файле Excel.of ficeUI сохраняются результаты изменений, внесенных на па­ нель быстрого доступа и ленту. Этот XML-файл можно найти в следующей папке: С : \U s e rs \< и м я _ л o л ь з o в a т e л я ;> \A p p D a ta \L lO c a l\M ic ro s o f t : \ O f f i c e Этот файл изменяется после внесения изменений на панель быстрого доступа или ленту. Причем изменения вносятся в файл незамедлительно, еще до закрытия Excel. Об­ ратите внимание, что этот файл появляется только после того, как вы внесете как мини­ мум одно изменение в интерфейс пользователя. Для просмотра файла E x c e l . o f f i c e U I можно воспользоваться редактором XMLкода, веб-браузером или Excel. Просто выполните следующие действия. 1. Создайте копию файла E x c e l . o f f i c e U I . 2. Добавьте расширение XML к копии файла, в результате чего название файла примет вид E x c e l . o f f i c e U I .xm l. 3. Выполните команду Файл^Открыть (File^Open) для открытия файла либо про­ сто перетащите его в окно Excel. 4. Отобразится диалоговое окно, включающее ряд параметров; выберите XMLтаблица (As an XML Table). На рис. 4.8 показан импортированный файл E x c e l . o f f ic e U I (отображается в виде таблицы). В рассматриваемом примере на панель быстрого доступа добавлено пять команд (строки 4-6 и 12-13 таблицы), а также две вкладки и семь групп (строки 15-23 таблицы). Рис. 4.8. Просмотр файла данных E x c e l. o f f ic e U I в Excel Один и тот же файл Excel .OfficeUI может применяться несколькими пользова­ телями одновременно. Например, панель быстрого доступа нетрудно снабдить двумятремя десятками полезных инструментов, а ленту — несколькими полезными вкладками, включающими ряд пользовательских групп. Если подобная обновленная панель произ­ ведет впечатление на ваших коллег, просто передайте им копию файла Excel. OfficeUI и расскажите, куда ее нужно скопировать. Учтите, что в случае копирования Глава 4. Файлы Excel 117 переданной вами копии i^oeepx существующего файла Excel.Of ficeUI все измене­ ния, ранее внесенные в интерфейс пользователя, будут утеряны. Не пытайтесь изменить файл Excel.Of ficeUI, если вы точно не представляете, для чего он предназначен. Но при этом не бойтесь экспериментировать. Если при запус­ ке Excel появится сообщение об ошибке в файле Excel.of ficeUI, можете просто удалить его, после чего Excel создаст новый экземпляр этого файла. Но лучше все же хранить копию исходного файла в безопасном месте. Файл XLB Программа Excel хранит настройки панелей инструментов и меню в файле с расши­ рением XLB. Даже несмотря на то, что Excel 2010 официально не поддерживает панели инструментов и меню так, как в предыдущих версиях, файл XLB по-прежнему использу­ ется. Если вы не можете его найти, значит, программа до сих пор не сохранила ни одно из пользовательских меню или панелей инструментов. В момент закрытия Excel текущая конфигурация панелей инструментов сохраняется в файле Ехсе114 . x lb . Этот файл (обычно) находится в следующем каталоге: С :\U s e r s \< и м я п о л ь з о в а т е л я > \ A p p D a t a \R o a m i n g \ M ic r o s o f t \E x c e l Этот двоичный файл содержит сведения о положении и видимости всех пользова­ тельских панелей инструментов и меню, а также изменения, которые были добавлены во встроенные панели инструментов и меню. Файлы надстроек Надстройка фактически является рабочей книгой Excel, имеющей некоторые осо­ бенности. • Значение свойства рабочей книги IsAddin равно Истина. Это означает, что надстройка может быть загружена и выгружена с помощью диалогового окна Надстройки (Add-Ins). • Эта рабочая книга скрыта, причем подобное состояние не может изменяться поль­ зователем. Следовательно, надстройка никогда не может быть активной рабочей книгой. • Если вы работаете с VBA, имейте в виду, что надстройка не входит в коллекцию Workbooks. © Совет Для получения доступа к диалоговому окну Надстройки (Add-Ins) выберите команду Файл^Параметры Excel (File^Excel Options). Выберите раздел Над­ стройки (Add-Ins), в списке Управление (Manage) выберите пункт Надстройки Excel (Excel Add-Ins) и щелкните на кнопке Перейти (Go). Если в рабочем ок­ не Excel отображается вкладка Разработчик (Developer), воспользуйтесь ко­ мандой Разработчик^Надстройки^Надстройки (Developer^Add-lns^Addins) либо, что проще всего, удобной комбинацией клавиш <Alt+TI>, которая ос­ талась со времен Excel 2003. Часть I. Введение в Excel 118 Настройки Excel в системном реестре В диалоговом окне Параметры Excel (Excel Options) находятся десятки настроек, определенных пользователем. Для хранения этих настроек и обращения к ним во время запуска Excel используется реестр Windows. В следующем разделе приводятся некото­ рые сведения о реестре Windows, а также рассматривается, каким образом Excel исполь­ зует реестр для хранения настроек. Кратко о системном реестре Реестр Windows, который еще называется системным реестром, фактически пред­ ставляет собой централизованную иерархическую базу данных, используемую операци­ онной системой и приложениями. Реестр появился еще в Windows 95, в которой заменил прежние INI-файлы с хранящимися в них настройками Windows и приложений. Перекрестная ссылка Считывание и запись данных в системный реестр может производиться с по­ мощью VBA-макросов. Соответствующие сведения можно найти в главе 11. Для просмотра системного реестра можно использовать редактор реестра (Registry Editor). Эта программа может применяться также для редактирования содержимого реестра. Файл этой программы называется r e g e d i t . ехе. Прежде чем начать эксперименты, прочтите врезку “Перед изменением реестра...”. На рис. 4.9 показано окно редактора реестра. & Редактор реестра Файл Правка Вид И збранное Справка t> | i MobilePC j- Ш MPEG2Demultiplexer MS Design Tools MSDAIPP >ё > Ш MSNMessenger -Ц§ Multimedia !~ ф Notepad л Office 12J0 л fc 14.0 > j || Access c> jg Clip Organizer i.. S | M (значение не присвоено) 6632 00 00 010100 00 00 00 00 00 7a 00 03 00 00 00... "lojCmdBarData REG.BINARY ^jCustomBottom... REG_DWORD 0x000a6fe0 (684000) .Wi]CustomFooterM... REG.DWORD 0x00046500(288000) CustomHeader... REG.DWORD 0x00046500(288000) ?i*i CustomLeftMar... REG.DWORD 0*000956*0 (612000) ?<£CustomRightMa... REG.DWORD 0*0009e340 (648000) tfijCustomTopMar... REG.DWORD 0x000a6fe0 (684000) DectmalSeparator REG.SZ Common JlSjLastUlLang REG.DWORD bcel File MRU Щ Maximized REG.DWORD Clip OrganizerDB j Options: Place MRU ■ЩRecent Templates л Resiliency t> DocumentRecovery t> Security -I Тил 0x00000000(0) 0x00000000(0) 0x00000000(0) 0x00000002(2) 0x00000419 a « 9 ) 0x00000002(2) £, CLView t> Имя ;**•) (По умолчанию) REG_SZ ■MSpell Checker $*j DefauttSheetR2L REG.DWORD ISjFirstRun REG.DWORD .tie] FormulaBarExpa... REG.DWORD jrfjFormulaBarExpa... REG.DWORD REG.SZ 4.100.21.143.24.5.1.359.0.7 ^jOptionFormat REG.BINARY 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00... $Optk>ns5 MRUFuncs REG.DWORD 0x00000080 (128) ^jOptionsDlgSizeP... REG.BINARY Ь6 03 00 00 ad 02 00 00 72 00 00 00 25 00 00 00 00 0™ JMlPrvotConnectio... REG.BINARY 3b 0100 00 c8 00 00 00 56 02 00 00 55 0100 00 00 3~ pPos REG.SZ 119.0.1116.640 ^PosSideBySide REG.SZ 659,3,1299,580,4Д2,651,579,0 ^jSlicerConnectio... REG.BINARY 45 01 00 00 c8 00 00 00 fO 0100 00 48 0100 00 00 3c~ KoMnwoTep\HKEY_CURRENT_USER\Software\Microsoft\Office\14AExcefS.Options Рис. 4.9. Редактор реестра позволяет просматривать и изменять системный реестр Перед изменением реестра... Для выполнения изменений в реестре, включая жизненно важную системную ин­ формацию, можно использовать программу r e g e d i t . ехе. Если вы измените не то, что нужно, Windows может работать неправильно. Глава 4. Файлы Excel 119 Используйте команду Файл «^Экспорт (File*=>Export) редактора реестра. Эта команда позволяет сохранить ASCII-версию всего реестра либо выбранную вами ветвь. Чтобы вернуть реестр в первоначальное состояние, импортируйте ASCII-файл, после чего ре­ естр примет свой исходный вид (команда Файл^Импорт (File^lmport). Дополнительные сведения можно найти в справке редактора реестра. Системный реестр содержит ключи и значения, расположенные в иерархическом по­ рядке. Ниже приведены ключи верхнего уровня: • HKEY_CLASSES_ROOT; • HKEY_CURRENT_USER; • НКЕY_LOCAL_MACHINE; • HKEY_USERS; • HKEY CURRENT CONFIG. Настройки Excel Информация, используемая Excel 2010, хранится в следующем разделе реестра: H K E Y _ C U R R E N T _ U S E R \S o f tw a r e \M ic r o s o ft\O f fic e \1 4 . 0 \ E x c e l В этом разделе реестра находится ряд ключей, определяющих значения, которые влияют на порядок функционирования Excel. Настройки реестра обновляются автоматически после закрытия Excel. 0 Примечание Учтите, что Excel считывает содержимое реестра Windows один раз — при запуске. Кроме того, Excel единственный раз обновляет настройки реест­ ра — при нормальном завершении. Если Excel завершается аварийно (такое бывает), информация в реестре не обновляется. Если изменить одну из на­ строек Excel, например отображение строки формул, это изменение не за­ фиксируется в системном реестре до тех пор, пока Excel не завершит свою работу без эксцессов. В табл. 4.6 перечислены настройки реестра, имеющие отношение к Excel 2010. Учти­ те, что некоторых из них вы можете не найти в своей базе данных реестра. Таблица 4.6. Информация о конфигурации Excel в системном реестре Раздел Описание Add-in M anager Отображает надстройки, которые находятся в диалоговом окне Над­ стройки (Add-Ins). Надстройки, входящие в комплект поставки Excel, в этом списке отсутствуют. Если нужно удалить какую-либо над­ стройку, удалите соответствующую запись в окне редактора реестра Здесь перечисляются дополнительные (внешние) конвертеры фай­ лов, которые не встроены в Excel Настройки, определяющие процесс поиска ошибок в формулах (Диспетчер надстроек) Converters (Конвертеры) Error C h eckin g (Проверка ошибок) F ile mru (Последние Сведения о последних использовавшихся файлах (эти файлы ото­ бражаются в списке Последние книги (Recent Workbooks), который открытые файлы) появляется после выбора команды Файл ^Последние (File^ Recent)) 120 Часть I. Введение в Excel Окончание табл. 4.6 Раздел O p tio n s Описание (Параметры) R e c e n t T e m p la te s В этом разделе содержится великое множество параметров, опре­ деляющих настройки Excel Информация о последних использовавшихся шаблонах (Последние шаблоны) R e s ilie n c y Информация, применяемая для восстановления документов (Устойчивость) Параметры безопасности, определяющие порядок открытия файлов с макросами S p e l l C h e c k e r (Про­ Информация, описывающая параметры модуля проверки грамматики верка грамматики) Выбранная пользователем информация, которая отображается в S ta tu s B a r (Строка строке состояния состояния) U s e r ln fо Информация о пользователе (Информация о поль­ зователе) S e c u r ity (Безопасность) Хотя большинство настроек может изменяться в диалоговом окне Параметры Excel (Excel Options), некоторые настройки невозможно изменить таким образом (в этом слу­ чае применяется редактор реестра). Например, при выделении диапазона ячеек иногда требуется, чтобы выделенные ячейки окрашивались в черный цвет на белом фоне. Для этого достаточно добавить в системный реестр следующий ключ. 1. Откройте редактор реестра и найдите раздел HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\0ptions. 2. Щелкните правой кнопкой мыши и выберите пункт Создать1^Параметр DWORD (New^DWORD Value). 3. Назовите создаваемое значение Opt ions 6. 4. Щелкните правой кнопкой мыши на ключе Opt ions 6 и выберите пункт Изме­ нить (Modify). 5. В диалоговом окне Изменение параметра DWORD (Edit DWORD Value) уста­ новите переключатель Десятичная (Decimal) и введите значение 16 (рис. 4.10). Изменение параметра DWORD {32 бита) Параметр: Options6 Значение 161 Система исчисления 0 Шестнадцатеричная # Десятичная 1 0* 1 L Отмена | Рис. 4.10. Ввод значения для параметра системного реестра После перезагрузки Excel ячейки выделяются черным цветом (а не светло-голубым, как ранее). Если вас это не устраивает, удалите запись реестра Opt ions 6. Глава 4. Файлы Excel 121 Совет Если появляются проблемы при запуске Excel, причина может быть в повре­ ждении ключей системного реестра. Возможно, придется с помощью ре­ дактора реестра удалить следующий раздел реестра: HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel При следующем запуске Excel удаленные ключи реестра будут созданы вновь. При этом существует риск потери некоторой информации. Часть Разработка приложений Excel В этой части... Глава 5 Приложения электронных таблиц Глава 6 Принципы разработки приложений электронных таблиц Глава Приложения электронных таблиц В этой главе... ♦ ♦ ♦ ♦ О приложениях электронных таблиц Разработчик и конечный пользователь Решение проблем с помощью Excel Основные типы электронных таблиц В этой главе речь пойдет об особенностях использования электронных таблиц на практике. 0 приложениях электронных таблиц Приложение электронных таблиц — это один файл или группа связанных файлов электронных таблиц, разработанных таких образом, чтобы пользователь, не являющий­ ся их разработчиком, без особой подготовки мог выполнить необходимые действия. Со­ гласно этому определению большинство разработанных вами электронных таблиц, веро­ ятно, такими приложениями не являются. На жестком диске у вас могут быть сохранены десятки или сотни файлов электронных таблиц, но наверняка большинство из них не предназначены для других пользователей. Ниже приведены характеристики эффективного приложения электронных таблиц. • Позволяет конечному пользователю выполнить задание, которое, вероятно, он не смог бы выполнить по-другому. • Предоставляет эффективное решение проблемы (среда электронных таблиц не всегда является оптимальной структурой управления данными). • Выполняет только ожидаемые действия. Такое требование, возможно, покажется очевидным, но очень часто именно по этой причине приложения нельзя назвать эффективными. Часть II. Разработка приложений Excel 126 • Выдает точные результаты и не имеет программных ошибок. • Для выполнения своей работы использует четкие и эффективные методы и алгоритмы. • Выявляет ошибки, вызванные своим присутствием в системе, не дожидаясь вме­ шательства пользователя. Примечание Обратите внимание, что ошибки и программные ошибки — это не одно и то же. Попытка деления на нуль — ошибка, связанная с работой приложения. А то, что такая попытка вовремя не пресечена, является уже программной ошибкой. • Не разрешает пользователю случайно (или умышленно) удалять или видоизменять важные компоненты. • Имеет простой и понятный графический интерфейс, поэтому пользователь всегда знает, что делать дальше. • Формулы, макросы и элементы пользовательского интерфейса хорошо докумен­ тированы, что предоставляет возможность изменять их в случае необходимости. • Приложение разработано с учетом того, что его можно просто модифицировать, не прибегая к крупномасштабным изменениям (ведь пользователю рано или позд­ но потребуется внести изменения). • Располагает легкодоступной справочной системой, которая предоставляет полез­ ную информацию по основным процедурам. • Должно быть переносимым и работать в любой компьютерной системе, в которой ус­ тановлены все необходимые программы (в данном случае — требуемая версия Excel). Не следует удивляться тому, что приложения электронных таблиц можно создавать для различного применения (и в шаблонах, заполняемых данными, и в довольно слож­ ных приложениях с пользовательскими меню и диалоговыми окнами, причем сами при­ ложения могут даже и не выглядеть, как электронные таблицы). Разработчик и конечный пользователь Мы часто употребляем термины разработчик и конечный пользователь. Читателей данной книги можно смело зачислить в отряд разработчиков или как минимум потенци­ альных разработчиков. Итак, определимся с терминологией. Разработчик — это специалист, который создает приложение электронных таблиц. В совместных проектах число разработчиков обычно больше одного (команда разработчиков). Конечный пользователь (его для краткости бу­ дем называть просто пользователем) — это человек, применяющий результаты деятель­ ности разработчика по программированию электронных таблиц. Во многих случаях ко­ нечных пользователей бывает достаточно много, а разработчиком часто является один из пользователей. Кто такие разработчики и чем они занимаются Вот уже более двадцати лет я преподаю методологию разработки. Поэтому чаще все­ го я имею дело с теми, кто называет себя разработчиками электронных таблиц. Среди них различаются две основные группы. Глава 5. Приложения электронных таблиц 127 • Штатные специалисты, которые тесно сотрудничают с пользователями и осно­ вательно знают их потребности. Во многих случаях эти разработчики также явля­ ются пользователями своего приложения. Часто они разрабатывают приложение, чтобы решить только одну конкретную проблему. • Специалисты со стороны, как правило, приглашаются с целью решения пробле­ мы. В большинстве случаев такие разработчики знакомы с вопросом лишь в об­ щих чертах, однако хорошо знают специфику приложения, которое разрабатыва­ ют. Разработчики могут быть сотрудниками той же самой компании, которой тре­ буется приложение, но только другого подразделения. У одних специалистов на разработку приложения уходит все рабочее время. Они мо­ гут быть как внутренними специалистами, так и специалистами со стороны. Достаточно много консультантов (со стороны) неплохо зарабатывают, работая “свободными худож­ никами” по созданию приложений электронных таблиц. Другие же разработчики электронных таблиц не посвящают этому делу все свое ра­ бочее время и даже не осознают, что они разрабатывают соответствующие приложения. Такими разработчиками часто выступают компьютерные “знатоки”, которые все знают о компьютерах и программах. Часто эти люди создают приложения электронных таблиц как раз для того, чтобы облегчить себе жизнь. Ведь время, которое они тратят, чтобы разработать для других сотрудников хорошее приложение, часто экономит часы, кото­ рые пришлось бы потратить на обучение специалистов. Кроме того, время разработки такого приложения значительно меньше времени, которое требуется, чтобы отвечать на вопросы сотрудников. Разработчики электронных таблиц обычно принимают участие в следующих опера­ циях, самостоятельно выполняя большинство из них или даже все: • определение потребностей пользователя; • планирование приложения, которое соответствует этим потребностям; • определение наиболее подходящего интерфейса пользователя; • создание электронной таблицы, формул, макросов и пользовательского интерфейса; • тестирование приложения в разных условиях; • изменение приложения с целью повышения его надежности и отказоустойчивости (часто по результатам тестирования); • обеспечение эстетической привлекательности и наглядности приложения; • придание приложению красивого внешнего вида и интуитивности; • документирование усилий, потраченных на разработку; • размещение приложения в компьютере пользователя; • обновление приложения в случае необходимости. © Перекрестная ссылка Более подробно об этих операциях речь идет в главе 6. Разработчики должны хорошо знать среду, в которой они работают (в данном слу­ чае— программу Excel). Конечно, по уверениям компании Microsoft, использовать эту программу очень легко, но определение легкости отличается для каждого конкретного Часть II. Разработка приложений Excel 128 пользователя. Для разработки нестандартных приложений электронных таблиц с помо­ щью Excel требуется глубокое знание формул, функций, макросов, пользовательских диалоговых окон, пользовательских панелей инструментов, а также надстроек и команд меню. Большинство пользователей, как правило, не соответствуют выдвигаемым требо­ ваниям и не имеют намерения изучать эти подробности. Итак, перейдем к следующей теме — классификации пользователей электронных таблиц. Классификация пользователей электронных таблиц Пользователи, работающие с электронными таблицами (как пользователи-разработ­ чики, так и обычные пользователи), различаются по степени (или опытности) исполь­ зования электронных таблиц и по интересу к изучению самих таблиц. Каждый из этих критериев имеет три уровня. Комбинируя уровни обоих параметров, получаем девять вариантов, которые представлены в табл. 5.1. Однако рассматривать мы будем только семь из них. Дело в том, что минимальный интерес к электронным табли­ цам обычно проявляют те пользователи, которые имеют опыт работы с ними (интерес как раз и стимулировал таких пользователей к приобретению опыта). Что же касается пользователей, которые обладают большим опытом работы с электронными таблицами и низким уровнем интереса, то из них обычно получаются не очень хорошие разработчики. Таблица 5.1. Классификация пользователей электронных таблиц по опытности и интересу к изучению предмета Уровень опыта Интерес отсутствует Небольшой опыт Пользователь Умеренный опыт н/д Очень большой опыт н/д Умеренный интерес Пользователь Пользователь Пользователь Очень большой интерес Пользователь/Потенциаль­ ный разработчик Разработчик Разработчик Очевидно, что у разработчиков электронных таблиц должен быть как немалый опыт работы с этими таблицами, так и высокий к ним интерес. Те, у кого небольшой опыт ра­ боты, но имеется интерес, являются потенциальными разработчиками. Все, что им необ­ ходимо, — приобрести опыт. И если вы читаете эту книгу, то, вероятно, относитесь к од­ ной из категорий последнего столбца этой таблицы. Для кого предназначены приложения электронных таблиц Оставшиеся ячейки последней таблицы соответствуют тем конечным пользователям электронных таблиц, которых вы считаете “потребителями” приложений электронных таблиц. Разрабатывая такое приложение, предназначенное для других людей, необходи­ мо знать, какие из этих групп пользователей действительно будут его применять. Значительная часть пользователей не имеют опыта и интереса. Это люди, которым электронная таблица необходима для работы. Она рассматривается просто как средство достижения конечной цели. Обычно таким пользователям мало известно о компьютерах и программах, и, как правило, им не интересно изучать то, что не относится к их работе. Возможно, компьютеры их немного пугают. Очень часто им даже неизвестна версия Глава 5. Приложения электронных таблиц 129 процессора электронных таблиц, которую они используют; кроме того, они не знают всех возможностей программы. Очевидно, что приложения, разработанные для этой группы, должны быть дружественными к пользователям, т.е. простыми, не внушающими страх и по возможности отказоустойчивыми. С точки зрения разработчика, более интересной группой являются пользователи, ко­ торые обладают умеренным опытом работы с электронными таблицами и заинтересова­ ны в том, чтобы знать больше. Эти пользователи имеют понятие о формулах, умеют ра­ ботать с функциями надстроек и обычно знают о возможностях программного продукта. Они, как правило, ценят труд, который вы вложили в приложение, и на них часто произ­ водят впечатление приложенные вами усилия. Более того, эти пользователи часто пред­ лагают прекрасные идеи, которые помогают улучшить ваш продукт. Приложения, разра­ ботанные для этой группы, также должны быть дружественными к пользователям (легкими в использовании и отказоустойчивыми), но это еще не все. Они, кроме того, могуг быть более сложными и уникальными, чем приложения, которые предназначены для аудитории, состоящей из менее опытных и заинтересованных пользователей. Решение проблем с помощью Excel Выше речь шла о таком базовом понятии, как приложение электронных таблиц; вы узнали о некоторых типах конечных пользователей и разработчиков приложений и выяс­ нили назначение процессоров электронных таблиц. Теперь настало время показать, ка­ кие задачи решаются с помощью приложений электронных таблиц. Вы, возможно, уже имеете достаточно хорошее представление о тех задачах, для реше­ ния которых применяется Excel. Традиционно такие программы использовались в прило­ жениях, которые по своей природе являются в значительной степени интерактивными. Хороший пример таких приложений — бюджет корпорации. После подготовки соответ­ ствующей модели (т.е. создания расчетных формул) управление бюджетом сводится к введению конечных значений и изучению итогов, полученных в результате автомати­ ческих вычислений. Часто разработчикам приложения расчета бюджета достаточно рас­ пределить фиксированные ресурсы по разным видам деятельности и представить резуль­ таты в привлекательном (или как минимум в удобочитаемом) виде. Конечно же, процес­ сор электронных таблиц является для этого идеальным средством. Впрочем, задачи, аналогичные описанной, составляют лишь небольшой процент того, для чего разрабатываются электронные таблицы. Зачастую пользователи процессоров электронных таблиц (особенно в последние годы) применяют эти программы для реше­ ния не тех задач, для которых они предназначались изначально. Приведем несколько примеров нетрадиционного применения процессора электрон­ ных таблиц Excel. • Как средство проведения презентаций. Например, используя исключительно Excel, вы можете с минимальными усилиями создать привлекательное интерак­ тивное слайд-шоу, выводимое на экран монитора. • Как инструмент ввода данных. Программа электронных таблиц часто является самым эффективным средством решения таких задач, как повторный ввод данных. Введенные данные могут экспортироваться в самые разные форматы, применяе­ мые другими программами. 53ак. 3107 130 Часть II. Разработка приложений Excel • Как диспетчер баз данных. Если вы имеете дело с достаточно простыми струк­ турами данных, намного проще для управления ими воспользоваться Excel, а не Access. • Как генератор бланков. Многим пользователям для создания привлекательных печатных бланков проще обратиться к инструментам форматирования Excel, а не изучать настольную издательскую систему, например PageMaker. • Как текстовый процессор. Функции управления текстом, которые присутствуют во всех процессорах электронных таблиц, предоставляют возможность манипули­ ровать текстом так, как это невозможно даже в текстовом процессоре. • Как платформа для простых игр. Конечно, разработчики программы Excel о та­ ком ее применении и не думали. Однако я загрузил из Интернета (а также написал собственноручно) интересные стратегические игры, в которых применяются инст­ рументы Excel и других процессоров электронных таблиц. Вы, вероятно, можете пополнить этот список, вспомнив еще многие другие примеры. Ирония в том, что универсальность процессоров электронных таблиц является палкой о двух концах. С одной стороны, появляется искушение применить такую программу для решения любой возникшей проблемы. А с другой — вы часто выбиваетесь из сил, пыта­ ясь с помощью электронных таблиц справиться с проблемой, для которой легче найти другое решение. Основные типы электронных таблиц В этом разделе приведена классификация электронных таблиц, включающая несколь­ ко основных типов. Она проиллюстрирует, каким образом электронные таблицы вписы­ ваются в общую картину управления данными с помощью компьютера. Конечно, данная классификация является довольно условной. Она создана исключительно на основе мое­ го личного опыта. Более того, ее категории часто пересекаются, однако к ним относится большинство электронных таблиц. Предложим такие названия для категорий (типов) электронных таблиц: • электронные таблицы “на скорую руку”; • электронные таблицы “не для посторонних глаз”; • однопользовательские приложения; • приложения-“спагетти”; • приложения-утилиты; • надстройки с функциями рабочих листов; • одноблоковые бюджеты; • модели “что если”; • приложения для хранения данных и доступа к ним; • клиентские приложения для доступа к базам данных; • приложения “под ключ”. О каждой из этих категорий рассказывается в следующих разделах. Глава 5. Приложения электронных таблиц 131 Электронные таблицы “на скорую руку” Вероятно, это самый распространенный тип электронных таблиц. Большинство элек­ тронных таблиц из этой категории являются небольшими. Они разрабатываются для то­ го, чтобы быстро решить проблему или получить ответ на вопрос. Рассмотрим пример. Вы собираетесь купить новую машину, поэтому необходимо для разных сумм кредита вычислить размер ежемесячной выплаты. Или вы решили создать диаграмму, которая будет отображать объем продаж вашей компании по месяцам. Введите 12 значений, ско­ пируйте диаграмму и вставьте ее в документ, создаваемый в текстовом процессоре. В обоих случаях на разработку модели уходит несколько минут, и, конечно же, у вас нет времени документировать свои действия. Скорее всего, вы и не думаете создавать какие-либо макросы или пользовательские диалоговые окна. Наверняка вы даже не счи­ таете нужным сохранять эти простые электронные таблицы на диске. Вот почему элек­ тронные таблицы этой категории не являются приложениями. Электронные таблицы “не для посторонних глаз” Как следует из названия, электронные таблицы, которые попадают в эту категорию, не увидит и не будет использовать никто, кроме вас — их разработчика. В качестве при­ мера можно привести файл с информацией, которая относится к оплате налогов, начис­ ляемых на основе ваших доходов. Вы открываете свой файл, когда к вам по почте при­ ходит чек, или “влезаете” в расходы, которые можно рассматривать как производствен­ ные, или же покупаете у торговцев на улице ворованную автомагнитолу и т.д. Другим примером является электронная таблица, в которой вы ведете учет времени, потраченно­ го вашими сотрудниками (отсутствие на работе по болезни, отпуск и т.д.) попусту или попросту прогулянного. Электронные таблицы данной категории отличаются, например, от созданных “на скорую руку”, которые не являются одноразовыми, поэтому их и сохраняют в файлах. Однако на них не стоит тратить много времени — примените простое форматирование (лишь в случае необходимости). В электронных таблицах этого типа также отсутствуют инструменты обнаружения ошибок: вы знаете, каким образом формулы создавались, по­ этому вам хорошо известно, как избежать ввода данных, приводящих к ошибочным ре­ зультатам. При появлении ошибки вы сразу будете знать, чем она вызвана. Сложность электронных таблиц этой категории со временем возрастает, однако они не являются приложениями. Однопользовательские приложения Это могут быть приложения электронных таблиц, используемые только их разработ­ чиком, однако по своей сложности вышедшие далеко за пределы электронных таблиц “не для посторонних глаз”. Например, я разработал рабочую книгу, чтобы вести в ней учет зарегистрированных пользователей условно-бесплатных приложений. Книга начи­ нается простой базой данных, расположенной на одном рабочем листе (она предназнача­ ется только для просмотра разработчиком). Однако вскоре эта рабочая книга также по­ надобилась для создания накладных и почтовых этикеток. Потратив однажды около часа на создание макросов, я понял, что превратил эту рабочую книгу из приложения “не для посторонних глаз” в настоящее однопользовательское приложение. 132 Часть II. Разработка приложений Excel Создавая для себя однопользовательские приложения, вы имеете прекрасную воз­ можность попрактиковаться с инструментами, которыми пользуются разработчики Ехсе1-приложений. Например, вы можете научиться создавать пользовательские диало­ говые окна, видоизменять меню, создавать пользовательские панели инструментов, пи­ сать VBA-макросы и т.д. Совет Работа над сложным проектом — наилучший способ освоить сложные функ­ ции Excel (а также любого другого приложения). Приложения-“спагетти” Среди электронных таблиц все еще распространены приложения-“спагетти”. Само понятие возникло из-за того, что иногда в отдельных частях приложения разобраться до­ вольно трудно; эти части во многом так же спутаны между собой, как спагетти на тарел­ ке. Большинство этих электронных таблиц разрабатывались как специализированные од­ нопользовательские приложения. Но со временем они перешли во владение других поль­ зователей, которые внесли свои изменения. По мере того как требования менялись, а сотрудники приходили и уходили, одни части появлялись, а другие игнорировались. Спустя некоторое время первоначальное назначение рабочей книги забылось. В резуль­ тате получился файл, используемый довольно часто, однако никто не знает, как же этот файл работает. Каждый, кто имеет дело с приложениями-“спагетги”, понимает, что их необходимо полностью переделывать. Но поскольку мало кто знает, как это сделать, со временем дела обстоят все хуже и хуже. Консультанты по процессорам электронных таблиц зарабатывают немалые деньги, занимаясь распутыванием таких приложений. Как правило, в процессе улучшения приложений-“спагетги” наиболее эффективным является следующее решение: заново определить, что нужно пользователям, и создать приложение “с нуля”. Приложения-утилиты Никто и никогда еще не был полностью доволен используемым процессором элек­ тронных таблиц. И какой бы хорошей ни была программа Excel, в ней все равно находят недостатки. Поэтому перейдем к следующей категории электронных таблиц — утили­ там. Это специальные инструменты, которые предназначены для выполнения единст­ венной повторяющейся задачи. Например, если вы часто импортируете текст в Excel, то вам, возможно, требуются специальные команды для обработки текста, в частности для преобразования (без использования формул) выделенного текста в верхний регистр. В данном случае рекомендуется разработать утилиту для обработки текста, которая бу­ дет выполнять необходимые задачи. Примечание Power Utility Рак — это коллекция приложений/утилит для программы Excel. Они разработаны для того, чтобы расширить функциональность программы. Эти утилиты работают, как обычные команды Excel. Пробную версию пакета Power Utility Рак можно загрузить с веб-сайта автора книги ( w w w . s p r e a d s h e e t p a g e . com). Желающие могут также получить полный исходный код за небольшую плату. Глава 5. Приложения электронных таблиц 133 По своей природе приложения-утилиты являются достаточно универсальными. Что касается макросов, то многие из них предназначены для того, чтобы выполнять конкрет­ ную операцию с данными конкретного типа, расположенными в рабочей книге, опять же, конкретного типа. Эффективное приложение-утилита работает так, как обычная команда Excel. Другими словами, утилите необходимо распознать контекст, в котором должна выполняться команда, и выполнить соответствующее действие. Чтобы утилита была в состоянии обрабатывать любые возможные ситуации, обычно используется громоздкий код, предназначенный для обработки ошибок. В приложениях-утилитах всегда используются макросы; в них также могут приме­ няться пользовательские диалоговые окна. Создать такие утилиты с помощью Excel до­ вольно легко: их следует преобразовать в надстройки и присоединить к пользователь­ скому интерфейсу Excel, чтобы эти утилиты выглядели, как часть программы. Перекрестная ссылка Вопросы разработки утилит очень важны, поэтому их рассмотрению посвя­ щена целая глава. В главе 16 рассматриваются методы создания пользова­ тельских утилит Excel средствами VBA. Надстройки с функциями рабочих листов Программа Excel располагает огромным количеством функций рабочих листов, кото­ рые можно использовать в формулах. Однако в некоторых случаях необходима определен­ ная функция, а ее поиски дают отрицательный результат. Для этого создайте собственную функцию, используя VBA. Благодаря пользовательским функциям рабочих листов форму­ лы часто становятся проще, а под держивать электронные таблицы оказывается легче. Перекрестная ссылка В главе 10 описывается процесс создания пользовательских функций рабо­ чего листа, а также приводится множество примеров. Одноблоковые бюджеты Под одноблоковым бюджетом подразумевается рабочий лист (не обязательно мо­ дель бюджета), который состоит из одного блока ячеек. Верхняя его строка может быть составлена из имен, относящихся к промежуткам времени (месяцам, кварталам или го­ дам), а левый столбец обычно состоит из категорий определенного типа. Как правило, нижняя строка и правый столбец составлены из итоговых формул. В блоке ячеек могут использоваться формулы подсчета промежуточных итогов. Данный тип электронных таблиц очень распространен. С учетом как раз этой модели была разработана программа VisiCalc (первый процессор электронных таблиц). В боль­ шинстве случаев простые модели одноблоковых бюджетов не являются удачными кан­ дидатами в приложения, так как они слишком просты. Впрочем, существуют исключе­ ния. Например, можно было бы преобразовать такую электронную таблицу в прило­ жение, если бы моделью одноблокового бюджета являлась громоздкая трехмерная электронная таблица, в которую необходимо включить сводные данные из других фай­ лов или которой будут пользоваться руководители отделов, возможно, не разбирающие­ ся в электронных таблицах. 134 Часть II. Разработка приложений Excel М одели“что если” Многие считают модель “что если” воплощением всего самого лучшего, что имеется в электронных таблицах. Способность мгновенно пересчитывать тысячи формул делает процессоры электронных таблиц идеальным инструментом для финансового моделиро­ вания, а также для других моделей, которые зависят от значений нескольких перемен­ ных. Если подумать, то почти каждая электронная таблица с формулами является моде­ лью “что если” (она часто распространяется в виде шаблона). Изменение значения в ячейке, используемой в формуле, имитирует ситуацию, приводящую к возникновению вопроса “Что будет, если?..” Кроме того, приложения данной категории довольно слож­ ные. Они состоят из электронных таблиц, которые специально разрабатывались для про­ гнозирования влияния отдельных значений на конечный результат. Модели “что если” являются хорошими кандидатами в приложения, ориентирован­ ные на пользователя, особенно если модель будет использоваться продолжительное вре­ мя. При условии создания для приложения удачного графического интерфейса его смо­ жет легко использовать даже тот, кто совсем не разбирается в компьютерах. Например, можно создать интерфейс, который предоставляет пользователю возможность задавать имена для различных наборов условий, мгновенно просматривать результаты выбранно­ го сценария и одним щелчком на кнопке создавать правильно отформатированные свод­ ные диаграммы. Электронные таблицы для хранения данных и доступа к ним Многие рабочие книги Excel состоят из одной или нескольких таблиц баз данных (иногда эти таблицы называются списками). Они могут использоваться для обработки любых данных, причем зачастую более простым способом, чем в случае использования СУБД. Если таблицы настроены правильно, для суммирования содержащихся в них дан­ ных могут применяться сводные таблицы. Электронные таблицы этой категории часто являются кандидатами в приложения, особен­ но если конечным пользователям необходимо выполнять операции умеренной сложности. Что же касается сложных приложений баз данных, в частности таких, в которых ис­ пользуется огромное количество таблиц с заданными связями между ними, то для них больше подходит настоящий процессор баз данных, например Access. Клиентские приложения баз данных Электронные таблицы все чаще применяются для доступа к внешним базам данных. Пользователи электронных таблиц с помощью инструментов Excel получают доступ к данным, хранящимся во внешних файлах, даже если у этих данных разные форматы. Приложение, выполняющее подобные задачи, часто называют управленческой информа­ ционной системой (Executive Information System— EIS). Такая система комбинирует данные из нескольких источников, генерируя выборки для пользователей. Доступ из электронной таблицы к внешним базам данных часто вызывает страх у на­ чинающих пользователей. Создание управленческой информационной системы является идеальным способом применения Excel, так как основная цель подобных систем обычно состоит в том, чтобы обеспечить простоту в использовании. Глава 5. Приложения электронных таблиц 135 Приложения “под ключ” Последняя категория электронных таблиц является самой сложной. “Под ключ” под­ разумевает такую готовность к применению, когда конечному пользователю достаточно минимальной подготовки. Например, при загрузке файла появляется окно, позволяющие сделать совершенно однозначный выбор. Приложения “под ключ” могут выглядеть так, будто они созданы не с помощью процессора электронных таблиц, и часто пользователь взаимодействует не с ячейками, а с диалоговыми окнами. Электронные таблицы многих описанных выше категорий вполне можно сделать приложениями “под ключ”. Среди общих элементов таких приложений самыми главны­ ми являются хорошее планирование, обработка ошибок и система пользовательского ин­ терфейса. О них речь пойдет в следующих главах. Глава Принципы разработки приложений электронных таблиц Вэтой главе... ♦ ♦ ♦ ♦ ♦ ♦ Этапы разработки приложения Определение потребностей пользователя Проектирование приложения с учетом потребностей пользователя Определение удобного пользовательского интерфейса Работа с конечным пользователем Другие вопросы разработки приложений В данной главе приведены общие правила, которые вы, возможно, сочтете полезны­ ми, когда будете учиться создавать эффективные приложения, работающие в Excel. Этапы разработки приложения К сожалению, не существует простого и безошибочного метода, который гарантиро­ вал бы создание эффективного приложения электронных таблиц. У каждого разработчи­ ка есть собственный стиль создания таких приложений, и наилучший способ определяет для себя сам разработчик. Кроме того, каждый проект, за который вы беретесь, отлича­ ется от других, и поэтому для его реализации требуется особый подход. И наконец, тре­ бования и общие представления людей, с которыми (или на которых) вам предстоит ра­ ботать, также играют определенную роль в процессе разработки. Как уже отмечалось в предыдущей главе, разработчики электронных таблиц несут от­ ветственность за соблюдение следующих требований: • определение потребностей пользователя; • планирование приложения, которое соответствует этим условиям; Часть II. Разработка приложений Excel 138 • разработка наиболее подходящего интерфейса пользователя; • создание электронной таблицы, формул, макросов и пользовательского интерфейса; • тестирование и отладка приложения; • изменение приложения с целью повышения его надежности и отказоустойчивости (часто по результатам тестирования); • эстетическая привлекательность и интуитивная ясность приложения; • документирование усилий, затраченных на разработку; • разработка пользовательской документации и справочной системы; • размещение приложения в компьютере пользователя; • обновление приложения в случае необходимости. Все эти требования необязательно соблюдать при создании каждого приложения, да и порядок их выполнения в разных проектах может быть разным. Перечисленные дейст­ вия описаны в следующих разделах. Что же касается технических деталей, то в большин­ стве случаев их также можно найти в следующих главах. Определение потребностей пользователя При разработке проекта приложения электронных таблиц одним из первых действий является точное определение потребностей конечного пользователя. И если вы не смо­ жете заранее оценить потребности аудитории, то позднее это обернется дополнительной работой по устранению недостатков. Именно поэтому оценить потребности необходимо в первую очередь. В отдельных случаях вы можете быть близко знакомы с конечными пользователями и даже сами можете выступать одним из них. Что же касается остальных случаев (например, вы работаете консультантом, который разрабатывает проект для нового клиента), то о пользо­ вателях или об их запросах вы, возможно, вообще ничего не будете знать. Каким образом можно рпределить потребности пользователей? Если вам необходимо разработать приложение электронной таблицы, встретьтесь с потенциальными пользова­ телями и опросите их. А еще лучше — изложите пользователям свое видение разрабаты­ ваемого приложения в виде печатных документов, создайте блок-схему, уделите внима­ ние мелким деталям и сделайте все, чтобы создать именно такое приложение, какое нужно пользователю. Ниже приведены основные правила, придерживаясь которых, вы облегчите началь­ ную фазу разработки. • Не убеждайте себя в том, что уже знаете потребности пользователей. Если на этом этапе основываться на предположениях, в дальнейшем неизбежно возникнуть проблемы. • Если существует такая возможность, говорите непосредственно с потенциальны­ ми клиентами приложения, а не только с руководителем проекта или управляю­ щим фирмы. • Узнайте, что уже сделано (если только сделано) для удовлетворения потребностей пользователей. Вы, возможно, сэкономите часть своего времени, переделав суще­ ствующее приложение. В крайнем случае, изучая имеющиеся решения, вы более подробно изучите работу конечных пользователей. Глава 6. Принципы разработки приложений электронных таблиц 139 • Определите, какие ресурсы имеются в распоряжении пользователя. Постарайтесь, например, узнать, существуют ли какие-либо аппаратные или программные огра­ ничения, которые нужно учитывать. • По возможности, определите все типы систем, в которых будет запускаться ваше приложение. В случае, если приложение будет выполняться в низкопроизводи­ тельных системах, примите этот факт к сведению. Для получения дополнительных сведений по этой теме обратитесь к разделу “Быстродействие системы”. • Узнайте, какая версия (или версии) Excel используется в системе. Компания Microsoft делает все возможное, чтобы убедить пользователей применять послед­ ние версии выпускаемых ею программ. Однако по результатам проведенного оп­ роса последние версии пакета Microsoft Office доступны менее чем половине всех пользователей этого пакета. • Узнайте уровень квалификации конечных пользователей. Эта информация помо­ жет вам правильно разработать приложение. • Определите, как долго будет использоваться приложение и нужно ли будет его изме­ нять. Это повлияет на выполняемые операции и поможет спланировать изменения. И последнее замечание. Не удивляйтесь, если назначение проекта за время его разра­ ботки изменится. Такая ситуация возникает довольно часто, и если изменения не окажут­ ся для вас сюрпризом и вы к ним будете готовы, то всегда окажетесь в выигрышной по­ зиции. На всякий случай убедитесь, что в вашем контракте (если таковой имеется) учте­ на возможность изменения спецификаций проекта. Проектирование приложения с учетом потребностей пользователя Определив потребности конечных пользователей, вы можете почувствовать желание погрузиться в работу, т.е. прийти на помощь тому, кто страдает от нерешенной пробле­ мы. И все же наберитесь терпения. Строители не возводят дом без чертежей, и вам не следует разрабатывать приложение электронных таблиц без предварительного плана. Конечно, правильность плана зависит от области действия проекта и привычного вам стиля работы, однако подумайте хотя бы некоторое время над тем, что же вы собирае­ тесь делать и чего хотите достичь. Прежде чем закатать рукава и сесть за клавиатуру, обдумайте разные способы, кото­ рые помогут приблизить решение проблемы. Вот здесь как раз и окупится глубокое по­ знание возможностей Excel! Всегда лучше обойти незнакомые закоулки стороной, чем блуждать в них. Если вы попросите десять “гуру” Excel разработать приложение на основе очень точ­ ных спецификаций, то, скорее всего, получите десять разных реализаций проекта, кото­ рые все как одна будут соответствовать предложенным спецификациям. Среди этих ре­ шений одни наверняка будут лучше, чем другие, поскольку Excel позволяет выполнить одно и то же задание несколькими способами. И если вы досконально изучите эту про­ грамму, то будете иметь достаточно хорошее представление о методах, которые имеются в вашем распоряжении, и сможете выбрать самый оптимальный способ реализации те­ кущего проекта. Часто именно благодаря только творческому подходу рождается наибо­ лее эффективный (и значительно превосходящий другие) способ. 140 Часть II. Разработка приложений Excel Итак, на начальном этапе планирования проекта вам придется обдумать следующие вопросы. • Файловая структура. Подумайте, что вы будете использовать: одну рабочую книгу с множеством листов, несколько однолистных рабочих книг или файл шаблона. • Структура данных. Обязательно учтите структуру данных, которые будут ис­ пользоваться в приложении. В том числе необходимо решить, использовать ли файлы внешних баз данных или хранить всю информацию в рабочих листах. • Формулы или VBA. Обдумайте, что требуется для вычислений: формулы или процедуры VBA? Каждый из представленных вариантов имеет свои достоинства и недостатки. • Надстройка или файл рабочей книги. В некоторых случаях наилучшим вариан­ том конечного продукта является надстройка, хотя не исключено применение над­ стройки вместе со стандартной рабочей книгой. • Версия Excel. Где будет запускаться разработанное Ехсе1-приложение? Только вереде Excel 2010? В среде Excel 2007? Или в Excel 2000/2002? А как насчет Excel 97, Excel 95 либо Excel 5? Будет ли приложение работать на платформе Macintosh? Это очень важные вопросы, поскольку в каждой следующей версии Excel появляются новые свойства, отсутствовавшие в предыдущих версиях. Но­ вый пользовательский интерфейс вызывает больше трудностей, чем создание при­ ложений, работающих с прежними версиями. • Обработка ошибок. Для приложений немаловажным вопросом является обра­ ботка ошибок. Определите, как ваше приложение будет “отлавливать” ошибки и что оно будет с ними делать. Например, если ваше приложение применяет фор­ матирование к активному рабочему листу, то необходимо предусмотреть случай, когда активным будет лист диаграммы. • Использование специальных возможностей. Если в вашем приложении будет суммироваться большое количество данных, то подумайте над использованием такого средства Excel, как сводные таблицы. Вам также потребуется такая воз­ можность Excel, как проверка данных, чтобы тестировать вводимые данные. • Вопросы производительности. Решить вопрос увеличения производительности и эффективности своего приложения следует еще на стадии проектирования, а не тогда, когда приложение создано и от пользователей поступают жалобы. • Уровень безопасности. В Excel предусмотрено несколько вариантов защиты, кото­ рые призваны предотвратить доступ к определенным элементам рабочей книги. На­ пример, вы можете блокировать ячейки, чтобы нельзя было изменить находящиеся в них формулы, или назначить пароль, чтобы неавторизованные пользователи не смогли просматривать определенные файлы или получать доступ к ним. Вы облег­ чите свою работу, если заблаговременно и точно определите, какой именно компо­ нент нуждается в защите и каким должен быть уровень этой защиты. Примечание Не стоит абсолютно доверять средствам защиты данных в Excel. Если нужно обеспечить действительно эффективную защиту, вряд ли для этого подой­ дет Excel. Глава 6. Принципы разработки приложений электронных таблиц 141 На данном этапе вам, возможно, придется иметь дело со многими другими трудно­ стями разработки приложения. Важно рассмотреть все возможности и не начинать реа­ лизовывать первое решение, которое придет вам в голову. Кроме того, при разработке приложения не забывайте о его возможных изменениях. Вы добьетесь больших успехов, если ваше приложение будет как можно более универсальным. Например, не создавайте процедуру, которая работает только с определенным диапазоном ячеек. Пусть ваша процедура в виде аргумента принимает любой диапазон данных. Когда придет время изменений в проекте, такая возможность существенно облегчит процесс ре­ дактирования приложения. Кроме того, вы, возможно, увидите, что текущий проект в оп­ ределенной мере напоминает другой проект. Поэтому при планировании всегда помните о такой возможности, как повторное использование одних и тех же структур. Обучение в процессе разработки Теперь несколько слов о реальном положении дел. Excel — программа изменчивая. Период между ее обновлениями составляет от 18 до 24 месяцев. Это означает, что в ва­ шем распоряжении менее двух лет, чтобы справиться с текущими инновациями, иначе вам придется бороться не только с ними, но и с другими нововведениями. Программа Excel 5, которая подарила нам VBA, стала для разработчиков Excel “изменением парадигмы” управления данными. Ранее тысячи людей зарабатывали се­ бе на жизнь, создавая приложения Excel, которые в основном писались на макроязыке XLM, представленном в версиях Excel 2, 3 и 4. Начиная с Excel 5 стали доступными де­ сятки новых инструментов, которые активно используются разработчиками. С появлением программы Excel 97 разработчики столкнулись с еще одной “сменой парадигмы” . В этой версии появился новый формат файлов, редактор языка Visual Basic Editor (VBE) и пользовательские формы, которые пришли на смену диалоговым листам. В Excel 2000, 2002 и 2003 появилась новые возможности, которые были уже не столь радикальными, как в предыдущих версиях. Программа Excel 2007 — это огромный шаг вперед по сравнению с предыдущими версиями, и основная проблема связана с появлением нового “ленточного” интерфей­ са пользователя. Ранее создание пользовательских меню и панелей инструментов бы­ лоотносительно простым и могло выполняться исключительно средствами VBA. Теперь же изменение ленты требует дополнительной работы, причем не только с помощью VBA. Кроме того, следует учитывать новые форматы файлов. Исходя из этого, я реко­ мендую создавать две версии приложения: для Excel 2007/2010, а также для Excel 2003 и более ранних версий. Язык VBA изучить несложно, но потребуется время, чтобы почувствовать себя ком­ фортно: для совершенного овладения этим языком придется приложить немало усилий. Развитие VBA продолжается. Следовательно, не удивительно, что, разрабатывая с помо­ щью VBA приложения, вы одновременно изучаете этот язык. Более того, изучить VBA не­ возможно, если вплотную не заниматься разработкой приложений. Намного проще изу­ чить VBA, имея проект, для реализации которого требуется исключительно этот язык. Изучение VBA ради “любви к искусству” вряд ли приведет к серьезным результатам. Опыт показывает, что нельзя при решении проблемы целиком полагаться на конеч­ ных пользователей. Предположим, руководителю отдела требуется приложение, генери­ рующее текстовые файлы, которые будут импортироваться в другое приложение. В дан­ ном случае главное — не путать потребности пользователя с искомым решением. Поль­ зователю необходим совместный доступ к данным. А использование промежуточного Часть II. Разработка приложений Excel 142 текстового файла является всего лишь частным решением этой проблемы. Ведь могут быть и другие частные решения, например прямая передача информации с помощью DDE или OLE. Иначе говоря, нужно запретить пользователю представлять его проблему в виде конечной задачи. Определить наиболее удачное решение общей проблемы — это уже ваша работа. Определение удобного пользовательского интерфейса Разрабатывая электронные таблицы, которые будут применяться другими людьми, сле­ дует обратить особое внимание на пользовательский интерфейс. Пользовательский интер­ фейс — это метод взаимодействия пользователя с приложением и вызова макросов. С появлением Excel 2010 (и Excel 2007) некоторые из применявшихся ранее решений уже не годятся. Так, например, уже не применяются пользовательские меню и панели инструментов. Современным разработчикам приходится учиться работать с лентой. Вниманию разработчиков Excel предлагается ряд свойств, имеющих отношение к разработке пользовательского интерфейса: • настройка ленты; • настройка контекстного меню; • “быстрые” клавиши; • создание пользовательских диалоговых окон (пользовательских форм); • размещение непосредственно на рабочем листе элементов управления (например, L is tB o x либо CommandButton). Эти возможности кратко рассмотрены в следующих разделах, а более подробно — в следующих главах. Меню и панели инструментов В Excel 2010 поддерживаются пользовательские меню и панели инструментов, хотя и при разработке этих элементов пользовательского интерфейса у пользователя могут возникать определенные проблемы. На следующем рисунке показаны пользовательское меню и панель инструментов, которые отображены в Excel 2003. Эти элементы были созданы с помощью надстройки Power Utility Рак. Каждый элемент меню и панели инструментов вызывает макрос. Когда надстройка Power Utility Рак установлена в Excel 2010 (см. следующую иллю­ страцию), пользовательское меню появляется в группе Надстройки^Команды меню (Add-lns^Menu Commands), а пользовательская панель инструментов попадает в груп­ пу Надстройки^Пользовательские панели инструментов (Add-lns^Custom Toolbars). Об­ ратите внимание, что панели инструментов нельзя перемещать, а также невозможно изменять их размеры. Эти группы ленты отображают дополнения к меню и панели ин­ струментов для всех загруженных приложений либо надстроек. Кнопки меню и панелей инструментов вполне функциональны, хотя их использование приводит к нарушению исходной парадигмы интерфейса пользователя Excel 2010. Для решения этой проблемы я разработал новую версию утилиты PUP, предназна­ ченную для Excel 2007 и более поздних версий. Глава 6. Принципы разработки приложений электронных таблиц -£3] Файт Правка бив встдека Формат Сервис jeUPve \ Окно Справка FtxTnatSnQTools Worksheet Tools * WorkfeookToote 1 ^ ft Chart Graphic Tools / Ы^ Pnmng Tools » Bate & Time Toots » Auditing Tools ► yBA ft Macro Tools ► аоп 54■* *. % * 3 F Chanced Shortcut Menus * а ci «з I & а а гГ|*4,;= а акехваш а &£>с§>|Я EJ ШФ) IBь з щ,± & п X ^ р * _ (9 > Ф M -l N -------- j. O P Q i " -j Sort Sheets... SaveWitft^dap... 1 Create Workbook Contents Sheet... □ Fiename Lister f Custom» A New Workbook -------- j-------- 1---------j-------- j PUP Boolanartp □ * Jd € Й*Ж» т11листа1 Введите вопрос \ - ф| ► P * ’ A '! ► 1 ► ! i- . J .... 1 к ...|.....t.... L ► m Insert He at Cursor... ► m Interactive tfde / Ul*»de... Г1 100% FomnJa Tools 7Г 1ГТ... П1 ш яят Adofee PDF Sange Toots у ШШщЩ.Щ 143 Create а PUP Toolbar... т Amusement? ► PUPftjtions... <в ? us в = HHp About Power Utikty Pak... | ; | n ZJ “ J - -- - ' iVorksheet Tools 1 InsertFileA Conot £h*t &Gr*phKTooH Q*t« &T*k Tooh &MacroTook (3 SwUbMto... % S»HWhe»tkuB... f> •E S.re«< WorkbookConHnh Slwrt * CuttMoa* AHrwftoritboot... В PUPflpttow... 41tw> Настройка ленты Ленточный интерфейс, появившийся в Excel 2007, представлял собой революцион­ ный прорыв в области разработки пользовательских интерфейсов. Причем разработчики получили возможность контролировать внешний вид и функции ленты. С появлением версии Excel 2010 пользователи также получили возможность изменять ленту, хотя мо­ дификация интерфейса пользователя с помощью кода является непростой задачей. © Перекрестная ссылка Дополнительные сведения о работе с лентой можно найти в главе 22. 144 Часть II. Разработка приложений Excel Настройка контекстных меню В Excel 2010, как и раньше, поддерживаются контекстные меню, разрабатываемые на языке VBA, которые вызываются щелчком правой кнопки мыши. На рис. 6.1 показано настраиваемое контекстное меню, которое отображается после щелчка правой кнопкой мыши на номере строки. Обратите внимание, что это меню включает дополнительные пункты (помечены буквой “Р”), которые изначально невидимы. Т " ------------- Т ““ ------------- Г -------------- 1-----Calibri Ж г * -jll - А" к Щ ' лг ш S t % ООО Щ <9 ...............................................: : : : : : : .....„ ..... Вырезать . Копировать л Параметры вставки: В Специальная встзвкз... Вставить... Удалить... Очистить содержимое Фильтр ► Сортировка ► Цд Вставить примечание ш Формат ячеек... Выбрать из раскрывающегося списка... Присвоить имя... & Гиперссылка... D Г Toggle Page Break Display Р Toggle Word Wrap ► Change Case P Upper Case Р Print Selection P Lowercase M l Р Center Across Selection P Proper Case Р Synchronize Sheets Р PUP Date Picker Р PUP InfoBox ..... ....... .... ... г ..... Г” \ г Рис. 6.1. Пример настраиваемого контекстного меню Перекрестная ссылка В главе 23 описывается работа с контекстным меню с помощью VBA. Комбинации клавиш В распоряжении разработчика Excel имеется ряд комбинаций клавиш. В частности, макросу можно назначить клавишу <Ctrl> (либо комбинацию клавиш <Shift+Ctrl>). По­ сле нажатия этих клавиш макрос вызывается на выполнение. Имейте в виду, что в этом случае могут быть свои “подводные камни”. Для того что­ бы их избежать, следует объяснить пользователю назначение этих клавиш. Также при выборе комбинации клавиш проверяйте, не используются ли они еще где-нибудь. Ком­ Глава 6. Принципы разработки приложений электронных таблиц 145 бинация клавиш, назначаемая макросу, имеет больший приоритет, чем встроенные ком­ бинации клавиш. Например, рассмотрим встроенную в Excel комбинацию клавиш <Ctrl+S>, используемую для сохранения текущего файла. Если эту комбинацию исполь­ зовать для вызова макроса, вы не сможете сохранить файл нажатием клавиш <Ctrl+S>. Обратите внимание, что комбинации клавиш чувствительны к регистру символов, по­ этому в данном случае можно использовать клавиши <Ctrl+Shift+S>. Создание п о л ь з о в а т е л ь с ки х д и а л о го в ы х о ко н Если вы какое-то время работали в Excel, то, несомненно, знакомы с диалоговыми окнами. Пользовательские диалоговые окна играют важную роль в тех интерфейсах, ко­ торые вы разрабатываете для своих приложений. Пример пользовательского диалогового окна показан на рис. 6.2. xj Tra n sfo rm V ertica l R an ge This utility transforms data stored in a single column, to a multjcdumn format. line 2 Line 1 . Line 4 Line? Line 10 Line 2 Line 5 [Line 8 Une 11 Line 4 Line 5. Line 6 Line 3 Lme 6 Line 9 Line 12 Bata to be transformed {single column}: j Лисг1!$0$5:$0$22 Output range (smgte сей); J Лист1!Я-$3 J Rows per record (~ Sank cell delimits records ±1 |4rows per record bne 10 Line 11 Line 12 Рис. 6.2. Диалоговое окно, созданное с помощью свойства пользовательских форм Excel С помощью пользовательского диалогового окна (UserForm) пользователь может вве­ сти те или иные данные, получить выбранные им варианты или предпочтения, а также задать ход выполнения всего приложения. Создавать и редактировать пользовательские диалоговые окна вы можете в редакторе Visual Basic (Visual Basic Editor — VBE). Эле­ менты, из которых состоит диалоговое окно, называются элементами управления (к ним относятся кнопки, раскрывающиеся списки, флажки и т.д.). Они также называются эле­ ментами управления ActiveX. Можно пользоваться не только стандартным набором та­ ких элементов, который поддерживается в Excel. Вы вправе применять элементы управ­ ления, которые созданы сторонними производителями. Добавив элемент управления в диалоговое окно, можно связать его с ячейкой рабочей таблицы, поэтому ему не потребуется макрос для управления (если не считать простого макроса, с помощью которого отображается само диалоговое окно). Связать элемент управления с ячейкой несложно, однако такой способ приема данных, вводимых пользо­ вателем в диалоговое окно, не всегда является лучшим. Гораздо чаще для работы с раз­ работанными вами диалоговыми окнами придется создавать VBA-макросы. П ер е кр естн ая ссы лка Подробнее пользовательские формы будут рассмотрены в части IV. Часть II. Разработка приложений Excel 146 Использование элементов управления ActiveX на рабочем листе В Excel элементы управления ActiveX, предназначенные для пользовательских форм, можно вставлять и на графический слой (невидимый слой в верхней части лис­ та, на котором находятся рисунки, диаграммы и другие объекты). На рис. 6.3 пред­ ставлена простая модель рабочего листа с несколькими элементами управления поль­ зовательских форм. На рабочем листе находятся следующие элементы управления: флажок (C h e c k b o x ), полоса прокрутки ( S c r o l l B a r ) , а также два набора переключате­ лей (O pt io n B u t t o n s ) . Эта рабочая книга не использует макросы, а элементы управле­ ния связаны с ячейками рабочего листа. А с В Е т .F ] G Н 1 1 Параметры кредита 2 4 5 Связанные ячейки 565 Значение ползунка 3 Сумма выплат: $145 ООО 5,65 Процент О Финансировать выплаты по кредиту $5,000 ЛОЖЬ 6 7 Фикс, ставка: 8 с 10% О 30 лет с 15% (• 15 лет 9 Срок кредита: 10 ЛОЖЬ 30 лет ИСТИНА 15 лет ® 20% И Платеж по кредиту $276 000 Сумма кредита 15 лет 12 Сумма кредита: 13 14 15 j J $276 000 1J 5,65% 10% 15% ИСТИНА 20% 20% ставка 16 17 ЛОЖЬ ЛОЖЬ Месячный платеж: $2 277,18 18 График погашения 19 20 .11 Рис. 6.3. Можно добавить элементы управления диалоговым окном в рабочие листы, а затем связать их с ячейками Компакт-диск Эту рабочую книгу можно найти на прилагаемом компакт-диске (файл w s h e e t o r k ­ c o n t r o l s . x l s x ) . Возможно, самым распространенным элементом управления является C om m andBut t o n . Сами по себе кнопки не выполняют никаких функций, но каждой из них вы можете назначить макрос. Используя элементы управления непосредственно на рабочем листе, можно не созда­ вать пользовательские диалоговые окна. Часто вставка в рабочий лист нескольких эле­ ментов управления ActiveX значительно упрощает работу с электронной таблицей. В ре­ зультате пользователь сможет выбирать то, что ему нужно, работая со знакомыми эле­ ментами управления, а не вводя значения в ячейки. Для получения доступа к элементам управления используется команда Разработчик^ Элементы управления^Вставить (Developer^ControlsOInsert) (рис. 6.4). Если вклад- Глава 6. Принципы разработки приложений электронных таблиц 147 ка Разработчик не отображается на ленте, устраните эту проблему с помощью раздела Настройка ленты, находящегося в диалоговом окне Параметры Excel. ЯЗ Запись макроса [ЗГ Свойства Свойства карты Импорт §39 Относительные ссылки С р Просмотр кода Пакеты расширения Экспорт конструктора И Отобразить о кно Надстрой» И° ° <в$ Обновитьданные Область документа Изменение Элементы управления формы flis iid Па, 2 а\ШШ ■и н а я s ЕЕ Рис. 6.4. Элементы управления на рабочем листе Все элементы управления делятся на две группы: элементы управления формами и элементы управления ActiveX. Оба набора элементов управления имеют свои преиму­ щества и недостатки. В общем случае элементы управления формами проще в примене­ нии, но зато элементы управления ActiveX более гибкие. Информация об этих классах элементов управления представлена в табл. 6.1. Таблица 6.1. Элементы управления формами и элементы управления ActiveX Элементы управления ActiveX Элементы управления формами Версии Excel Элементы управления 97, 2000, 2002, 2003, 2007, 2010 5, 95, 97, 2000, 2002, 2003, 2007, 2010 CheckBox, T extB o x, Command- G r o u p B o x , B u t t o n , C h e c k B o x , O p t i ­ B u t t o n , O p t i o n B u t t o n , L i s t B o x , o n B u t t o n , L i s t B o x , DropD ow n (Combo­ ComboBox, T o g g l e B u t t o n , S p i n - Box), S c r o l l B a r , S p i n n e r B u t t o n , S c r o l l B a r , L a b e l , Im age (могут быть и другие) Хранение кода В любом стандартном VBA-модуле В модуле кода макросов листа Соответствует имени элемента Любое указанное вами имя Имя макроса управления (например, Command_ B u tto n l_ C lic k ) Элементам управления пользова­ Элементам управления диалоговых листов (в версиях, предшествующих тельских форм Excel 97) Настройка В широком объеме с помощью па­ Минимальная нели Properties Есть ли реакция Только на события C l i c k (Щелчок) Да на события и C h a n g e (Изменение) Нему соответствует Разработка собственно приложения Когда вы определите потребности пользователя, подберете тип проекта, который должен удовлетворить их запросы, и решите, какие компоненты необходимо применить 148 Часть II. Разработка приложений Excel в пользовательском интерфейсе, настанет время завершить подготовительные операции и приступить к созданию самого приложения. Этот этап, конечно же, занимает значи­ тельную часть времени, которое тратится на реализацию проекта. Каким образом вы будете создавать приложение, зависит от вашего персонального сти­ ля работы и от природы самого приложения. Если ваше приложение не является простой рабочей книгой, содержащей шаблоны бланков для заполнения, то в нем, скорее всего, бу­ дут использоваться макросы. Написание макросов требует много времени и сил. Не думай­ те, что создавать макросы невероятно сложно — трудно создавать хорошие макросы. Работа с конечным пользователем В настоящем разделе речь пойдет о весьма важных проблемах разработки, которые дают о себе знать, когда приложение становится работоспособным и приближается вре­ мя размещать готовый проект в системах конечных пользователей. Тестирование приложения Сколько раз коммерческое приложение “отказывает” в самый неподходящий момент? Скорее всего, проблема вызвана недостаточно качественным тестированием, в результа­ те которого были обнаружены не все ошибки. Конечно, ошибки есть во всех коммерче­ ских программах, просто в самых лучших программах их заметить труднее. Вы часто будете сталкиваться с ситуацией, когда необходимо обойти ошибки, не отслеженные в самой программе Excel, иначе ваше приложение так и не заработает. Создав приложение, не забудьте его протестировать. Это один из самых важных эта­ пов. Нередко на тестирование и отладку приложения уходит столько же времени, сколь­ ко на создание его исходного варианта. В конце концов, пишете вы процедуру VBA или создаете формулы рабочего листа, вам все равно захочется убедиться, что приложение работает именно так, как предполагалось. Склонность к ошибкам имеют не только стандартные компилированные приложения. То же самое можно сказать и о приложениях электронных таблиц. Ошибка обычно оп­ ределяется следующим образом: (1) это нечто такое, что при выполнении программы (или приложения) происходит, но происходить не должно; (2) это нечто такое, что не происходит, но происходить как раз обязано. Оба вида ошибок одинаково опасны. По­ этому значительную часть времени, которое уйдет на разработку, вы должны выделить на тестирование приложения во всех возможных условиях и на исправление любых воз­ никших проблем. К сожалению, иногда не только вы виноваты в проблемах. Свою лепту вносит и сама программа Excel (см. врезку “Ошибки? В Excel?”). Ошибки? В Excel? Вы, возможно, думаете, что такой продукт, как Excel, используемый миллионами лю­ дей по всему миру, не должен содержать ошибок (по крайней мере грубых). Увы, это не так. Программа Excel настолько сложна, что вполне естественно ожидать от нее неадек­ ватных действий. И конечно же, подобные действия вызываются разного рода ошибками. Создать такой программный продукт, как Excel, — задача не из легких даже для ком­ пании Microsoft с ее, на первый взгляд, неограниченными ресурсами. При выпуске про­ граммы нельзя избежать компромиссов. Общеизвестно, что крупные производители вы­ пускают свои приложения, прекрасно осознавая, что в тех содержатся ошибки. Большин­ ство этих ошибок настолько незначительны, что на них вообще можно не обращать Глава 6. Принципы разработки приложений электронных таблиц 149 внимания. Конечно, компании — производители программ могли бы повременить с вы­ пуском своих продуктов на пару месяцев и исправить большинство ошибок. Но програм­ мы, как и многие другие товары, являются “ скоропортящимися” продуктами. Прибыли от задержанного по выпуску продукта часто меньше израсходованных на него средств. И хотя в программе Excel имеются ошибки, большинство ее пользователей никогда с ними не столкнется. В данной книге отмечены важные проблемы, связанные с использованием Excel. Кроме них, вы, конечно же, найдете и другие ошибки. Некоторые проблемы характерны только для конкретной версии Excel и в определенной аппаратно программной конфи­ гурации. Это наихудшие из ошибок, поскольку их распознать весьма непросто. Так как же быть разработчику приложений? Именно так, как призывает доктрина об­ хода ошибок. Если то, что вы пытаетесь делать, не работает, хотя все говорит о том, что должно работать, самое время перейти к плану Б. Обидно? Конечно! Потеря времени? Несомненно! Такова судьба разработчика... Вероятно, не стоит напоминать о необходимости тщательного тестирования любых электронных таблиц, которые вы разрабатываете для других. Учитывая особенности пользовательской аудитории своего приложения, вы можете сделать его отказоустойчи­ вым. Другими словами, попробуйте прогнозировать все возможные ошибки и недочеты, которые потенциально могут допускаться пользователями, и приложите усилия, чтобы их избежать (или хотя бы красиво скрыть). Это не только поможет конечному пользова­ телю, но и позволит не запятнать вашей репутации. Конечно, не в ваших силах прогнозировать все возможности, однако создаваемые макросы должны обрабатывать основные виды ошибок. Например, пользователь вместо числового значения ввел текстовое или пытается запустить ваш макрос, когда рабочая книга еще не открыта. Он может скрыть диалоговое окно, так ничего и не настроив, или нажать комбинацию клавиш <Ctrl+F6> и перейти к следующему окну. Что делать в этих ситуациях? Когда вы приобретете достаточный опыт, то такого рода вопросы станут для вас обязательными при тестировании приложений, и вы будете отвечать на них без лиш­ них раздумий. Акак же бета-тестирование? Производители программ обычно предусматривают для своих новых продуктов процедуры тщательного тестирования. После интенсивного внутреннего тестирования выпуску продукта на рынок обычно предшествует его тестирование группой заинтере­ сованных пользователей. Подобная операция приобрела название бета-тестирования. На этом этапе часто обнаруживаются новые проблемы, обычно устраняемые ко време­ ни выпуска конечного продукта. Если вы разрабатываете в Excel приложение, которым будет пользоваться большое количество человек, то, возможно, будет нелишним провести его бета-тестирование. Такое тестирование позволит запустить созданное приложение в предназначенном для него программном окружении на, как правило, разном оборудовании и именно теми пользователями, для которых оно предназначено. Период бета-тестирования начинается после завершения самостоятельного тести­ рования приложения и перед распространением программного продукта среди поль­ зователей. Определите группу пользователей, которые будут помогать вам тестировать продукт. Наилучшие результаты бета-тестирования достигаются тогда, когда бетатестеры получают в свое распоряжение абсолютно все, что входит в комплект поставки приложения: программную документацию, программу установки, компьютерную спра­ Часть II. Разработка приложений Excel 150 вочную систему и т.д. Узнать результаты бета-тестирования можно путем личного об­ щения, анкетирования или по телефону. Прежде чем отважиться на распространение своего продукта среди пользователей, вы наверняка столкнетесь с проблемами, для устранения которых потребуется внести дополнительные исправления или выполнить корректировку. Конечно, на бетатестирование требуется дополнительное время, и не все проекты (и разработчики) мо­ гут позволить себе подобную роскошь. Как сделать приложение отказоустойчивым Нарушить структуру электронной таблицы очень легко. Часто удаление одной важной формулы или ключевого значения вызывает ошибки во всей таблице и даже в других зави­ симых таблицах. Более того, если поврежденную таблицу сохранить, то на диске она заме­ нит правильную копию. И если резервное копирование приложения вами не выполнялось, то его пользователь будет очень расстроен, в чем, скорее всего, обвинит именно вас. Теперь понятно, зачем устанавливается дополнительная защита приложения, прежде чем пользователи (особенно начинающие) приступят к его применению для решения конкретных задач.,В Excel для защиты рабочих листов и их частей можно использовать несколько способов. • • • • Блокирование определенных ячеек. Можно заблокировать определенные ячей­ ки, чтобы предотвратить их изменение. (Задается с помощью вкладки Защита (Protection) диалогового окна Формат ячеек (Format Cells).) Блокировка вступает в силу только после выбора команды Рецензированием Изменениям Защитить лист (ReviewMChangesMProtect Sheet). В диалоговом окне Защита листа (Protect Sheet) находится ряд параметров, определяющих действия, которые выполняются по отношению к защищенному листу (рис. 6.5). -2i*i Сокрытие формул для некоторых ячеек. Если W Защитить лист и содержимое защищаемых ячеек нужно скрыть формулы для определенных яче­ ек, воспользуйтесь вкладкой Защита (Protection) Пароль для отключения защиты w cra: в диалоговом окне Формат ячеек (Format Cells), Разрешить всем пользователям этого листа: после чего эти формулы не смогут видеть другие щ ш ш ш ш ш ш ш т выделение незаблокированных ячеек пользователи. И опять же, эта команда действует W Г" форматирование ячеек форматирование столбцов только в том случае, когда документ защищен Г~ Г" форматирование строк путем применения к нему команды Рецензиро­ Г" вставку столбцов Г~ вставку строк ванием ИзмененияМЗащитить лист (R eview M Г” вставку гиперссылок Г" удаление столбцов ChangesMProtect Sheet). Г" удаление строк JH Защита всей рабочей книги. Можно защитить всю рабочую книгу — ее структуру, расположе­ ние окон и их размеры либо то или другое. Для этого используйте команду Рецензированием ИзмененияМЗащитить книгу (ReviewM ChangesM Protect Workbook). Рис. 6.5. В диалоговом окне Защи­ та листа (Protect Sheet) указывает­ ся, что можно и чего нельзя делать пользователям Блокирование объектов на рабочем листе. Перейдите на вкладку Свойства (Properties) в диалоговом окне Размер и свойства (Size and Properties) для бло­ кирования объектов (например, фигур), чтобы предотвратить их изменение либо перемещение. Для получения доступа к этому диалоговому окну выделите объект Глава 6. Принципы разработки приложений электронных таблиц 151 и щелкните на значке открытия диалогового окна в группе Средства рисования^ Формат^Размер (Drawing Tools^Format^Size). Блокирование объектов дает эффект в том случае, когда документ защищен путем применения команды Рецензирование^Изменения^Защитить лист (Review^Changes^Protect Sheet). По умолчанию все объекты заблокированы. • Сокрытие строк, столбцов, рабочих листов и документов. Можно скрывать строки, столбцы, рабочие листы и целые рабочие книги. Благодаря этому рабочий лист приобретает аккуратный вид, а защищенные области скрываются от любо­ пытных глаз. • Выбор для рабочей книги Excel режима “только чтение". Можно перевести рабочую книгу Excel в режим “только чтение” (и воспользоваться паролем), что позволит гарантировать вероятность перезаписи файла. Для этого используется диалоговое окно Общие параметры (General Options). Для его открытия выбери­ те команду Файл^Сохранить как (File^Save As). В диалоговом окне Сохране­ ние документа (Save As) щелкните на кнопке Сервис (Tools) и выберите пункт Общие параметры (General Options). • Назначение пароля. Можно воспользоваться паролем для предотвращения не­ санкционированного доступа к своим файлам. Назначить пароль можно в диало­ говом окне Общие параметры (General Options). Для открытия этого окна выбе­ рите команду Файл ^Сохранить как (File^Save As). В диалоговом окне Сохра­ нение документа (Save As) щелкните на кнопке Сервис (Tools) и выберите пункт Общие параметры (General Options). • Используйте защищенную паролем надстройку. Можно обратиться к защи­ щенной паролем надстройке, которая предотвращает изменение всего, что есть на рабочих листах. Защита данных паролем в Excel Компания Microsoft никогда не рассматривала Excel в качестве полностью защи­ щенной программы. И тому есть определенная причина — взломать систему паролей Excel на самом деле совершенно несложно. Существует несколько коммерческих про­ грамм, с помощью которых взлом паролей не представляет особого труда. Программа Excel 2002 и более поздние версии снабжены более мощной защитой (по сравнению с предыдущими версиями), но все же этого недостаточно. Не стоит считать защиту в Excel абсолютно надежной. Конечно, она достаточна, чтобы противодействовать слу­ чайному пользователю, но если кому-то действительно захочется взломать пароль, то он, скорее всего, добьется своего. Создание привлекательных и интуитивно понятных приложений Если вам приходилось использовать несколько программных пакетов, то вы, несо­ мненно, видели плохо разработанные пользовательские интерфейсы, сложные в приме­ нении программы и просто отвратительные диалоговые окна. Разрабатывая электронные таблицы для других пользователей, не забывайте уделить особое внимание внешнему виду своего приложения. Часть II. Разработка приложений Excel 152 У конечных пользователей первая реакция на приложение связана исключительно с внешним видом программы. Это в полной мере относится и к приложениям, которые вы разрабатываете с помощью Excel. У каждого, впрочем, свое представление о красоте. И если вы вышли на серьезный уровень профессиональной деятельности, то подумайте над тем, чтобы к разработке приложения привлечь человека с хорошим вкусом. Хорошие новости заключаются в том, что начиная с Excel 2007 создание профессио­ нально выглядящих рабочих листов не представляет особого труда. Просто воспользуй­ тесь предварительно определенными стилями для ячеек, и вы получите достойный ре­ зультат. А для применения новой темы, которая полностью изменяет внешний вид рабо­ чей книги, достаточно один раз щелкнуть мышью. К сожалению, версия Excel 2010 не добавила ничего нового в область разработки пользовательских форм, поэтому придется пользоваться старыми возможностями. Следует дополнительно уделить внимание вопросам дизайна и эстетики — и пользо­ ватели обязательно оценят ваше умение разрабатывать не только удобный, но и краси­ вый интерфейс. Само же приложение будет выглядеть утонченно и профессионально. Хороший внешний вид приложения говорит о том, что разработчик настолько заботился о своем продукте, что не пожалел времени и усилий на создание интерфейса. Итак, в процессе разработки пользовательского интерфейса учитывайте следующие моменты. • Добивайтесь единообразия. Разрабатывая, например, диалоговые окна, старай­ тесь по возможности следовать внешнему виду диалоговых окон Excel. Соблю­ дайте единообразие в формате, шрифтах, размере текста и цветах. • Выбирайте простые решения. Распространенной ошибкой разработчиков явля­ ется то, что они пытаются вывести на экран или в диалоговом окне как можно больше информации. Добиваясь этого, следуйте эмпирическому правилу, соглас­ но которому информацию необходимо выдавать порциями — не более одного ли­ бо двух блоков за раз. • Разбивайте окна ввода. Если для получения информации от пользователя вы ис­ пользуете диалоговое окно, то подумайте над тем, чтобы разбить его на несколько окон, каждое из которых будет менее загроможденным. Если вы все же решили использовать сложное диалоговое окно, то, чтобы его разбить, можете воспользо­ ваться элементом управления M u lti Раде (Множество вкладок), который помо­ гает создать знакомое вам диалоговое окно с несколькими вкладками. • Не переусердствуйте с цветом. Цвета используйте осторожно, потому что с ни­ ми легко переусердствовать. • Отслеживайте шрифты и графику. Уделите особое внимание числовым форма­ там, начертанию, размерам шрифтов, а также границам. Эстетика — понятие довольно субъективное, но если вы сомневаетесь в своих спо­ собностях, то постарайтесь добиться как минимум простоты и ясности интерфейса при­ ложения. Примечание В версиях, предшествующих Excel 2007, использовалась палитра из 56 цве­ тов. Теперь это ограничение в прошлом, и в Excel 2010 поддерживается свыше 16 миллионов цветов. Глава 6. Принципы разработки приложений электронных таблиц 153 Создание пользовательской справочной системы Что же касается пользовательской документации, то используется преимуществен­ но два варианта: документация в бумажном и электронном виде. Электронная справочная система — это стандартный компонент Windows-приложений. Ваши Ехсе1-приложения не исключения — они могут иметь электронную справочную систему и даже ее контекстную разновидность. На разработку электронной справочной системы требуется много времени и усилий, но в большом проекте они, конечно же, с лихвой окупятся. На рис. 6.6 показан пример пользовательской справочной системы в скомпилированном HTML-формате. цк I Power U tility Pak v7 Я Скрыть <3=* Назад Вперед' ; Содержание | ПомсЩ] 1 В El В El В В 7 Power Шу Рак v The Ubkties {si Cels and Ranges Group Workbooks and Sheets Group Charts and Graphics Group E l Audfcng Group PUP Bookmans Group £3 [§J Ed» Bookmarks [|) Activate a Bookmark В Q j Power Utttty Pak Grou> Ш Q Technical Support В The Trial Verswn j Additional Wormafeon S & Печать Параметры Create a PUP Bookmark C re a tin g a bookm ark: 1. Make sure the workbook that will be bookmarked has been saved. 2. Activate the workbook, worksheet, and range for the bookmark. To create a bookmark for a chart sheet, activate the chart sheet. 3. Click C r e a t e a B ookm ark in the PUP v 7 - PUP Bookm arks group. The Create Bookmark dialog box is displayed. 4. Enter a meaningful name for the bookmark (to replace the generic name). To create a "hot key" in the bookmark name, precede the character with an ampersand. The following bookmark name appears with the letter A underlined. When the bookmark list is displayed, press this key to quickly activate the bookmark. 3 Budget ^Assumptions 5. Select the action to take when the bookmark is selected (see the list of options, below). 6. Click OK, and the bookmark will be added to the list. Option Description A c t iv a t e th e w o rkb oo k, a n d g o to th e sp ecifie d s h e e t & ra n g e When the bookmark is selected, the workbook will be opened (or activated), the sheet will be activated, and the range will be selected. A c t iv a t e th e w o rkb oo k, a n d g o t o t h e sp ecifie d s h e e t When the bookmark is selected, the workbook will be opened (or activated), and the sheet will be activated. There will be no change to the selected cell or range. A c t iv a t e th e w o rkb oo k When the bookmark is selected, the workbook will be opened (or activated). There will be no change to the active sheet or to the selected celt or range. Activating a PUP Bookmark Editing PUP Bookmarks Tips Рис. 6.6. Пример файла пользовательской справки для надстройки Excel Кроме указанных выше рекомендаций, следует уделить особое внимание технической поддержке приложения в будущем. Иными словами, кому будут звонить пользователи при возникновении проблем с его использованием? Если вы не готовы отвечать на такие вопросы, то найдите того, кто будет этим заниматься. В большинстве случаев вам захо­ чется отвечать только на сложные “технологические” вопросы, касающиеся исправления ошибок программного кода. О Перекрестная ссылка В главе 24 рассматриваются альтернативные варианты справочных систем для ваших приложений. 154 Часть II. Разработка приложений Excel Документирование усилий, затраченных на разработку Собрать приложение электронных таблиц в единое целое — это одна задача, а сде­ лать приложение понятным для других людей — совсем другая. Как и в традиционном программировании, в данном случае важно тщательно документировать свою работу. Созданная документация пригодится тогда, когда вам потребуется доработать приложе­ ние. Она также понадобится тому, кому вы в дальнейшем передадите свое приложение. © Совет При документировании проекта придется учесть следующий момент. На­ пример, если вас пригласили для разработки приложения Excel, то вам, ви­ димо, не захочется, тщательно документируя все и вся, делиться всеми сек­ ретами созданного тяжелым трудом приложения. В таком случае следует подготовить два варианта документации: сокращенный (для пользователей) и полный (для себя любимого). Как же документировать приложение электронных таблиц? Информацию можно хра­ нить в рабочей книге или другом файле. Если хотите, можете представить документацию в виде бумажного документа. Возможно, проще всего — использовать отдельный рабо­ чий лист, чтобы хранить в нем свои комментарии и основную информацию о проекте. Что касается кода VBA, то вы можете использовать в нем комментарии (ведь код, перед которым введен апостроф, все равно игнорируется). Элегантный фрагмент кода VBA се­ годня вам может казаться предельно очевидным, но, изучив его через пару месяцев, вы запутаетесь в приводимых ранее рассуждениях. Распространение приложения среди пользователей Вы завершили проект и готовы передать его конечному пользователю. Каким обра­ зом вы это сделаете? Можете выбрать один из многих доступных способов распростра­ нения программных продуктов. Выбор зависит от многих факторов. Создайте диск с приложением и внесите в него простые инструкции по использова­ нию. Вам, конечно, захочется самому установить созданное приложение, но это не все­ гда возможно. Существует еще один вариант — создать официальную программу уста­ новки. Эта программа предназначена для автоматического выполнения всех необходи­ мых операций по внедрению приложения в компьютер пользователя. Вы можете написать такую программу на традиционном языке программирования, купить общий ее код или написать свою собственную на VBA. В Excel 2000 и более поздних версиях используется технология Microsoft Authenticode, благодаря которой разработчики могут скреплять свои приложения “цифровой подписью”. Эта технология должна помочь конечным пользователям распознавать авто­ ра приложения, гарантировать, что проект не изменен сторонними пользователями, и препятствовать распространению макровирусов и другого потенциально разрушительно­ го кода. Чтобы защитить проект цифровой подписью, вначале следует обратиться в спе­ циальную организацию по сертификации и получить соответствующий сертификат. (Существует и другая возможность— самостоятельно подписать свой проект, создав уникальный цифровой сертификат). Дополнительная информация на эту тему приведена в электронной справочной системе и на веб-сайте компании Microsoft. Глава 6. Принципы разработки приложений электронных таблиц 155 Обновление приложения Распространив приложение среди пользователей, вы завершили его разработку, не правда ли? И теперь можно отдохнуть, наслаждаясь жизнью и пытаясь забыть о возник­ ших (и решенных вами же) проблемах при разработке приложения. Конечно, в редких случаях приложение действительно можно считать завершенным. Однако чаще случает­ ся так, что пользователи приложения не будут полностью им довольны. Всем первона­ чальным спецификациям оно будет соответствовать, но жизнь ведь не стоит на месте. Когда пользователь встречает правильно работающее приложение, то начинает думать о функциях, которыми можно его пополнить. Поэтому он попросит включить их в при­ ложение. Да, речь идет об обновлениях. Рано или поздно потребуется обновить или переделать приложение. Вот тут вы и оце­ ните, насколько хорошо спроектировали его вначале и полностью ли задокументировали все поддерживаемые операции. Если нет, то... Мы все учимся на собственном опыте. Почему нет выполняемой версии Excel Размещая свое приложение в компьютере конечного пользователя, вы хотите быть уверенным в том, что каждый из них имеет лицензионную копию необходимой версии Excel. Передача копии Excel вместе с приложением является незаконной. У вас, воз­ можно, возникнет вопрос “Почему же компания Microsoft не создала выполняемую вер­ сию Excel?” Выполняемая версия — это программа, которая может загружать файлы, но не создавать их. Имея такую версию, пользователи не нуждались бы в копии Excel для запуска вашего приложения. (Так часто бывает с приложениями баз данных.) Трудно найти ясное и убедительное объяснение, почему Microsoft не распространяет выполняемой версии Excel и почему подобной маркетинговой концепции придерживают­ сядругие производители процессоров электронных таблиц. Наиболее вероятная причина заключается в следующем: производители боятся, что из-за выпуска выполняемой вер­ сии уменьшатся объемы продаж полных версий программ. Или, возможно, разработка выполняемой версии потребует дополнительного перепрограммирования имеющегося кода, что никогда не окупится на современном рынке программных продуктов. Рассуждение на тему... Компания Microsoft настойчиво предлагает программу про­ смотра файлов Excel. Эта утилита обеспечивает возможность просмотра файлов Excel без установки копии Excel. Правда, макросы в программе просмотра не выполняются. Копию бесплатной программы просмотра можно получить на веб-сайте компании Microsoft ( h t t p : / / o f f i c e . m ic r o s o f t . co m /dow nloads). Другие вопросы разработки приложений При разработке приложения следует помнить и о некоторых других вопросах, осо­ бенно тогда, когда вы не знаете точно, кто же будет использовать ваше приложение. Если вы разрабатываете приложение, которое планируется применять в широком кругу пользователей (например, условно-бесплатное приложение), то сложно предугадать, ка­ ким образом его будут использовать, в какой системе и вместе с какими программами оно будет запускаться. Версия Excel, установленная у пользователя С каждой новой версией Excel вопрос совместимости становится все более актуаль­ ным. На время написания этой книги программа Excel 2010 уже продавалась, но во мно­ Часть II. Разработка приложений Excel 156 гих больших корпорациях по-прежнему продолжают использовать Excel 2003 и даже бо­ лее ранние версии. К сожалению, нет никакой гарантии, что приложение, разработанное, скажем, для Excel 2000, будет хорошо выполняться в последующих версиях Excel. Если необходимо, что­ бы приложение работало с различными версиями Excel, то вам потребуется работать с самой старой версией программы, а затем протестировать свой продукт во всех остальных версиях. Дело еще более усложнится, если учитывать “подверсии” программы Excel. Для ис­ правления тех или иных проблем Microsoft выпускает обновленные версии (SR), пакеты обновлений (SP) и обновления безопасности, предназначенные для исправления обнару­ женных проблем. Иногда приложение Excel будет работать некорректно до тех пор, пока вы не установите то или иное обновление. Перекрестная ссылка Вопросы совместимости рассматриваются в главе 26. Трудности, касающиеся поддержки языка Считайте, что вам повезло, если все конечные пользователи вашего приложения имеют англоязычную версию Excel. Дело в том, что версии этой программы на других языках не всегда полностью совместимы. Поэтому вам придется проводить дополни­ тельное тестирование поддержки приложения в многоязычной среде. Перекрестная ссылка Вопросы, связанные с поддержкой языка, рассматриваются в главе 26. Быстродействие системы Вероятно, вы — достаточно опытный пользователь компьютера — стараетесь постоян­ но обновлять его оборудование. Другими словами, у вас довольно производительная сис­ тема, которая лучше, чем система среднестатистического пользователя. В отдельных слу­ чаях вам точно известно, какое аппаратное обеспечение используется конечными пользова­ телями ваших приложений. Если это так, то крайне важно, чтобы вы протестировали приложение в подобной аппаратной среде. Может получиться так, что процедура, которая выполняется в вашей системе почти мгновенно, в другой системе потребует нескольких се­ кунд. А ведь несколько секунд “простоя”, потраченных на выполнение простой операции, могут не удовлетворить искушенного современными технологиями пользователя. Совет Приобретая все больший опыт работы с VBA, вы обнаружите, что способы выполнения работы и быстрого выполнения работы существенно отличают­ ся. Выработайте привычку скоростного ввода программного кода. (В этом вам помогут остальные главы книги.) Видеорежимы Не секрет, что пользователи применяют самые различные видеорежимы. Чаще всего используется разрешение экрана 1024x768, но многие системы настроены на разрешение Глава 6. Принципы разработки приложений электронных таблиц 157 800x600. Все более распространенными становятся мониторы с высоким разрешением и даже двухмониторные системы. Но даже если в вашем распоряжении имеется монитор с высоким разрешением, это вовсе не означает, что подобный монитор есть у каждого пользователя ваших приложений. Разрешение экрана, применяемое пользователями, может быть источником проблем, если ваше приложение основано на информации, отображаемой на единственном экране. Например, если был разработан экран ввода с разрешением 1280x1024, а пользователи применяют разрешение 1024x768, они не смогут просмотреть весь экран без прокрутки либо изменения масштаба. Кроме того, важно понимать, что восстановленная (т.е. неразвернутая и несвернутая) рабочая книга отображается с предыдущими размерами окна и в предыдущей позиции. Случается и так, что окно, сохраненное при отображении с высоким разрешением, пол­ ностью смещается за пределы экрана, когда открывается в VGA-системе. К сожалению, не существует способа автоматического изменения размера объектов стем, чтобы они отображались одинаковым образом независимо от разрешения экрана. В некоторых случаях можно изменять масштаб просмотра рабочего листа (с помощью ползунка Масштаб (Zoom), который находится в строке состояния), но этот не всегда удобно. И если вы не знаете, какие разрешения экрана применяются пользователями приложения, то важно, чтобы вы его спроектировали, основываясь на “наименьшем из возможного” — 800x600. Из главы 10 вы узнаете, что определить применяемое пользователем разрешение можно путем вызова функций Windows API из кода VBA. В некоторых случаях можно настраивать видеоизображение программным путем (в зависимости от используемого разрешения экрана). Часть Visual Basic for Applications В этой части... Глава 7 Введение в VBA Глава 8 Основы программирования на VBA Глава 9 Работа с процедурами VBA Глава 10 Создание функций Глава 11 Приемы и методы программирования на VBA Глава Введение в VBA В этой главе... ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ Основы языка BASIC Обзор VBA Основы VBA Знакомство с редактором Visual Basic Работа с Project Explorer Работа с окнами кода Настройка среды VBE Средство записи макросов Об объектах и коллекциях Свойства и методы Объект Com m ent: пример использования ♦ Некоторые полезные свойства объекта Арр 1 i с a t i on ♦ Работа с объектами R ange ♦ Что следует знать об объектах В настоящей главе вы ознакомитесь с языком Visual Basic for Applications, а также с объектами, включенными в Excel. Основы языка BASIC Многие опытные программисты не воспринимают идею программирования на BASIC всерьез. Само название (Beginner’s All-purpose Symbolic Instruction Code — универсаль­ ный символический язык инструкций для начинающих) предполагает, что это непрофес­ сиональный язык. Действительно, BASIC был разработан в начале 1960-х годов и заду­ мывался как наглядное средство преподавания методов программирования студентам колледжей. Довольно быстро он приобрел большую популярность и сейчас поддержива­ ется многими типами компьютеров. 63ак. 3107 162 Часть III. Visual Basic for Applications С годами BASIC развивался и улучшался. Например, во многих ранних версиях он был интерпретируемым языком. Каждая строка перед выполнением интерпретирова­ лась, чем и была обусловлена низкая скорость обработки кода. В большинстве совре­ менных вариантов языка BASIC программы компилируются. В результате онт выполня­ ются значительно быстрее, и их переносимость улучшилась. BASIC стал намного популярнее в 1991 году, когда компания Microsoft выпустила Visual Basic для Windows. Этот продукт облегчил массовую разработку самостоятельных приложений для Windows. Visual Basic имеет мало общего с ранними версиями BASIC, но последний представляет собой основу VBA. Обзор VBA Excel 5 — это первое приложение на рынке программного обеспечения, в котором появился Visual Basic for Applications (VBA). VBA считается стандартным языком напи­ сания сценариев для приложений Microsoft и в настоящее время входит в состав всех приложений Office 2010 и даже приложений других компаний. Следовательно, освоив VBA для Excel, вы сможете сразу перейти к созданию макросов для других программных продуктов Microsoft (равно как и приложений других компаний). Более того, вы сможете создавать полноценные программные продукты, одновременно использующие функции самых разных приложений. Объектные модели Секрет использования VBA заключается в правильном понимании объектной модели в каждом отдельном приложении. Следует отметить, что VBA всего лишь управляет объектами, а каждый программный продукт (Excel, Word, Access, PowerPoint и т.п.) име­ ет свою объектную модель. Приложением можно управлять программным образом толь­ ко с помощью объектов, которые представлены в этом приложении. Так, в объектной модели Excel представлено несколько мощных объектов анализа данных, например рабочие листы, диаграммы, сводные таблицы, сценарии, а также мно­ гочисленные математические, финансовые, инженерные и общие функции. С помощью VBA вы можете работать с этими объектами и разрабатывать автоматизированные про­ цедуры. В процессе изучения VBA в Excel вы сможете получить полное представление об объектной модели. Сначала она покажется вам невероятно сложной. Однако со вре­ менем разрозненные фрагменты будут собраны в единую картину, и вы поймете, что ов­ ладели очень сложной темой! Уйдет ли VBA в отставку Последние несколько лет я только и слышу о том, что компания Microsoft собирается “убрать” VBA из приложений Office, заменив его платформой .NET. Эти слухи не имеют реальных оснований. Конечно, компания Microsoft использует другие методы автома­ тизации приложений Office, но VBA еще рано списывать со счетов, как и Excel для Windows. Впрочем, на момент написания этой книги компания Microsoft заявила, что VBA больше не в хо д и т в состав Excel для Macintosh. Невелика потеря, потому что боль­ шинство VBA-приложений Excel несовместимы с платформой Macintosh. В чем залог успеха VBA? В миллионах основанных на этом языке проектах, а также в том, что VBA намного проще в изучении и применении, чем другие подобные языки. Глава 7. Введение в VBA 163 Сравнение VBA и XLM До появления Excel 5 разработчиками использовался мощный (но сложный для по­ нимания) язык макросов под названием XLM. Более поздние версии Excel все еще вы­ полняют макросы XLM, но начиная с Excel 97 пользователи не имеют возможности соз­ давать макросы на языке XLM. Как разработчик вы должны знать о существовании XLM (на случай, если столкнетесь с макросами, написанными на этом языке), но для собст­ венных разработок используйте исключительно VBA. Примечание Не путайте макроязык XLM с языком XML (extensible Markup Language — расширяемый язык разметки). Хотя в аббревиатурах, обозначающих эти языки, используются одни и те же буквы, между ними нет ничего общего. С помощью XML организуется формат, предназначенный для хранения структурированных данных. Формат XML по умолчанию применяется всеми приложениями Office 2010. Основы VBA Прежде чем непосредственно перейти к рассмотрению методов программирования, оз­ накомьтесь с материалом этого раздела, представляющим краткий обзор следующих разде­ лов главы. Ниже указаны темы, которые будут рассмотрены в оставшихся разделах главы. Далее кратко описана структура VB А. • Код. Действия в VBA осуществляются в результате выполнения кода VBA. • Модуль. Вы создаете (или записываете) программу VBA, которая сохраняется в модуле VBA. Модуль VBA состоит из процедур. • Процедуры. Процедура, по существу, представляет собой элемент компьютерной программы, выполняющей определенное действие. В VBA поддерживаются два типа процедур: Sub (подпрограмма) и F u n c tio n (функция). • Sub. Процедура Sub включает набор операторов, которые могут вызываться различными способами. Ниже приводится пример простой процедуры Sub под названием T e s t. Эта процедура вычисляет сумму, а затем отображает резуль­ тат в окне сообщений. Sub T e s t () Sum = 1 + 1 MsgBox "О твет " & Sum End Sub • F u n c tio n . Модуль VBA может также включать процедуры типа F u n c tio n . Эта процедура возвращает единственное значение (иногда массив значений) и может вызываться из другой процедуры VBA или использоваться в формуле рабочего листа. Ниже приводится пример функции под названием AddTwo. F u n c tio n A d d T w o (a rg l, a rg 2 ) AddTwo = a r g l + a rg 2 End F u n c tio n • Объекты. VBA управляет объектами, которые представлены запускающим при­ ложением (в данном случае — Excel). Excel позволяет управлять более чем ста классами объектов, включая рабочую книгу, рабочий лист, диапазон ячеек рабоче- 164 Часть III. Visual Basic for Applications го листа, диаграмму и нарисованный прямоугольник. В вашем распоряжении на­ ходятся и другие объекты, с которыми можно работать в VBA. Классы объектов организованы в иерархическую структуру. Объекты могут выступать контейнерами других объектов. Например, Excel — это объект под названием A p p l i c a t i o n ; он содержит другие объекты, например W o r k b o o k и C o m m a n d B a r . Объект W o r k b o o k содержит другие объекты, напри­ мер W o r k s h e e t и C h a r t . Объект W o r k s h e e t может включать такие объекты, как R a n g e , P i v o t T a b l e и т.д. Совокупность объектов называется объектной моделью Excel. • Коллекции. Одинаковые объекты образуют коллекцию. Например, коллекция включает все рабочие листы в указанной рабочей книге. Коллекция C o m m a n d B a r s включает все объекты C o m m a n d B a r . Коллекции сами являются объектами. W o rksh e e ts • Иерархия объектов. При ссылке на объект, вложенный в другой объект, положе­ ние в иерархической структуре объектной модели задается с помощью точкиразделителя. Например, на рабочую книгу К н и г а 1 . x l s x можно сослаться так: A p p lic a t i o n .W o rkb o oks("К н и га 1 . x l s x " ) При этом устанавливается ссылка на рабочую книгу К н и г а 1 . x l s x в коллекции Эта коллекция содержится в объекте Excel под названием A p p l i ­ c a t i o n . Переходя на следующий уровень, можно сослаться на лист Л и с т 1 в книге К н и г а 1: W o rkbo oks. A p p lic a tio n .W o rk b o o k s ("К н и га 1 . x ls x " ) .W o rk sh e e ts("Л и ст1 ") Можно также перейти на уровень ниже и сослаться на отдельную ячейку: A p p lic a tio n .W o r k b o o k s ("К н и га 1 . x l s x " ) .W o rk s h e e ts ("Л и ст1 ") .R an g e (" A l " ) • Активные объекты. При опущенной ссылке на объект Excel использует актив­ ные объекты. Если активной рабочей книгой является К н и г а 1 , ссылка записыва­ ется в упрощенном виде: W o r k s h e e t s ( " Л и с т 1 " ) . R a n g e ( " А 1 ") Если известно, что активным листом является еще больше: R a n g e ( " А 1 " ). • Л ист1, ссылку можно упростить Свойства объекта. Объекты имеют свойства. Свойство может рассматриваться как настройка объекта. Например, объект диапазона имеет свойства V a l u e и N a m e . Объекту диаграммы присущи свойства H a s T i t l e и Туре. Для опреде­ ления (изменения) свойств объекта можно использовать VBA. Сослаться на свойство можно, записав объект и свойство, разделенные точкой. Например, сослаться на значение в ячейке А1 листа Л и с т 1 можно так: W o rk s h e e ts ("Л ист1" ) . R a n g e ( " A l" ) .V a lu e • Переменные VBA. Переменным VBA можно присваивать значения. Рассматри­ вайте переменную как имя, которое применяется для хранения определенного значения. Так, если значение в ячейке А1 на листе Л и с т 1 нужно присвоить пере­ менной I n t e r e s t , используйте следующий оператор VBA: In te re st = W o r k s h e e ts ( " Л и с т ! " ) . R a n g e ( " A l " ) .V a lu e Глава 7. Введение в VBA 165 • Методы объектов. Все объекты имеют методы. Метод — это действие, которое выполняется над объектом. Например, один из методов объекта R a n g e называет­ ся C l e a r C o n t e n t s . Он удаляет содержимое диапазона ячеек. Методы вводятся после названия объекта с методом, причем в качестве разделителя используется точка. Например, для удаления содержимого ячейки А1 с активного рабочего лис­ та используется следующая конструкция: R a n g e ( " А 111) . C l e a r C o n t e n t s . • Стандартные конструкции языков программирования. В состав VBA входят все конструкции современных языков программирования, включая массивы, циклы и т.д. • События. Некоторые объекты распознают определенные события, причем можно создать код VBA, который вызывается при наступлении определенных событий. На­ пример, открытие рабочей книги приведет к вызову события W ork b ook_O p en . Изме­ нение ячейки в рабочей книге приведет к вызову события W o r k s h e e t_ C h a n g e . Следует отметить, что в этом разделе VBA описан достаточно полно. Теперь вам ос­ талось изучить представленные возможности более подробно, чему и посвящена осталь­ ная часть главы. Аналогия Если вы любите аналогии, то эта врезка для вас. Возможно, она поможет вам лучше понять взаимосвязи между объектами, свойствами и методами в VBA. В этой аналогии Excel сравнивается с сетью ресторанов быстрого питания. Основной объект Excel — W o r k b o o k (Рабочая книга). В сети ресторанов быстрого питания основным элементом является отдельный ресторан. В Excel можно добавлять либо закрывать рабочие книги, а набор открытых рабочих книг называется W o r k b o o k s (коллекция, состоящая из объектов W o r k b o o k ) . Аналогично, руководство сети рестора­ нов быстрого питания может открывать и закрывать рестораны, и все они в сети рас­ сматриваются как коллекция R e s t a u r a n t s — набор из объектов R e s t a u r a n t . Рабочая книга Excel является объектом, но она содержит и другие объекты, такие как рабочие листы, диаграммы, модули VBA и т.д. Более того, каждый объект в рабочей книге может включать собственные объекты. Например, объект W o r k s h e e t может включать объекты R a n g e (Диапазон), P i v o t T a b l e (Сводная таблица), S h a p e (Фигура) и т.д. По нашей аналогии ресторан быстрого питания (подобно рабочей книге) может включать такие объекты, как K i t c h e n (Кухня), D i n i n g A r e a (Столовое помещение) и T a ­ b l e s (Столы), т.е. целую коллекцию. Более того, руководство может добавлять объекты в объект R e s t a u r a n t или удалять их. Например, в коллекцию T a b l e s (Столы) могут до­ бавляться отдельные столы. Каждый из этих объектов может включать другие объекты. Например, объект K i t c h e n (Кухня) может включать такие объекты, как s t o v e (Плита), V e n t i l a t i o n F a n (Вытяжка), C h e f (Шеф-повар), S i n k (Раковина) и т.д. Пока что все хорошо, и аналогия работает. Посмотрим, можно ли продолжить сравнение. Объекты Excel имеют свойства. Например, объект R a n g e (Диапазон) включает свойства Value (Значение) и Name (Имя), а объект S h a p e (Фигура)— w i d t h (Ширина) и H e i g h t (Высота). Объекты из ресторана быстрого питания также имеют свойства. Например, объек­ ту S t o v e (Плита) присущи такие свойства, как T e m p e r a t u r e (Температура) и N u m b e r o f B u m e r s (Количество конфорок). Объект V e n t i l a t i o n F a n (Вытяжка) имеет собственный набор свойств ( T u m e d O n (Включить), r p m (Изменить скорость вращения) и т.д.). Помимо свойств, объекты Excel имеют методы, выполняющие операции над объектами. Например, метод C l e a r C o n t e n t s (Удаление содержимого) удаляет содержимое объекта Часть III. Visual Basic for Applications 166 (Диапазон). Объект из ресторана быстрого питания также имеет свои методы. Так, у объекта s t o v e (Плита) нетрудно заметить метод C h a n g e T h e r m o s t a t (Изменить температу­ ру), а объект V e n t i l a t i o n F a n (Вытяжка) включает метод S w i t c h O n (Включить). Range В Excel методы иногда применяются для изменения свойств объекта. Например, ме­ тод d e a r C o n t e n t s (Удаление содержимого), относящийся к объекту R a n g e (Диапазон), применяется для изменения свойства R a n g e V a l u e (Значение диапазона). Аналогично метод C h a n g e T h e r m o s t a t (Изменить температуру) объекта s t o v e (Плита) применяется для изменения свойства T e m p e r a t u r e (Температура). Используя VBA, можно написать процедуры, позволяющие манипулировать объек­ тами Excel. В ресторанах быстрого питания руководство может давать указания по ра­ боте с объектами ресторана. (“Включить плиту и переключить вытяжку на максималь­ ную мощность.” ) Не правда ли, аналогия весьма прозрачная? Знакомство с редактором Visual Basic Все программы на языке VBA создаются с помощью редактора Visual Basic (Visual Basic Editor — VBE). Этот редактор представляет собой отдельное приложение, которое легкодоступно при работе с Excel. В данном случае под доступностью понимается то, что программа сама открывает редактор VBE, как только это понадобится пользователю. Единственное, чего нельзя сделать, — это запустить редактор VBE отдельно, поскольку сначала запускается на выполнение Excel. Примечание Модули VBA хранятся в файлах рабочих книг. Но эти модули нельзя увидеть до тех пор, пока не будет активизирована среда VBE. Отображение вкладки Разработчик На ленте Excel изначально вкладка Разработчик (Developer) не отображается. Без нее не обойтись, если вы собираетесь программировать на VBA. 1. Щелкните правой кнопкой мыши на ленте и в контекстном меню выберите пара­ метр Настройка ленты (Customize the Ribbon). На экране появится раздел Настройка ленты (Customize Ribbon) диалогового окна Параметры Excel (Excel Options). 2. В отображенном в правой части окна списке установите флажок возле позиции Разработчик (Developer). 3. Щелкните на кнопке ОК. После выполнения перечисленных выше действий на ленте Excel появится новая вкладка (рис. 7.1). |;у Ц Щ Ц ' Р* ' j* Гмаим Книг*! •Microsoft Ехи» Вставка Размет» страницы Формулы Данные Рецензирование Вид j Разработчик ! Надстройки PUPv7 Щ л |~ а а Запись макроса Jtk [« Щ А к У Свойства ЯН # Свойства карты g§ Импорт ■2£~i ~ЛШ Щ Относительные ссылки qfi просмотр кода uSSa “g Пакеты расширения ^5 Экспорт М Макросы Надстройки Надстройки I Вставить Режим „ Источник .... “ к А Безопасность макросов СОм конструктора а Отобразить окно OShowi»данные Рис. 7.1. По умолчанию вкладка Разработчик не отображается СА — Глава 7. Введение в VBA 167 Запуск VBE Во время работы в Excel вы можете перейти к окну VBE одним из следующих способов: • нажать комбинацию клавиш <Alt+Fl 1>; • выбрать команду Разработчика Код^ Visual Basic (Developer^Code1^ Visual Basic). Кроме того, можно получить доступ к двум специальным модулям. (Эти специальные VBA-модули используются процедурами обработчика событий, которые будут описаны в главе 19.) • Щелкните правой кнопкой мыши на ярлыке листа, выберите пункт меню Исход­ ный текст (View Code), и будет отображен модуль кода для рабочего листа. • Щелкните правой кнопкой мыши на строке заголовка рабочей книги и выберите пункт Исходный текст (View Code). В результате выполнения этого действия отобразится модуль кода рабочей книги. Если окно рабочей книги максимизиро­ вано в Excel, строка заголовка не отображается. Окно редактора VBE показано на рис. 7.2. Конечно, окно вашего редактора VBE мо­ жет выглядеть иначе. Окно редактора VBE может легко изменяться — пользователь мо­ жет скрывать окна, изменять их размеры, закреплять их, изменять порядок их располо­ жения, а также выполнять некоторые другие операции. g\мштттшшшшшшттш ____ ____ ______ . ....... ...... ......................... 2Г Рис. 7.2. Окно редактора Visual Basic Окно VBE Окно VBE включает ряд элементов. В следующих разделах кратко описаны ключе­ вые компоненты окна редактора Visual Basic. • Строка меню. Несмотря на повсеместное засилье в Excel ленточного интерфейса, редактор Visual Basic по-прежнему использует классические меню и панели инст­ рументов. Строка меню VBE работает так же, как строка меню любого другого приложения. Она содержит команды, используемые для управления различными компонентами VBE. Кроме того, для выполнения многих команд меню использу­ ются комбинации клавиш. Например, для команды View^ Immediate Window (Вид^Окно отладки) применяется комбинация клавиш <Ctrl+G>. Часть III. Visual Basic for Applications 168 О Совет В VBE также представлены контекстные меню. Щелкнув правой кнопкой мыши практически на любом элементе окна VBE, вы увидите меню, предла­ гающее ряд команд. • Панели инструментов. Стандартная панель инструментов Standard, которая по умолчанию находится под строкой меню. Это одна из шести панелей инструмен­ тов, используемых в VBE (строка меню также считается панелью инструментов). Панели инструментов VBE работают, как и в Excel: можно задавать специальные настройки для панелей инструментов, перемещать их, отображать другие панели инструментов и т.д. Для настройки панелей инструментов VBE используется ко­ манда View^Toolbars^Customize (Вид1^ Панели инструментов1^ Настройка). • Окно Project Explorer. В окне Project Explorer отображается древовидная струк­ тура всех открытых в данный момент в Excel рабочих книг (включая надстройки и скрытые рабочие книги). Каждая рабочая книга известна как проект. Подробнее о Project Explorer будет сказано в следующем разделе. Если в редакторе Visual Basic окно Project Explorer не отображено, нажмите <Ctrl+R>. Чтобы скрыть его, щелкните на кнопке закрытия окна в строке заголовка (или щелкни­ те правой кнопкой мыши в любом месте окна и выберите команду Hide (Скрыть) из контекстного меню) либо на кнопке Close (Закрыть) в строке заголовка. • Окно кода. В окне кода (которое иногда называется Module) содержится код VBA. Для каждого элемента проекта представлено собственное окно кода. Чтобы про­ смотреть код объекта, дважды щелкните мышью на этом объекте в окне Project Explorer. Например, чтобы просмотреть код объекта Лист1, дважды щелкните на элементе Лист1 в окне Project Explorer. Если вы не создавали для него VBA-код, открывшееся окно будет пустым. Существует еще один способ просмотра кода объекта— выделить этот объект в окне Project Explorer и щелкнуть на кнопке View Code (Просмотр кода) панели инструментов вверху окна Project Explorer. Окна кода будут рассмотрены далее в этой главе (см. раздел “Работа с окнами кода”). • Окно отладки. Окно отладки (Immediate) предназначено для непосредственного выполнения операторов VBA, тестирования операторов и отладки кода. Его мож­ но отображать и скрывать. Если окна отладки в данный момент нет на экране, на­ жмите клавиши <Ctrl+G>. Чтобы закрыть окно отладки, щелкните на кнопке его закрытия в строке заголовка (или щелкните правой кнопкой мыши в любом месте окна и выберите опцию Hide (Скрыть) из контекстного меню). Работа с Project Explorer При работе в редакторе Visual Basic каждая рабочая книга Excel и открытые в данный момент надстройки рассматриваются как проекты. Проект можно считать коллекцией объектов, организованных в виде иерархической структуры. Вы раскроете проект, если щелкнете на знаке “плюс” слева от его названия в окне Project Explorer. Проект сворачи­ вается после щелчка на знаке “минус” слева от его названия. При попытке развернуть проект, защищенный паролем, отображается окно для ввода пароля. Глава 7. Введение в VBA 169 Примечание В верхней части окна Project Explorer отображаются три пиктограммы. Нахо­ дящаяся в правой части пиктограмма Toggle Folder (Переключить папку) оп­ ределяет отображение объектов проекта в виде иерархического или просто­ го списка. На рис. 7.3 показано окно Project Explorer, в котором отображается несколько проектов. |Project VBAProject И Ш О EEJ Ш а т A cro b a tP D FM a k e r (PDFM aker-xia) PU P 7Т RIAL (p u p 7 .xiam ) Ш SC M e nu s (sh ortcu t m enu&.pup 7 } Ё ^ V B A P ro je ct (Книга 1 } В | Ш Й Ш MockJes Microsoft Excel Objects j ® Лист 1 (Лист 1) ® Лист 2 (Лист 2) ® ЛистЗ (ЛистЗ) ЗтаКнига Рис. 7.3. В окне Project Explorer ото­ бражается несколько проектов Предупреждение При запуске VBE отображаемый программный модуль не всегда соответст­ вует объекту, который выделен в окне Project Explorer. Чтобы убедиться в том, что работа происходит с нужным программным модулем, дважды щелкните на объекте в окне Project Explorer. Если в Excel загружено несколько рабочих книг и надстроек, окно Project Explorer будет загромождено. К сожалению, скрыть проекты в окне Project Explorer невозможно. Но если вы детально не рассматриваете отдельные проекты, то можете отображать их в свернутом виде. Развернутое дерево каждого проекта имеет минимум один узел под названием Microsoft Excel Objects. В нем содержатся элементы каждого рабочего листа и лист диаграмм рабочей книги (рабочий лист считается объектом), а также объект ЭтаКнига (ThisWorkbook), представляющий объект A c t iv e W o r k b o o k . Если в про­ екте используются модули VBA, то в дереве отображается также узел M o d u le s , в ко­ тором перечислены модули. Проект может включать узел F o rm s , содержащий объек­ ты U s e rF o rm (пользовательские формы, известные как пользовательские диалоговые окна). Если в проекте находятся модули классов, то в дереве отображается узел C la s s M odules. Аналогично, если проект включает ссылки, отображается узел R e f e r ­ ences (хотя на самом деле польза от этого узла сомнительна, поскольку ссылки не могут включать VBA-код). Часть III. Visual Basic for Applications 170 Добавление нового модуля VBA Чтобы добавить в проект новый модуль VBA, выделите название проекта в окне Project Explorer и выберите команду Inserts Module (Вставка1^ Модуль). Также можете щелкнуть правой кнопкой мыши на названии проекта и выбрать команду Inserts Module в контекстном меню. При создании макроса Excel автоматически включает модуль VBA, в котором будет храниться создаваемый вами код. Удаление модуля VBA Чтобы удалить из проекта модуль VBA или модуль класса, выделите название мо­ дуля в окне Project Explorer и используйте команду File1^ Remove ххх (где х х х — на­ звание модуля). Кроме того, вы можете щелкнуть правой кнопкой мыши на названии модуля и выбрать команду Remove ххх из контекстного меню. Перед удалением мо­ дуля отображается запрос на его экспорт (детально об этом рассказано в следующем разделе). Вы не сможете удалить программные модули, соответствующие рабочей книге (программный модуль Э таК нига), а также рабочему листу (например, про­ граммный модуль Лист1). Экспорт и импорт объектов За исключением объектов, перечисленных в узле R e f e r e n c e s , каждый объект в проекте можно сохранить в отдельном файле. Сохранение отдельного объекта в проек­ те называется экспортом. Соответственно, вы можете также импортировать объекты в про­ ект. Экспорт и импорт объектов востребован, если созданный ранее объект (например, мо­ дуль VBA или форму U s e r F o r m ) нужно использовать в другом проекте. Чтобы экспортировать объект, выберите его в окне Project Explorer и выполните ко­ манду File^Export File (Файл^Экспорт файла) (или нажмите <Ctrl+E>). При этом ото­ бражается диалоговое окно, запрашивающее имя файла. Обратите внимание, что сам объект остается в проекте (экспортируется только его копия). Если вы экспортируете объект U s e r F o r m , экспортируется также весь код, связанный с формой U s e r F o r m . Чтобы импортировать файл в проект, выберите имя проекта в окне Project Explorer и выполните команду File*=>Import File (Файл^Импорт файла). Появится диалоговое ок­ но, в котором необходимо указать имя файла. Можно импортировать только те файлы, которые экспортированы с помощью команды File1^ Export File. Совет Если нужно скопировать модуль или объект U serForm в другой объект, во­ все не обязательно сначала экспортировать, а затем импортировать объект. Убедитесь в том, что оба проекта открыты; просто откройте Project Explorer и перетащите объект из одного проекта в другой. Работа с окнами кода В совершенстве овладев VBA, вы будете много времени работать в окнах кода. Каж­ дому объекту в проекте соответствует свое окно кода. Такими объектами могут быть следующие: Глава 7. Введение в VBA 171 • сама рабочая книга ( Э т а К н и г а в окне Project Explorer); • рабочий лист или лист диаграммы рабочей книги (например, г р а м м а ! в окне Project Explorer); • модуль VBA; • модуль класса (специальный тип модуля, позволяющий создавать новые классы объектов); • форма U s e r F o r m . Лист1 или Диа­ Сворачивание и восстановление окон В любой момент в редакторе VBE можно открыть несколько окон кода, и это суще­ ственно усложняет работу. Окна кода во многом напоминают окна рабочих листов Excel. Их можно свернуть, развернуть, скрыть, изменить порядок отображения на экране и т.д. Многие пользователи предпочитают разворачивать окно кода, над которым они работа­ ют в данный момент, что позволяет видеть большую часть программы, не отвлекаясь на другие модули. Чтобы максимизировать окно кода, щелкните на кнопке Развернуть в строке заголовка или дважды щелкните на самой строке заголовка. Чтобы вернуть окну кода прежний размер, щелкните на кнопке Восстановить в строке заголовка. Иногда необходимо, чтобы на экране отображалось сразу несколько окон кода. Например, требуется сравнить код в двух модулях или скопировать код из одного модуля в другой. Сворачивая окно кода, вы скрываете его в окне редактора. Кроме того, можно щелк­ нуть на кнопке Свернуть (Close) в строке заголовка окна кода, чтобы полностью его за­ крыть. Открыть окно кода заново можно, дважды щелкнув на соответствующем объекте в окне Project Explorer. VBE не позволяет закрывать рабочую книгу. Для этого вы должны вернуться в окно Excel и там закрыть книгу. Однако можно использовать окно отладки (Immediate), чтобы закрыть рабочую книгу или отключить надстройку. Активизируйте это окно, введите оператор VBA (пример показан ниже) и нажмите <Enter>. Workbooks ( "m y a d d in . x la m " ) . C lo se Этот оператор выполняет метод C l o s e объекта W o rk b o o k , закрывающий рабочую книгу. В данном примере рабочая книга является надстройкой. Сохранение кода VBA Как правило, окно кода содержит четыре типа кода. • Sub (Процедура). Это набор инструкций, выполняющих определенное действие. • F u n c tio n (Функция). Это набор инструкций, возвращающий значение или мас­ сив значений (функции VBA напоминают функции рабочего листа Excel, напри­ мер СУММ). • P r o p e r ty (Процедуры свойств). Специальные процедуры, используемые в мо­ дулях классов. • Объявление. Объявления включают информацию о переменной, которая предо­ ставляется VBA. Например, можно объявить тип данных для переменных, кото­ рые вы планируете использовать в коде. 172 Часть III. Visual Basic for Applications В отдельном модуле VBA может храниться любое количество процедур, функций и объявлений. Способ организации модуля VBA зависит только от вашего желания. Можно записывать весь код VBA приложения в одном модуле VBA или разделять код на несколько модулей. Примечание Несмотря на то что пользователям предоставляются широкие возможности по выбору места хранения кода VBA, существует ряд ограничений. Процеду­ ры обработки событий должны содержаться в окне кода объекта, которому соответствует это событие. Например, если создана процедура, которая вызывается при открытии рабочей книги, то эта процедура должна распола­ гаться в окне кода для объекта Э т а К н и г а и иметь специальное название. Подобный вопрос станет более понятным после того, как вы изучите собы­ тия (глава 19) и пользовательские формы (часть IV). Ввод кода VBA Для того чтобы выполнить одно из действий программным образом, необходимо на­ писать программу VBA в окне кода. Код VBA располагается в процедуре. Процедура со­ стоит из операторов VBA. На данном этапе (для примера) остановимся только на одном типе окна кода — модуле VB А. Вы можете добавить код в модуль VBA тремя способами. • Ввести код вручную. Для этого используйте клавиатуру. • Использовать функцию создания макросов. Используйте функцию записи мак­ росов в Excel, чтобы записать действия и преобразовать их в код VBA. • Использовать операцию копирования и вставки. Скопируйте текст программы из другого модуля и вставьте его в модуль, над которым работаете. Ввод кода вручную Иногда самый простой путь является наилучшим. Непосредственное введение кода связано с использованием клавиатуры, т.е. вы вводите код программы с помощью кла­ виатуры. Клавиша <ТаЬ> при этом поможет задать отступ в строках, которые логически принадлежат одной группе (например, условные операторы I f и End I f ) . Это совер­ шенно не обязательно, но помогает быстрее освоить программу, анализируя ее блочную структуру. Именно поэтому подобный подход в программировании называется “хорошим стилем”. Ввод и редактирование кода в модуле VBA выполняются обычным образом. Вы можете выделять текст, копировать и вырезать, а затем вставлять в другое место программы. Терминология В книге применяются термины подпрограмма, процедура и макрос. Программисты для описания автоматизированной задачи обычно используют слово процедура. В Excel процедуру также называют макросом. Технически процедура может быть двух видов: Sub (Подпрограмма) либо F u n c tio n (Функция); оба вида иногда называют подпро­ граммами. В книге эти термины используются как синонимы. Тем не менее между про­ цедурами типа Sub и F u n c tio n существует большая разница, о чем будет рассказано в главах 9 и 10. Глава 7. Введение в VBA 173 Отдельная инструкция в V B A может иметь произвольную длину. Однако для обеспе­ чения удобочитаемости кода длинные инструкции лучше разбить на две или более строк. Для этого следует в конце строки ввести пробел и символ подчеркивания, а затем нажать <Enter> и продолжить инструкцию в следующей строке. Например, ниже приведен один оператор VBA, разбитый на четыре строки. M sgB ox " Н е в о з м о ж н о н а й т и " & U C a s e ( S H O R T C U T M E N U F I L E ) _ & v b C r L f Sc v b C r L f & " Ф а й л д о л ж е н н а х о д и т ь с я в " _ & T h isW o rk b o o k . P a th & v b C r L f & v b C r L f _ & "В озмож но, т р е б у е т с я п е р е у с т а н о в и т ь B u d g e t M a n " , _ v b C r i t i c a l , A P PN A M E Обратите внимание, что четыре последние строки этого оператора введены с отсту­ пом. Это необязательное условие, однако таким образом вы указываете, что на самом деле эти четыре строки являются одним оператором. Совет Как и в Excel, в VBE существует несколько уровней отмены операций. По­ этому, если вы по ошибке удалили инструкцию, можете несколько раз щелк­ нуть на кнопке Undo (Отменить) (либо нажать клавиши <Ctrl+Z>), после чего инструкция вновь появится в коде. После отмены операции можно щелкнуть на кнопке Redo (Вернуть) (либо нажать клавиши <Ctrl+Y>), чтобы вернуть из­ менения, которые ранее были отменены. Эта функция поможет исправить критически важные ошибки, поэтому не пренебрегайте ею. Выполните такие действия: добавьте в проект модуль V BA и введите следующую процедуру в окне кода данного модуля. Sub S a y H e l l o O Msg = "В а ш е и м я " & A p p l i c a t i o n . U s e r N a m e Ans = M s g B o x (M s g , v b Y e s N o ) I f Ans = vbNo Then M sgBox "Н и чего с т р а ш н о го ." & "?" E lse M sgBox "Н аверное, я ясн ов ид ящ ий !" End I f End Sub На рис. 7.4 показано, как это выглядит в модуле VBA. Примечание При вводе кода вы могли заметить, что VBE вносит некоторые изменения во введенный текст. Например, если пропустить пробел перед или после знака равенства (=), VBE автоматически вставит его. Кроме того, изменяется цвет некоторых слов кода. Это нормально, и позже вы оцените данный факт. Для вызова на выполнение процедуры S a y H e llo убедитесь в том, что текстовый курсор находится в области вводимого текста. Затем выполните следующие действия. 1. Нажмите клавишу <F5>. 2. Выберите команду Run^Run Sub/UserForm (Выполнить^Выполнить процеду­ ру/пользовательскую форму). 3. Щелкните на кнопке Run Sub/UserForm, находящейся на панели инструментов Standard. 174 Часть III. Visual Basic for Applications _____ \E«t* !<»» ¥*«» l" « rt Ffirmat С«bug gun IoolJ AtkHm yymdov. jje»p 18 6*1А * -.J Л Л ;"* ►*» ЛЫ. &2 Ф О И J VBAProject (PfRSOMAlJCLSB) Microsoft E*cei Objects VBA/Project (КнагаЗ) В-Й1 Microsoft Excel Objects Й Ш § Лмст1{Лист1) ЭтаКмигэ ЁМ Й Modules Sub SayHelloO Msg = "Ваше имя " & Application.UserName & Ans = MsgBox(Msg, vbYesNo) If Ans = vbNo Then MsgBox "Ничего страшного." Else MsgBox "Наверное, я ясновидящий!" End If End Sub 0 . J Рис. 7.4. Ваша первая VBA-процедура Если вы ввели код правильно, процедура будет выполнена. Вы сможете выбрать ответ в простом диалоговом окне (рис. 7.5), в котором отображается имя пользователя, заданное Да в диалоговом окне Параметры Excel (Excel Options). ОбратиРис 7 5 Результат вы- те внимание, что при выполнении макроса активизируется полнения процедуры, программа Excel. На данном этапе вам не обязательно поникод которой показан мать принципы работы программы; в этом вы разберетесь, на рис. 7.4 прочитав следующие разделы и главы книги. Ваше имя Alex? © Примечание В большинстве случаев вы будете запускать макросы в Excel. Однако тести­ ровать макрос удобнее, выполняя его непосредственно в VBE. Написанная программа представляет собой процедуру VBA (называемую также мак­ росом). Когда вы даете команду выполнить макрос, VBE быстро компилирует код и за­ пускает его. Другими словами, каждая инструкция анализируется в VBE, a Excel всего лишь выполняет то, что указано в инструкциях. Вы можете выполнить макрос сколько угодно раз, хотя через некоторое время он теряет свою привлекательность. При выполнении кода этой простой процедуры выполнялись следующие действия (все они подробно рассмотрены далее): • объявление процедуры (первая строка); • присвоение значения переменным (Msg и Ans); • конкатенация строк (с помощью оператора &); • использование встроенной функции VBA (MsgBox); • применение встроенных констант VBA (vbYesNo и vbNo); • использование конструкции I f - Then - E ls e ; • окончание процедуры (последняя строка). Неплохо для первого раза, не правда ли? Глава 7. Введение в VBA 175 Использование средства записи макросов Одним из способов создания кода модуля VBA является запись последовательности действий с помощью специальной функции записи макросов Excel. Как бы вы ни старались, но записать показанную в предыдущем примере процедуру S a y H e llo вы не сможете. Запись макросов — полезное средство, но оно имеет свои ог­ раничения. После записи макросов вы неоднократно будете вносить изменения или вво­ дить дополнительный код вручную. В следующем примере показано, как записать макрос, изменяющий ориентацию страницы на альбомную. Если вы хотите получить его самостоятельно, то начните рабо­ ту с пустой рабочей книги и выполните следующие действия. 1. Активизируйте рабочий лист в книге (подойдет любой лист). 2. Выберите команду Разработчик^ Код^ Запись макроса (Developer^Code*^ Record Macro). После этого Excel отобразит диалоговое окно Запись макроса (Record Macro). 3. Щелкните на кнопке ОК, чтобы принять параметры, заданные по умолчанию. Excel автоматически вставит новый модуль VBA в проект VBA рабочей книги. Начиная с этого момента Excel будет преобразовывать все ваши действия в код VBA. Обратите внимание, что в строке состояния Excel отображается голубой квадратик. После щелчка на нем запись макроса прекращается. 4. Выберите команду Разметка страницы ^Параметры страницы^Ориентация1^Альбомная (Page Layout^Page Setup^Orientation^Landscape). 5. Выберите команду Разрабочик^Код1^Остановить запись (Developer^Code1^ Stop Recording) или щелкните на голубом квадратике, который находится в стро­ ке состояния. Программа Excel прекратит запись ваших действий. Чтобы просмотреть макрос, запустите VBE (проще всего нажать клавиши <Alt+Fll>) и найдите проект в окне Project Explorer. Щелкните на узле M o d u le s , чтобы развернуть его. Затем щелкните на элементе M o d u le l, чтобы отобразить окно кода (если в проекте уже присутствовал модуль M o d u le l, новый макрос будет находиться в модуле M odu le2 ). Код, созданный всего лишь одной простой командой Excel, представлен на рис. 7.6. Строки кода с предшествующими им апострофами являются комментариями и не выполняются. Возможно, вас удивит объем кода, сгенерированного всего лишь одной командой (особенно если вы записываете макрос впервые). Несмотря на то что вы изменили толь­ ко одну простую настройку на вкладке Параметры страницы (Page Setup), Excel гене­ рирует код, задающий все параметры в этом диалоговом окне. Таким образом, зачастую программа, полученная при записи макроса, избыточна. Ес­ ли вы хотите, чтобы макрос всего лишь изменял ориентацию страницы на альбомную, можете значительно упростить его, удалив ненужный код. Это облегчит восприятие мак­ роса и ускорит его выполнение, поскольку избавит его от лишних операций. Упростить макрос вы вправе до следующего вида. Sub M a c r o l () W ith A c t i v e S h e e t . P a g e S e t u p .O r ie n t a t io n = x lL a n d s c a p e End W i t h End Sub Часть III. Visual Basic for Applications 176 _ , П ер ваяП р сщ ед ур а-хкт - Modole2 (Code) HI"-»»1 ^JdisJ zi Sub Макрос!() ’ Макрос! Макрос Application.PrintConraunication “ False With ActiveSheet.PageSetup .PrintTitleRows ” "" .PrintTitleColumns - "" End With Application.PrintConraunication = True ActiveSheet.PageSetup.Prin tArea - "** Application.PrintCommunication “ False With ActiveSheet.PageSetup .LeftHeader = "" .CenterHeader * "" .R ig h tH e a d e r - ■■ .LeftFooter - "" .CenterFooter = ■■ .RightFooter — .LeftMargin = Application.InchesToPoints(0.7) .RightMargin = Application.InchesToPoints(0.7) .TopMargin “ Application.InchesToPoints(0.75) .BottonMargin = Application.InchesToPoints{0.75) .HeaderMargin = Application.InchesToPoints(0.3) .FooterMargin * Application.InchesToPoints(0.3) .PrintHeadings - False .PrintGridlines “ False .PrintCoraments = xlPrintNoCoMments .PrintQuality - 1200 .CenterHorizontally - False .CenterVertically ■ False .Orientation = xlLandscape .Draft - False .PaperSize = xlPaperA4 .FirstPageNuiaber “ xlAutomatic .Order = xlDownThenOver .BlackAndWhite * False .Zoom “ 100 .PrintErrors = xlPrintErrorsDisplayed .OddAndEvenPagesHeaderFooter - False .DifferentFirstPageHeaderFooter ” False .ScaleWithDocHeaderFooter - True .AlignMarginsHeaderFooter = True .EvenPage.LeftHeader.Text ” *" .EvenPage.CenterHeader.Text = "" .EvenPage.RightHeader.Text “ "" .EvenPage.LeftFooter.Text = "" .EvenPage.CenterFooter.Text » "■ .EvenPage.RightFooter.Text * "" .FirstPage.LeftHeader.Text “ *• .FirstPage.CenterHeader.Text - "" .FirstPage.RightHeader.Text = ■" .FirstPage.LeftFooter.Text - ““ .FirstPage.CenterFooter.Text = "" Рис. 7.6. Код, сгенерированный функцией записи макросов Excel Мы удалили весь код, кроме строки, изменяющей свойство O r i e n t a t i o n . На самом деле данный макрос можно упростить еще больше, так как конструкция W it h - E n d W it h не обязательна при изменении только одного свойства. Sub М акр ос1() A c t iv e S h e e t . P a g e S e tu p .O r ie n ta tio n End Sub = x lb a n d s c a p e В данном примере макрос изменяет свойство O r i e n t a t i o n объекта P a g e S e t u p активного листа. Отметим, что x l b a n d s c a p e — это заранее заданная константа, кото­ рая предназначена для изменения ориентации страницы. Переменная x l b a n d s c a p e имеет значение 2, a x l P o r t r a i t — значение 1. Следующий макрос работает, как и предыдущий Макрос1. Sub М а к р о с1 а () A c t iv e S h e e t . P ag e S e tu p .O r ie n t a t io n End Sub = 2 Глава 7. Введение в VBA 177 Многим пользователям легче запомнить название константы, чем произвольные чис­ ла. Вы можете воспользоваться справочной системой, чтобы выучить соответствующие каждой настройке константы. Зачастую данная процедура вводится непосредственно в модуль VBA, но для этого необходимо знать, какие объекты, свойства и методы требуется использовать. Но ведь записать макрос быстрее. Кроме того, данный пример продемонстрировал наличие у объекта P a g e S e tu p свойства O r i e n t a t i o n . Примечание Запись действий — это наилучший способ изучить VBA. Если у вас возника­ ют проблемы с введением кода, воспользуйтесь функцией записи действий. Даже если вы получаете совсем не то, чего ожидали, результирующий код укажет правильное направление. Для получения информации об объектах, свойствах и методах, которые присутствуют в записанном коде, используйте электронную справочную систему. 0 Перекрестная ссылка Механизм записи макросов “Средство записи макросов” . подробнее рассматривается в разделе Копирование кода VBA Выше были рассмотрены способы непосредственного ввода кода и записи действий для создания программы VBA. Последний метод добавления кода в модуль VBA — ко­ пирование текста программы из другого модуля. Например, вы могли написать процеду­ ру в одном из более ранних проектов, которая также используется в текущем проекте. Вместо того чтобы заново вводить код, достаточно открыть рабочую книгу, активизиро­ вать модуль и использовать стандартные способы копирования и вставки, чтобы скопи­ ровать его в текущий модуль VBA. Если после вставки возникает необходимость, под­ корректируйте код модуля. И не забывайте об Интернете. На веб-сайтах, форумах и в блогах можно найти тыся­ чи примеров кода VBА. Достаточно скопировать нужный пример в окне браузера и вста­ вить его в окно модуля VB А. О Совет Как уже отмечалось в этой главе, можно импортировать в файл модуль, ко­ торый был ранее экспортирован. Настройка среды VBE В процессе программирования в Excel вы будете проводить много времени, работая в окнах VBE. Чтобы сделать редактор более удобным, вы можете настроить некоторые его параметры. В строке меню окна VBE выберите команду Tools^Options (Сервис^Параметры). Появится диалоговое окно Options (Параметры) с четырьмя вкладками: Editor (Редак­ тор), Editor Format (Формат редактора), General (Общие) и Docking (Прикрепление). Некоторые наиболее часто используемые параметры этих вкладок будут рассмотрены в следующих разделах. Кстати, не путайте это окно с диалоговым окном Параметры 178 Часть III. Visual Basic for Applications Excel (Excel Options) программы Excel, которое можно открыть в Excel с помощью ко­ манды Файл о Параметры Excel (File1^ Excel Options). Вкладка Editor На рис. 7.7 показаны параметры, доступ к которым можно получить, щелкнув на вкладке Editor (Редактор) диалогового окна Options (Параметры). *1 Code Settings Г~ Auto Syntax Chedc Г- Require Variable Declaration & Auto List Members P Auto Indent Tab Width: [ 4 НИШ R Auto Quick Info W Auto Data Tips ~ Window Settings W Drag-and-Drop Text Editing F Default to R J Module View P Procedure Separator Справка Рис. 7.7. Вкладка Editor диалогового окна Options Параметр Auto Syntax Check Настройка Auto Syntax Check (Автоматическая проверка синтаксиса) определяет, будет ли появляться диалоговое окно, когда VBE обнаружит синтаксическую ошибку в коде VBA. В этом диалоговом окне указывается тип допущенной ошибки. Если отме­ нить установку этого флажка, то VBE выделит синтаксические ошибки, отобразив соот­ ветствующие фрагменты кода другим цветом, и вам не придется работать в диалоговых окнах, которые появляются на экране. Я обычно отключаю параметр Auto Syntax Check, поскольку без труда могу опреде­ лить, в чем заключается ошибка. Но если вы только начинаете работать с VBA, то до­ полнительная помощь вам не помешает. Параметр Require Variable Declaration При установленном параметре Require Variable Declaration (Обязательное деклариро­ вание переменных) VBE вставляет в начале каждого нового модуля следующий оператор: O p tio n E x p lic it Если в модуле задан этот оператор, то вы должны явно определить каждую исполь­ зуемую в нем переменную. Таким образом, у вас вырабатывается хорошая привычка, ко­ торая, правда, требует дополнительных усилий. Если вы не объявляете переменные, все они имеют тип данных V a r ia n t ; это достаточно гибко, но неэффективно с точки зрения использования аппаратных ресурсов и скорости выполнения кода. Более подробно объяв­ ление типа переменных рассматривается в главе 8. Глава 7. Введение в VBA 179 Примечание Изменение параметра Require Variable Declaration влияет на новые модули, а не на существующие. Параметр Auto List Members Если выбрана опция Auto List Members (Автоматическая вставка объектов), VBE предоставляет помощь при вводе кода VBA, отображая список элементов текущего объекта. К этим элементам относятся методы и свойства объекта, название которого вводится вручную. Данный параметр весьма полезен, поэтому его рекомендуется всегда активизировать. На рис. 7.8 показан пример использования параметра Auto List Members (пред­ назначение которого станет понятнее, когда вы начнете вводить код VBA самостоятель­ но). В данном примере VBE отображает список элементов объекта A p p l i c a t i o n . Мо­ жете выбрать элемент из списка, чтобы не вводить его с помощью клавиатуры (в резуль­ тате название элемента будет введено без ошибок). Рис. 7.8. Пример использования параметра Auto List Members Параметр Auto Quick Info Если включен параметр Auto Quick Info (Отображать краткие сведения), VBE будет отображать информацию об аргументах функций, свойств и методов, названия которых вы вводите с клавиатуры. Это очень полезно, поэтому рекомендуется всегда оставлять эту настройку включенной. На рис. 7.9 данная функция показана в действии: отобража­ ется синтаксис свойства C e l ls . Параметр Auto Data Tips Если включен параметр Auto Data Tips, VBE отображает при отладке кода значение переменной, над которой находится указатель мыши. Ознакомившись с инструментами отладки в VBE, вы сможете по достоинству оценить этот параметр. Рекомендуется все­ гда держать его включенным. 180 Часть III. Visual Basic for Applications ШlVBATe** Sub VBATest() Dim inputArea As Range Set InputArea = cells( End Sub Рис. 7.9. Пример использования функции Auto Quick Info, предоставляющей сведения о свойстве C e l l s Параметр Auto Indent Настройка Auto Indent (Автоматический отступ) определяет, располагает ли автома­ тически VBE каждую новую строку программы с тем же отступом, который задан для предыдущей строки. Тем, кто использует отступы в программных кодах, советуем всегда обращаться к этому параметру. Вы можете также задать количество символов в отступе (по умолчанию указано значение 4). Совет Используйте клавишу <ТаЬ>, а не пробел, чтобы задать отступ в коде. При использовании клавиши <ТаЬ> отступы получаются более “ правильными” . Кроме того, для отмены отступа в конкретной строке воспользуйтесь ком­ бинацией клавиш <Shift+Tab>. Она может применяться при выделении не­ скольких операторов. Параметр Drag-And-Drop Text Editing При выборе параметра Drag-and-Drop Text Editing (Включить редактирование пере­ таскиванием) вы можете копировать и перемещать текст, перетаскивая его с помощью мыши. Например, я оставляю этот параметр включенным, но никогда не пользуюсь функцией перетаскивания, так как предпочитаю для копирования и вставки обращаться к комбинациям клавиш. Параметр Default То Full Module View Параметр Default to Full Module View (По умолчанию использовать полный режим просмотра) определяет принцип просмотра процедуры. Если он включен, процедуры в окне кода помещаются в одно окно с полосой прокрутки. Если же он отключен, то вы можете просмотреть в определенный момент только одну процедуру. Рекомендуем акти­ визировать этот параметр. Глава 7. Введение в VBA 181 Параметр Procedure Separator Когда параметр Procedure Separator (Разделение процедур) включен, в конце каж­ дой процедуры в окне кода отображаются специальные разделители. Если вам нравятся эти визуальные подсказки окончания процедуры, выставляйте данный флажок. Вкладка Editor Format На рис. 7.10 показана вкладка Editor Format (Формат редактора), которая находится в диалоговом окне Options (Параметры). Параметры на этой вкладке определяют поря­ док отображения VBE. Рис. 7.10. Вкладка Editor Format в диалоговом ок­ не Options • Параметр Code Colors (Цвета кода). Предоставляет возможность выбрать цве­ та кода (текста и фона) и индикатора, который используется для выделения раз­ ных элементов программы VBA. Цвета, конечно, выбираются в зависимости от личных предпочтений. Вы можете согласиться с цветами, принятыми по умолча­ нию. Однако для разнообразия можете изменить эти настройки. • Параметр Font (Шрифт). Предоставляет возможность указать шрифт, исполь­ зуемый в модулях VBA. Наибольшая эффективность достигается при работе с мо­ ноширинным шрифтом (например, Courier New). В таком шрифте все символы имеют одинаковую ширину, что делает программу более удобной для восприятия и анализа, так как все символы одинаково выровнены; кроме того, хорошо видны пробелы между словами. • Список Size (Размер). Определяет размер шрифта кода модулей VBA. Эта на­ стройка зависит от личных предпочтений, которые, в свою очередь, определяются разрешением монитора и вашим зрением. По умолчанию размер задан равным 10. • Параметр Margin Indicator Ваг (Полоса индикатора границы). Отображает вертикальную полосу вдоль левой границы окна кода, на которой высвечиваются всевозможные индикаторы. Его необходимо выставить; в противном случае вы не увидите полезные графические извещения при отладке кода. Часть III. Visual Basic for Applications 182 Вкладка General На рис. 7.11 показаны параметры, доступные на вкладке General (Общие) диалогово­ го окна Options (Параметры). *j| Editor | Editor Format General JDocking | Form Grtd Settings - Edit and Continue W Show Gnd Г Grid Units: Points Width: . Error Trapping |6 Г Break on AS Errors I С (* Break in Class Modtie Height: 1 6 Г Notify Before State Loss Afegn Controls to Grtd Break on Unhandled Errors Сотрйе W Show ТооГГps P Collapse Proj. Hides Windows W Сотрйе On Demand P Background Compile Справка Рис. 7.11. Вкладка General, выбранная в диалого­ вом окне Options • Раздел Form Grid Settings (Параметры сетки формы). Находящиеся в этом разделе параметры предназначены для настройки пользовательских диалоговых окон; с их помощью определяются параметры сетки, которая облегчает позицио­ нирование элементов управления в окне U serForm . Если вы имеете некоторый опыт работы с пользовательскими диалоговыми окнами, то легко определите па­ раметры сетки, которые будут полезны в работе. • Флажок Show ToolTips (Показать подсказки). Определяет поведение кнопок панели инструментов. Рекомендуется всегда его устанавливать. • Флажок Collapse Proj. Hides Windows (Скрывать окна при сворачивании проектов). Установка этого флажка приведет к автоматическому закрытию окон в случае сворачивания проекта в окне Project. Рекомендуется оставлять этот фла­ жок установленным. • Раздел Edit and Continue (Редактировать и продолжать). Содержит единст­ венный флажок, который может оказаться полезным в процессе отладки. В случае установки этого флажка VBA отображает сообщение, если переменные теряют присвоенные им значения в результате появления каких-либо проблем. • Раздел Error Trapping (Перехват ошибок). Находящиеся в этом разделе пара­ метры определяют, что происходит при возникновении ошибки. Если вы создаете процедуры обработки ошибок, убедитесь в том, что установлен переключатель Break on Unhandled Errors (Остановка при возникновении неисправимой ошиб­ ки). При заданном параметре Break on All Errors (Остановка при возникновении любой ошибки) процедуры обработки ошибок игнорируются (вряд ли это нужно). Методы обработки ошибок подробно описываются в главе 9. • Раздел Compile (Компиляция). Находящиеся в этом разделе два параметра управляют процессом компиляции кода. Рекомендуется установить оба этих па­ Глава 7. Введение в VBA 183 раметра. На современных компьютерах компиляция кода происходит практически мгновенно, если его размеры сравнительно невелики. Вкладка Docking На рис. 7.12 показана вкладка Docking (Прикрепление) диалогового окна Options (Параметры). Ее параметры определяют поведение нескольких окон редактора VBE — отображаются окна, которые могут быть прикреплены. Когда окно прикреплено, оно фик­ сируется по отношению к одной из границ окна VBE. В результате намного легче найти вспомогательное окно, так как оно отображается в строго определенной области. Если вы отключите все параметры прикрепления, то окна перемешаются между собой, а это ус­ ложнит работу. Как правило, идеальным выбором будут настройки по умолчанию. Щ Editor | Editor Format | General Docking Dockable R R R Immediate WHdow R R Project Explorer Г Object Browser J — Locals Window Watch Window Properties Window | OK | Отмена | Справка Рис. 7.12. Вкладка Docking диалогового окна Options Для прикрепления окна просто перетащите его в новое место. Например, вам может понадобиться присоединить окно Project Explorer к левой границе окна. Захватите его за заголовок и переместите влево. Отпустите кнопку мыши в момент, когда окно “прилипнет” к левому краю экрана. Примечание Прикрепление окна в VBE всегда было основной проблемой при настройке рабочей среды, однако после многочисленных попыток вам, будем надеять­ ся, все же удастся решить эту задачу. Средство записи макросов Ранее уже описывалось средство записи макросов, которое преобразует ваши дейст­ вия в Excel в код на языке VB А. Рассмотрим это средство подробнее. Примечание А теперь самое время еще раз проверить, отображается ли на ленте Excel вкладка Разработчик (Developer). Если этой вкладки не видно, обратитесь за инструкциями к разделу “ Отображение вкладки Разработчик” . 184 Часть III. Visual Basic for Applications Средство записи макросов — это чрезвычайно полезный инструмент, но не забывайте о следующих моментах. • Запись лучше всего выполнять для простых макросов или небольшого фрагмента более сложного макроса. • Не все выполняемые в Excel действия могут записываться. • Команда записи макросов не может генерировать код, который включает цикли­ ческие структуры (т.е. повторяющиеся операторы), а также присваивает перемен­ ные, выполняет условные операторы, отображает диалоговые окна и т.д. • Средство записи макросов всегда создает процедуры типа S u b . С ее помощью не­ возможно создать процедуру типа F u n c t i o n . • Созданная в результате записи программа зависит от определенных вами настроек. • Вам придется часто дорабатывать записанный код, чтобы удалить лишние команды. Что записывается Средство записи макросов Excel преобразует действия, выполненные с помощью мыши и клавиатуры, в код VBA. Принцип выполнения можно описать на нескольких страницах, но целесообразнее рассмотреть пример. Выполните следующие действия. 1. Начните с пустой рабочей книги. 2. Убедитесь, что окно Excel полностью не развернуто. Добейтесь, чтобы на экране оставалось свободное место. 3. Нажмите клавиши <Alt+Fl 1> для открытия окна VBE. Примечание. Убедитесь в том, что это окно развернуто не полностью. Если это ус­ ловие не выполняется, одновременный просмотр окон VBE и Excel невозможен. 4. Измените размер и разместите окна Excel и VBE таким образом, чтобы возможен был их просмотр. (Для достижения наилучших результатов сверните окна всех выполняющихся приложений.) 5. Перейдите в окно Excel, выберите команду Разработчик^Код1^Запись макро­ са (Developer^Code1^Record Macro) и щелкните на кнопке ОК для запуска функ­ ции записи макросов. 6. Перейдите в окно VBE. 7. В окне Project Explorer дважды щелкните на узле M o d u le l для отображения мо­ дуля в окне кода. 8 Закройте окно Project Explorer в среде VBE для лучшего просмотра окна кода. . В результате получим экран, показанный на рис. 7.13. Размер окон зависит от вы­ бранного разрешения экрана. Если вы являетесь счастливым обладателем двухмониторной системы, на первом мониторе отобразите окно VBA, а на втором — окно Excel. Теперь поработайте на рабочем листе, выбирая разные команды Excel. Посмотрите, как генерируется код в окне, представляющем модуль VBA. Вам следует выполнить не­ сколько действий: выделить ячейки, ввести данные, изменить формат ячеек. Далее ис­ пользуйте команды ленты, создайте диаграмму, поработайте с графическими объектами и т.д. Все прояснится, когда на экране появится код программы. Глава 7. Введение в VBA 185 ActiveChart.ChartTitle.Text * "Продажи в 1 кварЯ Selection.Format.TextFrame2.TextRange.Character With Selection.Format.TextFrame2.TextRange.char •TextDirection - maoTextDirect ionLeftToRigh .Alignment - msoAlignCenter End With With Selection.Format.TextFrame2.TextRange.Char •BaselineOffset = 0 .Bold - msoTrae .NameComplexScript - "+mn-cs" .Fill.Visible - msoTrue .Fill.ForeColor.RGB = RGB(0, 0, С .Fill.Transparency = 0 .Fill.solid .size = 18 .Italic - msoFalse •Kerning = 12 •Name = "+mn-lt" .Underlinestyle - msoNOUnderline .Strike - msoNoStrike End With Range("Bl").Select Рис. 7.13. Данное расположение окон облегчает наблюдение за работой функции записи макросов Абсолютный или относительный При записи последовательности действий Excel обычно использует абсолютные ссылки на ячейки. Другими словами, выделяя ячейку, Excel делает ее активной (а не ис­ ходную ячейку, активную при запуске программы). Проверим на примере, как это рабо­ тает. Выполните следующие действия и проанализируйте полученный результат. 1. Активизируйте рабочий лист и запустите функцию записи макросов. 2. Активизируйте ячейку В1. 3. Введите в ячейку В 1 Янв. 4. Перейдите в ячейку С1 и введите Фев. 5. Продолжайте этот процесс, пока в ячейках В1:G1 не будут введены аббревиатуры первых шести месяцев года. 6. Щелкните на ячейке В 1 для ее повторной активизации. 7. Остановите запись макроса и просмотрите полученный код в окне редактора VBE. Excel сгенерирует следующий код. Sub M a c r o l () R a n g e ( " B l" ) .S e le c t A c t iv e C e ll. F o rm u la R lC l R a n g e ( " C l" ) .S e le c t A c t iv e C e ll. F o rm u la R lC l R a n g e ( " D l" ) .S e le c t A c t iv e C e ll. F o rm u la R lC l R a n g e ( " E l" ) .S e le c t A c t iv e C e ll. F o rm u la R lC l R a n g e ( " F I " ) .S e le c t A c t iv e C e ll. F o rm u la R lC l R a n g e ( " G l" ) .S e le c t A c t iv e C e ll. F o rm u la R lC l R a n g e ( " B l" ).S e le c t = "Янв" = "Ф ев" = "Map" = "Anp" = "М а й " = "И юн" End Sub Для запуска макроса на выполнение выберите команду Разработчика Код1^ Макросы (Developer1^ Code1^ Macros) либо нажмите комбинацию клавиш <Alt+F8>, выберите Макрос! (либо название записанного макроса) и щелкните на кнопке Выполнить (Run). 186 Часть III. Visual Basic for Applications Макрос вновь выполнит действия, записанные ранее. Действия выполняются независимо от того, активны ли соответствующие ячейки на рабочем листе. При записи макроса с исполь­ зованием абсолютных ссылок вы всегда будете получать одни и те же результаты. В некоторых случаях требуется, чтобы записанный макрос работал с относительны­ ми адресами ячеек. Например, такой макрос обычно вводит названия месяцев в активной ячейке. В таком случае для записи макроса используется относительная форма записи. Для реализации относительной формы записи воспользуйтесь командой Разработчик^Код^Относительные ссылки (Developer^Code^Use Relative References). Эта кнопка играет роль переключателя. Как только она окрашивается в другой цвет, это служит признаком записи кода с относительными ссылками. Если кнопка окрашена в стандарт­ ный цвет, записывается код с абсолютными ссылками. Метод записи может быть изме­ нен в любой момент, даже в середине процесса записи. Чтобы увидеть, как работает относительная форма записи макросов, очистите содер­ жимое ячеек В1:G1 и выполните следующие действия. 1. Активизируйте ячейку В 1. 2. Выберите команду Разработчик^Код^Запись макроса (Developer^Code«=> Record Macro). 3. Для начала записи щелкните на кнопке ОК. 4. Щелкните на кнопке Относительные ссылки (Use Relative Reference) для выбо­ ра относительного режима записи. При этом цвет данной кнопки изменится. 5. В ячейки B1:G1 введите сокращенные названия первых шести месяцев, как в пре­ дыдущем примере. 6. Выделите ячейку В 1. 7. Остановите запись макроса. Если установить относительный режим записи, созданный Excel код приобретет иной вид. S u b М а с г о 2 () A c t i v e C e l l . F o r m u la R lC l = "Янв" A c t i v e C e l l . O f f s e t (0, 1 ) . R a n g e ( "А 1 " ) . S e l e c t A c t i v e C e l l . F o r m u l a R l C l = "Ф кв" A c t i v e C e l l . O f f s e t (0, 1 ) . R a n g e ( " A l " ) . S e l e c t A c t i v e C e l l . F o r m u l a R l C l = "M a p " A c t i v e C e l l . O f f s e t (0, 1 ) . R a n g e ( " A l " ) . S e l e c t A c t i v e C e l l . F o r m u la R lC l = "Anp" A c t i v e C e l l . O f f s e t (0, 1 ) . R a n g e ( " A l " ) . S e l e c t A c t i v e C e l l . F o r m u l a R l C l = "М а й " A c t i v e C e l l . O f f s e t (0 , 1 ) . R a n g e ( " A l " ) . S e l e c t A c t i v e C e l l . F o r m u l a R l C l = "Июн" A c t i v e C e l l . O f f s e t (0 , - 5 ) . R a n g e ( " A l " ) . S e l e c t End Sub Для вызова этого макроса на выполнение активизируйте рабочий лист и выберите команду Разработчика Код■=>Макросы (Developer^Code^Macros). Выберите имя нужного макроса и щелкните на кнопке Выполнить (Run). В рассматриваемом примере процедура была незначительно изменена (мы активизи­ ровали начальную ячейку перед началом записи). Это важная операция при записи мак­ роса, использующего в качестве основы активную ячейку. Макрос кажется сложным, хотя на самом деле это не так. Первый оператор вводит Янв в активную ячейку. (Используется активная ячейка, так как перед оператором не Глава 7. Введение в VBA 187 указан оператор активизации ячейки.) Следующий оператор использует метод S e l e c t (Выделение) (наравне со свойством O f f s e t (Смещение)) для перемещения курсора на одну ячейку вправо. Следующий оператор вставляет в нее текст и т.д. В результате ис­ ходная ячейка выделяется путем вычисления относительного адреса (смещения). В отли­ чие от предыдущего, данный макрос всегда начинает ввод текста в активной ячейке. Функция записи макросов работает в двух различных режимах, причем важно знать, в каком режиме записи макроса вы находитесь в данный момент, иначе результат может не совпадать с ожидаемым. Примечание В этом макросе сгенерирован код, который будто бы ссылается на ячейку А1, что может показаться странным, поскольку ячейка А1 в макросе не ис­ пользуется. Это побочный эффект функции записи макросов. (Свойство O f f s e t будет рассмотрено далее.) На данном этапе макрос работает так, как требуется. Кстати, код, сгенерированный Excel, намного сложнее, чем необходимо, и представ­ ляет не самый эффективный способ программирования описанной операции. Следую­ щий макрос, который был введен вручную, представляет собой более простой и быстрый способ выполнить те же действия. В примере показано, что не обязательно выделять ячейку перед помещением в нее информации— это важный момент, который сущест­ венно ускоряет работу макроса. Sub М а с г о З () A c tiv e C e A c tiv e C e A c tiv e C e A c tiv e C e A c tiv e C e A c tiv e C e End Sub ll.O ll.O ll.O ll.O ll.O ll.O ffse ffse ffse ffse ffse ffse t ( 0 , 0) t ( 0 , 1) t ( 0 , 2) t ( 0 , 3) t ( 0 , 4) t (0 , 5) = = = = = = "Янв" "Фев" "Map" "Anp" "М а й " "И юн" Данный макрос можно ещ е больш е упростить с помощью конструкции W it h - E n d With. Sub M a c r o 4 () W ith A c t i v e C e . O f f s e t (0 , .0 ffse t(0 / . O f f s e t (0 , . O f f s e t (0 , .0 ffse t(0 , . O f f s e t (0, End W i t h d Sub ll 0) 1) 2) 3) 4) 5) = = = = = = "Янв "Ф е в "M a p "Anp "М а й " Июн Если же вы гениальный программист на VBA (как и я), можете поразить своих кол­ лег, выполнив все описанные выше действия в одном операторе. Sub М а с го Б () A c t i v e C e l l . R e s i z e (, 6) = A r r a y ( " Я н в " , " Ф е в " , " М а р " , " А п р " , " М а й " , " И ю н " ) End Sub 188 Часть III. Visual Basic for Applications Параметры записи В процессе записи действий, применяемых для создания VBA-кода, в распоряжении пользователя оказывается ряд параметров диалогового окна Запись макроса (Record Macro). Все они описаны ниже. • Имя макроса (Macro Name). Предоставляет возможность ввести название записы­ ваемой процедуры. По умолчанию Excel использует названия Макрос1, Макрос2 и т.д. для каждого записываемого макроса. Вы можете использовать имя по умолча­ нию и изменить его позже, однако лучше сразу назвать макрос правильным именем. • Комбинация клавиш (Shortcut Key). Позволяет выполнить макрос с помощью комбинации клавиш. Например, введя в данном поле w (в нижнем регистре), вы можете выполнить макрос. Для этого нажмите комбинацию клавиш <Ctrl+W>. После ввода символа W(в верхнем регистре) макрос запускается по нажатию ком­ бинации клавиш <Ctrl+Shift+W>. Помните о том, что комбинация клавиш, назна­ ченная макросу, переопределяет встроенную комбинацию клавиш (если она есть). Например, если для вызова макроса воспользоваться клавишами <Ctrl+B>, вы не сможете применить эти клавиши для выбора полужирного стиля выделения ячеек. Вы вправе в любой момент добавить или изменить комбинацию клавиш, поэтому необязательно задавать параметр при записи макроса. • Параметр Сохранить в (Store Macro In). Указывает Excel, где должен храниться макрос, который записывается. По умолчанию Excel помещает записанный макрос в модуль активной рабочей книги. По желанию можно записать его либо в новой рабо­ чей книге (Excel открывает пустую рабочую книгу), либо в личной книге макросов. (Дополнительные сведения можно найти во врезке “Личная книга макросов”.) Примечание Excel запоминает ваш выбор, поэтому в следующий раз по умолчанию мак­ рос записывается туда же, куда он записывался в предыдущий раз. • Описание (Description). При желании в поле Описание (Description) можно вве­ сти описание макроса. Введенный текст отображается в начале кода макроса в ви­ де комментария. Личная книга макросов В процессе создания макрос можно сохранить в личной книге макросов (Personal Macro Workbook). Здесь можно сохранить макросы VBA, которые вы считаете особенно полезными. Эта рабочая книга называется P e r s o n a l . x l s b и хранится в папке X L S t a r t . Загрузка данной рабочей книги происходит после запуска Excel, причем вы сразу же получаете доступ к хранящимся там макросам. Книга P e r s o n a l . x l s b скрыта, поэтому при обычной работе в Excel она не видна. Файл P e r s o n a l . x l s b не существует до тех пор, пока не будет записан первый макрос. Улучшение записанных макросов Итак, вы уже знаете о том, что запись действий при выполнении всего лишь одной ко­ манды (Разметка страницы^Параметры страницы^Ориентация (Page Layout^Page Setup^Orientation)) приводит к генерированию большого объема кода VBA. Во многих случаях записанный код включает ненужные команды, которые следует удалять вручную. Глава 7. Введение в VBA 189 Кроме того, функция записи макросов не всегда гарантирует получение эффективно­ го кода. Работая с созданной программой, вы можете обнаружить следующее: как прави­ ло, Excel анализирует то, что выделено (т.е. определяет активный объект), а затем ис­ пользует в генерируемых операторах объект S e l e c t i o n . Например, ниже приводится пример кода, который генерируется при выделении диапазона ячеек и использовании не­ которых кнопок вкладки Главная (Ноше) для изменения числового форматирования, а также применения полужирного и курсивного стилей. Range ( " A l : С5 " ) . S e l e c t S e l e c t i o n . S t y l e = "Comma" S e le c tio n . F o n t . B o ld = T ru e S e le c tio n . F o n t . I t a l i c = T ru e Записанный код VBA работает, но он представляет собой всего лишь один способ выполнения этих действий. Можно также воспользоваться более эффективной конструк­ цией W ith-E nd W ith, как показано ниже. Range ( " A l : С5 " ) . S e l e c t With S e l e c t i o n . S t y l e = "Comma" .F o n t.B o ld = T rue . F o n t . I t a lic = True End W i t h Можно избежать применения метода S e l e c t , в результате чего появится более эф­ фективный код. With R a n g e ( " А 1 : С 5 " ) . S t y l e = "Comma" . F o n t . B o l d . F o n t . I t a lic = True End W i t h = True Если в вашем приложении важна скорость выполнения операций, то необходимо тщательно анализировать любой записанный код VBA, чтобы сделать его как можно бо­ лее эффективным. Конечно, вам придется разобраться в VBA, прежде чем приступить к улучшению ко­ да записанных макросов. А пока примите к сведению, что записанный код VBА не все­ гда является наилучшим и наиболее эффективным решением задачи. Опримерах кода в книге В этой книге представлено много небольших примеров кода VBA, объясняющих от­ дельную тему или представляющих пример решения поставленной задачи. Зачастую этот код может состоять из единственного оператора. В некоторых случаях примеры представлены только выражением, которое не является корректной инструкцией. Ниже представлено типичное выражение. Range ( " A l " ) . V a l u e Чтобы протестировать выражение, его необходимо выполнить. Для этого часто применяется функция M s g B o x . MsgBox R a n g e (" A l " ) . V a l u e Чтобы выполнить предлагаемые примеры, поместите оператор в процедуру модуля VBAследующим образом. Sub T e s t () ' Здесь End Sub находится оператор Часть III. Visual Basic for Applications 190 Переместите курсор в любое место процедуры и нажмите клавишу <F5> для ее вы­ полнения. Кроме того, убедитесь, что код выполняется в правильном контексте. На­ пример, если оператор ссылается на лист Л и с т 1 , удостоверьтесь, что в рабочей книге действительно есть лист с названием Л и с т 1 . Код может состоять из единственного оператора. В этом случае используется окно отладки VBE (Immediate). Оно применяется для “немедленного” выполнения операто­ ров — без создания процедуры. Если окно отладки не отображается, нажмите клавиши <Ctrl+G>. Введите в окно отладки оператор VBA и нажмите клавишу <Enter>. Чтобы проверить выражение в окне отладки, введите перед ним знак вопроса ( ?) — символ вызова ко­ манды P r i n t . Например, в окно отладки можно ввести следующий код: ? R a n g e ( " A l" ) .V a lu e Результат выполнения выражения отображается в следующей строке окна отладки. Об объектах и коллекциях На этом этапе вы должны иметь представление о VBA и знать основные методы управления модулями VBA в редакторе Visual Basic. Кроме того, вы ознакомились с примерами кода VBA и получили достаточно информации о таких элементах, как объ­ екты и свойства. В этом разделе приводится дополнительная информация об объектах и коллекциях объектов. Работая с кодом VBA, следует четко понимать назначение объектов и объектной мо­ дели Excel. Целесообразнее рассматривать объекты с точки зрения иерархической структуры. На вершине объектной модели находится объект A p p l i c a t i o n (в данном случае — Excel). Но если вы программируете в VBA, запуская VBE в Microsoft Word, то объектом A p p l i c a t i o n будет выступать Word. Иерархия объектов Объект A p p l i c a t io n (в рассматриваемом случае Excel) содержит другие объекты. Ниже приведено несколько примеров объектов, которые находятся в объекте A p p lic a tio n : • W o r k b o o k s (коллекция всех объектов W o rk b o o k — рабочих книг); • W in d o w s (коллекция всех объектов W in dow — окон); • A d d in s (коллекция всех объектов A d d in — надстроек). Одни объекты могут содержать другие объекты. Например, коллекция W orkbooks состоит из всех открытых объектов W orkbook, а объект W orkbook включает другие объекты. Некоторые из них представлены ниже: • W o r k s h e e t s (коллекция объектов W o r k s h e e t — рабочих листов); • C h a r t s (коллекция объектов C h a r t — диаграмм); • N am es (коллекция объектов Name — имен). Каждый из этих объектов, в свою очередь, может содержать другие объекты. Коллек­ ция W o r k s h e e t s состоит из всех объектов W o r k s h e e t рабочей книги W orkbook. Объект W o r k s h e e t включает другие объекты, среди которых есть следующие: Глава 7. Введение в VBA 191 • C hartO b j e c t s (коллекция объектов C hartO b j e c t — элементов диаграмм); • Range — диапазон; • P a g e S e tu p — параметры страницы; • P iv o tT a b le s (коллекция объектов P iv o tT a b le — сводных таблиц). Может быть, вы пока не готовы правильно воспринять подобную концепцию, но со временем наверняка поймете, что иерархия объектов вполне логична и хорошо структу­ рирована. Вся объектная модель Excel схематически изображена в электронной справоч­ ной системе. О коллекциях Одной из ключевых концепций в программировании на языке VBA является коллек­ ция. Коллекция — это группа объектов одного класса (и сама коллекция также является объектом). Как указывалось выше, W orkbooks — это коллекция всех открытых в дан­ ный момент объектов W orkbook. W o r k s h e e ts ---- коллекция всех объектов W ork­ sheet, которые содержатся в конкретном объекте Workbook. Можно одновременно управлять целой коллекцией объектов или отдельным объектом этой коллекции. Чтобы сослаться на один объект из коллекции, введите название или номер объекта в скобках после названия коллекции. W orksheets( "Л и с т 1 ") Если лист Л и с т 1 — это первый рабочий лист в коллекции, то можно использовать следующую ссылку: Worksheets (1) Если в объекте W orkbook нужно сослаться на второй рабочий лист, ссылка указыва­ ется в формате W o rk s h e e ts (2) и т.д. Коллекция S h e e ts состоит из всех листов рабочей книги, которые могут представ­ лять собой рабочие листы или листы диаграмм. Если Л и с т 1 — первый лист в рабочей книге, ссылка на него имеет следующий вид: S h e ets(1) Ссылки на объекты Если вы обращаетесь к объекту в VBA, то в ссылке на него вводятся названия всех расположенных выше в иерархической структуре объектов, разделенных точкой (оператор-точка). Что делать, если в Excel открыты две рабочие книги и в обеих имеет­ ся рабочий лист с названием Л и с т 1 ? В этом случае в ссылке необходимо указать кон­ тейнер требуемого объекта. Workbooks( " К н и г а 1 " ) .W o rk s h e e ts ( "Л и с т 1 ") Без указания рабочей книги редактор Visual Basic искал бы Л и с т 1 в активной рабо­ чей книге. Чтобы сослаться на определенный диапазон (например, на ячейку А1) на рабочем листе с названием Л и с т 1 в рабочей книге К н и г а 1, можно использовать следующее вы­ ражение: Workbooks ( "К н и г а 1 ") . W o rksh e e ts ( "Л и с т1 ") . Range ( " A l" ) Полная ссылка из предыдущего примера включает объект Appl i c a t io n и выглядит так: 192 Часть III. Visual Basic for Applications A p p lic a tio n .Workbooks( "Книга1") .W o rk sh eets("JIhctI " ) .Ra n g e ( "A l") Однако в большинстве случаев можно опускать объект A p p l i c a t i o n в ссылках (кроме него использоваться больше нечему). Если объект Книг а 1 — это активная рабо­ чая книга, то опустите ссылку на нее и запишите рассматриваемое выражение следую­ щим образом: W o rk s h e e ts ( " К н и га 1 " ) . R ange( " A l ") Если Лист1 — активный рабочий лист, можно еще более упростить выражение: R a n g e ("A l") Примечание В Excel отсутствует объект отдельной ячейки. Отдельная ячейка представ­ ляет собой объект Range, состоящий из одного элемента. Простые ссылки на объекты (как в приведенных примерах) ничего не выполняют. Чтобы выполнить действие, прочтите или измените свойства объекта или задайте метод, который выполняется по отношению к объекту. Свойства и методы Запутаться в свойствах и методах несложно: их существует несколько тысяч. В этом разделе показано, как осуществляется доступ к свойствам и методам объектов. Свойства объекта Все объекты обладают свойствами. Например, объект R a n g e (Диапазон) обладает свойством V a l u e (Значение). Можно создать оператор VBA, чтобы отобразить свойство V a l u e или присвоить ему определенное значение. Ниже приведена процедура, исполь­ зующая функцию VBA M sg B o x для отображения окна, в котором представлено значение ячейки А1 листа Лист1 активной рабочей книги. Sub S h ow V alue () Msgbox W o rk s h e e ts ( "Л и с т 1 " ) . R a n g e ( " A l" ) .V a lu e End Sub Примечание Функция VBA MsgBox обеспечивает простой способ отображения результа­ тов выполнения кода VBA. Эта функция повсеместно используется в книге. Код предыдущего примера отображает текущее значение свойства V a l u e для кон­ кретной ячейки — А1 рабочего листа Лист1 активной рабочей книги. Обратите внима­ ние на то, что если в активной книге отсутствует лист с названием Лист 1, то макрос вы­ даст ошибку. Что необходимо сделать, чтобы изменить свойство V a lu e ? Ниже приведена проце­ дура изменения значения ячейки А1 путем определения значения свойства V a lu e . Sub C h a n g e V a lu e () W o rk s h e e ts ( " Л и с т 1 " ) .R a n g e ( " A l" ) .V a lu e = 1 23 .45 End Sub После выполнения этой процедуры ячейка Al листа Лист1 получает значение 123 , 45. Глава 7. Введение в VBA 193 Можете ввести описанные процедуры в модуль и протестировать их. Примечание Многие объекты имеют свойство, заданное по умолчанию. Для объекта Range свойством по умолчанию является v a lu e . Следовательно, выражение .v a lu e в предыдущем коде можно опустить, и ничего не произойдет. Однако лучше включать ссылку на свойство, даже если оно используется по умолчанию. Ниже приводится выражение, в котором доступ к значениям осуществляется с помо­ щью свойств H asF o rm u la и F o rm u la объекта Range. I f Range ( 11А 1 ") . H asForm ula Then MsgBox Range ( "A 1 " ) . F o rm u la В данном случае конструкция I f - T h e n применяется для условного отображения окна сообщения: если ячейка содержит формулу, эта формула будет отображена путем обраще­ ния к свойству Form ula. Если ячейка А1 не содержит формулу, ничего не происходит. Свойство F o rm u la доступно в режиме “только для чтения”, поэтому определить формулу можно с помощью кода VBA. Range ("D 1 2 ") .F o rm u la = " =RAND1)* 1 0 0 " Методы объекта Кроме свойств, объекты характеризуются методами. Метод — это действие, которое выполняется над объектом. Ниже приведен простой пример использования метода C le a r по отношению к диапазону ячеек. После выполнения этой процедуры ячейки А1:СЗ листа Лист1 станут пустыми, и дополнительное их форматирование будет удалено. Sub ZapRange() W o rk s h e e ts ( " Л и с т1 " ) . R ange( "А 1 : СЗ" ) . C le a r End Sub Если нужно удалить значения в диапазоне, но оставить форматирование, используйте метод C le a r C o n te n ts объекта Range. Многие методы получают аргументы, определяющие выполняемые над объектом действия более детально. Далее приводится пример, в котором ячейка А1 копируется в ячейку В1 с помощью метода Сору объекта Range. В данном примере метод Сору получает один аргумент (адрес ячейки, в которую следует скопировать данные). Обрати­ те внимание, что в примере используется символ продолжения строки (пробел и подчер­ кивание). Можно не применять этот символ, а ввести оператор в одну строку. Sub CopyOne () W o rk s h e e ts ( "Л и с т 1 " ) . R an ge ( "А 1 " ) .С ору _ W o rk s h e e ts ( "Л и с т 1 ") .R a n g e ( " B l " ) End Sub Определение аргументов методов и свойств В среде программистов VBA определение аргументов методов и свойств часто вы­ зывает трудности. Некоторые методы используют аргументы для дальнейшего уточне­ ния действий, отдельные свойства применяют аргументы для последующего опреде­ ления значения свойства. Иногда один или несколько аргументов вообще применять необязательно. Если метод использует аргументы, они указываются после названия метода и раз­ деляются запятыми. Если метод использует необязательные аргументы, можете про­ пустить их, оставив пустые места. 73ак. 3107 194 Часть III. Visual Basic for Applications А теперь обратимся к методу P r o t e c t объекта рабочей книги. В справочной систе­ ме можно найти информацию о том, что метод P r o t e c t имеет три аргумента: пароль, структуру и окна. Эти аргументы соответствуют параметрам диалогового окна Защита книги (Protect Workbook). Например, если нужно защитить рабочую книгу M y B o o k . x ls x , используйте следующий оператор: W o rk b o o k s ( "M yB ook.x l s x " ) . P r o t e c t " x y z z y " , T r u e , F a ls e В данном случае рабочая книга защищена паролем (аргумент 1). Также защищена структура (аргумент 2), но не окна (аргумент 3). Если вы не хотите применять пароль, используйте следую­ щий оператор: W o rkb o o k s(" M y B o o k .x ls x " ) . P r o t e c t , T rue, F a ls e Обратите внимание, что первый аргумент пропущен, а его место обозначено запятой. Существует и другой подход (причем в этом случае программу будет удобнее чи­ тать) — использование именованных аргументов. Применим именованные аргументы для предыдущего примера. W o rkb o o ks("M y B o o k .x ls x " ) .P r o t e c t S t r u c t u r e : = T ru e , W in d o w s : = F a ls e Применение именованных аргументов — хорошая идея, особенно в методах с боль­ шим количеством необязательных аргументов, когда нужно использовать только неко­ торые из них. При работе с именованными аргументами не нужно оставлять место для отсутствующих аргументов. Для свойств (и методов), использующих аргументы, последние указываются в скоб­ ках. Например, свойство A d d r e s s объекта R a n g e имеет пять аргументов — все необя­ зательные. Показанный ниже оператор некорректен, поскольку пропущены скобки. M sgBox R a n g e ( " A l " ) .A d d re s s F a ls e ' Некорректно Правильный синтаксис для этого оператора выглядит так: MsgBox R a n g e ( " A l" ) . A d d r e s s ( F a ls e ) Кроме того, оператор можно записать с помощью именованного аргумента. M sgBox R a n g e ( " A l" ) . A d d r e s s ( r o w A b s o l u t e : = F a ls e ) Подобные нюансы станут для вас понятнее по мере приобретения опыта програм­ мирования в VBA. Объект comment: пример использования Чтобы лучше разобраться в свойствах и методах объекта, сосредоточимся на изучении конкретного объекта— Comment. Этот объект можно создать с помощью команды Excel Рецензирование^Примечания^Создать примечание (Review^Comments^New Com­ ment). Его назначение — вставка комментария в ячейки. В следующих разделах вы получи­ те более детальное представление об управлении этим объектом. Справочные сведения об объекте Comment Единственный способ получить информацию о конкретном объекте— найти соот­ ветствующие разделы в электронной справочной системе. На рис. 7.14 показано главное окно справочной системы для объекта Comment. Для отображения этого экрана было Глава 7. Введение в VBA 195 введено слово com m ent в поле Type a Q u e s tio n (Задайте вопрос) окна справки VBE (в правой части строки меню). Обратите внимание, что в содержании справки отобража­ ются свойства и методы этого объекта. Hi) Справка: Excel ш - Р comment object Поиск Exc^291GD«etop«a*fefw*»» E ^ O t^ M o 6 e lR e fw e ric e > C o ^ m e ^ O I ^ Excel Developer Reference Comment Object Represents a cell comment. Remarks The Com m ent object is a member of the Comments colection. Example Use the Com m ent property to return a Comment object. The fbflowtng example changes the text in the comment in cell E5. Visual Basic for Applications Worksheets(1).Range("E5").Comment.Text "reviewed on ** & Date Use CommentsOrx&«), where mdex\s the comment number, to return a single comment from the Comments collection. The following example hides comment two on worksheet one. Visual Basic for Appbcations Worksheets(1).Comments(2).Visible = False Use the AddComment method to add a comment to a range. The following example adds a comment to cell E5 on worksheet one. Visual В а ж fo r A pp lica tio ns With Worksheets(1).Range("e5").AddComment .Visible = False .Text "reviewed on * & Date End With @2010 Microsoft Corporation, Al rights reserved. See Also * Excel Object Model Reference ■ Comment Object Members Щ Справка для разработчиков | - ^ п г ! ^ & Двтономная Работа .>• Рис. 7.14. Главное окно справки для объекта Comment Использование электронной справочной системы Самый простой способ получить справку о конкретном объекте, свойстве или мето­ де— ввести ключевое слово в окно кода и нажать клавишу <F1>. Если ключевое слово трактуется неоднозначно, появляется диалоговое окно выбора темы, подобное пока­ занному на следующем рисунке. *] Multiple instances of the selected word have been found. Please select a topic and press Help. 1-xce* Comment Hdp | Cancel | Часть III. Visual Basic for Applications 196 К сожалению, элементы, перечисленные в этом диалоговом окне, не всегда понят­ ны, поэтому, чтобы найти нужный раздел, часто приходится прибегать к методу проб и ошибок. Показанное на рисунке диалоговое окно появилось в результате ввода слова C om m ent с последующим нажатием клавиши <F1 >. В рассматриваемом случае Comment является объектом, который может вести себя подобно свойству. После щелчка на пер­ вой теме отображается раздел, посвященный объекту Comment; если выбрать вторую тему, отображается раздел, посвященный свойству Com ment. Свойства объекта Comment Объект Comment включает шесть свойств. Список этих свойств приводится в табл. 7.1 наравне с кратким описанием каждого свойства. Если свойство доступно только в режиме чтения, созданный вами VBA-код может применяться только для чтения свойства, но не для его изменения. Таблица 7 . 1 . Свойства объекта Comment Свойство A p p lic a tio n Au tho r C re a to r Parent Shape V is ib le Только для чтения Описание Возвращает объект, представляющий приложение, в ко­ Да тором создавалось примечание (т.е. Excel) Возвращает имя пользователя, создавшего примечание Да Возвращает целое число, которое свидетельствует о Да том, что было создано приложение, к которому отно­ сится объект Возвращает родительский объект для примечания (всег­ Да да объект Ra n g e ) Возвращает объект S h a p e , представляющий фигуру, Да в виде которой отображается примечание Нет Если это свойство имеет значение T r u e примечание отображается на экране Методы объекта Comment В табл. 7.2 приведены методы, которые можно использовать в объекте Comment. Все они выполняют обычные операции, которые производятся над примечанием вручную, однако прежде мы не рассматривали эти действия как методы. Таблица 7.2. Методы объекта Comment Метод Описание D e le te Удаляет комментарий Возвращает объект Comment, который представляет следующий коммента­ рий в рабочем листе Возвращает объект Comment, который представляет предыдущий коммента­ рий в рабочем листе Возвращает или определяет текст в комментарии (метод имеет три аргумента) Next P re v io u s Text Глава 7. Введение в VBA 197 Примечание Возможно, вас удивило, что T e x t — это метод, а не свойство. Данный формат приводит нас к важному умозаключению: различия между свойст­ вами и методами не всегда четкие, а объектная модель не является иде­ ально последовательной. На самом деле неважно, насколько точно вы бу­ дете различать свойства и методы. Пока используется правильный син­ таксис, не имеет значения, какую роль в коде выполняет ключевое слово — свойства или метода. Коллекция Comments Коллекция — это группа одинаковых объектов. Каждый рабочий лист имеет коллек­ цию Comments, состоящую из всех объектов Comment рабочего листа. Если на рабочем листе отсутствуют примечания, эта коллекция пуста. Например, приведенный ниже код ссылается на первое примечание листа Лист1 ак­ тивной рабочей книги. W o rksh e e ts( " Л и с т1 " ) . Comments(1) Следующий оператор отображает текст, который содержится в первом примечании листа Лист1: MsgBox W o rk s h e e ts ( " Л и с т 1 ") .C om m ents( 1 ) .T e x t В отличие от большинства объектов, объект Comment не имеет свойства Name. Сле­ довательно, чтобы сослаться на конкретный комментарий, используйте номер, а для по­ лучения необходимого комментария обратитесь к свойству Comment объекта Range либо укажите значение индекса. Коллекция Comments — тоже объект, имеющий собственный набор свойств и мето­ дов. Например, коллекция Comments включает свойство C ount, которое хранит сведе­ ния о количестве элементов в коллекции, — число элементов Comment в активной рабо­ чей книге. Так, следующий пример определяет общее количество комментариев: MsgBox A c t iv e S h e e t. Comments . C ount В следующем примере показан адрес ячейки, в которой находится первое примечание: MsgBox A c t iv e S h e e t. Comments( 1 ) . P a re n t.A d d re s s В этом примере Comments (1) возвращает первый объект Comment коллекции Comments. Свойство P a r e n t объекта Comment возвращает его контейнер, представ­ ленный объектом Range. В окне сообщений отображается свойство A d d re s s объекта Range. В итоге оператор показывает адрес ячейки, содержащей первое примечание. Кроме того, вы можете циклически просмотреть все примечания на листе, используя конструкцию F o r E a c h -N e x t (о ней речь пойдет в главе 8). Ниже приведен пример использования отдельных сообщений для раздельного отображения каждого примечания активного рабочего листа. For Each cmt i n A c t iv e S h e e t . Comments MsgBox c m t. T e x t Next cmt Если вы не хотите, чтобы на экране находилось большое количество диалоговых окон с сообщениями, то используйте следующую процедуру для вывода всех примечаний в одном окне отладки (Immediate). Часть III. Visual Basic for Applications 198 F o r Each cmt i n A c t iv e S h e e t. Comments D ebug. P r i n t c m t. T e x t N e xt cmt О с в о й с т в е Comment В этом разделе речь идет об объекте Comment. В справочной системе указано, что объект Range обладает свойством Comment. Если ячейка содержит примечание, свой­ ство Comment возвращает объект Comment. Например, следующий оператор ссылается на объект Comment ячейки А1: R ange( " A l " ) . Comment Если это первое примечание на листе, то на данный объект Comment можно сослать­ ся следующим образом: A c t iv e S h e e t. Comments(1) Чтобы отобразить примечание ячейки А1 в окне сообщения, используйте такой оператор: MsgBox R ange( " A l " ) . Comment. T e x t Если в ячейке Al нет примечания, то оператор выдаст ошибку. © Примечание Тот факт, что свойство может возвращать объект, довольно важен — данная концепция имеет решающее значение в программировании на VBA. О бъ е кты , в л о ж е н н ы е в Comment Управление свойствами сначала кажется сложной задачей, потому что некоторые из них возвращают объекты. Предположим, необходимо определить цвет фона конкретного примечания на листе Л и с т 1 . Просмотрев список свойств объекта Comment, вы не най­ дете ничего, что относится к определению цвета. Выполните следующие действия. 1. Используйте свойство Shape объекта Comment, возвращающее объект Shape, который содержится в примечании. 2. Используйте свойство Fill объекта Shape, возвращающее объект Fill Format. 3. Используйте свойство ForeColor объекта Fill Format, возвращающее объект ColorFormat. 4. Используйте свойство RGB (или свойство SchemeColor) объекта ColorFor­ mat, чтобы задать цвет. Иначе говоря, получение цвета фона объекта Comment связано с доступом к другим объектам, которые в нем содержатся. Ниже описана иерархия задействованных объектов. A p p l i c a t i o n (E x c e l) Объект W orkbook Объект W o rksh e e t Объект Comment Объект Shape Объект F illF o r m a t Объект C o lo rF o rm a t Глава 7. Введение в VBA 199 Данная иерархия объектов выглядит весьма запутанной! Но в качестве примера “элегантности” VBA посмотрите, как код для изменения цвета примечания можно запи­ сать с помощью одного оператора. W o rkshe ets( "Л и с т 1 " ) .C om m ents( 1 ) . S hape. F i l l . F o re C o lo r _ .RGB = RGB(0, 255, 0) Вы вправе использовать также свойство Scheme Со l o r (значение которого опреде­ ляется в диапазоне от 0 до 80). W o rkshe ets( "Л и с т 1 " ) .C om m ents( 1 ) . S hape. F i l l . F o re C o lo r _ .S chem eC olor = 12 В данном типе ссылки сразу трудно разобраться, но впоследствии вам несложно бу­ дет ориентироваться в иерархии объектов. Вы быстро изучите ее особенности, прежде всего потому, что в Excel при записи последовательности действий практически всегда вопрос иерархии задействованных объектов ставится на первое место. Кстати, чтобы изменить цвет текста в примечании, обратитесь к объекту T e x t Frame объекта Comment, который содержит объект C h a r a c te r s , включающий, в свою очередь, объект Font. Далее обратитесь к свойству C o lo r или C o lo r ln d e x объекта F ont. Ниже приведен пример, в результате выполнения которого свойству C o lo r ln d e x присваивается значение 5 . W orksheets( "Л и с т 1 ") .C om m ents(1) _ . Shape. T e x tF ra m e . C h a r a c te r s . F o n t. C o lo r ln d e x = 5 © Перекрестная ссылка Обратитесь к главе 30 для получения дополнительных сведений о цветах. Содержит л и я ч е й ка п р и м е ч а н и е Следующий оператор отображает примечание ячейки А1 активного листа: MsgBox Range (" А 1 " ) . Comment. T e x t Если в ячейке А1 примечание отсутствует, при выполнении этого оператора возникнет непонятное сообщение об ошибке: O b je c t v a r i a b l e o r W ith b lo c k v a r i a b l e not s e t (He присвоено значение объектной переменной или переменной блока With). Чтобы определить, содержит ли конкретная ячейка примечание, напишите код, про­ веряющий, не пустой ли объект Comment, т.е. равен ли он N o th in g (это корректное ключевое слово VBA). Следующий оператор отображает T ru e, если в ячейке А1 приме­ чание отсутствует: MsgBox R a n g e ("A l").C o m m e n t I s N o th in g Обратите внимание, что в этом примере используется ключевое слово I s , а не знак равенства. Вы можете сделать на один шаг больше и создать оператор, который отображает примечание ячейки только в том случае, если это примечание находится в данной ячейке (при этом не появляется сообщение об ошибке в случае отсутствия примечания). Соот­ ветствующий оператор приводится ниже. I f Not R a n g e ("A l").C o m m e n t I s N o th in g Then _ MsgBox R ange( " A l " ) . Comment. T e x t Часть III. Visual Basic for Applications 200 В данном случае использовалось ключевое слово N ot, которое инвертирует значение T ru e, возвращаемое, если ячейка не содержит примечание. Фактически этот оператор использует двойное отрицание в проверочном условии. Если примечание не отсутствует, оно отображается. Д о б а в л е н и е н о в о го о б ъ е кта Comment Возможно, вы заметили, что в списке методов объекта Comment не существует мето­ да для добавления нового примечания. Это объясняется тем, что метод AddComment принадлежит объекту Range. Следующий оператор добавляет примечание (пустое) в ячейку А1 активного рабочего листа: R ange( " A l " ) . AddComment Обратившись к справочной системе, вы обнаружите, что метод AddComment имеет аргумент, представляющий текст примечания. Следовательно, можно добавить примеча­ ние и текст в нем с помощью всего одного оператора. R ange( " A l " ) .AddComment "Формула р азработана JW ." Примечание Метод AddComment генерирует ошибку, если в ячейке уже содержится при­ мечание. Во избежание появления этой ошибки проверьте содержимое ячейки. Компакт-диск Рассмотренные свойства и методы объекта Comment можно увидеть в дейст­ вии (см. пример на прилагаемом к книге компакт-диске). Соответствующая рабочая книга (под именем C om m entobject .x ls m ) содержит несколько при­ меров управления объектами Comment с помощью кода VBA. Этот код помо­ жет вам осознать, как можно использовать VBA для управления объектами. Некоторые полезные свойства объекта A p p lic a tio n При работе в Excel активной одновременно может быть только одна рабочая книга. И если вы управляете рабочим листом, то активна на нем только одна ячейка (даже если выделен диапазон). VBA это известно, поэтому вы можете ссылаться на активные объек­ ты более простым методом. Это удобно, так как не всегда известно, с какой именно ра­ бочей книгой, рабочим листом или ячейкой вам предстоит работать. VBA представляет свойства объекта A p p l i c a t i o n для определения этого. Например, объект A p p l i c a ­ t i o n обладает свойством A c t iv e C e l l, возвращающим ссылку на активную ячейку. Следующая инструкция присваивает значение 1 активной ячейке: A c t iv e C e ll. V a lu e = 1 Обратите внимание, что в этом примере пропущена ссылка на объект A p p l i c a t io n , так как это само собой разумеется. Важно понять, что такая инструкция может выдать ошибку, если активный лист не является рабочим. Например, если VBA выполняет этот оператор, когда активен лист диаграммы, то процедура прекращает выполняться, а на экране отображается сообщение об ошибке. Глава 7. Введение в VBA 201 Если на рабочем листе выделен диапазон ячеек, то активная ячейка будет находиться в выделенном диапазоне. Другими словами, активная ячейка всегда одна (их никогда не бывает несколько). Объект Application также обладает свойством Selection, возвращающим ссылку на выделенный объект, т е. отдельную ячейку (активную), диапазон ячеек или объект типа ChartOb ject, TextBox, Shape. В табл. 7.3 перечислены свойства объекта Application, которые вам пригодятся при работе с ячейками и диапазонами ячеек. Таблица 7.3. Некоторые полезные свойства объекта A p p l i c a t i o n Свойство Возвращаемый объект A c tiv e C e ll A ctive C ha rt Активная ячейка Активный лист диаграмм или объект диаграммы на рабочем листе (ChartOb j e c t ). Если диаграмма не активна, то свойство равно N o th in g Активный лист (рабочий лист или лист диаграммы) Активное окно Активная рабочая книга Выделенный объект (объект Range, Shape, C h a rtO b je c t и т.д.) Рабочая книга, содержащая выполняемую процедуру VBA ActiveSheet ActiveWindow Act iveW orkbook S e lectio n ThisWorkbook Преимущество использования этих свойств для получения объекта заключается в том, что совершенно не обязательно знать, какая ячейка, рабочий лист или книга являет­ ся активной, и вводить конкретную ссылку на этот объект. Данный факт позволяет соз­ давать код VBA, который не ограничивается конкретной книгой, листом или ячейкой. Например, следующая инструкция удаляет содержимое активной ячейки, даже если ад­ рес активной ячейки не известен: A c t iv e C e ll. C le a rC o n te n ts В следующем примере отображается сообщение, указывающее имя активного листа: MsgBox A c tiv e S h e e t .Name Если требуется узнать название активной рабочей книги, используйте такой оператор: MsgBox A c tiv e W o rk b o o k . FulIN am e Если на рабочем листе выделен диапазон, то заполните последний одним значением, выполнив единственный оператор. В следующем примере свойство Selection объекта Application возвращает объект Range, соответствующий выделенным ячейкам. Оператор изменяет свойство Value этого объекта Range, и в результате получается диапазон, заполненный одним значением. S e le c tio n . V a lu e = 12 Обратите внимание: если выделен не диапазон ячеек (например, объект ChartObject или Shape), то этот оператор выдаст ошибку, так как объекты ChartObject и Shape не обладают свойством Value. Однако приведенный ниже оператор присваивает объекту Range, который выделялся пе­ ред выделением другого объекта (отличного от диапазона ячеек), значение 12. В справочной системе указано, что свойство RangeSelection относится только к объекту Window. A ctive W in do w . R a n g e S e le c tio n . V a lu e = 12 Часть III. Visual Basic for Applications 202 Чтобы узнать, сколько ячеек выделено на рабочем листе, применяется свойство Count. Ниже приводится соответствующий пример. MsgBox ActiveWindow.RangeSelection.Count Работа с объектами Range Работа, которая выполняется в VBA, в основном связана с управлением ячейками и диапазонами на рабочих листах, что и является главным предназначением электронных таблиц. Вопрос управления ячейками в VBA рассматривался при обсуждении относи­ тельного и абсолютного способов записи макросов, однако ему необходимо уделить особое внимание. Объект Range содержится в объекте Worksheet и состоит из одной ячейки или диапазона ячеек на отдельном рабочем листе. В следующих разделах будут рассмотрены три способа задания ссылки на объекты Range в программе VBA: • свойство Range объекта класса Worksheet или Range; • свойство Cells объекта Worksheet; • свойство Offset объекта Range. С в о й с тв о Range Свойство Range возвращает объект Range. Из справочных сведений о свойстве Range вы узнаете, что к нему можно обратиться с помощью нескольких вариантов син­ таксиса. о б ъ е к т .Range(я ч е й к а 1) о б ъ е к т .Range(я ч е й к а 1 , я ч е й к а 2 ) щ Работа с объединенными ячейками Работа с объединенными ячейками может вызывать затруднения. Если диапазон содержит такие ячейки, придется выполнять некоторые специальные действия с помо­ щью макроса. Например, если ячейки A1.D1 объединены, показанный ниже оператор выделит все столбцы от А до D (а не только столбец В, как можно ошибочно полагать). C o lu m n s( " В : В " ) . S e le c t Возможно, подобное поведение является намеренным либо результатом какойлибо ошибки. В любом случае оно может вызвать непредвиденные реакции макроса. Объединенные ячейки также приводят к появлению проблем в процессе сортировки. Для определения объединенных ячеек, содержащихся в диапазоне, можно исполь­ зовать приведенную ниже функцию VBA. Эта функция возвращает значение T ru e , если в диапазоне содержится хотя бы одна объединенная ячейка (дополнительные сведения о процедурах-функциях можно найти в главе 10). F u n c tio n C o n ta in s M e rg e d C e lls (rn g As Range) im c e l l As Range o n ta in s M e r g e d C e lls = F a ls e F o r Each c e l l I n rn g I f c e ll. M e r g e C e lls Then C o n ta in s M e rg e d C e lls = T ru e E x i t F u n c tio n End I f Глава 7. Введение в VBA 203 Next c e l l End F u n c t i o n Для создания ссылки на объединенные ячейки можно сослаться на весь диапазон объединенных ячеек либо на верхнюю левую ячейку в объединенном диапазоне. Напри­ мер, если рабочий лист включает четыре ячейки, объединенные в одну (А1, В1, А2 и В1), сослаться на объединенные ячейки можно с помощью одного из следующих выражений. Range ( " А 1 : В 2 " ) Range ( " A l ") Если попытаться присвоить значение ячейке в объединенном диапазоне, причем эта ячейка не является верхней левой, VBA игнорирует эту инструкцию и даже не генериру­ ет сообщение об ошибке. Например, следующий оператор бесполезен, если ячейки А1:В2 объединены: Range ( " В 2 " ) . V a l u e = 43 Некоторые операции приводят к тому, что Excel отображает подтверждающее со­ общение. Например, если ячейки А1:В2 объединены, следующий оператор генерирует сообщение T h i s o p e r a t i o n w i l l c a u s e som e m e r g e d c e l l s t o u n m e r g e . Do you w i s h t o c o n t i n u e ? (Эта операция может привести к отмене статуса некоторых объединенных ячеек. Продолжать?). Range( " В 2 " ) . D e l e t e Мораль? Будьте осторожны при работе с объединенными ячейками. Перед приме­ нением этого свойства хорошо подумайте. Свойство R a n g e относится к одному из двух типов объектов: W o r k s h e e t или Range. В данном случае я ч е й к а 1 и я ч е й к а 2 указывают параметры, которые Excel будет воспринимать как идентифицирующие диапазон (в первом случае) или очерчи­ вающие диапазон (во втором случае). Ниже следует несколько примеров использования метода R a n g e . В данной главе уже рассматривались примеры, подобные представленным ниже. Да­ лее приведена инструкция, которая вводит значение в указанную ячейку: значение 1 2 ,3 вводится в ячейку А1 на листе Л и с т 1 активной рабочей книги. W orksheets ( "Л и с т 1 " ) .R a n g e ( " A l " ) . V a lu e = 1 2 .3 Свойство R a n g e также поддерживает имена, определенные в рабочих книгах. По­ этому, если ячейка называется В в о д , то для ввода значения в нее может использоваться следующий оператор: W orksheets ( " Л и с т 1 " ) .R a n g e ( " В в о д " ) . V a l u e = 100 В следующем примере в диапазон из двадцати ячеек на активном листе вводится одинаковое значение. Если активный лист не является рабочим, то отображается сооб­ щение об ошибке. A c t iv e S h e e t . Range ("A l :B l 0") .V a lu e = 2 Приведенный ниже пример приведет к тому же результату, что и предыдущий. Range( " A l " , "B IO ") = 2 Отличие заключается лишь в том, что опущена ссылка на лист, поэтому предполага­ ется активный рабочий лист. Кроме того, пропущено свойство, поэтому используется свойство по умолчанию (для объекта R a n g e это свойство V a lu e ) . В приведенном при­ мере используется второй синтаксис ссылки на свойство R a n g e . В данном случае пер­ 204 Часть III. Visual Basic for Applications вый аргумент — это левая верхняя ячейка диапазона, а второй — ячейка в правом ниж­ нем углу диапазона. В следующем примере для получения пересечения двух диапазонов применяется опе­ ратор пересечения Excel (пробел). Пересечением является одна ячейка — Сб. Следова­ тельно, данный оператор вводит значение 3 в ячейку Сб. Range ( " C l: С Ю А 6:Е6") = 3 Наконец, в следующем примере значение 4 вводится в пять ячеек, т.е. в независимые диапазоны. Запятая выполняет роль оператора объединения. R a n g e ( " A l , А З , А 5 , А 7 , А 9 ") = 4 До настоящего момента во всех рассмотренных примерах использовалось свойство Range объекта W o rk sh e e t. Вы также можете использовать свойство Range объекта Range. Сначала будет непросто, однако постарайтесь разобраться. Ниже показан пример использования свойства Range объекта Range (в данном слу­ чае объектом R ange является активная ячейка). В этом примере объект R ange рассмат­ ривается как левая верхняя ячейка на рабочем листе. В ячейку, которая в таком случае была бы В2, вводится значение 5. Другими словами, полученная ссылка является отно­ сительной для верхнего левого угла объекта Range. Таким образом, следующий опера­ тор вводит значение 5 в ячейку, расположенную справа внизу от активной ячейки. A c tiv e C e ll. R ange ( " В 2 ") = 5 Существует также намного более понятный способ обратиться к ячейке по отноше­ нию к диапазону — использовать свойство O f f s e t (рассмотрено далее). Свойство C e lls Другим способом сослаться на диапазон является применение свойства C e l ls . По­ добно Range, свойство C e l l s может использоваться в объектах W o rk sh e e t и Range. Справочная система указывает на три варианта синтаксиса свойства C e l ls . о б ъ е к т . C e l l s (н о м е р _ с т р о к и , н о м е р _ с т о л б ц а ) о б ъ е к т . C e l l s (н о м е р _ с т р о к и ) объект . C e l l s Проиллюстрируем на примерах особенности применения свойства C e l l s . Вначале в ячейку А1 листа Лист1 введите значение 9. В данном случае используется первый синтаксис, в котором аргументами являются номер строки (от 1 до 1048576) и номер столбца (от 1 до 16384). W o r k s h e e t s ( " Л и с т " ) . C e l l s (1, 1) =9 Ниже приведен пример, в котором значение 7 вводится в ячейку D3 (т.е. пересечение строки 3 и столбца 4) активного рабочего листа. A c t i v e S h e e t . C e l l s (3, 4) = 7 Можно также использовать свойство C e l l s объекта Range. При этом объект Range, который возвращается свойством C e l l s , задается относительно левой верхней ячейки диапазона Range, на который мы ссылаемся. Сложно? Может быть. Приведем пример. Следующая инструкция вводит значение 5 в активную ячейку. Помните, что в данном случае активная ячейка рассматривается как ячейка А1 на рабочем листе. A c t i v e C e l l . C e l l s (1 , 1) = 5 Глава 7. Введение в VBA 205 Примечание Подлинное преимущество описанного выше типа ссылок на ячейки станет очевидным, когда речь пойдет о переменных и циклах (глава 8). В большин­ стве случаев в качестве значений аргументов используются не фактические величины, а переменные. Чтобы ввести значение 5 в ячейку, которая находится под активной, обратитесь к та­ кой инструкции: A c t i v e C e l l . C e l l s (2, 1) = 5 Предыдущий пример можно описать так: необходимо начать с активной ячейки, рас­ сматривая ее как ячейку А1. Затем обратитесь к ячейке во второй строке и первом столб­ це диапазона. Еще один синтаксис свойства C e l l s использует один аргумент, который задается в диапазоне от 1 до 17179869184. Второе число равно количеству ячеек на рабочем листе Excel 2010. Ячейки нумеруются, начиная с А1 вправо, затем вниз и вправо вдоль сле­ дующей строки. Ячейка 16384 — это XFD1, а 16385 — А2. Далее в ячейку SZ1 активного листа (ячейку 520 на рабочем листе) введем значение 2. A c t i v e S h e e t . C e l l s (520) = 2 Для отображения значения последней ячейки рабочего листа (XFD1048576) восполь­ зуйтесь следующим оператором: MsgBox A c t i v e S h e e t . C e l l s ( 1 7 1 7 9 8 6 9 1 8 4 ) Этот синтаксис можно использовать и с объектом R a n g e . В таком случае будет по­ лучена ячейка по отношению к указанному объекту R a n g e . Например, если объект Range — это диапазон A1:D10 (40 ячеек), то свойство C e l l s может иметь аргумент от 1 до 40 и возвращать одну из ячеек объекта R a n g e . В следующем примере значение 2000 вводится в ячейку А2, так как А2 является пятой ячейкой (считая сверху направо и вниз) в указанном диапазоне. Range ( " A 1 : D 1 0 " ) . C e l l s (5) = 2000 Получение информации из ячейки В случае необходимости получения содержимого ячейки обратитесь к соответствующим свойствам VBA. Ниже приведены те из них, которые используются наиболее часто. • Свойство F o r m u l a возвращает формулу в случае, когда она находится в ячейке. Если ячейка не содержит формулу, возвращается находящееся в ней значение. Свойство F o r m u l a может как считываться, так и изменяться пользователем, а так­ же выражаться несколькими вариантами, среди которых F o r m u l a R l C l , F o r m u l a L o c a l и F o r m u l a A r r a y . (Дополнительные сведения по этом теме можно найти в справочной системе.) • Свойство v a l u e возвращает исходное неотформатированное значение ячейки. Это свойство может считываться и изменяться пользователем. • Свойство T e x t возвращает текст, отображаемый в ячейке. Если ячейка содержит числовое значение, это свойство включает все имеющееся форматирование, включая запятые и денежные символы. Свойство T e x t предназначено только для чтения. • Свойство V a l u e 2 подобно свойству V a l u e , но не использует типы данных D a t e и C u r r e n c y . Свойство V a l u e 2 преобразует типы данных D a t e и C u r r e n c y в тип 206 Часть III. Visual Basic for Applications данных V a r i a n t , содержащий значения удвоенной точности. Например, если в ячейке находится значение даты 12 / 6/ 2010, свойство v a l u e вернет ее как D a t e , а свойство V a l u e 2 — в виде значения удвоенной точности (например, 4 0 5 1 8 ) . Примечание В предыдущем примере аргумент свойства C e l l s не ограничен значениями в диапазоне от 1 до 40. Если значение аргумента превышает количество ячеек в диапазоне, счет продолжается, как будто он больше, чем есть на самом де­ ле. Следовательно, оператор, подобный предыдущему, может изменить зна­ чение ячейки, которая находится за пределами указанного диапазона А1 :D10. Например, следующий оператор изменяет значение в ячейке А11: R a n g e ( " A 1 : D 1 0 " ) . C e l l s (41)= 2000 Третий пример синтаксиса свойства C e l l s возвращает все ячейки на указанном ра­ бочем листе. В отличие от двух других, в этом синтаксисе возвращаемыми в результате данными будет не одна ячейка, а целый диапазон. В приведенном ниже примере исполь­ зован метод C l e a r C o n te n ts по отношению к диапазону, полученному с помощью свойства C e l l s для активного рабочего листа. В результате будет удалено содержимое каждой ячейки на рабочем листе. A c t iv e S h e e t .C e l l s .C le a rC o n te n ts Свойство O f f s e t Свойство O f f s e t (подобно свойствам Range и C e lls ) также возвращает объект Range. В отличие от рассмотренных выше свойств, O f f s e t применяется только к объекту Range и ни к какому другому. Данное свойство использует единственный синтаксис. о б ъ е к т . O f f s e t ( см ещ ен и е_ ст р о ки , см ещ ение_ст олбца) Два аргумента свойства O f f s e t соответствуют смещению относительно левой верх­ ней ячейки указанного диапазона Range. Эти аргументы могут быть положительными (сдвиг вниз или вправо), отрицательными (вверх или влево) или нулевыми. В приведен­ ном ниже примере значение 12 вводится в ячейку, которая находится под активной. A c t i v e C e l l . O f f s e t ( 1 , 0 ) .V a lu e = 12 В следующем примере значение 15 вводится в ячейку над активной ячейкой: A c t i v e C e l l . O f f s e t ( - 1 , 0 ) .V a lu e = 15 Если активная ячейка находится в строке 1, то свойство O f f s e t в предыдущем при­ мере выдаст ошибку, так как оно возвращает несуществующий объект Range. Свойство O f f s e t особо эффективно при использовании переменных в цикле (см. следующую главу). В процессе записи макроса в относительном режиме указания ссылки Excel использует свойство O f f s e t для обращения к ячейкам относительно начальной позиции (т.е. актив­ ной в момент начала записи макроса ячейки). Например, для генерации следующего кода применена функция записи макросов. Вначале включим запись макроса (при активной ячейке В1), после введем значение в ячейки В1:ВЗ, а затем вновь вернемся к ячейке В1. Sub M A c A c A c a c r o l () t i v e C e l l . F o r m u la R lC l = "1" t i v e C e l l . O f f s e t (1, 0 ) . R a n g e ( " A l " ) . S e l e c t t i v e C e l l . F o r m u la R lC l = "2" Глава 7. Введение в VBA 207 A c t i v e C e l l . O f f s e t (1, 0 ) . R a n g e ( " A l " ) . S e l e c t A c t i v e C e l l . F o r m u l a R l C l = "3" A c t i v e C e l l .O f f s e t (-2, 0 ) . R a n g e ( " A l" ) .S e le c t End S u b При записи макросов используется свойство F o r m u la R lC l. Как правило, для ввода значения в ячейку применяется свойство V a lu e . Однако при использовании F o rm u ­ la R lC l или F o r m u la результат будет таким же. Обратите внимание и на то, что полученный код ссылается на ячейку А1. Это доволь­ но странно, так как данная ячейка даже не была задействована в макросе. Такая особен­ ность процедуры записи макросов делает программу даже более сложной, чем необхо­ димо. Можно удалить все ссылки на R a n g e (" A l " ) , но макрос все равно будет работать нормально. Sub M o d i f i e d M a c r o l O A c t i v e C e l l . F o r m u l a R l C l = "1" A c t i v e C e l l . O f f s e t (1, 0 ) . S e l e c t A c t i v e C e l l . F o r m u l a R l C l = "2" A c t i v e C e l l . O f f s e t (1, 0 ) . S e l e c t A c t i v e C e l l . F o r m u l a R l C l = "3" A c t i v e C e l l .O f f s e t (-2, 0 ) . S e le c t End S u b Можно получить еще более эффективную версию макроса (например, ту, которую я написал вручную), который вообще не выполняет выделение ячеек. Sub M a c r o 1 ( ) A c tiv e C e ll = 1 A c t i v e C e l l . O f f s e t (1, A c t i v e C e l l . O f f s e t (2, End S u b 0) 0) = 2 = 3 Что следует знать об объектах В предыдущих разделах были изложены основы использования объектов (включая кол­ лекции), свойств и методов. Однако при этом мы затронули только верхушку айсберга. Важные концепции для запоминания В этом разделе рассматриваются дополнительные концепции, которые незаменимы, если вы собираетесь стать профессиональным программистом на VBA. Эти концепции станут более понятными по мере приобретения опыта работы с VBA, а также после про­ чтения следующих глав книги. • Объекты обладают уникальными свойствами и методами. Каждый объект имеет собственный набор свойств и методов. Однако некоторые объекты характе­ ризуются общими свойствами (например, Nam e) и методами (например, D e l e t e ) . • Для управления объектами их не обязательно выделять. Это может противо­ речить обычному представлению об управлении объектами Excel, особенно если вы занимались программированием макросов XLM. Дело в том, что действия над объектами эффективнее выполнять, если их сначала не выделять. При записи мак­ роса в Excel объект обычно сначала выделяется. Это необязательно, хотя сущест­ венно замедляет работу макроса. Часть III. Visual Basic for Applications 208 • Важно понимать предназначение коллекций. В большинстве случаев вы будете ссылаться на объект непосредственно, обращаясь к коллекции, к которой он при­ надлежит. Например, для обращения к объекту W orkbook с названием Myf i l e необходимо сослаться на коллекцию W orkbooks следующим образом: W o r k b o o k s ( " Myf i 1 е . x l s x ") Эта ссылка возвращает объект — рабочую книгу, которая вас интересует. • Свойства могут возвращать ссылку на другой объект. Например, в следую­ щем операторе свойство F o n t возвращает объект F o n t, который содержится в объекте Range. R a n g e ("A l " ) . F o n t .B o ld • = True Обратиться к одному и тому же объекту можно несколькими способами. Предположим, что у вас есть рабочая книга с названием S a l e s и это единствен­ ная открытая рабочая книга. В ней находится один лист с названием Summary. Можете сослаться на этот лист любым из приведенных ниже способов. W o r k b o o k s ( 11S a l e s . x l s x " ) . W o r k s h e e t s ( " S u m m a r y " ) W o r k b o o k s ( 1 ) . W o r k s h e e t s (1) W o r k b o o k s ( 1 ) . S h e e t s (1) A p p l i c a t i o n .A c t iv e W o r k b o o k .A c t iv e S h e e t A c t iv e W o r k b o o k .A c t iv e S h e e t A c tiv e S h e e t Используемый вами метод обычно зависит от того, насколько хорошо вам извест­ но рабочее пространство. Например, если открыто несколько рабочих книг, то второй или третий метод не подойдет. Если вы будете работать с активным лис­ том (какой бы это ни был лист), то воспользуйтесь последними тремя методами. Абсолютную уверенность в том, что вы ссылаетесь на конкретный лист в кон­ кретной рабочей книге, дает только первый метод. Узнайте больше об объектах и свойствах Если это ваше первое знакомство с VBA, то вас могут несколько смутить многочис­ ленные объекты, свойства и методы. Вы можете попытаться получить доступ к свойству, которым объект не обладает, однако в процессе выполнения кода произойдет ошибка. Код будет прерываться в этом месте до тех пор, пока вы не исправите ошибку. Существует несколько способов получить больше информации об объектах, свойст­ вах и методах. Прочтите оставшуюся часть книги Не забывайте, что эта глава является вводной. В остальных главах книги рассмотрены детали и приведены полезные информативные примеры. Используйте средства записи макросов Несомненно, наилучший способ ознакомиться с VBА — включить функцию записи макросов и записать отдельные действия, выполненные в Excel. Вы получите информа­ цию о том, какие объекты, свойства и методы относятся к конкретной задаче. Будет лучше, если при записи отображается окно модуля VBA, в котором представлен записы­ ваемый код. Глава 7. Введение в VBA 209 Используйте электронную справочную систему Основной источник подробной информации об объектах, методах и процедурах Ex­ cel — электронная справочная система. Многие пользователи забывают об этом ресурсе. Используйте браузер объектов Инструмент Object Browser (браузер объектов) — это удобное средство, предостав­ ляющее список всех свойств и методов для всех доступных объектов. В VBE окно Object Browser можно отобразить одним из трех способов: • нажмите клавишу <F2>; • в строке меню выберите команду View^Object Browser (Вид^Браузер объектов); • щелкните на кнопке Object Browser, которая находится на стандартной панели инструментов. Окно Object Browser показано на рис. 7.15. Раскрывающийся список в левом верхнем углу окна Object Browser содержит список всех библиотек объектов, к которым у вас есть доступ: • собственно Excel; • MSForms (используется для создания специальных диалоговых окон); • Office (объекты, общие для всех приложений Microsoft Office); • Stdole (объекты автоматизации OLE); • VBA; • все открытые рабочие книги (каждая книга считается библиотекой объектов, так как содержит объекты). Ваш выбор в этом списке определяет, что отображается в разделе Classes (Классы), а выбор в разделе Classes обусловливает появление определенных компонентов в поле Members of (Включены в). 210 Часть III. Visual Basic for Applications После выбора библиотеки можно осуществить поиск конкретной строки текста, чтобы получить список свойств и методов, содержащих данный текст. Это можно сделать, введя текст во втором раскрывающемся списке и щелкнув на значке с изображением бинокля. Предположим, вы работаете над проектом, обрабатывающим примечания в ячейках. 1. Выберите интересующую вас библиотеку. Если вы не знаете, какую именно биб­ лиотеку выбрать, укажите вариант <AII Libraries>. 2. Введите Comment в раскрывающемся списке под списком библиотек. 3. Щелкните на значке в виде бинокля, чтобы начать поиск текста. В области Search Results (Результаты поиска) отображается текст, соответствующий фрагменту для поиска. Выберите один объект, чтобы отобразить его классы в разделе Classes. Укажите класс, чтобы отобразить его члены (свойства, методы и константы). Обратите внимание на нижнюю часть окна, где приведена дополнительная информация об объекте. Можно нажать <F1>, чтобы перейти непосредственно к необходимому раз­ делу справочной системы. Структура окна Object Browser может сначала показаться сложной, но, изучив ее, вы убедитесь в ее незаменимости. Экспериментируйте с окном отладки Как было отмечено во врезке в одном из предыдущих разделов этой главы, окно от­ ладки (Immediate) в VBE используется для тестирования операторов и проверки разных выражений VBA. Рекомендуется всегда отображать окно отладки на экране, так как оно часто используется для проверки выражений и при отладке кода. Глава Основы программирования на VBA В этой главе... ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ Обзор элементов и конструкций VBA Комментарии Переменные, типы данных и константы Операторы присваивания Массивы Объектные переменные Пользовательские типы данных Встроенные функции Управление объектами и коллекциями Контроль за выполнением кода В предыдущих главах вы ознакомились с основами VBA, теперь же пришло время изучить более сложные понятия. В этой главе рассматриваются некоторые ключевые элементы и концепции, связанные с программированием на VBA. Обзор элементов и конструкций VBA Если вы ранее использовали другие языки программирования, то большая часть при­ веденной далее информации покажется вам знакомой. Однако в VBA есть свои тонкости, поэтому даже опытные программисты найдут в данной главе полезную информацию. В главе 7 речь шла об объектах, свойствах и методах. Но этих знаний еще недоста­ точно для выполнения сложных задач. Данная глава введет вас в курс дела: в ней анали­ 212 Часть III. Visual Basic for Applications зируются элементы языка VBA, такие как ключевые слова и операторы, используемые для написания процедур VBA. Для начала в качестве примера рассмотрим простую процедуру VBA типа Sub. Она хранится в модуле VBA и вычисляет сумму первых ста положительных целых чисел. По окончании вычислений процедура отображает сообщение с результатом. S u b V B A _ D e m o () ' Пример п р о с т о й п ро ц е д у р ы VBA D im T o t a l A s L o n g , i A s L o n g T o ta l = 0 F o r i = 1 T o 100 T o ta l = T o ta l + i Next i MsgBox T o t a l End Sub В этой процедуре применяются некоторые популярные элементы языка, в том числе следующие: • комментарий (строка, начинающаяся апострофом); • оператор объявления переменной (строка, начинающаяся ключевым словом Dim); • две переменные ( T o t a l и i) ; • два оператора присваивания ( T o t a l • циклическая структура ( F o r - N e x t ) ; • функция V B A (M sgB ox). = 0 и T o ta l = T o ta l + i) ; Все перечисленные элементы языка рассматриваются в следующих разделах главы. Примечание Процедуры VBA не всегда управляют объектами. Например, рассмотренная в предыдущем примере процедура работает исключительно с числами. Ввод кода VBA Код VBA, находящийся в модуле VBA, состоит из инструкций. Общепринято вводить в каждой строке по одной инструкции. Но это необязательное требование; можно ука­ зывать несколько инструкций в одной строке, разделяя их двоеточием. В следующем примере в одной строке находятся четыре инструкции. S u b O n e L i n e () Х= 1 : у= 2 End Sub : Z= 3 : M sgBox х + у + Z Многие программисты полагают, что код воспринимается легче, если в каждой строке находится по одной инструкции. S u b O n e L i n e () х = 1 у = 2 z = 3 MsgBox х + у End Sub + z Строка может быть любой длины; модуль VBA продолжается на следующей строке, когда текущая строка достигает правой границы окна. В длинных строках можно ис­ пользовать оператор продолжения строки VBA: пробел с подчеркиванием (_). Глава 8. Основы программирования на VBA Sub L o n g L i n e () S u m m e d V a lu e = _ W o rk s h e e ts ( " Л и с т 1 " ) .R a n g e ( " A l " ) .V a lu e W o rk sh e e ts("Л ист2" ) . R a n g e ( " A l" ) .V a lu e End Sub 213 + _ При написании макросов Excel достаточно часто символы подчеркивания применя­ ются для разбиения длинных операторов на несколько строк. После ввода инструкции редактор VBA выполняет следующие действия для улучше­ ния удобочитаемости кода. • Вставляет пробелы меж ду операторам и. Например, если ввести Ans=i+2 (без пробелов), VBA преобразует это выражение следующим образом: Ans = 1 + 2 • Изменяет регистр символов ключевых слов, свойств и методов. Если ввести вы­ ражение Result=activesheet.range ( "al") .value=12, VBA преобразует его так: R e s u lt = A c t i v e S h e e t . R a n g e ( " a l " ) .V a lu e = 12 Обратите внимание, что текст в кавычках (в рассматриваемом случае — " a l " ) не изменился. • Поскольку названия переменны х VBA нечувствительны к изменению р еги ст­ ра символов, интерпретатор по умолчанию изм еняет имена всех п ер ем ен ­ ных, состоящ их из букв одного регистра, чтобы их регистр соответствовал последнему введенному варианту. Например, если сначала переменная опре­ делялась как m y v a l u e (все символы нижнего регистра), а затем была переопреде­ лена в виде M y V a l u e (смешанный регистр), VBA изменит название переменной во всех остальных случаях на M y V a l u e . Исключение бывает в том случае, когда пере­ менная объявляется с помощью ключевого слова D im либо похожего оператора; название переменной остается неизменным в процессе ее применения. • Редактор VBA пр осм атр ивает инструкции с целью выявления си нтаксиче­ ских ошибок. После обнаружения ошибки изменяется цвет строки, а на экране по­ является сообщение с описанием возникшей проблемы. Воспользуйтесь командой редактора Visual Basic Editor Tools^Options (Сервис^Параметры) для перехода в диалоговое окно Options (Параметры), в котором можно выбрать цвет выделения ошибки (с помощью вкладки Editor Format (Формат редактора)), а также указать, следует ли отображать сообщение об ошибке (с помощью параметра Auto Syntax Check (Автоматическая проверка синтаксиса) на вкладке Editor (Редактор)). Комментарии Комментарий— это описательный текст, который включается в код. VBA полно­ стью игнорирует текст комментария. Комментарии можно использовать произвольно для описаний действий в коде (назначение оператора не всегда очевидно). Вы можете использовать для комментария новую строку либо вставить комментарий после инструкции в той же строке. Комментарий обозначается апострофом. VBA игно­ рирует любой текст, введенный после апострофа, за исключением случаев, когда апост­ роф заключен в кавычки. Например, в следующем операторе комментарий отсутствует, хотя в нем и содержится апостроф: Msg = " П р о д о л ж е н и е н е в о з м о ж н о " Часть III. Visual Basic for Applications 214 В следующем примере показана процедура VBA с тремя комментариями. Sub Comments() 1 Эта процедура не д е л а е т ничего серьезного х = 0 'х н и ч е г о н е с о д е р ж и т 1 Отображение р е з у л ь т а т а MsgBox х End Sub Как правило, в качестве индикатора комментария используется апостроф, однако можно применить для обозначения строки комментария ключевое слово Rem. Rem - - следующий о п е р а т о р з а п р а ш и в а е т имя файла Ключевое слово Rem (сокращение от слова R em a rk — “пометка”) — это, по сущест­ ву, пережиток старых версий BASIC; его включили в VBA из соображений совместимо­ сти. В отличие от апострофа, Rem используется только в начале строки, он не допускает­ ся в той же строке, что и инструкция. Совет Использование комментариев — удачная идея, но не все комментарии в равной степени предпочтительны. Чтобы комментарий был полезен, он должен содер­ жать информацию, которая неочевидна при рассмотрении самого кода. В про­ тивном случае вы просто увеличите общий объем файла приложения. Ниже приведено несколько общих советов по эффективному использованию коммен­ тариев. Итак, обращайтесь к ним: • для краткого описания назначения каждой созданной процедуры; • для описания изменений, которые вы вносите в процедуру; • для указания функции или конструкции, использующейся нестандартным способом; • для описания назначения переменных (чтобы и вы, и другие пользователи могли истолковать названия переменных, которые без комментария понять сложно); • для описания способов, которые помогут избежать влияния внутренних ошибок Excel на ваше приложение; • для вставки комментариев во время написания кода, но не позже. Совет В некоторых случаях нужно проверить процедуру, не вставляя в нее инст­ рукцию либо даже целый набор инструкций. Вместо удаления соответст­ вующей инструкции достаточно превратить ее в комментарий путем добав­ ления апострофа в начале строки. После этого VBA проигнорирует инструк­ цию (или инструкции) при выполнении процедуры. Для преобразования комментария в инструкцию достаточно удалить знак апострофа. Панель инструментов Edit (Редактирование) в VBE содержит несколько по­ лезных кнопок. Выделите группу инструкций, а затем используйте кнопку Comment Block (Комментировать блок операторов), чтобы преобразовать инструкции в комментарии. Кнопка Uncomment Block (Раскомментировать блок операторов) преобразовывает группу комментариев обратно в инст­ рукции. Указанные кнопки применяются очень часто, поэтому с целью по­ вышения удобства работы можно скопировать их на стандартную (Standard) панель инструментов. Глава 8. Основы программирования на VBA 215 Переменные, типы данных и константы Главное назначение VBA— обработка данных. Одни данные сохраняются в объек­ тах, например в диапазонах рабочих листов, а другие — в созданных переменных. Переменная представляет собой именованное место хранения данных в памяти ком­ пьютера. Переменные могут содержать данные разных типов — от простых логических, или булевых, значений (T rue или F a ls e ) до больших значений с двойной точностью (см. следующий раздел). Значение присваивается переменной с помощью оператора ра­ венства (подробнее об этом — далее). Вы существенно облегчите себе жизнь, если нау­ читесь присваивать переменным простые описательные имена. Однако помните, что VBA поддерживает несколько правил, ограничивающих вас в именовании переменных. • Вы можете использовать в названиях символы букв, числа и некоторые знаки пре­ пинания, но первой в имени переменной всегда должна вводиться буква. • VBA не различает регистры. Чтобы сделать имена переменных удобочитаемыми, программисты часто используют смешанный регистр (например, I n t e r e s t R a t e , а не i n t e r e s t r a t e ) . • Нельзя использовать в именах пробелы или точки. Чтобы сделать имена перемен­ ных более удобными для чтения, программисты вводят символ подчеркивания (In te re st_ R a te ). • Специальные символы объявления типов (#, $, %, & или !) также не применяются в имени переменной. • Названия переменных ограничены 254 символами (вряд ли вы, будучи в здравом уме, придумаете настолько длинное название). В приведенном далее списке содержатся отдельные примеры выражений присваива­ ния, в которых используются различные типы переменных. Названия переменных указы­ ваются слева от знака равенства. Каждый оператор присваивает переменной слева от знака равенства значение, которое располагается справа от знака равенства. х=1 I n te re s tR a te = 0 .0 7 5 LoanPayof f Am ount = 2 4 3 0 8 9 .8 7 D ataE ntered = F a ls e x = x + 1 MyNum = Y o u r N u m * 1 . 2 5 UserName = " Б о б Д ж о н с о н " D a te S ta rte d = # 12/14/2006# В VBA используется очень много зарезервированных слов, т.е. таких слов, которые не допускается применять в качестве названий переменных или процедур. Если вы попытае­ тесь ввести одно из таких слов, то будет отображено сообщение об ошибке. Например, не­ смотря на то что зарезервированное слово N ext могло бы стать описательным названием многих переменных, следующая инструкция генерирует синтаксическую ошибку: Next = 132 К сожалению, сообщения о синтаксических ошибках не всегда достаточно описа­ тельны. Указанная выше инструкция генерирует сообщение об ошибке: C o m p ile e rr o r : E x p e c te d V a r i a b l e (Ошибка компиляции: ожидается переменная). Ситуа­ ция не совсем понятна, поэтому при отображении такого сообщения об ошибке обра­ щайтесь к справочной системе, чтобы убедиться в том, что имя переменной не задейст­ вовано в VBA в других целях. Часть III. Visual Basic for Applications 216 Определение типов данных Интерпретатор VBA облегчает жизнь программистам, автоматически обрабатывая любые типы данных. Не во всех языках программирования управление данными выпол­ няется на столь простом уровне. Например, многие языки программирования являются строго типизированными, т.е. программист должен явно объявлять тип данных каждой используемой переменной. Тип данных указывает, в каком виде данные хранятся в памяти: как целые значения, дейст­ вительные числа, текст или др. VBA может автоматически типизировать данные, однако это чревато негативными последствиями — медленным выполнением операций и менее эффек­ тивным использованием памяти. В результате, позволяя VBA самостоятельно определять ти­ пы данных, вы можете столкнуться с проблемами выполнения больших или сложных прило­ жений. Если вам приходится экономить каждый байт памяти, то вы должны хорошо разби­ раться в типах данных. Еще одно преимущество явного объявления типа данных всех используемых переменных состоит в том, что хотя VBA дополнительно ищет ошибки на эта­ пе компиляции, подобные ошибки довольно сложно выявить другими способами проверки. В табл. 8.1 перечислены поддерживаемые в VBA типы данных (специальные типы данных будут описаны далее в этой главе). Таблица 8.1 . Встроенные типы данных VBA Тип данных Количество зарезер - Диапазон значений вированных байтов B yte S in g le 1 2 2 4 4 D o u b le 8 C u rrency 8 12 B o o le a n In te g e r Long D e c im a l Date O bj e c t S trin g 8 4 10 + длина строки 0 -2 5 5 T r u e (Истина) или F a l s e (Ложь) -32768 - 32767 -2147483648 - 2147483647 -3.402823Е38 - - 1 .401298Е-45 (отрицательные числа); 1.401298Е-45 - 3.402823Е38 (положитель­ ные числа) -1,79769313486232Е308 -4,94065645841247Е-324 (отрицательные числа); 4,94065645841247Е—324 - 1,79769313486232Е308 (положительные числа) -922337203685477,5808 - 922337203685477,5807 +/-79228162514264337593543950335 без десятич­ ных знаков; +/-7,9228162514264337593543950335 с 28 знаками после запятой 1 января 100 года - 31 декабря 9999 года Любая ссылка на объект 0 - приблизительно 2 млрд символов Длина строки 1 - приблизительно 65400 символов 16 Любое числовое значение в пределах диапазона типа данных D o u b le . Может также включать специальные значения типа Empty, E r r o r , N o t h i n g и N u l l (переменной длины) S trin g (фиксирован­ ной длины) V a ria n t (числа) Глава 8. Основы программирования на VBA 217 Окончание табл. 8.1 Тип данных Количество зарезер­ Диапазон значений вированных байтов Variant 22 + длина строки 0 - примерно 2 млрд (символы) Пользова­ тельский Зависит от типа Зависит от элемента Примечание Тип данных D e c i m a l необычен тем, что его нельзя объявить. На самом деле он является подтипом типа V a r i a n t . Для преобразования в десятичный тип данных типа v a r i a n t воспользуйтесь функцией VBA C D e c. Рекомендуется выбирать тот тип данных, в котором используется минимальное коли­ чество байтов для хранения значений, но он также должен быть достаточным для пред­ ставления максимальных значений переменных. При работе с данными в VBA скорость выполнения операций зависит от объема данных, которые обрабатываются с помощью VBA. Другими словами, чем меньше байтов зарезервировано для данных, тем быстрее VBA получает доступ к данным и обрабатывает их. Для проведения математических вычислений в рабочих листах Excel использует тип дан­ ных Double. Его рекомендуется применять и в процессе обработки чисел в VBA для обеспе­ чения той же точности вычислений. Для обработки целочисленных значений идеально подхо­ дит тип I n t e g e r , если, конечно, вы уверены, что используемые значения не превышают 32767. В противном случае обратитесь к типу данных L on g. При управлении номерами строк в рабочем листе Excel лучше применять тип данных L on g, так как количество строк в рабо­ чем листе превышает максимальное значение, допустимое в типе данных I n t e g e r . Тестирование типов данных Чтобы оценить важность определения типа данных, автор разработал специальную процедуру, выполняющую циклические вычисления с последующим отображением за­ траченного времени. Sub T i m e T e s t () Dim х A s L o n g , у A s L o n g Dim A A s D o u b l e , В A s D o u b l e , С A s D o u b l e Dim i A s L o n g , j A s L o n g Dim S t a r t T i m e A s D a t e , E n d T i m e A s D a t e ' Сохранение времени нач ал а вы числений S t a r tT im e = T im e r ' Выполнение в ы ч и с л е н и й х = О у = О For i = 1 То 10000 х = х + 1 у = х + 1 For j = 1Т о 1 0 0 0 0 А = х + у + i В = у - х i С = х / у * i Next j Next i 1 Получение в р ем ен и о к о н ч а н и я вычислений 218 Часть III. Visual Basic for Applications EndTime = T im e r Отображение общего времени в се кун д а х MsgBox F orm at(E n dT im e - S ta r tT im e , " 0 . 0 " ) End Sub ' Ha компьютере автора выполнение этой процедуры заняло 7,7 секунды (этот пока­ затель определяется вашей системой). Затем были закомментированы операторы Dim, с помощью которых объявляются типы данных. Для этого в начале каждой строки, со­ держащей операторы Dim, были вставлены апострофы. В результате интерпретатор VBA использовал тип данных, заданный по умолчанию, а именно — V a r ia n t . После это­ го процедура была выполнена еще раз. Мораль проста: для скорейшего выполнения VBA-приложений объявляйте переменные! Рабочая книга, содержащая этот код, находится на прилагаемом к книге компактдиске в файле t im in g t e x t . x ls m . Объявление переменных Если вы не объявили тип данных для переменной, используемой в процедуре VBA, по умолчанию будет задан тип данных Variant. Данные с типом Variant имеют только одно заслуживающее внимания свойство: они изменяют свой тип в зависимости от того, какие операции над ними выполняются. В следующей процедуре показано, каким образом переменная принимает разные ти­ пы данных. Sub V a ria n tD e m o () MyVar = "1 2 3 " MyVar = MyVar / 2 MyVar = "О тв е т: " & MyVar MsgBox MyVar End Sub В процедуре VariantDemo переменная MyVar вначале выступает строкой из трех символов. Затем эта “строка” делится на два и приобретает числовой тип данных. После этого MyVar присоединяется к строке, что вызывает обратное преобразование MyVar в строку. Оператор MsgBox отображает окончательное строковое значение: О т в е т : 61,5. Чтобы проиллюстрировать проблемы, которые могут возникнуть при обработке типа данных Variant, рассмотрим следующую процедуру. Sub V a ria n tD e m o 2 () MyVar = "1 2 3 " MyVar = MyVar + MyVar MyVar = "О тв е т: " & MyVar MsgBox MyVar End Sub При выполнении этой процедуры в окне сообщений появляется сообщение О твет: 123123. Скорее всего, это не тот результат, которого вы ожидали. В процессе управле­ ния текстовыми данными, представленными типом Variant, оператор “+” выполняет конкатенацию строк. Определение типа данных Для определения типа данных переменной используется функция VBA TypeName. Ниже представлена модифицированная версия предыдущей процедуры. Эта процедура на каждом шаге отображает тип данных переменной MyVar. Вы увидите, что сначала Глава 8. Основы программирования на VBA 219 переменная является строкой, затем преобразуется в числовой тип D ouble и в заверше­ ние снова становится строкой. Sub V ariantD em o2 () MyVar = "1 2 3 " MsgBox Т урeName(MyVar) MyVar = MyVar / 2 MsgBox TypeName(MyVar) MyVar = "О тв е т: " & MyVar MsgBox TypeName(MyVar) MsgBox MyVar End Sub Благодаря VBA преобразование типов для необъявленных переменных выполняется автоматически. Этот процесс может показаться удачным выходом из создавшейся ситуа­ ции, однако помните, что при этом снижается скорость обработки данных, быстрее за­ полняется свободная память, а также повышается риск возникновения ошибок. Объявлять каждую переменную в процедуре перед ее использованием — замечатель­ ная привычка. В процессе объявления переменной вы явно указываете ее название и тип данных. Объявление переменных дает два основных преимущества. • Программы работают быстрее и используют память более эффективно. Тип данных по умолчанию V a r i a n t резервирует больше памяти, чем необходимо, и вызывает многократную проверку данных, занимающую процессорное время. Если программа точно знает тип данных, она не выполняет дополнительную про­ верку данных и резервирует ровно столько памяти, сколько необходимо для хра­ нения конечных данных. • Объявив переменные, можно избежать ошибок, связанных с неправильным введением имен переменных. Предполагается, что вы используете оператор Op­ t i o n E x p l i c i t , делающий обязательным объявление всех переменных (см. сле­ дующий раздел). Предположим, что вы также в коде применяете необъявленную пе­ ременную с названием C u r r e n tR a te . Наряду с этим на определенном этапе про­ цедуры вы обращаетесь к оператору C u re n tR a te = 0 .7 5 . Такая ошибка в названии переменной, которую тяжело выявить, скорее всего, будет причиной не­ правильных результатов. Обязательное объявление всех переменных Чтобы обеспечить обязательное объявление всех используемых переменных, необхо­ димо включить следующую строку в качестве первой инструкции в модуле VB А: Option E x p l i c i t Этот оператор отвечает за то, что программа будет приостанавливаться всякий раз при нахождении в ней необъявленной переменной. VBA выведет сообщение об ошибке (рис. 8.1); для продолжения процедуры следует объявить переменную. 0 примерах, приведенных в этой главе Настоящая глава содержит ряд примеров кода VBA, обычно представленных в виде простых процедур. Все примеры призваны объяснять наиболее простым образом различные концепции программирования. По этой причине в большинстве случаев поставленные задачи выполняются неэффективно. Другими словами, не следует сточностью использовать эти примеры в своих проектах. В следующих главах книги приведенные примеры представляют действительную ценность. Часть III. Visual Basic for Applications 220 “TP O p t io n E x p l i c i t Sub MultiplyNumbers() E K 198-5 у = 203.5 MsgBox = x * у End Sub urn___________________ _______________ J Рис. 8.1. Интерпретатор VBA сообщает о том, что процедура использует необъявленную переменную о Совет Чтобы оператор O p tio n E x p l i c i t автоматически включался при вставке нового модуля VBA, выберите параметр Require Variable Declaration (Обязательное объявление переменных) на вкладке Editor (Редактор) в диа­ логовом окне VBE Options (Параметры редактора Visual Basic). Для этого воспользуйтесь командой Tools^Options (Сервис^Параметры). Настоя­ тельно рекомендуем вам воспользоваться этой установкой, хотя она не ока­ зывает влияния на существующие модули. Область действия переменной Область действия переменной определяет, в каких модулях и процедурах она может использоваться. Существуют следующие типы областей действия переменных. В табл. 8.2 перечислены три области действия переменной. Таблица 8 .2. Области действия переменных Область действия Отдельная процедура Отдельный модуль Способ объявления переменных В процедуру включается оператор Dim или s t a t i c Перед первой процедурой в модуле включается оператор Dim или P r iv a te Все модули Перед первой процедурой в модуле указывается оператор P u b lic Все типы областей действия рассматриваются в следующих разделах. Локальные переменные Локальная переменная — это переменная, объявленная в процедуре. Локальные пе­ ременные могут использоваться только в процедуре, в которой они объявлены. После Глава 8. Основы программирования на VBA 221 выполнения процедуры переменная становится невостребованной, поэтому Excel осво­ бождает соответствующую область памяти. Если нужно сохранить значение переменной, объявите ее как S t a t i c (см. раздел “Переменные S t a t i c ”). Наиболее популярный способ объявить локальную переменную — вставить оператор Dim между операторами Sub и End Sub. Операторы Dim обычно вводятся непосредст­ венно после оператора Sub, перед кодом процедуры. Примечание Если вас интересует происхождение ключевого слова Dim, то примите к сведению, что это сокращение от “Dimension” — “размерность” . В прежних версиях BASIC этот оператор использовался исключительно для объявления размерности массива. В VBA ключевое слово Dim применяется для объяв­ ления любой переменной, а не только массивов. В представленной далее процедуре используется шесть локальных переменных, объ­ явленных с помощью операторов Dim. Sub MySub () Dim x As I n t e g e r Dim F i r s t As Long Dim I n t e r e s t R a t e As S in g le Dim TodaysD ate As D ate Dim UserName As S t r in g Dim M yValue 1 - [Здесь ука зы в а е тся код процедуры] End Sub - Обратите внимание, что последний оператор Dim в этом примере объявляет не тип данных, а только саму переменную. В результате переменная приобретает тип V a r ia n t . Кроме того, можно объявить несколько переменных, воспользовавшись единствен­ ным оператором Dim. Dim х As I n t e g e r , у As I n t e g e r , z As I n t e g e r Dim F i r s t As Long, L a s t As D ou ble Предупреждение В отличие от других языков программирования, в VBA нельзя объявить тип данных одновременно для группы переменных, разделив переменные запя­ тыми. Например, следующий оператор является корректным, хотя и не объ­ являет переменные как in t e g e r : Dim i , j, k As I n t e g e r В VBA только k объявляется как in t e g e r ; остальные переменные объявля­ ются как V a r ia n t . Для объявления переменных i , j и к в виде in t e g e r ис­ пользуйте следующий оператор: Dim i As I n t e g e r , j As I n t e g e r , к As I n t e g e r Если переменная объявлена как локальная, другие процедуры в том же модуле могут использовать подобное имя, но каждый экземпляр переменной считается уникальным в своей процедуре. Как правило, локальные переменные — самые эффективные, так как VBA освобож­ дает память, которую они используют, после окончания процедуры. Часть III. Visual Basic for Applications 222 Еще один способ указания типов данных для переменных Как и в большинстве других версий BASIC, язык VBA позволяет присоединить сим­ вол к названию переменной, чтобы указать ее тип данных. Например, можно объявить переменную MyVar как целое число, добавив к ее названию символ %. Dim M yVar% Символы объявления типов данных представлены для большинства типов данных VBA. Отсутствующие в таблице типы данных не имеют собственного символа объявле­ ния типа. Тип данных Символ объявления типа In te g e r Long S in g le Double C urren cy S t r in g % & i # @ $ Этот метод типизации данных — пережиток старых версий BASIC; лучше объявлять переменные с помощью других методов, описанных в этой главе. Символы объявления типов перечислены здесь только потому, что вы можете встретиться с ними в старых программах. Переменные уровня модуля Иногда необходимо, чтобы переменная была доступна во всех процедурах модуля. В таком случае объявите переменную перед первой процедурой модуля (за пределами процедур или функций). В приведенном ниже примере оператор D im — первая инструкция в модуле. Обе проце­ дуры, P r o c e d u r e l и P ro c e d u re 2 , имеют доступ к переменной C u r r e n tV a lu e . Dim C u rre n tV a lu e as I n t e g e r Sub P r o c e d u r e l() ' - [Здесь вводится код процедуры] - код процедуры] - End Sub Sub P ro c e d u re 2 () ' - [Здесь вводится End Sub Обычно значение переменной уровня модуля не изменяется к окончанию выполнения процедуры (по достижении оператора E n d Sub либо E nd F u n c t io n ) . Исключение из этого правила бывает в случае применения оператора End. Как только интерпретатор VBA выполняет оператор End, все переменные уровня модуля теряют свои значения. Переменные P u b l i c Чтобы сделать переменную доступной во всех процедурах всех модулей VBA проек­ та, необходимо объявить переменную на уровне модуля (перед объявлением первой про­ цедуры) с помощью ключевого слова P u b l i c , а не Dim . P u b lic C u rre n tR a te as Long Ключевое слово P u b l i c делает переменную C u r r e n t R a t e доступной для любой процедуры проекта, даже для процедур, которые располагаются в других модулях проек­ та. Этот оператор следует вставить перед первой процедурой модуля. Более того, подоб­ Глава 8. Основы программирования на VBA 223 ный код объявления переменных должен вводиться в стандартном модуле VBA, а не в коде модуля листа или формы. Переменные s t a t ic Переменные S t a t i c — особый случай. Они объявляются на уровне процедуры и со­ храняют свои значения после нормального завершения процедуры. Но если выполнение процедуры прерывается с помощью оператора End, статические переменные теряют свои значения. Объявление статических переменных осуществляется с помощью ключевого слова S ta tic . Sub MySub () S t a t ic C o u n te r as I n t e g e r ' - [Здесь находится код процедуры] End Sub - Правила именования переменных Некоторые программисты называют переменные так, что типы данных легко опре­ делить по одному только названию. Однако такой прием усложняет восприятие кода. Распространенное правило именования связано с использованием стандартной приставки в нижнем регистре в названии переменной. Например, булеву переменную, которая контролирует сохранение рабочей книги, можно назвать bWasSaved. Это пе­ ременная типа B o o le a n . В следующей таблице перечислены стандартные префиксы для некоторых типов данных. Тип данных Префикс Boolean Integer Long Single Double Currency „ Date/Time String Object Variant b i 1 s d с dt s tr o bj Пользовательский u V Работа с константами Значение переменной может изменяться при выполнении процедуры (часто так ислучается, поэтому она и называется “переменной”). Иногда же необходимо использо­ вать именованное значение или строку, которая никогда не изменяется, — константу. Использование констант в программе вместо строго запрограммированных значений или строк — удачный прием программирования. Например, если процедура несколько раз ссылается на определенное значение, например на процентную ставку, следует объя­ вить это значение как константу и использовать в выражениях имя константы, а не ее значение. Такой прием не только делает программу более удобной для восприятия, но иоблегчает последующее изменение кода — достаточно изменить только одну инструк­ цию, а не несколько. 224 Часть III. Visual Basic for Applications Объявление констант Для объявления констант используется оператор C o n s t. Ниже приведено несколько примеров. C onst N um Q uarters as I n t e g e r = 4 C onst R ate = .0 7 2 5 , P e r io d = 12 C onst ModName as S t r i n g = "B u d g e t M a cro s" P u b lic C onst AppName as S t r in g = "B u d g e t A p p lic a t io n " Во втором примере тип данных не объявлен. Следовательно, VBA определяет тип данных на основе их значений. Переменная Rate имеет тип данных D o u b le , а перемен­ ная P e r i o d — I n t e g e r . Так как константы никогда не изменяют своего значения, обычно их объявляют в виде конкретного типа данных. Как и переменные, константы имеют область действия. Если требуется, чтобы кон­ станта была доступна только в одной процедуре, объявите ее после оператора Sub или F u n c t i o n — и она станет локальной. Вы сделаете константу доступной для всех проце­ дур в модуле, если объявите ее перед первой процедурой модуля. Чтобы сделать кон­ станту доступной для всех модулей рабочей книги, используйте ключевое слово P u b lic и объявите константу перед первой процедурой модуля. P u b lic C onst I n t e r e s t R a t e As D ou ble = 0 .0 7 2 5 Примечание При попытке изменения значения константы в коде VBA вы получите сооб­ щение об ошибке (чего и следовало ожидать). Константа — это постоянное значение, а не переменная. Использование предопределенных констант В Excel и VBA существует целый ряд предопределенных констант, которые можно использовать без объявления. Вам даже необязательно знать значение этих констант для их применения. При записи макросов обычно используются константы, а не значения. В следующей процедуре для изменения ориентации страницы активного листа на аль­ бомную применена встроенная константа (x l L a n d s c a p e ). Sub S e tT o L a n d s c a p e () A c t iv e S h e e t. P a g e S e tu p . O r ie n t a t io n = x lL a n d s c a p e End Sub Справочные сведения о константе x lL a n d s c a p e можно найти в справочной систе­ ме. Кроме того, если у вас включен параметр AutoList Members (Автоматическая встав­ ка объектов), то вы можете получить помощь непосредственно при вводе кода (рис. 8.2). Во многих случаях VBA автоматически перечисляет все константы, присваиваемые оп­ ределенному свойству. Фактическое значение переменной x lL a n d s c a p e равно 2. Еще одна встроенная кон­ станта для изменения ориентации страницы — x l P o r t r a i t — имеет значение 1. Очевид­ но, что при использовании встроенных констант необязательно знать их значения. Примечание Окно Object Browser, которое будет рассмотрено в главе 7, содержит список всех констант Excel и VBA. Чтобы открыть Object Browser в VBE, нажмите клавишу <F2>. Глава 8. Основы программирования на VBA 225 Рис. 8.2. VBA отображает список констант, которые были назначены свойству Управление строками Как и Excel, VBA может работать не только с числами, но и с текстом (строками). В VBA представлено два типа строк. • Строки фиксированной длины объявляются с определенным количеством симво­ лов. Максимальная длина строки — 65535 символов. • Строки переменной длины теоретически могут вмещать до 2 млрд символов. Каждый символ в строке занимает 1 байт памяти, к тому же память дополнительно используется для хранения заголовка строки. При объявлении строки с помощью опера­ тора Dim вы можете определить ее длину, если она вам известна (задать тип строки с фиксированной длиной), или активизировать динамическую обработку длины строки (задать тип строки переменной длины). Работа со строками фиксированной длины не­ сколько эффективнее с точки зрения использования памяти. В следующем примере переменная MyString объявляется как строка с максималь­ ной длиной 50 символов. YourString также объявлена как строка, но имеет перемен­ ную длину. Dim M y S t r i n g A s S t r i n g * 50 Dim Y o u r S t r i n g A s S t r i n g Работа с датами Конечно, для хранения даты можно использовать строку, но над ней нельзя выпол­ нять вычисления. Применение специального типа данных Date — наилучший способ управления датами. Переменная, определенная как Date, занимает 8 байт памяти и может содержать да­ ты от 1 января 100 года до 31 декабря 9999 года. Этого диапазона почти в 10000 лет бо­ лее чем достаточно даже для самого невероятного финансового прогноза! Тип данных 8 Зак. 3107 Часть III. Visual Basic for Applications 226 D a te также применяется для хранения значений времени. В VBA дата и время опреде­ ляются как значения, заключенные между знаками # (см. далее). Примечание Диапазон дат, которые можно обрабатывать в VBA, намного шире соб­ ственного диапазона дат Excel, который начинается с 1 января 1900 года. Поэтому следите, чтобы в рабочем листе не использовались данные, которые находятся за пределами допустимого диапазона дат Excel. Ниже приведены отдельные примеры объявления переменных и констант с типом данных Date. © Перекрестная ссылка В главе 10 будут описаны некоторые относительно простые функции VBA, позволяющие создавать формулы рабочего листа, с помощью которых можно обрабатывать даты до 1900 года. Dim Today As D ate Dim S ta r tT im e As D ate C onst F ir s tD a y As D ate = # 1 /1 /2 0 0 7 # C onst Noon = # 1 2 :0 0 :0 0 # © Предупреждение Даты всегда определяются в формате “месяц/день/год” , даже если система настроена на отображение данных в другом формате (например, “день/ месяц/год” ). Если вы используете для отображения даты окно сообщений, дата будет представлена в соответствии с коротким форматом даты, установленным в системе. Аналогично время отображается согласно системному формату (12- или 24-часовому). Вы можете модифи­ цировать системные настройки с помощью аплета Язык и региональные стандарты панели управления в Windows. Ошибка дат в Excel В Excel (это общеизвестный недостаток) имеется ошибка, связанная с датами. Она основана на том, что 1900 год — високосный. Поэтому в Excel можно представить дату 29 февраля 1900 года, хотя на самом деле такой даты не существует. = D a te (1 9 0 0 / 2 / 29) В VBA не существует подобной ошибки. Эквивалентом функции Excel д а т а в VBA яв­ ляется функция D a te S e r ia l. Представленное ниже выражение (корректно) возвраща­ ет 1 марта 1900 года. D a t e S e r ia l(1 9 0 0 ,2 ,2 9 ) Следовательно, система представления дат в Excel не соответствует системе пред­ ставления дат в VBA. Эти две системы возвращают различные значения для дат в диа­ пазоне от 1 января 1900 года до 28 февраля 1900 года. Операторы присваивания Оператор присваивания — это инструкция VBA, выполняющая математическое вы­ числение и присваивающая результат переменной или объекту. В справочной системе Excel выражение определяется как комбинация ключевых слов, операторов, переменных Глава 8. Основы программирования на VBA 227 и констант. Эта комбинация возвращает в результате строку, число или объект. Выраже­ ние может выполнять вычисление, обрабатывать символы или тестировать данные. Нельзя придумать лучшего определения. Большое количество операций, выполняе­ мых в VBA, связано с разработкой (и отладкой) выражений. Если вы знаете, как созда­ вать формулы в Excel, то у вас не будет возникать проблем с созданием выражений в VBA. В формуле рабочего листа Excel результат отображается в ячейке. С другой сто­ роны, выражение VBA может присваивать значение переменной или использоваться как значение свойства. В VBA оператором присваивания выступает знак равенства (=). Ниже приведены примеры использования операторов присваивания (выражения приводятся справа от знака равенства), х = 1 X= X + 1 х = (у * 2) / (z * 2) FileOpen = T ru e FileOpen = N o t F ile O p e n Range ( "T h e Y e a r") .V a lu e = 2 010 О Совет Выражения могут быть очень сложными. Чтобы сделать длинные выражения более удобными для восприятия, используйте символ продолжения строки (пробел с подчеркиванием). Зачастую в выражениях применяются функции. Это могут быть встроенные функции VBA, функции рабочих листов Excel или специальные функции, разработанные в VBA. Подробнее встроенные функции VBA рассматриваются далее в главе. В VBA математические операторы играют главную роль. Известные вам операторы описывают математические операции, в том числе сложение (+), умножение (*), деление (/), вычитание (-), возведение в степень (ж) и конкатенацию строк (&). Менее известные операторы — обратная косая черта ( \) (используется в целочисленном делении) и опера­ тор Mod (применяется при определении модуля числа). Оператор Mod возвращает оста­ ток от деления одного числа на другое. Например, следующее выражение возвращает 2: 17 Mod 3 VBA поддерживает операторы сравнения, которые применяются в формулах Excel: равно (=), больше (>), меньше (<), больше или равно (>=), меньше или равно (<=) и не равно (<>). Предупреждение Оператор отрицания (знак “минус” ) в Excel и VBA интерпретируется поразному. При работе в Excel следующая формула возвращает значение 25. =-5*2 После выполнения следующего кода VBA переменная х получит значение -25. х = -5 А 2 Полученный результат объясняется тем, что в VBA сначала выполняется операция возведения в степень, а затем применяется оператор отрицания. А вот следующий код вернет нужное нам значение 2 5. х = (-5 ) А 2 Часть III. Visual Basic for Applications 228 За единственным исключением порядок приоритетности выполнения операторов в VBA совпадает с очередностью выполнения операторов в Excel (табл. 8.3). Если нужно ее изменить, используйте скобки. Таблица 8.3. Приоритетность выполнения операторов Оператор Выполняемая операция Возведение в степень 1 * и/ Умножение и деление 2 +и & Сложение и вычитание 3 Конкатенация 4 Сравнение 5 = , < , > , < =, >=, о Приоритетность оператора В результате выполнения следующ его оператора переменная х получает значение 10, поскольку оператор умножения имеет больший приоритет, чем оператор сложения. х = 4 + 3 * 2 Во избежание неоднозначности можно записать оператор следующим образом: х = 4 + (3 *2 ) В VBA также имеется полный набор логических операторов, которые показаны в табл. 8.4. Дополнительные сведения об этих операторах (вместе с примерами) можно найти в справочной системе VBA. Таблица 8.4. Логические операторы VBA Оператор Действие Not Логическое отрицание выражения Логическая конъюнкция двух выражений Логическая дизъюнкция двух выражений Логическое исключение двух выражений Логическая эквивалентность двух выражений Логическая импликация двух выражений And Or Xor Eqv Imp В следующ ей инструкции используется оператор N o t для отображения линий сетки в активном окне. Свойство D i s p l a y G r i d L i n e s принимает значение T r u e или F a l s e . Следовательно, оператор N o t изменяет T r u e на F a l s e , a F a l s e — на T r u e . A c tiv e W in d o w . D is p la y G r id lin e s = _ N ot A c tiv e W in d o w . D is p la y G r id lin e s Представленное далее выражение осуществляет логическую операцию And. Функция M sg B o x отображает значение T r u e , только если Л и с т 1 — активный лист и активная ячейка находится в строке 1. Если одно или оба этих условия неверны, функция M sgB ox отображает значение F a l s e . MsgBox A c tiv e S h e e t.N a m e = "Л и ст1 " And A c t i v e C e l l . Row = 1 Следующее выражение осуществляет логическую операцию Or. Оператор M sgB ox отображает T r u e , если активен Л и с т 1 или Л и с т 2. MsgBox A c tiv e S h e e t.N a m e = "Л и ст1 " _ Or A c tiv e S h e e t.N a m e = "Л и ст2 " Глава 8. Основы программирования на VBA 229 Массивы Массив — это группа элементов одного типа, которые имеют общее имя; на конкрет­ ный элемент массива ссылаются, используя имя массива и индекс. Например, можно оп­ ределить массив из 12 строк так, чтобы каждая переменная соответствовала названию месяца. Если вы назовете массив M on thN a m e s, то можете обратиться к первому эле­ менту массива как M on thN a m e s ( 0 ) , ко второму— как M on thN a m e s (1 ) и так до MonthNames ( 1 1 ) . Объявление массивов Массив, как и обычные переменные, объявляется с помощью операторов D im и P u b ­ l i c . Кроме того, можно определить количество элементов в массиве: введите нижний индекс, ключевое слово То и верхний индекс— и вся конструкция будет заключена в скобки. Например, объявить массив, содержащий ровно 100 целых чисел, можно сле­ дующим образом: Dim M y A r ra y (l То 100) As I n t e g e r © Совет При объявлении массива в обязательном порядке указывается только верх­ ний индекс; тогда VBA установит нижний индекс равным 0. Следовательно, два следующих оператора приведут к одинаковым результатам. Dim M y A rra y (0 t o 100) As I n t e g e r Dim M yA rra y(lO O ) As I n t e g e r В обоих случаях массив состоит из 101 элемента. По умолчанию в массивах VBA в качестве первого элемента используется нуль. Если вы хотите, чтобы в качестве первого индекса всех массивов использовалась единица, то перед первой процедурой модуля нужно сделать следующее объявление: Option Base 1 Объявление многомерных массивов В примерах массивов в предыдущем разделе использовались одномерные массивы. Массивы VBA могут иметь до 60 измерений, хотя на самом деле используется не более трех (трехмерные массивы). Показанный ниже оператор объявляет двухмерный 100-элементный массив целых чисел. Dim M y A r ra y (l То 10, 1 То 10) As I n t e g e r Этот массив можно рассматривать как матрицу значений размером 10x10. Чтобы об­ ратиться к конкретному элементу двухмерного массива, используйте два индекса. На­ пример, таким образом присваивается значение элементу предыдущего массива. МуАггау (3 , 4) = 125 Трехмерный массив, содержащий 1000 элементов, можно представлять в виде куба. Dim М уА гга у(1 То 10, 1 То 10, 1 То 10) As I n t e g e r Чтобы обратиться к элементу внутри массива, используйте три индекса. МуАггау (4, 8, 2) = 0 230 Часть III. Visual Basic for Applications Объявление динамических массивов Динамический массив не имеет предопределенного количества элементов. Он объяв­ ляется с незаполненными значениями в скобках. Dim M y A rra y () As I n t e g e r Тем не менее, прежде чем динамический массив можно будет использовать в програм­ ме, необходимо обратиться к оператору ReDim, указывающему VBA, сколько элементов находится в массиве. Для этого часто применяется переменная, значение которой неизвест­ но до тех пор, пока процедура не будет запущена на выполнение. Например, если перемен­ ной х присвоено число, размер массива определяется с помощью следующего оператора: ReDim M yA rra y (1 t o х) Оператор R eD im можно использовать повторно, изменяя размер массива по мере не­ обходимости. При изменении количества размерностей массива имеющиеся значения утрачиваются. Если нужно сохранить эти значения, воспользуйтесь оператором ReDim P re s e rv e . ReDim P re s e rv e M yA rra y (1 t o y) Подробнее массивы будут рассмотрены в разделе “Циклическая обработка инструкций”. Объектные переменные Объектам переменная — это переменная, представляющая целый объект, например диапазон или рабочий лист. Объектные переменные имеют особое значение по следую­ щим причинам: • они значительно упрощают программу; • они ускоряют выполнение программы. Объектные переменные, как и обычные переменные, объявляются с помощью опера­ тора D im или P u b l i c . Например, в следующем операторе переменная I n p u t A r e a объяв­ ляется как объект R ange: Dim In p u tA r e a As Range Для присваивания объекта переменной воспользуйтесь ключевым словом S e t: S e t In p u tA r e a = R ange( "C 1 6 : E16") Чтобы увидеть, каким образом объектные переменные упрощают код, обратите вни­ мание на следующую процедуру, в которой не используется объектная переменная. Sub N oO bjV a rO W o rk s h e e ts ( " Л и с т 1 " ) .R a n g e ( " A l" ) .V a lu e = 124 W o rk s h e e ts ( "Л и с т 1 ") .R a n g e ( " A l " ) . F o n t.B o ld = W o rk s h e e ts ( "Л и с т 1 ") . R a n g e ( " A l " ) . F o n t . I t a l i c W o rk s h e e ts ( "Л и с т 1 ") . R ange( " A l " ) . F o n t. S iz e = W o rk s h e e ts ( "Л и с т 1 ") .R a n g e ( " A l " ) . Font.N am e = End Sub T ru e = T ru e 14 "C a m b ria " Эта процедура вводит значение в ячейку А1 листа Лист1 активной рабочей книги, а затем применяет некоторое форматирование, изменяя шрифт и размер. В примере вве­ дено много кода для решения такой простой задачи. Чтобы упростить ее, сведите проце­ дуру к использованию объектной переменной. Sub O b jV a rO Dim M y C e ll As Range Глава 8. Основы программирования на VBA 231 Set M y C e ll = W o rksh e e ts ( 11Л и с т 1 " ) . Range ( " A l " ) M y C e ll.V a lu e = 124 M y C e ll. F o n t. B o ld = T ru e M y C e ll. F o n t. I t a l i c = T ru e M y C e ll. F o n t. S iz e = 14 M y C e ll. Font.N am e = C am bria End Sub После объявления переменной M y C e ll как объекта R ange оператор S e t присваива­ ет ей сам объект. В результате в следующих операторах используется упрощенная ссыл­ ка M y C e ll вместо длинной W o r k s h e e ts ( пЛ и с т 1 " ) . R ange ( " A l " ). Совет О После присвоения объекта переменной VBA получает доступ к нему намного быстрее, чем с помощью непосредственной ссылки на объект. Поэтому, ес­ ли скорость имеет значение, используйте объектные переменные. Удобно рассматривать этот феномен в категориях узлов. Каждый раз, когда VBA встречает новый узел, например s h e e ts (1) .Range ( 11A l " ) , ему требуется определенное время на расшифровку ссылки. Чем меньше узлов указано в ссылке, тем быстрее обрабатывается последняя. Другой способ увеличить скорость выполнения программы — воспользоваться конструкцией w ith End w ith , которая уменьшает количество обрабатываемых узлов. Подроб­ нее эта конструкция будет рассмотрена ниже. Настоящая ценность объектных переменных станет вам понятной после рассмотре­ ния циклов. Пользовательские типы данных VBA позволяет создавать специальные, или пользовательские, типы данных (эта кон­ цепция напоминает записи Паскаля или структуры С). Определенный пользователем тип данных может облегчить управление некоторыми типами данных. Например, если при­ ложение обрабатывает сведения о клиенте, то можно создать пользовательский тип дан­ ных с названием C u s to m e r ln f о. Type C u s to m e rln fo Company As S t r i n g C o n ta ct As S t r i n g RegionCode As Long Sales As D ou ble End Type Примечание Пользовательские типы данных определяются в верхней части модуля перед началом процедур. Если пользовательский тип данных уже создан, для объявления переменной этого ти­ па примените оператор Dim. Обычно пользовательский тип данных определяется для массивов. Dim Custom ers (1 То 100) As C u s to m e rln fo 232 Часть III. Visual Basic for Applications Bee 100 элементов этого массива состоят из четырех компонентов (как указано в пользовательском типе данных— C u s to m e r ln f о). Вы можете сослаться на конкрет­ ный компонент элемента следующим образом. C u s to m e rs ( 1 ) . Company = "Acme T o o ls " C u s to m e rs ( 1 ) . C o n ta c t = "T im R o b e rts o n " C u s to m e rs ( 1 ) . RegionCode = 3 C u s to m e rs ( 1 ) . S a le s = 1 50 67 4.98 Вам также предоставлена возможность управлять элементом массива как одним це­ лым. Например, чтобы скопировать информацию из C u s to m e r s (1 ) в C u s to m e r s (2 ) , используется следующая инструкция: C u s to m e rs (2) = C u s to m e rs (1) Предыдущий пример эквивалентен приведенному ниже блоку инструкций. C u s to m e rs ( 2 ) . Company = C u s to m e rs ( 1 ) . Company C u s to m e rs ( 2 ) . C o n ta c t = C u s to m e rs ( 1 ) . C o n ta c t C u s to m e rs ( 2 ) . RegionCode = C u s to m e rs ( 1 ) .R egionC ode C u s to m e rs ( 2 ) . S a le s = C u s to m e rs ( 1 ) . S a le s Встроенные функции Как и в большинстве других языков программирования, в VBA есть ряд встроенных функций, упрощающих вычисления и операции. Часто функции позволяют выполнить опе­ рации, которые по-другому осуществить сложно или вообще невозможно. Многие функции VBA подобны (или идентичны) функциям Excel. Например, функция VBA UCase, преоб­ разующая строку в верхний регистр, эквивалентна функции Excel ПРОПИСН. Перекрестная ссылка О В приложении Б находится полный список функций VBA, включающий краткое описание каждой из них. Все эти функции описаны в справочной системе VBA. Совет Чтобы получить список функций VBA при написании кода, введите VBA и точку. После этого VBE отобразит список всех вложенных в объект VBA объектов, включая функции (рис. 8.3). Функции обозначаются зеленым значком. Если этот способ вам недоступен, проверьте, включен ли параметр Auto List Members (Автоматическая вставка объектов). Для этого выберите команду Tools^Options (Сервис^Параметры) и щелкните на вкладке Editor (Редактор). Функции VBA используются в выражениях почти так же, как и функции Excel в фор­ мулах рабочего листа. Например, можно создавать вложенные функции VBA. Ниже при­ ведена простая процедура, которая вычисляет квадратный корень переменной с помо­ щью функции S q r VBA, сохраняет результат в другой переменной и затем отображает результат. Sub S how R oot() Dim M yValue As D o u b le Dim S q ua reR oo t As D ou ble M yValue = 25 S q ua reR oo t = S q r(M yV a lu e ) MsgBox S q uareR oot End Sub Глава 8. Основы программирования на VBA 233 Функция S q r VBA эквивалентна функции рабочего листа К О Р Е Н Ь в Excel. Вы можете использовать ряд (но не все) функций Excel в коде VBA. Объект W ork­ sheet F u n c tio n , который содержится в объекте A p p l i c a t i o n , располагает всеми функциями рабочего листа, которые можно вызвать в процедуре VBA. Чтобы использовать функцию Excel в операторе VBA, перед названием функции вве­ дите следующее выражение: A p p lic a t io n . W o rk s h e e tF u n c tio n Функция M s g B o x Функция MsgBox — одна из самых полезных в VBA. Во многих примерах из этой гла­ вы она используется для отображения значений переменных. Данная функция часто является достойной заменой простой форме. Кроме того, это превосходный инструмент отладки, поскольку вы можете в любое время вставить функцию MsgBox, чтобы приостановить программу и отобразить результат вычисления или присваивания. Как правило, функции возвращают одно значение, которое можно присвоить пере­ менной. Функция MsgBox не только возвращает значение, но и отображает диалоговое окно, в котором пользователь может выполнить определенные действия. Значение, возвращаемое функцией MsgBox, является ответом пользователя на отображенный за­ прос. Функция MsgBox может применяться даже в том случае, когда ответ пользователя не требуется, а нужно отобразить сообщение. Формальный синтаксис функции MsgBox предполагает использование пяти аргу­ ментов (аргументы в квадратных скобках — необязательные). MsgBox ( с о о б щ е н и е [, • к н о п к и ] [, з а г о л о в о к ] [, ф ай л_сп равки , к о н т екст ] ) С ообщ ение (обязательный аргумент) — сообщение, которое отображается в диало­ говом окне. Часть III. Visual Basic for Applications 234 • К н о п к и (необязательный аргумент) — значение, определяющее, какие кнопки и пиктограммы (если нужно) отображаются в окне сообщения. Применяйте встроен­ ные константы (например, vbYesNo). • З а г о л о в о к (необязательный аргумент) — текст, который отображается в строке за­ головка окна сообщения. По умолчанию отображается текст Microsoft Excel. • Ф а й л _ с п р а в к и (необязательный аргумент) — название файла справки, соответст­ вующего окну сообщения. • К онт екст (необязательный аргумент) — контекстный идентификатор раздела справки. Представляет конкретный раздел справки для отображения. Если исполь­ зуется аргумент к о н т ек с т , следует также задействовать аргумент ф а й л _ с п р а в к и . Вы можете присвоить полученное значение переменной либо использовать функ­ цию без оператора присваивания. В приведенном ниже примере результат присваива­ ется переменной Ans. Ans = M sgBox( "П родолж ить?" , vbYesNo + v b Q u e s tio n , I f Ans = vbNo Then E x i t Sub "Сообщи") Обратите внимание, что в качестве значения аргумента кнопки используется сумма двух встроенных констант (vbY esN o+ vbQ uestion). Благодаря константе vbYesNo в окне сообщения отображаются две кнопки: одна с меткой Yes, а вторая — с меткой No. До­ бавление v b Q u e s tio n в состав аргумента также приведет к отображению значка во­ проса. Как только будет выполнен первый оператор, переменная Ans получит одно из двух значений, представленных константами vbYes и vbNo. В этом примере процедура завершает свою работу после щелчка на кнопке No. Для получения дополнительных сведений о функции MsgBox обратитесь к главе 12. В следующем примере показано, каким образом функция рабочего листа Excel ис­ пользуется в процедуре VBA. Нечасто используемая функция VBA Roman преобразует десятичные числа в римские. Sub ShowRoman() Dim D ecV alue As Long Dim RomanValue As S t r i n g D ecV alue = 193 9 RomanValue = A p p l i c a t i o n . W o r k s h e e tF u n c tio n . Rom an(DecValue) MsgBox RomanValue End Sub При выполнении данной процедуры функция M sgB ox отображает строку MCMXXXIX. Любители старых фильмов часто приходят в отчаяние, когда узнают, что Excel не распо­ лагает функцией, преобразующей римское число в его десятичный эквивалент. Важно понимать, что вы не можете использовать функции Excel, для которых в VBA представлены эквивалентные функции. Например, VBA не позволяет получить доступ к функции Excel КОРЕНЬ (SQRT), так как в VBA имеется собственная версия этой функ­ ции: S qr. Таким образом, следующий оператор выдает ошибку: MsgBox A p p lic a t io n . W o r k s h e e t F u n c t io n . S q r t (123) 'ош ибка Перекрестная ссылка Как описывалось в главе 10, можно воспользоваться VBA для создания пользовательских функций рабочего листа, которые работают подобно встроенным функциям рабочего листа Excel. Глава 8. Основы программирования на VBA 235 Управление объектами и коллекциями Как программист вы проведете много времени, работая с объектами и коллекциями. Поэтому нужно знать самые эффективные способы написания кода для обработки объек­ тов и коллекций. VBA предлагает две конструкции, которые помогут вам упростить управление объектами и коллекциями: • конструкция W it h - E n d W ith ; • конструкция F o r E a c h - N e x t. Конструкция With - End With Конструкция W ith - E nd W ith позволяет выполнять несколько операций над од­ ним объектом. Чтобы понять, как она работает, проанализируйте следующую процедуру, которая изменяет шесть свойств выделенного объекта (подразумевается, что выделен объект R ange). Sub C hangeFont1 () S e le c tio n .F o n t.N a m e = "C a m b ria " S e le c t io n . F o n t . B o ld = T ru e S e le c t io n . F o n t . I t a l i c = T ru e S e le c t io n . F o n t. S iz e = 12 S e le c t io n . F o n t.U n d e r lin e = x lU n d e r lin e S t y le S in g le S e le c t io n . F o n t . Them eC olor = x lT h e m e C o lo rA c c e n tl End Sub Эту процедуру можно переписать с помощью конструкции W ith Процедура, показанная ниже, работает точно так же, как и предыдущая. End W ith. Sub C hangeFont2 () W ith S e l e c t i o n . F o n t .Name = "C a m b ria " .B o ld = T ru e . I t a l i c = T ru e .S iz e = 12 .U n d e r lin e = x lU n d e r lin e S t y le S in g le .T hem eC olor = x lT h e m e C o lo rA c c e n tl End W ith End Sub Считается, что второй вариант этой процедуры читать сложнее. Однако помните, что целью изменений является увеличение скорости выполнения операций. Первый вариант более прямолинейный и его легче понять, но процедура, использующая для изменения нескольких свойств одного объекта конструкцию W ith - End W ith, помогает повы­ сить эффективность выполнения кода по сравнению с эквивалентной ей процедурой, ко­ торая явно ссылается на объект в каждом операторе. © Примечание При записи макроса VBA в Excel конструкция w ith - End w ith применяет­ ся при каждой удобной возможности. Чтобы посмотреть удачный пример этой конструкции, проанализируйте последовательность действий при из­ менении параметров страницы с помощью команды Разметка страницы^ Параметры страницы^Ориентация (Page Layout^Page Setup^Orientation). 236 Часть III. Visual Basic for Applications Конструкция For Each - Next Итак, вы уже знаете, что коллекция — это группа однородных объектов. Например, W orkbooks — это коллекция всех открытых рабочих книг (объектов) W orkbook. Су­ ществует ряд других коллекций, с которыми вы можете работать. Предположим, вы решили выполнить действие над всеми объектами коллекции или вам необходимо оценить все объекты коллекции и совершить действие при выполнении определенных условий. Это идеальная ситуация для применения конструкции F or E ach - N ext. Синтаксис конструкции F o r E ach - N ext приведен ниже. F o r Each элемент I n к о л л е к ц и я [инст рукции] [ E x it F o r] [инст рукции] N e xt [ элемент ] В процедуре, приведенной далее, применена конструкция F o r E ach - N ext по отношению к коллекции W o rk s h e e ts активной рабочей книги. При выполнении этой процедуры функция MsgBox отображает свойство Name каждого рабочего листа. (Если в активной рабочей книге пять листов, функция MsgBox вызывается пять раз.) Sub C o u n tS h e e ts () Dim Ite m as W o rksh e e t F o r Each Ite m I n A c tiv e W o rk b o o k .W o rk s h e e ts MsgBox Item .N am e N e x t Ite m End Sub Примечание В предыдущем примере ite m — это объектная переменная (точнее, объект W o rkshe et). В названии ite m не заключен особый смысл; вместо него мож­ но использовать любое корректное название переменной. В следующем примере конструкция F o r E ach - N ext используется для цикличе­ ского просмотра всех объектов коллекции Windows, а также для подсчета количества скрытых окон. Sub H idd en W ind o w s() Dim C nt As I n t e g e r Dim Win As Window C nt = 0 F o r Each Win I n Windows I f N o t W in . V is ib le Then C nt = C nt + 1 N e x t W in MsgBox C nt St " скрытые о к н а . " End Sub Для каждого скрытого окна значение переменной C nt увеличивается на единицу. По завершении цикла в окне сообщения отображается значение переменной Cnt. В следующем примере закрываются все окна, за исключением активного. В этой про­ цедуре используется конструкция I f - T h e n для проверки каждой рабочей книги в кол­ лекции W orkbooks. Глава 8. Основы программирования на VBA 237 Sub C lo s e ln a c t iv e () Dim Book as W orkbook For Each Book I n W orkbooks I f Book.Name <> A ctive W o rkb o o k.N a m e Then B o o k .C lo s e N ext Book End Sub Чаще всего конструкция F o r E ach - N ext применяется для циклического обхода всех ячеек диапазона. В следующем примере конструкция F o r E ach - N ext вызыва­ ется после того, как пользователь выбрал диапазон ячеек. В данном случае объект S e ­ l e c t i o n выступает в качестве коллекции, которая состоит из объектов Range, по­ скольку каждая ячейка в выделенной области представляет собой объект Range. Проце­ дура проверяет каждую ячейку, а затем использует функцию VBA UCase для преобразования ее содержимого в символы верхнего регистра. (При этом числовые ячейки не изменяются.) Sub M akeUpperCase() Dim C e ll as Range For Each C e ll I n S e le c t io n C e ll. V a lu e = U C a s e (C e ll.V a lu e ) Next C e ll End Sub В VBA существует способ выхода из цикла F o r-N e x t до того, как будут проверены все элементы коллекции. Для этого используется оператор E x i t For. В приведенном ни­ же примере выбирается первое отрицательное значение в первой строке активного листа. Sub S e le c tN e g a tiv e () Dim C e ll As Range For Each C e ll I n R ange( " 1 : 1 " ) I f C e ll. V a lu e < 0 Then C e l l . S e le c t E x it For End I f Next C e ll End Sub В рассматриваемом примере используется конструкция I f - T h e n для проверки зна­ чения каждой ячейки. Если ячейка содержит отрицательную величину, она выбирается, причем завершение цикла происходит после выполнения оператора E x i t For. Контроль за выполнением кода Некоторые процедуры VBA начинают выполняться с первых строк кода. Этот про­ цесс происходит построчно до самого конца процедуры (например, так всегда работают макросы, записанные при выполнении действий). Однако иногда необходимо контроли­ ровать последовательность операций, пропуская отдельные операторы, повторно выпол­ няя некоторые команды и проверяя условия для определения следующего действия, вы­ полняемого процедурой. В предыдущем разделе описана конструкция F o r E a c h -N e x t, которая является циклической структурой. В настоящем разделе речь пойдет о дополнительных способах контроля за выполнением процедур, написанных на VBA: • оператор GoTo; • конструкция I f - Then; 238 Часть III. Visual Basic for Applications • конструкция S e l e c t C ase; • цикл F o r - N e x t ; • цикл Do W h ile ; • цикл Do U n t i l . Оператор Go t o Самый простой способ изменить последовательность операций в коде — использо­ вать оператор GoTo. Он перенаправляет ход выполнения программы на новую инструк­ цию, которая помечена специальным образом (текстовая строка, заканчивающаяся двое­ точием, или число, заканчивающееся пробелом, указанные перед инструкцией). Проце­ дуры VBA могут содержать любое количество меток, а оператор GoTo не определяет переход за пределы процедуры. В приведенной ниже процедуре применена функция VBA I n p u t B o x для получения имени пользователя. Если имя пользователя отличается от Ховард, то процедура пере­ ходит к метке W rongNam e, на чем заканчивает свою работу. В противном случае проце­ дура выполняет дополнительные операции. Оператор E x i t Sub заканчивает выполне­ ние процедуры. Sub GoToDemo() UserName = In p u tB o x ( "В ведите свое и м я :") I f UserName <> "Х овард" Then GoTo WrongName MsgBox ("П р и в е т, Х о в а р д . .." ) 1 - [Здесь вводится дополнительный ко д ] E x i t Sub WrongName: MsgBox "И зви н и те , э т у процедуру может з а п у с ка т ь то л ь ко Х о в а р д ." End Sub Представленная процедура работает, но оператор GoTo, как правило, используется, если другого способа выполнить действие просто не существует. Единственной ситуаци­ ей, когда оператор GoTo в VBA действительно необходим, является перехват ошибок (см. главу 9). Вряд ли представленный выше пример следует рассматривать в качестве эффектив­ ной меры защиты! Конструкция I £ -Then Вероятно, конструкция I f - T h e n чаще остальных используется для группирования инструкций VBA. Эта популярная конструкция наделяет приложения способностью при­ нимать решения. Такая способность является ключевой при создании эффективных про­ грамм. Удачное приложение Excel, по сути, сводится к принятию правильного решения и выполнению соответствующих действий. Стандартный синтаксис конструкции I f - T h e n таков: If у с л о в и е Then ин ст р укции_ист ина [E ls e и н с т р у кц и и _ л о ж ь ] Конструкция I f - T h e n используется для выполнения одного или более операторов при справедливости заданного условия. Оператор E ls e необязателен. Он позволяет вы­ полнять одну или более инструкций в случае несправедливости условия. Глава 8. Основы программирования на VBA 239 В описанной ниже процедуре применена структура I f - T h e n без оператора E ls e . Пример связан с управлением временными данными. VBA использует систему дат и времени, похожую на задействованную в Excel. Время дня выражается дробным чис­ лом, например полдень представлен как 0 .5 . Функция VBA Time возвращает значение, представляющее время в формате системных часов. В следующем примере сообщение отображается, если текущее время меньше полудня. Если текущее системное время больше или равно 0 . 5, то процедура заканчивается, и ничего не происходит. Sub G re e tM e lO I f Time < 0 .5 Then MsgBox "Доброе утр о " End Sub Можно переписать этот код, воспользовавшись несколькими операторами, как пока­ зано ниже. Sub G re e tM e la O I f Time < 0 .5 Then MsgBox "Доброе у т р о " End I f End Sub Обратите внимание, что оператору I f соответствует оператор End I f . В этом при­ мере вызывается на выполнение только один оператор, если условие равно T ru e. Между операторами I f и End I f можно поместить любое количество операторов. Если нужно отобразить другое приветствие, когда наступает вторая половина дня, добавьте еще один оператор I f - Then, как показано ниже. Sub GreetMe2 () I f Time < 0 .5 Then MsgBox "Доброе у т р о " I f Time >= 0 .5 Then MsgBox "Добрый д ень" End Sub Обратите внимание, что для второй конструкции I f - T h e n использован оператор >= (больше или равно). Таким образом учитывается случай, когда время на часах точно равно 12.00. Другой подход — использовать оператор E ls e конструкции I f- T h e n . Sub G reetM e3() I f Time < 0 .5 Then MsgBox "Доброе у т р о " E ls e _ MsgBox "Добрый де нь" End Sub Обратите внимание, что был использован символ продолжения строки; I f - T h e n Else является фактически одним оператором. Если нужно выполнять несколько операторов на базе одного условия, воспользуйтесь следующим кодом. Sub G reetM e3a() I f Time < 0 .5 Then MsgBox "Доброе у т р о " ' Здесь вво д ятся д р уги е операторы ' E lse MsgBox "Добрый день " 1 Здесь вво д ятся д р уги е операторы End I f End Sub 240 Часть III. Visual Basic for Applications Если вам необходимо расширить процедуру до обработки трех условий (например, утро, день и вечер), то можете использовать либо три оператора I f - T h e n , либо вложен­ ную структуру I f - T h e n -E ls e . Первый вариант значительно проще. Sub G re e tM e 4 () I f Time < 0 .5 Then MsgBox "Доброе у т р о " I f Time >= 0 .5 And Time < 0 .7 5 Then MsgBox "Добрый день" I f Time >= 0 .7 5 Then MsgBox "Добрый вечер" End Sub Значение 0 . 75 представляет время 18:00— три четверти суток и тот момент, когда день переходит в вечер. В предыдущих примерах каждая инструкция в процедуре выполняется даже утром. Для эффективности следует включить структуру, заканчивающую процедуру, когда одно из условий выполняется. Если, например, отображается сообщение Доброе утро, то процедура заканчивается без проверки других, излишних условий. Конечно, разница в скорости выполнения обеих процедур несущественна, если вы разрабатываете такую крохотную процедуру, как рассматриваемая. Но в более сложных приложениях все же рекомендуется учесть следующий синтаксис. If условие Then [ и н с т р ук ц и и _ и ст и н а ] [ E l s e I f у с л о в и е - п Then [ а л ь т ерна т и в н ы е_ и н с т р ук ц и и ] ] [E ls e [ о п ер а т о р ы _ п о _ у м о л ч а н и ю ] ] End I f Этот же синтаксис можно использовать для введения кода процедуры G reetM e5. Sub G re e tM e 5 () I f Time < 0 .5 Then MsgBox "Доброе у т р о " E l s e l f Time >= 0 .5 And Time < 0 .7 5 Then MsgBox "Добрый д ень" E ls e MsgBox "Добрый ве чер" End I f End Sub Если в представленном синтаксисе условие выполняется, то выполняются соответст­ вующие операторы, после чего конструкция I f - T h e n заканчивается. Другими словами, при этом не оцениваются дополнительные условия. Такой синтаксис наиболее эффекти­ вен, однако многим эта программа может показаться сложной для понимания. Далее представлен еще один способ реализовать рассматриваемый пример. В нем ис­ пользуются вложенные конструкции I f - T h e n - E l s e (без E l s e l f ) . Данная процедура также эффективна, и ее легко понять. Обратите внимание, что для каждого оператора I f существует свой оператор End I f . Sub G re e tM e 6 () I f Tim e < 0 .5 Then MsgBox "Доброе у т р о " E ls e I f Time >= 0 .5 And Time < 0 .7 5 Then MsgBox "Добрый де нь" E ls e I f Time >= 0 .7 5 Then MsgBox "Добрый вечер" Глава 8. Основы программирования на VBA 241 End I f End I f End I f End Sub Ниже продемонстрирован еще один пример, использующий простую форму конст­ рукции I f - T h e n . Процедура запрашивает у пользователя значение переменной Q u a n ­ t i t y и отображает скидку на основе полученного значения. Если в окне I n p u t B o x пользователь щелкнет на кнопке Отмена, то переменная Q u a n t i t y приравняется к пус­ той строке, в результате чего процедура будет завершена. Следует отметить, что эта про­ цедура не выполняет других проверок (например, мы не проверяем в данном случае вве­ денное числовое значение на отрицательность). Sub D is c o u n tlO Dim Q u a n tity As V a r ia n t Dim D is c o u n t As D o u b le Q u a n tity = In p u tB o x ( "В ведите зн ачен и е : ") I f Q u a n tity = " " Then E x i t Sub I f Q u a n tity >= 0 Then D is c o u n t = 0 .1 I f Q u a n tity >= 25 Then D is c o u n t I f Q u a n tity >= 50 Then D is c o u n t I f Q u a n tity >= 75 Then D is c o u n t MsgBox "С ки д ка : " & D is c o u n t End Sub =0 .1 5 =0 .2 =0 .2 5 Обратите внимание, что каждый оператор I f - T h e n в представленной процедуре всегда выполняется, а значение D i s c o u n t может изменяться. Однако в результате все­ гда отображается нужное значение. Следующая процедура — это вариант предыдущей, переписанной с использованием альтернативного синтаксиса. Процедура будет окончена после выполнения блока T ru e . Sub D is c o u n t2 () Dim Q u a n tity As V a r ia n t Dim D is c o u n t As D o u b le Q u a n tity = In p u tB o x ( "Укаж ите ко л и ч е с т в о : I f Q u a n tity = " " Then E x i t Sub I f Q u a n tity >= 0 And Q u a n t it y < 25 Then D is c o u n t = 0 .1 E ls e lf Q u a n t it y < 50 Then D is c o u n t = 0 .1 5 E ls e lf Q u a n tity < 75 Then D is c o u n t = 0 .2 Else D is c o u n t = 0 .2 5 End I f MsgBox "С ки д ка : " & D is c o u n t End Sub 11) Вложенные структуры I f - T h e n достаточно громоздкие. Поэтому рекомендуется ис­ пользовать их только для принятия простых бинарных решений. Если же необходимо выбрать между тремя и более вариантами, то целесообразно обратиться к конструкции S e le c t C ase, которая рассматривается далее. 242 Часть III. Visual Basic for Applications Функция VBA I I £ В VBA существует альтернатива конструкции if- T h e n : функция I l f . Эта функция имеет три аргумента и работает подобно функции рабочего листа Excel е с л и . Рассмот­ рим ее синтаксис: I l f (в ы р а ж е н и е , ч а с т ь _ Т г и е , 4 a c T b _ F a l s e ) • Выраж ение (обязательный аргумент) — выражение, которое нужно оценить • Ч аст ь_т ги е (обязательный аргумент) — значение или выражение, возвращаемое функцией, когда выражение имеет тип T ru e • 4 a c T b _ F a l s e (обязательный аргумент) — значение или выражение, возвращаемое функцией, когда выражение имеет тип F a ls e Следующая инструкция демонстрирует применение функции i i f . В окне сообще­ ний отображается Нуль, если ячейка А1 содержит нуль или пуста, He-н у л ь , если ячейка А1 содержит другое значение. MsgBox I l f ( R a n g e ( " A l " ) = 0, "Н у л ь ", "Н е -н у л ь ") Важно понимать, что третий аргумент ( 4 a c T b _ F a ls e ) всегда оценивается, даже ес­ ли второй аргумент (ч а с т ь _ т ги е ) выполняется. Следовательно, следующий оператор выдает ошибку, если значение п равно нулю. MsgBox I l f ( n =0, 0, 1 / n) Конструкция Select Case Конструкция S e l e c t C ase применяется при выборе между тремя и более вариан­ тами. Она справедлива также для двух вариантов и является хорошей альтернативой структуре I f - T h e n - E ls e . Конструкция S e l e c t C ase имеет следующий синтаксис. S e le c t Case т ест и р у е м о е_ вы р а ж ен и е [Case с п и с о к у с л о в и й -n [о п е р а т о р ы - n ] ] [Case E ls e [оп ерат оры _п о_ум олчан и ю ] ] End S e le c t Приведем пример конструкции S e l e c t C ase, который показывает еще один способ запрограммировать процедуру G re e tM e , рассмотренную в предыдущем разделе. Sub G re e tM e () Dim Msg As S t r in g S e le c t Case Time Case I s < 0 .5 Msg = "Доброе у т р о " Case 0 .5 To 0 .7 5 Msg = "Добрый день" Case E ls e Msg = "Добрый вечер" End S e le c t MsgBox Msg End Sub Ниже приведена версия процедуры D is c o u n t , переписанная с использованием кон­ струкции S e l e c t C ase. Эта процедура предполагает, что Q u a n t i t y всегда выражает­ ся целым числом. Чтобы упростить процедуру, в ней не выполняется проверка введен­ ных данных. Глава 8. Основы программирования на VBA Sub D is c o u n t3 ( ) Dim Q u a n tity As V a r ia n t Dim D is c o u n t As D ou ble Q u a n tity = In p u tB o x ( " В в е д и т е з н а ч е н и е : S e le c t Case Q u a n tity Case " " E x i t Sub Case 0 To 24 D is c o u n t = 0 .1 Case 25 To 4 9 D is c o u n t = 0 .1 5 Case 50 To 74 D is c o u n t = 0 .2 Case I s >= 75 D is c o u n t = 0 .2 5 End S e le c t MsgBox " С к и д к а : " & D is c o u n t End Sub 243 ") В операторе C ase можно использовать запятую, разделяющую несколько значений для одного варианта. В следующей процедуре используется функция VBA WeekDay, с помощью которой определяется, является ли текущий день субботой либо воскресень­ ем (функция W eekday возвращает значение 1 либо 7). Затем отображается соответст­ вующее сообщение. Sub G re e tU s e rl () S e le c t Case Weekday(Now) Case 1, 7 MsgBox " Э т о в ы х о д н ы е " Case E ls e MsgBox " Э т о н е в ы х о д н ы е " End S e le c t End Sub Следующий пример демонстрирует еще один способ кодирования предыдущей про­ цедуры. Sub G ree tU ser2 () S e le c t Case Weekday(Now) Case 2 , 3, 4, 5, 6 MsgBox " Э т о н е в ы х о д н ы е " Case E ls e MsgBox " Э т о в ы х о д н ы е " End S e le c t End Sub Под каждым оператором C ase может указываться любое количество инструкций, и они выполняются при условии C ase, имеющем значение T ru e. Если вы используете в каждом случае C ase только одну инструкцию (как в предыдущем примере), то можете поместить ее в той же строке, что и ключевое слово C ase (но не забудьте о символе раз­ деления операторов в VBА — двоеточии). Этот прием сделает текст программы более компактным. Sub D is c o u n t3 () Dim Q u a n tity As V a r ia n t Dim D is c o u n t As D ou ble Q u a n tity = In p u tB o x ( " В в в е д и т е к о л и ч е с т в о : S e le c t Case Q u a n tity Case " " : E x i t Sub ") 244 Часть III. Visual Basic for Applications Case 0 To 24: D is c o u n t = 0 .1 Case 25 To 49 D is c o u n t = 15 Case 50 To 74 D is c o u n t = 2 25 Case I s >= 75 D is c o u n t = End S e le c t MsgBox " С к и д к а : & D is c o u n t End Sub Совет Интерпретатор VBA осуществляет выход из конструкции S e le c t Case, как только найдено условие T ru e . Следовательно, для максимальной эффек­ тивности, в первую очередь, следует выполнить проверку наиболее вероят­ ного случая. Структуры S e l e c t C ase можно вкладывать друг в друга. Например, следующая процедура использует процедуру VBA TypeName для определения того, что выделено в настоящий момент (диапазон ячеек, ничего или что-либо еще). Если выделен диапазон, процедура вызывает на выполнение вложенный оператор S e l e c t C ase, а также прове­ ряет количество ячеек в диапазоне. Если выделена одна ячейка, отображается сообщение Выделена одна яч ей к а. В противном случае отображается сообщение, в котором указывается количество выделенных строк. Sub S e le c tio n T y p e () S e le c t Case T y p e N a m e (S e le c tio n ) Case " Д и а п а з о н " S e le c t Case S e l e c t i o n . C ount Case 1 MsgBox " В ы д е л е н а о д н а я ч е й к а " Case E ls e MsgBox S e le c tio n .R o w s . C ount & " с т р о к " End S e le c t Case " Н и ч е г о " MsgBox " Н и ч е г о н е в ы д е л е н о " Case E ls e MsgBox " В ы д е л е н о б ъ е к т , о т л и ч н ы й о т д и а п а з о н а " End S e le c t End Sub Можно создавать конструкции S e l e c t C ase любой степени вложенности, но убедитесь, что каждому оператору S e l e c t Case соответствует свой оператор End S e le c t. Данная процедура демонстрирует, насколько важно использовать отступы в коде, чтобы выделить его структуру. Например, рассмотрим ту же процедуру, но без отступов. Sub S e le c tio n T y p e () S e le c t Case T y p e N a m e (S e le c tio n ) Case " Д и а п а з о н " S e le c t Case S e l e c t i o n . C ount Case 1 MsgBox " В ы д е л е н а о д н а я ч е й к а " Case E ls e MsgBox S e l e c t i o n . Rows. C ount & " с т р о к " End S e le c t Case " Н и ч е г о " MsgBox " Н и ч е г о н е в ы д е л е н о " Case E ls e MsgBox " В ы д е л е н о б ъ е к т , о т л и ч н ы й о т д и а п а з о н а " Глава 8. Основы программирования на VBA 245 End S e le c t End Sub В таком представлении мало что понятно даже опытному программисту! Циклическая обработка инструкций Цикл — это процесс повторения набора инструкций. Возможно, вы заранее знаете, сколько раз должен повториться цикл, или это значение определяется переменными в программе. Следующий код, в котором в диапазон вводятся последовательные числа, является примером того, что называют плохим циклом. Процедура использует две переменные для хранения начального значения ( S t a r t V a l ) и общего количества ячеек, которые не­ обходимо заполнить ( N u m T o F ill) . В этом цикле для управления порядком выполнения операций используется оператор GoTo. Если переменная C n t, отвечающая за то, сколь­ ко ячеек заполнено, меньше числа, заданного пользователем, то выполняется переход назад, к метке D o A n o th e r . Sub BadLoop () Dim S t a r t V a l As I n t e g e r Dim N u m T o F ill As I n t e g e r Dim Cnt As I n t e g e r S ta r tV a l = 1 N um T oF ill = 100 A c t iv e C e ll.V a lu e = S t a r t V a l Cnt = 1 poAnother: 'A c tiv e C e ll. Of f s e t ( C n t, 0) .V a lu e = S t a r t V a l + C nt Cnt = C nt + 1 I f Cnt < N u m T o F ill Then GoTo D o A n o th e r E ls e E x i t Sub End Sub Описанная процедура выполняется правильно. Почему же она является примером пло­ хого цикла? Настоящие программисты не используют оператор GoTo, если можно обой­ тись без него. Применение операторов GoTo в цикле противоречит концепции структурно­ го программирования (см. врезку “Несколько слов о структурном программировании”). Этот оператор значительно усложняет восприятие кода, поскольку в данном случае прак­ тически невозможно структурировать цикл с помощью отступов. Кроме того, такой тип не­ структурированного цикла делает процедуру подверженной частым ошибкам. Также исполь­ зование большого количества меток приводит к получению программы с плохой структу­ рой (или без структуры вообще) и бессистемным порядком следования операций. Поскольку в VBA встроено несколько структурированных команд циклов, в процессе принятия решений практически никогда не требуется прибегать к операторам GoTo. Несколько слов о структурном программировании Пообщайтесь с профессиональными программистами, и рано или поздно вы услы­ шите термин “структурное программирование” . Кроме того, вы обнаружите, что струк­ турные программы лучше иных типов программ. Что же представляет собой структурное программирование и как его применить к VBA? Основное условие заключается в том, что процедура (или сегмент программы) должна иметь только одну точку входа и одну точку выхода. Другими словами, тело кода является независимым элементом, а контроль за выполнением программы не должен Часть III. Visual Basic for Applications 246 выходить за рамки этого элемента. Поэтому в структурной программе не допускается применение оператора G o t o . В подобной программе выполнение кода происходит в определенном порядке, который легко отслеживается (в отличие от кода, в котором программа “перескакивает” с места на место). Структурную программу проще воспринимать и анализировать, чем неструктурную. И что более важно, ее легче изменять. VBA— структурированный язык. Он предлагает стандартные структурные конструкции, такие как If- T h e n - E ls e и S e le c t Case, а также циклы F o r-N e x t, Do U n t i l и Do W hile. Более того, VBA полностью поддерживает модульный подход к созданию программ. Если вы начинаете программировать, привыкайте сразу же создавать структуриро­ ванные программы. Циклы F o r - N e x t Простейший пример хорошего цикла — F o r-N e x t (он уже применялся в нескольких предыдущих примерах). Этот оператор имеет следующий синтаксис. F o r сче т чик = начало То к о н е ц [и нст рукц ии] [ E x it F o r] [S te p ш аг ] [и н ст р укц и и ] [с ч е т чи к ] N e xt Ниже приведен пример цикла F o r-N e x t, в котором не используется значение шаг переменной S te p и необязательный оператор E x i t F or. Эта процедура выполняет оператор Sum = Sum + S q r (C ount) 100 раз и отображает результат— сумму квад­ ратных корней первых 100 целых чисел. Sub S um S quareR oots() Dim Sum As D ou ble Dim C ount As I n t e g e r Sum = 0 F o r C ount = 1 To 100 Sum = Sum + S q r(C o u n t) N e x t C ount MsgBox Sum End Sub В данном примере C ount (переменная-счетчик цикла) имеет начальное значение 1 и увеличивается на 1 при каждом повторении цикла. Переменная Sum суммирует квад­ ратные корни каждого значения C ount. Предупреждение Используя циклы F o r-N e x t, важно понимать, что в качестве счетчика цикла используется обычная переменная, и ничего больше. В результате значение счетчика цикла можно изменять в блоке программы, который выполняется между операторами F o r и N ext. Однако это очень неудачный прием, посколь­ ку он может привести к непредсказуемым результатам. Необходимо принять специальные меры предосторожности, чтобы удостовериться в том, что про­ грамма не изменяет счетчик цикла. Можно также указать значение ш а г для переменной S te p , чтобы пропустить отдель­ ные итерации цикла. Ниже рассмотрена исходная процедура, переписанная так, что сум­ мируются квадратные корни всех нечетных чисел в диапазоне от 1 до 100. Глава 8. Основы программирования на VBA 247 Sub Sum OddSquareRoots() Dim Sum As D ou ble Dim C ount As I n t e g e r Sum = 0 For C ount = 1 To 100 S te p 2 Sum = Sum + S q r (C o u n t) N ext C ount MsgBox Sum End Sub В этой процедуре исходное значение C ount равно 1, затем счетчик принимает значе­ ния 3, 5, 7 и т.д. Последнее значение C ount, используемое в цикле, равно 99. Когда цикл заканчивается, значение C ount равно 101. Значение переменной S te p в цикле F o r-N e x t может быть также отрицательным. Приведенная ниже процедура удаляет строки 2, 4, 6, 8 и 10 в активном листе. Sub D ele teR o w sO Dim RowNum As Long For RowNum = 10 To 2 S te p -2 R ow s(R ow N um ).D elete Next RowNum End Sub На первый взгляд, вызывает удивление использование отрицательного значения пере­ менной S te p в процедуре D eleteR ow s. Если же использовать положительные значения переменной S te p , как показано в следующей процедуре, будут удалены не те строки. Это связано с тем, что строки, находящиеся под удаленными строками, получают новые номе­ ра. Например, если удалена 2-я строка, 3-я строка получает номер 2. Эту проблему можно устранить путем использования отрицательных значений переменной S te p . Sub D e le te R o w s2 () Dim RowNum As Long For RowNum = 2 To 10 S te p 2 R ow s(R ow N um ).D elete Next RowNum End Sub Следующая процедура выполняет ту же задачу, что и пример цикла BadLoop, кото­ рый приводился в начале раздела “Циклическая обработка инструкций”. В данном слу­ чае был устранен оператор GoTo, благодаря чему “плохой цикл” был превращен в “хороший цикл”, в котором используется структура F o r-N e x t. Sub GoodLoop() Dim S t a r t V a l As I n t e g e r Dim N u m T o F ill As I n t e g e r Dim Cnt As I n t e g e r S ta r tV a l = 1 N um T oF ill = 100 For Cnt = 0 To N u m T o F ill - 1 A c t iv e C e l l . O f f s e t ( C n t , 0 ) .V a lu e = S t a r t V a l + C nt Next Cnt End Sub Циклы F o r-N e x t могут также содержать один или более операторов E x i t For. Когда программа встречает этот оператор, то сразу же выходит из цикла, как показано вследующем примере. Эта процедура определяет, какая ячейка столбца А на активном рабочем листе имеет наибольшее значение. Часть III. Visual Basic for Applications 248 Sub E x itF o rD e m o () Dim M axVal As D ou ble Dim Row As Long M axVal = A p p lic a tio n .W o rk s h e e tF u n c tio n .M a x (R a n g e ( " A :A " )) F o r Row = 1 To 1048576 I f C e lls (R o w , 1 ) .V a lu e = M axVal Then E x it For End I f N e x t Row MsgBox "Максимальное значение в стр о ке " & Row C e lls (R o w , 1 ) . A c t iv a t e End Sub Максимальное значение в столбце вычисляется с помощью функции Excel МАХ. Затем это значение присваивается переменной MaxVal. Цикл F o r-N e x t проверяет каждую ячейку в столбце. Если определенная ячейка равна MaxVal, оператор E x i t F o r закан­ чивает процедуру. Однако перед выходом из цикла процедура сообщает пользователю о расположении искомой ячейки и активизирует ее. Примечание Пример E xitF o rD e m o представлен с целью продемонстрировать выход из цикла F o r-N e x t. Однако это не самый эффективный способ найти макси­ мальное значение в диапазоне. Поставленную задачу может выполнить единственный оператор. R ange( " А : А " ) . F in d ( A p p lic a tio n .W o r k s h e e tF u n c tio n .M a x _ (R ange( " A :A " ) ) ) . A c t iv a t e В предыдущих примерах использовались достаточно простые циклы. Но вы можете помещать в цикл любое количество операторов и даже вкладывать циклы F o r-N e x t в другие циклы F o r-N e x t. Ниже приведен пример, в котором применены вложенные циклы F o r-N e x t для инициализации массива 10x10x10 значением -1 . По завершении выполне­ ния процедуры все 1000 элементов массива МуАггау будут содержать значение -1. Sub N e s te d L o o p s () Dim М у А гга у (1 t o 10, 1 t o 10, 1 t o 10) Dim i As I n t e g e r , j As I n t e g e r , k As I n t e g e r F o r i = 1 To 10 F o r j = 1 To 10 F o r k = 1 To 10 M y A r r a y ( i, j , k) = -1 N e xt k N e xt j N ext i End Sub Циклы Do W h ile Оператор Do W h ile — еще один тип циклической структуры, представленной в VBA. В отличие от цикла F o r-N e x t, цикл Do W h ile выполняется до тех пор, пока удовлетворяется заданное условие. Цикл Do W h ile может иметь один из двух пред­ ставленных ниже синтаксисов. Do [W h ile у с л о в и е ] [ инст р укц и и ] [ E x it Do] Глава 8. Основы программирования на VBA 249 [и н ст р укц и и ] Loop или Do [и н ст р укц и и ] [ E x it Do] [и н ст р укц и и ] Loop [W h ile усло вие] Как видите, VBA позволяет проверять условие W h ile в начале или в конце цикла. Разница между этими двумя синтаксисами связана с моментом, когда оценивается усло­ вие. В первом синтаксисе содержимое цикла может вообще не выполняться. Во втором содержимое цикла всегда выполняется (как минимум один раз). В следующих примерах в активный рабочий лист вставляется набор дат. Эти даты со­ ответствуют дням текущего месяца, а их ввод в столбец осуществляется, начиная с ак­ тивной ячейки. В этих примерах используются некоторые функции VBA, обрабатывающие даты: • D ate возвращает текущую дату; • M onth возвращает номер месяца для даты, являющейся аргументом; • D a t e S e r i a l конструирует дату на основе значений дня, месяца и года, указан­ ных в качестве аргументов. В первом примере демонстрируется цикл Do W hile, в котором реализована провер­ ка условия в начале цикла: процедура E n t e r D a t e s l вводит даты текущего месяца в столбец рабочего листа, начиная с активной ячейки. Sub E n te rD a te s l () ' цикл Do W h ile , условие проверяется в начале Dim TheDate As D ate TheDate = D a t e S e r ia l( Y e a r ( D a t e ) , M o n th (D a te ), 1) Do W hile M o n th (T h e D a te ) = M o n th (D a te ) A c t iv e C e ll = TheD ate TheDate = TheD ate + 1 A c t i v e C e l l . O f f s e t (1 , 0 ) . A c t iv a t e Loop End Sub В этой процедуре используется переменная T heD ate, которая хранит даты, записан­ ные в рабочем листе. Для инициализации переменной используется первый день текуще­ го месяца. В процессе выполнения цикла значение переменной T heD ate было введено вактивную ячейку, затем это значение было увеличено на единицу, после чего активизи­ руется следующая ячейка. Цикл выполняется до тех пор, пока значение месяца, присво­ енное переменной T heD ate, совпадет со значением месяца текущей даты. Результат выполнения следующей процедуры будет таким же, что и результат выпол­ нения процедуры E n t e r D a t e s l , но в данном случае используется вторая форма син­ таксиса цикла Do W hile, предусматривающая проверку условия в конце цикла. Sub E n te rD a te s 2 () ' цикл Do W h ile , условие пр ове р яется в конце Dim TheDate As D ate TheDate = D a t e S e r ia l( Y e a r ( D a t e ) , M o n th (D a te ), Do A c t iv e C e ll = TheD ate 1) Часть III. Visual Basic for Applications 250 TheD ate = TheD ate + 1 A c t i v e C e l l . O f f s e t (1, 0 ) . A c t iv a t e Loop W h ile M on th (T h e D a te ) = M o n th (D a te ) End Sub Ниже представлен пример цикла Do W h ile . Эта процедура открывает текстовый файл, считывает каждую строку и преобразует текст в символы верхнего регистра. Затем текст сохраняется на активном рабочем листе, начиная с ячейки А1 в направлении вниз до конца столбца. Данная процедура использует функцию VBA EOF, которая возвращает значение T ru e по достижении конца файла. Последний оператор закрывает текстовый файл. Sub D o W h ile D e m o l() Dim L in e C t As Long Dim L in e O fT e x t As S t r in g Open " c : \ d a t a \ t e x t f i l e . t x t " F o r In p u t As #1 L in e C t = 0 Do W h ile N o t E O F (l) L in e In p u t #1, L in e O fT e x t R ange( " A l " ) . O f f s e t ( L i n e C t , 0) = U C a s e (L in e O fT e x t) L in e C t = L in e C t + 1 Loop C lo s e #1 End Sub Перекрестная ссылка Дополнительные сведения о чтении и записи текстовых файлов с помощью VBA можно найти в главе 27. О Циклы Do W h ile также могут включать один или более операторов E x i t Do. По достижении оператора E x i t Do цикл завершается, а управление передается оператору, следующему за оператором L o o p . Циклы Do U n t i l Структура цикла Do U n t i l имеет много общего с конструкцией Do W h ile . Разни­ ца заключается лишь в том, как проверяется условие цикла. В варианте Do W h ile цикл выполняется до тех пор, пока выполняется условие. В цикле Do U n t i l цикл выполня­ ется, пока условие не станет выполняться. Структура Do U n t i 1 может быть представлена двумя вариантами синтаксиса. Do [ U n t i l у с л о в и е ] [инст рукции] [ E x it Do] [и н с т р у кц и и ] Loop или Do [ и н ст р ук ц и и ] [ E x it Do] [ и н ст р укц и и ] Loop [ U n t i l у с л о в и е ] Ниже показаны два примера кода, которые выполняют те же действия, что и рас­ смотренные ранее примеры циклов Do W h ile . Отличие между этими процедурами за­ ключается в месте проверки условия (в начале либо в конце цикла). Глава 8. Основы программирования на VBA 251 Sub E n te rD a te s 3 () 1 Цикл Do U n t i l , проверка условия в начале Dim TheD ate As D ate TheDate = D a t e S e r ia l( Y e a r ( D a t e ) , M o n th ( D a te ) , 1) Do U n t i l M o n th (T h e D a te ) <> M o n th (D a te ) A c t iv e C e ll = TheD ate T heD ate = TheD ate + 1 A c t i v e C e l l . O f f s e t (1, 0 ) . A c t iv a t e Loop End Sub Sub E n te rD a te s 4 () 1 Цикл Do U n t i l , проверка условия в конце Dim TheD ate As D ate TheDate = D a t e S e r ia l( Y e a r ( D a t e ) , M o n th (D a te ), 1) Do A c t iv e C e ll = TheD ate TheD ate = T heD ate + 1 A c t i v e C e l l . O f f s e t (1, 0 ) . A c t iv a t e Loop U n t i l M o n th (T h e D a te ) <> M o n th (D a te ) End Sub Следующий пример сначала использовал цикл Do W hile, но позднее был переписан с учетом применения цикла U nt i 1. В результате изменилась единственная строка, в ко­ торой находится оператор Do. Получился более “прозрачный” код, не требующий отри­ цательных значений переменной S te p , как было в примере с циклом Do W hile. Sub D o U n tilD e m o l () Dim L in e C t As Long Dim L in e O fT e x t As S t r i n g Open " c : \ d a t a \ t e x t f i l e . t x t " F o r In p u t As #1 Lin e C t = 0 Do U n t i l EOF(1) L in e In p u t #1, L in e O fT e x t R ange( " A l " ) . O f f s e t ( L in e C t , 0) = U C a s e (L in e O fT e x t) L in e C t = L in e C t + 1 Loop Close #1 End Sub Примечание В VBA используется еще один вид цикла, w h ile Wend. Эта циклическая структура была включена в целях обеспечения совместимости и вряд ли вы встретите ее на практике. Ниже приведен код процедуры ввода данных, в котором используется цикл W h ile Wend. Sub E n te r D a te s 5 () Dim TheD ate As D ate TheD ate = D a t e S e r ia l( Y e a r ( D a t e ) , M o n th (D a te ), W h ile M o n th (T h e D a te ) = M o n th (D a te ) A c t iv e C e ll = TheD ate TheD ate = TheD ate + 1 A c t i v e C e l l . O f f s e t (1, 0 ) . A c t iv a t e Wend End Sub 1) Глава Работа с процедурами VBA Вэтой главе... ♦ ♦ ♦ ♦ ♦ О процедурах Выполнение процедуры Передача аргументов процедурам Обработка ошибок Реальный пример Процедура содержит группу операторов VBA, которые решают поставленную задачу. Большая часть кода VBA содержится в процедурах. Данная глава посвящена процедурам (Sub), которые выполняют действия, но не возвращают дискретных значений. Опроцедурах Процедура— это последовательность операторов VBA, расположенная в модуле VBA, доступ к которому можно получить с помощью VBE. Модуль может включать лю­ бое количество процедур. Существует несколько способов вызвать, или выполнить, процедуры. Процедура вы­ полняется от начала до конца (этот процесс также можно прервать). Совет Процедура может иметь любую длину, но многие пользователи не любят слишком длинных процедур, которые выполняют множество операций. Возможно, проще написать несколько коротких процедур, каждая из кото­ рых выполняет свою задачу, а затем создать главную процедуру, которая вызывает меньшие процедуры. Подобный подход упростит дальнейшее управление программой. Часть III. Visual Basic for Applications 254 Некоторые процедуры получают аргументы. Аргумент — это информация, исполь­ зуемая процедурой в процессе выполнения. Аргументы процедуры во многом подобны аргументам, используемым функциями Excel. Инструкции в процедуре обычно выпол­ няют логические операции над аргументами, а результаты процедуры обычно основаны на представляемых ей значениях аргументов. © Перекрестная ссылка VBA также поддерживает процедуры-функции (Function), которые будут рас­ смотрены в главе 10. В главе 11 вы найдете ряд дополнительных примеров процедур, как Sub, так и F u n c tio n , которые можно использовать в собст­ венных целях. Объявление процедуры Sub При объявлении процедуры с использованием ключевого слова Sub применяется следующий синтаксис. [ P r iv a t e | P u b lic ] [ S t a t i c ] [и н ст рукц ии] [ E x it Sub] Sub и м я { [ с п и с о к _ а р г у м е н т о в ] ) [и н с т р у кц и и ] End Sub • P r i v a t e (необязательное ключевое слово). Указывает на то, что процедура до­ ступна только для других процедур в том же модуле. • P u b l ic (необязательное ключевое слово). Указывает на то, что процедура до­ ступна для всех остальных процедур во всех модулях рабочей книги. При исполь­ зовании в модуле, содержащем оператор O p tio n P r i v a t e M odule, процедура будет недоступна за пределами проекта. • S t a t i c (необязательное ключевое слово). Указывает на то, что переменные про­ цедуры сохраняются после окончания процедуры. • Sub (обязательное ключевое слово). Обозначает начало процедуры. • Имя. • С п и с о к _ а р г у м е н т о в . Представляет заключенный в скобки список переменных, содержащих аргументы, которые передаются в процедуру. Для разделения аргу­ ментов используется запятая. Если процедура не использует аргументы, то необ­ ходимо включить в объявление процедуры пустые скобки. • И нст рукции • E x i t Sub (необязательный оператор). Вызывает немедленный выход из проце­ дуры до ее формального завершения. • End Sub (обязательный оператор). Указывает на завершение процедуры. Любое корректное название процедуры. (необязательные). Корректные инструкции VBA. Название процедуры Каждой процедуре нужно присвоить имя. Правила именования процедур в основном те же, что и именования переменных. В идеальном случае название процедуры должно описывать, что выполняют содержащиеся в ней операторы. Лучше всего использовать имена, включающие глагол и существительное (например, P rocessD ate, P rin tR e p o rt, Глава 9. Работа с процедурами VBA 255 Sort A r r a y либо C heckFilenam e). Избегайте бессмысленных названий типа D o lt, Up­ date И F ix . Некоторые программисты используют названия, которые напоминают предложе­ ния, описывающие процедуру (например, W r ite R e p o r tT o T e x tF ile — записать отчет втекстовый файл, G e t_ P r in t_ O p tio n s _ a n d _ P r in t_ R e p o r t — получить параметры печати и напечатать отчет). Примечание За некоторыми исключениями, все инструкции VBA, находящиеся в модуле, должны содержаться в процедурах. Исключения касаются объявления пе­ ременных уровня модуля, определения пользовательских типов данных, а также некоторых других инструкций, которые определяют параметры на уровне модуля (например, O p tio n E x p l i c i t ) . Область действия процедуры В предыдущей главе отмечалось, что область действия переменной определяется мо­ дулями и процедурами, в которых может использоваться переменная. Аналогичным об­ разом область действия процедуры определяет, какие процедуры могут ее вызывать. Процедуры типа Public По умолчанию все процедуры имеют область действия P u b lic , т.е. могут быть вы­ званы другими процедурами в любом модуле рабочей книги. При этом ключевое слово Public применять необязательно, хотя программисты включают его для ясности. При­ веденные ниже процедуры имеют область действия P u b lic . Sub F ir s t () ' ... [код процедуры] End Sub Public Sub Second () ' ... [код процедуры] End Sub Процедуры типа P rivate Процедуры типа P r i v a t e могут быть вызваны другими процедурами в этом же мо­ дуле, но не процедурами других модулей. Примечание В диалоговом окне Макрос (Macro) отображаются только процедуры уровня P u b lic . Следовательно, если имеются процедуры, которые предназначены для вызова другими процедурами в этом же модуле, необходимо объявить их как P r iv a t e . Благодаря этому предотвращается возможность их запуска из диалогового окна Макрос (Macro). В следующем примере объявляется процедура типа P r i v a t e с именем MySub. Private Sub MySub () ' ... [код процедуры] End Sub 256 Часть III. Visual Basic for Applications Совет Всем процедурам модуля можно назначить область действия P r iv a t e , да­ же если они объявлены с помощью ключевого слова P u b lic . Для этого пе­ ред первым оператором процедуры помещается следующая конструкция: O p tio n P r iv a t e M odule Если этот оператор добавлен в модуль, можно изъять ключевое слово P r i ­ v a te из объявления процедуры. Функция записи макросов Excel обычно создает процедуры с названием Макрос1, Макрос2 и т.д. Все эти процедуры имеют область действия P u b lic и не имеют аргументов. Выполнение процедуры Далее представлены некоторые способы выполнения, или вызова, процедуры VBA. • С помощью команды Run^Run Sub/UserForm (Выполнить^Выполнить проце­ дуру/пользовательскую форму) (в VBE). Альтернатива — нажать <F5> либо вос­ пользоваться кнопкой Run Sub/UserForm панели инструментов Standard (Стандартная). • Из диалогового окна Макрос (Macro) в Excel. • С помощью комбинации клавиши <Ctrl> и присвоенной процедуре клавиши (если процедуре присвоена комбинация клавиш). • Щелкнув на кнопке или форме рабочего листа. Для этого кнопке или форме долж­ на быть присвоена процедура. • Из другой процедуры. Процедуры Sub и F u n c tio n могут вызывать другие про­ цедуры. • С помощью пользовательского элемента управления, находящегося на ленте. Кроме того, встроенные элементы управления ленты могут быть “перенастроены” для вызова макроса на выполнение. • Из пользовательского контекстного меню. • После выполнения определенного события. Такими событиями могут выступать открытие рабочей книги, сохранение рабочей книги, закрытие рабочей книги, из­ менение ячейки, переход на другой рабочий лист и многие другие. • Из окна отладки (Immediate) в VBE. Просто введите название процедуры, укажите все необходимые аргументы и нажмите клавишу <Enter>. Рассмотренные методы запуска процедур подробно обсуждаются в следующих разделах. Примечание Во многих случаях процедура не будет работать правильно, если она не вы­ полняется в подходящем контексте. Например, если процедура ориентиро­ вана на работу с активным рабочим листом, она выдаст сообщение об ошибке (если в качестве активного выбран лист диаграммы). Хорошая про­ цедура включает код, который выполняет проверку контекста, и вместо со­ общения об ошибке учтиво сообщает о завершении своей работы. Глава 9. Работа с процедурами VBA 257 Выполнение процедуры с помощью команды Run Sub/UserForm Команда меню Run^Run Sub/UserForm (Выполнить«=>Выполнить процедуру/поль­ зовательскую форму) в VBE используется преимущественно для тестирования процеду­ ры в процессе ее разработки. Пользователь вряд ли станет активизировать редактор Visual Basic, чтобы запустить процедуру. Выберите команду Run«=>Run Sub/UserForm (или нажмите клавишу <F5>) в VBE, чтобы выполнить текущую процедуру (другими словами, процедуру, в которой расположен курсор). Если курсор во время выбора команды Run^Run Sub/UserForm находится не в од­ ной из процедур, то VBE отображает диалоговое окно Макрос (Macro), в котором можно выбрать процедуру для выполнения. Выполнение процедуры в диалоговом окне Макрос После выбора команды Excel Разработчика Код1 ^ Макросы (Developer^Code1^ Macros) отображается диалоговое окно Макрос (Macro), показанное на рис. 9.1. (Для по­ лучения доступа к этому окну нажмите клавиши <Alt+F8>.) В списке Находится в (Macros In) находится область, в которой нужно выбрать отображаемый макрос (например, можно выбрать отображение макросов, находящихся в активной рабочей книге). Рис. 9.1. Диалоговое окно Макрос В диалоговом окне Макрос (Macro) не отображается следующее: • процедуры Sub, которые объявлены с помощью ключевого слова P r i v a t e ; • процедуры Sub, которые требуют одного или более аргументов; • процедуры Sub, включенные в состав надстроек. Л Ь я 93ak. 3107 Совет Хотя процедуры, находящиеся в надстройках, не отображаются в диалоговом окне Макрос (Macro), их можно вызывать на выполнение, если известно имя процедуры. Просто укажите это имя в поле Имя макроса (Macro Name), кото­ рое находится в диалоговом окне Макрос (Macro), и щелкните на кнопке Вы­ полнить (Run). Часть III. Visual Basic for Applications 258 Выполнение процедуры с помощью комбинации клавиш Любой процедуре, не имеющей аргументов, можно присвоить комбинацию <Ctrl+ специальная клавигиа>. Например, если вы присвоите процедуре с названием U p d a te C u s to m e r L is t комбинацию клавиш <Ctrl+U>, то после нажатия <Ctrl+U> она будет выполняться. В начале записи макроса вам предоставляется возможность задать комбинацию кла­ виш, которая будет использоваться для его выполнения. Ее можно присвоить в любое удобное для вас время. Чтобы присвоить процедуре комбинацию клавиш (или изменить уже существующую), выполните следующие действия. 1. Вызовите Excel и выберите команду Разработчик^Код1^ Макросы (Developer1^ Code ^Macros). Jjxj 2. Выберите требуемую процедуру в списке, П а ра м е тры м акроса макроса отображаемом в диалоговом окне Макрос ИмяCapyMiiepteSdectJon (Macro). Сочетание клавиш: ш+г 3. Щелкните на кнопке Параметры (Options) для отображения диалогового окна Пара­ Описание; метры макроса (Macro Options) (рис. 9.2). 4. Введите символ в поле Ctrl+. Примечание. Символ, вводимый в тексто­ вое поле Ctrl+, чувствителен к изменению регистра символов. Если ввести символ s Рис. 9.2. В диалоговом окне Параметры (нижний регистр), будет присвоена комби­ макроса (Macro Options) процедуре нация клавиш <Ctrl+S>. Если же ввести можно присвоить комбинацию клавиш и (дополнительно) описание символ S (верхний регистр), будет назначе­ на комбинация клавиш <Ctrl+Shift+S>. 5. Введите описание (необязательно). Если описание было введено, оно отобразится в нижней части диалогового окна Макрос (Macro) после выбора процедуры в списке. 6. Щелкните на кнопке ОК для закрытия диалогового окна Параметры макроса и щелкните на кнопке Закрыть (Close) для закрытия диалогового окна Макрос (Macro). Предупреждение Если процедуре назначается одна из предопределенных комбинаций кла­ виш Excel, ваша команда получает приоритет над этой предопределенной комбинацией. Например, комбинация клавиш <Ctrl+S> соответствует ко­ манде сохранения активной рабочей книги в Excel. Но если присвоить эту комбинацию клавиш процедуре, то после нажатия клавиш <Ctrl+S> активная книга больше сохраняться не будет. О Совет В Excel 2010 не используются следующ ие клавиши в комбинации <Ctrl+ клавиша>: Е, J, М и Q. В Excel практически не применяются комбинации кла­ виш <СХг\+ЭЬ\^+клавиша>, поэтому можно использовать любые из них, за исключением F, L, N, О, P n W . Глава 9. Работа с процедурами VBA 259 Выполнение процедуры с помощью ленты Если вы хотите достичь цели, не прилагая больших усилий, можете написать код XML, выполняющий добавление новой кнопки (либо другого элемента управления) на ленту, а также присвоить макросу этот элемент управления. Обратите внимание, что из­ менение ленты осуществляется без помощи Excel и VBA. Новинка Пользователи Excel 2010 могут изменять ленту с помощью возможности, предоставляемой самой Excel. Теперь можно добавить произвольный эле­ мент управления на ленту, а затем назначить ему макрос. Перекрестная ссылка Обратитесь к главе 22 для получения дополнительных сведений о настройке ленты. Выполнение процедуры из пользовательского контекстного меню Макрос может быть выполнен путем щелчка мышью на элементе контекстного меню. Это меню отображается после щелчка правой кнопкой мыши на объекте или диапазоне Excel. Перекрестная ссылка Дополнительные сведения о контекстных меню можно найти в главе 23. Выполнение процедуры из другой процедуры Один из самых популярных способов выполнить процедуру — вызвать ее из другой процедуры. Для этого существует три способа: • ввести название процедуры и необходимые аргументы этой процедуры (если они есть) через запятую; • ввести ключевое слово C a ll, после него— название процедуры и ее аргументы (если они есть), заключенные в скобки и разделенные запятыми; • использовать метод Run объекта A p p l i c a t i o n . Этот метод можно применять для выполнения других процедур VBA или макросов XLM. Метод Run полезен, когда выполняется процедура, название которой присвоено переменной. Тогда переменную можно передать в метод Run как аргумент. В следующем примере показан первый метод. В данном случае процедура MySub выполняет некоторые операторы (не показанные в примере), запускает процедуру Up­ date S h e e t и затем выполняет остальные операторы. Sub M ySub () ' . . . [код ] U p d a te S h e e t ' . . . [к од ] End Sub 260 Часть III. Visual Basic for Applications S u b U p d a t e S h e e t () ' . . . [к о д ] End Sub Далее представлен второй метод. Ключевое слово Call вызывает процедуру Update, имеющую один аргумент; вызывающая процедура передает аргумент в вызываемую процедуру. Аргументы процедур рассматриваются далее. S u b M y S u b () M o n th N u m = I n p u t B o x ( "В в е д и те номер м е с я ц а : C a l l U p d a te S h e e t(M o n th N u m ) ' ... [к о д ] End Sub ") Sub U p d a te S h e e t(M o n th S e q ) ' . . . [к о д ] End Sub Совет Некоторые программисты всегда используют ключевое слово C a l l , чтобы явно указать на вызов другой процедуры, хотя это действие необязательно. В следующем примере используется метод Run, выполняющий процедуру Up­ dateSheet и передающий MonthNum в качестве аргумента. S u b M y S u b () M o n th N u m = I n p u t B o x ( "В в е д и те номер м е с я ц а : A p p l i c a t i o n . R u n " U p d a t e S h e e t " , M o n th N iim ' . . . [код] End Sub ") Sub U p d a te S h e e t(M o n th S e q ) ' . . . [код] End Sub Возможно, главной причиной использования метода Run является присвоение назва­ ния процедуры переменной. Существует только один способ выполнить процедуру та­ ким образом (см. следующий пример). Процедура Main использует функцию VBA WeekDay для определения дня недели (целое число от 1 до 7, начиная с воскресенья). Переменной SubToCall присваивается строка, содержащая название процедуры. Затем метод Run вызывает соответствующую процедуру (WeekEnd или Daily). S u b M a i n () D im S u b T o C a ll A s S t r i n g S e l e c t C a s e W e e k D a y (N o w ) C a s e 1 , 7 : S u b T o C a l l = "W e e k E n d " C a s e E ls e : S u b T o C a ll = " D a ily " End S e le c t A p p l i c a t i o n . R u n S u b T o C a ll End Sub S u b W e e k E n d () M s g B o x "С е го д н я выходной д е н ь " ' К о д , которы й в ы п о л ня ется в выходной End Sub S u b D a i l y () M s g B o x "С е го д н я б уд н и й д е н ь " Глава 9. Работа с процедурами VBA 261 1 К од, которы й вы п о л ня ется в б уд н и й день End S u b Вызов процедуры из другого модуля Если VBA не может найти вызываемую процедуру в текущем модуле, он ищет про­ цедуры P u b l ic в других модулях этого же проекта. При вызове процедуры P r i v a t e из другой процедуры обе они должны находиться в одном модуле. Следует отметить, что в одном модуле не может быть двух процедур с одинаковыми на­ званиями, не допускается также использование процедуры с идентичными именами в разных модулях. Можно указать VBA выполнить неоднозначно названную процедуру, т.е. другую процедуру с тем же названием, но в другом модуле. Для этого введите перед названием про­ цедуры название модуля и точку. Предположим, вы создали процедуры с названием MySub вдвух модулях: M odulel и Module2. Если требуется, чтобы процедура MySub в Module2 вызывала MySub из M odulel, то используйте один из следующих операторов. M o d u le l. M y S u b C a ll M o d u l e l . M y S u b Если вы не укажете разницу между процедурами с одинаковыми названиями, будет отображено сообщение об ошибке: A m biguous Name D e t e c t e d (Обнаружено неод­ нозначное имя). Вызов процедуры из другой рабочей книги В некоторых случаях необходимо, чтобы процедура выполняла иную процедуру, опреде­ ленную в другой рабочей книге. Для этого существует два варианта: установить ссылку на другую рабочую книгу или использовать метод Run и явно указать название рабочей книги. Чтобы добавить ссылку на другую рабочую книгу, выберите в VBE команду Tooted References (Сервис=>Ссылки). Будет отображено диалоговое окно References (Ссылки), как показано на рис. 9.3, в котором перечислены все существующие ссылки во всех от­ крытых рабочих книгах. Выставьте флажок, соответствующий той рабочей книге, на ко­ торую вы планируете добавить ссылку, и щелкните на кнопке ОК. После установки ссылки процедуры в этой рабочей книге можно вызывать так, будто они находятся в те­ кущей рабочей книге, к которой принадлежит вызывающая процедура. Рабочая книга, на которую ссылаются, не обязательно должна быть открыта — она рас­ сматривается как отдельная библиотека объектов. Используйте кнопку Browse (Просмотр) вдиалоговом окне References, чтобы установить ссылку на закрытую рабочую книгу. © Примечание Названия книг, которые указаны в списке ссылок соответствуют названиям проектов VBE. По умолчанию каждый проект обычно называется V B A P r o j e c t . Следовательно, в списке может содержаться несколько одинаково на­ званных элементов. Чтобы отличить определенный проект от других эле­ ментов в списке, измените его название в окне Properties (Свойства) редак­ тора VBE. Щ елкните на имени проекта в окне Project (Проект) и выберите команду Tools^ ххх Properties (Сервисах** Свойства), где ххх — это имя те­ кущего проекта. Находясь в диалоговом окне Project Properties (Свойства проекта), щелкните на вкладке General (Общие) и измените имя, отобра­ жаемое в поле Project Name (Имя проекта). 262 Часть III. Visual Basic for Applications *J R e fe ren ce s - V BA Project Available References: Vj Visual Baste For Applications 0 Microsoft Excel 14.0 Object Library H o l e Automation a— П AcrobatPDFMaker □ □ □ □ □ □ □ □ AdobePDFMakerX Microsoft Forms 2.0 Object Library PUP7TRIAL SGHenus IAS Helper COM Component 1,0 Type Ubrary IAS RADIUS Protocol 1.0 Type Library Acrobat Acrobat Access 2.0 Type Library < r batDiS* ' Priority Help *1 jJf? i - Microsoft Office 14.0 Object Ubrary — *1 ---------- :------------:------------------- ------- : Location: C: 'Program FSesVCommon FtesV^KTOsoft Shared YDFFICE 14\M Language: Standard Рис. 9.3. В диалоговом окне References можно уста­ новить ссылку на другую рабочую книгу Список ссылок, который отображается в диалоговом окне R e fe re n ce s, включает также библиотеки объектов и элементы управления ActiveX, зарегистрированные в ва­ шей системе. Рабочие книги Excel 2010 всегда включают ссылки на следующие библио­ теки объектов: • Visual Basic for Applications; • Microsoft Excel 14.0 Object Library; • OLE Automation; • Microsoft Office 14.0 Object Library; • Microsoft Forms 2.0 Object Library (необязательно; включается в случае, если в проекте присутствует пользовательская форма (UserForm)). Примечание Любые дополнительные ссылки, которые вы добавите, включаются в струк­ туру проекта в окне Project Explorer редактора VBE. Эти ссылки перечислены в узле References. Если была установлена ссылка на рабочую книгу, которая содержит процедуру Y ourSub, то можете использовать один из следующих операторов для вызова YourSub. Y o u rS u b C a ll Y o u rS u b Чтобы точно идентифицировать процедуру в другой рабочей книге, задайте имя про­ екта, название модуля и имя процедуры, придерживаясь такого синтаксиса: M y P r o j e c t . M y M o d u le . M y S u b Можно также использовать ключевое слово C a ll. C a l l M y P r o j e c t . M y M o d u le . M y S u b Причины вызова других процедур У начинающих програм м истов нередко вызывает удивление использование м ето­ да, подразумеваю щ его вызов процедур из других процедур. Вы можете спросить: Глава 9. Работа с процедурами VBA 263 “Не проще ли поместить вызываемую процедуру в вызывающую, упростив тем сам ы м себе жизнь?” Это делает программу более понятной. Чем проще программа, тем легче ее под­ держивать и изменять. Меньш ие по размеру процедуры проще понять и отладить. Р а с­ смотрим процедуру, которая лишь вызывает другие процедуры и не выполняет никаких других действий. Разобраться в ней очень легко. Sub M a in () C a l l G e t U s e r O p t io n s C a ll P ro c e s s D a ta C a l l C le a n u p C a l l C lo s e lt D o w n End Sub Вызов других процедур также позволяет избежать повторного ввода кода. Предпо­ ложим, что операция выполняется в различных местах процедуры. Вм есто того чтобы вводить этот код десять раз, можно написать процедуру, выполняющую необходимую операцию, а затем просто ее вызвать десять раз. Кроме того, вы будете часто обращаться к процедурам универсального назначения. Сохранив их в отдельном модуле, вы сможете импортировать модуль в текущий проект, и при необходимости вызывать эти процедуры. Это значительно проще, чем копиро­ вать и вставлять код в новые процедуры. Зачастую создание нескольких небольших процедур вместо одной большой счита­ ется хорошей практикой программирования. Модульный подход не только повышает эффективность работы, но и облегчает жизнь тем людям, которые будут впоследствии работать с вашей программой. Существует еще один способ вызвать процедуру в другой открытой рабочей книге — ис­ пользовать метод Run объекта Application. Этот метод не требует установки ссылки, но содержащая процедуру рабочая книга должна быть открыта. Следующий оператор вызывает процедуру Consol idatе, которая находится в рабочей книге budget macros .xlsm: A p p lic a t io n . Run " 'b u d g e t m a c ro s .x ls m '! C o n s o lid a t e " Выполнение процедуры по щелчку на объекте Excel содержит ряд объектов, которые можно поместить на рабочем листе или листе диаграммы. Макрос допускается связывать с любым из них. Эти объекты делятся на сле­ дующие категории: • элементы управления ActiveX; • элементы управления формами; • включенные объекты (фигуры, рисунки SmartArt, формы WordArt, диаграммы и рисунки). Примечание В раскрывающемся списке, вызываемом по команде Разработчик^Элемен­ ты управлениям Вставить (Developer^ Controls^ lnsert), находятся два вида элементов управления, которые можно вставлять на рабочий лист: элем ен­ ты управления ф ормами и элементы управления ActiveX. Элементы управ­ ления ActiveX подобны элементам управления, применяемым в пользова­ тельских формах (UserForm). Элементы управления ф ормами были р а зр а ­ ботаны для версий Excel 5 и Excel 95, но они могут применяться и в более Часть III. Visual Basic for Applications 264 поздних версиях (и в некоторых случаях являются предпочтительными). В отличие от элементов управления формами, элементы управления ActiveX не могут применяться для вызова произвольного макроса. Они предназна­ чены для вызова на выполнение макросов специального вида. Например, если на ф орму добавить элемент управления ActiveX (кнопку) под названием C o m m a n d B u tto n i, после щелчка на ней вызывается макрос c o m m a n d B u tt o n i c i i c k , который находится в модуле кода рабочего листа, на котором находится элемент управления. Дополнительные сведения о применении элементов управления на рабочих листах можно найти в главе 13. Чтобы связать процедуру с объектом B u tto n (Кнопка), который находится на пане­ ли инструментов Формы (Form), выполните следующие действия. 1. Выберите команду Разработчик^Элементы управления^Вставить (Developer^ Controls ^Insert) и щелкните на кнопке в группе Элементы управления формы (Form Controls). 2. Щелкните на рабочем листе для создания кнопки. Для изменения размера кнопки, заданного по умолчанию, перетащите указатель мыши на рабочем листе. Excel сразу же отображает диалоговое окно Назначить макрос (Assign Macro) (рис. 9.4). Пользователю предлагается воспользоваться макросом, основанным на названии кнопки. 3. Выберите или введите имя макроса, который будет связан с кнопкой, и щелкните на кнопке ОК. Рис. 9.4. Назначение макроса кнопке Для изменения назначенного ранее макроса щелкните на кнопке правой кнопкой мыши и выберите команду Назначить макрос (Assign Macro). Для связывания макроса с фигурой, рисунком SmartArt, формой Word Art, диаграм­ мой либо рисунком щелкните правой кнопкой мыши на объекте и в контекстном меню выберите команду Назначить макрос (Assign Macro). Глава 9. Работа с процедурами VBA 265 Выполнение процедуры по событию Некоторые процедуры должны выполняться, если в системе (программе) происходит определенное событие. Это может быть открытие рабочей книги, ввод данных в рабочий лист, сохранение книги, щелчок на элементе управления CommandButton и многое другое. Процедура, которая выполняется, когда происходит какое-либо событие, называ­ ется обработкой события. Процедуры обработки событий характеризуются общими свойствами: • имеют специальные названия, состоящие из имени объекта, символа подчеркива­ ния и названия события; например, процедура, которая выполняется при открытии рабочей книги, называется W orkbook_Open; • хранятся в окне кода для определенного объекта. Перекрестная ссылка Процедуры обработки событий описываются в главе 19. Выполнение процедуры в окне отладки Процедуру можно также выполнить, введя ее название в окне отладки (Immediate) программы VBE. Если это окно в данный момент не отображено, нажмите <Ctrl+G>. Окно отладки выполняет операторы VBA, которые вы вводите в его области. Чтобы вы­ полнить процедуру, достаточно ввести название процедуры в окне отладки и нажать кла­ вишу <Enter>. Этот метод часто применяется при разработке процедуры, поскольку в окне отладки можно вводить непосредственные команды, чтобы сразу же увидеть результат их выпол­ нения. Продемонстрируем этот прием. Sub C h a n g e C a s e () Dim M y S t r i n g A s S t r i n g M y S t r in g = " Э т о т е с т " M y S t r in g = U C a s e ( M y S t r in g ) D ebug. P r i n t M y S t r in g End Sub На рис. 9.5 показан результат выполнения процедуры ChangeCase в окне отладки. Оператор Debug.Print немедленно отобразит его. Передача аргументов процедурам Аргументы обеспечивают процедуру данными, использующимися в ее инструкциях. Аргумент может передавать следующие данные: • переменная; • константа; • массив; • объект. Часть III. Visual Basic for Applications 266 '■Щ Щ ЛЬ A *. & В ■*) О* ►iJ j ftg & J ar - О fit* Jftew |mert ai ^ Farmat 1 Qfbug Run Jools Window Введите вопрос Це1р j(General)5 TP |ChangeCase * Sub C h a n g e C a s e () Dim M y S tr in g A s S t r i n g M y S tr in g = "Это т е с т " M y S tr in g = U C a s e (M y S tr in g ) D e b u g .P r in t M y S tr in g End Sub ЛистЗ (ЛистЗ) ЭтаКнига El ё э Modules « $ Modulel 8 ____j J 1 ch an gecase ЭТО ТЕСТ J 2J1*L___ 1 J Рис. 9.5. Выполнение процедуры после ввода ее имени в окне отладки Что касается аргументов, процедуры подобны функциям Excel в следующем: • процедура может не принимать аргументы; • процедура может иметь фиксированное количество аргументов; • процедура может иметь неопределенное количество аргументов; • не все аргументы процедуры являются обязательными; • все аргументы могут быть необязательными. Например, существует несколько функций Excel, не имеющих аргументов (например, СЛЧИС или ТДАТА). Другие функции (такие, как СЧЁТЕСЛИ) принимают два аргумента. Функции еще одной группы (например, СУММ) могут иметь до 255 аргументов. Некото­ рые функции Excel имеют необязательные аргументы. Например, функция ПЛТ может иметь пять аргументов (три обязательных и два необязательных). Большинство процедур, с которыми вы сталкивались ранее, объявлялись без аргумен­ тов: вводилось ключевое слово Sub, после которого указывались название процедуры и пустые скобки. Пустые скобки означают, что процедура не имеет аргументов. В примере, приведенном далее, отображаются две процедуры. Процедура Main вы­ зывает процедуру ProcessFile трижды (оператор Call задается в цикле For-Next). Однако перед вызовом ProcessFile создается трехэлементный массив. Внутри цикла каждый элемент массива становится аргументом вызываемой процедуры. Процедура ProcessFile принимает один аргумент (с названием TheFile). Обратите внимание, что аргумент указывается в скобках в операторе Sub. После выполнения ProcessFile программа продолжается с оператора, указанного после оператора Call. S u b M a i n () D im F i l e ( l T o 3) A s S t r i n g D im i a s I n t e g e r F i l e ( l ) = " d e p t l. x ls x " F i l e (2) = " d e p t 2 . x l s x " Глава 9. Работа с процедурами VBA 267 F ile ( 3 ) = " d e p t 3 . x ls x " F o r i = 1 To 3 C a ll P r o c e s s F ile ( F ile ( i ) ) N ext i End S ub Sub P r o c e s s F i l e ( T h e F i l e ) W o r k b o o k s . O p e n F i l e N a m e : = T h e F ile ' . . . [ код] End Sub Конечно, вы всегда можете передавать в процедуру текст (не переменные). Sub M a in () C a ll P r o c e s s F ile ( " b u d g e t.x l s x " ) End Sub Используются два способа передачи аргументов процедуре. • По ссылке. При передаче аргумента по ссылке (метод, применяемый по умолча­ нию) процедуре передается адрес ячейки памяти, в которой хранится переменная. Поэтому изменение аргумента в процедуре приводит к изменению исходной пе­ ременной. • По значению. Передача аргумента по значению фактически означает передачу процедуре копии исходной переменной. Следовательно, изменение аргумента при выполнении процедуры не отражается на исходной переменной. Следующий пример подтверждает высказанную концепцию. Аргумент процедуры Process передается по ссылке (по умолчанию). После того как процедура Main присваи­ вает переменной MyValue значение 10, она вызывает процедуру Process и передает MyValue в качестве аргумента. Процедура Process умножает значение своего аргумента (сназванием YourValue) на 10. По окончании процедуры Process возобновляется вы­ полнение процедуры Main, а функция MsgBox отображает строку MyValue : 100. Sub M a in () Dim M y V a lu e A s I n t e g e r M y V a lu e = 1 0 C a l l P r o c e s s ( M y V a lu e ) M sgB ox M y V a lu e End Sub Sub P r o c e s s ( Y o u r V a lu e ) Y o u r V a lu e = Y o u r V a lu e End Sub * 10 Если требуется, чтобы вызываемая процедура не изменяла переменные, полученные как аргументы, измените список аргументов вызываемой процедуры так, чтобы аргументы пе­ редавались по значению, а не по ссылке. Для этого добавьте перед аргументом ключевое слово ByVal. Тогда вызываемая процедура будет управлять копией переданных данных, а не самими данными. В следующей процедуре, например, изменения, которые происходят с YourValue в процедуре Process, не влияют на значение переменной MyValue в про­ цедуре Main. В результате функция MsgBox отображает 10, а не 100. Sub P r o c e s s ( B y V a l Y o u r V a lu e ) Y o u r V a lu e = Y o u r V a lu e * 10 End Sub 268 Часть III. Visual Basic for Applications В большинстве случаев вполне подходит метод, используемый по умолчанию, — пе­ редача аргументов по ссылке. Однако если процедура призвана изменить данные, кото­ рые передаются ей в виде аргументов, а первоначальные данные должны остаться неиз­ мененными, то необходимо использовать передачу данных по значению. Аргументы процедуры могут быть самыми разными и передаваться и по значению, и первым способом. Все аргументы, перед которыми указано ключевое слово ByVal, передаются по значению, остальные — по ссылке. Примечание Если в процедуре применена переменная с пользовательским типом дан­ ных, то ее нужно передавать по ссылке. При попытке передать ее по значе­ нию происходит ошибка. Переменные типа P u b l i c и передача аргументов процедуре В главе 8 уже отмечалось, что переменная типа P u b l i c (определенная в верхней части модуля) будет доступной для всех процедур этого модуля. В некоторых случаях предпочтительнее пользоваться переменной типа P u b l i c , чем передавать переменную в виде аргумента при вызове другой процедуры. Например, приведенная ниже процедура передает значение M o n t h v a l процедуре P ro c e s s M o n th . S u b M y S u b () D im M o n t h V a l a s I n t e g e r ■ . . . [к о д ] M o n th V a l = 4 C a l l P r o c e s s M o n t h ( M o n t h V a l) ' . . . [к о д ] End Sub Альтернативный метод выглядит следующ им образом. P u b lic M o n th V a l a s In te g e r S u b M y S u b () ' . . . [к о д ] M o n th V a l = 4 C a l l P ro c e s s M o n th 2 1 . . . [код] E n d Sub Во втором фрагменте кода, из-за того что M o n t h v a l является переменной типа P u b l i c , процедура P r o c e s s M o n t h 2 имеет к ней доступ, поэтому необходимость в ар­ гументах для этой процедуры отпадает. Так как в предыдущих примерах не был объявлен тип данных ни для одного аргумен­ та, все аргументы имеют тип данных Variant. Но процедура может определять типы данных непосредственно в списке аргументов. Ниже представлен оператор Sub для про­ цедуры с двумя аргументами, имеющими различные типы данных. Первый аргумент объявлен как Integer, второй — как String. Sub P r o c e s s ( I t e r a t io n s As In te g e r, T h e F ile As S t r in g ) При передаче аргументов в процедуру важно, чтобы данные, которые передаются в качестве аргументов, имели тип данных аргументов. Например, в предыдущем примере Глава 9. Работа с процедурами VBA 269 при вызове Process и передаче в качестве первого аргумента переменной типа String отображается сообщение об ошибке ByRef argument type mismatch. Примечание Аргументы имеют как обычные процедуры, так и функции. На практике чаще всего аргументы используются функциями. Этот вид процедур рассм атри­ вается в главе 10, где вы найдете дополнительные примеры использования аргументов в процедурах, а также описание необязательных аргументов. Обработка ошибок Вы, конечно же, догадываетесь, что при выполнении процедуры VBA могут происхо­ дить ошибки: синтаксические (которые необходимо исправить перед тем, как выполнять процедуру) и ошибки выполнения (они происходят в процессе выполнения процедуры). В этом разделе рассматривается вторая группа ошибок. © Предупреждение Для обработки ошибок отключите параметр Break on All Errors (Останав­ ливаться при любой ошибке). Для этого в окне редактора V B E выберите ко­ манду Tools^Options (Сервис«=>Параметры) и щелкните на вкладке General (Общие) в диалоговом окне Options (Параметры). Если параметр Break on All Errors установлен, VBA игнорирует код обработки ошибок. Поэтому обычно используется параметр Break on Unhandled Errors (Останавливаться при не­ обработанных ошибках). Как правило, ошибка в процессе выполнения вызывает остановку программы VBA, а пользователь видит диалоговое окно, в котором отображаются номер и описание ошибки. В хорошо написанном приложении вы не столкнетесь с такими служебными со­ общениями, поскольку в приложение включены специальные процедуры, перехваты­ вающие ошибки и выполняющие соответствующие действия. В крайнем случае про­ грамма обработки ошибок отображает для пользователя более значимое сообщение об ошибке, чем представленное VBA. © Перекрестная ссылка Все коды ошибок VBA и их описания приведены в приложении В. Перехват ошибок Чтобы указать. программе, что должно произойти при возникновении ошибки, ис­ пользуется оператор On Error. Вы вправе выбрать один из двух вариантов. • Проигнорировать ошибку и позволить VBA продолжить выполнение про­ граммы. После этого можно проанализировать объект Err, чтобы узнать, какая ошибка произошла, и при необходимости принять меры для ее предотвращения. • Перейти к специальному разделу кода для обработки ошибок, чтобы выпол­ нить необходимые действия. Этот раздел вводится в конце процедуры и обозна­ чается специальной меткой. 270 Часть III. Visual Basic for Applications Чтобы программа продолжала выполняться после возникновения ошибки, необходи­ мо вставить в код следующий оператор: On E r r o r R e su m e N e x t Некоторые ошибки несущественны, и их можно просто игнорировать. Однако сначала следует определить, какая ошибка произошла. При возникновении ошибки можно исполь­ зовать объект Err для определения ее номера. Чтобы отобразить значение Err.Number (по умолчанию используется в Err), обратитесь к функции Error. Например, представ­ ленный далее оператор отображает ту же информацию, что и обычное диалоговое окно со сведениями об ошибке Visual Basic (содержит номер ошибки и ее описание). M sgB ox "О ш и б к а " & E rr & " & E rro r(E rr.N u m b e r) На рис. 9.6 показано сообщение об ошибке VBA, а на рис. 9.7 отображена та же ошибка, что и в окне сообщения, но уже в Excel. Конечно, вы можете сделать сообщение об ошибке более значимым для конечных пользователей, используя описательный текст. -Чг S ub C h a n g e S h e e t N a m e () W o r k s h e e t s ( " Л и с т 2 " ) .Nam e End Sub Change SheetHame " И сходны е д а н н ы е ” Run-time error *9': Subscnpt out of range Рис. 9.6. Сообщение об ошибке VBA не всегда понятно пользователям Примечание Ссылка на E r r эквивалентна обращению к свойству N u m b e r объекта E r r . Следовательно, два приведенных ниже оператора идентичны. M sgB ox E r r M sgB ox E rr.N u m b e r Оператор On Error также применяется для определения места в процедуре, к кото­ рому должна перейти программа в случае ошибки. Чтобы обозначить это место, исполь­ зуется метка. On E r r o r G o T o E r r o r H a n d l e r Примеры обработки ошибок В первом примере демонстрируется ошибка, которую можно спокойно проигнорировать. Метод S p e c ia l C el I s выделяет ячейку, которая соответствует заданному критерию. Глава 9. Работа с процедурами VBA 271 ~3 Change SheetName S ub C h a n g e S h e e t N a m e () On E r r o r R esu m e N e x t W o r k s h e e t s ( " Л и с т 2 " ) .N am e = I f E r r .N u m b e r <> 0 T h en M sgB ox "Ошибка " & E r r E x i t Sub End I f End S ub I 'И сходн ы е данны е" & E r r o r ( E r r .N u m b e r ) *1 Ошибка 9: Subscript out of range Рис. 9.7. Можно создать более информативное сообщение об ошибке Примечание М етод S p e c i a l C e l l s выполняет те же действия, что и команда Главная^Редактирование^Найти и выделить1^ Выделение группы ячеек (Н о т е ^ Editing^Find & S ele ct^ G o То Special). В диалоговом окне Выделение группы ячеек (Go То Special) перед пользователем открываются широкие возмож ­ ности выбора. Например, можно выделить ячейки, содержащ ие только чи­ словые константы (не формулы). В приведенном далее примере метод S p e c i a l C e l l s выделяет все ячейки в текущем диапазоне, которые содержат формулу, возвращающую число. Если ни одна ячейка вдиапазоне не соответствует критерию, VBA генерирует сообщение об ошибке (рис. 9.8). M icro soft Visual Bask: Run-time error '1004': He найдено ни одной ячейки, удовлетворяющей указании условиям. Debug Help Рис. 9.8. Метод S p e c i a l C e l l s генерирует сообщение об ошибке, если нужные ячейки не найдены Sub S e l e c t F o r m u l a s () S e le c t io n . S p e c ia lC e ll s ( x lF o r m u la s , x lN u m b e r s ) . S e le c t ' . . . [код] End Sub 272 Часть III. Visual Basic for Applications Ниже приводится вариант кода, в котором конструкция On Error Resume Next предотвращает появление ошибки. S u b S e l e c t F o r m u l a s 2 () On E r r o r R e su m e N e x t S e l e c t i o n . S p e c ia lC e lls ( x lF o r m u la s , x lN u m b e r s ) . S e le c t On E r r o r G o T o 0 1 . . . [к о д ] End Sub Обратите внимание, что оператор On Error GoTo 0 восстанавливает нормальную обработку ошибок перед выходом из процедуры. Следующая процедура использует дополнительный оператор для определения ре­ зультата: произошла ли ошибка. S u b S e l e c t F o r m u l a s 2 () On E r r o r R e su m e N e x t S e le c t io n . S p e c ia lC e lls ( x lF o r m u la s , x lN u m b e r s ) . S e le c t I f E r r . N u m b e r = 1 0 0 4 T h e n M s g B o x "H e н а й д е н ы я ч е й к и _ с ф ор м улам и ." On E r r o r G o T o 0 ' . . . [код] End Sub Если свойство Number объекта Err не равно 0, происходит ошибка. С помощью оператора If проверяется, не равно ли свойство Err.Number 1004, и, если это так, отображается окно сообщения. В рассмотренном примере осуществляется проверка кода на предмет обнаружения ошибки с указанным номером. Если нужно найти все ошибки, используйте следующий оператор: If E rr.N u m b e r о 0 T hen M sgB ox "П р о и з о ш л а о ш и б к а ." В следующем примере кода демонстрируется обработка ошибок путем перехода по метке. S u b E r r o r D e m o () On E r r o r G o T o H a n d l e r S e l e c t i o n . V a l u e = 123 E x i t Sub H a n d le r : M sg B o x "Н е в о зм ож н о п р и с в о и т ь End Sub значение вы деленном у д и а п а з о н у ." В процедуре предпринимается попытка присвоить значение текущему выделенному объекту. Если происходит ошибка (например, не выделен диапазон ячеек или лист за­ щищен), то оператор присваивания выдает ошибку. Оператор On Error задает переход к метке Handler в случае ошибки. Обратите внимание, что перед меткой используется оператор Exit Sub. Программа обработки не выполняется, если ошибок не было. Этот оператор можно и не задавать — в результате сообщение будет отображаться даже в том случае, если ошибка не происходила. Иногда ошибка помогает получить определенную информацию. В приведенном ниже примере выполняется проверка, открыта ли конкретная рабочая книга. При этом ошибки не обрабатываются. S u b C h e c k F o r F i l e l () D im F ile N a m e A s S t r i n g D im F i l e E x i s t s A s B o o l e a n D im b o o k A s W o r k b o o k F ile N a m e = " B U D G E T . X L S X " F i l e E x i s t s = F a ls e Глава 9. Работа с процедурами VBA Ц икл п о в с е м р а б о ч и м к н и г а м F o r E a c h b o o k I n W o rkb o o k s I f U C a s e ( b o o k .N a m e ) = F ile N a m e T h e n F i l e E x i s t s N ext book ' О тображ ение с о о т в е т с т в у ю щ е г о сооб щ ени я I f F ile E x is t s Then M s g B o x F ile N a m e & " о т к р ы т . " E ls e M s g B o x F ile N a m e & " н е о т к р ы т . " End I f End S u b 273 1 = T ru e В этой процедуре в цикле For Each-Next просматриваются все объекты коллек­ ции Workbooks. Если книга открыта, переменная FileExists получает значение True. В результате отображается сообщение, указывающее пользователю, открыта ли рабочая книга. Предыдущую процедуру можно переписать так, что для определения “открытости” будет использоваться метод обработки ошибок. В следующем примере оператор On Error Resume Next указывает VBA игнорировать любые ошибки. В инструкции мы обратимся к рабочей книге, присвоив ей объектную переменную (с помощью ключевого слова Set). Если рабочая книга закрыта, происходит ошибка. В структуре If-ThenElse проверяется значение свойства Err и отображается соответствующее сообщение. Sub C h e c k F o r F i l e () D im F ile N a m e A s S t r i n g D im x A s W o r k b o o k F ile N a m e = "B U D G E T . X L S X " On E r r o r R e su m e N e x t S e t x = W o r k b o o k s ( F ile N a m e ) I f E r r = 0 Then M s g B o x F ile N a m e & " о т к р ы т . " E ls e M s g B o x F ile N a m e & " н е о т к р ы т . " End I f On E r r o r G o T o 0 End S u b Перекрестная ссылка В главе 11 можно найти ряд дополнительных примеров, иллюстрирующих обработку ошибок. Реальный пример В этой главе рассмотрены основные принципы создания процедур. Отметим, что многие приведенные примеры были не очень интересными. Далее представлен пример из реальной жизни. Он иллюстрирует многие концепции, рассмотренные в этой и преды­ дущих двух главах. В данном разделе описана разработка полезной утилиты, которую можно рассматри­ вать как приложение (согласно определению, предложенному в главе 5). Что более важ­ но, ниже показан процесс анализа задачи и последующего ее решения с помощью VBA. Предупреждение опытным пользователям, читающим эту книгу: примите к сведению, что пример рассмотрен в расчете на начинающих. Поэтому мы не только представим код, но и покажем, какими источниками можно пользоваться при разработке программы. 274 Часть III. Visual Basic for Applications Компакт-диск Готовое приложение можно найти на прилагаемом к книге компакт-диске. Цель Цель этого упражнения — разработать утилиту, которая изменяет порядок следова­ ния листов рабочей книги, сортируя их названия по алфавиту (с помощью одних только функций Excel это сделать невозможно). Если вы часто создаете книги с большим коли­ чеством листов, то знаете, что иногда сложно найти интересующий вас лист. Если же их упорядочить по названиям, то любой рабочий лист найти будет значительно проще. Требования к проекту С чего начнем? С перечисления требований к приложению. В процессе разработки вы будете обращаться к этому перечню для проверки правильности выполнения действий. Требования к разрабатываемому приложению приведены далее. 1. Приложение должно сортировать листы (т.е. рабочие листы и листы диаграмм) активной книги по названиям в алфавитном порядке. 2. Приложение должно легко выполняться. 3. Приложение всегда должно быть доступным. Другими словами, пользователь не должен открывать рабочую книгу для использования этой утилиты. 4. Приложение должно правильно выполняться по отношению к любой открытой рабочей книге. 5. В приложении не должны отображаться сообщения об ошибках VBA. Исходные данные Часто самой сложной частью проекта является определение того, с чего же начать. В данном случае начнем с перечисления особенностей Excel, которые могут повлиять на соблюдение требований к проекту. • В Excel отсутствует команда сортировки листов. Следовательно, отпадает вариант записи макроса для упорядочивания листов в алфавитном порядке. • Лист можно легко переместить, перетащив его за ярлычок. Примечание. Включите функцию записи макросов и перетащите лист в другое ме­ сто, чтобы узнать, какой код создается при таком действии. • В Excel можно открыть диалоговое окно Переместить или скопировать (Move or Сору), щелкнув правой кнопкой мыши на ярлычке листа с последующим выбо­ ром команды контекстного меню Переместить/скопировать (Move or Сору). Бу­ дет ли при записи макроса для этой команды генерироваться код, который работа­ ет иначе, чем операция перемещения листа вручную? • Следует знать, сколько листов содержится в активной рабочей книге. Эту инфор­ мацию можно получить с помощью VBA. • Узнайте названия листов (вновь воспользовавшись VBA). Глава 9. Работа с процедурами VBA • 275 В Excel существует команда, сортирующая данные в ячейках рабочего листа. Примечание. Возможно, стоит перенести названия листов в диапазон ячеек и ис­ пользовать эту функцию. Или, возможно, в VBA есдъ метод сортировки, которым можно будет воспользоваться в программе. • Благодаря диалоговому окну Параметры макроса (Macro Options) несложно бу­ дет назначить для макроса комбинацию клавиш. • Если макрос сохранен в личной книге макросов, он всегда доступен. • Вам понадобится тестировать приложение по мере разработки. Естественно, нель­ зя тестировать приложение в той же рабочей книге, в которой оно разработано. Примечание. Создайте фиктивную рабочую книгу, предназначенную специально для тестирования. • Если разработать программу правильно, то VBA не будет отображать сообщения об ошибках. Примечание. Не будем принимать желаемое за действительное... Подход На данном этапе мы точно не знаем, что будем делать дальше, однако можно разра­ ботать предварительный схематический план, описывающий общие задачи: 1) идентифицировать активную рабочую книгу; 2) получить список названий всех листов в рабочей книге; 3) посчитать листы; 4) отсортировать их (определенным образом); 5) изменить порядок следования листов в соответствии с параметрами сортировки. Что необходимо знать В намеченном плане можно заметить несколько недостатков. Необходимо опреде­ лить, как выполнить следующие операции: • идентифицировать активную рабочую книгу; • сосчитать листы активной рабочей книги; • получить список названий листов; • отсортировать список; • изменить порядок следования листов в соответствии с отсортированным списком. © Совет Если вам недостаточно информации о конкретных методах и свойствах, об­ ратитесь к этой книге или к электронной справочной системе. Вскоре вы найдете то, что вам необходимо. Однако для начала лучше всего включить функцию записи макросов и посмотреть, что записывается в результате вы­ полнения действий, связанных с реш ением поставленной задачи. Это заня­ тие принесет вам немало пользы. Часть III. Visual Basic for Applications 276 Некоторые предварительные соображения Ниже приведен пример, который был получен в результате записи макроса, позво­ ляющей больше узнать о необходимых для решения поставленной задачи средствах VBA. Начнем с рабочей книги, содержащей три рабочих листа. Затем включим функцию записи макросов и укажем, что макрос должен сохраняться в личной книге макросов. В режиме записи перетащим третий рабочий лист на место первого. Результат записи средствами Excel будет следующим. S u b M a c r o l () S h e e t s ( "Л и с т З " ) . S e le c t S h e e t s ( " Л и с т З " ) .M o v e B e f o r e : = S h e e t s (1) End Sub Найдем в справочной системе слово Move (это метод, перемещающий лист в рабочей книге на новое место). Данный метод имеет один аргумент, определяющий будущее по­ ложение листа. Таким образом, он имеет непосредственное отношение к нашей задаче. Вам также необходимо узнать количество листов в активной рабочей книге. Запросим сведения о слове C ount и определим, что это свойство коллекции. Затем активизируем окно отладки (Immediate) в VBE и введем такой оператор: ? A c t iv e W o r k b o o k . C o u n t Ошибка! Возможно, требуется сосчитать листы в книге. ? A c t iv e W o r k b o o k . S h e e t s . C o u n t На этот раз успешно. На рис. 9.9 показан результат — еще немного ценной информации. Рис. 9.9. Использование окна отладки вVBE для тестирования оператора А что с названиями листов? Проведем еще один тест. Введем в окне отладки (Immediate) следующий оператор: ? A c t i v e W o r k b o o k . S h e e t s ( 1 ) .Nam e В результате будет получено название первого листа— ЛистЗ (так и есть на самом деле). Таким образом, мы получили положительный результат. Далее конструкция For Each-Next используется для циклического просмотра всех членов коллекции. Просмотрев соответствующий раздел справочной системы, напишем короткую процедуру с использованием этой конструкции. S u b T e s t () F o r E a c h S h t I n A c t iv e W o r k b o o k . S h e e ts M s g B o x S h t . Name N ext Sht End Sub И вновь успешно! Макрос отобразил три окна сообщения, в каждом из которых — новое название листа. Наконец, пришло время подумать о функциях сортировки. Справочная система ука­ жет, что метод Sort относится к объекту Range. Поэтому одним из решений задачи бу­ дет перенесение названия листов в диапазон ячеек и сортировка этого диапазона. Однако Глава 9. Работа с процедурами VBA 277 такая задача оказалась слишком сложной для данного приложения. Возможно, целесооб­ разнее сформировать из названий листов массив строк, а затем отсортировать этот мас­ сив с использованием кода VBA. П одготовка Теперь мы обладаем достаточным количеством информации, для того чтобы присту­ пить к работе над серьезной программой. Однако прежде следует задать первоначальные настройки. Итак, выполним следующие инструкции. 1. Создайте пустую рабочую книгу с пятью рабочими листами: названия — Л ист2, Л истЗ, Л ист4 и Л ист5. Л ист1, 2. Разместите листы произвольно, чтобы они следовали не по порядку. 3. Сохраните рабочую книгу как T e s t . xlsm . 4. Активизируйте VBE и выберите проект P e r s o n a l .x l s b в окне Project (Проект). Если P e r s o n a l . x l s b не отображается в окне Project, значит, вы никогда не использовали личную книгу макросов. Excel создаст для вас эту книгу, когда вы запишете макрос (любой) и определите, что он должен сохраняться в личной кни­ ге макросов. 5. Добавьте новый модуль VBA (используя команду Inserts Module (Вставить1^ Модуль)). 6. Создайте пустую процедуру с названием S o r t S h e e ts (рис. 9.10). Макрос можно сохранить в любом модуле личной книги макросов. Однако лучше хранить каждый макрос в отдельном модуле. Таким образом, вы сможете легко экспортировать модуль и импортировать его в другой проект. Рис.9.10. Пустая процедура в модуле, находящемся в персональной книге макросов Часть III. Visual Basic for Applications 278 7. Активизируйте Excel. Выберите команду Разработчик^Код1 ^ Макросы (Develo­ per1^ Code ^Macros) для отображения диалогового окна Макрос (Macro). 8. В диалоговом окне Макрос (Macro) выберите процедуру Sort Sheets и щелк­ ните на кнопке Параметры (Options), чтобы присвоить данному макросу комби­ нацию клавиш. Неплохим выбором будет <Ctrl+Shift+S>. Написание кода Теперь пришло время приступить к написанию программы. Вначале необходимо по­ местить названия листов в массив строк. Так как пока неизвестно, сколько листов со­ держит активная рабочая книга, для объявления массива используем оператор Dim с пустыми скобками. Помните, что всегда можно применить оператор ReDim и изменить размерность массива на требуемое число элементов. Введем код, вставляющий названия листов в массив SheetNames. Кроме того, в цикл добавим функцию MsgBox, чтобы убедиться, что названия листов на самом деле вводятся в массив. Sub S o r t S h e e t s O ' С о рти р овка л и сто в в а кти в н о й р абочей к н и ге D im S h e e t N a m e s () a s S t r i n g D im i a s L o n g D im S h e e t C o u n t a s L o n g S h e e tC o u n t = A c t iv e W o r k b o o k . S h e e t s . C o u n t R e D im S h e e t N a m e s (1 T o S h e e t C o u n t ) F o r i = 1 To S h e e tC o u n t S h e e t N a m e s ( i) = A c t i v e W o r k b o o k . S h e e t s ( i ) . N a m e M s g B o x S h e e t N a m e s ( i) N ext i End Sub Чтобы проверить эту программу, активизируем рабочую книгу Test.xlsm и нажмем клавиши <Ctrl+Shift+S>. Появится пять окон сообщений с названиями листов активной ра­ бочей книги. Рекомендуем вам тестировать код по мере его создания. Когда вы убедитесь, что про­ грамма работает правильно, удалите операторы MsgBox (через некоторое время они начнут вас раздражать). Совет Вм есто того чтобы использовать функцию M s g B o x в целях тестирования, можно обратиться к методу P r i n t объекта D e b u g , который отображает све­ дения в окне отладки. Для этого замените M s g B o x следующ им оператором: D e b u g .P r in t S h e e tN a m e s (i) Этот прием не столь навязчив по сравнению с использованием операто­ ров M s g B o x . Не забудьте только удалить этот оператор по завершении тестирования. На данном этапе процедура Sort Sheets всего лишь создает массив названий лис­ тов в соответствии с порядком указания их в активной рабочей книге. Остается два шага: отсортировать значения в массиве SheetNames и изменить порядок следования листов в книге согласно отсортированному массиву. Глава 9. Работа с процедурами VBA 279 Создание процедуры сортировки Переходим к сортировке массива SheetN am es. Можно вставить программу сорти­ ровки в процедуру S o r tS h e e t s , но лучше написать общую процедуру сортировки, ко­ торую можно будет использовать для управления другими объектами (сортировка мас­ сивов — довольно популярная операция). Возможно, вас несколько обескуражит идея создания процедуры сортировки. Однако не беспокойтесь: несложно найти стандартные процедуры, которые можно непосредст­ венно или с небольшими изменениями использовать в своей программе. Конечно, наи­ более полным источником такой информации является Интернет. Существует несколько способов сортировки массивов. Мы выбрали пузырьковый ме­ тод (хотя это не очень быстрый прием, но его легко запрограммировать). В данном кон­ кретном приложении высокая скорость выполнения операций не так уж важна. В пузырьковом методе используется вложенный цикл F o r-N e x t, в котором оцени­ вается каждый элемент массива. Если элемент массива больше, чем следующий, то эти два элемента меняются местами. Такое сравнение повторяется для каждой пары элемен­ тов (т.е. п - 1 раз). © Перекрестная ссылка В главе 11 описаны другие процедуры сортировки, а также приведено срав­ нение процедур по скорости выполнения. Ниже приведена написанная мною процедура сортировки (после консультации с раз­ работчиками веб-сайтов, которые подсказали некоторые идеи). Sub B u b b l e S o r t ( L i s t () A s S t r i n g ) Dim F i r s t A s L o n g , L a s t A s L o n g Dim i A s L o n g , j A s L o n g Dim Temp A s S t r i n g F i r s t = L B o u n d ( L is t ) Last = UBound(List) For i = F i r s t To L a s t - 1 F o r j = i + 1 To L a s t I f L is t ( i) > L i s t (j ) T h e n Tem p = L i s t ( j ) L is t ( j) = L is t ( i) L i s t ( i ) = Tem p End I f N ext j N ext i End Sub Эта процедура имеет один аргумент: одномерный массив с названием L i s t . Массив, который передается в процедуру, может быть любой длины. Для присвоения нижней и верхней границ массива переменным F i r s t и L a s t использовались функции Lbound иUBound соответственно. Ниже приведена небольшая временная процедура, которая используется для тестиро­ вания процедуры B u b b le S o r t. Sub S o r t T e s t e r O Dim х ( 1 T o 5) A s Dim i A s L o n g x ( l) = "с о б а к а " x (2 ) = " к о т " S t r in g 280 Часть III. Visual Basic for Applications x(3 ) = "сл о н " = "тр уб козуб " x (5 ) = "п ти ц а " C a l l B u b b le S o r t ( x ) F o r i = 1 To 5 D e b u g .P r in t i , x ( i ) N ext i End Sub X (4) Процедура S o r t T e s t e r создает массив из пяти строк, передает его процедуре Bub­ b l e S o r t и отображает отсортированный массив в окне отладки (Immediate). После того как код выполнил свое предназначение, он был удален. Убедившись в том, что код работает надежно, я изменил процедуру S o r t S h e e t s пу­ тем добавления вызова в процедуру B u b b le S o r t, передачи массива S heetN am es в ка­ честве аргумента. Начиная с этого момента, модуль приобретает следующий вид. S u b S o r t S h e e t s () D im S h e e t N a m e s () A s S t r i n g D im S h e e t C o u n t a s L o n g D im i a s L o n g S h e e tC o u n t = A c t iv e W o r k b o o k . S h e e t s . C o u n t R e D im S h e e t N a m e s (1 T o S h e e t C o u n t ) F o r i = 1 To S h e e tC o u n t S h e e t N a m e s ( i) = A c t i v e W o r k b o o k . S h e e t s ( i ) . N a m e N ext i C a l l B u b b le S o r t ( S h e e t N a m e s ) End Sub S u b B u b b l e S o r t ( L i s t () A s S t r i n ' С о р т и р о в к а м а с с и в а L i s t по D im F i r s t A s L o n g , L a s t A s D im i A s L o n g , j A s L o n g D im Temp A s S t r i n g F i r s t = L B o u n d ( L is t ) L a s t = U B o u n d ( L is t ) F o r i = F i r s t To L a s t - 1 F o r j = i + 1 To L a s t I f L is t ( i) > L is t ( j) Tem p = L i s t ( j ) L is t ( j) = L is t ( i) L i s t ( i ) = Tem p End I f N ext j N ext i End Sub g) возрастанию Long Then По окончании работы процедуры S o r t S h e e t s образуется массив, состоящий из от­ сортированных названий листов активной рабочей книги. Чтобы проверить это, можно отобразить содержимое массива в окне отладки, добавив в конец процедуры S o r t ­ S h e e ts такой код (если это окно не отображается, нажмите клавиши <Ctrl+G>). For i = 1 То S h e e tC o u n t D e b u g . P r i n t S h e e t N a m e s ( i) N ext i Пока все идет нормально. Осталось написать программу для изменения порядка следования листов в книге в соответствии с отсортированными элементами массива SheetN am es. Глава 9. Работа с процедурами VBA 281 Программа, записанная раньше, вновь пригодилась. Помните инструкцию, которая была получена при перемещении листа в рабочей книге в первую позицию. S h e e t s ( " Л и с т З " ) . M o v e B e f o r e : = S h e e t s (1) Далее напишем цикл F o r-N e x t, который просматривает каждый лист и перемещает его в соответствующее место, указанное в массиве SheetN am es. For i = 1 Т о S h e e t C o u n t S h e e t s ( S h e e t N a m e s ( i) ) .M o v e B e f o r e : = S h e e t s ( i ) Next i Например, в первой итерации цикла счетчик (i) равен 1. Первый элемент массива SheetNames (в данном примере) — лист Лист1. Следовательно, выражение для мето­ да Move в цикле будет таким. S h e e ts ( " Л и с т 1 " ) .M o v e B e f o r e : = S h e e t s ( l) После выполнения второй итерации цикла выражение имеет следующий вид. S h e e ts ( " Л и с т 2 " ) .M o v e B e f o r e := S h e e t s (2) В процедуру S o r t S h e e ts добавим новый код. Sub S o r t S h e e t s O Dim S h e e t N a m e s () A s S t r i n g Dim S h e e t C o u n t a s L o n g Dim i a s L o n g S h e e tC o u n t = A c t iv e W o r k b o o k . S h e e t s . C o u n t ReDim S h e e t N a m e s (1 T o S h e e t C o u n t ) For i = 1 To S h e e tC o u n t S h e e t N a m e s ( i) = A c t i v e W o r k b o o k . S h e e t s ( i ) . N a m e Next i C a l l B u b b le S o r t ( S h e e t N a m e s ) For i = 1 To S h e e tC o u n t A c t i v e W o r k b o o k . S h e e t s ( S h e e t N a m e s ( i ) ) .M o v e _ B e f o r e : = A c t iv e W o r k b o o k . S h e e t s (i ) N ext i End Sub Тестирование показало, что процедура прекрасно работает с рабочей книгой Test .x lsm . Теперь необходимо собрать весь код. Объявим все переменные, используемые в про­ цедурах, и добавим несколько комментариев, а также пустых строк, чтобы программу можно было легче прочесть. В результате процедура S o r t S h e e t s будет приведена к следующему виду. Sub S o r t S h e e t s O 1 Эта п р о ц е д у р а с о р т и р у е т л и с т ы 1 акти вной р а б о ч е й к н и ги по в о з р а с т а н и ю . 1 Нажмите к л а в и ш и < C t r l + S h if t + S > д л я в ы п о л н е н и я Dim S h e e t N a m e s () A s S t r i n g Dim S h e e t C o u n t A s L o n g Dim i A s L o n g 1 О п р е д е л е н и е к о л и ч е с т в а л и с т о в и м а с с и в а R e D im S h e e tC o u n t = A c t iv e W o r k b o o k . S h e e t s . C o u n t ReDim S h e e t N a m e s (1 T o S h e e t C o u n t ) ' Заполнение м а с с и в а н а зва н и я м и л и с т о в For i = 1 То S h e e tC o u n t 282 Часть III. Visual Basic for Applications SheetNames(i) = ActiveWorkbook.Sheets(i).Name Next i 1 Сортировка м ассива по в о з р а с т а н и ю Call BubbleSort(SheetNames) ' Перемещ ение л и с т о в For i = 1 To SheetCount ActiveWorkbook.Sheets(SheetNames(i)).Move _ Before:= ActiveWorkbook.Sheets(i) Next i End Sub Итак, все работает. Чтобы продолжить проверку программы, добавим еще не­ сколько листов в книгу Test .xlsm и изменим некоторые названия. Программа ра­ ботает прекрасно! Д ополнительное тестирование Наверное, вы считаете, что работа окончена. Однако тот факт, что процедура работа­ ет с рабочей книгой Test.xlsm, не означает, что она будет работать со всеми рабочими книгами. Чтобы проверить программу, загрузим несколько других рабочих книг и вновь запустим программу. Скоро вы убедитесь в том, что приложение неидеально (если быть точным, оно далеко от идеала). Были обнаружены следующие проблемы. • Рабочие книги с большим количеством листов сортируются очень долго, так как при операциях перемещения окно постоянно обновляется. • Сортировка не всегда выполняется. Например, в одном из тестов лист с названием SUMMARY (все буквы в верхнем регистре) был размещен перед листом Sheet 1. Эта проблема вызвана процедурой BubbleSort (так как U в верхнем регистре считается больше, чем h в нижнем). • Если на экране не отображаются окна рабочих книг, при нажатии <Ctrl+Shift+S> макрос выдает ошибку. • Если структура рабочей книги защищена, метод Move не работает. • После сортировки последний лист рабочей книги становится активным. Измене­ ние активного листа — не очень удачное решение проблемы; лучше, если бы ак­ тивным оставался лист, который был таковым до начала выполнения программы. • При прерывании макроса с помощью комбинации клавиш <Ctrl+Break> VBA ото­ бражает сообщение об ошибке. • Макрос не может быть “обращен вспять” (вы не можете воспользоваться командой Отменить (Undo)). Если пользователь случайно нажмет клавиши <Ctrl+Shift+S>, листы рабочей книги отсортируются, и в исходное состояние придется возвращать их вручную. У с тр а н е н и е п р о б л е м Решить проблему обновления изображения на экране несложно — для этого вставьте в начале процедуры SortSheets такую инструкцию: Application.ScreenUpdating = False Глава 9. Работа с процедурами VBA 283 Этот оператор “замораживает” окна Excel во время выполнения макроса. Еще один положительный момент заключается в том, что увеличивается скорость выполнения макроса. Когда выполнение макроса завершится, снова включается автоматическое об­ новление экрана. Можно было бы исправить и проблему с процедурой BubbleSort. Для этого исполь­ зуем функцию UCase, чтобы преобразовать названия листов в верхний регистр. Таким об­ разом, все сравнения выполняются с названиями в верхнем регистре. Исправленная строка выглядит следующим образом: If U C a s e ( L is t ( i) ) © > U C a s e ( L i s t ( j )) Then Совет Еще один способ решения “проблемы регистра” — добавить в начало м оду­ ля следующий оператор: O p t io n C o m p a re T e x t В этом случае VBA выполняет сравнение строк на основе нечувствительных к регистру правил сортировки. Другими словами, А считается тем же, что и а. Чтобы избежать сообщения об ошибке, которое появляется, когда все рабочие книги свернуты, добавим процедуру проверки ошибок. Если не существует активных рабочих книг, происходит ошибка. Применим оператор On Error Resume Next, чтобы про­ игнорировать ошибку, и проверим значение Err. Если Err не равно нулю, это означает, что произошла ошибка. Следовательно, процедура заканчивается. Ниже приведен код проверки ошибок. On E r r o r R e su m e N e x t S h e e tC o u n t = A c t i v e W o r k b o o k . S h e e t s . C o u n t I f E r r <> 0 T h e n E x i t S u b 1 н е т а к т и в н о й р а б о ч е й к н и г и Можно и не использовать оператор On Error Resume Next. Следующий опера­ тор непосредственно определяет, свернута ли рабочая книга, и не реализует обработку ошибок. Этот оператор находится в верхней части процедуры SortSheets. I f A c t iv e W o r k b o o k Is N o t h in g Then E x it Sub Обычно для защиты структуры рабочей книги имеется серьезная причина. Мы не бу­ дем снимать защиту; программа должна отображать предупреждение, чтобы пользова­ тель снял защиту и снова выполнил макрос. Проверку защищенной структуры книги вы­ полнить легко — свойство ProtectStructure объекта WorkBook возвращает True, если книга защищена. Поэтому добавим в проект следующий код. 1 П р о верка з а щ и т ы с т р у к т у р ы р а б о ч е й к н и г и I f A c t iv e W o r k b o o k . P r o t e c t S t r u c t u r e T h e n M s g B o x A c t iv e W o r k b o o k . N a m e & " з а щ и щ е н а ." , _ v b C r i t i c a l , " С о р т и р о в к а л и с т о в н е в о з м о ж н а ." E x it Sub End I f Если структура рабочей книги защищена, пользователь увидит окно сообщения, по­ казанное на рис. 9.11. Для повторной активизации листа после завершения сортировки я написал код, кото­ рый сопоставляет исходный лист с объектной переменной (OldActiveSheet), а также активизирует этот лист после завершения процедуры. Ниже показан оператор, который инициализирует переменную. Set O l d A c t i v e = A c t iv e S h e e t 284 Часть III. Visual Basic for Applications А следующий оператор активизирует рабочий лист, который был изначально активным: O ld A c t iv e . A c t iv a t e После нажатия комбинации клавиш <Ctrl+Break> выполнение макроса обычно при­ останавливается, и VBA выдает сообщение об ошибке. Но так как одна из целей проек­ т а — избежать сообщений об ошибке, необходимо вставить команду предотвращения подобной ситуации. В справочной системе указано, что объект A p p l i c a t i o n обладает свойством E n a b le Cane e l Key, которое может отключить комбинацию клавиш <Ctrl+Break>. Поэтому добавим следующий оператор в начало программы: A p p l i c a t i o n . E n a b le C a n c e lK e y = x lD is a b le d Предупреждение Будьте очень внимательны, когда отключаете прерывание макроса, выпол­ няемое с помощью клавиш <Ctrl+Break>. Если программа попадет в беско­ нечный цикл, выйти из него вы не сможете. Лучше использовать этот опера­ тор, когда все работает идеально. Для предотвращения проблемы, возникающей из-за случайной сортировки листов, пе­ ред отключением клавиш <Ctrl+Break> в процедуру был добавлен следующий оператор. If M sg B o x ( "С о р ти р о в а ть л и сты в а кти в н о й р або чей к н и г е ? " , v b Q u e s t io n + v b Y e sN o ) о v b Y e s T hen E x it Sub _ После вызова на выполнение процедуры S o r t S h e e t s на экране появится сообще­ ние, показанное на рис. 9.12. M icro so ft Excel Рис. 9.11. Это сообщение о том, что листы рабочей книги отсортировать нельзя Рис. 9.12. Это сообщение отображается до начала сортировки листов После выполнения всех описанных выше изменений процедура S o r t S h e e t s при­ нимает следующий вид. O p t io n E x p l i c i t Sub S o r t S h e e t s O ' Э та п ро ц едур а с о р т и р у е т ли сты 1 акти вн о й рабочей кн и ги в порядке в о зр а ста н и я . ' Н а ж м и те к л а в и ш и < C t r l + S h if t + S > д л я в ы з о в а п р о ц е д у р ы D im S h e e t N a m e s () A s S t r i n g D im i A s L o n g D im S h e e t C o u n t A s L o n g D im O l d A c t i v e S h e e t A s O b j e c t I f A c t iv e W o r k b o o k I s N o t h in g T h e n E x i t S u b S h e e tC o u n t = A c t iv e W o r k b o o k . S h e e t s . C o u n t 1 ' Н ет а к т и в н о й р а б о ч е й к н и ги П р о в е р к а защ ищ енной с т р у к т у р ы р а б о ч е й к н и г и I f A c t iv e W o r k b o o k . P r o t e c t S t r u c t u r e T hen M s g B o x A c t iv e W o r k b o o k . N a m e & " з а щ и щ е н а ." , Глава 9. Работа с процедурами VBA 285 v b C r i t i c a l , " Л и с т ы н е м о г у т б ы ть о т с о р т и р о в а н ы . " E x it Sub End I f 1 П роверка п о л ь з о в а т е л я I f M sg B o x ( "С о р ти р о в а ть л и сты в а кти в н о й р або чей к н и г е ? " , v b Q u e s t io n + v b Y e sN o ) о v b Y e s Then E x it Sub 1 О тк л ю ч е н и е к о м б и н а ц и и к л а в и ш < C t r l+ B r e a k > A p p lic a t io n . E n a b le C a n c e lK e y = x lD is a b le d ' П олучение к о л и ч е с т в а л и с т о в S h e e tC o u n t = A c t iv e W o r k b o o k . S h e e t s . C o u n t ' И зм енение р а з м е р н о с т и м а с с и в а ReD im S h e e t N a m e s (1 T o S h e e t C o u n t ) Сохранение ссы л ки на акти в н ы й л и с т S et O ld A c t iv e S h e e t = A c t iv e S h e e t ' ' Заполнение м а сси в а н а зва н и ям и л и сто в For i = 1 То S h e e tC o u n t S h e e t N a m e s ( i) = A c t i v e W o r k b o o k . S h e e t s ( i ) . N a m e N ext i ' Сортировка м а с с и в а в п о р я д ке C a l l B u b b le S o r t ( S h e e t N a m e s ) _ возрастания 1 О тклю ч ени е о б н о в л е н и я э к р а н а A p p lic a t io n . S c r e e n U p d a t in g = F a ls e 1 Перем ещ ение л и с т о в For i = 1 То S h e e tC o u n t A c t i v e W o r k b o o k . S h e e t s ( S h e e t N a m e s ( i ) ) .M o v e _ B e f o r e : = A c t iv e W o r k b o o k . S h e e t s (i ) N ext i 1 П о в то р н а я а к т и в и з а ц и я и с х о д н о г о а к т и в н о г о л и с т а O ld A c t iv e S h e e t . A c t iv a t e End Sub Доступность Макрос S o r t S h e e t s сохранен в личной книге макросов, поэтому он всегда досту­ пен при запуске Excel. На этом этапе макрос может выполняться при выборе названия макроса в диалоговом окне Макрос (Macro) — это окно отображается после нажатия клавиш <Alt+F8> или <Ctrl+Shift+S>. Команду вызова этого макроса можно также доба­ вить на ленту. Для добавления команды на ленту выполните следующие действия. 1. Щелкните правой кнопкой мыши на ленте и в контекстном меню выберите ко­ манду Настройка ленты (Customize the Ribbon). 2. На вкладке Настройка ленты (Customize Ribbon) диалогового окна Параметры Excel (Excel Options) в списке Выбрать команды (Choose Commands From) вы­ берите категорию Макросы (Macros). 3. Щелкните на значке PERSONAL. XLSB! S o r tS h e e t s . 4. Используйте элементы управления в правом окне для создания новой вкладки и группы ленты. (Вы не сможете добавить команду в существующую группу.) Часть III. Visual Basic for Applications 286 Я создал группу Листы (Worksheets) во вкладке Вид (View) и переименовал новый, добавленный в эту группу элемент, на Сортировка листов (Short Sheets) (рис. 9.13). ШШШШШ Общие В Настройка ленты. Формулы Выбрать команды :© Настройка ленты: © Правописание ~3 j Основные вкладки Сохранение Язык Дополнительно Основные вкладки В 17 Главная PERSOMALXLSBiSortSheets PERSONAL.XLSBIMaKpod В В В а В Буфер обмена Шрифт Выравнивание Число Стили В Ячейки В Редактирование В р Вставка 17 Разметка страницы В [ 7 Формулы Настройка ленты Панель быстрого доступа Надстройки Центр управления безопасностью | 7 Данные [7 Рецензирование ВРВид ШШу» ю т \ В В В В В В В В В Режимы просмотра книги Показать Масштаб Окно Макросы Листы (настраиваемая) 17 Разработчик 17 Надстройки 17 Удаление фона ■ ивиаанвнЫ Создать вкладку | Настройки: I доамммшмимший в а ш н и н н и н и Создать группу j Cfepoc ^ Переименовать... ; j Цмпорт-зкспорт у | С Рис. 9.13. Добавление новой команды на ленту Оценка проекта Итак, результат получен. Утилита соответствует всем изначальным требованиям: она сортирует все листы в активной рабочей книге, ее можно легко выполнить, она всегда доступна, она выполняется (что легко проверить) для всех рабочих книг и пока еще не отображала сообщений об ошибке VBA. Примечание В процедуре все ещ е присутствует одна небольшая проблема: сортировка достаточно строгая и не всегда кажется “логичной”. Например, после сор­ тировки лист Л и с т Ю размещ ается перед листом Л и с т 2 . Большинство поль­ зователей предпочитают видеть лист Л и с т 2 перед листом Л и с т Ю . Решить эту проблему довольно сложно и это выходит за рамки учебных примеров, рассматриваемы х в данной книге. Глава Создание функций Вэтой главе... ♦ ♦ ♦ ♦ ♦ ♦ ♦ Процедуры и функции Назначение пользовательских функций Простой пример функции Синтаксис функции Аргументы функций Примеры функций Имитация функции СУММ ♦ ♦ ♦ ♦ ♦ Расширенные функции для работы с датами Отладка функций Работа с диалоговым окном М а сте р функций Использование надстроек для хранения пользовательских функций Использование функций Windows API А теперь приступим к важнейшей теме, без рассмотрения которой невозможно дви­ гаться дальше, — к функциям VBА. Процедуры и функции Функция — это процедура VBA, которая выполняет вычисления и возвращает значение. Функции можно использовать в коде Visual Basic for Applications (VBA) или в формулах. Процедуру можно рассматривать как команду, которая выполняется пользователем или другой процедурой. С другой стороны, процедуры типа F u n c t io n обычно воз­ вращают отдельное значение (или массив) подобно функциям рабочих листов Excel и встроенным функциям VBA. Как и встроенные функции, процедуры типа F u n c t io n имеют аргументы. 288 Часть III. Visual Basic for Applications Процедуры типа Function универсальны и используются в двух ситуациях: • как часть выражения в процедуре VBA; • в формулах, которые создаются на рабочем листе. Процедуру типа Function можно использовать в работе с функциями Excel и встро­ енными функциями VBA. Единственное исключение — невозможно использовать функ­ цию VBA в формуле проверки данных. Перекрестная ссылка В главе 11 представлены полезные и часто используемые примеры функ­ ций. Вы можете воспользоваться многими из них в своей работе. Назначение пользовательских функций Несомненно, вам знакомы функции Excel. Даже начинающие пользователи знают, как работать с самыми популярными функциями в формулах рабочего листа— СУММ, С Р З Н А Ч и Е С Л И . Excel 2010 содержит более 400 встроенных функций. Если этого коли­ чества недостаточно, можно создавать пользовательские функции с помощью VBA. Зная о существовании большого количества функций, доступных в Excel и VBA, вы можете заняться созданием новых функций. Некоторые из них смогут упростить жизнь рядовым пользователям. Тщательно спланированные специальные функции эффективно используются в формулах на рабочем листе и в процедурах VBA. Например, зачастую пользовательские функции создаются, чтобы сократить форму­ лы. Короткие формулы намного легче воспринимаются и обрабатываются. Однако сле­ дует отметить, что специальные функции, используемые в формулах, обычно выполня­ ются медленнее, чем встроенные. При создании приложений обратите внимание на то, что в некоторых процедурах часто повторяются одни и те же вычисления. В таком случае стоит подумать о создании специальной функции, выполняющей эти вычисления, и впоследствии ее достаточно бу­ дет лишь вызвать из процедуры. Специальная функция, например, поможет заменить по­ вторяющийся код программы и сократить количество возможных ошибок. Созданные вами функции окажутся полезными и для ваших коллег. Другие програм­ мисты, возможно, захотят приобрести специальные функции, которые экономят рабочее время и затрачиваемые на их программирование усилия. Вас может пугать мысль о создании пользовательских функций, однако этот процесс не­ сложен. Например, я люблю создавать пользовательские функции, они отображаются в диа­ логовом окне Мастер функций (Insert Function) наряду со встроенными функциями Excel. Возникает ощущение, будто вы самостоятельно обновляете программное обеспечение. В этой главе вы узнаете об этапах создания пользовательских функций, причем тео­ рия будет подкреплена полезными примерами. Простой пример функции Чтобы сразу же перейти к делу, рассмотрим пример функции VBА. Ниже приведена поль­ зовательская функция, определенная в модуле VBA. Она называется Remove Vowels и при­ нимает один аргумент. Затем она удаляет все гласные буквы и возвращает аргумент. F u n c t i o n R e m o v e V o w e ls ( T x t ) A s S t r i n g ' У д а л я е т в се гл асн ы е буквы и з т е к с т о в о г о ар гум ен та Глава 10. Создание функций 289 Dim i A s L o n g R e m o v e V o w e ls = " " For i = 1 To le n ( T x t ) I f N o t U C a s e ( m id ( T x t , i , 1 ) ) L i k e " [АЕЮ иАЕИОУЫ ЭЮ Я] " T h e n R e m o v e V o w e I s = R e m o v e V o w e ls & m i d ( T x t , i , 1) End I f N ext i End F u n c t io n Конечно, эта не самая полезная функция из созданных мною, но она демонстрирует не­ которые ключевые концепции, связанные с функциями. Принцип ее работы будет объяснен в разделе “Анализ пользовательской функции”. Предупреждение П 0 Создавая пользовательские функции, которые используются в формуле рабочего листа, убедитесь, что код вводится в обычном модуле VBA. Если вы поместите пользовательские функции в модуле листа Л и с т (Sheet), в поль­ зовательской ф орме (UserForm) или в модуле Э т а К н и г а (ThisWorkbook), они не будут выполняться в формулах. Использование функции на рабочем листе При вводе формулы, в которой используется функция RemoveVowels, Excel выпол­ няет программу для получения конечного значения. Эту функцию можно использовать в следующей формуле: =Rem oveVowels ( A l) Примеры данной функции в действии показаны на рис. 10.1. Формулы введены в столбце В, в качестве аргумента используется текст в столбце А. Функция возвращает свой аргумент, в котором удалены гласные буквы. Л А 1 2 3 4 5 6 7 8 Хорошие девочки все делают хорошо. абвгдежзиклам Microsoft Excel abcdijklmnoprst Сбой связи. Из этого предложения удаляются гласные буквы. . .в Хрш двчк вс длт хрш. бвгджзклм Mcrsftxd bcdjklmnprst Сбй свз. з тг прдлжн длтс глсн бкв. ! Рис. 10.1. Применение пользовательской функции вформуле рабочего листа Фактически такая функция действует подобно любой встроенной функции рабочего листа. Вы можете вставить функцию в формулу, используя команду Формулы «^Библиотека функций ^Вставить функцию (Formulas ^Function LibraryО Insert Function) или кнопку мастера функций в левой части строки формул. Любое из этих действий приведет к появле­ нию диалогового окна Мастер функций (Insert Function), в котором находятся пользователь­ ские функции (обычно — в категории Определенные пользователем (User Defined)). Вы также можете создавать вложенные пользовательские функции и сочетать их в формулах с другими элементами. Например, приведенная ниже формула вкладывает функцию R e m o v e V o w e l s в функцию Excel П Р О П И С Н (Upper). В результате исходная строка преобразуется в символы верхнего регистра (без гласных). =ПР0ПИСН (R e m o v e V o w e ls ( A l) ) 103ak. 3107 290 Часть III. Visual Basic for Applications Использование функции в процедуре VBA Пользовательские функции можно применять не только в формулах рабочего листа, но и в процедурах VBA. Следующая процедура VBA, определенная в том же модуле, что и пользо­ вательская функция RemoveVowels, сначала отображает окно для ввода текста пользовате­ лем. Затем процедура применяет встроенную функцию VBA MsgBox для отображения дан­ ных, введенных пользователем, но уже после их обработки функцией RemoveVowels (рис. 10.2). Первоначальные данные отображаются в заголовке окна сообщения. S u b Z a p T h e V o w e ls () D im U s e r l n p u t a s S t r i n g U s e r ln p u t = I n p u t B o x ( "В в е д и те т е к с т : " ) M sg B o x R e m o v e V o w e ls ( U s e r ln p u t ) , , U s e r ln p u t End Sub В примере, показанном на рис. 10.2, в ответ на приглашение функции InputBox бы­ ла введена строка П роф ессиональное програм м ирование на VBA в Excel. Функция MsgBox отображает текст без гласных букв. Профессиональное программирование на VBA в Excel *1 Прфсшльн пргрнгфвн н VB в xd |~ ОК | Рис. 10.2. Применение пользовательской функции в процедуре VBA Чего нельзя сделать с помощью пользовательских функций При разработке пользовательских функций важно понимать различия между функ­ циями, которые вызываются из других процедур VBA, и функциями, используемыми в формулах рабочего листа. Функции, используемые в формулах рабочего листа,— “пассивные”. Например, такая функция не может обрабатывать диапазоны либо изменять содержимое рабочего листа. Соответствующий практический пример приведен ниже. Можете попробовать написать функцию рабочего листа, которая изменяет содер­ жимое ячейки. Например, рекомендуется всегда иметь под рукой формулу, которая изменяет цвет текста в ячейке в зависимости от значения этой ячейки. Однако несмот­ ря ни на что, такую функцию написать невозможно. Что бы вы ни делали, функция все­ гда будет возвращать ошибку. Помните: функция возвращает значение, но не может выполнять операции над объектами. Следует отметить, что из этого правила имеется одно исключение. Вы можете из­ менить текст комментария ячейки с помощью пользовательской функции VBA, код ко­ торой приведен ниже. F u n c t i o n M o d if y C o m m e n t ( C e l l A s R a n g e , C e l l . C o m m e n t . T e x t Cm t End F u n c t io n Cm t A s S t r in g ) Далее приведен пример использования этой функции в формуле. Текст коммента­ рия в ячейке А1 заменяется новым текстом. Функция не работает, если в ячейке А1 от­ сутствует комментарий. = M o d if y C o m m e n t ( A l, " К о м м е н т а р и й был и з м е н е н " ) Глава 10. Создание функций 291 Анализ пользовательской функции Функции могут быть достаточно сложными, если это необходимо. Как правило, они более сложны и намного более полезны, чем процедура в приведенном ниже примере. Ианализ рассматриваемого в предыдущем разделе примера функции поможет вам разо­ браться в данном вопросе. Приведем текст функции. F u n c t io n R e m o v e V o w e ls ( T x t ) A s S t r i n g ' Удаляет в се гл асн ы е буквы и з т е к с т о в о г о а р гу м е н та Dim i A s L o n g R e m o v e V o w e ls = " " Fo r i = 1 To L e n ( T x t) I f N o t U C a s e ( M id ( T x t , i , 1 ) ) L i k e " [АЕЮ иАЕИО УЫ ЭЮ Я] " T h e n R e m o v e V o w e ls = R e m o v e V o w e ls & M i d ( T x t , i , 1) End I f Next i End F u n c t i o n Обратите внимание, что функция начинается с ключевого слова F u n c tio n , а не Sub, после которого указывается название функции (RemoveVowels). Эта специальная функция использует только один аргумент (Txt), заключенный в скобки. Ключевое сло­ воAs S t r i n g определяет тип данных значения, которое возвращает функция. (Excel по умолчанию использует тип данных V a r i a n t , если тип данных не определен.) Вторая строка— простой комментарий (необязательный), который описывает вы­ полняемые функцией действия. После комментария приведен оператор Dim, который объявляет переменную (i), применяемую в функции. Тип этой переменной — Long. •ч Примечание Обратите внимание, что в данном случае в качестве переменной используется имя функции. Как только функция завершает свое выполнение, возвращается текущее значение переменной, которое соответствует названию функции. Следующие пять инструкций образуют цикл F o r-N e x t. Процедура циклически про­ сматривает каждый символ введенного текста, создавая на их основе строку. Первая ин­ струкция в цикле использует функцию VBA Mid, которая возвращает единственный символ строки ввода, а также преобразует этот символ в символ верхнего регистра. За­ тем этот символ сравнивается со списком символов с помощью оператора Excel L ik e . Другими словами, значение выражения I f будет T ru e, если символ отличен от симво­ лов А, Е, I, О, U, А, Е, И, О, У, Ы, Э, Юи Я. В подобных случаях символ добавляется к пе­ ременной RemoveVowels. По завершении цикла из строки ввода удаляются все гласные буквы. Эта строка и яв­ ляется значением, возвращаемым функцией RemoveVowels. Сама процедура заверша­ ется оператором End Func t i on. Имейте в виду, что кодирование функции может осуществляться различными спосо­ бами. Ниже приведен код функции, которая выполняет те же действия, что и предыду­ щая функция, но закодирована иначе. F u n c tio n R e m o v e V o w e ls ( t x t ) A s S t r i n g 1 Уд аляет в с е г л а с н ы е б у к в ы и з т е к с т о в о г о Dim i A s L o n g Dim T e m p S t r in g A s S t r i n g ар гум ен та (T x t) 292 Часть III. Visual Basic for Applications T e m p S t r in g = " " F o r i = 1 To L e n ( tx t) S e le c t C a se u c a s e ( M id ( t x t , i , 1 )) C ase "A ", "E ", " I " , "0 ", "U " , "A ", "О ", "У ", " Ы " # " Э " , "Ю ", "Я " ' Н и ч его не д е л а т ь C a se E ls e T e m p S t r in g = T e m p S t r in g & M i d ( t x t , i , End S e le c t N ext i R e m o v e V o w e ls = T e m p S t r in g E n d F u n c t io n "E ", "И ", 1) В этой версии программы использовалась текстовая переменная (TempString), в которой хранится конструируемая строка символов (без гласных букв). Затем, перед завершением процедуры, содержимое переменной TempString было присвоено назва­ нию функции. В этой версии также применяется конструкция Select Case вместо конструкции If-Then. Компакт-диск Обе версии описываемой в этом разделе функции можно найти на прила­ гаемом к книге компакт-диске в файле re m o v e v o w e l s . x ls m . Синтаксис функции Пользовательские функции имеют много общего с процедурами типа Sub. (Детально о процедурах типа Sub рассказано в главе 9.) Для объявления функции применяется следующий синтаксис. [ P u b lic | P r iv a t e ] [ S t a t ic ] F u n c t io n имя ( [ с п и с о к _ а р г у м е н т о в ] ) [A s тип] [и н с т р у к ц и и ] [имя = вы раж ен и е] [ E x it F u n c t io n ] [и н с т р у к ц и и ] [им я = в ы р а ж е н и е ] E n d F u n c t io n Функция состоит из следующих ключевых элементов. • Public (необязательное ключевое слово). Указывает, что функция доступна для других процедур во всех остальных модулях активных проектов VBA. • Private (необязательное ключевое слово). Указывает, что функция доступна только для других процедур в текущем модуле. • Static (необязательное ключевое слово). Указывает, что значения переменных, которые объявлены в функции, сохраняются между вызовами функции. • Function (обязательное ключевое слово). Обозначает начало функции, возвра­ щающей значение или другие данные. • (обязательное ключевое слово). Представляет произвольное название функ­ ции. При именовании функций используются те же правила, что и при задании имен переменным. По окончании выполнения функции результат присваивается ее названию. Имя Глава 10. Создание функций 293 • С п и с о к _ а р г у м е н т о в (необязательный). Список одной или нескольких пере­ менных, представляющих аргументы, которые передаются в функцию. Аргументы заключены в скобки. Для разделения пар аргументов используется запятая. • Тип • И нст рукции • E x it (необязательный). Тип данных, который возвращает функция. (необязательные). Корректные инструкции VBA. F u n c t i o n (необязательный). Оператор, вызывающий немедленный выход из функции до ее завершения. • E n d F u n c t i o n (обязательное). Ключевое слово, обозначающее конец функции. О пользовательских функциях, написанных на VBA, необходимо знать следующее: значение всегда присваивается названию функции минимум один раз и, как правило, то­ гда, когда функция завершила выполнение. Создание пользовательской функции начните с создания модуля VBA (можно также использовать существующий модуль). Введите ключевое слово F u n c tio n , после кото­ рого укажите название функции и список ее аргументов (если они есть) в скобках. Вы также можете объявить тип данных значения, которое возвращает функция, используя ключевое слово As (это делать необязательно, но рекомендуется). Вставьте код VBA, выполняющий требуемые действия, и убедитесь, что необходимое значение присваива­ ется переменной процедуры, соответствующей названию функции, минимум один раз втеле функции. Функция заканчивается оператором End F u n c tio n . Имена функций подчиняются тем же правилам, что и имена переменных. Если вы планируете использовать функцию в формуле рабочего листа, убедитесь, что название не имеет форму адреса ячейки. Например, если в качестве имени функции указывается J21, заключите его в кавычки: = ' J 2 1 ' (А1). Лучше всего вообще не использовать имена функций, являющиеся ссылками на ячейки, включая именованные диапазоны. Также не присваивайте функциям имена, которые соот­ ветствуют названиям встроенных функций Excel. В случае возникновения конфликта меж­ ду именами функций программа Excel всегда делает выбор в пользу встроенных функций. Область действия функции В главе 9 была рассмотрена концепция области действия процедуры ( P u b lic или Private). То же самое относится и к функциям: область действия функции определяет, может ли она быть вызвана процедурами в других модулях или рабочих листах. Ниже представлены условия, о которых следует помнить при определении области действия функции. • Если область действия функции не задана, то по умолчанию подразумевается P u b lic . • Функции, объявленные как P r i v a t e , не отображаются в диалоговом окне Мас­ тер функций (Insert Function). Следовательно, при создании функции, которая должна использоваться только в процедуре VBA, необходимо объявить ее как P r i v a t e , чтобы пользователи не пытались применять ее в формуле. • Если в программе VBA необходимо вызвать функцию, которая определена в дру­ гой рабочей книге, задайте ссылку на другую рабочую книгу, воспользовавшись командой VBE Tools'^ References (Сервис^Ссылки). 294 Часть III. Visual Basic for Applications Выполнение функций В то время как процедура (Sub) может вызываться на выполнение различными спо­ собами, функцию (Function) можно вызвать одним из следующих способов: • вызвать ее из другой процедуры; • включить ее в формулу рабочего листа; • включить в формулу условного форматирования; • вызвать ее в окне отладки VBE (Immediate). Вызов из процедуры Пользовательские функции можно вызывать из процедуры точно так же, как и встро­ енные функции. Например, после определения функции с названием SumArray в код вводится оператор, показанный ниже. T o ta l = S u m A r r a y (М у А гга у ) Этот оператор выполняет функцию SumArray с аргументом МуАггау, возвращает результат функции и присваивает его переменной Total. Кроме того, можно использовать метод Run объекта Application. Соответствую­ щий пример приводится ниже. T o ta l = A p p lic a t i o n . Run ("S u m A rra y ", "М уА ггау") Первый аргумент метода R u n — имя функции. Дополнительные аргументы пред­ ставляют аргумент (аргументы) функции. Аргументами метода Run могут быть строки (как показано выше), числа или переменные. Использование в формуле рабочего листа Применение специальных функций в формуле рабочего листа во многом подобно применению встроенных функций, за некоторым исключением. Удостоверьтесь, что Excel может найти необходимую функцию. Если функция сохранена в той же рабочей книге, то ничего особенного делать не нужно. Если же функция находится в другой ра­ бочей книге, то необходимо указать Excel, где ее найти. Вы вправе выбрать один из трех способов. • Указать перед названием функции ссылку на файл. Например, если вы реши­ ли использовать функцию с названием CountNames, определенную в открытой рабочей книге Myf unc .xlsm, то обратитесь к следующей ссылке: = M y f u n c s . x ls m ! C o u n t N a m e s ( A l: A 1 0 0 0 ) • • Если вы вставите функцию в диалоговом окне мастера функций (Insert Function), то ссылка на рабочую книгу будет добавлена автоматически. Установить ссылку на рабочую книгу. Это можно сделать с помощью команды VBE T ools^R eferences (Сервис^Ссылки). Если функция определена в рабочей книге, на которую установлена ссылка, то не следует указывать имя рабочего лис­ та. Даже если зависимая рабочая книга определена по ссылке, в диалоговом окне М а с те р функций (Insert Function) указывается рабочая книга, содержащая функ­ цию (хотя и необязательно). Создать надстройку. При создании надстройки на основе рабочей книги, в которой представлены функции, можно не задавать ссылку на файл, если одна из функций используется в формуле. Однако надстройку необходимо устанавливать. Детально надстройки рассматриваются в главе 21. Глава 10. Создание функций 295 В отличие от процедур, функции не отображаются в диалоговом окне Макрос (Macro) при выполнении команды РазработчикаКод1^Макросы (Developer^Code^Macros). Кроме того, функцию нельзя выбрать при использовании команды VBE Run«=>Sub/UserForm (Выполнить^Процедуру/пользовательскую форму) (или нажатии <F5>), если кур­ сор установлен в тексте функции (так как при этом отображается диалоговое окно Мак­ рос, в котором можно выбрать макрос для выполнения). Именно поэтому необходимо выполнить дополнительные действия по тестированию функций еще в процессе разра­ ботки. Один из возможных подходов— создать простую процедуру, вызывающую функцию. Если функция должна использоваться в формулах рабочего листа, то для ее проверки следует ввести простую формулу. Использование в формулах условного форматирования Условное форматирование подразумевает создание формул, которые являются логиче­ скими (т.е. возвращают значения И с т и н а (True) или Л о ж ь (False)). Если формула возвращает значение И с т и н а , условие выполняется, и форматирование применяется к выбранной ячейке. В формулах, определяющих условное форматирование, могут применяться пользова­ тельские функции VBA. Например, ниже приводится пример простой функции VBA, ко­ торая возвращает значение И с т и н а в том случае, если в качестве ее аргумента выступа­ ет ячейка, которая включает формулу. F u n ctio n C E LLH A S F O R M U LA ( c e l l ) A s B o o l e a n CELLHASFORMULA = c e l l . H a s F o r m u la End F u n c t io n После определения этой функции в модуле VBA можно установить правило условно­ го форматирования, суть которого заключается в том, что ячейки с формулами будут от­ форматированы особым образом. 1. Выделите диапазон ячеек, к которому будет применяться условное форматирование. Например, выделите ячейки A1:G20. 2. Выполните команду Главная^Стили^Условное форматирование^Создать правило (HornedStyles^Conditional Formatting^New Rule). 3. В диалоговом окне Создание правила форматирования (New Formatting Rule) ' выберите параметр Использовать формулу для определения форматируе­ мых ячеек (Use a Formula to Determine Which Cells to Format). 4. В поле ввода введите формулу, при этом следите, чтобы аргумент, определяющий ячейку, соответствовал ячейке, находящейся в верхнем левом углу диапазона, ко­ торый был выделен в п. 1. =C E L L H A S F O R M U L A (A l ) 5. Щелкните на кнопке Формат (Format) для определения формата ячеек, которые соответствуют условию форматирования. 6. Щелкните на кнопке О К для применения правила условного форматирования к выделенному диапазону. Ячейки из диапазона, который содержит формулу, будут отображаться с применением выбранного вами формата. На рис. 10.3 показано диалоговое окно Создание правила фор­ матирования, в котором для определения формулы применяется пользовательская функция. 296 Часть III. Visual Basic for Applications Рис. 10.3. Применение пользовательской функции VBA при условном форматировании Вызов функции из окна отладки в VBE Еще один способ вызова функции на выполнение — обратиться к окну отладки VBE (Immediate). Этот метод обычно применяется на этапе тестирования. На рис. 10.4 пока­ зан соответствующий пример. 'Л Microsoft Visual Basic for Applications Щ fit* id » ¥»ew jnsert Fgrmat УдаленнеГласныхБукв.х1яп £>ebug Run Tools ►a J |£ Add-Ins [Modulel (Code)] Window Help Project - VSAProject j^ ] ^ И Й Й L-j ^ Введите вопрос J* ar » _ ff x 1- R em oveV ow els F u n c t io n R e m o v e V o w e ls(T x t) A s S t r i n g ' У д ал я ет в с е гл асн ы е буквы и з т е к с т о в о г о а р гу м ен т а Dim i A s Long R em oveV ow els = "" F or i = 1 To L e n (T x t) I f N o t U C a s e (M id (T x t, i , 1 ) ) L ik e " [АЕI ОиАЕИОУЫЭЮЯ] ’’ R em oveV ow els = R em oveV ow els & M id (T x t, i , 1 ) End I f N ext i End F u n c t io n A<-obdtl1HMdl<fr (PDF Maker PUP/TRIAL (pup 7.xlam) SC Menus (shortcut т е т м .р и VBAProject (PtRSONAl.XlSB) Q Microsoft Exori Objects ® | Modules Modulel Module 2 VBAProject (У д ал е н и еГ nacHi Microsoft Excel Objects 1 3 Лист* (№crl) ® Лист2 (Лист?) ~ ЛистЗ (ЛистЗ) ЭтаКмига Й 8Л Mockiel If ? r e m o v e v o w e ls (" м иссия за в ер ш е н а ” ) м с с звршн Л МЫ J Рис. 10.4. Вызов функции в окне отладки Изобретаем колесо Развлечения ради я написал собственную версию функции Excel зует символы строки в верхний регистр) и назвал ее U p C a s e . F u n c t io n U p C a s e (I n S t r i n g A s S t r in g ) A s S t r in g ' П р е о б р а зу е т сим волы а р гу м е н т а в в е р хн и й р е г и с т р . D im S t r i n g L e n g t h A s I n t e g e r прописн (преобра­ Глава 10. Создание функций 297 Dim i A s I n t e g e r Dim A S C I I V a l A s I n t e g e r Dim C h a r V a l A s I n t e g e r S t r in g L e n g t h = L e n (I n S t r i n g ) U p C a se = I n S t r i n g Fo r i = 1 To S t r in g L e n g t h A S C I I V a l = A s c ( M id ( I n S t r in g , i , 1 )) C h a rV a l = 0 I f A S C I I V a l >= 97 A n d A S C I I V a l <= 122 T h e n C h a r V a l = -3 2 M id ( U p C a s e , i , 1) = C h r ( A S C I I V a l + C h a r V a l) End I f N ext i End F u n c t io n Примечание. Рабочая книга, содержащая эту функцию, находится на прилагаемом ккниге компакт-диске в файле u p p e r c a s e . x ls m . Обратите внимание, что я выбрал относительно простой путь, — обратился к функ­ ции VBA U C a s e . Итак, мне было интересно посмотреть, чем пользовательская функция отличается от встроенной, поэтому я создал рабочий лист, который вызывает функцию 20 тысяч разе помощью случайных имен. Вычисления продолжались примерно 20 секунд. Затем я подставил встроенную функцию Excel u p p e r и в ы п о л н и л тест еще раз. На этот раз вы­ числения были выполнены практически мгновенно. Конечно, моя функция U p C a s e вряд ли работает на основе оптимального алгоритма, более того, любая встроенная функция Excel работает быстрее самой лучшей пользовательской функции. Еще один п рим ер “изобретения ко л е са” можно найти в разделе “Имитация функции СУММ” . Аргументы функций Всегда помните о следующих особенностях аргументов процедур-функций: • аргументы могут представляться переменными (в том числе массивами), констан­ тами, символьными данными или выражениями; • некоторые функции не имеют аргументов; • определенные функции имеют строго заданное число обязательных аргументов (от 1 до 60); • отдельные функции имеют как обязательные, так и необязательные аргументы. Примечание Если формула содержит пользовательскую функцию рабочего листа и воз­ вращает # з н а ч !, это означает наличие ошибки в функции. Ошибка может быть вызвана логическими ошибками в программе или передачей в функ­ цию некорректных аргументов (см. раздел “Отладка функций”). Примеры функций В настоящем разделе приведен ряд примеров, иллюстрирующих эффективное ис­ пользование аргументов функций. Данный материал касается также процедур (Sub). 298 Часть III. Visual Basic for Applications Функции без аргументов Как и процедуры, пользовательские функции необязательно должны иметь аргумен­ ты. Например, в Excel есть несколько таких встроенных функций, в том числе СЛ Ч И С, С Е Г О Д Н Я и Т Д А Т А . Несложно создать аналогичные функции. Ниже вы найдете примеры функций, в которых аргументы не используются. Компакт-диск Рабочая книга, содержащая функции без аргументов, находится на прила­ гаемом к книге компакт-диске. Соответствующий файл называется n o a r ­ g u m e n t . x ls m . Ниже приведен пример простой функции, не использующей аргументов. Следующая функция возвращает свойство UserName объекта Application. Это имя отображает­ ся в диалоговом окне Excel Параметры E x ce l (Excel Options), раздел Основные (General), и хранится в системном реестре Windows. F u n c t i o n U s e r () ' В о зв р а щ а е т имя п о л ь з о в а т е л я U s e r = A p p lic a t io n .U s e r N a m e E n d F u n c t io n При вводе следующей формулы ячейка возвращает имя текущего пользователя (предполагается, что оно сохранено в реестре). = U s e r () Примечание При использовании функции без аргумента в формуле рабочего листа необ­ ходимо указать пустые скобки. Это требование необязательно, если функ­ ция вызывается в процедуре VBA, но включение пустых скобок означает, что вызывается именно функция. Чтобы использовать данную функцию в другой процедуре, ее следует присвоить пе­ ременной, применить в выражении или использовать как аргумент другой функции. В следующем примере вызывается функция User и в качестве аргумента оператора MsgBox используется значение, которое она возвращает. Оператор конкатенации (&) объединяет текстовую строку с результатом функции User. S u b S h o w U s e r () M s g B o x "В аш е и м я End Sub " & U s e r () В следующем примере демонстрируется, каким образом можно создать функциюоболочку, которая возвращает свойство или результат выполнения функции VBA. Ниже приведены три дополнительные функции-оболочки, которые не имеют аргументов. F u n c t io n E x c e lD ir O A s S t r in g ' Во звращ ает н а зв а н и е п ап ки , в к о то р о й у ст а н о в л е н а E x c e lD ir = A p p lic a t io n . P a th En d F u n c t io n Excel F u n c t i o n S h e e t C o u n t () ' Возвращ ает к о л и ч е с т в о л и ст о в в ра б о ч ей к н и ге S h e e tC o u n t = A p p lic a t io n . C a l l e r . P a r e n t . P a r e n t . S h e e t s . C o u n t E n d F u n c t io n Глава 10. Создание функций 299 F u n c t io n S h e e tN a m e () ' В о зв р а щ а е т имя р а б о ч е г о л и с т а S h e e tN a m e = A p p l i c a t i o n . C a l l e r . P a r e n t . N a m e End F u n c t i o n Управление пересчетом функций Возможно, вам будет интересно узнать, когда при использовании пользовательской функции в формуле рабочего листа пересчитывается ее значение. Пользовательские функции ведут себя подобно встроенным функциям Excel. Обыч­ но пользовательская функция пересчитывается тогда, когда это нужно, т.е. в случае и з­ менения одного из аргументов функции. Однако вы можете выполнять пересчет функ­ ций чаще. Функция пересчитывается при изменении любой ячейки, если в процедуру добавлен указанный ниже оператор. В процессе использования режима автоматиче­ ских вычислений они выполняются при изменении любой ячейки. A p p lic a t io n . V o la t ile T ru e Метод V o l a t i l e объекта A p p l i c a t i o n имеет один аргумент ( T r u e или F a ls e ) . Если функция выделена как v o l a t i l e (изменяемая), она пересчитывается всякий раз, когда изменяется любая ячейка листа. Например, поведение пользовательской функции s t a t i c R a n d может быть измене­ но с помощью метода v o l a t i l e так, чтобы оно напоминало поведение функции Excel слчис. F u n c tio n N o n S t a t ic R a n d () 1 В о зв р а щ а е т с л у ч а й н о е ч и с л о , 1 и зм е н я е тся при каж дом п е р е с ч е т е A p p lic a t io n . V o la t ile T ru e N o n S t a t ic R a n d = R n d () End F u n c t io n При использовании аргумента F a l s e метода v o l a t i l e функция пересчитывается только тогда, когда в результате пересчета изменяется один из ее аргументов. (Если функция не имеет аргументов, этот метод неэффективен.) Чтобы выполнить полный пересчет формул, включая неизменные пользовательские функции, нажмите клавиши <Ctrl+Alt+F9>. Эта комбинация клавиш, к примеру, генери­ рует новые случайные числа с помощью описанной в этой главе функции s t a t i c R a n d . А теперь рассмотрим еще один пример функции без аргументов. Для быстрого за­ полнения диапазона ячеек используется функция Excel СЛЧИС. Но мне не слишком по­ нравилось, что случайные числа изменяются при каждом пересчете рабочего листа. По­ этому я преобразовал формулы в их значения. Затем я разработал функцию, которая возвращает случайные числа, не изменяющиеся при пересчете формул. Для этого была использована встроенная функция VBA Rnd, ко­ торая возвращает случайное число в диапазоне от 0 до 1. Эта функция будет выглядеть следующим образом. F u n c tio n S t a t i c R a n d () 1 В о зв р а щ а е т с л у ч а й н о е ч и с л о , ' не и з м е н я е т с я п р и п е р е с ч е т е S t a t ic R a n d = R n d ( ) End F u n c t io n которое ф о р м ул 300 Часть III. Visual Basic for Applications Если нужно сгенерировать набор случайных чисел между 0 и 1000, воспользуйтесь следующей формулой: = I N T ( S t a t ic R a n d ()* 1 0 0 0 ) Значения, полученные с помощью этой формулы, никогда не изменяются. Но у поль­ зователя остается возможность пересчета формулы с помощью комбинации клавиш <Ctrl+Alt+F9>. Функция с одним аргументом В этом разделе описана функция, используемая для подсчета комиссионных с объема про­ даж одного из менеджеров. Вычисления основываются на следующей таблице значений. Объем продаж за м еся ц ($) Ставка комиссионных (%) 0-9999 10000-19999 20000-39999 Больше 40000 8,0 10,5 12,0 14,0 Обратите внимание, что ставка комиссионных изменяется не линейно и зависит от общего объема продаж за месяц. Служащие, которые продают больше, получают более высокие комиссионные. Существует несколько способов вычислить комиссионные для различных объемов продаж, введенных в таблицу Excel. Потратив немного времени, вы можете получить длинную формулу, подобную приведенной ниже. = Е С Л И (И (А 1 > = 0 / А 1 < = 9 9 9 9 .9 9 ) , А 1 * 0 . 0 8 , Е С Л И ( И ( А 1 > = 1 0 0 0 0 , А 1 < = 1 9 9 9 9 . 9 9 ) , А 1 * 0 .1 0 5 , Е С Л И ( И ( А 1 > = 2 0 0 0 0 ,А 1 < = 3 9 9 9 9 . 9 9 ) , А 1 * 0 . 1 2 , Е С Л И (А 1 > = 4 0 0 0 0 , А 1 * 0 . 1 4 , 0 ) ) ) ) Такая идея неудачна по нескольким причинам. Во-первых, формула чрезмерно слож­ на, и ее нелегко понять. Во-вторых, значения строго определены в формуле, из-за чего ее сложно изменять. Рекомендуется применить описанный ниже подход (не требующий программирова­ ния на VBA): использовать для вычисления ставки комиссионных функцию просмотра таблицы соответствия ВПР (VLOOKUP). Например, следующая формула использует функцию ВПР для выборки значения комиссионных из диапазона T a b le , а также умно­ жает его на величину, которая хранится в ячейке А1. = В П Р ( A l , T a b l e ,2 ) *А1 Еще лучше (тогда не нужно использовать таблицу соответствия) создать пользова­ тельскую функцию, представленную ниже. F u n c t i o n C o m m i s s io n ( S a le s ) C o n s t T i e r l = 0 .0 8 C o n s t T ie r 2 = 0 .1 0 5 C o n s t T ie r 3 = 0 .1 2 C o n s t T ie r 4 = 0 .1 4 ' В ы ч и сл я е т ко м и сси о н н ы е с объем а продаж S e le c t C a se S a le s C a s e 0 T o 9 9 9 9 . 9 9 : C o m m is s io n = S a l e s * T i e r l C a s e 1 0 0 0 T o 1 9 9 9 9 . 9 9 : C o m m is s io n = S a l e s * T i e r 2 C a s e 2 0 0 0 0 T o 3 9 9 9 9 . 9 9 : C o m m is s io n = S a l e s * T i e r 3 Глава 10. Создание функций C ase I s End S e l e c t End F u n c t i o n >= 4 0 0 0 0 : 301 C o m m is s io n = S a le s * T ie r 4 После ввода в модуль VBA эту функцию можно использовать в формуле на рабочем листе или вызвать из других процедур VBA. При вводе в ячейку следующей формулы будет получен результат 3000 (объем про­ даж 25000 соответствует ставке комиссионных 12%). = C o m m issio n ( 2 5 0 0 0 ) Даже если на рабочем листе не требуется применять пользовательские функции, их создание значительно упрощает программирование на VBA. Например, если процедура VBA вычисляет комиссионные с продаж, то можно использовать точно такую же функ­ цию и вызвать ее из процедуры VBA. Ниже приведена небольшая процедура, запраши­ вающая у пользователя объем продаж и использующая функцию C om m ission для вы­ числения ставки комиссионных. Sub C a lc C o m m O Dim S a l e s a s L o n g S a le s = I n p u t B o x ( " В в е д и т е о б ъ е м п р о д а ж : " ) M sgB ox " К о м и с с и о н н ы е с о с т а в л я ю т " & C o m m i s s io n ( S a le s ) End Sub Процедура CalcComm сначала отображает окно ввода данных и запрашивает у поль­ зователя объем продаж. Затем она отображает окно сообщения с вычисленными комис­ сионными для введенного объема продаж. Данная процедура выполняется, но она далека от совершенства. Ниже показана усовершенствованная версия процедуры, отображающая отформатированные значения и предлагающая повторить цикл вычислений, пока пользователь не щелкнет на кнопке Нет (рис. 10.5). Sub C alcC om m () Dim S a l e s A s L o n g Dim M sg A s S t r i n g , Ans As Объем продаж: Комиссионные: S t r in g $24 500,СЮ $2 940,00 Новое вычисление5 ' За п р о с о в в о д е о б ъ е м а продаж S a le s = V a l ( I n p u t B o x ( " В в е д и т е о б ъ е м продаж: " , _ "К а л ь к у л я т о р ко м и сси о н н ы х с продаж 1 С о зд а н и е с о о б щ е н и я Msg = "О б ъ е м п р о д а ж : " & v b T a b & F o r m a t ( S a l e s , " $ # , # # 0 .0 0 " ) Msg = M sg & v b C r L f & " К о м и с с и о н н ы е : " Msg = M sg & F o r m a t ( C o m m i s s i o n ( S a l e s ) , Msg = M sg & v b C r L f & v b C r L f & " Н о в о е | ")) Да | Нет j Рис. 10.5.Использование функ­ ции для отображения результатов вычислениякомиссионных с продаж & vbTab " $ # , # # 0 .0 0 " ) вы числение?" ' О то бр аж ен ие р е з у л ь т а т а и з а п р о с с л е д у ю щ е г о в ы ч и с л е н и я Ans = M s g B o x ( M s g , v b Y e s N o , " К а л ь к у л я т о р к о м и с с и о н н ы х с п р о д а ж " ) I f A n s = v b Y e s T h e n C a lc C o m m End Sub Эта функция использует две встроенные константы VBA: vbTab обозначает табуля­ цию (чтобы отделить результат), a vbCrLf определяет возврат каретки (для перехода на следующую строку). Функция VBA Format указывает значение в заданном формате (в данном случае со знаком доллара, пробелом для разделения разрядов и двумя деся­ тичными знаками). Часть III. Visual Basic for Applications 302 В обоих этих примерах функция C om m ission должна содержаться в активной рабо­ чей книге; в противном случае Excel отобразит сообщение об ошибке, указывающее, что функция не определена. Используйте аргументы, а не ссылки на ячейки Все применяемые в пользовательской функции диапазоны должны передаваться в качестве аргументов. Рассмотрим функцию, которая возвращает значение в ячей­ ке А 1 , умноженное на 2. F u n c t io n D o u b le C e llO D o u b le C e ll = R a n g e ( " A l" ) E n d F u n c t io n * 2 Хотя эта функция работает, в некоторых случаях она выдает неправильный резуль­ тат. Причина в том, что вычислительный механизм Excel не учитывает диапазоны, кото­ рые не передаются в качестве аргументов. Вследствие этого иногда перед возвратом функцией значения не вычисляются все связанные величины. Следует также написать функцию D o u b l e C e l l , в качестве аргумента которой передается значение ячейки А1. F u n c t io n D o u b l e C e ll ( c e l l ) D o u b le C e ll = c e l l * 2 E n d F u n c t io n Функция с двумя аргументами Представим, что менеджер, о котором речь шла выше, внедряет новую политику, разработанную для уменьшения текучести кадров: общая сумма комиссионных, подле­ жащих выплате, увеличивается на 1% за каждый год, который служащий проработал в компании. Изменим пользовательскую функцию Commission (описанную в предыдущем разде­ ле) так, чтобы она принимала два аргумента. Новый аргумент представляет количество лет, отработанных сотрудником в компании. Назовем эту новую функцию Commission2. F u n c t io n C o m m is s io n 2 ( S a le s , Y e a r s ) 1 В ы ч и сл я е т к о м и сси о н н ы е с продаж на о с н о в е ' р а б о ч е го стаж а в ком пан ии C o n s t T i e r l = 0 .0 8 C o n s t T ie r 2 = 0 .1 0 5 C o n s t T ie r 3 = 0 .1 2 C o n s t T ie r 4 = 0 .1 4 S e le c t C a se S a le s C a s e 0 T o 9 9 9 9 . 9 9 : C o m m is s io n 2 = S a l e s * T i e r l C a s e 1 0 0 0 T o 1 9 9 9 9 . 9 9 : C o m m is s io n 2 = S a l e s * T i e r 2 C a s e 2 0 0 0 0 T o 3 9 9 9 9 . 9 9 : C o m m is s io n 2 = S a le s * T ie r 3 C a s e I s >= 4 0 0 0 0 : C o m m is s io n 2 =S a l e s * T ie r 4 End S e le c t C o m m is s io n 2 = C o m m is s io n 2 + ( C o m m is s io n 2 * Y e a r s / 1 0 0 ) En d F u n c t io n Довольно просто, правда? Добавим второй аргумент (Years) в оператор Function и применим дополнительные вычисления, изменяющие формулу комиссионных. Далее приведен пример написания формулы с использованием этой функции (предполагается, что объем продаж задан в ячейке А1, а количество лет, которые прора­ ботал в компании рассматриваемый служащий, указано в ячейке В1). = C o m m is s io n 2 ( А 1 , В 1 ) 303 Глава 10. Создание функций Компакт-диск Все описанные выше процедуры вычисления комиссионных находятся на прилагаемом к книге компакт-диске, в файле c o m i s s i o n f u n c t i o n s . x ls m . Функция с аргументом в виде массива В качестве аргументов функции могут принимать один или несколько массивов, об­ рабатывать этот массив (массивы) и возвращать единственное значение. Функция, представленная ниже, принимает как аргумент массив и возвращает сумму его элементов. F u n c tio n S u m A r r a y ( L i s t ) A s D o u b le Dim I te m A s V a r i a n t S u m A rra y = 0 For E a ch Ite m I n L i s t I f W o r k s h e e t F u n c t io n . Is N u m b e r(Ite m ) S u m A rra y = S u m A rra y + Ite m N e xt I te m End F u n c t io n Then _ Функция Excel ЕЧИСЛО (IsNumber) проверяет, является ли каждый элемент числом, прежде чем добавить его к общему целому. Добавление этого простого оператора про­ верки данных устраняет ошибки несоответствия типов при попытке выполнить арифме­ тическую операцию над строкой. Следующая процедура демонстрирует, как вызвать эту функцию в процедуре. Проце­ дура MakeList создает 100-элементный массив и присваивает каждому элементу мас­ сива случайное число. Функция MsgBox отображает сумму значений массива в резуль­ тате вызова функции SumArray. Sub M a k e L is t () Dim N u m s ( l T o 10 0) A s D o u b le Dim i a s I n t e g e r F o r i = 1 T o 1 00 N u m s( i ) = R n d * 1 0 0 0 N e xt i MsgBox S u m A r r a y ( N u m s ) End Sub Так как функция SumArray не объявляет тип данных своего аргумента (и аргумент имеет тип Variant), она работает и в формулах рабочего листа. Например, следующая формула возвращает сумму значений в диапазоне А1:С10. =SumArray (А1 :С 1 0 ) Возможно, вы заметили, что при использовании в формуле функция SumArray по­ добна функции Excel СУММ. Единственное отличие заключается в том, что функция Su­ mArray принимает только один аргумент. Не стоит забывать, что этот пример приведен только в целях обучения. Функция SumArray в формуле не имеет абсолютно никаких преимуществ перед функцией Excel СУММ. Компакт-диск ЦЭД Этот пример под названием array argument.xlsm находится на прилагаемом к книге компакт-диске. 304 Часть III. Visual Basic for Applications Функция с необязательными аргументами Многие встроенные функции Excel имеют необязательные аргументы. Пример — функция ЛЕВСИМВ, возвращающая символы с левого края строки. Она имеет следующий синтаксис: Л Е В С И М В ( текст, кол_сим волов) Первый аргумент — обязательный, в отличие от второго. Если не указан второй ар­ гумент, Excel предполагает значение 1. Следовательно, две формулы, приведенные ниже, возвращают одинаковые результаты. = Л ЕВСИ М В(A l ,1 ) = Л ЕВСИ М В(А1) Пользовательские функции, разработанные в VBA, также могут иметь необязатель­ ные аргументы. Необязательный аргумент вы зададите, если введете перед именем аргу­ мента ключевое слово Optional. В списке аргументов необязательные аргументы оп­ ределяются после всех обязательных. Далее приведен пример пользовательской функции с необязательным аргументом. F u n c t io n U s e r ( O p t io n a l U p p e r c a s e A s V a r ia n t ) I f I s M is s in g ( U p p e r c a s e ) T h e n U p p e r c a s e = F a ls e U s e r = A p p lic a t io n .U s e r N a m e I f U p p e rc a se Then U s e r = U C a se (U se r) En d F u n c t io n Если аргумент равен False или опущен, то имя пользователя возвращается без ка­ ких-либо изменений. Если же аргумент функции True, то имя пользователя возвращает­ ся в символах верхнего регистра (с помощью VBA-функции Ucase). Обратите внимание на первый оператор функции — он содержит VBA-функцию IsMissing, которая опре­ деляет наличие аргумента. Если аргумент отсутствует, оператор присваивает переменной Uppercase значение False (задано по умолчанию). Приведенные ниже формулы справедливы, а первые две возвращают одинаковые ре­ зультаты. = U s e r () = U s e r ( F a ls e ) = U se r(T ru e ) Примечание Если нужно определить, подставляется ли необязательный аргумент в функ­ цию, объявите его с типом данных V a r i a n t . Затем можно использовать встроенную функцию I s M i s s i n g , как показано в этом примере. Далее' приведен пример еще одной пользовательской функции с необязательным ар­ гументом. Эта функция случайным образом выбирает одну ячейку из диапазона данных и возвращает содержимое этой ячейки. Если второй аргумент имеет значение True, то выделенное значение изменяется при каждом пересчете рабочего листа. Если второй ар­ гумент имеет значение False (или не задан), функция не пересчитывается, кроме тех случаев, когда изменяется одна из ячеек диапазона введенных данных. F u n c t i o n D ra w O n e ( R n g A s V a r i a n t , O p t i o n a l R e c a l c A s V a r i a n t = F a l s e ) 1 Случайны м о б р а зо м вы би рает од н у я ч е й к у и з д и а п а з о н а ; ' ф ункция и зм е н я е м а я , е с л и а р г у м е н т R e c a lc и м е е т з н а ч е н и е T ru e A p p l i c a t i o n . V o l a t i l e R e c a lc 1 Определение случайной ячейки 305 Глава 10. Создание функций D ra w O n e = R n g ( I n t ( ( R n g . C o u n t ) End F u n c t i o n * R nd + 1 )) Обратите внимание, что второй аргумент функции Draw содержит ключевое слово O p tio n al, а также значение, заданное по умолчанию. Все приведенные ниже формулы корректны, причем первые две возвращают одина­ ковые результаты. =DrawOne (A l : A l 0 0) =DrawOne ( A l : A 1 0 0 , F a l s e ) =DrawOne (A l :A l 0 0 , T r u e ) Эта функция может быть полезной для выбора лотерейных номеров, победителя из списка имен и т.д. Компакт-диск Приведенная выше функция доступна на прилагаемом к книге компактдиске и находится в файле d r a w . x ls m . Функция VBA, возвращающая массив VBA содержит весьма полезную функцию с названием A rray . Она возвращает значе­ ние с типом данных V a r ia n t , которое содержит массив (т.е. несколько значений). Если вы знакомы с формулами массивов в Excel, то сможете легко разобраться в функции Аг ray в VBA. Формула массива вводится в ячейку после нажатия <Ctrl+Shift+Enter>. Excel добавляет вокруг формулы скобки, чтобы указать, что это формула массива. © Перекрестная ссылка Более подробную информацию о формулах массивов вы найдете в главе 3. Примечание Важно понимать, что массив, возвращаемый функцией A r r a y , — это не тот обычный массив, который состоит из элементов с типом данных V a r i a n t . Другими словами, массив V a r i a n t существенно отличается от м ассива зна­ чений типа V a r i a n t . Функция MonthNames, приведенная ниже,— простой пример применения функции Array в пользовательской функции. F u n c tio n M o n th N a m e s () M onthN am es = A r r a y ( " Я н в " , " Ф е в " , " М а р " , " А п р " , _ "М а й ", "И ю н " , "И ю л ", " А в г " , " С е н " , " О к т " , _ "Н о я ", "Д е к " ) End F u n c t io n Функция MonthNames возвращает горизонтальный массив названий месяцев. Вы можете создать формулу массива для нескольких ячеек, используя функцию M onth­ Names. Прежде чем ее использовать, убедитесь, что в модуле VBA введен код функции. Затем на рабочем листе выделите несколько ячеек в строке (для начала выделите 12 яче­ ек), введите следующую формулу и нажмите <Ctrl+Shift+Enter>. {=MonthNames () } Часть III. Visual Basic for Applications 306 Если необходимо сгенерировать вертикальный массив названий месяцев, выделите вертикальный диапазон, введите следующую формулу и нажмите <Ctrl+Shift+Enter>. { = Т Р А Н С П ( M o n th N a m e s ( ) ) } Данная формула использует функцию Excel Т Р А Н С П для преобразования горизон­ тального массива в вертикальный. Следующий пример — вариация на тему функции MonthNames. F u n c t i o n M o n t h N a m e s ( O p t io n a l M ln d e x ) D im A llN a m e s A s V a r i a n t D im M o n t h V a l A s L o n g A llN a m e s = A r r a y ( " Я н в " , " Ф е в " , " M a p " , " A n p " , _ " М а й " , "И ю н " , "И ю л ", " А в г " , " С е н " , " О к т " , _ "Н о я ", "Д е к") I f I s M is s in g ( M ln d e x ) T h e n M o n th N a m e s = A llN a m e s E ls e S e l e c t C a s e M in d e x C a s e I s >= 1 1 О п р е д е л и т ь з н а ч е н и е м е с я ц а ( н а п р и м е р , 13= 1) M o n t h V a l = ( ( M ln d e x - 1) M od 12) M o n th N a m e s = A llN a m e s ( M o n t h V a l ) C a s e I s <= 0 1 В е р т и к а л ь н ы й м а с с и в M o n th N a m e s = A p p l i c a t i o n . T r a n s p o s e ( A llN a m e s ) End S e le c t End I f E n d F u n c t io n Обратите внимание, что для проверки незаданного аргумента используется функция VBA I s M is s in g . В данной ситуации невозможно задать значение по умолчанию для незаданного аргумента в списке аргументов функции, так как значение по умолчанию определяется в функции. Функцию I s M is s in g можно использовать, только если необя­ зательный аргумент имеет тип V a r ia n t . Эта усовершенствованная функция использует необязательный аргумент, который необходим для выполнения некоторых задач. • Если аргумент не задан, функция возвращает горизонтальный массив названий месяцев. • Если аргумент меньше или равен 0, функция возвращает вертикальный массив названий месяцев. Для преобразования массива используется функция Excel Т Р А Н С П (Transpose). • Если аргумент больше или равен 1, функция возвращает название месяца, соот­ ветствующее значению аргумента. Примечание В этой процедуре используется оператор M od для определения значения месяца. Этот оператор возвращает остаток от деления первого операнда на второй. Учтите, что нумерация индексов в м ассиве A llN a m e s начинается с нуля, а их диапазон простирается от 0 до 11. Поэтому из аргумента функции вычитается единица. Таким образом, аргумент 13 возвращает 0 (январь), ар­ гумент 24 — 11 (декабрь). Эту функцию можно использовать разными способами, как показано на рис. 10.6. 307 Глава 10. Создание функций В A 1 Янв Фев С М ар D Апр Е Май F G Июн Ию л Н Авг 1 Сен J О кт К Ноя L j М Дек 2 3 1 Янв Янв 4 2 Фев Фев 5 3 Мар М ар 6 4 А пр А пр 7 5 Май Май 8 6 Июн Июн 9 7 Июл Июл 10 8 Авг Авг 11 9 Сен Сен 12 10 Окт Окт 13 11 Ноя 14 12 Дек М ар Ноя Дек 15 Рис. 10.6. Несколько способов передачи в рабочий лист массива или одного значения Диапазон A1:L1 содержит следующую формулу, введенную как массив. Для начала выделите A1:L1, введите формулу и нажмите <Ctrl+Shift+Enter>. {=MonthNames () } В диапазоне АЗ:А14 находятся целые числа от 1 до 12. Ячейка ВЗ содержит обычную формулу, которая скопирована в 11 ячеек, следующих за ней. =MonthNames (АЗ) В диапазоне D3:D14 располагается формула, введенная как массив. {=MonthNames ( -1) } Диапазон F3 содержит следующую формулу (не массив): =MonthNames (3) Примечание Помните, что для ввода формулы м ассива нужно нажать <Ctrl+Shift+Enter> (не вводите фигурные скобки вручную). клавиши Примечание Нижняя граница массива, созданная с помощью функции A r r a y , определя­ ется нижней границей, заданной в операторе O p t i o n B a s e в верхней части модуля. Если оператор O p t i o n B a s e не задан, то по умолчанию нижняя гра­ ница равна 0. Компакт-диск Рабочая книга (m o n th n a m e s . x s lm ) , демонстрирую щ ая функцию M o n t h - N am es в действии, находится на прилагаемом к книге компакт-диске. Функция, возвращающая значение ошибки В некоторых случаях необходимо, чтобы пользовательская функция возвращала зна­ чение ошибки. Рассмотрим функцию R e m o v e V o w e l s , которая была представлена ранее. F u n c tio n R e m o v e V o w e ls ( T x t ) A s S t r i n g 1 Удаляет в с е гл а с н ы е б у к в ы и з т е к с т о в о г о а р г у м е н т а Dim i A s L o n g R e m o v e v o w e ls = " 11 For i = 1 To L e n ( T x t) I f N o t U C a s e ( M id ( T x t , i , 1) ) L i k e " [АЕЮ иАЕИОУЫ ЭЮ Я] " T h e n 308 Часть III. Visual Basic for Applications R e m o v e V o w e ls End I f N ext i E n d F u n c t io n = R e m o v e V o w e ls & M id ( T x t , i, 1) При использовании в составе формулы рабочего листа эта функция удаляет гласные буквы из аргумента, находящегося в одной ячейке. Если в качестве аргумента использу­ ется числовое значение, возвращается строка. В этом случае предпочтительнее возвра­ щать сообщение об ошибке (#Н/Д). Возможно, потребуется создать строку, которая выглядит как значение ошибки в формуле Excel. R e m o v e V o w e ls = "# Н /Д " Несмотря на то что строка выглядит как значение ошибки, она не обрабатывается как ошибка другими формулами, которые могут на нее ссылаться. Чтобы получить в резуль­ тате выполнения функции настоящее значение ошибки, используйте функцию Cover, которая преобразует номер ошибки в настоящую ошибку. К счастью, в VBA содержатся встроенные константы для обозначения ошибок, кото­ рые должна возвращать пользовательская функция. Эти значения — ошибки выполнения формул Excel, а не ошибки выполнения кода VBA. Ниже перечислены встроенные кон­ станты ошибок: • xlErrDivO (для ошибки #ДЕЛ/ 0 !); • xlErrNA (для ошибки #Н/Д); • xlErrName (для ошибки #ИМЯ?); • xlErrNull (для ошибки #ПУСТО !); • xlErrNum (для ошибки #ЧИСЛО !); • xlErrRef (для ошибки #ССЫЛ !); • xlErrValue (для ошибки #ЗНАЧ !). Чтобы получить ошибку #Н/Д в пользовательской функции, примените следующий оператор: R e m o v e V o w e ls = C V E r r ( x lE r r N A ) Ниже приведена преобразованная функция RemoveVowels. Конструкция If-Then применяется для выполнения альтернативного действия в случае, когда аргумент не является текстовым. Эта функция вызывает функцию Excel ЕТЕКСТ (IsText), кото­ рая определяет, содержит ли аргумент текст. Если ячейка содержит текст, то функция возвращает нормальный результат. Если же ячейка содержит не текст (или пуста), то функция возвращает ошибку #Н/Д: Если ячейка не содержит текст (или пуста), возвра­ щается ошибка #Н/Д. F u n c t i o n R e m o v e V o w e ls ( T x t ) A s V a r i a n t ' У д а л я е т в се гл асн ы е буквы и з т е к с т о в о г о а р гу м е н т а ; ' в о з в р а щ а е т ош и бку # ЗН АЧ!, е с л и а р г у м е н т — не с т р о к а D im i A s L o n g R e m o v e V o w e ls = " " I f A p p lic a t io n . W o r k s h e e t F u n c t io n . I s T e x t ( T x t ) Then F o r i = 1 To L e n ( T x t) I f N o t U C a s e ( M id ( T x t , i , 1 ) ) L i k e " [АЕЮ иАЕИО УЫ ЭЮ Я] " t h e n R e m o v e V o w e ls = R e m o v e V o w e ls & M i d ( T x t , i , 1) End I f 309 Глава 10. Создание функций N ext i E ls e R e m o v e V o w e ls End I f End F u n c t i o n = C V E r r ( x lE r r N A ) Примечание Обратите внимание, что был также изменен тип данных для возвращаемого функцией значения. Поскольку функция может возвращать что-то еще, кро­ ме строки, тип данных был изменен на V a r i a n t . Функция с неопределенным количеством аргументов Некоторые функции Excel имеют неопределенное количество аргументов. Знакомый пример — функция СУММ, которая имеет следующий синтаксис: СУМ М (число1/ ч и с л о 2 . . . ) Первый аргумент обязателен. Кроме него, можно воспользоваться 254 дополнитель­ ными аргументами. Ниже приведен пример функции СУММ с четырьмя аргументамидиапазонами. =СУММ ( A l : А 5 , С 1 : С 5 , Е 1 : Е 5 , G l : G 5 ) Допускается использовать в функции разные типы аргументов. Например, следую­ щий пример иллюстрирует использование трех аргументов: первый — диапазон, вто­ рой — значение, а третий — выражение. =СУММ(А1:А5, 1 2 , 2 4 * 3 ) Существует возможность создавать функции, имеющие неопределенное количество аргументов. Основная идея заключается в следующем: примените в качестве последнего (или единственного) массив и добавьте перед ним ключевое слово P aram A rray. Примечание P a r a m A r r a y относится только к последнему аргументу в списке аргументов процедуры. Он всегда имеет тип данных V a r i a n t и всегда является необя­ зательным аргументом (хотя ключевое слово O p t i o n a l не используется). Ниже представлена функция, которая может иметь произвольное количество одно­ мерных аргументов (она не поддерживает многомерные аргументы-диапазоны). Функция возвращает сумму аргументов. F u n ctio n S im p le S u m ( P a r a m A r r a y a r g l i s t O For E a ch a r g I n a r g l i s t S im p le S u m = S im p le S u m + a r g Next a r g End F u n c t io n A s V a r ia n t ) A s D o u b le Для изменения этой функции в целях поддержки многомерных диапазонов следует добавить еще один цикл, который обрабатывает каждую ячейку в каждом из аргументов. F u n ctio n S im p le S u m ( P a r a m A r r a y a r g l i s t O Dim c e l l A s R a n g e For E a ch a r g I n a r g l i s t For Each c e l l In a rg S im p le S u m = S im p le S u m + c e l l N ext c e l l A s V a r ia n t ) A s D o u b le 310 Часть III. Visual Basic for Applications Next arg End Function Функция SimpleSum далеко не такая гибкая, как функция Excel СУММ. Протестируй­ те ее на практике с разными типами аргументов, и вы убедитесь, что функция выдает ошибку, если все аргументы не являются либо числовым значением, либо ссылкой на ячейки, содержащие числовые значения. Имитация функции с у м м В данном разделе представлена пользовательская функция MySum. В отличие от функции SimpleSum, рассмотренной в предыдущем разделе, функция MySum идеально копирует поведение функции Excel СУММ. Перед рассмотрением кода функции MySum уделим внимание функции Excel СУММ. Данная функция имеет очень широкие возможности. Она насчитывает до 255 аргументов (даже пропущенные аргументы), причем аргументами могут выступать числовые значе­ ния, ячейки, диапазоны, представленные в виде текста числа, логические значения и да­ же встроенные функции. Рассмотрим следующую формулу: =СУММ(В 1 , 5 , " 6 " , , И С Т И Н А ,К О Р Е Н Ь ( 4 ) , A l :А 5 , D : D , С 2 * С З ) Эта формула содержит все типы аргументов, перечисленные в порядке их использо­ вания в функции: • ссылка на одну ячейку; • символьное значение; • строка, которая выглядит как числовое значение; • пропущенный аргумент; • логическое значение ИСТИНА; • выражение, использующее другую функцию; • ссылка на диапазон. Функция MySum (листинг 10.1) также обрабатывает все эти типы аргументов. Компакт-диск Рабочая книга, включающая функцию MySum, находится на прилагаемом к книге компакт-диске (файл mysum function.xlsm). Листинг 10.1. Функция MySum Function MySum(ParamArray args() As Variant) As Variant 1 И м и т а ц и я ф у н к ц и и Excel СУММ ' О бъявление перем енны х Dim i As Variant Dim TempRange As Range, cell As Range Dim ECode As String Dim m, n MySum = 0 ' О бработка каж д о го а р гум ен та For i = 0 To UBound(args) ' П ропуск отсутствую щ и х а р гум е н то в If Not IsMissing(args(i)) Then Глава 10. Создание функций 311 1 Каков тип а р гу м е н т а ? S e le c t C a se T y p e N a m e ( a r g s ( i) ) C a se "R an g e" ' С озд ани е вр ем ен н о го д и а п а зо н а для с т р о к и /с т о л б ц а S e t Tem pRange = _ I n t e r s e c t ( a r g s ( i) . P a re n t.U s e d R a n g e , _ a r g s ( i) ) F o r E a c h c e l l I n Tem pR ange I f I s E r r o r ( c e ll) Then M ySum = c e l l ' в о з в р а щ а е т с я о ш и б к а E x i t F u n c t io n End I f I f c e l l = T ru e O r c e l l = F a ls e Then M ySum = M ySum + 0 E ls e I f I s N u m e r ic ( c e ll) O r I s D a t e ( c e ll) _ t h e n M ySum = M ySum + c e l l End I f N ext c e ll C ase " V a r ia n t ()" n = a r g s ( i) F o r m = L B o u n d (n ) To U B o u n d (n ) M ySum = M yS um (M yS um , n ( m ) ) ' р е к у р си в н ы й вы зов N ext m C ase " N u ll" ' и гн о р и р о в а ть значен ие C a s e " E r r o r " 1 в о зв р а щ е н и е к ош ибке M ySum = a r g s ( i ) E x i t F u n c t io n C a s e " B o o le a n " ' П роверка ст р о к о в о го значения I f a r g s ( i ) = " T r u e " T h e n M ySum = M ySum + 1 C a se "D a te " M ySum = M ySum + a r g s ( i ) C a se E ls e M ySum = M ySum + a r g s ( i ) End S e le c t En d I f N ext i End F u n c t io n На рис. 10.7 показана рабочая книга с различными формулами, среди которых — функции СУММ и MySum. Как видите, эти функции возвращают одинаковые результаты. А В С D I Г ^ G F Н 1 к J L N О #ЗНАЧ! 3,708333 31 Г#ДЕЛ/0! Г #ЗНАЧ! 3,708333 М 1 1 ИСТИНА Первый 2 4 3 2 ИСТИНА 3 7 0 3 «Н/Д 0 1.11.18 5:00 РМ 1 1 100 11,48913 31 «ДЕЛ/01 7 0 3 #н/д 0 1.11.18 5:00 РМ 1 1 100 11,48913 ЛОЖЬ "2" 1 Один Р 1 5:00 РМ 04.янв #Н/Д Два 3 Три 05.янв 4 5 СУММ -> 6 7 MYSUM ~> 8 Рис. 10.7. Сравнение функций с у м м и M yS um Если вы хотите посмотреть, как работает эта функция, создайте использующую ее формулу. Затем добавьте в код точку останова и приступите к построчному выполнению операторов (см. раздел “Отладка функций”). Протестируйте различные типы аргументов, 312 Часть III. Visual Basic for Applications что позволит гарантировать работоспособность функции. В ходе анализа кода функции MySum помните о следующем. • Пропущенные аргументы (определенные с помощью функции I s M is s in g ) игно­ рируются. • Процедура использует для определения типа аргумента (Range, Error и т.д.) функцию VBA TypeName. Каждый тип аргумента обрабатывается определенным способом. • Для аргумента-диапазона функция циклически просматривает все ячейки диапазо­ на и прибавляет их значения к сумме. • Функция имеет тип данных V a r ia n t , так как она должна возвращать ошибку, ес­ ли один из ее аргументов имеет значение ошибки. • Если аргумент содержит ошибку (например, #ДЕЛ! /0 ), то функция MySum воз­ вращает ошибку — как и функция Excel СУММ. • Функция Excel СУММ “полагает”, что текстовая строка имеет значение 0, если только она не является символьным аргументом (т.е. фактическим значением, а не переменной). Следовательно, функция MySum прибавляет значение ячейки лишь в том случае, если его можно оценить как число (для этого применяется функция VBA IsN u m eric). • Для аргументов-диапазонов функция использует метод I n t e r s e c t с целью создания временного диапазона, который состоит из пересечения заданного диапазона и исполь­ зуемого диапазона листа. В результате обрабатываются те случаи, когда аргумент со­ стоит из полной строки или столбца, а его просмотр будет длиться вечность. Возможно, вас интересует относительная скорость выполнения функций СУММ и МуSum. Конечно, функция MySum значительно медленнее, ее скорость зависит от быстро­ действия вашей системы и самих формул. Если в системе рабочий лист, содержащий пять тысяч формул СУММ, вычисляется за долю секунды, то после замены функций СУММ на функции MySum пересчет занимает 8 секунд. Функция MySum несколько улучшена, но ее производительность все же намного меньше производительности функции СУММ. Цель этого примера состоит не в том, что­ бы создать новую функцию СУММ. Скорее, этот пример показывает, как создавать поль­ зовательские функции рабочих листов, которые выглядят и работают так же, как встро­ енные функции Excel. Расширенные функции для работы с датами Достаточно часто пользователи Excel жалуются на невозможность работы с датами до 1900 года. Например, к таким пользователям относятся специалисты по созданию ге­ неалогических деревьев, которые часто применяют Excel для отслеживания дат рожде­ ния и смерти. Если какая-либо из подобных дат попадает в период до 1900 года, вычис­ ление количества прожитых лет становится невозможным. Я создал набор функций, использующих возможности VBA по работе с широчайшим диапазоном дат. Наиболее ранняя дата, распознаваемая VBA, — 1 января 100 года. Глава 10. Создание функций 313 Предупреждение © Учитывайте изменения календарей. Осторожно работайте с датами до 1752 го­ да. Различия в исторических американских, британских, григорианских и юлиан­ ских календарях могут привести к некорректным результатам вычислений. Ниже приведены функции VBA для работы с датами. • XDATE (y ,m , d , f m t ) . Возвращает дату, “сконструированную” на основе введен­ ных пользователем года, месяца и дня. Дополнительно можно указать строку форматирования даты. • XDATEADD ( x d a t e l , d a y s , f m t ) . Добавляет к дате указанное количество дней. Дополнительно можно указать строку форматирования даты. • XDATEDIF ( x d a t e l , x d a t e 2 ). Возвращает количество дней между двумя датами. • XDATEYEARDIF ( x d a t e l , x d a t e 2 ) . Возвращает количество полных лет между двумя датами (применяется для вычисления возраста). • XDATEYEAR ( x d a t e l ). Возвращает год даты. • XDATEMONTH ( x d a t e l ). Возвращает месяц даты. • XDATEDAY ( x d a t e l ) . Возвращает день даты. • XDATEDOW( x d a t e l ) . Возвращает день недели даты (в виде целого числа меж­ ду 1 и 7). На рис. 10.8 показана рабочая книга, использующая некоторые из описанных выше функций. I А . .' В ; d С Е . F . J H G 1 ' 5 6 Президент Год Месяц День 7 Джордж Вашингтон 1732 8 Джон Адамс 1735 9 Томас Джефферсон 1743 XDATE XDATEDIF XDATEYEARDIF XDATEDOW 2 22 Февраль 22,1732 101706 278 10 30 Октябрь 30,1735 100 360 274 Пятница Воскресенье 4 13 Апрель 13,1743 97 638 267 Суббота 10 Джеймс Мэдисон 1751 3 16 Март 16,1751 94 744 259 И Джеймс Монро 1758 4 28 Апрель 28,1758 92144 252 Пятница 12 Джон Куинси Адамс 1767 7 11 Июль 11,1767 88 783 243 Суббота Вторник 13 Эндрю Джексон 1767 3 15 Март 15,1767 88901 243 Воскресенье 14 Мартин Ван Бюрен 1782 12 5 Декабрь 5,1782 83157 227 Четверг 237 Вторник 15 Уильям Генри Гаррисон 16Джон Тайлер 1773 2 9 Февраль 9,1773 86 743 1790 3 29 Март 29,1790 80486 220 17 Джеймс Нолк Полк 1795 11 2 Ноябрь 2,1795 78442 214 Понедельник 18 Закари Тейлор 1784 11 24 Ноябрь 24, 1784 82437 225 Среда Вторник Понедельник 19 Миллорд Филлмор 1800 1 7 Январь 7,1800 76915 210 20 Франклин Пирс 1804 11 23 Ноябрь 23,1804 75134 205 Пятница 21 Джеймс Бьюкенен 1791 4 23 Апрель 23,1791 80 096 219 Суббота 22 Авраам Линкольн 1809 2 Февраль 12,1809 73 592 201 1808 12 12 23 Эндрю Джонсон 29 Декабрь 29,1808 73 637 201 ;Четверг 24 Улисс С.Грант 1822 4 27 Апрель 27, 1822 68 770 188 Суббота 25 Раттерфорд Б. Хейс 1822 10 4 Октябрь 4,1822 68 610 187 Пятница 26 Джеймс А. Гарфилд 1831 11 19 Ноябрь 19,1831 65 277 178 Суббота 27 Честер А. Артур 1829 10 5 Октябрь 5,1829 66052 180 Понедельник Воскресенье Рис. 10.8. Функции VBA, предназначенные для работы с датами Учтите, что возвращаемая функциями дата представляет собой текстовую строку, а не ре­ альнуюдату. Поэтому с данным значением невозможно выполнять математические операции с помощью стандартных операторов Excel. Но зато это значение можно использовать в каче­ стве аргумента для других функций VBА, предназначенных для работы с датами. 314 Часть III. Visual Basic for Applications Описанные в этом разделе функции весьма просты. Для примера ниже приводится листинг функции X D A T E . F u n c t i o n X D A T E ( у , m, d , O p t i o n a l f m t A s S t r i n g ) I f I s M is s in g ( f m t ) T h e n fm t = " S h o r t D a te " XD A T E = F o r m a t ( D a t e S e r i a l ( y , m, d) , f m t) E n d F u n c t io n As S t r in g Ниже описываются аргументы функции X D A T E : • у — состоящий из четырех цифр год, находящийся в диапазоне от 0100 до 9999; • m — номер месяца (1—12); • d — номер дня (1-31); • fm t (необязательно) — строка форматирования даты. Если аргумент fm t не указан, отображение даты осуществляется в формате короткой даты, установленном в системе (на панели управления Windows). Если аргумент m или d превышает допустимое значение, происходит переход к сле­ дующему году или месяцу. Например, если указать месяц с номером 13, он будет интер­ претироваться как январь будущего года. Компакт-диск Код VBA для расширенных функций по работе с датами находится на прила­ гаемом к книге компакт-диске в файле e x t e n d e d d a t e f u n c t i o n . x l s m . З десь же можно найти инструкции по работе с этими функциями — в файле e x te n d e d d a te f u n c t io n s h e lp .d o c x . Отладка функций При использовании формулы на рабочем листе для тестирования функции происхо­ дящие в процессе выполнения ошибки не отображаются в знакомом диалоговом окне сообщений. Формула просто возвращает значение ошибки (#ЗНАЧ!). К счастью, это не представляет большой проблемы при отладке функций, так как всегда существует не­ сколько “обходных путей”. • Поместить в стратегически важных местах функцию M sgBox, чтобы кон­ тролировать значения отдельных переменных. Удобно, если в процессе вы­ полнения функций окна сообщений все-таки появляются, в отличие от окон оши­ бок. Убедитесь, что ваша функция используется только в одной формуле на рабо­ чем листе, иначе окна сообщений будут появляться для каждой такой формулы (подобное поведение быстро надоедает). • Протестировать функцию, вызвав ее из процедуры, а не в формуле рабочего листа. Ошибки в процессе выполнения отображаются обычным образом, поэтому можно либо сразу решить проблему (если она вам известна), либо перейти к отладке. • Определить точку остановки в функции и просмотреть функцию пошагово. При этом можно воспользоваться всеми стандартными инструментами отладки. Чтобы добавить точку остановки, поместите курсор в операторе, в котором вы ре­ шили приостановить выполнение, и выберите команду Debug^Toggle Breakpoint (Отладка^Точка остановки) (или нажмите <F9>). Глава 10. Создание функций 315 • Использовать в программе один или несколько временных операторов D ebu gs Print (Отладка^Печать), чтобы отобразить значения в окне Immediate ре­ дактора VBA. Например, чтобы проконтролировать циклически изменяемое зна­ чение, используйте следующий метод. F u n c t io n V o w e lC o u n t (г) A s L o n g D im C o u n t A s L o n g D im i A s L o n g D im C h A s S t r i n g * 1 Count = 0 F o r i = 1 To L e n ( r) Ch = U C a s e ( M i d ( r , i , 1 ) ) I f C h L i k e " [АЕЮ иАЕИОУЫ ЭЮ Я] " T h e n Count = Count + 1 D e b u g . P r in t Ch, i End I f N ext i V o w e lC o u n t = C o u n t En d F u n c t i o n В данном случае значения двух переменных, Ch и i, выводятся в окне отладки (Immediate) всякий раз, когда в программе встречается оператор D e b u g s Print. На рис. 10.9 показан ре­ зультат для случая, когда функция принимает аргумент Тисso n A rizo n a. ШШШШт i Microsoft Visual Basic fo r Applications - PERSONAL.XLSB - [M odule4 {Code}] '■4m ей» Run loots л *L Add-Ins J* **’ Window Help введите вопрос * * й? х О j (General) g T AcrobatPDFMaker (PDFMaket PUP7TRIA1 (pup/.xlam ) ^ SCMenus (shortcut memis.pu E VBAProject {PERSONALJCLSB) Ш da Microsoft Excel Objects E l-S i Modules Modulel « 3 Module2 Module3 A 4ЩШ1 ^ VBAProject (Книга2) В Mkrosoft Excel Objects j ® Лист 1 (Tfc«CTI) C l Лист 2 (Лист 2) ЛистЗ (ЛистЗ) ЭтаКнига -g- F u n c t io n V o w e lC o u n t(r ) As Long Dim C ou n t A s Long Dim i As Long Dim Ch A s S t r i n g * 1 C ou n t = 0 F or i = 1 To L e n (r ) Ch = u ca s e (M id (r, i , 1)) I f Ch L ik e "[АЕЮиАЕИОУЫЭЮЯ]" T hen C ou n t = C ou n t + 1 D e b u g .P r in t Ch# i End If N ext i V o w e lC o u n t = C oun t End F u n c t io n Sub Dim x = End T est() x A s Long V o w e lC o u n t(" T u s c o n A r iz o n a " ) Sub Hj__ i if* 2 5 7 9 11 2Г1 Рис. 10.9. Используйте окно отладки для отображения результатов при выполнении функции Работа с диалоговым окном Мастер функций Диалоговое окно Excel М а сте р функций (Insert Function) — очень удобный инстру­ мент. При создании формулы рабочего листа он позволяет выбрать необходимую функ­ цию из списка. Функции в списке группируются в разные категории, благодаря чему об­ 316 Часть III. Visual Basic for Applications легчается их поиск. После выбора функции и щелчка на кнопке О К появляется диалого­ вое окно Аргументы функции (Function Arguments), с помощью которого облегчается вставка аргументов функции. На рис. 10.10 показаны оба этих диалоговых окна. JJ2SI Введите краткое описание действия, которое нужно выполнить, и нажмите кнопку 'Найти* 1 Категория:jФинансовые “3 Выберите функцию: JJ-! £31 АМОРУВ АМОРУМ АСЧ БЗРАСПИС БС м\ вед........ АПЛ{нач стоим остное т стопмость;время_эксплуатации) Возвращает реличину амортизации актива за один период, рассчитанную линейным методом. дш [Аргументы функции __________ и “Ж “Ж « чмш* * чмою Возвращает величину амортизации актива за один период, рассчитанную Н а ч ^а о ки о а ь начальная ст оимостьактива. Сгравко пв.зтой 4>w%m Рис. 10.10. Диалоговое окно Мастер функций облегчает вставку функции в формулу, а окно Аргументы функции позволяет задать аргументы функции В диалоговом окне Мастер функций также отображаются пользовательские функции рабочего листа. По умолчанию пользовательские функции отображаются в категории Определенные пользователем (User Defined). В диалоговом окне Аргументы функ­ ции (Function Arguments) указываются аргументы функции. В диалоговом окне Мастер функций можно найти функцию по ключевому слову. К сожалению, найти таким образом пользовательскую функцию VBA невозможно. Примечание Пользовательские функции, определенные с помощью ключевого слова Private, не отображаются в диалоговом окне Мастер функций (Insert Function). Если вы разрабатываете функции исключительно для использования в других процедурах VBA, объявляйте их с помощью ключевого слова P r i v a t e . Такая функция не отображается в окне Мастер функций, хотя и может применяться в формулах рабочего листа. Использование метода MacroOptions Можно воспользоваться методом M a c ro O p tio n s объекта A p p l i c a t i o n , который позволяет включить в состав встроенных функций Excel разработанные вами функции. Этот метод позволяет выполнить следующее: • добавить описание функции; • указать категорию функции; • добавить описание аргументов функции. Глава 10. Создание функций 317 Ниже приводится пример процедуры, которая использует метод M a cro O p tio n s для указания необходимых сведений о функции. Sub D e s c r i b e F u n c t i o n () Dim F u n cN a m e A s S t r i n g Dim F u n c D e s c A s S t r i n g Dim F u n c C a t A s L o n g Dim A r g l D e s c A s S t r i n g , A rg 2 D e sc A s S t r in g FuncNam e = " D ra w " F u n cD e sc = "С одерж им ое с л у ч а й н о й я ч е й к и д и а п а з о н а " Fu n cC a t = 5 ' С сы лки и м а сси в ы A r g lD e s c = " Д и а п а з о н , к о т о р ы й с о д е р ж и т з н а ч е н и я " A r g 2 D e s c = " (Не о б я з а т е л ь н о ) Е с л и F a l s e и л и о т с у т с т в у е т , _ новой ячейки нет" A rg 2 D e sc = A rg 2 D e s c & "в ы б р а н о при п е р е с ч е т е . Е сл и T r u e , " A rg 2 D e sc = A rg 2 D e s c & "в ы б р а н а н о в а я я ч е й к а при п е р е с ч е т е ." A p p lic a t io n . M a c r o O p t io n s _ M a c r o : = FuncN am e, _ D e s c r ip t io n : = F u n c D e s c , _ C a t e g o r y : = F u n c C a t, _ A r g u m e n t D e s c r ip t io n s : = A r r a y ( A r g lD e s c , A rg 2 D e sc) End Sub Эта процедура использует переменные для хранения различной информации и в каче­ стве аргументов метода MacroOptions. Функция относится к категории 5 (ссылки и массивы). Обратите внимание, что описания для двух аргументов указываются путем применения массива в качестве последнего аргумента метода MacroOptions. Новинка Поддержка описаний аргументов появилась в Excel 2010. Если рабочая кни­ га открывается в более ранней версии Excel, описание аргументов не ото­ бражается. На рис. 10.11 показаны диалоговые окна Мастер функций и Аргументы функции после вызова указанной выше процедуры. Процедуру DescribeFunction следует вызывать только один раз. После ее вызова информация, связанная с функцией, сохраняется в рабочей книге. Можно также не ука­ зывать аргументы. Например, если для создания описаний аргументы не требуются, можно не обращать внимания на аргумент ArgumentDescript ions. © Дополнительные сведения о создании справки, доступной в окне Мастер функций, можно найти в главе 24. Определение категории функции Если вы не укажете категорию функции с помощью метода MacroOptions, пользо­ вательская функция рабочего листа появится в категории Определенные пользовате­ лем (User Defined) диалогового окна Мастер функций (Insert Function). Иногда все же требуется поместить ее в другую категорию. Перемещение функции в другую категорию приведет ^появлению ее в соответствующем раскрывающемся списке группы Формулы^Библиотека функций (Formulas^Function Library). 318 Часть III. Visual Basic for Applications |1 Введите краткое описание действия, которое нужно У выполнить, и нажните кнопку Н ай ти' Категория; j i 'ь.лп.^. Выберите функцию: ГИПЕРССЫЛКА ГПР двсоыл.................................... л O ra w ( Rnq;Recak.) Содержимое случайной ячейки диапазона. Д.21 Rng |д : л; Отва^..ой..?1ай..Фшаду. И ■ {#ЗНАЧ! :2; 3:4:5:6:7:8:9:10} Содержимое случайной ячейки диапазона. R ng Диапазон, который содержит значение. Значение: 8 Справка по ?той функ х ^ Рис. 10.11. Вид диалоговых окон Мастер функций и Аргументы функции для пользова­ тельской функции В табл. 10.1 перечислены номера категорий, которые можно использовать в качестве значений аргумента C a te g o ry метода M a cro O p tio n s. Обратите внимание, что неко­ торые из этих категорий (от 10 до 13) обычно не отображаются в диалоговом окне Мас­ тер функций (Insert Function). Если же отнести одну из пользовательских функций в по­ добную категорию, она появится в диалоговом окне. Таблица 10.1. Категории функций Номер категории Название категории 0 1 2 3 4 5 6 7 8 9 12 13 14 15 16 17 Полный алфавитный перечень (АН) Финансовые (Financial) Дата и время (Date & Time) Математические (Math & Trig) Статистические (Statistical) Ссылки и массивы (Lookup & Reference) Работа с базой данных (Database) Текстовые (Text) Логические (Logical) Проверка свойств и значений (Information) Управление макросами (Macro Control) Динамический обмен данными/Внешние (DDE/External) Определенные пользователем (User Defined) Инженерные (Enhineering) Аналитические (Cube) Совместимость (Compatibility)* *Категория Совместимость появилась в версии Excel 2010. Глава 10. Создание функций 319 Можно самостоятельно создавать категории функций. Вместо указания номера в ка­ честве значения аргумента C a te g o ry метода M a c ro O p tio n s воспользуйтесь тексто­ вой строкой. Приведенный ниже оператор создает категорию функций Функции VBA иназначает эту категорию функции Com m ission. A p p lic a t io n . M a c r o O p t io n s M a c r o := " C o m m is s io n " , C a t e g o r y := " Ф у н к ц и и V B A " Добавление описания функции вручную В качестве альтернативы методу M a cro O p tio n s для добавления описания функции можно воспользоваться диалоговым окном Макрос (Macro). Примечание Если не указать описание пользовательской функции, в диалоговом окне Мастер функций (Insert Function) отобразится следующий текст: С п р а в к а н е д о с т у п н а (No help available). Для добавления описания пользовательской функции выполните следующие действия. 1. Создайте функцию в VBE. 2. Активизируйте Excel, убедитесь в том, что требуемая функция находится в актив­ ной рабочей книге. 3. Выберите команду Разработчика Код1 ^ Макросы (Developer^Code^Macros) или нажмите клавиши <Alt+F8>. В диалоговом окне Макрос перечислены доступные процедуры, но в этом списке вы можете не найти своих функций. 4. Введите название функции в поле Название макроса (Macro Name). 5. Щелкните на кнопке Параметры (Options) для отображения диалогового окна Параметры макроса (Macro Options). 6. Введите описание функции в поле Описание (Description) (рис. 10.9). Поле Со­ четание клавиш (Shortcut Key) к описанию функций не относится. 7. Щелкните на кнопке О К и на кнопке Отмена (Cancel). После выполнения описанных выше действий J jx j вдиалоговом окне Мастер функций (Insert Func­ Имя макроса PERSONAL.XLSB!SortSheets tion) отображается описание, которое было введено Сочетание клавиш: в п. 6 (при выборе функции). CW+| Если для ввода функции используется диалого­ Описание; Сортировка листов в рабочей книге. вое окно Мастер функций, то диалоговое окно Аргументы функций отображается после щелчка на кнопке ОК. Для встроенных функций диалого­ вое окно Аргументы функций предоставляет опи­ сание каждого аргумента. К сожалению, отобра­ зить такое описание для аргументов пользователь- Рис. 10.12. Ввод описания функции ских функций невозможно. 320 Часть III. Visual Basic for Applications Использование надстроек для хранения пользовательских функций При желании можно сохранить часто используемые пользовательские функции в файле надстройки. Основное преимущество такого подхода заключается в следующем: функции могут быть применены в формулах без спецификатора имени файла. Предположим, у вас есть пользовательская функция Z ap S p aces; она хранится в файле M y fu n c s. xlsm . Чтобы применить ее в формуле другой рабочей книги (отличной от Myf u n c s . xlsm ), необходимо ввести следующую формулу: = M y fu n c s . x ls m ! Z a p S p a c e s (A l: C12) Если вы создадите надстройку на основе файла Myf u n c s . x lsm и эта надстройка бу­ дет загружена в текущем сеансе работы Excel, то ссылку на файл можно пропустить, введя следующую формулу: = Z a p S p a c e s (A l: С12) Перекрестная ссылка Подробнее надстройки будут рассмотрены в главе 21. Предупреждение Потенциальная проблема, которая может возникнуть из-за использования надстроек для хранения пользовательских функций, связана с зависимо­ стью рабочей книги от файла надстроек. Если вы передаете рабочую книгу сотруднику, не забудьте также передать копию надстройки, которая содер­ жит требуемые функции. Использование функций Windows API VBA может заимствовать методы из других файлов, которые не имеют ничего обще­ го с Excel или VBА, например файлы DLL (Dynamic Link Library — динамически под­ ключаемая библиотека), которые используются Windows и другими программами. В ре­ зультате в VBA появляется возможность выполнять операции, которые без заимствован­ ных методов находятся за пределами возможностей языка. Windows API (Application Programming Interface — интерфейс прикладного програм­ мирования) представляет собой набор функций, доступных программистам в среде Windows. При вызове функции Windows из VBA вы обращаетесь к Windows API. Мно­ гие ресурсы Windows, используемые программистами Windows, можно получить из фай­ лов DLL, в которых хранятся программы и функции, подсоединяемые в процессе выпол­ нения программы, а не во время компиляции. API-функции и 64-разрядная Excel Разработчики кода VBA должны учитывать особенности 64-разрядной версии Excel 2010. Если нужно обеспечить совместимость кода с 32-разрядными версиями (включая Excel 2007) и 64-разрядной версией Excel 2010, API-функции следует объяв­ лять дважды (используйте директивы компилятора, которые гарантируют корректность используемого объявления). Глава 10. Создание функций 321 Например, приведенное ниже объявление совм естим о с 32-разрядными версиями Excel, но выдает ошибку компиляции при использовании в 64-раз рядной версии Excel 2010. D e clare F u n c t i o n G e tW in d o w s D ir e c to r y A L i b " k e r n e l 3 2 " _ (B y V a l l p B u f f e r As S t r i n g , B y V a l n S iz e As L o n g ) As Long Во многих случаях для обеспечения совместимости объявления с 64-разрядной версией Excel достаточно воспользоваться ключевым словом P tr S a f е вместо ключево­ го слова D e c l a r e . Приведенное ниже объявление совм естим о как с 32-разрядной вер­ сией Excel 2010, так и с 64-разрядной версией Excel 2010. D eclare P t r S a f е F u n c t i o n G e tW in d o w s D ir e c to r y A L i b " k e r n e l 3 2 " (B y V a l l p B u f f e r As S t r i n g , B y V a l n S iz e As L o n g ) As Long _ Но при выполнении этого кода в Excel 2007 (и более ранних версиях) появится сооб­ щение об ошибке, поскольку ключевое слово P trS a f е в этих версиях не распознается. В главе 26 будут описаны методы обеспечения совместимости объявлений APIфункций со всеми 32-разрядными версиями Excel и 64-разрядной версией Excel 2010. Примеры функций Windows API Прежде чем использовать функцию Windows API, ее необходимо объявить вверху программного модуля. Если программный модуль — это не стандартный модуль VBA (т.е. модуль для U s e rF o rm , Л и с т или Э т а К н и га ), то API-функцию необходимо объя­ вить как P r i v a t e . Объявление API-функции имеет некоторую сложность — функция должна объяв­ ляться максимально точно. Оператор объявления указывает VBA следующее: • какую API-функцию вы используете; • в какой библиотеке расположена API-функция; • аргументы API-функции. После объявления API-функцию можно использовать в программе VBA. Определение папки Windows В этом разделе представлен пример API-функции, которая отображает имя папки Windows (с помощью стандартных операторов VBA эту задачу порой выполнить невоз­ можно). Этот код будет неработоспособным в Excel 2007. Ниже показан пример объявления API-функции. D eclare F u n c t io n G e t W in d o w s D ir e c to r y A L i b " k e r n e l 3 2 " _ (B yVal l p B u f f e r As S t r i n g , B y V a l n S iz e As L o n g ) As Lon g Эта функция, имеющая два аргумента, возвращает название папки, в которой уста­ новлена операционная система Windows (с помощью одной лишь программы VBA такое действие выполнить невозможно). После вызова этой функции путь к папке Windows бу­ дет храниться в переменной l p B u f f e r , а длина строки пути — в переменной n S iz e . После вставки оператора D e c la r e вверху модуля вы можете обратиться к функции G e tW in d o w s D ire c to ry A . Ниже следует пример вызова функции и отображения ре­ зультата в окне сообщения. Sub Show W indow sD ir () Dim W in P a th As S t r i n g Dim W in D ir As S t r i n g 11 3ak. 3107 * 255 322 Часть III. Visual Basic for Applications W in P a th = S p a c e (2 5 5 ) W in D ir = L e f t ( W i n P a t h , G e t W in d o w s D ir e c t o r y A _ (W in P a th , L e n ( W i n P a t h ) ) ) MsgBox W in D i r , v b l n f o r m a t i o n , "П а п ка W indow s" End Sub В процессе выполнения процедуры ShowW indowsDir отображается окно сообще­ ния с указанием расположения папки Windows. Иногда требуется создать оболочку (wrapper) для API-функций. Другими словами, вы создадите собственную функцию, использующую API-функцию. Такой подход сущест­ венно упрощает использование API-функции. Ниже приведен пример такой функции VBA. F u n c t i o n W in d o w s D ir O As S t r i n g ' В о зв р а щ а ет п у ть к п а п к е W indow s D im W in P a th As S t r i n g * 2 5 5 W in P a th = S p a c e (2 5 5 ) W in d o w s D ir = L e f t ( W i n P a t h , G e t W in d o w s D ir e c to r y A _ (W in P a th , L e n ( W i n P a t h ) ) ) End F u n c t i o n После объявления этой функции можно вызвать ее из другой процедуры. MsgBox W in d o w s D ir () Можно также использовать эту функцию в формуле рабочего листа. = W in d o w s D ir () Компакт-диск Пример файла w in d o w s книге компакт-диске. d i r e c t o r y .x ls m можно найти на прилагаемом к API-функции выполняют действия, которые другим способом выполнить невозможно (или очень сложно). Если приложение должно найти путь к папке Windows, вы можете целый день искать и не найти в Excel или VBA функцию, которая выполняет эту задачу. Но зная, как получить доступ к функциям Windows API, вы без особого труда решите свою проблему. Предупреждение Не удивляйтесь сбоям в систем е при использовании в VBA функций Windows API. Заранее сохраните свою работу перед тестированием. Определение состояния клавиши <Shift> Приведем еще один пример. Предположим, вы написали макрос VBA, который бу­ дет выполняться с помощью кнопки на панели инструментов. Необходимо, чтобы этот макрос выполнялся по-другому, если пользователь после щелчка на кнопке удержива­ ет клавишу <Shift>. Чтобы узнать о нажатии клавиши <Shift>, можно использовать API-функцию G e t K e y S t a t e . Функция G e t K e y S t a t e сообщает о том, нажата ли конкретная клавиша. Функция имеет один аргумент, n V i r t K e y , который представля­ ет код интересующей вас клавиши. Ниже приведена программа, которая выявляет, что при выполнении процедуры обра­ ботки события B u t t o n _ C l i c k была нажата клавиша <Shift>. Обратите внимание, что для определения состояния клавиши <Shift> используется константа (принимающая ше­ Глава 10. Создание функций 323 стнадцатеричное значение), которая затем применяется как аргумент функции G e tKeyState. Если G e tK e y S t a te возвращает значение меньше 0, это означает, что кла­ виша <Shift> нажата; в противном случае клавиша <Shift> не нажата. Declare F u n c t io n G e t K e y S t a t e L i b " u s e r 3 2 " (ByVal n V i r t K e y As L o n g ) As I n t e g e r Sub B u t t o n _ C lic k () Const V K _ S H IF T As I n t e g e r = &H10 I f G e tK e y S ta te (V K _ S H IF T ) < 0 T h e n MsgBox "Клавиш а < S h i f t > н а ж а та " E lse MsgBox "Клавиш а < S h i f t > не н а ж а та " _ End I f End Sub © Компакт-диск В рабочей книге k e y p r e s s . x ls m , которая находится на прилагаемом к кни­ ге компакт-диске, вы найдете примеры определения состояния следующих клавиш (и их комбинаций): <Ctrl>, <Shift> и <Alt>. Дополнительная информация о функциях Windows API Работа с функциями Windows API может быть довольно сложной. Во многих книгах по программированию перечислены операторы объявления API-функций с соответст­ вующими примерами. Как правило, можно просто скопировать выражения объявления и использовать функции, не вникая в их суть. Большинство VBA-программистов в Excel рассматривают API-функции как панацею для решения большинства задач. В Интернете вы найдете сотни вполне надежных примеров, которые можно скопировать и вставить всобственную программу. © Перекрестная ссылка В главе 11 можно найти ряд дополнительных примеров использования функций Windows API. Компакт-диск На прилагаемом к книге компакт-диске находится файл w i n 3 2 a p i . t x t , представляющий собой текстовый файл, содержащий объявления и кон­ станты Windows API. Можно открыть этот файл в текстовом редакторе и ско­ пировать соответствующие объявления в модуль VBA. Глава Приемы и методы программирования наУВА Вэтой главе... ♦ ♦ ♦ ♦ ♦ ♦ ♦ Учимся на примерах Работа с диапазонами Управление рабочими книгами и листами Методы программирования на VBA Полезные функции для программ VBA Полезные функции в формулах Excel Вызов функций Windows API В этой главе рассматриваются примеры, призванные закрепить теоретические знания по программированию на VB А. Учимся на примерах Изучение любого предмета, в том числе и программирования, можно сделать более эффективным, рассматривая примеры. Подобный подход используется и программиста­ ми на VBA. Хорошо продуманный пример, как правило, передает определенную идею лучше, чем лежащая в его основе теория. Поэтому я не ставил своей целью создать спра­ вочник, в котором скрупулезно описаны все нюансы работы с VBA. Вместо этого я под­ готовил ряд примеров, демонстрирующих полезные приемы программирования в Excel: • примеры использования VB А для работы с диапазонами; • примеры использования VB А для управления рабочими книгами и листами; • пользовательские функции, используемые в процедурах VBA и формулах рабочего листа; 326 • Часть III. Visual Basic for Applications методы и способы написания программ на VBA; • примеры использования функций Windows API. В предыдущих главах этой части был представлен вводный теоретический материал. Кроме того, в электронной справочной системе можно найти все детальные сведения, которые в книге опущены. В этой главе приведены примеры решения практических за­ дач, благодаря которым вы сможете углубить свои познания в области VB А. Примеры, приведенные в данной главе, можно разделить на шесть категорий: • работа с диапазонами; • управление рабочими книгами и листами; • методы программирования на VBA; • функции, используемые в процедурах VBA; • функции, применяемые в формулах рабочего листа; • вызов функций Windows API. Перекрестная ссылка В последующих главах будут представлены частные примеры управления диаграммами, сводными таблицами, формами, событиями и т.п. Работа с диапазонами Примеры данного раздела демонстрируют принципы управления диапазонами на ра­ бочих листах с помощью VBA. Копирование диапазона Функция записи макросов Excel используется не столько для создания хорошего ко­ да, сколько для поиска названий необходимых объектов, методов и свойств. Программа, полученная в результате записи макросов, не всегда самая эффективная, но обычно пре­ доставляет немало полезных сведений. Например, при записи простой операции копирования и вставки мною получено пять строк VBA-кода. Sub M a c r o l () R an g e(" A l " ) . S e le c t S e l e c t i o n . Copy R a n g e (" B l" ).S e le c t A c t i v e S h e e t . P a s te A p p l i c a t i o n . C u tC opyM ode = F a l s e End Sub Использование примеров данной главы Не все примеры в настоящей главе представляют независимые программы. Однако они являются выполняемыми процедурами, которые можно применять в собственных приложениях. Настоятельно рекомендуется в процессе чтения данной главы работать за компью­ тером. Можете изменять примеры и наблюдать, что происходит. Этот практический опыт гарантированно даст вам больше, чем чтение справочников. Глава 11. Приемы и методы программирования на VBA 327 Обратите внимание, что данная программа выделяет ячейки. Однако в VBA для рабо­ ты с объектом не обязательно его выделять. Вы никогда не узнали бы об этом важном моменте, если бы копировали показанный выше код макроса, где в двух строках содер­ жится метод S e l e c t . Данную процедуру можно заменить значительно более простой — применить метод Сору, который использует аргумент, представляющий адрес места вставки копируемого диапазона. Sub C o p yR a n g e() R a n g e( " A l " ) . Copy R a n g e ( " B l ") End Sub В обоих макросах предполагается, что рабочий лист является активным и операция выполняется на активном рабочем листе. Чтобы скопировать диапазон на другой рабо­ чий лист или в другую книгу, необходимо задать ссылку. В следующем примере диапа­ зон из листа Л и с т 1 книги F i l e . x l s x копируется на лист Л и с т 2 книги F i l e 2 .x l s x . Так как ссылки заданы правильно, пример работает независимо от того, какая рабочая книга активна. Sub CopyRange2 ( ) W orkbooks ( " F i l e l . x l s x " ) . S h e e ts ( " Л и с т 1 11) . R ange ( " A l " ) .C o p y _ W o rk b o o k s ( " F i l e 2 . x l s x " ) . S h e e t s ( " Л и с т 2 " ) . R a n g e ( " A l ") End Sub Еще одним подходом к решению этой задачи является использование для представ­ ления диапазонов объектных переменных, как показано в следующем примере. Sub C o p yR a n g e3 () Dim R n g l As R a n g e , Rng2 As R ange Set R n g l = W o r k b o o k s ( " F i l e l . x l s x " ) . S h e e t s ( " Л и с т 1 " ) .R a n g e ( " A l " ) Set Rng2 = W o r k b o o k s ( " F i l e 2 . x l s x " ) . S h e e t s ( " Л и с т 2 " ) .R a n g e ( " A l " ) R n g l. Copy Rng2 End Sub Понятно, что копирование не ограничивается единственной ячейкой за операцию. Например, следующая процедура копирует большой диапазон. Помните, что адрес места вставки определяется единственной ячейкой (представляющей верхний левый угол вставляемого диапазона). Sub CopyRange4 () R ang e( " А 1 :С 8 0 0 " ) .C o p y R ange ( " D l " ) End Sub Перемещение диапазона Инструкции VBA для перемещения диапазона ячеек подобны инструкциям копиро­ вания диапазона (см. следующий пример). Разница заключается в том, что вместо метода Сору используется метод Cut. Обратите внимание, что для вставляемого диапазона не­ обходимо задавать только адрес левой верхней ячейки. Следующий пример демонстрирует операцию перемещения 18 ячеек (в диапазоне А1:С6) на новое место, начиная с ячейки Н1. Sub M o v e R a n g e lO Range (" A l : С б ") . C u t R ang e ( " H I " ) End Sub Часть III. Visual Basic for Applications 328 Копирование диапазона переменного размера Во многих случаях необходимо скопировать диапазон ячеек, когда неизвестны точ­ ные размеры диапазона (количество столбцов и строк). Например, вы управляете рабо­ чей книгой, в которой фиксируется объем продаж за неделю. Количество строк ежене­ дельно меняется по мере добавления новых данных. На рис. 11.1 показан стандартный вид рабочего листа. Диапазон состоит из несколь­ ких строк, количество строк изменяется каждую неделю. А поскольку невозможно знать точный размер диапазона в определенный момент времени, процесс написания макроса, копирующего данный диапазон, несколько усложняется. л в А 1 Неделя с D Е Объем продаж Новые заказчики 2 1 21093 45 3 2 25375 49 4 3 26180 38 5 4 25564 32 6 5 29325 22 7 6 23069 23 8 7 24281 53 9 10 11 12 Рис. 11.1. Количество строк в диапазоне дат изменяется каж­ дую неделю Следующий макрос демонстрирует, как скопировать данный диапазон из листа Лист1 на лист Лист2 (начиная с ячейки А1). В данном случае используется свойство Current Region, возвращающее объект Range, который соответствует прямоугольнику ячеек вокруг заданной ячейки (в данном случае — А1). Sub C o p y C u r r e n t R e g io n 2 () R a n g e ( " A l " ) . C u r r e n t R e g i o n . Copy S h e e t s ( " Л и с т 2 " ) . R a n g e ( " A l ") End Sub Примечание Использование свойства C u r r e n t R e g io n эквивалентно выбору команды Главная^Редактирование^Найти и выделить^Выделение группы ячеек (Hom e^ Editing^Find & S elect^ G o То Special) с последующим выбором пе­ реключателя Текущую область (Current Region). Еще одно средство — ком­ бинация клавиш <Ctrl+Shift+*>. Чтобы увидеть принцип работы, включите запись макроса и выполните указанные действия. Как правило, значение свойства C u r r e n t R e g io n состоит из прямоугольного диапазона ячеек, ок­ руженных одной или несколькими пустыми строками либо столбцами. Выделение или определение типов диапазонов Зачастую работа, выполняемая в VBA, связана с управлением диапазонами — либо выделением диапазона, либо определением диапазона с целью выполнить некоторые действия с ячейками. Глава 11. Приемы и методы программирования на VBA 329 Советы по работе с диапазонами При работе с диапазонами необходимо помнить о следующем. • Для управления диапазоном его не нужно выделять в программе. • Если в коде выделяется диапазон, то соответствующий рабочий лист должен быть активным. Для активизации конкретного листа используйте метод A c t i v a t e из коллекции W o r k s h e e ts . • Функция записи макросов не всегда генерирует самый эффективный код. Зачас­ тую после записи макроса приходится оптимизировать код, чтобы сделать его бо­ лее эффективным. • Используйте в программе VBA именованные диапазоны. Например, лучше вос­ пользоваться ссылкой R ang e ( " T o t a l " ) , чем R ange ( "D 45 " ) . Во втором случае при добавлении строки над строкой 45 адрес ячейки изменится. После этого придется изменить макрос, чтобы в нем использовался правильный адрес ячейки (D46). • Если вы полагаетесь на функцию записи макросов при выборе диапазонов, убеди­ тесь в том, что при записи макроса используются относительные ссылки. Для этого воспользуйтесь командой Разработчик^ Код^Относительные ссылки (Developer^ Code^Use Relative References). • Перед выполнением макроса, который управляет каждой ячейкой в текущем ди а­ пазоне, рассмотрите ситуацию, когда пользователь выделил столбцы или строки целиком. В большинстве случаев не требуется, чтобы макрос просматривал каж­ дую ячейку выделенного диапазона. На этот случай в макросе должен создаваться новый диапазон, который состоит только из заполненных значениями ячеек (см. раздел “Просмотр выделенного диапазона”). • Excel позволяет выделять несколько несмежных диапазонов. Например, можно вы­ делить диапазон, нажать клавишу <Ctrl>, а затем выделить другой диапазон. Такой диапазон можно протестировать в макросе и определить для него соответствую­ щее действие (см. раздел “Определение типа выделенного диапазона”). Вам необходимо научиться управлять не только свойством C u r r e n tR e g io n (описанным выше), но и методом End объекта Range. Метод End имеет один аргумент, определяющий направление, в котором увеличивается выделение ячеек. Оператор, представленный ниже, выделяет диапазон от активной ячейки до последней непустой ячейки внизу. Range ( A c t i v e C e l l , A c t i v e C e l l . E n d ( x lD o w n ) ) . S e l e c t Как можно догадаться, три остальные константы имитируют комбинации клавиш при вы­ делении в других направлениях: x lU p (вверх), x l T o L e f t (влево) и x l T o R i g h t (вправо). JRb Предупреждение КЫ Я Будьте осторожны при работе с методом End. Если активная ячейка находится на границе диапазона или диапазон содержит хотя бы одну пустую ячейку, метод End может не дать требуемых результатов. J^\ Компакт-диск UgM На прилагаемом компакт-диске находится рабочая книга (r a n g e s e le c - t i o n s . x ls m ), в которой определяется несколько распространенных типов выделения ячеек. Открыв ее, вы увидите новое меню — Демонстрация выде­ ления (Selection Demo), — содержащ ее команды, которые предоставляют пользователю возможность получать различные типы выделений (рис. 11.2). Часть III. Visual Basic for Applications 330 [и •]a** 9 ’% омШ ж лг : Л : ' A ' Ш* Я £ * Выберите ячейку. Затем Вырезать щелкните правой кнопкой мыш и Копировать и воспользуйтесь контекстным Параметры вставки: м ен ю Демонстрация выделения К! д ля выбора различных способов выделения ячеек, реализованных на VBA Специальная вставка... Вставить... - 4 - - Удалить... г Очистить содержимое 15 Фильтр I Сортировка I Вставить примечание 16 jfjf Формат ячеек... Выбрать из раскрывающегося списка... Присвоит^ имя... Д 21 22 Гиперссылка... Демонстрация выделения i Выделить нмже(клавиши Ctrl»Shift*Down) Selection Demo I Выделить выше(клавиши Ctrl+Shift+Up} 89 78 92 74 Выделить правее{клавиши Ctrl*Shift» Right) Выделить яевее{клавиши Ctrl *S M tt* Lett) Выделить текущую область!клавиши Ctrl*Shift»*) Выделить активную область!клавиши End, Home, Ctrl «-Shift» Home) Выделить смежные ячейки в столбце с активной ячейкой Выделить смежные ячейки в строке с активной ячейкой Р Выделить весь столбец(клавиши Ctrl* Spacebar) ^ Выделить всю строку(кяавиши Shift*Spacebar) Выделить весь рабочий лист{клавиши Ctrl*A) 34 Активизировать следующую пустую ячейку ниже 35 Активизировать следующую пустую ячейку справа Выделить в строке диапазон непустых ячеек Выделить в столбце диапазон непустых ячеек Рис. 11.2. Эта рабочая книга демонстрирует, как выделять диапазоны раз­ личной формы в VBA Запрос значения ячейки Следующая процедура демонстрирует, как запросить у пользователя значение и вста­ вить его в ячейку А1 активного рабочего листа. Sub GetValuelO Range("Al").Value = InputBox("Введите значение") End Sub На рис. 11.3 показано диалоговое окно для ввода данных. Однако при выполнении этой процедуры возникает проблема. Если пользователь щелк­ нет на кнопке Отмена (Cancel) в окне ввода данных, то процедура удалит данные, которые находились в текущей ячейке. Модифицированная версия процедуры адекватно реагирует на щелчок на кнопке Отмена (Cancel) и не выполняет при этом никаких действий. Sub GetValue2() Dim UserEntry As Variant UserEntry = InputBox("Введите значение") If UserEntry <> "" Then Range("Al").Value = UserEntry End Sub Во многих случаях следует проверить правильность данных, введенных пользовате­ лем. Например, необходимо обеспечить введение только чисел в диапазоне от 1 до 12. Далее представлен способ проверки данных, введенных пользователем. В приведенном ниже примере некорректные данные игнорируются, и окно запроса значения отобража­ ется снова. Этот цикл будет повторяться, пока пользователь не введет правильное значе­ ние или не щелкнет на кнопке Отмена (Cancel). Глава 11. Приемы и методы программирования на VBA 331 Sub GetValue3 () Dim UserEntry As Variant Dim Msg As String Const MinVal As Integer = 1 Const MaxVal As Integer = 12 Msg = "В в ед и те з н а ч е н и е между " & MinVal & " и " & MaxVal Do UserEntry = InputBox(Msg) If UserEntry = "" Then Exit Sub If IsNumeric(UserEntry) Then If UserEntry >= MinVal And UserEntry <= MaxVal _ Then Exit Do End If Msg = "Вы ввел и НЕПРАВИЛЬНОЕ з н а ч е н и е ." Msg = Msg & vbNewLine Msg = Msg Sc " В в е д и те з н а ч е н и е о т " & _ MinVal Sc " и " & MaxVal Loop ActiveSheet.Range("Al").Value = UserEntry End Sub Как видно из рис. 11.4, программа также изменяет отображаемое сообщение, если пользователь вводит некорректные данные. *1 M icro soft Excel Вы свели ПРАВИЛЬНОЕ Введите значение от 1 и 12 Cancel Г Рис. 11.3. Функция InputBox получает от пользователя значение, которое вставля­ ется в ячейку Рис. 11.4. Проверка данных, введенных пользователем, с помощью функции VBA InputBox Компакт-диск Три процедуры Getvalue находятся на прилагаемом к книге компакт-диске в файле inputbox demo.xlsm. Ввод значения в следующую пустую ячейку Достаточно часто требуется ввести значение в следующую пустую ячейку столбца или строки. В представленном далее примере пользователь должен ввести имя и значе­ ние, которые добавляются в следующую пустую строку (рис. 11.5). Sub G etD ata () Dim NextRow As Long Dim Entryl As String, Entry2 As String Do ' Определение следующей п у с т о й с т р о к и NextRow = Cells(Rows.Count, 1).End(xlUp).Row + 1 1 Запрос на ввод данных Entryl = InputBox ("В в ед и те и м я ") If Entryl = "" Then Exit Sub Entry2 = InputBox("В в ед и те к о л и ч е с т в о " ) If Entry2 = "" Then Exit Sub 332 ' Часть III. Visual Basic for Applications З ап ись данных C e lls (N e x tR o w , C e lls (N e x tR o w , Loop End Sub 1) = E n t r y l 2) = E n try 2 С D Е F G Н 1 Сумма Имя 2 Аллен 3 Билл 4 Клара 5 Дэйв 6 Элиза 7 Фрэнк 8 Джордж 9 Джим 10 Кэйт и Пат 12 Поль 13 983 409 773 0 412 551 895 545 988 545 344 ----- \ *j M icrosoft Excel Введите имя E ------ ------ Рис. 11.5. Этот макрос вставляет данные в следующую пустую строку рабочего листа Чтобы упростить представленную процедуру, проверка данных не выполняется. Обра­ тите внимание, что это бесконечный цикл. Для выхода из него (щелкните на кнопке Cancel (Отмена)) использовались операторы E x i t Sub. Компакт-диск Процедура G etD ata находится на прилагаемом к книге компакт-диске. Соот­ ветствующий файл называется n e x t em pty c e l l . xlsm . Обратите внимание на оператор, который определяет значение переменной NextRow. Если вам трудно понять принцип его работы, проанализируйте содержимое ячейки: пе­ рейдите в последнюю ячейку столбца А и нажмите <End> и <Т>. После этого будет вы­ делена последняя непустая ячейка в столбце А. Свойство Row возвращает номер этой строки; чтобы получить расположенную под ней строку (следующую пустую строку), к этому номеру прибавляется 1. Обратите внимание, что в представленном приеме выделения следующей пустой строки существует один нюанс: если столбец пуст, то следующей пустой строкой будет считаться строка 2. Достаточно легко написать код, учитывающий этот вариант. Приостановка работы макроса для определения диапазона пользователем В некоторых ситуациях макрос должен взаимодействовать с пользователем. Напри­ мер, можно создать макрос, который приостанавливается, когда пользователь указывает диапазон ячеек. Для этого воспользуйтесь функцией Excel In p u tB o x . Примечание Не путайте метод Excel In p u tB o x с функцией VBA In p u tB o x . Несмотря на идентичность названий, это далеко не одно и то же. Глава 11. Приемы и методы программирования на VBA 333 Процедура, представленная ниже, демонстрирует, как приостановить макрос и раз­ решить пользователю выбрать ячейку. Затем автоматически формула вставляется в каж­ дуюячейку выделенного диапазона. Sub G etU serR ange() Dim UserRange As Range Prompt = "Выберите диапазон для случайных ч и с е л ." T i t l e = "Выбор диа пазо н а" 1 Отображение окна ввода данных On E r r o r Resume N e xt Set UserRange = A p p l i c a t i o n . I n p u t B o x ( _ P ro m p t:= P ro m p t, _ T it le : = T itle , _ D e f a u lt : = A c tiv e C e ll.A d d r e s s , _ T y p e :=8) 'Выбор диапазона On E r r o r GoTo 0 1 Проверка, была ли нажата кн о п ка отмены? I f UserRange I s N o th in g Then MsgBox "Д ействие о тм е н е н о ." Else U serR ange. F o rm u la = " =RAND( ) " End I f End Sub Окно ввода данных показано на рис. 11.6. Рис. 11.6. Использование окна ввода данных с целью приостановки выполнения макроса /Ч Компакт-диск ш М Этот пример под названием p ro m p t прилагаемом к книге компакт-диске. fo r a ra n g e .x ls m можно найти на • Ключевым моментом в этой процедуре является определение аргумента Т у р е рав­ ным 8. Кроме того, обратите внимание на использование оператора On E r r o r Resume Next. Он игнорирует ошибку, происходящую по вине пользователя, который щелкает на кнопке Отмена (Cancel). В таком случае объектная переменная U s e rR a n g e не получает значения. В данном примере отображается окно сообщения с текстом “Отменено”. Если Часть III. Visual Basic for Applications 334 же пользователь щелкнет на кнопке OK, то макрос продолжит выполняться. Строка On E r r o r Go То указывает на переход к стандартной обработке ошибки. Проверка корректного выделения диапазона необязательна. Excel позаботится об этом вместо вас. Предупреждение Обязательно проверьте, включено ли обновление экрана при использовании метода In p u tB o x для выделения диапазона. Если обновление экрана отключе­ но, вы не сможете выделить рабочий лист. Чтобы проконтролировать обновле­ ние экрана, в процессе выполнения макроса используйте свойство ScreenU p d a tin g объекта A p p lic a t io n . Подсчет выделенных ячеек Работая с макросом, который обрабатывает выделенный диапазон ячеек, можно ис­ пользовать свойство C o u n t, чтобы определить, сколько ячеек содержится в выделенном (или любом другом) диапазоне. Например, следующий оператор демонстрирует окно со­ общения, которое отображает количество ячеек в текущем выделенном диапазоне: MsgBox S e l e c t i o n . C ount Предупреждение Поскольку размер рабочего листа в Excel 2010 был сильно увеличен, свойст­ во C ount может генерировать ошибку. Свойство C ount использует тип дан­ ных Long, поэтому наибольшее значение, которое может храниться здесь, равно 2147483647. Например, если пользователь выделил 2048 столбцов (2147483648 ячеек), свойство C ount сгенерирует ошибку. К счастью, Microsoft добавила новое свойство, называемое C o u n tL a rg e . Оно использует тип данных D ou ble , причем максимальная величина обрабатываемого значения составляет 1,79+Ел308. В большинстве случаев можно воспользоваться свойством C ount. Если же нужно подсчитать очень много ячеек (например, все ячейки в рабочем лис­ те), используйте свойство C o u n tL a rg e вместо C ount. Если активный лист содержит диапазон d a ta , то следующий оператор присваивает количество ячеек в диапазоне d a t a переменной с названием Се 11 C ount. C e llC o u n t = R ange( " d a t a " ) . C ount Вы можете также определить, сколько строк или столбцов содержится в диапазоне. Следующее выражение вычисляет количество столбцов в выделенном в данный момент диапазоне: S e l e c t i o n . C olu m n s. C ount Для определения количества строк в диапазоне вы также можете использовать свой­ ство Rows. Следующий оператор пересчитывает количество строк в диапазоне с назва­ нием d a t a и присваивает это количество переменной R ow C ou nt. RowCount = R an ge ( " d a t a " ) . Rows. C ount Глава 11. Приемы и методы программирования на VBA 335 Определение типа выделенного диапазона В Excel можно выделить следующие типы диапазонов: • отдельная ячейка; • смежный диапазон ячеек; • один или более полных столбцов; • одна или более полных строк; • весь рабочий лист; • комбинация перечисленных выше типов (называемая множественным выделением). В результате, когда процедура VBA обрабатывает выделенный диапазон, нельзя ис­ ходить из каких-либо предположений о типе этого диапазона. В случае множественного выделения объект Range включает несмежные области. Чтобы определить, является ли выделение множественным, используется метод A re a s, возвращающий коллекцию A re a s. Эта коллекция представляет все диапазоны в множе­ ственном выделении. Чтобы определить, содержатся ли в выделенном диапазоне множественные области, примените выражение, подобное следующему: NumAreas = S e le c t io n . A r e a s . C ount Если переменная NumAreas содержит значение, которое больше единицы, то выде­ ление является множественным. Ниже приводится код функции А геаТуре, которая возвращает текстовую строку, описывающую тип выделенного диапазона. Function АгеаТуре (RangeArea As Range) As S t r in g ' Возвращает тип диапазона S elect Case T ru e Case R an ge A rea . C e l l s . C o u n tL a rg e = 1 АгеаТуре = "Я чейка" Case R an ge A rea . C o u n tL a rg e = C e l l s . C o u n tL a rg e АгеаТуре = "Рабочий л и с т " Case R an ge A rea . Rows. C ount = C e l l s . Rows. C ount АгеаТуре = "С толбец" Case R an ge A rea . C olu m n s. C ount = C e l l s . C olu m n s. C ount АгеаТуре = "С тр о ка " Case E ls e АгеаТуре = "Б л о к" End S e le c t End F u n ctio n Эта функция получает в качестве аргумента объект Range и возвращает одну из пяти строк, описывающих данную область: ячейку (C e ll), рабочий лист (W orksheet), столбец (Column), строку (Row) или блок (Block). Функция использует конструкцию S e l e c t Case для определения одного из четырех выражений сравнения, которое имеет значение True. Например, если диапазон состоит из одной ячейки, функция возвращает значение ячейка. Если количество ячеек в диапазоне равно количеству ячеек в рабочем листе, то функция возвращает рабочий лист. Если количество строк в диапазоне равно количест­ вустрок в рабочем листе, функция возвращает столбец. Если количество столбцов в диа­ пазоне равно количеству столбцов на рабочем листе, функция возвращает строка. Если ниодно из выражений C ase не равно T rue, то функция возвращает строку блок. Часть III. Visual Basic for Applications 336 Обратите внимание, что для подсчета количества ячеек использовалось свойство C ount La гд е. Как уже отмечалось, количество выделенных ячеек может превышать предел для свойства C ount. Компакт-диск Рассматриваемы й пример находится на прилагаемом к книге компакт-диске (файл a b o u t ra n g e s e le c t io n . x ls m ) . Рабочая книга включает процедуру (R a n g e D e s c rip tio n ), использующую функцию А геаТуре для отображения окна сообщения, в котором описывается текущий выделенный диапазон. На рис. 11.7 показан пример. Изучив принцип работы данной процедуры, вы сможете эффективно работать с объектами Range. Рис. 11.7. Процедура VBA анализирует текущий выделенный диапазон Примечание Возможно, вас удивит тот факт, что Excel обеспечивает создание идентич­ ных множественных выделений. Например, если, удерживая клавишу <Ctrl>, пять раз щелкнуть на ячейке А 1 , выделение будет содержать пять идентич­ ных объектов. То же самое относится к процедуре R a n g e D e s c rip tio n , ко­ торая различает идентичные ячейки. Просмотр выделенного диапазона Вы можете столкнуться с трудностями при создании макроса, который оценивает ка­ ждую ячейку в диапазоне и выполняет операцию, определенную заданному критерию. Ниже приведена процедура, которая представляет собой пример подобного макроса. Процедура C o lo r N e g a tiv e устанавливает красный фоновый цвет для ячеек, которые содержат отрицательные значения. Цвет фона для других ячеек не определяется. Примечание Этот пример приводится исключительно в учебных целях. На практике лучше использовать условное форматирование Excel. Sub C o lo r N e g a tiv e () ' Определяет красный цвет для ячее к с отрицательными значениями Dim c e l l As Range I f T y p e N a m e (S e le c tio n ) <> "R ange" Then E x i t Sub Глава 11. Приемы и методы программирования на VBA A p p lic a tio n .S c r e e n U p d a tin g = F a ls e F o r Each c e l l I n S e le c tio n I f c e ll . V a l u e < 0 Then c e l l . I n t e r i o r . C o lo r = RGB(255, E ls e c e l l . I n t e r i o r . C o lo r = xlN o n e End I f N ext c e ll End Sub 337 0, 0) Процедура C o l o r N e g a t i v e работает, но в ней имеется серьезный недостаток. К примеру, какой результат вы получите, если выделение состоит из полного столбца? Или десяти столбцов? Или всего рабочего листа? Пользователь, скорее всего, уснет раньше, чем будут оценены все ячейки. Ниже представлено наилучшее решение ( C o lo r N e g a t iv e 2 ) . В этой переработан­ ной процедуре создается объектная переменная W o rkR a n g e типа R ange, которая пред­ ставляет собой пересечение выделенного диапазона и диапазона рабочего листа. На рис. 11.8 показан пример выделения целого столбца D, включающего 1048576 ячеек. Диапазон, используемый рабочим листом, включает ячейки В2:116. В результате пересе­ чения этих диапазонов получаем область D2:D16, которая намного меньше исходного выделенного диапазона. Естественно, время, затрачиваемое на обработку 15 ячеек, на­ много меньше времени, уходящего на обработку 1048576 ячеек. Рис. 11.8. В результате пересечения используемого диапазона и выде­ ленного диапазона рабочего листа уменьшается количество обрабаты­ ваемых ячеек Sub C o lo rN e g a tive 2 () 1 Определяет красны й ц в е т для я ч е е к с о тр ицател ьн ы м и зн а ч ен и я м и Dim WorkRange As Range Dim c e l l As Range I f T ype N am e(S e lectio n) <> "R ange" Then E x i t Sub A p p lic a tio n . S c re e n U p d a tin g = F a ls e Set WorkRange = A p p l i c a t i o n . I n t e r s e c t ( S e l e c t i o n , A ctive S h e e t.U se d R a n g e ) For Each c e l l I n WorkRange _ 338 Часть III. Visual Basic for Applications If c e ll . V a l u e < 0 Then c e l l . I n t e r i o r . C o lo r = RGB(255, E ls e c e l l . I n t e r i o r . C o lo r = x lN o n e End I f N e xt c e l l End Sub 0, 0) Процедура C o lo r N e g a t iv e 2 представляет собой результат переработки предыдущей процедуры, но все же она недостаточно эффективна, поскольку обрабатывает пустые ячей­ ки. Поэтому появилась третья версия, C o lo r N e g a t iv e 3 , которая немного больше по размеру, но намного эффективнее. В ней используется метод S p e c i a l C e l l s , с помощью которого генерируются два поднабора выделенной области: один поднабор ( C o n s t a n t C e l l s ) включает ячейки, которые содержат исключительно числовые константы; второй поднабор ( F o r m u la C e lls ) включает ячейки, содержащие числовые формулы. Обработка ячеек в этих поднаборах осуществляется с помощью двух конструкций F o r E a c h -N e x t. Благодаря тому, что исключается обработка пустых и нетекстовых ячеек, скорость выпол­ нения макроса существенно увеличивается. Sub C o lo r N e g a tiv e 3 () 1 О п р ед ел я ет кр асны й ц в е т для я ч е е к с о тр ицател ьн ы м и зн а ч е н и я м и Dim F o rm u la C e lls As Range, C o n s ta n tC e lIs As Range Dim c e l l As Range I f T y p e N a m e (S e le c tio n ) <> "R ange" Then E x i t Sub A p p l i c a t i o n . S c re e n U p d a tin g = F a ls e ' С о зд ан и е п о д н аб о р о в на о с н о в е и с х о д н о го вы деления On E r r o r Resume N e xt S e t F o rm u la C e lls = S e l e c t i o n . S p e c ia lC e lls ( x lF o r m u la s , xlN u m b e rs) S e t C o n s ta n tC e lls = S e l e c t i o n . S p e c ia lC e lls ( x lC o n s t a n t s , IN um bers) On E r r o r GoTo 0 ' О б р а б о тка я ч е е к формулы I f N ot F o rm u la C e lls I s N o th in g Then F o r Each c e l l I n F o rm u la C e lls I f c e ll . V a l u e < 0 Then c e l l . I n t e r i o r . C o lo r = RGB(255, E ls e c e l l . I n t e r i o r . C o lo r = x lN o n e End I f N e xt c e l l End I f ' О б р а б о тка я ч е е к , 0, 0) 0, 0) содерж ащ их к о н с т а н т ы I f N o t C o n s ta n tC e lls I s N o th in g Then F o r Each c e l l I n C o n s ta n tC e lls I f c e ll . V a l u e < 0 Then c e l l . I n t e r i o r . C o lo r = RGB(255, E ls e c e l l . I n t e r i o r . C o lo r = x lN o n e End I f N e xt c e l l End I f End Sub Примечание Оператор On E r r o r необходим, поскольку метод S p e c ia lC e lls генерирует ошибку, если не находит в диапазоне ячеек указанного типа. Глава 11. Приемы и методы программирования на VBA 339 К о м п а к т-д и ск Рабочая книга, содержащая три процедуры C o lo rN e g a tiv e , находится на при­ лагаемом к книге компакт-диске и называется e f f i c i e n t lo o p in g . xlsm . Удаление всех пустых строк Следующая процедура удаляет все пустые строки в активном рабочем листе. Она достаточно эффективна, так как не проверяет все без исключения строки, а просматрива­ ет только строки в так называемом “используемом диапазоне”, определяемом с помо­ щьюсвойства UsedRange объекта Worksheet. Sub DeleteEmptyRows () Dim LastRow As Long Dim r As Long Dim C o u n te r As Long A p p lic a tio n .S c r e e n U p d a tin g = F a ls e LastRow = A c tiv e S h e e t.U s e d R a n g e . Rows. C ount + _ A c tiv e S h e e t.U s e d R a n g e .R o w s ( 1 ) .Row - 1 For r = LastR ow To 1 S te p -1 I f A p p lic a tio n .W o r k s h e e tF u n c tio n .C o u n tA ( R o w s ( r ) ) = 0 Then R o w s ( r ) . D e le te C o u n te r = C o u n te r + 1 End I f Next r A p p lic a tio n . S c re e n U p d a tin g = T ru e MsgBox C o u n te r & " пустые с т р о ки уд а л е н ы ." End Sub Первый шаг — определить последнюю используемую строку и присвоить этот номер строки переменной LastRow. Это не так просто, как можно ожидать, поскольку теку­ щий диапазон необязательно начинается со строки 1. Следовательно, значение LastRow вычисляется таким образом: к найденному количеству строк используемого диапазона прибавляется номер первой строки текущего диапазона и вычитается 1. В процедуре применена функция Excel С Ч Ё Т З (COUNTA), определяющая, является ли строка пустой. Если данная функция для конкретной строки возвращает 0, то эта строка пустая. Обратите внимание, что процедура просматривает строки снизу вверх ииспользует отрицательное значение шага в цикле For-Next. Это необходимо, по­ скольку при удалении все последующие строки перемещаются “вверх” в рабочем листе. Если бы в цикле просмотр выполнялся сверху вниз, то значение счетчика цикла после удаления строки оказалось бы неправильным. В макросе используется еще одна переменная, Counter, с помощью которой под­ считывается количество удаленных строк. Эта величина отображается в окне сообщения позавершении процедуры. К о м п а к т -д и с к Рабочая книга, содержащая описанный выше пример, находится на прила­ гаемом к книге компакт-диске и называется d e le t e em pty ro w s . xlsm . Дублирование строк Пример, рассматриваемый в этом разделе, демонстрирует использование возможно­ стей VBA для создания дубликатов строк. На рис. 11.9 показан пример рабочего листа, 340 Часть III. Visual Basic for Applications > используемого организаторами лотереи. В столбце А вводится имя. В столбце В с о д е р ­ жится количество лотерейных билетов, приобретенных одним покупателем. В столбце С находится случайное число (сгенерированное с помощью функции СЛЧИС (RAND)). По­ бедитель определяется путем сортировки данных в третьем столбце (выигрыш соответ­ ствует наибольшему случайному числу). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Имя Алан Барбара Чарли Дэйв Фрэнк Гильда Губерт Инес Марк Нора Пенелопа Рэнси Уэнди В С Количество билетов Случайное число 0,276807291 1 2 0,730227266 1 0,946701186 5 0,015892566 3 0,678673514 1 0,554946703 1 0,467700824 2 0,830401846 0,822189002 1 10 0,371007999 2 0,918587635 0,172321775 1 2 0,909526052 Рис. 11.9. Дублирование строк на основе значе­ ний в столбце В А теперь нужно продублировать строки, в результате чего количество строк для каж­ дого участника лотереи будут соответствовать количеству купленных им билетов. На­ пример, если Барбара приобрела два билета, для нее создаются две строки. Ниже п о к а за ­ на процедура, выполняющая вставку новых строк. Sub DupeRows() Dim c e l l As Range ' В п ер в о й я ч е й к е у к а з а н о к о л и ч е с т в о б и л е то в S e t c e l l = R ange("В 2 ") Do W h ile N ot I s E m p t y ( c e ll) I f c e l l > 1 Then R a n g e ( c e l l . O f f s e t (1, 0 ) , c e l l . O f f s e t ( c e ll . V a l u e 0 ) ) . E n tir e R o w .I n s e r t R a n g e ( c e ll, c e l l . O f f s e t ( c e ll . V a l u e - 1, _ 1 ) ) . E n tir e R o w .F illD o w n End I f S e t c e l l = c e l l . O f f s e t ( c e l l . V a l u e , 0) Loop End Sub - 1, _ Объектная переменная c e l l была инициализирована ячейкой В2, первой я ч ей к ой , в которой находится числовая величина. Вставка новых строк осуществляется в цикле, а их копирование происходит с помощью метода F i l l D o w n . Значение п е р е м е н н о й c e l l увеличивается на единицу, после чего выбирается следующий участник л о т ер еи , Цикл выполняется до тех пор, пока не встретится пустая ячейка. На рис. 11.10 п оказан рабочий лист после выполнения этой процедуры. Компакт-диск Рабочая книга, содержащая описанный выше пример, находится на прила­ гаемом компакт-диске в файле d u p lic a t e row s .x ls m . 341 Глава 11. Приемы и методы программирования на VBA Определение диапазона, находящегося вдругом диапазоне Функция In R a n g e , показанная ниже, имеет два аргумента, оба — объекты Range. Функ­ ция возвращает значение T ru e (Истина), если первый диапазон содержится во втором. F un ctio n I n R a n g e ( r n g l , r n g 2 ) As B o o le a n 1 Возвращ ает з н а ч е н и е T r u e , ес л и д и а п а зо н rngl входит в д и а п а з о н r n g 2 InR an ge = F a l s e I f r n g l . P a r e n t . P a r e n t . Name = rng2 . P a r e n t . P a r e n t . Name T h e n I f r n g l . P a r e n t.N a m e = rng2 . P a r e n t . Name T h e n I f U n io n ( r n g l, r n g 2 ).A d d r e s s = rng2 . A d d re s s T h e n In R a n g e = T r u e End I f End I f End I f End F u n c tio n Возможно, функция In R a n g e кажется сложнее, чем того требует ситуация, поскольку в коде должна быть реализована проверка принадлежности двух диа­ пазонов одной и той же книге и рабочему листу. Обра­ тите внимание, что в процедуре используется свойство P aren t, которое возвращает объект-контейнер за­ данного объекта. Например, следующее выражение возвращает название листа для объекта r n g l : rn g l. P a r e n t . Name .. д 1 Имя 2 Алан ! в Количество билетов 1 .....2................... С Случайное число 0,811712817 0,408809459 3 Барбара 4 Барбара 2 0,817294658 5 Чарли 1 0,965809492 6 Дэйв 5 0,777591092 7 Дэйв 5 0,704535562 8 Дэйв 5 0,566578818 9 Дэйв 5 0,560431236 10 Дэйв 5 0,849621677 11 Фрэнк 3 0,349464908 12 Фрэнк 3 0,347134158 13 Фрэнк 3 0,33883254 14 Тильда 1 0,519896123 15 Губерт 1 0,956426929 16 Инес 2 0,108305391 1? 18 Инес 2 0,949941449 Марк 1 0,563116763 19 20 21 22 23 24 Нора 10 0,881752223 Нора 10 0,588564786 Нора 10 0,025840496 Нора 10 0,199440989 Нора 10 0,067126822 Нора 10 0,54658458 25 26 Нора 10 0,293597337 Нора 10 0,936284654 27 Нора 10 0,975085451 28 Нора 10 0,480195995 Пенелопа 2 0,073935047 30 Пенелопа 2 0,192292217 31 Рэнси 1 0,10695783 32 Уэнди 2 0,896294737 33 Уэнди 2 0,486119769 29 Следующее выражение возвращает название ра­ 34.......................... .................... бочей книги r n g l : Рис. 11.10. В соответствии со значе­ rn g l. P a r e n t . P a r e n t . Name нием в столбце В добавлены новые строки Функция VBA U n io n возвращает объект R ange, который представляет собой объединение двух объ­ ектов типа R ange. Объединение содержит все ячейки, относящиеся к исходным диапа­ зонам. Если адрес объединения двух диапазонов совпадает с адресом второго диапазона, первый диапазон входит в состав второго диапазона. Компакт-диск Рабочая книга, включающая только что описанную функцию, находится на прилагаемом компакт-диске в файле i n r a n g e f u n c t i o n . x ls m . Определение типа данных ячейки В состав Excel входит ряд встроенных функций, которые могут помочь определить тип данных, содержащихся в ячейке. Это функции Е Н Е Т Е К С Т (ISTEXT), ЕЛО ГИ Ч (ISLOGICAL) и ЕОШ ИБКА (ISERROR). Кроме того, VBA поддерживает функции IsEmpty, I s D a t e и Is N u m e r ic . 342 Часть III. Visual Basic for Applications Ниже описана функция Cell Type, которая принимает аргумент-диапазон и возвраща­ ет строку (Пусто, Текст, Булево выражение, Ошибка, Дата, Время или Значение), описывающую тип данных левой верхней ячейки этого диапазона. Такую функцию можно использовать в формуле рабочего листа или вызвать из другой процедуры VBA. F u n c tio n C e llT y p e (R n g ) ' ' В о зв р а щ а ет ти п в е р х н е й л ев о й я чей ки в ди апазо н е Dim T h e C e ll As Range S e t T h e C e ll = R ng. R ange( " A l ") S e le c t Case T ru e Case Is E m p ty (T h e C e ll) C e llT y p e = "П у с то " Case A p p l i c a t i o n . Is T e x t( T h e C e ll) C e llT y p e = " Т е к с т " Case A p p l ic a t io n . I s L o g ic a l( T h e C e ll) C e llT y p e = "Б ул ево вы ражение" Case A p p l i c a t i o n . I s E r r ( T h e C e ll) C e llT y p e = " E r r o r " Case Is D a te ( T h e C e ll) C e llT y p e = "Д а т а " Case I n S t r ( l , T h e C e ll. T e x t , " : " ) <> 0 C e llT y p e = "Время" Case Is N u m e ric ( T h e C e ll) C e llT y p e = "З н а ч е н и е " End S e le c t End F u n c tio n Обратите внимание на использование оператора Set TheCell. Функция CellType получает аргумент-диапазон произвольного размера, но этот оператор указывает, что функция оперирует только левой верхней ячейкой диапазона (представленной перемен­ ной TheCell). Компакт-диск Рабочая книга, содержащая описанную выше функцию, находится на прила­ гаемом компакт-диске в файле c e l l t y p e f u n c t i o n . xlsm . Чтение и запись диапазонов Многие задачи, выполняемые в электронных таблицах, связаны с переносом значений из массива в диапазон ячеек или из диапазона в массив. Следует отметить, что Excel по­ лучает данные из диапазонов значительно быстрее, чем записывает их. Процедура WriteReadRange демонстрирует относительную скорость записи и чтения диапазона. Процедура создает массив и затем использует циклы For-Next для записи этого массива в диапазон и считывания данных обратно в массив. С помощью функции Timer вычисляется время, необходимое для каждой операции. Sub W rite R e a d R a n g e () Dim M y A rra y () Dim T im e l As D ou ble Dim NumElements As Long, i As Long Dim W rite T im e As S t r i n g , ReadTime As S t r in g Dim Msg As S t r i n g NumElements = 60000 ReDim M y A rra y (1 To NumElements) Глава 11. Приемы и методы программирования на VBA 343 1 Заполнение м ас си в а For i = 1 То NumElements M y A rra y ( i ) = i Next i ' Запись м а с с и в а в д и а п а з о н Tim el = T im e r For i = 1 To NumElements C e lls ( i , 1) = M y A r r a y ( i) Next i W riteTim e = F o rm a t(T im e r - T im e l, ' " 0 0 :0 0 " ) Считывание д и а п а з о н а в м ассив Timel = T im e r For i = 1 To NumElements M y A rra y (i) = C e lls ( i , 1) Next i ReadTime = F o rm a t(T im e r - T im e l, " 0 0 :0 0 " ) 1 Отображение р е з у л ь т а т о в Msg = "З а п и с ь : " & W rite T im e Msg = Msg & v b C rL f Msg = Msg & "Ч т е н и е : " & ReadTime MsgBox Msg, vbO KO nly, NumElements & " э л е м е н то в " End Sub В моей системе для записи массива из 60 тысяч элементов в диапазон потребовалось 58секунд, и только 1 секунда ушла на то, чтобы занести этот диапазон обратно в массив. Более эффективный способ записи в диапазон В примере из предыдущего раздела для перемещения содержимого массива в диапа­ зон используется цикл F o r-N e x t. В данном разделе показан более эффективный способ выполнения этой операции. Начнем со следующего примера, в котором продемонстрирован наиболее очевидный (но не самый эффективный) способ заполнения диапазона. В этом примере для вставки значений в диапазон используется цикл F o r-N e x t. Sub L oopF illR ange () ' Заполнение д и а п а з о н а в ц и кл е по я ч е й ка м Dim Dim Dim Dim ' CellsDown As Long, C e lls A c r o s s As I n t e g e r CurrRow As Long, C u rrC o l As I n t e g e r S ta rtT im e As D ou ble C urrV al As Long Получение р азм ер о в CellsDown = In p u tB o x ( "С ко л ь ко я ч е е к в в ы с о т у ? ") I f CellsDown = 0 Then E x i t Sub C ellsAcross = In p u tB o x ( "С ко л ь ко я ч е е к в ш и р и н у? ") I f C e lls A c ro s s = 0 Then E x i t Sub . i 1 Запись момента н а ч а л а StartTime = T im e r : 1 Просмотр я ч е е к и в с т а в к а s значений CurrVal = 1 A p p lic a tio n . S c re e n U p d a tin g = F a ls e For CurrRow = 1 To C ellsD ow n 344 Часть III. Visual Basic for Applications F o r C u rrC o l = 1 To C e lls A c r o s s A c t i v e C e l l . O ffs e t(C u rrR o w - 1, _ C u rrC o l - 1 ) .V a lu e = C u rrV a l C u rrV a l = C u rrV a l + 1 N e x t C u rrC o l N e x t CurrRow ' Отображение времени выполнения операции A p p lic a tio n .S c r e e n U p d a tin g = T ru e MsgBox F o rm a t(T im e r - S ta r tT im e , " 0 0 .0 0 " ) End Sub & " с е ку н д " Следующий пример демонстрирует самый эффективный способ получения того же результата. Программа вставляет значения в массив и использует всего один оператор для перенесения содержимого массива в диапазон. Sub A r r a y F illR a n g e () ' Заполнение диапазона путем перенесения массива Dim C e llsD o w n As Long, C e lls A c r o s s As I n t e g e r Dim i As Long, j As I n t e g e r Dim S ta r tT im e As D ou ble Dim T e m p A rra y () As Long Dim TheRange As Range Dim C u rrV a l As Long 1 Получение размеров C e llsD o w n = In p u tB o x ( "С ко лько яч ее к в вы с о ту ? ") I f C e llsD o w n = 0 Then E x i t Sub C e lls A c r o s s = In p u tB o x ( "С ко лько яч ее к в ш ирину?") I f C e lls A c r o s s = 0 Then E x i t Sub ' Запись момента начала S ta r tT im e = T im e r ' Изменение размера временного массива ReDim T e m p A rra y (1 То C e llsD o w n , 1 То C e lls A c r o s s ) ' Определение диапазона на рабочем листе S e t TheRange = A c t iv e C e ll. R a n g e ( C e lls (1, 1 ) , _ C e lls (C e lls D o w n , C e lls A c r o s s ) ) ' Заполнение временного массива C u rrV a l = 0 A p p l i c a t i o n . S c re e n U p d a tin g = F a ls e F o r i = 1 To C e llsD o w n F o r j = 1 To C e lls A c r o s s T e m p A rra y ( i , j ) = C u rrV a l + 1 C u rrV a l = C u rrV a l + 1 N e xt j N ext i ' Перенесение временного массива в рабочую к н и г у T he R an ge .V alue = Tem pA rray ' Отображение времени вычислений A p p lic a tio n .S c r e e n U p d a tin g = T ru e MsgBox F o rm a t(T im e r - S ta r tT im e , " 0 0 .0 0 " ) & " с е ку н д " End Sub Например, в моей системе на заполнение массива размером 1000x250 ячеек (250 ты­ сяч ячеек) методом цикла уходит 10,05 секунды. Метод перенесения массива потребовал только 0,18 секунды для получения тех же самых результатов — более чем в 50 раз бы­ стрее! Мораль? Если необходимо переносить большие объемы данных на лист Excel, по возможности избегайте циклов. Глава 11. Приемы и методы программирования на VBA 345 Примечание Время вычисления сильно зависит от наличия формул. В общем случае время перенесения м ассива будет минимальным при использовании рабо­ чих книг, в которых отсутствуют формулы либо выбран режим пересчета формул Вручную. Компакт-диск Рабочая книга, включающая процедуры W riteR eadR ange, L o o p F illR a n g e и A r r a y F illR a n g e , находится на прилагаемом компакт-диске в файле lo o p vs a r r a y f i l l ra n g e .x ls m . Перенесение одномерных массивов В примере из предыдущего раздела рассматривался двухмерный массив, который можно использовать для управления прямоугольными диапазонами (содержащими не­ сколько строк и столбцов). При перенесении одномерного массива диапазон должен быть горизонтальным, т.е. это должна быть строка длительностью в несколько столбцов. Если же необходимо использо­ вать вертикальный диапазон, сначала следует транспонировать массив. Для этого исполь­ зуйте функцию Excel ТРАНСП (TRANSPOSE). В следующем примере 100-элементный мас­ сив вставляется в вертикальный диапазон на рабочем листе (А1:А100). Range("А 1 :А 1 0 0 ") .V a lu e = _ A p p lic a t io n . W o rk s h e e tF u n c tio n . T ra n sp o s e (M yA rray) Предупреждение н » Функция Excel тран сп не работает с массивами, которые содержат более 65536 элементов. Перенесение диапазона в массив типа variant В настоящем разделе рассматривается еще один способ управления данными Excel в VBА. Впримере, показанном ниже, диапазон ячеек переносится в двухмерный массив типа V a r i ant. Затем в окнах сообщений отображаются границы обеих размерностей массива. Sub R angeToV ariant () Dim х As V a r ia n t x = Range ("A 1 :L 6 0 0 ") .V a lu e MsgBox U Bound(x, 1) MsgBox U Bound(x, 2) End Sub В данном примере в первом окне сообщения отображается 60 0 (количество строк вмассиве), а во втором окне сообщения— 12 (количество столбцов). Вы увидите, что перенесение данных диапазона в массив типа V a r i a n t происходит за долю секунды. В следующем примере считывается диапазон в массив V a r i a n t , выполняется про­ стая операция умножения над каждым элементом массива и массив перемещается обрат­ нов диапазон. Sub R angeToV ariant2 () Dim х As V a r ia n t Dim r As Long, с As I n t e g e r 1 Чтение данных 346 г Часть III. Visual Basic for Applications x = R ange( " d a t a " ) .V a lu e ■ Просмотр массива F o r r = 1 To U B o u n d (x/ 1) F o r с = 1 To U B ound(x, 2) ' Умножение на 2 x ( r , с) = x (г , с) * 2 N ext с N ext г ' Передача переменной типа V a r ia n t обратно на лист R ange( " d a t a " ) = х End Sub Данная процедура работает очень быстро. Компакт-диск Рабочая книга, содержащая этот пример, находится на прилагаемом компакт-диске в файле v a r i a n t t r a n s f e r . xlsm . Выбор ячеек по значению Пример из этого раздела демонстрирует выделение ячеек на основе их значений. До­ вольно странно, что в Excel отсутствует метод осуществления этой операции. Эта про­ блема решается с помощью разработанной мною процедуры S e le c tB y V a lu e . Данная процедура выделяет ячейки с отрицательными значениями, но это поведение можно лег­ ко изменить. Sub S e le c tB y V a lu e () Dim C e ll As O b je c t Dim F o u n d C e lls As Range Dim WorkRange As Range If 1 T y p e N a m e (S e le c tio n ) <> "R ange" Then E x i t Sub Проверить все или выделенное? I f S e l e c t i o n . C o u n tL a rg e = 1 Then S e t WorkRange = A c tiv e S h e e t.U s e d R a n g e E ls e S e t WorkRange = A p p l i c a t i o n . I n t e r s e c t ( S e l e c t i o n , A c tiv e S h e e t.U s e d R a n g e ) End I f _ 1 Ограничение по иска то л ь ко числовыми ячейками On E r r o r Resume N e xt S e t WorkRange = W orkRange. S p e c ia lC e lls ( x lC o n s t a n t s , x lN u m b e rs) I f WorkRange I s N o th in g Then E x i t Sub On E r r o r GoTo 0 1 ' Обход каждой я ч е й ки , добавление в диапазон F o u n d C e lls я ч е е к, удовлетворяющих заданным условиям F o r Each C e ll I n WorkRange I f C e ll. V a lu e < 0 Then I f F o u n d C e lls I s N o th in g Then S e t F o u n d C e lls = C e ll E ls e S e t F o u n d C e lls = U n io n ( F o u n d C e lls , C e ll) End I f Глава 11. Приемы и методы программирования на VBA 347 End I f Next C e ll ' Отображение сообщения либо выделение ячеек I f F o u n d C e lls I s N o th in g Then MsgBox "He найдены я ч е й ки , соответствующ ие заданным у с л о в и я м ." Else F o u n d C e lls . S e le c t End I f End Sub Процедура начинается с проверки выделенной области. Если выделена одна ячейка, поиск выполняется во всей рабочей книге. Если в выделенную область включаются хотя бы две ячейки, поиск осуществляется только в выделенном диапазоне. Уточнение ре­ зультатов поиска в диапазоне производится с помощью метода S p e c i a l C e l l s , причем создается объект Range, который содержит только числовые константы. Код в цикле F o r-N e x t проверяет значение ячейки. Если оно соответствует крите­ рию (меньше 0), ячейка добавляется в объект F o u n d C e lls Range с помощью метода Union. Обратите внимание, что для первой ячейки метод U nion неприменим. Если диапазон F o u n d C e lls не содержит ячеек, попытка применения метода U nion приведет к появлению ошибки. Таким образом код проверяет, не будет ли значение объекта FoundCells равно N o th in g . По завершении цикла объект F o u n d C e lls будет состоять из ячеек, которые удовле­ творяют критерию (либо получит значение N o th in g , если ячейки не найдены). Если ячей­ кине найдены, отображается окно сообщения. В противном случае выделяются ячейки. Компакт-диск Рассмотренный выше пример находится на прилагаемом к книге компактдиске в файле s e le c t b y v a lu e .x ls m . Копирование несмежных диапазонов Если вы попытаетесь копировать несмежные (или, как их еще называют, несвязные) выделенные диапазоны, ничего из этого не выйдет, поскольку Excel не поддерживает эти операции. Подобная попытка завершится отображением сообщения об ошибке Д а н н а я команда н е п р им е н им а д л я н е с в я з н ы х д и а п а з о н о в (That command cannot be used on multiple selections). Как правило, любое ограничение в Excel можно преодолеть, создав специальный макрос. Ниже приведена процедура VBA, обеспечивающая копирование нескольких вы­ деленных областей в другое место. Sub C o p y M u ltip le S e le c tio n () Dim SelAreas () As Range Dim PasteRange As Range Dim U p p e rL e ft As Range Dim NumAreas As Long, i As Long Dim TopRow As Long, L e f t C o l As Long Dim R owOffset As Long, C o lO f fs e t As Long I f TypeName ( S e le c tio n ) <> "Range" Then E x i t Sub 1 Хранение областей в виде отдельных объектов Range NumAreas = S e le c tio n .A re a s . C ount ReDim S e lA re a s (1 To NumAreas) Часть III. Visual Basic for Applications 348 ' ' 1 ' F o r i = 1 To NumAreas S e t S e lA r e a s ( i) = S e le c t io n . A r e a s ( i) N e xt Определение верхней левой ячейки в множественном выделении TopRow = A c t iv e S h e e t. Rows. C ount L e ft C o l = A c t iv e S h e e t. C olu m n s. C ount F o r i = 1 To NumAreas I f S e lA r e a s ( i) .R o w < TopRow Then TopRow = S e lA r e a s ( i) .R o w I f S e lA r e a s ( i) .C o lu m n < L e ft C o l Then L e ft C o l = S e lA re a s _ ( i) .C o lu m n N e xt S e t U p p e r L e ft = C e lls (T o p R o w , L e ft C o l) Получить адрес в с т а в ки On E r r o r Resume N e x tS e t PasteRange = A p p l i c a t i o n . In p u tB o x _ (P ro m p t: = "У ка за ни е верхней левой ячейки для диапазона _ в с т а в к и :" , T i t l e : = "Копирование м нож ественного _ выделения " , Т у р е :=8) On E r r o r GoTo О Выход после отмены операции I f TypeNam e(PasteRange) <> "R ange" Then E x i t Sub Убедитесь в том, что и сп о л ь з у е т с я то л ь ко верхняя левая ячейка S e t PasteRange = P a ste R a n g e . R ange( " A l ") 1 Копирование и в с т а в ка каждой области F o r i = 1 То NumAreas R o w O ffs e t = S e lA r e a s ( i) .R o w - TopRow C o lO f fs e t = S e l A r e a s ( i ) . Column - L e ft C o l S e l A r e a s ( i ) . Copy P a ste R a n g e . O ff s e t( R o w O f fs e t, C o lO ffs e t) N e xt i End Sub На рис. 11.11 показан запрос на выбор цели копирования. Компакт-диск На прилагаемом компакт-диске находятся рабочая книга с приведенным выше примером, а также ещ е одна версия, которая отображает предупреж­ дение в случае опасности перезаписи данных. Соответствующий файл на­ зывается со ру m u l t i p l e s e le c t io n . x ls m . Управление рабочими книгами и листами Приводимые в этом разделе примеры демонстрируют различные способы использо­ вания VB А для управления рабочими книгами и листами. Сохранение всех рабочих книг Следующая процедура циклически просматривает все рабочие книги в коллекции W orkbooks и сохраняет каждый файл, который сохранялся ранее. P u b lic Sub S a v e A llW o rk b o o k s () Dim Book As W orkbook F o r Each Book I n W orkbooks I f B o o k .P a th <> " " Then B ook.S ave Глава 11. Приемы и методы программирования на VBA 349 N e x t B ook End Sub Обратите внимание на то, как используется свойство P a th . Если для какой-либо ра­ бочей книги свойство P a th не задано, значит, файл еще не сохранялся (это новая рабо­ чая книга). Данная процедура игнорирует такие рабочие книги и сохраняет только те из них, свойство P a th которых имеет ненулевое значение. Рис. 11.11. Использование метода Excel InputBox для запроса местоположения ячейки Сохранение и закрытие всех рабочих книг Следующая процедура циклически просматривает коллекцию W o rk b o o k s . Про­ грамма сохраняет и закрывает все рабочие книги. Sub C lo se A llW o rkb o o ks () Dim Book As W orkbook For Each Book I n W orkbooks I f Book.Name <> T h is W o rk b o o k . Name Then B o o k .C lo s e s a v e c h a n g e s : =True End I f Next Book ThisW orkbook. C lo se savechanges : =True End Sub Обратите внимание, что процедура использует оператор I f , чтобы определить, со­ держит ли данная рабочая книга текущий выполняемый код. Это необходимо, так как при закрытии рабочей книги, содержащей процедуру, программа автоматически завер­ шает свое выполнение, причем остальные рабочие книги не будут сохранены и закрыты. 350 Часть III. Visual Basic for Applications Частичное сокрытие элементов рабочего листа В примере из этого раздела скрываются все строки и столбцы рабочего листа за ис­ ключением тех из них, которые находятся в текущем выделенном диапазоне. Соответст­ вующий пример показан на рис. 11.12. 1____ |_____ i__ ' м м т ■ ■И Ш иД Ш И Ш М И И И М ■ 1ЙЯМ 1Ш 8 ы _________ ___ 14 < ► И ж ] Лист ! / Х З Г 7 Рис. 11.12. Столбцы и строки скрыты (за исключением диапазона G8:K17) Sub H ideR ow sAndC olum ns() Dim r o w l As Long, row2 As Long Dim c o l l As Long, c o l2 As Long If 1 T ype N a m e -(S e le ctio n ) <> "R ange" Then E x i t Sub Если скры т п о с л е д н и й с т о л б е ц или с т р о к а , ото бр ази ть в с е и выйти If R o w s (R o w s .C o u n t).E n tire R o w .H id d e n Or _ C o lu m n s(C o lu m n s. C o u n t) . E n tir e C o lu m n . H id d e n Then C e l l s . E n tire C o lu m n .H id d e n = F a ls e C e l l s . E n tire R o w .H id d e n = F a ls e E x i t Sub End I f r o w l = S e le c tio n .R o w s ( 1 ) .Row row2 = r o w l + S e le c tio n .R o w s . C ount - 1 c o l l = S e le c tio n .C o lu m n s ( 1 ) . C olu m n col2 = c o l l + _ S e le c tio n .C o lu m n s . C ount - 1 A p p lic a tio n .S c r e e n U p d a tin g = F a ls e On E r r o r Resume N e xt 1 Скрыть с т р о к и R a n g e ( C e lls (1 , 1 ) , C e lls ( r o w l - 1, 1 ) ) . E n tire R o w .H id d e n = T ru e R a n g e (C e lls (ro w 2 + 1, 1 ) , C e lls (R o w s . C o u n t, _ 1 ) ) . E n tire R o w .H id d e n = T ru e 1 Скрыть столбцы R a n g e ( C e lls (1 , 1 ) , C e l l s ( l , c o l l - 1 ) ) .E n tire C o lu m n .H id d e n = _ T ru e R a n g e ( C e lls (1, c o l2 + 1 ) , C e l l s ( l , C olum ns. _ C o u n t) ) .E n tire C o lu m n .H id d e n = T ru e End Sub Глава 11. Приемы и методы программирования на VBA 351 Если выделенный диапазон включает несвязанные диапазоны, первый оператор A re a применяется в качестве основы для сокрытия строк и столбцов. Компакт-диск Рабочая книга, включающая этот пример, находится на прилагаемом ком­ пакт-диске в файле h id e row s and c o lu m n s .x ls m . Синхронизация рабочих книг Если вы работаете с рабочими книгами, состоящими из нескольких листов, то, веро­ ятно, знаете, что Excel не может “синхронизировать” листы в рабочей книге. Другими словами, не существует автоматического способа сделать так, чтобы все листы имели одинаковые выделенные диапазоны и верхние левые ячейки. Макрос VBA, показанный ниже, берет за основу активный рабочий лист и выполняет следующие действия со всеми остальными рабочими листами в книге: • выделяет тот же диапазон, что и в активном листе; • задает ту же левую верхнюю ячейку, что и на активном листе. Ниже приведен листинг данного макроса. Sub S yn ch S h e e ts() 1 Д ублирует а кти в н ы й д и а п а з о н и верхнюю левую я ч е й к у ' а к т и в н о го л и с т а во в с е х р а б о ч и х л и с т а х I f T y p e N a m e (A c tiv e S h e e t) <> "W o rk s h e e t" Then E x i t Sub Dim U se rS h e e t As W o rk s h e e t, s h t As W o rkshe et Dim TopRow As Long, L e f t C o l As I n t e g e r Dim U s e rS e l As S t r in g A p p lic a tio n .S c r e e n U p d a tin g = F a ls e ' С охранение т е к у щ е г о л и с т а Set U se rS h e e t = A c tiv e S h e e t ' Сохранение инф ормации и з а к т и в н о г о л и с т а TopRow = A c tiv e W in d o w . S c ro llR o w L e ftC o l = A c tiv e W in d o w .S c ro llC o lu m n U serS el = A c tiv e W in d o w . R a n g e S e le c tio n .A d d re s s ' Просмотр р а б о ч и х л и с то в For Each s h t I n A c tiv e W o rk b o o k . W o rksh e e ts I f s h t . V i s i b l e Then 'п р о п у с к скрытых л и с то в s h t . A c t iv a t e R a n g e ( U s e rS e l) .S e le c t A c tiv e W in d o w .S c ro llR o w = TopRow A c tiv e W in d o w .S c ro llC o lu m n = L e ft C o l End I f Next s h t 1 Переход к п е р в о н а ч а л ь н о й п о з и ц и и U s e r S h e e t.A c tiv a te A p p lic a tio n .S c r e e n U p d a tin g = T ru e End Sub Компакт-диск Рабочая книга с рассмотренны м выше примером находится на прилагаемом компакт-диске в файле s y n c h r o n iz e s h e e ts . x ls m . 352 Часть III. Visual Basic for Applications Методы программирования на VBA Примеры в этом разделе иллюстрируют часто используемые приемы VBA, которые можно применять в собственных проектах. Переключение значения булева свойства Булево свойство — это логическое свойство, принимающее одно из двух значений: T r u e (ИСТИНА) или F a ls e (ЛОЖЬ). Самый простой способ изменить булево свойст­ во — использовать оператор N o t, как показано в следующем примере, в котором акти­ визируется свойство переноса по словам W ra p T e x t в выделенном диапазоне ячеек. Sub T o g g le W ra p T e x t() 1 Управляет переносом слов в выделенных яч ей ках I f T y p e N a m e (S e le c tio n ) = "R ange" Then S e l e c t i o n . W rapText = N o t A c t i v e C e l l . W rapText End I f End Sub Обратите внимание, что за основу взята активная ячейка. Когда диапазон выделен и значения свойств в разных ячейках неодинаковы (например, в одних ячейках шрифт полужирный, а в других — нет), то диапазон считается смешанным, и Excel использует в качестве базового значение свойства активной ячейки. Если, например, активная ячей­ ка имеет полужирный шрифт, то начертание текста в выделенных ячейках после щелчка на кнопке Полужирный панели инструментов будет обычным. Эта простая процедура имитирует поведение элемента интерфейса Excel. Процедура использует функцию TypeN am e, чтобы проверить, является ли выделен­ ный объект диапазоном. Если это не так, то ничего не происходит. Оператор N o t можно использовать для переключения значений многих свойств. На­ пример, для отображения заголовков строк и столбцов в рабочем листе примените сле­ дующую команду. A c tiv e W in d o w . D is p la y H e a d in g s = N ot _ A c tiv e W in d o w . D is p la y H e a d in g s Для отображения линий сетки на активном листе воспользуйтесь таким кодом. A c t iv e W in d o w .D is p la y G r id lin e s = N ot _ A c tiv e W in d o w . D is p la y G r id lin e s Определение количества страниц для печати Если нужно определить количество страниц для печати, можно использовать команду Excel Предварительный просмотр (Print Preview), а затем подсчитать количество ото­ бражающихся на экране страниц. Этот процесс поддается автоматизации с помощью следующей процедуры VBA, которая вычисляет количество страниц для печати на актив­ ном листе путем подсчета горизонтальных и вертикальных разрывов страницы. Sub P a g e C o u n t() MsgBox ( A c tiv e S h e e t. H P a ge B rea ks. C ount + 1 ) * _ ( A c tiv e S h e e t. V P a g e B re a ks. C ount + 1 ) & " стр а н и ц " End Sub Представленная ниже процедура VBA циклически просматривает все листы в актив­ ной рабочей книге и отображает общее количество страниц для печати (рис. 11.13). Глава 11. Приемы и методы программирования на VBA Sub ShowPageCount() Dim PageCount As I n t e g e r Dim s h t As W o rkshe et PageCount = 0 For Each s h t I n W o rksh e e ts PageCount = PageCount + ( s h t . H P ageB reaks. C ount + 1 ) (s h t.V P a g e B re a k s . C ount + 1) Next s h t MsgBox " В с е го с т р а н и ц = " & PageCount End Sub 353 * _ Компакт-диск Рабочая книга, включающая рассмотренный пример, находится на прила­ гаемом компакт-диске в файле page c o u n t . x ls m . Отображение даты и времени Если вы разбираетесь в системе, используемой в Excel для хранения значений дат и времени, то у вас не возникнет проблем при работе со значениями дат и времени в про­ цедурах VB А. Процедура D a te A n d T im e отображает окно сообщения с текущими датой и време­ нем (рис. 11.14). В этом примере в строке заголовка окна сообщения представлено поль­ зовательское сообщение. Рис. 11.13. С помощью процедуры VBA подсчитывается количество печатных страниц в рабочей книге Рис. 11.14. В окне сообщения отображаются дата и время Процедура использует в качестве аргумента функции F o r m a t функцию D a te . В ре­ зультате строка с датой будет представлена в удобном для восприятия формате. Тот же прием применяется для задания формата времени. Sub DateAndTime () Dim TheD ate As S t r i n g , TheTime As S t r in g Dim G r e e tin g As S t r in g Dim FullN am e As S t r i n g , F irs tN a m e As S t r in g Dim SpaceInName As Long TheDate = F o rm a t(D a te , "L on g D a te ") TheTime = F o rm a t(T im e , "M edium T im e ") 1 О пределение п р и в е т с т в и я в з а в и с и м о с т и о т вр ем ени с у т о к S e le c t Case Time Case I s < T im e V a lu e ( " 1 2 : 0 0 " ) : G r e e tin g = "Д оброе у т р о , " Case I s >= T im e V a lu e ( " 1 7 : 0 0 " ) : G r e e tin g = "Добрый в е ч е р , " Case E ls e : G r e e tin g = "Добрый д е н ь , " End S e le c t 1 П рисоединение к п р и в е т с тв и ю им ени п о л ь з о в а т е л я FullName = A p p lic a tio n .U s e rN a m e SpacelnName = I n S t r ( l , F u llN a m e , 123ak. 3107 " ", 1) 354 ' Часть III. Visual Basic for Applications О б р а б о тка с и т у а ц и и , ко гд а в имени н е т п р о б ел а I f SpacelnName = 0 Then SpacelnName = L e n (F u llN a m e ) F irs tN a m e = L e ft( F u llN a m e , SpacelnName) G r e e tin g = G r e e tin g & F irs tN a m e ' О то б р аж ен и е сообщ ения MsgBox TheD ate & v b C rL f & v b C rL f & "С е й ч а с " & TheTim e, vbOKOnly, G r e e tin g End Sub В данном примере использованы именованные форматы (“Long Date” и “Medium Time”) для обеспечения работоспособности макроса независимо от региональных настроек компьютера пользователя. Однако вы можете обратиться к другим форматам. Например, чтобы отобразить дату в формате м м /д д /г г , воспользуйтесь следующим оператором: TheD ate = F o rm a t(D a te , " м м /д д /г г " ) Чтобы отобразить в зависимости от времени суток приветствие в строке заголовка, ис­ пользуется конструкция S e l e c t Case. Значения времени задаются в VBA так же, как в Excel. Если время меньше 0,5 (полдень), то это утро. Если время больше 0,7083 (5 часов вечера), то это вечер. Все остальное время — это день. Мы выбрали простой способ и ис­ пользовали функцию VBA T im e V a lu e , которая возвращает значение времени из строки. Следующие операторы определяют имя пользователя, указанное на вкладке Общие (General) диалогового окна Параметры Excel (Excel Options). Для нахождения первого пробела в имени пользователя использована функция VBA I n S t r . Когда я создавал рас­ сматриваемую процедуру впервые, то не учел, что в имени пользователя пробел может отсутствовать. Поэтому, когда процедура была запущена на компьютере с именем поль­ зователя N o b o d y , программа выдала ошибку, из чего следует, что нельзя предусмотреть все, и даже самые простые процедуры могут дать сбой. (Кстати говоря, если поле для введения имени пользователя не заполнено, то Excel всегда использует значение User.) Решение этой проблемы состоит в следующем: присвойте переменной SpacelnN am e длину полного имени пользователя, и функция L e f t извлечет полное имя. Функция M sgB ox объединяет дату и время, но использует встроенную константу v b C r L f для вставки между ними разрыва строки. v b O K O n ly — предопределенная кон­ станта, возвращающая 0; в результате окно сообщения содержит только кнопку ОК. По­ следний аргумент — приветствие G r e e t i n g , составленное ранее в процедуре. Компакт-диск Процедуру D ateAndTim e можно найти на прилагаемом к книге компактдиске в файле d a te and tim e . xlsm . Отображение списка шрифтов Если вам необходимо познакомиться со списком всех установленных шрифтов, помни­ те, что в Excel нет прямого способа получить эту информацию. Описанная в этом разделе методика основана на том, что в Excel 2010 для обеспечения совместимости поддержива­ ются свойства и методы объекта CommandBar. Эти свойства и методы использовались для работы с панелями инструментов и меню в версиях Excel, предшествующих Excel 2007. Макрос S h o w I n s t a lle d F o n t s отображает список установленных шрифтов в столб­ це А активного рабочего листа. При этом создается временная панель инструментов (объект Com m andBar), добавляется элемент управления F o n t, а также считываются шрифты из этого элемента управления. Затем временная панель инструментов удаляется. Глава 11. Приемы и методы программирования на VBA 355 Sub S h o w In s ta lle d F o n ts () Dim F o n t L is t As C om m andBarControl Dim TempBar As CommandBar Dim i As Long 1 Создание временной панели инструм ентов CommandBar Set TempBar = A p p l i c a t i o n . CommandBars.Add Set F o n t L is t = Tem pBar. C o n tr o ls .A d d ( I D :=172 8) 1 Помещение шрифтов в столбец А Range( " А : А " ) . C le a rC o n te n ts For i = 0 То F o n t L i s t . L is tC o u n t - 1 C e lls ( i + 1, 1) = F o n t L i s t . L i s t ( i + 1) Next i ' Удаление временной панели инструм ентов CommandBar TempBar. D e le te End Sub Дополнительно можно отобразить название каждого шрифта одновременно с его начертанием (рис. 11.15). Для этого в состав цикла F o r-N e x t добавьте следующий оператор: C e l l s ( i + 1 , 1 ) . Font.N am e = F o n t L i s t . L i s t ( i + 1 ) Будьте осторожны, поскольку использование большого количества шрифтов в рабочей книге поглотит ресурсы вашей системы и сможет даже вызвать ее крах. А В C 1 D E G H 1 385 Century Schoolbook 386 Chaparral Pro 387 C H A R L E M A G N E STD I 388 G|Mbr 389 C olonna MT 390 Comic Sans MS 391 Е и рР ! 392 C onsolas 393 Constantia 394 C w p w B lac k 395 C ooper S t d B la c k 396 C o pperpla te G o t h ic B o l d 397 C o p p e r p l a t e G o t h i c L ig h t 398 Corbel 399 C o u r ie r 400 C o u r ie r New 401 Curb: K f 402 btSb СЛОИЛ 403 ГССЕПТЖШ) 404 405 E le p h a n t 406 E N G R A V E R S M T 407 Eptil Obt 408 Eras B old ГГС 409 Eras Demi ГГС 410 Eras Light ГГС 411 Eras Medium ITC Рис. 11.15. Отображение названий и начертаний шрифтов ..........T" Часть III. Visual Basic for Applications 356 Компакт-диск Описанную выше процедуру можно найти на прилагаемом к книге компактдиске в файле l i s t fo n t s .x ls m . Сортировка массива Несмотря на то что в Excel существует встроенная команда сортировки ячеек, в VBA метод сортировки массивов не представлен. Один возможный, но достаточно неудобный способ решения этой задачи — перенести массив в диапазон ячеек на рабочем листе, от­ сортировать данные с помощью команд Excel и занести результат обратно в массив. Од­ нако если в вашей программе имеет большое значение скорость выполнения операции, то лучше написать на VBA процедуру сортировки. В данном разделе рассматривается несколько методов сортировки. • Сортировка на рабочем листе. Массив переносится на рабочий лист Excel; диапа­ зон на рабочем листе сортируется и переносится обратно в массив. Единственным аргументом этой процедуры является массив. • Пузырьковый метод. Довольно простой прием сортировки (он использовался в примере сортировки листов в главе 9). Его несложно запрограммировать, однако такой алгоритм сортировки не самый эффективный, особенно для большого коли­ чества элементов в массиве. • Быстрая сортировка. Намного более быстрая процедура, чем пузырьковый алго­ ритм, но, чтобы в ней разобраться, потребуется время. Работает исключительно с типами данных I n t e g e r и L o n g . • Метод пересчета. Работает очень быстро, однако для его улучшения также по­ требуются время и определенные усилия. Как и быстрая сортировка, работает с типами данных I n t e g e r и L o n g . Компакт-диск На прилагаемом компакт-диске находится рабочая книга ( s o r t in g demo. xlsm), демонстрирую щ ая описанные выше методы сортировки. Эту рабочую книгу можно протестировать на м ассивах разных размеров. На рис. 11.16 показано диалоговое окно для это­ го проекта. Результаты тестирования получены для Готово. семи массивов разных размеров (от 100 до 100 ты­ Выберите метод сортировки сяч элементов); элементами массивов выступали F? Сортировка на листе 00,50 сек. произвольные числа (типа L o n g ). R Пузырьк. сортировка *3/20 сек, В табл. 11.1 представлены результаты теста, вы­ W Быстрая сортировка 00,05 сек. полненного на компьютере редактора книги. Выра­ Р Метод пересчета 00,05 сяк. жение “0,00” означает, что сортировка произошла за Кол-во элементов: | ю<Ю0 время менее 0,01 секунды. Закрыть Алгоритм сортировки на рабочем листе порази­ Пуск тельно быстрый, принимая во внимание то, что мас­ Рис. 11.16. Сравнение времени, не­ сив переносится на лист, сортируется и затем ре­ обходимого для сортировки массивов зультаты сортировки переносятся обратно в массив. Д е м о н ст р а ц и я со р ти р о в к и м ассивов Сравнение различных методов сортировки. разных размеров *I 357 Глава 11. Приемы и методы программирования на VBA Таблица 11.1. Время сортировки (в секундах) для четырех алгоритмов, полученное для массивов с разным количеством элементов Количество элементов вмассиве Сортировка на рабочем листе Пузырьковая сортировка VBA Быстрая сортировка VBA Сортировка методом пере­ счета VBA 100 500 1000 5000 10000 50000 100000 0,03 0,05 0,09 0,27 0,52 2,41 4,77 0,00 0,03 0,14 3,28 13,05 317,20 3204,30 0,00 0,00 0,02 0,03 0,06 0,31 0,70 0,03 0,03 0,03 0,03 0,05 0,11 0,19 Алгоритм пузырьковой сортировки относительно быстрый при работе с небольшими массивами, но его лучше не использовать с большими массивами (более 10 тысяч эле­ ментов). Алгоритмы быстрой сортировки и сортировки методом пересчета работают очень быстро, но ограничены типами данных I n t e g e r и Long. Обработка последовательности файлов Одной из главных причин использования макросов является многократное повторе­ ние определенной операции. Пример из этого раздела показывает, как выполнить макрос в нескольких разных файлах, сохраненных на диске. Этот пример, который призван по­ мочь вам написать собственную программу выполнения задачи, запрашивает у пользова­ теля сведения о файле и обрабатывает соответствующие запросу рабочие книги. В рас­ сматриваемом случае обработка предусматривает импорт файла и ввод ряда формул суммирования, описывающих данные в файле. Sub B a tch P ro ce ss () Dim F ile S p e c As S t r in g Dim i As I n t e g e r Dim F ileN am e As S t r in g Dim F i l e L i s t O As S t r i n g Dim F o u n d F ile s As I n t e g e r ' Определение п ути и сведений о файле F ile S p e c = T h is W o rk b o o k . P a th & " \ " & " t e x t ? ? . t x t " FileName = D ir ( F ile S p e c ) 1 Найден ли файл? I f FileN am e <> " " Then F o u n d F ile s = 1 ReDim P re s e rv e F i l e L i s t ( l To F o u n d F ile s ) F ile L is t ( F o u n d F ile s ) = F ileN am e Else MsgBox "He найдены требуемые файлы " & F ile S p e c E x it Sub End I f 1 Получить д р уги е имена файлов Do FileN am e = D i r I f F ileN am e = " " Then E x i t Do Часть III. Visual Basic for Applications 358 F o u n d F ile s = F o u n d F ile s + 1 ReDim P re s e rv e F i l e L i s t ( l To F o u n d F ile s ) F ile L is t ( F o u n d F ile s ) = F ileN am e & " * " Loop ' Просмотр и обработка файлов F o r i = 1 То F o u n d F ile s C a ll P r o c e s s F i l e s ( F i l e L i s t ( i ) ) N ext i End Sub Компакт-диск Файл рассмотренного выше примера b a tc h p r o c e s s in g .x ls m находится на прилагаемом к книге компакт-диске. Здесь же можно найти дополни­ тельные файлы t e x t O l . t x t , te x t0 2 . t x t и te x t0 3 . t x t . Если нужно импортировать другие текстовые файлы, процедуру придется немного изменить. Соответствующие заданному критерию файлы находятся в массиве F ou nd ­ F i l e s , а процедура использует для обработки файлов цикл F o r - N e x t . В цикле обра­ ботка выполняется процедурой P r o c e s s F i le s , показанной ниже. Эта простая проце­ дура использует метод O p e n T e x t для импорта файла и вставки в него пяти формул. Ко­ нечно, вы можете заменить такую процедуру собственной, соответствующей более конкретной задаче. Sub P r o c e s s F ile s (F ile N a m e As S t r in g ) ' Импорт файла W o rkb o o ks. O penText F ile N a m e : = F ile N a m e , _ O r i g i n : = x lW in d o w s , _ S ta r tR o w := l, _ D a ta T y p e : = x lF ix e d W id th / _ F ie ld In fo := _ A r r a y ( A r r a y (0, 1 ) , A r r a y (3, 1 ) , A r r a y (12, 1 )) ' Ввод формул суммирования R a n g e ( " D l" ) .V a lu e = "A " R a n g e ("D 2 " ).V a lu e = "B " R a n g e ("D 3 " ).V a lu e = "C" R ange( " E l:E 3 " ) .F o r m u la = "=COUNTIF(В : B , D l ) " R ange( " F I:F 3 " ) .F o r m u la = "=SU M IF(В : B , D l #С: С ) " End Sub © Перекрестная ссылка Дополнительные сведения о работе с файлами с помощью VBA можно найти в главе 27. Полезные функции для программ VBA В данном разделе представлены некоторые “практичные” функции, которые будут использоваться в ваших приложениях либо помогут в создании аналогичных функций. Эти функции наиболее полезны, когда вызываются из другой процедуры V B A . Следова­ тельно, они объявляются с ключевым словом P r i v a t e и не отображаются в диалоговом окне Excel М а сте р ф ункций (Insert Function). Глава 11. Приемы и методы программирования на VBA 359 Компакт-диск Примеры, описанные в этом разделе, можно найти на прилагаемом к книге компакт-диске в файле VBA u t i l i t y f u n c t io n s .x ls m . Функция FileExists Данная функция получает один аргумент (путь и имя файла) и возвращает ИСТИНА, если файл существует. P riv a te F u n c tio n F ile E x is ts ( fn a m e ) ' В озвращ ает ИСТИНА, F ile E x is t s End F u n c tio n As B o o le a n е с л и файл с у щ е с т в у е т = (D ir(fn a m e ) <> " " ) Функция FileNameOnly Функция получает один аргумент (путь и имя файла) и возвращает только имя файла. Другими словами, функция “обрезает” путь. P riva te F u n c tio n F ile N am eO nly(pn am e) As S t r in g ' Возвращ ает имя файла и з с т р о к и п у т ь /и м я файла Dim temp As V a r ia n t le n g th = Len(pname) temp = S p lit( p n a m e , A p p l i c a t i o n . P a th S e p a ra to r) F ileN am eO nly = te m p (U B o u n d (te m p )) End F u n c tio n Функция использует функцию VBA S p l i t , которая принимает строку (вместе с символами-разделителями) и возвращает массив типа v a r i a n t , содержащий элементы, которые находятся между символами-разделителями. В рассматриваемом случае переменной tem p присваивается массив, содержащий текстовые строки между A p p l i c a t i o n .P a t h S e p a ra te r (обычно в качестве разделителя используется обратная косая черта). Дополни­ тельные примеры использования функции S p l i t будут рассмотрены далее. Если в качестве аргумента указать с : \ e x c e l f i le s \2 0 1 0 \b a c k u p \b u d g e t .x ls x , функция возвратит строку b u d g e t . x l s x . Функция F ileN am eO n ly обрабатывает любой путь и имя файла (даже если файла не существует). Если файл существует, лучше воспользоваться следующей более простой функцией. P rivate F u n c tio n F ile N am eO nly2(p na m e ) As S t r in g FileN am eO nly2 = D ir(p n a m e ) End F u n c tio n Функция PathExists Функция получает один аргумент (путь) и возвращает ИСТИНА, если путь существует. P rivate F u n c tio n P a th E x is ts (p n a m e ) As B o o le a n ' Возвращает ИСТИНА, ес л и п у ть сущ ествует I f D ir(p n a m e , v b D ir e c to r y ) = " " Then P a th E x is ts = F a ls e Else P a th E x is ts = (G e tA ttr(p n a m e ) And v b D ir e c to r y ) End I f End F u n c tio n = v b D ir e c t o r y Часть III. Visual Basic for Applications 360 Функция RangeNameExists Функция получает один аргумент (название диапазона) и возвращает ИСТИНА, если в активной рабочей книге существует указанное название диапазона. P r iv a t e F u n c tio n R angeN am eE xists(nnam e) As B o o le a n ' В о зв р а щ а ет ИСТИНА, е с л и имя д и а п а з о н а сущ ествует Dim n As Name R angeN am eE xists = F a ls e F o r Each n I n A ctive W o rkb o o k.N a m e s I f UCase(n.Name) = UCase(nname) Then R angeN am eExists = T ru e E x i t F u n c tio n End I f N ext n End F u n c tio n Ниже представлен еще один вариант этой функции. Она создает объектную перемен­ ную, использующую имя. Если имени не существует, генерируется ошибка. P r iv a t e F u n c tio n R angeN am eE xists2(nnam e) As B o o le a n ' В о зв р а щ а ет ИСТИНА, е с л и имя д и а п а з о н а с у щ е с т в у е т Dim n As Range On E r r o r Resume N e xt S e t n = Range(nname) I f E rr.N u m b e r = 0 Then R angeN am eExists2 = T ru e _ E ls e R angeN am eE xists2 = F a ls e End F u n c tio n Функция SheetExists Функция получает один аргумент (название рабочего листа) и возвращает ИСТИНА, если данный рабочий лист существует в активной рабочей книге. P r iv a t e F u n c tio n S h e e tE x is ts (s n a m e ) As B o o le a n ' 1 В о зв р а щ а ет ИСТИНА, рабочей кн и ге если рабочий л и ст су щ еств ует в акти в н о й Dim х As O b je c t On E r r o r Resume N e xt S e t x = A c tiv e W o rk b o o k . S hee ts(sna m e) I f E rr.N u m b e r = 0 Then S h e e tE x is ts = T ru e _ E ls e S h e e tE x is ts = F a ls e End F u n c tio n Функция WorkbooklsOpen Функция получает один аргумент (название рабочей книги) и возвращает ИСТИНА, если данная рабочая книга открыта. P r iv a t e F u n c tio n W orkbooklsO pen(w bnam e) As B o o le a n ' В о зв р а щ а ет ИСТИНА, если р абочая к н и г а о ткр ы та Dim х As W orkbook On E r r o r Resume N e xt S e t x = W orkbooks(wbnam e) I f E rr.N u m b e r = 0 Then W orkbooklsO pen = T ru e _ E ls e W orkbooklsO pen = F a ls e End F u n c tio n Глава 11. Приемы и методы программирования на VBA 361 Проверка принадлежности к коллекции Следующая функция представляет собой образец “групповой” функции, с помощью которой можно определить, является ли объект членом коллекции. P riv a te F u n c tio n I s I n C o l l e c t io n ( C o i n As O b je c t, _ Ite m As S t r in g ) As B o o le a n Dim Obj As O b je c t On E r r o r Resume N e xt Set Obj = C o in (Ite m ) I s I n C o l l e c t io n = N o t Obj I s N o th in g End F u n c tio n Эта функция имеет два аргумента: коллекцию (объект) и элемент (строка), который может быть либо не быть членом коллекции. Функция будет создавать объектную пере­ менную, представляющую элемент коллекции. Если попытка увенчается успехом, функция возвратит T ru e ; иначе — F a ls e . Функцию I s I n C o l l e c t i o n можно использовать вместо трех других функций, пере­ численных в этой главе: R angeN am eExists, S h e e tE x is ts и W orkbooklsO pen. Чтобы определить, содержится ли в активной рабочей книге диапазон D ata, вызовите функ­ цию I s I n C o l l e c t io n с помощью следующ его оператора: MsgBox Is In C o lle c tio n ( A c tiv e W o r k b o o k .N a m e s , "D a ta ") Для того чтобы определить, открыта ли рабочая книга с названием B udget, исполь­ зуйте следующий оператор: MsgBox Is In C o lle c t io n ( W o r k b o o k s , " b u d g e t. x l s x " ) Чтобы узнать, содержит ли активная рабочая книга рабочий лист Лист1, используйте следующий оператор: MsgBox Is I n C o lle c t io n ( A c t iv e W o r k b o o k . W o rk s h e e ts , "Л и с т 1 ") Получение значения из закрытой рабочей книги В VBA не существует метода получения значения из закрытого файла рабочей книги. Однако вы можете воспользоваться возможностью управления ссылками на файлы, ко­ торая предоставляется в Excel. В настоящем разделе описана функция VBA (G etV alu e, показанная ниже), которая получает значение из закрытой книги. Эта задача выполняет­ ся в результате вызова макроса XLM, который появился в “доисторических” версиях Excel (до версии 5), но поддерживается до сих пор. P rivate F u n c tio n G e tV a lu e (p a th , f i l e , s h e e t, r e f ) 1 Выборка значения из закры той рабочей кн и ги Dim a rg As S t r i n g 1 Проверка сущ ествования файла I f R ig h t( p a th , 1) <> " \ " Then p a th = p a th & " \ " I f D ir ( p a t h & f i l e ) = " " Then G e tV a lue = "Файл не найден " E x it F u n c tio n End I f 1 Создание а ргум ента arg = & p a th & " [" & f i l e & "] " & s h e e t & " 1 ! " R a n g e ( re f) . R ange( " A l " ) .A d d re s s (, , x lR lC l) 1 Выполнение макроса XLM GetValue = E x e c u te E x c e l4 M a c ro (a rg ) End F u n c tio n & Часть III. Visual Basic for Applications 362 Функция G et V a lu e принимает четыре аргумента: • p a t h — путь к закрытому файлу (например, " d : \ f i l e s " ) ; • f i l e — название рабочей книги (например, " b u d g e t .x l s " ) ; • s h e e t — название рабочего листа (например, " Л и ст1 "); • r e f — ссылка на ячейку (например, " С4п). Следующая процедура демонстрирует, как используется функция G e tV a lu e. В этой процедуре отображается значение ячейки А1 листа Лист1 файла 2 010B udget .x l s x (папка X L F ile s \B u d g e t на диске С:). Sub T e s tG e tV a lu e () Dim р As S t r i n g , f As S t r in g Dim s As S t r i n g , a As S t r in g p = " c : \ X L F ile s \ B u d g e t " f = " 2 0 1 0 b u d g e t.x ls x " s = "JIh c tI" a = " A l" MsgBox G e tV a lu e (p , f , s, a) End Sub Ниже приведен еще один пример. Эта процедура считывает 1200 значений (100 строк и 12 столбцов) из закрытого файла и помещает эти значения на активный рабочий лист. Sub T e s tG e tV a lu e 2 () Dim р As S t r i n g , f As S t r in g Dim s As S t r i n g , a As S t r in g Dim r As Long, с As Long p = " c : \ X L F ile s \ B u d g e t " f = "2 0 1 0 B u d g e t.x ls x " s = "Л и ст1 " A p p l i c a t i o n . S c re e n U p d a tin g = F a ls e F o r r = 1 To 100 F o r с = 1 To 12 a = C e l l s ( r , c ) .A d d r e s s C e l l s ( r , c) = G e tV a lu e (p , f , s , a) N ext с N e xt r End Sub (3 ) Примечание Функция G e tV a lu e не работает, если ее использовать в формуле рабочего листа. Эту функцию вообще не следует использовать, поскольку для получе­ ния значения из закрытого файла можно просто создать формулу со ссылкой. Компакт-диск Описанный в этом разделе пример можно найти на прилагаемом к книге компакт-диске в файле v a lu e fro m a c lo s e d w orkb o o k .x ls m . При рабо­ те с закрытым файлом в примере используется файл m yw o rkbo ok. x ls x . Полезные функции в формулах Excel Примеры, приведенные в этом разделе, представляют пользовательские функции, ко­ торые можно применять в формулах рабочего листа. Помните, что эти процедуры функ­ ций необходимо определить в модуле VBA, а не в модуле кода соответствующей рабо­ чей книги Эта кн и га (ThisWorkbook), листа или пользовательской формы (UserForm). Глава 11. Приемы и методы программирования на VBA 363 Компакт-диск Примеры из этого раздела можно найти на прилагаемом к книге компактдиске в файле w o rk s h e e t f u n c t io n s . xlsm . Получение информации о форматировании ячейки В данном разделе содержится ряд пользовательских функций, возвращающих ин­ формацию о форматировании ячейки. Такие функции используются при сортировке дан­ ных на основе форматирования (например, в случае, когда ячейки, выделенные полу­ жирным шрифтом, должны располагаться рядом). © Предупреждение Вскоре вы сможете убедиться в том, что эти специальные функции не всегда обновляются автоматически — изменение форматирования не приводит к пересчету формул Excel. Чтобы вызвать глобальный пересчет формул (и обновить все пользовательские функции), нажмите клавиши <Ctrl+Alt+F9>. В функцию можно также добавить следующий оператор: A p p lic a tio n .V o la tile При наличии этого оператора пересчет функции производится после нажатия клавиши <F9>. Следующая функция возвращает ИСТИНА, если аргумент, состоящий из одной ячей­ ки, выделен полужирным шрифтом. Если диапазон передается в качестве аргумента, функция использует его верхнюю левую ячейку. Function I s B o l d ( c e l l ) As B o o le a n 1 Возвращает ИСТИНА, е с л и я ч е й к а вы делена полужирным IsB o ld = c e ll. R a n g e ( " A l " ) . F o n t.B o ld End F u n c tio n Помните о том, что эти функции работают только с явно заданным форматированием (не могут применяться с условным форматированием). В Excel 2010 появился новый объект под названием D i s p l a y F o rm a t. Он учитывает наличие условного форматиро­ вания. Ниже показан код функции I s B o l d , который может обрабатывать полужирный формат, являющийся результатом условного форматирования. Function I s B o l d ( c e ll ) As B o o le a n 1 Возвращает ИСТИНА даже в с л у ч а е у с л о в н о г о ф орматирования IsB o ld = c e ll. R a n g e ( " A l " ) . D is p la y F o r m a t. F o n t.B o ld End F u n c tio n Следующая функция возвращает ИСТИНА, если используемая в качестве аргумента одна ячейка выделена курсивом. Function I s l t a l i c ( c e l l ) 1 Возвращает ИСТИНА, As B o o le a n ес л и я ч е й к а вы делена ку р с и в о м I s l t a l i c = c e l l . R an ge ( " A l " ) . F o n t. I t a l i c End F u n c tio n Обе предыдущие функции возвращают ошибку, если ячейка имеет смешанное фор­ матирование (например, полужирным шрифтом отображены только отдельные симво­ лы). Функция, приведенная ниже, возвращает ИСТИНА только тогда, когда все символы вячейке выделены полужирным шрифтом. Function A llB o ld ( c e l l ) ' Возвращает ИСТИНА, As B o o le a n ес л и все символы в я ч е й к е 364 Часть III. Visual Basic for Applications ' выделены полужирным I f I s N u l l ( c e l l . F o n t. B o ld ) Then A l l B o l d = F a ls e E ls e A l l B o l d = c e l l . F o n t.B o ld End I f End F u n c tio n Функцию AllBold можно упростить. F u n c tio n A l l B o l d ( c e l l ) As B o o le a n 1 Возвращает ИСТИНА, если все символы в ячейке ' выделены полужирным A ll B o l d = N o t I s N u l l ( c e l l . F o n t. B o ld ) End F u n c tio n Функция Fill Color, представленная далее, возвращает целое число, соответст­ вующее индексу цвета фона ячейки (цвета заливки ячейки). Если ячейка не имеет залив­ ки, то функция возвращает значение 4142. Эта функция не может использоваться для определения цветов заливки таблиц (которые создаются с помощью команды Вставка^Таблицы^Таблица (Insert^Tables1^ Table)) или сводных таблиц. В подобных случаях воспользуйтесь объектом DisplayFormat, как описывалось ранее. F u n c tio n F i l l C o l o r ( c e l l ) As I n t e g e r ' Возвращает целое чи сл о , соответствующ ее ' ц в е ту ячейки F i l l C o l o r = c e ll. R a n g e ( " A l " ) . I n t e r i o r . C o lo r ln d e x End F u n c tio n Беседа с рабочим листом Функция Say I t применяет синтезатор речи Excel для “проговаривания” аргументов, в качестве которых используется текст или ссылка на ячейку. F u n c tio n S a y l t ( t x t ) A p p lic a tio n .S p e e c h .S p e a k S a y lt = t x t End F u n c tio n (tx t) Эта функция носит развлекательный характер, но может использоваться и в серьез­ ных целях. Например, ее можно включить в следующую формулу: = IF (SUM (А:А ) >25000, S a y lt ( "Цель д о с т и гн у т а " ) ) Если сумма значений в столбце А превышает 25000, вы услышите синтезированный голос, сообщающий о том, что цель достигнута. Метод Speak можно также включить в конец длинной процедуры — спустя некоторое время компьютер известит вас о том, что выполнение процедуры завершено. Отображение даты сохранения файла или вывода файла на печать Рабочая книга Excel содержит несколько встроенных свойств документа, к которым мож­ но получить доступ с помощью свойства Bui It inDocument Properties объекта Work­ book. Следующая функция возвращает дату и время последнего сохранения рабочей книги. F u n c tio n L a s tS a v e d O A p p lic a tio n .V o la tile L a s tS a v e d = T h is W o rk b o o k . Глава 11. Приемы и методы программирования на VBA 365 B u iItin D o c u m e n tP r o p e r tie s ( "Время п о с л е д н е го с о х р а н е н и я ") End F u n c tio n Значения даты и времени, возвращаемые этой функцией, совпадают со значениями даты и времени, которые отображаются в разделе Связанные даты (Related Dates) окна представления Backstage. Это окно отображается после выбора команды Файл1^ Сведения (File^Info). Обратите внимание, что на значения даты и времени оказывает влияние свойство A u to S a v e . Поэтому “время последнего сохранения” необязательно имеет отношение ко времени сохранения файла пользователем. Показанная ниже функция напоминает предыдущую, но возвращает дату и время по­ следнего вывода рабочей книги на печать или предварительного просмотра рабочей кни­ ги. Если рабочая книга никогда не печаталась и не просматривалась, функция возвраща­ етошибку #ЗНАЧ. F unction L a s t P r i n t e d () A p p lic a tio n .V o la tile L a s tP r in te d = T h is W o rk b o o k . _ B u ilt in D o c u m e n tP r o p e r tie s ( "Д а т а п о с л е д н е го вывода на п е ч а т ь " ) End F u n c tio n При использовании этих функций в формуле необходимо вызвать пересчет формул (клавиша <F9>), чтобы получить текущие значения данных свойств. Примечание Существуют еще несколько встроенных свойств, но Excel их не использует. Например, при попытке получить доступ к свойству Number o f B y te s , указывающему размер файла, будет генерироваться ошибка. Для получения списка встроенных свойств обратитесь к справочной системе. Приведенные выше функции l a s t S a v e и l a s t P r i n t e d предназначались для со­ хранения в той рабочей книге, в которой они используются. В отдельных случаях требу­ ется сохранить функцию в книге, отличной от той (например, p e r s o n a l . x l s b ) , в ко­ торой она используется, или в надстройке. Поскольку все функции ссылаются на книгу Эта книга (ThisWorkbook), то выполняться корректно они не будут. Следуйте приведен­ ным ниже инструкциям для создания универсальных функций. В данных процедурах ис­ пользуется метод A p p l i c a t i o n . C a l l e r , который возвращает объект Range. Этот объект указывает на ячейку, из которой вызывается функция. Оператор P a r e n t . P a r e n t возвра­ щает рабочую книгу (родитель родителя объекта R ange — объект W o rk b o o k ). Взаимоот­ ношения родительских и дочерних объектов детально рассмотрены далее. Function L a s tS a v e d 2 () A p p lic a tio n .V o la tile LastSaved2 = A p p l i c a t i o n . C a l l e r . P a r e n t. P a r e n t. _ B u ilt in D o c u m e n tP r o p e r tie s ( "Время п о с л е д н е го с о х р а н е н и я " ) End F u n c tio n Основы иерархии объектов Объектная модель Excel представляет собой определенную структуру: одни объекты содержатся в других объектах. На вершине этой иерархии находится объект A p p l i c a ­ tio n . Excel содержит другие объекты, в которые, в свою очередь, вложены более низко­ уровневые объекты и т.д. Следующая иерархия показывает, как в этой структуре пред­ ставлен объект R ange. 366 Часть III. Visual Basic for Applications Объект A p p l i c a t i o n Объект W orkbook Объект W o rkshe et Объект Range На языке объектно-ориентированного программирования родителем объекта Range (Диапазон) является объект Worksheet (Рабочий лист), в котором он содержится. Ро­ дителем объекта Worksheet является объект Workbook (Рабочая книга), содержащий этот рабочий лист, а родителем объекта Workbook выступает объект Application (приложение, т.е. Excel). Как можно применить эту информацию на практике? Проанализируем функцию VBA SheetName, показанную ниже. Данная функция получает один аргумент (диапазон) и возвращает имя рабочего листа, который содержит указанный диапазон. При этом ис­ пользуется свойство Parent объекта Range. Свойство Parent возвращает объект, а именно — объект, содержащий объект Range. F u n c tio n S h e e tN a m e (re f) As S t r i n g SheetName = r e f . P a rent.N am e End F u n c tio n Функция WorkbookName возвращает название рабочей книги для конкретной ячей­ ки. Обратите внимание, что эта функция использует свойство Parent дважды. Первое свойство Parent возвращает объект Worksheet, а второе свойство Parent возвраща­ ет объект Workbook. F u n c tio n W o rkb o o kN a m e (re f) As S t r in g WorkbookName = r e f . P a r e n t. P a r e n t. Name End F u n c tio n Функция AppName, показанная далее, переносит это упражнение на следующий ло­ гический уровень, обращаясь к свойству Parent трижды. Такая функция возвращает имя объекта Application для заданной ячейки. Указанная функция всегда будет воз­ вращать значение Microsoft Excel. F u n c tio n A p pN a m e (re f) As S t r in g AppName = r e f . P a r e n t. P a r e n t. P a r e n t. Name End F u n c tio n Подсчет количества ячеек между двумя значениями Функция CountBetween возвращает количество значений в диапазоне (первый ар­ гумент), которые попадают в область, заданную вторым и третьим аргументами. F u n c tio n C o u n tB e tw e e n (In R a n g e , n u m l, num2) ' Подсчитывает ко л и ч е ств о значений между W ith A p p lic a tio n .W o r k s h e e tF u n c tio n I f num l <= num2 Then C ountBetw een = . C o u n t I f ( In R a n g e , . C o u n t I f ( In R a n g e , "> " & num2) E ls e C ountB etw een = . C o u n t I f ( In R a n g e , . C o u n t I f ( In R a n g e , "> " & n u m l) End I f End W ith End F u n c tio n As Long num l и num2 "> = " & num l) - _ "> = " & num2) - _ Обратите внимание, что эта функция вызывает функцию Excel СЧЁТЕСЛИ (COUNTIF). По сути, функция CountBetween является “оболочкой”, которая может упростить формулы. Глава 11. Приемы и методы программирования на VBA 367 Примечание Обратите внимание, что функция с ч ётес л и появилась в Excel 2007. Поэтому приведенный выше код не будет работать с предыдущими версиями Excel. Ниже приведен пример формулы, использующей функцию C o u n tB e tw e e n . Форму­ ла возвращает количество ячеек в диапазоне А1:А100, которое больше или равно 10 именьше или равно 20. =CountBetween (A l : A l 0 0 ,10 , 2 0) Применяйте эту функцию VBА, чтобы не вводить следующую длинную формулу: «СЧЁТЕСЛИ (А 1:А 100, "> = 1 0 ") -СЧЁТЕСЛИ ( A l : А100 , "> 2 0 ") Определение последней непустой ячейки встолбце или в строке В этом разделе будут рассмотрены две полезные функции: L a s tln C o lu m n , которая возвращает содержимое последней непустой ячейки в столбце, и L a s tln R o w , которая возвращает содержимое последней непустой ячейки в строке. В качестве единственного аргумента эти функции используют диапазон. Причем в качестве диапазона может при­ меняться как весь столбец (функция L a s tln C o lu m n ) , так и вся строка (функция LastlnR ow ). Если же в качестве аргумента не используется вся строка либо весь стол­ бец, задействуется строка или столбец, в котором находится верхняя левая ячейка диапа­ зона. Например, следующая формула возвращает последнее значение в столбце В: =LastInColumn (В5) Следующая формула возвращает последнее значение в строке 7: =LastInRow (С7 : D9) Ниже представлен код функции L a s tln C o lu m n . Function L a s tln C o lu m n (rn g As Range) 1 Возвращает содержимое последней н е п усто й я чейки столбца Dim L a s tC e ll As Range A p p lic a tio n .V o la tile W ith r n g .P a r e n t W ith . C e l l s ( . Rows. C o u n t, rn g .C o lu m n ) I f N o t Is E m p ty ( . V a lu e ) Then L a s tln C o lu m n = .V a lu e E l s e l f Is E m p ty ( . E n d ( x lU p ) ) Then L a s tln C o lu m n = " " E ls e L a s tln C o lu m n = . E n d ( x lU p ) .V a lu e End I f End W ith End W ith End F u n c tio n Эта функция довольно сложная, поэтому ниже приведено несколько замечаний, кото­ рые помогут вам в ней разобраться. • Оператор A p p l i c a t i o n . V o l a t i l e вызывает выполнение функции всякий раз, когда пересчитываются формулы на рабочем листе. • Оператор Rows . C o u n t возвращает количество строк на рабочем листе. Исполь­ зуется именно он, а не жестко заданное значение, из соображений совместимости (новые версии Excel могут включать большее количество строк на рабочем листе). 368 Часть III. Visual Basic for Applications • Ссылка r n g . Column возвращает номер столбца левой верхней ячейки в аргумен­ те rn g . • Благодаря ссылке r n g . P a r e n t функция работает корректно, даже если аргумент r n g ссылается на другой лист или рабочую книгу. • Метод End (с аргументом xlU p) эквивалентен переходу к последней ячейке столбца и нажатию <End> и <Т>. • Функция IsE m p ty проверяет, пуста ли ячейка. Если ячейка пуста, функция воз­ вращает пустую строку. Без этого оператора пустой ячейке соответствовал бы ре­ зультат 0. Ниже представлен код функции L astln R o w . Она подобна функции L astlnC olum n. F u n c tio n L a s tln R o w (rn g As Range) 1 Возвращает содержимое последней н е п у с то й ячей ки в с тр о ке A p p lic a tio n .V o la tile W ith r n g . P a re n t W ith . C e lls ( r n g .R o w , . C olu m n s. C o u n t) I f N o t Is E m p ty ( .V a lu e ) Then L a s tln R o w = .V a lu e E l s e l f Is E m p ty ( . E n d ( x lT o L e f t ) ) Then L a s tln R o w = " " E ls e L a s tln R o w = . E n d ( x lT o L e f t ) .V a lu e End I f End W ith End W ith End F u n c tio n Соответствует ли строка шаблону Функция I s L ik e довольно проста (и очень полезна). Она возвращает значение ИС­ ТИНА, если строка соответствует заданному шаблону. Код функции I s L ik e показан далее. Она представляет собой “оболочку”, позво­ ляющую использовать в формулах мощный оператор VBA L ik e . F u n c tio n I s L i k e ( t e x t As S t r i n g , p a t t e r n As S t r in g ) As B o o le a n 1 Возвращает ИСТИНА, если первый оператор подобен второму I s L ik e = t e x t L ik e p a t t e r n End F u n c tio n Функция I s L ik e принимает два аргумента: • t e x t — текстовая строка или ссылка на ячейку, содержащую текстовую строку; • p a t t e r n — строка, содержащая групповые символы согласно следующему списку. Символ в шаблоне Соответствие в тексте •? ★ Любой отдельный символ Нуль и более символов Любая отдельная цифра (о - 9) Любой отдельный символ из перечня список_сим волов Любой отдельный символ, не принадлежащий перечню список_ # [ сп и со к_ си м в о л о в ] [ ! спи со к_ си м в о л о в ] символов Глава 11. Приемы и методы программирования на VBA 369 Представленная ниже формула возвращает ИСТИНА, так как * соответствует любому количеству символов. Она возвращает ИСТИНА, если первый аргумент — любой текст, начинающийся с д. = IsLike ( " g u i t a r " , "д * " ) Следующая формула возвращает ИСТИНА, так как ? соответствует любому отдельно­ му символу. Если бы первым аргументом функции был 11Unit 12", то функция возвра­ щала бы ЛОЖЬ. = IsLike ( " U n it 1" , " U n i t ? " ) Показанная далее формула возвращает ИСТИНА, так как первый аргумент является одним из символов списка во втором аргументе. = Is L ik e ( " а " , " [ a e i o u ] ") Следующая формула возвращает ИСТИНА, если ячейка А1 содержит один из симво­ лов: а, е, i, о, и, А, Е, I, О, U. При использовании функции ПРОПИСН (UPPER) в аргу­ менте функция становится нечувствительной к регистру. =IsLike (ПРОПИСН ( А 1 ) , ПРОПИСН( " [ a e i o u ] " ) ) Представленная далее формула возвращает ИСТИНА, если в ячейке А1 находится зна­ чение, начинающееся с 1 и состоящее ровно из трех цифр (т.е. любое целое число от 100 до 199). = Is L ik e ( A l/ "1 # # ") Возвращение из строки n-го элемента E x t r a c t E le m e n t — специальная функция рабочего листа (ее можно также вызвать из процедуры VB А), которая помогает извлечь элемент из текстовой строки. Например, если ячейка содержит следующий текст, вы можете использовать функцию E x t r a c tE le m e n t для извлечения любых подстрок между дефисами. 123-456-789-0133-8844 Представленная далее формула, например, возвращает 0133, т.е. четвертый элемент встроке. Дефис (-) используется в строке как разделитель. = E x tra c tE le m e n t("1 2 3 -4 5 6 -7 8 9 -0 1 3 3 -8 8 4 4 " ,4 , " - " ) Функция E x t r a c t E le m e n t принимает три аргумента: • t x t — текстовая строка, из которой извлекается подстрока (это может быть сим­ вольная строка или ссылка на ячейку); • п — целое число, представляющее номер извлекаемого элемента; • S e p a r a t o r — отдельный символ, используемый как разделитель. Примечание Если в качестве символа-разделителя задать пробел, то несколько пробе­ лов будут рассматриваться как один, что не всегда соответствует требова­ ниям. Если п превышает количество элементов в строке, функция возвра­ щает пустую строку. Ниже приводится код VBA для функции E x t r a c t E le m e n t. Function E x t r a c tE le m e n t ( T x t, n , S e p a ra to r) As S t r in g 1 Возвращает n -й элемент т е к с т о в о й с т р о ки , где 370 ' Часть III. Visual Basic for Applications элем енты р азд ел ен ы у ка за н н ы м с и м в о л о м -р а з д е л и те л е м Dim A llE le m e n ts As V a r ia n t A llE le m e n ts = S p l i t ( T x t , S e p a ra to r) E x tra c tE le m e n t = A llE le m e n t s ( n - 1) End F u n c tio n В этой процедуре используется VBA-функция S p l i t , возвращающая массив кон­ стант, из которого состоит текстовая строка. Массив начинается с нулевого элемента (а не с первого), поэтому текущий элемент имеет индекс n - 1. Преобразование чисел в текст Функция SPELLDOLLARS возвращает текст, в который преобразуется исходное чис­ ло (подобная операция часто выполняется для проверки и подтверждения указанной суммы в платежных документах). Например, следующая формула возвращает строку двадцать т р и и 4 5 /1 0 0 доллара: =SPELLDOLLARS(1 2 3 ,4 5 ) На рис. 11.17 показаны некоторые дополнительные примеры использования функции SPELLDOLLARS. Формулы, использующие эту функцию, находятся в столбце С. Напри­ мер, формула в столбце С1 имеет следующий вид: =SPELLDOLLARS(Al) Обратите внимание, что отрицательные числа заключаются в круглые скобки. 1 2 3 4 5 6 7 8 9 10 И 12 13 14 15 16 А 32 37,56 -32 -26,44 -4 1,87341 1,56 1 6,56 12,12 1000000 1000000000 | В < тридцать-два и 00/100 Dollars тридцать-семь и 56/100 Dollars (тридцать-два и 00/100 Dollars) (двадцать-шесть и 44/100 Dollars) (четыре и 00/100 Dollars) один и 87/100 Dollars один и 56/100 Dollars один и 00/100 Dollars шесть и 56/100 Dollars двенадцать и 12/100 Dollars один миллион и 00/100 Dollars один миллиард и 00/100 Dollars Рис. 11.17. Примеры использования функции s p e lld o lla r s Компакт-диск Функция s p e l l d o l l a r s слишком громоздкая, чтобы приводить здесь пол­ ностью ее код. Обратитесь к файлу w o rk s h e e t f u n c t io n . x ls m на прила­ гаемом к книге компакт-диске. Универсальная функция В этом примере рассматривается прием, позволяющий сделать так, чтобы одна функ­ ция рабочего листа работала как несколько функций. Например, ниже показан код VBA для специальной функции S t a t F u n c t io n . Эта функция имеет два аргумента: диапазон Глава 11. Приемы и методы программирования на VBA 371 (rng) и операция (ор). В зависимости от значения аргумента ор функция возвращает зна­ чение, вычисленное с помощью одной из следующих функций Excel: СРЗНАЧ (AVERAGE), СЧЁТ (COUNT), МАКС (МАХ), МЕДИАНА (MEDIAN), МИН (MIN), МОД (MODE), СТАНДОТКЛОН (STDEV), СУММ (SUM) или ДИСП (VAR). Например, можно использовать эту функцию на рабочем листе следующим образом: = S ta tF u n c tio n ( B l : В24 , А 2 4 ) Результат выполнения формулы зависит от содержимого ячейки А24, которое пред­ ставлено строкой: СРЗНАЧ (AVERAGE), СЧЁТ (COUNT), МАКС (МАХ) и т.д. Можете при­ менить этот прием в других типах функций. Function S t a t F u n c t io n ( r n g , op) S e le c t Case UCase(op) Case "СУММ" S t a tF u n c t io n = W o r k s h e e tF u n c tio n . Sum (rng) Case "СРЗНАЧ" S t a tF u n c t io n = W o rk s h e e tF u n c tio n .A v e ra g e (rn g ) Case "МЕДИАНА" S t a tF u n c t io n = W o rk s h e e tF u n c tio n . M e d ia n (rn g ) Case "МОД" S t a tF u n c t io n = W o rk s h e e tF u n c tio n . M od e(rn g ) Case "СЧЁТ" S t a tF u n c t io n = W o r k s h e e tF u n c tio n .C o u n t(rn g ) Case "MAKC" S t a tF u n c t io n = W o rk s h e e tF u n c tio n .M a x (rn g ) Case "МИН" S t a tF u n c t io n = W o rk s h e e tF u n c tio n .M in (r n g ) Case "ДИСП" S t a tF u n c t io n = W o rk s h e e tF u n c tio n . V a r (r n g ) Case "СТАНДОТКЛОН" S t a tF u n c t io n = W o rk s h e e tF u n c tio n . S tD e v (rn g ) Case E ls e S t a tF u n c t io n = C V E rr(x lE rrN A ) End S e le c t End F u n c tio n Функция SheetOf fset В Excel ограничена поддержка “трехмерных рабочих книг”. Например, чтобы со­ слаться на другой рабочий лист в книге, включите в формулу имя рабочего листа. Данная проблема будет оставаться незначительной до тех пор, пока вы не попытаетесь скопиро­ вать формулу из одного листа в другой. Скопированные формулы продолжают ссылаться на первоначальное имя рабочего листа, и ссылки на листы не изменяются, как это проис­ ходит в реальной трехмерной рабочей книге. Пример, рассмотренный в этом разделе, представляет функцию VBA S h e e tO f f s e t , которая обеспечивает установку относительных ссылок на рабочие листы. Например, можно сослаться на ячейку А1 предыдущего рабочего листа с помощью такой формулы: =SheetOf f s e t ( - 1 , A l ) Первый аргумент представляет лист и может быть положительным, отрицательным или нулевым. Второй аргумент должен быть ссылкой на одну ячейку. Можете скопиро­ вать эту формулу в другие листы, и в скопированных формулах будет использована от­ носительная ссылка. Ниже приведен код VBA функции S h e e tO f f s e t. 372 Часть III. Visual Basic for Applications F u n c tio n S h e e t O f f s e t ( O f f s e t As Long, O p tio n a l C e ll As V a r ia n t ) 1 Возвращение содержимого ячейки по ссылке на нее Dim W ksIndex As Long, WksNum As Long Dim wks As W o rkshe et A p p lic a tio n .V o la tile I f I s M is s in g ( C e ll) Then S e t C e ll = A p p l i c a t i o n . C a lle r WksNum = 1 F o r Each wks I n A p p l i c a t i o n . C a l l e r . P a r e n t. P a r e n t. W o rksh e e ts I f A p p l i c a t i o n . C a l l e r . P arent.N am e = wks.Name Then S h e e tO ffs e t = W orksheets(W ksNum + _ O f f s e t ) . R a n g e ( C e ll( 1 ) .A d d re s s ) E x i t F u n c tio n E ls e WksNum = WksNum + 1 End I f N e x t wks End F u n c tio n Возвращение максимального значения всех рабочих листов Если необходимо определить максимальное значение в ячейке В 1 в нескольких рабо­ чих листах, используется следующая формула: =МАКС(Лист1: Л и с т 4 ! В1) Эта формула возвращает максимальное значение ячейки В1 для листов Л ист1, Л и с т 4 и всех листов между ними. Что же произойдет, если добавить после листа Л и с т 4 новый лист ( Л и с т 5)? Формула не будет автоматически изменена, поэтому ее необходимо отредактировать, чтобы вклю­ чить ссылку на новый лист. =М АХ(Лист1: Л и стБ ! В1) Функция M a x A llS h e e ts, показанная ниже, получает аргумент (одна ячейка) и воз­ вращает максимальное значение в этой ячейке во всех рабочих листах данной книги. На­ пример, следующая формула возвращает максимальное значение в ячейке В1 для всех листов книги. = M a x A llS h e e ts (В1) При добавлении нового листа редактировать формулу необязательно. F u n c tio n M a x A llS h e e ts ( c e ll) Dim M axVal As D ou ble Dim A d d r As S t r in g Dim W ksht As O b je c t A p p lic a tio n .V o la tile A d d r = c e ll. R a n g e ( " A l " ) .A d d re s s M axVal = -9 .9 E + 3 0 7 F o r Each W ksht I n c e l l . P a r e n t. P a r e n t. W o rk s h e e ts I f W ksht.Name = c e l l . P arent.N am e And _ A d d r = A p p lic a t io n . C a lle r . A d d r e s s Then 1 избежание ц и кл и ч е ско й ссылки E ls e I f Is N u m e ric (W k s h t.R a n g e (A d d r)) Then I f W k s h t. R ange (A dd r) > M axVal Then _ M axVal = W k s h t. R a n g e (A d d r).V a lu e End I f Глава 11. Приемы и методы программирования на VBA 373 End I f Next Wksht I f MaxVal = -9 .9 E + 3 0 7 Then M axVal = 0 M axA llS h e ets = M axVal End F u n c tio n Оператор For Each использует для доступа к рабочей книге следующее выражение: c e ll. P a r e n t. P a r e n t. W o rksh e e ts “Родителем” ячейки является рабочий лист, “родителем” рабочего листа — рабочая книга. Следовательно, цикл For Each проходит по всем рабочим листам в книге. Пер­ вый оператор I f внутри цикла проверяет, содержит ли ячейка, которая проверяется в данный момент, функцию. Если содержит, то ячейка игнорируется во избежание цикли­ ческой ссылки. % Примечание Функцию можно легко изменить, чтобы приспособить ее к выполнению вычислений в нескольких рабочих листах — к определению минимального и среднего значений, а также суммы. Возвращение массива случайных целых чисел без повторов Функция Randomlntegers, представленная в этом разделе, возвращает массив це­ лых чисел без повторов. Она предназначена для применения в формуле массива в не­ скольких ячейках. {=RandomIntegers () } Данная формула введена в весь диапазон с помощью комбинации клавиш <Ctrl+Shift+Enter>. Она возвращает массив целых чисел без повторов, упорядоченных произвольным образом. Так как формулу содержат 50 ячеек, целые числа указываются в диапазоне от 1 до 50. Ниже представлен код функции Randomlntegers. Function R a n d o m ln te g e rs () Dim FuncRange As Range Dim V () As V a r ia n t , V a lA r r a y O As V a r ia n t Dim C e llC o u n t As D ou ble Dim i As I n t e g e r , j As I n t e g e r Dim r As I n t e g e r , с As I n t e g e r Dim Tempi As V a r ia n t , Temp2 As V a r ia n t Dim RCount As I n t e g e r , CCount As I n t e g e r ' Создание объекта Range Set FuncRange = A p p l i c a t i o n . C a lle r 1 Возвращение ошибки, если диапазон FuncRange слишком большой C e llC o u n t = FuncR ange. C ount I f C e llC o u n t > 1000 Then R an do m ln te ge rs = C V E rr(x lE rrN A ) E x it F u n c tio n End I f 1 Присваивание значений переменным RCount = FuncR ange. Rows. C ount CCount = FuncR ange. C olu m n s. C ount ReDim V (1 To R C ou nt, 1 To C C ount) 374 1 1 1 Часть III. Visual Basic for Applications ReDim V a l A r r a y ( l To 2, 1 To C e llC o u n t) Заполнение массива случайными номерами и последовательными целыми числами F o r i = 1 То C e llC o u n t V a lA r r a y (1, i ) = Rnd V a lA r r a y (2, i ) = i N ext i С ортировка массива S o r t V a lA r r a y по произвольным числам F o r i = 1 To C e llC o u n t F o r j = i + 1 To C e llC o u n t I f V a lA r r a y (1, i ) > V a lA r r a y (1, j ) Then Tempi = V a lA r r a y (1 , j ) Temp2 = V a lA r r a y (2, j ) V a lA r r a y (1, j ) = V a lA r r a y (1, i ) V a lA r r a y (2, j ) = V a lA r r a y (2, i ) V a lA r r a y (1, i ) = Tempi V a lA r r a y (2, i ) = Temp2 End I f N e xt j N ext i ' Занесение произвольны х значений в массив V i = О F o r г = 1 То R cou nt F o r с = 1 То C count i = i + 1 V ( r , с) = V a lA r r a y (2, i ) N ext с N e xt r R a n d o m ln te g e rs = V End F u n c tio n Расположение значений диапазона в произвольном порядке Функция R angeR andom ize, представленная ниже, получает в качестве аргумента диапазон и возвращает массив, содержащий этот диапазон с произвольно переставлен­ ными значениями. F u n c tio n R angeR andom ize(rng) Dim V () As V a r ia n t , V a lA r r a y () As V a r ia n t Dim C e llC o u n t As D ou ble Dim i As I n t e g e r , j As I n t e g e r Dim r As I n t e g e r , с As I n t e g e r Dim Tempi As V a r ia n t , Temp2 As V a r ia n t Dim RCount As I n t e g e r , CCount As I n t e g e r ' Возвращает ошибку, если диапазон слишком большой C e llC o u n t = rn g .C o u n t I f C e llC o u n t > 1000 Then RangeRandomize = C V E rr(x lE rrN A ) E x i t F u n c tio n End I f 1 Присваивание значений переменным RCount = r n g . Rows. C ount CCount = r n g . C o lu m n s. C ount ReDim V (1 To R C ount, 1 To CCount) Глава 11. Приемы и методы программирования на VBA 375 ReDim V a l A r r a y ( l То 2, 1 То C e llC o u n t) ' Заполнение массива произвольными числами 1 и значениями из диапазона For i = 1 То C e llC o u n t V a lA r r a y (1, i ) = Rnd V a lA r r a y (2, i ) = r n g ( i ) Next i ' Сортировка массива V a lA r r a y по произвольным числам For i = 1 To C e llC o u n t F or j = i + 1 To C e llC o u n t I f V a lA r r a y (1, i ) > V a lA r r a y (1, j ) Then Tempi = V a lA r r a y (1 , j ) Temp2 = V a lA r r a y (2 , j ) V a lA r r a y (1, j ) = V a lA r r a y (1, i) V a lA r r a y (2, j ) = V a lA r r a y (2, i) V a lA r r a y (1 , i ) = Tempi V a lA r r a y (2, i ) = Temp2 End I f N ext j Next i 1 Занесение произвольны х значений в массив V i = О For г = 1 То R co u n t For с = 1 То C cou nt i = i + 1 V ( r , с) = V a lA r r a y (2 , i) N ex t с Next r RangeRandomize = V End F u n c tio n Этот код подобен коду функции R a n d o m ln te g e rs . На рис. 11.18 показана эта функция в действии. В диапазон В2:В11 введена следующая формула массива: {= RangeRandomize (А2 :А11) } Эта формула возвращает содержимое диапазона А2:А11, но в случайном порядке. А 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 В Исходный порядок Случайный порядок Гиппопотам Жираф Hiyaiia г_____ Кенгуру Кошка Лемур Лисица Павиан Пекари Слон Собака Трубкозуб Жираф Павиан Пекари Кошка Кенгуру Трубкозуб Игуана Лемур Лисица Гиппопотам Собака Слон Рис. 11.18. Функция RangeRandomize возвращает содержимое диапазона в случайном порядке Часть III. Visual Basic for Applications 376 Вызов функций Windows API Одна из самых важных возможностей VBA — поддержка функций, которые хранятся в динамически подключаемых библиотеках (Dynamic Link Libraries — DLL). В примерах из настоящего раздела демонстрируются самые популярные функции Windows API. Примечание Для простоты изложения представленные в этом разделе объявления APIфункций могут корректно выполняться только в среде Excel 2010 (32- и 64-разрядная версии). Соответствующие примеры файлов, находящиеся на компакт-диске, совместимы с предыдущими версиями Excel. Определение связей с файлами В Windows многие типы файлов ассоциируются с конкретным приложением. Эта связь позволяет загрузить файл в соответствующее приложение (для этого дважды щелк­ ните мышью на файле). Функция G et Ехе c u t a b l e вызывает функцию Windows API с целью получить пол­ ный путь к приложению, связанному с указанным файлом. Например, в системе нахо­ дится ряд файлов с расширением . t x t ; вероятно, один такой файл с названием Re­ adme . t x t в данный момент расположен в папке Windows. Функцию G e tE x e c u ta b le можно применять для определения полного пути приложения (которое запускается после двойного щелчка на выбранном файле). Примечание Объявления функций Windows API должны находиться в верхней части моду­ ля VBA. P r iv a t e D e c la re P trS a fe F u n c tio n F in d E x e c u ta b le A L ib _ " s h e l l 3 2 . d l l " (B yV a l l p F i l e As S t r i n g , B yV al _ l p D i r e c t o r y As S t r i n g , B yV al Ip R e s u lt As S t r in g ) As Long F u n c tio n G e t E x e c u t a b le ( s t r F ile As S t r in g ) As S t r in g Dim s t r P a t h As S t r i n g Dim in t L e n As I n t e g e r s t r P a t h = S p a c e (255) in t L e n = F in d E x e c u t a b le A ( s t r F ile , " \ " , s tr P a th ) G e tE x e c u ta b le = T r im ( s t r P a th ) End F u n c tio n На рис. 11.19 показан результат вызова функции G e tE x e c u ta b le , в качестве аргу­ мента которой используется имя аудиофайла в формате MP3. Функция возвращает пол­ ный путь к приложению, которое связано с этим файлом. Рис. 11.19. Определение пути и имени для приложения, связанного с задан­ ным файлом 377 Глава 11. Приемы и методы программирования на VBA Компакт-диск Рассматриваемы й пример можно найти на прилагаемом к книге компактдиске в файле f i l e a s s o c ia t io n . x ls m . Определение буквы диска В VBA нет способа получения информации о дисковых накопителях. Но эта пробле­ ма легко решается с помощью трех API-функций, обеспечивающих получение всех не­ обходимых сведений. На рис. 11.20 представлен результат выполнения процедуры VBA, которая иденти­ фицирует все подключенные дисковые накопители, определяет их тип, а также указывает размер свободного и занятого пространства на диске. Показанная на рисунке система включает шесть дисков. Информация об о все к дисках, установленных в системе.... С г о л б е ц !Q Столбец^ С тол бец ) Диск Тип Общ ий об ъем И спользуемый об ъ ем Свободный об ъем А:\ Съем ны й диск С:\ Жесткий диск 80015491072 67 694 669 824 12 320821248 D:\ Жесткий диск 160031014912 149153 247232 10877767 680 Е:\ Привод компакт-дисков F:\ Привод компакт-дисков 6:\ Съемный диск 1029 750 784 1009893 376 L fic ri d Столбец* 19857408 О СтолбецБ Щ| ЛШ Рис. 11.20. С помощью функций Windows API можно получить всю информацию о дисках, установленных в системе Код используемых в примере функций Windows API довольно большой, поэтому он здесь не приводится. Заинтересованные читатели могут найти его на прилагаемом к кни­ ге компакт-диске. Компакт-диск Рассматриваемый в этом разделе пример находится на прилагаемом к кни­ ге компакт-диске в файле d r iv e i n f o r m a t i o n . xlsm . Определение параметров принтера по умолчанию В примере, приведенном в этом разделе, функция Windows API используется для по­ лучения информации об активном принтере. Данная информация содержится в одной текстовой строке. Программа анализирует эту строку и отображает информацию в более удобном для чтения формате. Часть III. Visual Basic for Applications 378 P r iv a t e D e c la re P trS a fe F u n c tio n G e t P r o f ile S t r in g A L ib _ " k e r n e l3 2 " (B yV al IpAppName As S t r i n g , B yV al lpKeyName As _ S t r i n g , B yV al lp D e f a u lt As S t r i n g , B yV al Ip R e tu r n e d S tr in g As _ S t r i n g , B yV al n S iz e As Long) As Long Sub D e f a u l t P r i n t e r l n f o () Dim s trL P T As S t r i n g * 255 Dim R e s u lt As S t r in g C a ll G e t P r o f ile S t r in g A _ ("W in d o w s", " D e v ic e " , s trL P T , 254) R e s u lt = A p p l i c a t i o n . T rim (s trL P T ) R e s u ltL e n g th = L e n (R e s u lt) Comma1 = I n S t r ( l , R e s u lt, 1) Comma2 = In S tr(C o m m a l + 1, R e s u lt, " , " , 1) ' П о л уче н и е им ени п р и н т е р а ' П о л уч е н и е д р а й в е р а P r in t e r = L e ft( R e s u lt, D r iv e r = M id ( R e s u lt, Commal - 1) Commal + 1, Comma2 - Commal - 1) 1 П о л уче н и е п о с л е д н е й ч а с т и с т р о к и у с т р о й с т в а ' С о зд ан и е сообщ ения Msg = " П р и н т е р :" & C h r(9 ) & P r i n t e r & C h r(1 3 ) Msg = Msg & " Д р а й в е р :" & C h r(9 ) & D r iv e r & C h r(1 3 ) Msg = Msg Sc " П о р т :" & C h r(9 ) & P o r t О то б р аж ен и е сообщ ения MsgBox Msg, v b ln f o r m a t io n , "Информация о п р и н т е р е по умолчанию " P o r t = R ig h t ( R e s u lt , R e s u ltL e n g th - Comma2) ' End Sub Примечание Свойство A c t iv e P r i n t e r объекта A p p l i c a t i o n возвращает название ак­ тивного принтера (и позволяет его изменить). Но не сущ ествует способа оп­ ределить используемый драйвер принтера или порт. Поэтому эта функция столь полезна. На рис. 11.21 показано окно сообщения, полученное после выполнения этой процедуры. Компакт-диск Этот пример можно найти на прилагаемом к книге компакт-диске в файле p r i n t e r i n f о . xlsm . Определение текущего видеорежима В данном примере функции Windows API используются для определения текущего видеорежима системы. Если в приложении необходимо отобразить определенный объем информации на одном экране, то, зная размер экрана, можно правильно задать масштаб текста. Кроме того, в коде определяется количество мониторов в системе. Если установ­ лено более одного монитора, процедура определяет размер виртуального экрана. D e c la re P trS a fe F u n c tio n G e tS y s te m M e tric s L ib _ "u s e r3 2 " (B yV al n ln d e x As Long) As Long P u b lic C onst SM_CMONITORS = 8 0 P u b lic C onst SM_CXSCREEN = 0 P u b lic C onst SM_CYSCREEN = 1 P u b lic C on st SM_CXVIRTUALSCREEN = 78 P u b lic C onst SM_CYVIRTUALSCREEN = 79 Sub D is p la y V id e o I n f o () Dim n u m M o n ito rs As Long Глава 11. Приемы и методы программирования на VBA 379 Dim v id W id th As Long, v id H e ig h t As Long Dim v i r t W i d t h As Long, v i r t H e i g h t As Long Dim Msg As S t r in g num Monitors = GetSystemMetrics(SM_CMONITORS) v id W id th = GetSystemMetrics(SM_CXSCREEN) v id H e ig h t = GetSystemMetrics(SM_CYSCREEN) v ir t W id t h = GetSystemMetrics(SM_CXVIRTUALSCREEN) v ir t H e ig h t = GetSystemMetrics(SM_CYVIRTUALSCREEN) I f n um M onitors > 1 Then Msg = n u m M o n ito rs & " м о н и то р а " & v b C rL f Msg = Msg & "В и ртуальны й э к р а н : " & v ir tW id th & " X " Msg = Msg & v i r t H e i g h t & v b C rL f & v b C rL f Msg = Msg & "Видеорежим о с н о в н о го м о н и т о р а : " Msg = Msg & v id W id th & " X " & v id H e ig h t Else Msg = Msg & "В идеорежим м о н и т о р а : " Msg = Msg & v id W id th & " X " & v id H e ig h t End I f MsgBox Msg End Sub На рис. 11.22 показано окно сообщения, отображаемое при выполнении процедуры на системе с одним монитором. Информация о п р и н т е р е по у м о л ч а н и ю Принтер: Adobe PDF Драйвер: wmspool Порт: Ne04: Рис. 11.21. Получение информации об активном принтере с помощью функции Windows API Видеорежим монитора: 1920 X 1080 Рис. 11.22. Использование функ­ ций Windows API для определения видеорежима монитора Компакт-диск Этот пример доступен на прилагаемом к книге компакт-диске в файле v id e o m ode.xlsm . Добавление звука в приложение Пример, рассматриваемый в этом разделе, расширяет возможности Excel по воспро­ изведению звука. Таким образом, ваши приложения получают возможность воспроизво­ дить звуковые файлы в форматах WAV и MIDI. Например, при отображении диалогово­ го окна можно воспроизвести небольшой звуковой клип. А можно и не воспроизводить. Как бы там ни было, если возникает необходимость воспроизвести в Excel файлы в фор­ мате WAV либо MIDI, изучите этот раздел — в нем содержится нужная информация. Компакт-диск Примеры из этого раздела можно найти на прилагаемом к книге компактдиске в файле s o u n d . xlsm . Воспроизведение WAV-файла В следующем примере показано объявление API-функции, а также представлена про­ стая процедура— проигрывается файл so u n d .w a v , который находится в той же папке, где и рабочая книга. Часть III. Visual Basic for Applications 380 P r iv a t e D e c la re F u n c tio n P la yS o un d L ib " w in m m .d ll" _ A l i a s "P layS o u nd A " (B yV al IpszName As S t r i n g , _ B yV al hM odule As Long, B yV al d w F lag s As Long) As Long C onst SND_SYNC = &H0 C onst SND_ASYNC = &H1 C onst SND_FILENAME = &H2 0000 Sub PiayW AV() WAVF i 1e = " s o u n d . w av" W AVFile = T h is W o rk b o o k .P a th & " \ " & W AVFile C a ll P la yS o u n d (W A V F ile , 0&, SND_ASYNC Or SND_FILENAME) End Sub В предыдущем примере WAV-файл воспроизводился в асинхронном режиме. Это означа­ ет, что выполнение кода продолжается во время воспроизведения звука. Чтобы прекратить выполнение кода во время проигрывания звука, воспользуйтесь следующим оператором: C a ll P la yS o u n d (W A V F ile , 0&, SND_SYNC Or SND_FILENAME) Воспроизведение MIDI-файла Если звуковой файл имеет формат MIDI, то необходимо применить вызов другой API-функции. MIDI-файлы воспроизводит процедура P la y M I D I . Выполнение процеду­ ры S to p M ID I останавливает проигрывание MIDI-файла. В данном примере применяет­ ся файл x f i l e s .m id. P r iv a t e D e c la re F u n c tio n m c iE x e c u te L ib "w in m m .d ll" _ (B yV a l IpstrC om m and As S t r in g ) As Long Sub P la y M ID I() M ID IF ile = " x f i l e s . m i d " M ID IF ile = T h is W o rk b o o k .P a th & " \ " m c iE x e c u te ( " p la y " & M ID IF ile ) End Sub & M ID IF ile Sub S to p M ID I() M ID IF ile = " x f i l e s . m i d " M ID IF ile = T h is W o rk b o o k .P a th & " \ " m c iE x e c u te ( " s to p " & M ID IF ile ) End Sub & M ID IF ile Воспроизведение звука с помощью функции рабочего листа Функция A larm , показанная ниже, предназначена для применения в формуле рабоче­ го листа. Она использует функцию Windows API для проигрывания звука, если ячейка соответствует определенному условию. D e c la re F u n c tio n P la yS o un d L ib "w in m m .d ll" _ A l i a s "P layS o u nd A " (B yV al IpszName As S t r i n g , _ B yV al hM odule As Long, B yV al d w F lag s As Long) As Long F u n c tio n A la r m ( C e ll, C o n d itio n ) Dim W AVFile As S t r in g C onst SND_ASYNC = &H1 C onst SND_FILENAME = &H20000 I f E v a lu a t e ( C e ll. V a lu e & C o n d itio n ) Then W AVFile = T h is W o rk b o o k .P a th & "\s o u n d .w a v " C a ll P la yS o u n d (W A V F ile , 0&, SND_ASYNC Or SND_FILENAME) A la rm = T ru e E ls e A la rm = F a ls e Глава 11. Приемы и методы программирования на VBA 381 End I f End F u n c tio n Функция A larm имеет два аргумента: ссылку на ячейку и “условие” (выраженное в виде строки). Например, следующая формула использует функцию A larm для проигры­ вания WAV-файла, если значение в ячейке В13 больше или равно 1000. =ALARM(B13, "> = 1 0 0 0 ") Функция использует функцию VBA E v a lu a te для определения, соответствует ли значение ячейки заданному критерию. Если условие выполнено (и звук воспроизведен), функция возвращает ИСТИНА, в противном случае она возвращает значение ЛОЖЬ. Компакт-диск Рассмотренны е в этом разделе примеры доступны на прилагаемом к книге компакт-диске в файле s o u n d . xlsm . © Перекрестная ссылка Более простой способ использовать звук в функции — воспользоваться описанной ранее функцией s a y lt . Чтение и запись параметров системного реестра Многие приложения Windows используют системный реестр для хранения парамет­ ров (о реестре речь шла в главе 4). Процедуры VBA могут считывать значения из реестра и записывать в него новые значения. Для этого необходимы следующие объявления функций Windows API. Private D e c la re P trS a fe F u n c tio n RegOpenKeyA L ib "AD VAPI32.D LL" _ (ByVal hKey As Long, B yV al sSubKey As S t r i n g , _ ByRef h k e y R e s u lt As Long) As Long Private D e c la re P trS a fe F u n c tio n R egC loseK ey L ib "ADVAPI32.DLL" _ (ByVal hKey As Long) As Long Private D e c la re P trS a fe F u n c tio n R egS etV alueE xA L ib "AD VAPI32.D LL" _ (ByVal hKey As Long, B yV al sValueName As S t r in g , _ ByVal dwR eserved As Long, B yV al dwType As Long, _ ByVal s V a lu e As S t r i n g , B yV al dw S ize As Long) As Long Private D e c la re P trS a fe F u n c tio n R egC reateKeyA L ib "AD VAPI32.D LL" _ (ByVal hKey As Long, B yV al sSubKey As S t r in g , _ ByRef h k e y R e s u lt As Long) As Long Private D e c la re P trS a fe F u n c tio n R egQ ueryValueExA L ib "ADVAPI32.DLL" _ (ByVal hKey As Long, B yV al sValueName As S t r in g , _ ByVal dwR eserved As Long, ByR ef lV a lu e T y p e As Long, _ ByVal s V a lu e As S t r i n g , ByR ef IR e s u ltL e n As Long) As Long Компакт-диск Мною разработаны две функции-“оболочки”, упрощающие управление рее­ стром: G e tR e g is tr y и W r ite R e g is tr y . Их можно найти на прилагаемом к книге компакт-диске в файле w indow s r e g i s t r y .x ls m . В этой рабочей книге также находится процедура, которая демонстрирует запись и чтение данных из системного реестра. Часть III. Visual Basic for Applications 382 Чтение данных реестра Функция G et R e g is t r y возвращает раздел из указанного места регистра. Она рас­ полагает тремя аргументами. • R oot Key. Строка, представляющая ветвь реестра, к которой обращается функция. Данная строка может принимать одно из следующих значений: • HKEY_CLASSES_ROOT; • HKEY_CURRENT_USER; • НКЕY_LOCAL_MACHINE; • HKEY_USERS; • HKEY_CURRENT_CONFIG; • HKEY_DYN_DATA. • P ath . Полный путь к разделу реестра, к которому обращается функция. • R egE n try. Название параметра, который должна получить функция. А теперь рассмотрим пример. Если необходимо найти графический файл, используе­ мый в качестве обоев рабочего стола, используйте функцию G e t R e g i s t r y следующим образом (обратите внимание, что аргументы не чувствительны к регистру). R ootK ey = " h k iy _ c u r r e n t _ u s e r " P a th = " C o n tr o l P a n e l\D e s k to p " R e g E n try = " W a llp a p e r" MsgBox G e tR e g is try (R o o tK e y , P a th , R e g E n tr y ) , _ v b ln f o r m a t io n , P a th & " \R e g E n try " После выполнения этой процедуры в окне сообщения отображаются путь и имя гра­ фического файла (либо пустая строка, если обои не используются). Запись данных в реестр Функция W r it e R e g i s t r y записывает значение в указанный раздел реестра. Если операция завершается успешно, функция возвращает ИСТИНА; в противном случае функция возвращает ЛОЖЬ. Функция W r i t e R e g i s t r y получает следующие аргументы (все они являются строками). • R ootK ey. Строка, представляющая ветвь реестра, к которой обращается функция. Эта строка может принимать одно из перечисленных ниже значений: • HKEY_CLASSES_ROOT; • HKEY_CURRENT_USER; • НКЕY_LOCAL_MACHINE; • HKEY_USERS; • HKEY_CURRENT_CONFIG; • HKEY_DYN_DATA. • P ath . Полный путь в реестре. Если пути не существует, он будет создан. • R eg E n try. Название раздела реестра, в который записывается значение. Если раздела не существует, он будет добавлен в реестр. • R egV al. Значение, которое записывается в реестр. Глава 11. Приемы и методы программирования на VBA 383 Ниже приведен пример, в котором записывается значение, представляющее время и дату запуска Excel. Эта информация сохраняется в разделе настроек Excel. Sub Workbook_Open () RootKey = " h k e y _ c u r r e n t _ u s e r " Path = " s o f t w a r e \ m i c r o s o f t \ o f f i c e \ 1 4 . 0 \ e x c e l\ L a s t S t a r t e d " R egEntry = "D a te T im e " RegVal = Now() I f W r ite R e g is tr y ( R o o tK e y , P a th , R e g E n try , R egVal) Then msg = R egVal & " сохранено в р е е с т р е ." E ls e msg = "произошла ошибка" End I f MsgBox msg End Sub Если вы сохраните эту процедуру в личной книге макросов, то указанный параметр будет в дальнейшем автоматически обновляться при каждом запуске Excel. Простой способ просмотра системного реестра Если вы решили воспользоваться системным реестром для хранения и выборки настроек приложений Excel, не стоит обращаться к функциям Windows API. Лучше воспользоваться функциями VBA G e tS e ttin g и S a v e S e ttin g . Эти две функции описаны в соответствующем разделе справочной системы, поэтому здесь они подробно не рассматриваются. Важно понимать, что они работают только со следующим разделом реестра: HKEY_CURRENT_USER\Software\VB and VBA Program S e t t in g s Другими словами, с помощью этих функций можно управлять данными только одной ветви реестра, в которой сохраняются базовые настройки Excel. Часть Пользовательские формы Вэтой части... Глава 12 Создание собственных диалоговых окон Глава 13 Работа с пользовательскими формами Глава 14 Примеры пользовательских форм Глава 15 Дополнительные приемы работы с пользовательскими формами 13 Зак. 3107 Глава Создание собственных диалоговых окон Вэтой главе... ♦ Перед созданием диалоговых окон... ♦ Использование окон ввода данных ♦ Функция VBA MsgBox ♦ Метод Excel G e tO p e n F ile n a m e ♦ ♦ ♦ ♦ Метод Excel G e tS a v e A sF ile n a m e Получение имени папки Отображение диалоговых окон Excel Отображение формы ввода данных В этой главе описываются методы создания пользовательских диалоговых окон, ко­ торые существенно расширяют стандартные возможности рабочих книг Excel. Перед созданием диалоговых окон... Диалоговые окна — это наиболее важный элемент пользовательского интерфейса в Windows. Они применяются практически в каждом приложении Windows, и большинст­ во пользователей неплохо представляет, как они работают. Разработчики Excel создают пользовательские диалоговые окна с помощью пользовательских форм (UserForm). Кро­ ме того, в VBА имеются средства, обеспечивающие создание типовых диалоговых окон. Перед тем как приступить к изучению тонкостей создания диалоговых окон на основе пользовательских форм, следует научиться использовать некоторые встроенные инстру­ менты Excel, предназначенные для вывода диалоговых окон. Часть IV. Пользовательские формы 388 Использование окон ввода данных Окно ввода данных — это простое диалоговое окно, которое позволяет пользователю ввести одно значение. Например, можно применить окно ввода данных, чтобы предоста­ вить пользователю возможность ввести текст, числа или даже диапазон значений. Для создания окна ввода предназначены две функции I n p u t Box: одна — в VBA, а вторая является методом объекта A p p l i c a t i o n . Функция inputBox в VBA Данная функция имеет следующий синтаксис: In p u tB o x (з а п р о с [, з а г о л о в о к ] [ , [, с п р а в к а , р а з д е л ] ) по _ ум о л ч а н и ю ] [ , xpos] [ , ypos] • Запрос. • З аголовок. • П о _ у м о л ч а н и ю . Задает значение, которое отображается в окне ввода по умолча­ нию (необязательный параметр). • x p o s , y p o s. Определяют координаты верхнего левого угла окна ввода на экране (необязательные параметры). С п р а в к а , р а з д е л . Указывают файл и раздел в справочной системе (необязатель­ ные параметры). • Указывает текст, отображаемый в окне ввода (обязательный параметр). Определяет заголовок окна ввода (необязательный параметр). Функция I n p u t Box запрашивает у пользователя одно значение. Она всегда возвра­ щает строку, поэтому результат нужно будет преобразовать в числовое значение. Текст, отображаемый в окне ввода, может достигать 1024 символов (длину допуска­ ется изменять в зависимости от ширины используемых символов). Кроме того, можно указать заголовок диалогового окна, значение по умолчанию и координаты окна ввода на экране. Также в данном коде указывается раздел справочной системы со всеми вспомо­ гательными сведениями. Если определить этот раздел, то в диалоговом окне будет ото­ бражена кнопка Справка. В следующем примере, показанном на рис. 12.1, используется функция VBA InputB o x , которая запрашивает у пользователя полное имя (имя и фамилию). Затем програм­ ма выделяет имя и отображает приветствие в окне сообщения. Sub GetName() Dim UserName As S t r i n g Dim F ir s tS p a c e As I n t e g e r Do U n t i l UserName <> 11" UserName = In p u tB o x ( "Укаж ите имя и фамилию: "П р е д ста в ь те сь , п о ж а л уй ста ") Loop F irs tS p a c e = In S tr(U s e rN a m e , " ") I f F ir s tS p a c e <> 0 Then UserName = L e ft(U s e rN a m e , F irs tS p a c e - 1) End I f MsgBox "П ривет " & UserName End Sub ", _ Обратите внимание: функция Input B o x вызывается в цикле Do Until. Это позво­ ляет убедиться в том, что данные введены в окно. Если пользователь щелкнет на кнопке Отмена (Cancel) или не введет текст, то переменная UserName будет содержать пустую Глава 12. Создание собственных диалоговых окон 389 строку, а окно ввода данных появится повторно. Далее в процедуре будет предпринята попытка получить имя пользователя путем поиска первого символа пробела (для этого применяется функция I n S tr ) . Таким образом, можно воспользоваться функцией L e f t для получения всех символов, расположенных слева от символа пробела. Если символ пробела не найден, то используется все введенное имя. Как отмечалось ранее, функция In p u tB o x всегда возвращает строку. Если строка, предоставленная в качестве результата выполнения функции In p u tB o x , выглядит как число, ее можно преобразовать с помощью функции VBA V al. В противном случае сле­ дует применить функцию In p u tB o x в Excel. На рис. 12.2 показан еще один пример функции VBA In p u tB o x . Пользователю предлагается ввести пропущенное слово. Этот пример также иллюстрирует применение именованных аргументов. Текст запроса выбирается из ячейки рабочего листа. Какое слово пропущено? -2] В основном люди сталкиваются с _ какой-либо возможности выбора. Их новые компьютеры поставляются с предустановленной операционной системой Windows 7. Кроме того, решение о переходе на Windows 7 могло принять руководство компании, поэтому знакомиться с Windows 7 придется всем сотрудникам, за исключением начальства, у которого, разумеется, и конпмотера-то нет. А может, вы просто сильно подвержены гипнотическому влиянию маркетологов Microsoft. Рис. 12.1. Перед вами — результат выпол­ нения функции VBA InputBox Cancel ------- Рис. 12.2. Использование функции VBA Input­ Box, отображающей длинный запрос Sub GetWord () Dim TheWord As S t r in g Dim p As S t r in g Dim t As S t r i n g p = R ange( " A l ") t = "Какое слово пропущено?" TheWord = In p u tB o x ( p r o m p t: =p, T i t l e : = t ) I f UCase(TheWord) = "WINDOWS 7" Then MsgBox "В е р н о ." E ls e MsgBox "Н е в е р н о ." End I f End Sub Компакт-диск Два примера, рассматриваемые в этом разделе, можно найти на прилагае­ мом к книге компакт-диске в файле VBA in p u t b o x . xlsm . Метод Excel i n putBox Метод Excel InputBox (по сравнению с функцией VBA InputBox) предоставляет три преимущества: • возможность задать тип возвращаемого значения; • возможность указать диапазон листа путем выделения с помощью мыши; • автоматическая проверка правильности введенных данных. Часть IV. Пользовательские формы 390 В данном случае метод InputBox имеет следующий синтаксис. In p u tB o x {з а п р о с , [, сверху] , [, [, з а г о л о в о к ] , [, по_ ум о лча ни ю ] , с п р а в к а , р а з д е л ] , [, тип] ) [, с л е в а ], Указывает текст, отображаемый в окне ввода (обязательный параметр). • Запрос. • З аголовок. • Р о _ у м о л ч а н и ю . Задает значение, которое отображается в окне ввода по умолча­ нию (необязательный параметр). • С л е в а , с в е р х у . Определяют координаты верхнего левого угла окна ввода на эк­ ране (необязательные параметры). • Определяет заголовок окна ввода (необязательный параметр). С правка, ра зд е л . Указывают файл и раздел в справочной системе (необязатель­ ные параметры). • Т ип. Указывает код типа данных, который будет возвращаться методом (необяза­ тельный параметр). Его возможные значения перечислены в табл. 12.1. Таблица 12.1. Коды типов данных, возвращаемые методом Excel In p u tB o x Код Значение 0 1 2 4 8 16 64 Формула Число Строка (текст) Логическое значение (истина и л и ложь) Ссылка на ячейку как объект диапазона Значение(например, #н/д) Массив значений Метод Excel InputBox достаточно гибок. Используя сумму приведенных выше значе­ ний, можно возвратить несколько типов данных. Например, для отображения окна ввода, которое принимает текстовый или числовой тип данных, установите код равным значению 3 (т.е. 1+2 или число+текст). Если в качестве кода типа данных применить значение 8, то пользователь сможет ввести в поле адрес ячейки или диапазона ячеек. Кроме того, пользо­ ватель имеет возможность указать диапазон на текущем рабочем листе. В процедуре EraseRange, которая приведена ниже, используется метод InputBox. Таким образом, пользователь может указать удаляемый диапазон (рис. 12.3). Адрес диа­ пазона вводится вручную, мышь необходима для выделения диапазона на листе. Метод InputBox с кодом 8 возвращает объект Range (обратите внимание на клю­ чевое слово Set). После этого выбранный диапазон очищается (с помощью метода Clear). По умолчанию в поле окна ввода отображается адрес текущей выделенной ячейки. Если в окне ввода щелкнуть на кнопке Отмена (Cancel), то оператор On Error завершит процедуру. Sub E ra se R a n g e () Dim U serRange As Range On E r r o r GoTo C a n ce le d S e t UserRange = A p p l i c a t i o n . In p u tB o x _ (P ro m p t: = "Удаляемый д и а п а з о н :", _ T i t l e : ="Удаление д и а п а з о н а ", _ D e f a u l t : = S e le c tio n .A d d r e s s , _ T y p e := 8 ) Глава 12. Создание собственных диалоговых окон 391 U serR ange. C le a r U serR ange. S e l e c t C a n c e le d : End Sub S i У Ш Ш 3 1 Visual Макросы ^ Basic Вставка 1 Разметка страни т - Д В .. 29 : 68 # Вставить ; .. 18 49 ss с= Импорт Пакеты расширения | | ! Экспорт & Область документа Обновить данные ХМ1 Изменение 5 1.....< * ' 1 1 р— у — Отмена 7 Н • 1 - 1 К .... 1 L г 5 17 42 75 19 41 42 12 87 53 58 76 25 99 95 33 34 29 62 91 41 39 73 22 12 14 21 28 43 55 8 7 .... 54 44 38 40 16 47 31 24 60 15 88 24 80 251 85 40 85 72 3 96 29 86 11 78 39 29 11 56 88 69 94 65 29 20 36 89 44 37 6 37 70 38 63 82 92 27 20 84 39 85 8 95 39 56 7 38 9 71 94 68 14 41 <sfcB 10 95 76 79 4 29 11 12 46 38 23 и . 58 20 83 77 76 13 60 22 9 6 13 14 94! 94 41 5 66 15 60 22 11 18 29 16 58 35 56 17 20 17 96 0 88 31 36 81 87 33 49 99 91 84 «7 18 91 74 69 27 89 19 81 79 57 8 19 20 39 68 88 54 4 14 22 78 ; g 1 -H *J JSFS9:SK$21 97 PUPv7 1 а Q Надстройки Свойства карты -М.мЗ Режим j Источник конструктора в ; 1Е D i 6 Разработчик Вид Элементы управления 3 4 Рецензировани. А } 65 1 .. С Данные |Э Я Надстройки F9 1 Формулы # Надстройки Надстройки СОМ •СОД А сэ В S3 inputbox method - Microsoft Excel *0 ' О Ч ? 1 Главная . %j\ ' 64 13 25 66 6 7S 76 ШШь 18 17 31 27 65 23 54 34 3 46 78 42 61 33 20 11 56 88 88 30 18 17 10 44 52 17 41 37 2 30 57 76 59 39 29 20 36 92 32 44 21 78 22 34 19 17 37 27 65 62 47 69 27 LI4 23 39 71 66 33 65 26! 28 14 60 85 86 6 24 97 85 19 85 90 30 75 43 22 81 71 18 U 25 1 27 17 45 51 36 ' Я 71 36 2 78 42 яг , К 4 ► 1И..Sbeetl Среднее; 46,94871795 Количество; 73 < ...... Сумма: 3662 г Ш 44 щ ш 28 И ШШ Рис. 12.3. Пример использования метода inputBox для определения диапазона /g \ Компакт-диск Этот пример можно найти на прилагаемом к книге компакт-диске в файле in p u tb o x m e th o d .x ls m . Еще одним преимуществом применения метода Excel I n p u t Box является автомати­ ческая проверка правильности введенных данных программой Excel. Если в примере EraseRange ввести данные, не представляющие диапазон адресов, то Excel отобразит специальное сообщение и позволит пользователю повторить ввод данных (рис. 12.4). Неверная ссылка или ссылка отсутствует. А Чтобы ввести ссылку с помощью мыши, щелкните строку ввода, а затем щелкните ячейку листа, или выделите диапазон. Рис. 12.4. Метод Excel inputBox автоматически проверяет вводимые данные 392 Часть IV. Пользовательские формы Функция VBA M sgB ox Функция VBA MsgBox предоставляет пользователю простой способ отображения со­ общения. Также она задает ответную реакцию пользователя на запрос (передает резуль­ тат щелчка на кнопке ОК или Отмена). Функция MsgBox применяется во многих при­ мерах книги в качестве средства отображения значений переменных. Ниже приведен синтаксис этой функции. M sgBox { з а п р о с [, кнопки] [ , з а г о л о в о к ] [, справка, р а зд е л ]) • Определяет текст, который будет отображаться в окне сообщения (обязательный параметр). • Содержит числовое выражение, которое определяет кнопки, отображае­ мые в окне сообщения (необязательный параметр). Возможные значения приво­ дятся в табл. 12.2. • З аголовок. Запрос. Кнопки. Содержит заголовок окна сообщения (необязательный параметр). С п р а в к а , р а з д е л . Указывают файл и раздел справочной системы (необязатель­ ные параметры). Окна сообщений несложно изменить. Как правило, для этого применяется параметр К н о п к и . (В табл. 12.2 приведены константы, которые можно использовать в качестве значений этого параметра.) С его помощью указываются отображаемые кнопки, отмеча­ ется необходимость использования значка и определяется кнопка по умолчанию. • Таблица 12.2. Константы, используемые для выбора кнопок в функции M sgbox Константа Значение Назначение vbOKOnly 0 Отображает только кнопку ОК vbOKCancel l Отображает кнопки ОК и Отмена v b A b o rtR e try Ig n o re 2 Отображает кнопки Прервать, Повтор и Пропустить vbYesNoCancel 3 Отображает кнопки Да, Нет и Отмена vbYesNo 4 Отображает кнопки Да и Нет vbRe t г у Cane e1 5 Отображает кнопки Повтор и Отмена v b C r itic a l 16 Отображает значок важного сообщения v b Q u e stio n 32 Отображает значок важного запроса v b E x c la m a tio n 48 Отображает значок предупреждающего сообщения v b ln fo r m a tio n 64 Отображает значок информационного сообщения v b D e fa u ltB u tto n l 0 По умолчанию выделена первая кнопка v b D e fa u ltB u tto n 2 256 По умолчанию выделена вторая кнопка v b D e fa u ltB u tto n 3 512 По умолчанию выделена третья кнопка vbDe f a u ltB u tto n 4 768 По умолчанию выделена четвертая кнопка vbSystemModal 4096 vbM sgBoxHelpButton 16384 Выполнение приложений приостанавливается до тех пор, пока пользователь не ответит на запрос в окне сообщения (работает не во всех случаях) Отображает кнопку справки. Имейте в виду, что не существует способа отобразить какой-либо раздел справки после щелчка на этой кнопке Глава 12. Создание собственных диалоговых окон 393 Можно использовать функцию M sgB ox в качестве процедуры (для отображения со­ общения), а также присвоить возвращаемое этой функцией значение переменной. Функ­ ция M sgBox возвращает результат, представляющий кнопку, на которой щелкнул поль­ зователь. В следующем примере отображается сообщение и не возвращается результат. Sub MsgBoxDemo() MsgBox "П ри вы по лне н ии м а кр о с а ош ибок не п р о и з о ш л о ." End Sub Чтобы получить результат из окна сообщения, присвойте возвращаемое функцией MsgBox значение переменной. В следующем коде используется ряд встроенных констант (табл. 12.3), которые упрощают управление возвращаемыми функцией MsgBox значениями. Sub GetAnswer () Dim Ans As I n t e g e r Ans = M sgBox( "П р о д о л ж а т ь ? " , vbYesNo) S e le ct Case Ans Case vbYes ' . . . [ к о д пр и Ans р а в н о Yes] Case vbNo 1 . . . [ к о д п р и Ans р а в н о No] End S e le c t End Sub Таблица 12.3. Константы, возвращаемые M sgbox Константа Значение Нажатая кнопка vbOK 1 OK vbCancel 2 vbAbort 3 Отмена Прервать vbRetry 4 Повтор vblgnore 5 Пропустить vbYes 6 vbNo 7 Да Нет Функция MsgBox возвращает переменную, имеющую тип Integer. Вам необяза­ тельно использовать переменную для хранения результата выполнения функции MsgBox. Следующая процедура представляет собой вариацию процедуры GetAnswer. Sub GetAnswer2 () I f MsgBox( "П р о д о л ж а т ь ? " , vbYesNo) ' . . . [к о д при Ans р а в н о Yes] Else ■ . . . [ко д при Ans р а в н о No] End I f End Sub = vbYes Then В следующем примере функции используется комбинация констант для отображения окна сообщения с кнопкой Да, кнопкой Нет и значком вопросительного знака. Вторая кнопка используется по умолчанию (рис. 12.5). Для простоты константы добавлены в пе­ ременную Conf ig. Private F u n c tio n C o n tin u e P ro c e d u re () As B o o le a n Dim C o n fig As In t e g e r Dim Ans As I n te g e r Config = vbYesNo + v b Q u e s tio n + v b D e fa u ltB u tto n 2 Часть IV. Пользовательские формы 394 Ans = MsgBox("Произошла ошибка. Продолжить?", Config) If Ans = vbYes Then ContinueProcedure = True _ Else ContinueProcedure = False End Function Функция C o n tin u e P r o c e d u r e может вызываться из другой процедуры. Например, приведенный далее оператор вызывает функцию C o n tin u e P r o c e d u r e (которая ото­ бражает окно сообщения). Если функция возвращает значение ЛОЖЬ (т.е. пользователь щелкнул на кнопке Нет), то процедура будет завершена. В противном случае выполняет­ ся следующий оператор: If Not ContinueProcedure() Then Exit Sub Если в сообщении необходимо указать разрыв строки, воспользуйтесь константой vbC rL f (или vbNew Line) в необходимом месте. Отобразим сообщение в три строки (рис. 12.6). шшшTЕ Н Ш х} ’1 Это первая строка, Произошла ошибка. Продолжить? Да || Вторая строка. Последняя строка. Мет j Рис. 12.5. Параметр Кнопки функции MsgBox определяет кнопки, которые отображаются в окне сообщения Рис. 12.6. Разбиение сообщения на несколько строк Sub MultiLineO Dim Msg As String Msg = "Это первая строка." & vbCrLf & vbCrLf Msg = Msg & "Вторая строка." & vbCrLf Msg = Msg & "Третья строка." MsgBox Msg End Sub Для включения в сообщение символа табуляции применяется константа vbTab. В приведенной далее процедуре окно сообщения используется для отображения диапазона значений размером 13x3 — ячейки А1:С13 (рис. 12.7). В этом случае столбцы разделены с помощью константы vbTab. Новые строки вставляются с помощью константы vbCrLf. Функция MsgBox принимает в качестве параметра строку, длина которой не превышает 1023 символов. Такая длина задает ограничение на количество ячеек, которое можно ото­ бразить в сообщении. Обратите внимание, что, поскольку символы табуляции фиксирова­ ны, столбцы не выравниваются в случае, если ячейка содержит более 11 символов. Sub ShowRange() Dim Msg As String Dim r As Integer, с As Integer Msg = "" For r = 1 To 12 For с = 1 To 3 Msg = Msg & Cells(r, c).Text If с <> 3 Then Msg = Msg & vbTab Next с Msg = Msg & vbCrLf Next r MsgBox Msg End Sub Глава 12. Создание собственных диалоговых окон 395 Рис. 12.7. Текст в этом окне сообщения содержит символы табуляции и разры­ ва строк © Перекрестная ссылка В главе 15 приводится пример пользовательской формы, которая имитиру­ ет работу функции MsgBox. Метод Excel G e tO p e n F ile n a m e Если приложению необходимо получить от пользователя имя файла, то можно вос­ пользоваться функцией I n p u t B o x , но этот подход часто приводит к возникновению ошибок. Более надежным считается использование метода G e tO p e n F ile n a m e объекта A p p lic a t io n , который позволяет удостовериться, что приложение получило коррект­ ное имя файла (а также его полный путь). Данный метод позволяет отобразить стандартное диалоговое окно Открытие доку­ мента, но при этом указанный файл не открывается. Вместо этого метод возвращает строку, которая содержит путь и имя файла, выбранные пользователем. По окончании данного процесса с именем файла можно делать все что угодно. Этот метод имеет следующий синтаксис (все параметры необязательные): Application.GetOpenFilename (фильтр_файла, индекс_фильтра, заголовок, подпись_кнопки, множеств енный_выбор) • Фильтр_файла. Содержит строку, определяющую критерий фильтрации файлов (необязательный параметр). • Индекс_фильтра. Указывает индексный номер того критерия фильтрации фай­ лов, который используется по умолчанию (необязательный параметр). • Заголовок. Содержит заголовок диалогового окна (необязательный параметр). Если этот параметр не указать, то будет использован заголовок Открытие документа. • Подпись_кнопки. Применяется только в компьютерах Macintosh. 396 Часть IV. Пользовательские формы • М нож ест венны й_вы бор. Необязательный параметр. Если он имеет значение ИСТИНА, можно выбрать несколько имен файлов. По умолчанию данный пара­ метр имеет значение ЛОЖЬ. Аргумент филь тр_ф айла определяет содержимое раскрывающегося списка Тип фай­ лов, находящегося в окне Открытие документа. Аргумент состоит из строки, определяющей отображаемое значение, а также строки действительной спецификации типа файлов, в кото­ рой находятся групповые символы. Оба элемента аргумента разделены запятыми. Если этот аргумент не указывать, то будет использовано значение, заданное по умолчанию. "Все файлы Обратите внимание на первую часть строки В се файлы ( * . * ) . Это текст, отобра­ жаемый в раскрывающемся списке тип файлов. Вторая часть строки * . * указывает тип отображаемых файлов. В следующих инструкциях переменной F i l t присваивается строковое значение. Эта строка впоследствии используется в качестве аргумента ф и льт р _ ф а й ла метода G e tO p e n F ile n a m e . В данном случае диалоговое окно предоставит пользователю воз­ можность выбрать один из четырех типов файлов (кроме варианта Все файлы). Если задать значение переменной F i l t , то будет использоваться оператор конкатенации строки VB А. Этот способ упрощает управление громоздкими и сложными аргументами. F i l t = "Т екстовы е файлы ( * . t x t ) "Файлы L o tu s ( * . p r n ) , * . p r n , " "Файлы, разделенные за п я то й "Файлы A S C II ( * . a s c ) , * . a s c , " "Все файлы ( * . * ) , * . * " , * . t x t ," & _ & _ (*.csv), * . csv," & _ & _ Аргумент и н д е к с _ ф и л ь т р а указывает значение аргумента ф ильт р _ ф а й ла , заданное по умолчанию. Аргумент з а г о л о в о к определяет текст, который отображается в заголовке окна. Если параметр м н о ж е с т в е н н ы й _ в ы б о р имеет значение ИСТИНА, то пользователь может выбрать в окне несколько файлов. Имя каждого файла заносится в массив. В следующем примере у пользователя запрашивается имя файла. При этом в поле ти­ па файлов используются пять фильтров. Sub G e tIm p o rtF ile N a m e () Dim F i l t As S t r i n g Dim F i l t e r l n d e x As I n t e g e r Dim T i t l e As S t r i n g Dim F ileN am e As V a r ia n t ' ' ' 1 Н астройка сп и ска фильтров F i l t = "Т екстовы е файлы ( * . t x t ) , * . t x t , " & _ "Файлы L o tu s ( * . p r n ) , * . p r n , " & _ "Файлы, разделенные за п я то й ( * . c s v ) , * . c s v , " & _ "Файлы A S C II ( * . a s c ) , * . a s c , " & _ "Все файлы ( * . * ) , * . * " По умолчанию и сп о л ь з у е т с я фильтр * . * F ilt e r ln d e x = 5 З а го л о в о к окна T i t l e = "Выберите импортируемый файл" Получение имени файла F ileN am e = A p p l i c a t i o n . G etO penF ilenam e _ ( F ile F ilte r := F ilt, _ F ilt e r ln d e x : = F ilte r In d e x , _ T it le : = T it le ) Глава 12. Создание собственных диалоговых окон 397 1 При отмене выйти из окна I f FileN am e = F a ls e Then MsgBox "Файл не вы б ра н." E x i t Sub End I f ' Отображение полного п ути и имени файла MsgBox "Выбран файл " & F ileN am e End Sub На рис. 12.8 показано диалоговое окно, которое выводится на экран после выполне­ ния этой процедуры и выбора фильтра “Файлы, разделенные запятой”. 1 А ! В I С О Е F 6 Н j 1 i -й JLj j j 41 5 1 б1 ~7~| 8| 1о1 111 121 JLJ Выбран файл D: >кЛ\Уокен6ах¥}ир 12_a.csv ... 1 « • 1 lij 14 15 1" | 16 17 18 19 Рис. 12.8. Метод GetOpenFilename отображает диалоговое окно, в кото­ ром выбирается файл Приведенный далее пример напоминает предыдущий. Разница заключается в том, что пользователь может, удерживая нажатыми клавиши <Shift> и <Ctrl>, выбрать в окне не­ сколько файлов. Обратите внимание, что событие использования кнопки Отмена опре­ деляется по наличию переменной массива F ileN am e. Если пользователь не щелкнул на кнопке Отмена, то результирующий массив будет состоять как минимум из одного эле­ мента. В этом примере список выбранных файлов отображается в окне сообщения. Sub G e tIm p o rtF ile N a m e 2 () Dim F i l t As S t r i n g Dim F i l t e r l n d e x As I n t e g e r Dim F ileN am e As V a r ia n t Dim T i t l e As S t r i n g Dim i As I n t e g e r Dim Msg As S t r i n g ' Настройка фильтров файлов F i l t = "Т екстовы е файлы ( * . t x t ) , * . t x t , " & _ "Файлы L o tu s ( * . p r n ) , * . p r n , " & _ "Файлы, разделенные запятыми ( * . c s v ) , * . c s v , " & _ "Файлы A S C II ( * . a s c ) , * . a s c , " & _ "Все файлы ( * . * ) , * . * " ' По умолчанию и с п о л ь з у е т с я фильтр * . * F i lt e r l n d e x = 5 Заголовок д и а л о го в о го окна T i t l e = "Выбор импортируем ого файла" ' 398 1 Часть IV. Пользовательские формы П олучение им ени файла F ileN am e = A p p l i c a t i o n . G etO penFilenam e ( F ile F ilte r := F ilt, _ F ilt e r ln d e x : = F ilte r In d e x , _ T i t l e : = T itle , _ M u l t i S e l e c t : =T rue) З а кр ы ти е о к н а пр и и с п о л ь з о в а н и и к н о п к и "О тм е на " I f N o t Is A rr a y ( F ile N a m e ) Then MsgBox "Файлы не в ы б р а н ы ." E x i t Sub End I f ' О тображ ение п о л н о го п у т и и им ени файла F o r i = L B o u n d(F ile N a m e) To U B ound(F ileN am e) Msg = Msg & F ile N a m e ( i) & v b C rL f N ext i MsgBox "Вы в ы б р а л и :" & v b C rL f & Msg End Sub Обратите внимание: переменная F ile N a m e определена как массив переменного типа (а не как строка в предыдущем примере). Причина заключается в том, что потенциально F ile N a m e может содержать массив значений, а не только одну строку. Компакт-диск Два рассмотренных в этом разделе примера доступны на прилагаемом к книге компакт-диске в файле p ro m p t f o r f i l e . x ls m . Метод Excel G e tS a v e A s F ile n a m e Данный метод имеет много общего с методом G e tO p e n F ile n a m e . Он отображает диалоговое окно Сохранение документа и дает пользователю возможность выбрать (или указать) имя сохраняемого файла. В результате возвращается имя файла, но никакие действия не предпринимаются. Этот метод имеет следующий синтаксис: A p p lic a tio n .G e tS a v e A s F ile n a m e {н а ч а л ь н о е _ и м я , фильтр_файла, и н декс_ф ил ьт р а , з а г о л о в о к , т е кст _ кн о п ки ) Ниже описаны аргументы метода. Указывает предполагаемое имя файла (необязательный параметр). • На ч а л ь н о е _ и м я . • Ф и л ь т р _ ф а й л а . Содержит критерий фильтрации отображаемых в окне файлов (необязательный параметр). • И н д е к с _ ф и л ь т р а . Код критерия фильтрации файлов, который используется по умолчанию (необязательный параметр). • З аголовок. Определяет текст заголовка диалогового окна (необязательный па­ раметр). • Т екст _кнопки. Предназначен только для платформ Macintosh. Глава 12. Создание собственных диалоговых окон 399 Получение имени папки Для того чтобы получить имя файла, проще всего воспользоваться описанным выше методом G etO penFileN am e. Но если нужно получить лишь имя папки (без названия файла), лучше воспользоваться методом объекта Excel F ile D ia lo g . Следующая процедура отображает диалоговое окно (рис. 12.9), в котором можно вы­ брать папку. Затем с помощью функции M sgB ox отображается имя выбранной папки (или сообщение Отменено). f/| Выберите файл для импорта 0 U ’ « Пользователи ► Алекс ► Упорядочить » Л FU_Backup 9 Microsoft O ffk & MSOffice95 2 MSC)ffice2003 MSOffice201Q I П о п а с Алекс Новая папка Ё/т Локальный диен ж Й ▼ [ Jg Program Files lH totakm d Имя Дата изменения i l l Tracing 24.092010 8:38 УрР Виртуальные машины 09J03 2010 21:21 Ш Загрузки 09.032010 22:14 Изображения Documents am 09.03201021:21 J |i Мои документы 10.09,2010 0:06 Моя музыка 16.03201019:13 yj§ БазаДанных Пользователи 09.03.2010 21:21 Л Мои видеозаписи Ц Work r-a Локальный ди о 09.032010 21:21 jftl Контакты Ш Windows •V Поиски 24.03.2010 22:26 Рабочий стол 10.03201012:36 Л Сохраненные игры 09.03.2010 21:21 JjP С сылки 09.032010 21:21 файла; Сервис ▼ Щ Выберите файл для дварительн п росм отра. (AMResCV) Открыть Рис. 12.9. Пример использования объекта F ile D ia lo g для выбора папки Sub G e t A F o l d e r () With A p p l i c a t i o n . F i l e D i a l o g ( m s o F i l e D i a l o g F o l d e r P i c k e r ) . I n i t i a l F i l e N a m e = A p p l i c a t i o n . D e f a u l t F i l e P a t h & " \" . T i t l e = " В ы бер и те м е с т о х р а н е н и я р е з е р в н о й копии" . Show I f . S e l e c t e d l t e m s . C o u n t = 0 T h en M sgBox "Отменено" E lse M sgBox . S e l e c t e d l t e m s (1) End I f End W ith End Sub Объект F i l e D i a l o g позволяет определить начальную папку путем указания значе­ ния свойства I n i t i a l F i l e N a m e . В рассматриваемом примере в качестве начальной папки применяется путь к файлам Excel, заданный по умолчанию. Отображение диалоговых окон Excel Создаваемый вами код VBA может вызывать на выполнение многие команды Excel, находящиеся на ленте. И если в результате выполнения команды открывается диалоговое Часть IV. Пользовательские формы 400 окно, ваш код может делать выбор в диалоговом окне (даже если само диалоговое окно не отображается). Например, следующая инструкция VBA эквивалентна выбору команды Глав­ ная1^ Редактирование^Найти и выделить1^ Перейти (Home^Editing^Find & Select^ Go То) и указанию диапазона ячеек А1:СЗ с последующим щелчком на кнопке ОК. Но само диалоговое окно Переход (Go То) при этом не отображается (именно это и нужно). A p p lic a t io n . G o t o R e fe r e n c e : = R a n g e ("A 1 :C 3 ") Иногда же приходится отображать встроенные окна Excel, чтобы пользователь мог сде­ лать свой выбор. Для этого используется коллекция D ia lo g s объекта A p p l i c a t i o n . Примечание Еще один способ отображения встроенных диалоговых окон Excel — вос­ пользоваться коллекцией D ia lo g s объекта A p p lic a t io n . Учтите, что в на­ стоящее время компания Microsoft прекратила поддержу этого свойства, поэтому оно даже не обсуждается. Альтернативное решение, обеспечиваю­ щее отображение диалоговых окон Excel, рассматривается ниже. В предыдущих версиях Excel пользовательские меню и панели инструментов созда­ вались с помощью объекта CommandBar. В версиях Excel 2007 и Excel 2010 этот объект по-прежнему доступен, хотя и работает не так, как раньше. © Перекрестная ссылка Дополнительные сведения, относящиеся к объекту CommandBar, можно най­ ти в главе 22. Начиная с версии Excel 2007 возможности объекта C om m andBar были существенно расширены. В частности, объект C om m andBar можно использовать для вызова команд ленты с помощью VBA. Многие из команд, доступ к которым открывается с помощью ленты, отображают диалоговое окно. Например, следующая инструкция отображает диа­ логовое окно Вывод на экран скрытого листа (рис. 12.10). A p p lic a tio n .C o m m a n d B a rs . E xe c u te M s o ( "S h e e tU n h id e ") Вывод я н к ц Выберите скрытый диет из списка; [_О К _] Отмена j Рис. 12.10. Диалоговое окно, ото­ бражаемое в результате выполнения указанного выше оператора VBA Метод E x e c u te M s o принимает лишь один аргумент, id M s o , который представляет элемент управления ленты. К сожалению, сведения о многих параметрах в справочной системе отсутствуют. 401 Глава 12. Создание собственных диалоговых окон Компакт-диск На прилагаемом компакт-диске находится рабочая книга r ib b o n c o n t r o l n a m e s .x ls x , в которой описаны все названия параметров команд ленты Excel. Поэкспериментируйте с параметрами, перечисленными в этой рабо­ чей книге. Многие из них вызывают команды немедленно (без промежуточ­ ных диалоговых окон). Но большинство из них генерирует ошибку при ис­ пользовании в неправильном контексте. Например, Excel отображает сооб­ щение об ошибке, если команда F u n c tio n w iz a r d вызывается в случае выбора диаграммы. А теперь рассмотрим еще один пример. В результате выполнения приведенного ниже оператора отображается вкладка Шрифт диалогового окна Формат ячеек (рис. 12.11). A p p lic a tio n . CommandBars . E xecuteM so ( " F o r m a tC e lls F o n tD ia lo g " ) Формат яче е к Размер: Начертание: Шрифт: Calibri обычный 11 куров полужирный полужирный курсив 9 “ 1 12 14 ZA *М^тюпа(Зап>ловки^^ .Dialog 9 .Ruler Ч? 1251Pragmatica 4 1251 Тин»................. Подчеркивание: zi д и Цвет: | Н |Нет видои: |7 Обычный Образен зачеркнутый надстрочный АаВЬБбЯя Г* подстрочный ______I__ Шрифт типа TrueType. Шрифт будет использован как для вывода на экран, так и для печати. Рис. 12.11. Использование метода ExecuteMso для отображения диалогового окна Отображение формы ввода данных Многие пользователи применяют Excel для управления списками, информация в ко­ торых ранжирована по строкам. В Excel поддерживается простой способ работы с по­ добными типами данных с помощью встроенных форм ввода данных, которые могут создаваться автоматически. Подобная форма предназначена для работы как с обычным диапазоном, так и с диапазоном, оформленным в виде таблицы (с помощью команды Вставка^Таблицы^Таблица (Insert^Tables^Table)). Пример формы ввода данных показан на рис. 12.12. Доступ к формам ввода данных В силу каких-то неизвестных причин на ленте Excel отсутствует команда, обеспечи­ вающая доступ к форме ввода данных. Подобную команду можно добавить на панель быстрого доступа. Для этого выполните следующие действия. 402 Часть IV. Пользовательские формы Д Спа льни Д В < ш т Д Кв.м, Д Тш Central ЛОЖЬ 07.09.2009 Single Family 25.02.2009 показать форму ввода ЛОЖЬ Single Family Single Family Single Family ИСТИНА ИСТИНА Single Family ИСТИНА ЛОЖЬ ЛОЖЬ ИСТИНА ЛОЖЬ Single Family Single Family Single Family Adams 27.02.2009 2 1800 Single Family Single Family 3 2 041 Single Family 4 3 1 940 3 3927 Single Family Single Family 3 2,5 2 030 S. County Central Shasta ЛОЖЬ ЛОЖЬ ЛОЖЬ Condo Рис. 12.12. Некоторые пользователи предпочитают применять встроенные формы ввода данных Excel для ввода сведений 1. Щелкните правой кнопкой мыши на панели быстрого доступа и в контекстном меню выберите параметр Настройка панели быстрого доступа (Customize Quick Access Toolbar). На экране появится вкладка Панель быстрого доступа (Quick Access Toolbar) диалогового окна Параметры Excel (Excel Options). 2. В раскрывающемся списке Выбрать команды из (Choose Commands From) вы­ берите параметр Команды не на ленте (Commands Not in the Ribbon). 3. В появившемся списке выберите параметр Форма (Form). 4. Щелкните на кнопке Добавить (Add) для добавления выбранной команды на па­ нель быстрого доступа. 5. Щелкните на кнопке ОК для закрытия диалогового окна Параметры Excel. После выполнения перечисленных выше действий на панели быстрого доступа появится новый значок. Доступ к меню, оформленным в стиле Excel 2003 Еще один способ отображения встроенных диалоговых окон требует знания методи­ ки работы с панелями инструментов, применяемыми в версиях Excel, предшествующих Excel 2007 (эти панели инструментов также называются объектами CommandBar). Хотя в Excel объекты CommandBar больше не используются, они по-прежнему поддержива­ ются для обеспечения совместимости. Например, следующий оператор эквивалентен выбору пункта Формат^Лист^Отобразить (Format^Sheet^Unhide) в меню Excel 2003. A p p l i c a t i o n . C om m a n d B a r s( " W o r k s h e e t Menu B a r " ) C o n t r o l s ( "Формат") . C o n t r o l s ( " Л и с т ") _ C o n t r o l s ( "О тобразить. . . " ) . E x e c u te _ В результате вызова этого оператора отображается диалоговое окно Отобразить (Unhide). Обратите внимание на необходимость точного соответствия заголовков эле­ ментов меню (включая многоточие после Отобразить). Ниже приводится еще один пример. Этот оператор отображает диалоговое окно Формат ячеек (Format Cells). Глава 12. Создание собственных диалоговых окон 403 A p p lic a tio n . CommandBars( "W o rksh e e t Menu B a r " ) _ C o n t r o l s ( " Фор мат ") . C o n t r o l s ( " Я ч е й к и . . . " ) . E x e c u t e На самом деле пользоваться объектами CommandBar не стоит, поскольку вряд ли они будут поддерживаться в будущих версиях Excel. Для работы с формой ввода данных следует структурировать данные таким образом, чтобы Excel распознавала их в виде таблицы. Начните с указания заголовков столбцов в первой строке диапазона вводимых данных. Выделите любую ячейку в таблице и щелк­ ните на кнопке Форма (Form) панели быстрого доступа. Затем Excel отображает диалого­ вое окно, в котором будут вводиться данные. Для перемещения между текстовыми полями в целях ввода информации используйте клавишу <ТаЬ>. Если ячейка содержит формулу, результат вычислений отображается в виде текста (а не в формате поля ввода данных). Другими словами, невозможно изменить формулы с помощью формы ввода данных. По завершении ввода данных в форму щелкните на кнопке Создать (New). После этого Excel вводит данные в строку рабочего листа, а также очищает диалоговое окно для ввода следующей строки данных. Отображение формы ввода данных с помощью VBA Используйте метод Show DataForm для отображения формы ввода данных Excel. Единственное требование заключается в том, что активная ячейка должна находиться вдиапазоне. Следующий код активизирует ячейку А1 (в таблице), а затем отображает форму ввода данных. Sub D is p la y D a ta F o rm () Range("Al").Select A c tiv e S h e e t. ShowDataForm End Sub © Компакт-диск Рассмотренный пример находится в рабочей книге на прилагаемом ком­ пакт-диске (файл d a ta fo rm e x a m p le . xlsm ). л Ж Глава ■ 13) Работа с пользовательскими формами Вэтой главе... ♦ Обработка пользовательских диалоговых окон в Excel ♦ Вставка новой формы U serF orm ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ Добавление элементов управления в пользовательское диалоговое окно Элементы управления в окне Toolbox Настройка элементов управления пользовательского диалогового окна Изменение свойств элементов управления Отображение пользовательского диалогового окна Закрытие пользовательского диалогового окна Пример создания пользовательского диалогового окна События объекта U serF orm ♦ ♦ ♦ ♦ Ссылка на элементы управления пользовательского диалогового окна Настройка панели инструментов Toolbox Создание шаблонов диалоговых окон Вопросы для самоконтроля В этой главе рассматриваются методы создания пользовательских форм и работы с ними. Обработка пользовательских диалоговых окон в Excel Разрабатывая приложения в Excel, можно относительно просто создавать собствен ные диалоговые окна. При этом несложно повторить внешний вид и поведение практи чески всех стандартных диалоговых окон Excel. Часть IV. Пользовательские формы 406 Разработчики приложений Excel всегда имели возможность создавать собственные диалоговые окна. Причем, начиная с Excel 97, применяемые при этом процедуры замет­ но изменились. Пользовательские диалоговые окна заменили неуклюжие диалоговые листы, и у разработчиков появилось намного больше возможностей по управлению соб­ ственными диалоговыми окнами. Но в целях совместимости Excel 97 и более поздние версии все еще поддерживают старые диалоговые листы Excel 5/95. Хорошей новостью является то, что формами U s e rF o rm управлять намного проще; кроме того, они предос­ тавляют широкий набор новых возможностей. Пользовательские диалоговые окна создаются на основе технологии пользователь­ ских форм, к которым можно получить доступ из редактора Visual Basic (VBE). Ниже приведена стандартная последовательность действий, которой следует придер­ живаться при создании пользовательского диалогового окна. 1. Вставьте новую форму U serF orm в проект VBAProject рабочей книги. 2. Добавьте элементы управления в форму U s e rF o rm . 3. Настройте свойства добавленных элементов управления. 4. Создайте процедуры “обработчики событий” для элементов управления. Эти процедуры добавляются в модуль кода U s e rF o rm и выполняются при воз­ никновении различных событий (например, при щелчке на кнопке). 5. Разработайте процедуру, которая отображает форму U serForm . Эта процедура находится в модуле VBA (а не в модуле кода для формы U serF orm ). 6. Определите простой способ вызова на выполнение процедуры, созданной в п. 5. Можно поместить кнопку на рабочий лист, команду ленты и т.д. Вставка новой формы U s e rF o rm Для того чтобы добавить в проект форму U s e rF o rm , запустите VBE (нажмите кла­ виши <Alt+Fll>, укажите рабочую книгу в окне проекта и выполните команду Inserts UserForm (Вставка^Форма UserForm)). Формы U s e rF o rm получат такие име­ на, как U s e r F o r m l, U s e rF o rm 2 и т.д. Совет В целях упрощения идентификации можно изменить название формы U ser­ Form. Для этого выберите форму и измените свойство Name (Имя) в окне Properties (Свойства). (Если это окно не отображается, нажмите клавишу <F4>.) На рис. 13.1 показано окно Properties, в котором выбрана пустая форма UserForm . В рабочей книге может быть произвольное количество форм U s e rF o rm , а каждая форма включает единственное пользовательское диалоговое окно. Глава 13. Работа с пользовательскими формами 407 Рис. 13.1. Окно Properties для пустой формы UserForm Добавление элементов управления впользовательское диалоговое окно Чтобы добавить элементы управления в форму U s e rF o rm , воспользуйтесь панелью Toolbox (Набор инструментов). Обратите внимание, что в VBE отсутствуют команды ме­ ню, предназначенные для добавления элементов управле­ ния. Если панель Toolbox не отображена на экране, выбе­ рите команду Vie\AF>Toolbox (Вид^Панель инструментов I* А аЫ а 08 Toolbox). Панель Toolbox показана на рис. 13.2. Р F* □ -J Щелкните на той кнопке в панели Toolbox, которая со­ 3 ±10 ответствует добавляемому элементу управления. После это­ га го щелкните внутри диалогового окна для создания элемен­ та управления (используется размер элемента по умолча­ нию). Также можно щелкнуть на элементе управления и, Рис. 13.2. Воспользуйтесь ок­ ном Toolbox для добавления эле­ перетащив его границы в диалоговом окне, задать необхо­ ментов управления в пользова­ димый размер в пользовательском диалоговом окне. тельскую форму Добавленному элементу управления назначается имя, которое состоит из названия типа элемента управления и числового кода. Например, если до­ бавить элемент управления C om m an dB utton в пустую форму U s e rF o rm , то этот элемент управления будет называться C o m m a n d B u tto n l. Если добавить в окно второй элемент управления C om m andB utton, то он будет называться C om m andB utton2. Совет Рекомендуется переименовать все элементы управления, управление кото­ рыми происходит с помощью кода VBA. Это позволит воспользоваться опи­ сательными именами, простыми для запоминания. Согласитесь, что Р го d u c tL is tB o x звучит гораздо лучше, чем L is t B o x i. Для изменения назва­ ния элемента управления воспользуйтесь окном Properties (Свойства) в VBE. Просто выберите объект и измените его свойство Name. Часть IV. Пользовательские формы 408 Элементы управления в окне Toolbox В следующих разделах описаны элементы управления, доступ к которым можно по­ лучить в окне Toolbox. Компакт-диск Пример формы UserForm, на которой размещены элементы управления, приводится на рис. 13.3. Соответствующая рабочая книга называется all userf orm controls.xlsm и находится на прилагаемом компакт-диске. Label 1 Январь Февраль Март Pagejk ;Рзде2 | (* jOptoonButtonr | Июнь _ OptionButton2 ZJ И ю ль__ тшшшшш 1 jj | ■ нвнааннинн л <1 ►1 ToggteButti^il Рис. 13.3. Эта форма U s e r F o r m содержит 15 элементов управления Совет Формы UserForm могут также использовать другие элементы управления ActiveX (см. раздел “ Настройка панели инструментов Toolbox” ). CheckBox Элемент управления C h e c k B o x предоставляет пользователю возможность выбрать один из двух вариантов: да или нет, истина или ложь, включить или выключить и т.д. Ес­ ли элемент управления C h e c k B o x установлен, то он имеет значение T ru e , в противном случае значение равно F a ls e . ComboBox Элемент управления Com boBox подобен объекту L i s t B ox. Отличие заключается в том, что Com boBox представляет раскрывающийся список, в котором в определенный Глава 13. Работа с пользовательскими формами 409 момент времени отображается только одно значение. Кроме того, пользователю в поле списка разрешено вводить значение, которое необязательно представляет одну из опций объекта ComboBox. CommandButton Каждое создаваемое диалоговое окно будет иметь как минимум один элемент управ­ ления C o m m a n d B u tto n . Обычно используются объекты C o m m a n d B u tto n , представ­ ляющие кнопки ОК и Отмена. Frame Элемент управления F ra m e применяется в качестве оболочки для других элементов управления. Он добавляется в диалоговое окно либо в целях эстетики, либо из соображе­ ний логического группирования однотипных элементов управления. Элемент управления Frame требуется в случае, если в диалоговом окне содержится более одного набора эле­ ментов управления O p t io n B u t t o n . Image Элемент управления Im a g e используется для представления графического изобра­ жения, которое сохранено в отдельном файле или вставляется из буфера обмена. Кроме того, элемент управления Im a g e незаменим при отображении в диалоговом окне лого­ типа компании. Графическое изображение сохраняется вместе с рабочей книгой. Таким образом, вместе с рабочей книгой передавать другому пользователю копию графическо­ го файла необязательно. JEJk Предупреждение И м Некоторые графические файлы занимают много места, поэтому их включение в рабочую книгу приведет к радикальному увеличению ее размера. Поэтому используйте небольшие по размеру картинки либо вовсе откажитесь от них. Label Элемент управления L a b e l отображает текст в диалоговом окне. ListBox Элемент управления L i s t B o x предоставляет список опций, из которого пользова­ тель может выбрать один вариант (или несколько). Элемент управления L i s t B o x неве­ роятно гибок в использовании. Например, вы вправе указать диапазон на листе, который содержит элементы списка. Этот диапазон может состоять из нескольких столбцов. Кро­ ме того, элемент управления L i s t B o x заполняется опциями с помощью кода VBA. MultiPage Элемент управления M u lt iP a g e позволяет создавать диалоговые окна с нескольки­ ми вкладками, которые подобны появляющимся после выбора команды Формат ячеек (Format Cells). По умолчанию элемент управления M u lt iP a g e состоит из двух вкладок. Часть IV. Пользовательские формы 410 OptionButton Элемент управления O p t i o n B u t t o n применяется при выборе пользователем одного варианта из нескольких. Эти элементы управления всегда группируются в диалоговом окне в наборы, содержащие не менее двух опций. Когда один элемент управления Op­ t i o n B u t t o n выбран, все остальные элементы управления O p t i o n B u t t o n текущей группы автоматически становятся неактивными. Если в пользовательском диалоговом окне содержится более одного набора элемен­ тов управления O p t io n B u t t o n , то каждый из таких наборов должен иметь собственное значение свойства G roupN am e. В противном случае все элементы управления O p t io n ­ B u t t o n в диалоговом окне рассматриваются как члены одной группы. Также можно вставить элементы управления O p t i o n B u t t o n в объект F ram e, что приведет к их ав­ томатическому группированию в текущем разделе. RefEdit Элемент управления R e f E d i t используется тогда, когда пользователь должен выде­ лить диапазон ячеек на листе. ScrollBar Элемент управления S c r o l l B a r в некотором смысле подобен элементу управления S p in B u t t o n . Разница заключается в том, что пользователь может перетаскивать ползу­ нок объекта S c r o l l B a r для изменения значения с большим приращением. Элемент управления S c r o l l B a r рекомендуется использовать при выборе значения из большого диапазона. SpinButton Элемент управления S p i n B u t t o n позволяет выбрать значение после щелчка на од­ ной из двух кнопок со стрелками. Одна из них применяется для увеличения значения, а вторая — для уменьшения. Элемент управления S p in B u t t o n часто используется со­ вместно с элементами управления T e x tB o x и L a b e l, которые содержат текущее значе­ ние элемента управления S p in B u t t o n . TabStrip Элемент управления T a b S t r i p подобен элементу управления M u lt iP a g e , однако использовать его сложнее. Элемент управления T a b S t r i p , в отличие от M u ltiP a g e , не выступает контейнером для других объектов. Как правило, элемент управления M u l­ t i P a g e обладает более широкими возможностями. TextBox Элемент управления T e x tB o x позволяет пользователям вводить текст в диалоговом окне. ToggleButton Элемент управления T o g g le B u t t o n имеет два состояния: включен и выключен. Щелчок на кнопке приводит к изменению состояния на противоположное и к изменению внешнего вида кнопки. Этот элемент управления может иметь значение T r u e (активен) или F a ls e (неактивен). Он не относится к “стандартным” элементам управления, по­ Глава 13. Работа с пользовательскими формами 411 этому использование двух элементов управления OptionButton или одного CheckBox может оказаться более удачным вариантом. Использование элементов управления на рабочем листе Многие из элементов управления пользовательскими диалоговыми окнами могут встраиваться непосредственно в рабочий лист. Доступ к этим элементам можно полу­ чить также путем выполнения команды Excel Разработчик^Элементы управления^Вставить (Developer^Controls^lnsert). Для использования подобных элементов в составе рабочего листа требуется гораздо меньше усилий, чем для создания пользова­ тельского диалогового окна. Кроме того, в данном случае можно не создавать макросы, поскольку элемент управления можно связать с ячейкой рабочего листа. Например, ес­ ли на рабочий лист вставить элемент управления CheckBox (Флажок), его можно свя­ зать с нужной ячейкой, задав свойство L in k e d C e ll. Если флажок установлен, в связан­ ной ячейке отображается значение и с т и н а . Е с л и же флажок сброшен, то в связанной ячейке отображается значение ложь. На представленном ниже рисунке отображается рабочий лист, содержащий некото­ рые элементы управления ActiveX. Эта рабочая книга, называемая a c t iv e x w o rk s h e e t c o n tro ls . x ls x , находится на прилагаемом компакт-диске. Она включает связанные ячейки и не содержит макросов. --------- ~-------- JL Параметры кредита 4J Связанные ячейки 565 Значение ползунка Сумма выплат: $345 000 5,65 Процент 4 Г" Финансировать выплаты по кредиту $5,000 ЛОЖЬ Фикс ставка: Срок кредита: с 10% О 30 лет с 15% <* 15 лет $276 000 Сумма кредита ложь и мЬ 15 лет 15 лет Сумма кредита: 1 30 лет ИСТИНА © 20% в Платеж по кредиту $276 000 ложь ложь 10% 5,65% ИСТИНА 20% Ё 15% 20% ставка Месячный платеж: $2 277,18 График погашения Добавление элементов управления в рабочий лист может оказаться непростой за­ дачей, поскольку они могут происходить из двух источников. • Элементы управления формами. Эти элементы управления являются внедряе­ мыми объектами. • Элементы управления ActiveX. Эти элементы управления являются подмножест­ вом элементов, доступных в пользовательских диалоговых окнах. Можно использовать элементы управления, относящиеся к одному из двух вышепе­ речисленных источников, но при этом следует понимать различия между ними. Эле- 412 Часть IV. Пользовательские формы менты управления пользовательскими диалоговыми окнами работают не так, как эле­ менты управления ActiveX. После добавления элемента управления ActiveX в рабочий лист Excel переходит в режим конструктора. В этом режиме можно настраивать свойства любого элемента управления рабочего листа, добавлять или изменять процедуры обработки событий для элемента управления, а также изменять его размер или положение. Для отображения окна свойств (Properties) элемента управления ActiveX воспользуйтесь командой Раз­ работчик^ Элементы управления«=>Свойства (Developer^Controls^Properties). Для создания простых кнопок можно использовать элемент управления B u tto n (Кнопка), который находится на панели инструментов Формы (Form). В этом случае обеспечивается возможность запуска макроса. Если же воспользоваться элементом управления CommandButton, который относится к группе элементов управления ActiveX, то после щелчка на нем вызывается связанная процедура обработки событий (например, C o m m a n d B u tto n i_ d ic k ), которая находится в модуле кода объекта Лист (Sheet). Связать макрос с этой процедурой нельзя. Если Excel находится в режиме конструктора, тестирование элементов управления невозможно. В этом случае нужно выйти из режима конструктора, щелкнув на кнопке Разработчик^Элементы управления^Режим конструктора (Developer^Controls^Design mode). Эта кнопка работает, как переключатель. Настройка элементов управления пользовательского диалогового окна После того как элемент управления будет помещен в диалоговое окно, можно его пе­ реместить и изменить его размер. Воспользуйтесь стандартными методиками управления графическими объектами с помощью мыши. Совет Можно выделить несколько элементов управления. Для этого следует удерживать нажатой клавишу <Shift> и щелкать на объектах либо обвести указателем мыши необходимые элементы управления. В форме U s e rF o rm содержатся вертикальные и горизонтальные направляющие, ко­ торые помогают выровнять добавленные в диалоговое окно элементы управления. При добавлении или перемещении элемент управления привязывается к направляющим, что облегчает упорядочение таких элементов в окне. Если вы не используете направляющие, можете их отключить, выбрав в VBE команду Tools^Options (Сервис1^Параметры). В диалоговом окне Options (Параметры) перейдите на вкладку General (Общие) и выбе­ рите соответствующие параметры в разделе Form Grid Settings (Настройка направляю­ щих формы). Меню Format (Формат) окна VBE предоставляет несколько команд, которые позво­ ляют точно разместить и выровнять элементы управления в диалоговом окне. Перед ис­ пользованием этих команд необходимо указать элементы управления, к которым они бу­ дут применяться. Эти команды выполняют свои задачи так, как и ожидается. На рис. 13.4 показано диалоговое окно с несколькими элементами управления O p t io n B u t t o n в процессе выравнивания. На рис. 13.5 показано окно с теми же элементами управления, которые выровнены по вертикали и горизонтали. ва 13. Работа с пользовательскими формами 413 Рис. 13.4. Воспользуйтесь командой Format^Align для выравнивания элементов управления Рис. 13.5. Так выглядят элементы управления O ptionB utton после завер­ шения выравнивания Совет Если выделено несколько элементов управления, на выделяющей рамке последнего из них вместо обычных черных маркеров появляются белые. Это означает, что последний элемент управления играет роль основы, на базе которой определяются размеры и расположение других элементов управления. 414 Часть IV. Пользовательские формы Изменение свойств элементов управления Каждый элемент управления характеризуется набором параметров, которые опреде­ ляют внешний вид и поведение элемента управления. Свойства элемента управления можно изменять в следующих случаях. • В момент проектирования при разработке пользовательского диалогового окна. Для этого используется окно Properties (Свойства). • В процессе выполнения, когда пользовательское диалоговое окно отображается на экране. Для этого воспользуйтесь инструкциями VBA. Работа с окном Properties В VBE окно Properties (Свойства) позволяет изменять свойства выделенного элемента управления (это может быть обычный элемент управления или сама форма U s e rF o rm ) (рис. 13.6). Рис. 13.6. Окно Properties для выделенного элемента управления O ptionB utton Примечание В окне Properties (Свойства) есть две вкладки. На вкладке Alphabetic (По ал­ фавиту) свойства выбранного объекта отображаются в алфавитном порядке. На вкладке Categorized (По категориям) эти свойства сгруппированы по ка­ тегориям. Обе вкладки отображают одни и те же свойства, но по-разному. Для того чтобы изменить свойство, необходимо щелкнуть на нем и ввести новое зна­ чение. Некоторые свойства могут принимать только ограниченный набор допустимых значений, выбираемых из соответствующего списка. После щелчка на таком свойстве в окне Properties будет отображена кнопка со стрелкой, указывающей вниз. Щелкните на этой кнопке, чтобы выбрать значение из предложенного списка. Например, свойство T e x t A l i g n может принимать одно из следующих значений: 1 — f m T e x t A lig n L e f t , 2 — f m T e x t A l ig n C e n t e r и 3 — f m T e x t A l ig n R i g h t . Глава 13. Работа с пользовательскими формами 415 После выделения отдельных свойств (например, F o n t и P i c t u r e ) рядом с ними отображается небольшая кнопка с троеточием. Щелчок на этой кнопке приводит к вызо­ ву диалогового окна настройки свойства. Свойство P i c t u r e элемента управления Im a g e стоит рассмотреть отдельно, по­ скольку для него необходимо указать графический файл. Еще один вариант — вставить изображение из буфера обмена. В последнем случае следует сначала скопировать его в буфер обмена, а затем выбрать свойство P i c t u r e элемента управления Im a g e и на­ жать комбинацию клавиш <Ctrl+V> для вставки содержимого буфера обмена. Примечание Если выделить два или более элементов управления одновременно, в окне Properties отобразятся только те свойства, которые являются общими для этих объектов. Совет Объекту U serForm присущ ряд свойств, значения которых можно изменять. Эти свойства применяются в качестве значений, заданных по умолчанию, для элементов управления, которые добавляются в пользовательские диа­ логовые окна. Например, если изменить свойство F o n t пользовательского диалогового окна, все добавленные в окно элементы управления будут при­ менять этот шрифт. Общие свойства Каждый элемент управления имеет как собственный набор уникальных свойств, так и ряд общих свойств, присущих другим элементам управления. Например, все элементы управления имеют свойство Name и свойства, определяющие его размер и расположение на форме ( H e ig h t , W id th , L e f t и R ig h t ) . Если вы собираетесь работать с элементом управления с помощью кода VBA, при­ свойте ему значащее имя. Например, первый элемент управления O p t io n B u t t o n , ко­ торый добавлен в пользовательское диалоговое окно, по умолчанию получит имя О рt i o n B u t t o n l . В коде ссылка на этот объект будет выглядеть следующим образом: O p tio n B u tto n l .V a lu e = T ru e Но если элементу управления O p t i o n B u t t o n присвоить описательное имя (например, o b L a n d s c a p e ), то можно использовать такой оператор: o bL an d sca p e .V a lu e = T ru e Совет & Многие пользователи предпочитают имена, которые указывают на тип объекта. В предыдущем примере был использован префикс ob, который указывает на то, что объект является элементом управления O p tio n B u tto n . Можно изменять значения свойств нескольких элементов управления одновременно. Например, вы вправе создать на форме несколько элементов управления O p t i o n B u t ­ to n и выровнять их по левому краю. Для этого достаточно выделить все элементы управления O p t i o n B u t t o n и изменить значение свойства L e f t в окне Properties. Все выделенные элементы управления примут новое значение свойства L e f t . Часть IV. Пользовательские формы 416 Диалоговое справочное руководство является наилучшим способом получения ин­ формации о свойствах различных элементов управления. Щелкните на свойстве в окне Properties и нажмите клавишу <F1>. На рис. 13.7 показан пример справочных сведений, приведенных для выделенного свойства. Щ Справка: Excel_________________________________________________ _ 0 £• & # А£ # <... ......__ _ _ _________________________ ■. . . ... ■ , . сз С _ _ J MousePointer Property Ь ш Я; 10 Dev«ao« >V>satf Ъя&к fof Лрр&сагюга Langsegp » Mi>c«>soft formi Visa* 6*sk RsfetWit» » R«f«г*л£* » MousePointer Property Specifies the type o f pointer tfcplayed when the user positions the mouse over a particular object S y n ta x object.M ouseP ointer [= fmMousePonta] The M ou seP o inte r property syntax has these parts: P a rt D escriptio n object fmfifousePanter Requred. A valid object. Optional. The shape you want for the mouse pointer. Settings The settings for fmMousePomterare: Constant fmMousePomterDefauft fmMousePanterArrow fmMousePonterCross (mMousePanterlBeam fmMousePohterSoeNESW fmMousePointsrS/zef'S fmMousePanterSizeNWSE fmMousePomterS<*eWE fmMousePonterUpArrow fmMousePonterHourgtass виМвияеЛаМиМиавр fmMousePantcrAppStartng fmMousePotnterHetp fmMousePomterStzeAi fmMoLxePanterCustom Value Description 0 1 2 Standard pointer. The image s determined by the object (default). Arrow. Cross-hair pointer. 3 I-beam. 6 7 8 9 10 11 12 13 14 15 99 Double arrow pointing northeast and southwest Double arrow pointing north and south. Double arrow pointing northwest and southeast. Double arrow pointing west and east. Up arrow. Hourglass. 'Not'symbol (drde with a diagonal line) on top of the object being dragged. Indicates an mvafcd drop target. Arrow with an hourglass. Arrow with a question mark. Size al cursor (arrows pointingnorth, south, east, and west). Uses the icon specified by the M ou s elc on property. Remarks Use the M ouseP ointer property when you want bo indicate changes in functionality as the mouse pointer passes over controls on a form. For example, the hourglass setting (11) is usefti to indicate that the user must wait for a process or operation to finish. Some icons vary depending on system settings, such as the icons associated with desktop themes. © 2D10 Microsoft Corporation. All rights reserved. Справке для разработчиков Л ф Автономная работа Рис. 13.7. В справочной системе можно найти сведения о каждом свойстве любого эле­ мента управления Советы по использованию клавиатуры Многие пользователи предпочитают перемещаться по диалоговым окнам с помощью клавиатуры. Комбинации клавиш <ТаЬ> и <Shift+Tab> позволяют циклически переклю­ чаться между элементами управления. Чтобы удостовериться, что диалоговое окно кор­ ректно реагирует на команды с клавиатуры, обратите внимание на такие моменты: поря­ док просмотра элементов управления и комбинации клавиш. Изменение порядка просмотра (активизации) Порядок просмотра определяет последовательность, в которой активизируются эле­ менты управления после нажатия пользователем клавиши <ТаЬ> или комбинации кла­ виш <Shift+Tab>. Кроме того, порядок активизации указывает, какой элемент управле­ ния по умолчанию выделяется на форме первым. Если пользователь вводит текст в эле­ мент управления T e x tB o x , то этот элемент считается активным. Если после этого щелкнуть на элементе управления O p t io n B u t t o n , то именно он станет активным. Эле­ мент управления, назначенный первым для просмотра, будет активным в момент откры­ тия диалогового окна. ава 13. Работа с пользовательскими формами 417 1 Для того чтобы указать порядок активизации, выберите команду View^Tab Order (ид1^ Порядок просмотра). Кроме того, можно щелкнуть правой кнопкой мыши на диа>говом окне и выбрать пункт Tab Order из появившегося контекстного меню. В любом учае Excel отобразит диалоговое окно Tab Order (Порядок просмотра), которое покано на рис. 13.8. В диалоговом окне Tab Order содержится упорядоченный список всех ементов управления в последовательности, которая соответствует порядку активизат объектов в пользовательском диалоговом окне. Чтобы переместить элемент управния в списке, выберите его и щелкните на кнопке Move Up (Переместить вверх) или ove Down (Переместить вниз). Можно одновременно перемещать более одного эле;нта управления (при выделении элементов удерживайте клавишу <Shift> или <Ctrl>). Щ file |<jit vtew Q-A ij 1 Insert Format \ W *? Debug gun Tools ^ л Window Help Q шщтш J _ § PUP/TRIAL (pup7jdam) В VBM>roject (PERSOHAUCLSB) ft] Лип-1 (Лист!) ■ в ЭтеКнига & VBAProject (КимгаЗ) в] ® в в Actd-tns & £ J? * Лист 1 (ЛистЦ Лист2(Лмст2) ЛистЗ (ЛистЗ) ЗтаКмига Q322I Пprir.r.ptjrr. 4,; ОрЬопВиПопЗ 0ptionButton4 0phonButton5 Рис. 13.8. В диалоговом окне Tab Order изменяется порядок просмотра элементов управления С другой стороны, можно указать порядок активизации элемента управления с помо­ рю окна Properties. Первый активизируемый элемент управления будет иметь свойстoT ablndex, установленное равным 0. Изменение значения свойства T a b ln d e x текудего объекта приведет к изменению значений свойств T a b ln d e x других элементов правления. Изменения вносятся автоматически. Вы можете удостовериться в том, что начения свойства T a b ln d e x всех элементов управления не больше количества элеменов управления в диалоговом окне. Если нужно удалить элемент управления из списка ктивизируемых объектов, то присвойте его свойству T a b S to p значение F a ls e . Примечание Одни элементы управления, такие как Frame и M u ltiP a g e , служат контей­ нерами для других элементов управления. Элементы управления в таком контейнере имеют собственный порядок просмотра (активизации). Для ус­ тановки порядка просмотра группы элементов управления O p tio n B u tto n s , находящихся внутри элемента управления Frame, выделите элемент управ­ ления Frame до того, как будет выполнена команда View^Tab Order. Часть IV. Пользовательские формы 418 Назначение комбинаций клавиш Большинству элементов управления диалогового окна можно назначить комбинацию клавиш. Таким образом, пользователь получит доступ к элементу управления, нажав <Alt> и указанную клавишу. Применив свойство Accelerator в окне Properties, мож­ но определить клавишу для активизации элемента управления. © Совет Некоторые элементы управления, например T e xtB o x, лишены свойства Ac­ c e le r a t o r , поскольку не отображают значение свойства C a p tio n . Но к та­ ким элементам можно получить доступ с помощью клавиатуры, воспользо­ вавшись свойством L a b e l. Присвойте клавишу элементу управления Label и расположите его в порядке просмотра перед элементом T e xtB o x. Отображение пользовательского диалогового окна Для того чтобы отобразить пользовательское диалоговое окно с помощью VBA, не­ обходимо создать процедуру, которая вызывает метод Show объекта UserForm. Форму UserForm невозможно отобразить, не выполнив как минимум одну строку кода VBA. Если объект UserForm называется UserForml, то следующая процедура отобразит это пользовательское диалоговое окно. Sub ShowFormO U s e rF o rm l. Show End Sub Данная процедура должна располагаться в стандартном модуле VBA, а не в модуле формы UserForm. При отображении пользовательская форма остается на экране до тех пор, пока ее не скроют. Обычно в нее добавляют элемент управления CommandButton, который запуска­ ет процедуру закрытия формы. Эта процедура либо выгружает пользовательскую форму с помощью метода Unload, либо удаляет ее с экрана с помощью метода Hide объекта UserForm. Детально с каждым из них вы познакомитесь в приведенных далее примерах. Отображение немодальной формы По умолчанию отображается модальная форма. Это означает, что форма должна ис­ чезнуть с экрана прежде, чем пользователь выполнит какие-либо действия на рабочем листе (т.е. редактирование данных невозможно). Немодальную форму также можно ото­ бразить. В этом случае вы вправе продолжать работу в Excel, не скрывая саму форму. Для отображения немодальной формы используется следующий синтаксис: U s e rF o rm l. Show vb M o de less Тестирование пользовательского диалогового окна Обычно в процессе разработки возникает необходимость в тестировании формы UserForm . Для этого можно воспользоваться одним из следующих трех способов: • выполните команду Run^Run Sub/UserForm (Выполнить^Выполнить процеду­ ру/пользовательскую форму); Глава 13. Работа с пользовательскими формами 419 • нажмите клавишу <F5>; • щелкните на кнопке Run Sub/UserForm, которая находится на стандартной панели инструментов. Выбор одного из этих методов приводит к запуску события инициализации диалого­ вого окна. Как только диалоговое окно будет отображено в тестовом режиме, можно проверить порядок активизации объектов, а также поддержку комбинаций клавиш. Отображение пользовательского диалогового окна на основе значения переменной В некоторых случаях приходится выбирать, какое окно U s e rF o rm будет отображено. Если название пользовательского диалогового окна хранится в виде строковой перемен­ ной, можно воспользоваться методом A d d для добавления объекта U s e rF o rm в коллек­ цию U s e rF o rm s с последующим обращением к методу Show из коллекции UserForm s. В приведенном ниже примере название объекта U s e rF o rm присваивается переменной My Form , после чего отображается пользовательское диалоговое окно. MyForm = "U s e rF o rm l" UserForms . Add (MyForm) . Show Загрузка пользовательского диалогового окна В VBA поддерживается оператор L o a d . Загрузка пользовательского диалогового ок­ на приводит к сохранению объекта формы в памяти. Однако до тех пор пока не будет выполнен метод Show, форма останется невидимой для остальной части программы. Для загрузки окна U s e r F o r m l воспользуйтесь следующим оператором: Load U s e r F o r m l Если вы применяете сложное диалоговое окно, то вам может понадобиться предвари­ тельно загрузить его в память, чтобы в случае необходимости быстро отобразить его спомощью метода Show. Как правило, использовать метод Load в подобном случае не имеет смысла. Опроцедурах обработки событий Как только диалоговое окно появляется на экране, пользователь начинает с ним взаи­ модействовать — выбирать опции в элементе управления L is t B o x , щелкать на кнопках CommandButton и т.д. Используя официальную терминологию, можно сказать, что пользователь генерирует события. Например, щелчок на элементе управления Com­ m andButton приводит к возникновению события C l i c k объекта C o m m a n d B u tto n . Вам необходимо создать процедуры, которые будут выполняться при возникновении со­ ответствующих событий. Первые называются обработчиками событий. Примечание Процедуры обработки событий находятся в модуле кода объекта U serForm . Наряду с этим процедура обработки события может вызывать другие процедуры, которые находятся в стандартном модуле VBA. В коде VBA можно изменять свойства элементов управления, пока пользовательское диалоговое окно отображается на экране (т.е. на этапе выполнения). Например, можно 420 Часть IV. Пользовательские формы назначить элементу управления L i s t B o x процедуру, которая изменяет текст элемента управления L a b e l при выборе элемента списка. П одобное поведение элементов управ­ ления подробно рассмотрено далее. Закрытие пользовательского диалогового окна Для закрытия формы U s e r F o r m l воспользуйтесь командой U n lo a d , как показано ниже: U n lo a d U se rF o rm l Если же код находится в модуле кода формы U s e r F o r m , воспользуйтесь следующим оператором: U n lo a d Me В этом случае ключевое слово Me применяется для идентификации пользовательской формы. Обычно в коде V B A команда U n l o a d выполняется только после того, как форма U s­ e r F o r m выполнит все свои функции. Например, форма U s e r F o r m может содержать элемент управления C o m m a n d B u tto n , который используется в качестве кнопки ОК. Щелчок на этой кнопке приводит к выполнению заранее определенного макроса. Одна из функций макроса заключается в выгрузке формы U s e r F o r m из памяти. В результате пользовательское диалоговое окно отображается на экране до тех пор, пока макрос, со­ держащий оператор U n lo a d , не завершает свою работу. Когда форма U s e r F o r m выгружается из памяти, элементы управления, содержав­ шиеся на ней, возвращаются в первоначальное состояние. Другими словами, в коде нель­ зя обращаться к значениям, указываемым пользователем, после того как форма будет выгружена из памяти. Если значения, введенные пользователем, будут применяться поз­ же (после выгрузки диалогового окна U s e r F o r m ), то необходимо присвоить их пере­ менной с областью действия P u b l i c , которая определена в стандартном модуле VBA. Кроме того, значение всегда можно сохранить в ячейке листа. Примечание Окно формы U serForm автоматически выгружается из памяти после того, как пользователь щелкает на кнопке Закрыть (Close) (обозначается симво­ лом х в заголовке окна). Это действие также приводит к возникновению со­ бытия Q u e ryC lo se объекта UserForm , за которым следует событие T e rm i­ n a te пользовательского диалогового окна. Объект U s e r F o r m может использовать метод H id e . После его вызова диалоговое окно исчезает, но остается в памяти, поэтому в коде можно получить доступ к различ­ ным свойствам элементов управления. Ниже приведен пример оператора, который скры­ вает диалоговое окно. U s e rF o rm l. H id e Также можно воспользоваться следующим оператором (если ваш код находится в модуле кода объекта U se r F o r m ): M e.H ide Если по какой-либо причине пользовательское диалоговое окно должно быть немед­ ленно скрыто в процессе выполнения макроса, воспользуйтесь методом H id e в самом начале процедуры, а затем укажите команду D o E v e n t s . Например, в следующ ей проце- лава 13. Работа с пользовательскими формами 421 уре форма UserForm немедленно исчезнет после того, как пользователь щелкнет на нопке CommandButtonl. Последний оператор процедуры выгружает пользователькое диалоговое окно из памяти. 'r iv a te Sub C o m m a n d B u tto n l_ C lic k () Me. H id e A p p l i c a t i o n . S c re e n U p d a tin g = T ru e For r = 1 To 10000 C e l l s ( r , 1) = r N ext r U nload Me !nd Sub В рассматриваемом примере переменной ScreenUpdating присвоено значение True, в результате чего Excel полностью скрывает окно UserForm. Если этот оператор использовать, окно UserForm остается видимым. © Перекрестная ссылка В главе 15 будет показано, как отображать индикатор хода выполнения макроса. При этом используется тот факт, что диалоговое окно остается на экране до тех пор, пока выполняется макрос. Пример создания пользовательского диалогового окна Если вы еще никогда не создавали пользовательские диалоговые окна, то обратите внимание на пример, приведенный в этой главе. В нем вы найдете пошаговые инструк­ ции по созданию простого диалогового окна и разработке процедуры VBA для поддерж­ киэтого диалогового окна. В приведенном примере представлено диалоговое окно, предназначенное для полу­ чения имени и пола пользователя. В диалоговом окне вы найдете элемент управления TextBox, используемый для ввода имени, и три элемента управления OptionButton для указания пола (“мужчина”, “женщина” и “не определен”). Информация, полученная вдиалоговом окне, заносится в пустую строку рабочего листа. Создание пользовательской формы На рис. 13.9 показано завершенное пользовательское диалоговое окно, созданное вэтом примере. Для получения наилучших результатов начните с новой рабочей книги, содержащей только один рабочий лист. Выполните следующие действия. 1. Нажмите комбинацию клавиш <Alt+Fl 1> для активизации VBE. 2. В окне Project (Проект) выберите проект рабочей книги и выполните команду Inserts UserForm (Вставка^Форма UserForm) для добавления пустой формы UserForm. 3. Свойству Caption формы UserForm присвоено заданное по умолчанию значе­ ние UserForml. Воспользуйтесь окном Properties (Свойства) для изменения значения свойства Caption формы UserForm на Укажите имя и пол. (Если окно Properties не отображается, нажмите клавишу <F4>.) Часть IV. Пользовательские формы 422 Щ£>КEdit 50*wJmert ;s e - у .. л ? оз а СWug gun loots ‘ ►и л m? AcW-lm Window i». %af * Q AcrobatTOfMakrr {POFMakerjda) Й ! & PUPTTRIAt (w 7 jd w n ) VBAProJtct (PfRSOHAL-XLSe) ШШ Лист1 (Лист1) ^ § ЭтаКнига VBAProject (Кммга4) P /WtI (fWrrl) ' Г Рис. 13.9. В этом диалоговом окне пользователю предлагается ввести имя и указать пол 4. Добавьте элемент управления L a b e l и настройте его свойства, как указано ниже. Свойство Значение A c c e le r a to r C a p tio n И Имя: T a b ln d ex 0 5. Добавьте элемент управления TextB ox и измените его свойства следующим образом. Свойство Name T a b ln d ex Значение TextN ame 1 6. Добавьте элемент управления Frame и измените его свойства следующим образом. Свойство Значение C a p tio n Пол T a b ln d ex 2 7. Добавьте элемент управления O p t i o n B u t t o n в состав элемента Frame и измените его свойства следующим образом. Свойство A c c e le r a to r C a p tio n Name T a b ln d ex Значение М Мужчина O p t io n M a l e 0 8. Добавьте еще один элемент управления O p t i o n B u t t o n внутри элемента Frame и измените его свойства следующим образом. Глава 13. Работа с пользовательскими формами Свойство Значение A c c e le r a to r C a p tio n Name Tab lnd ex Ж Женщина O ptionFem ale 1 423 9. Добавьте еще один элемент управления O p t i o n B u t t o n внутри элемента Frame и измените его свойства следующим образом. Свойство Значение A c c e le r a to r C a p tio n Name T ablndex V alue Д Другое Opt i onUnknown 2 True 10. Добавьте элемент управления C o m m a n d B u tto n за пределами элемента F ram e и измените его свойства следующим образом. Свойство Значение C a p tio n D e fa u lt Name T ablndex ОК True OKButton 3 И. Добавьте еще один элемент управления C o m m a n d B u tto n и настройте его свойства следующим образом. л «цж Свойство Значение C a p tio n D e fa u lt Name T ablndex Отмена F a lse C lo se K B u tto n 4 ^°,ет При создании нескольких похожих элементов управления может оказаться, что быстрее копировать существующий элемент управления, чем создавать новый. Для копирования элемента управления удерживайте нажатой клавишу <Ctrl> при перетаскивании элемента управления, что приведет к созданию копии. После этого останется изменить свойства скопированного элемента управления. Создание кода для отображения диалогового окна После создания элементов управления на лист необходимо добавить элемент управления ActiveX, называемый Кнопка (CommandButton). Эта кнопка будет запускать процедуру, которая предназначена для отображения формы U s e rF o rm . Для этого выполните следующие действия. 1. Перейдите в окно Excel (воспользуйтесь комбинацией клавиш <Alt+Fl 1>). 2. Выберите команду Разработчик^Элементы управления^Вставить (Developer1^ Controls1^ Insert) и щелкните на значке Кнопка (CommandButton), который нахо­ дится в разделе Элементы ActiveX (ActiveX Controls). Часть IV. Пользовательские формы 424 3. Перетащите кнопку на рабочий лист. При необходимости измените подпись объекта Кнопка. Для этого щелкните на нем правой кнопкой мыши и выберите в контекстном меню команду Объект CommandButton1^ Edit (Объект Кнопка1^ Правка). После этого измените текст, который отображается на кнопке. Для изменения других свойств объекта щелкните на нем правой кнопкой мыши и выберите команду Properties (Свойства). Выполните необходимые изменения в диалоговом окне Properties. 4. Дважды щелкните на объекте C o m m a n d B u tto n . Это приведет к активизации VBE. При этом отобразится модуль кода для листа с открытой пустой процеду­ рой обработки событий объекта C o m m a n d B u tto n , который расположен на рабо­ чем листе. 5. Введите единственный оператор в процедуру C o m m a n d B u tt o n l_ C lic k , как показано на рис. 13.10. В этой краткой процедуре используется метод Show объекта U s e r F o r m l для отображения пользовательского диалогового окна. Рис. 13.10. Процедура C om m an d B u tto n i_d ic k вызывается после щелчка на кнопке рабочего листа Тестирование диалогового окна Следующий этап заключается в проверке работы процедуры, отображающей диало­ говое окно. Примечание После щелчка на кнопке, находящейся на рабочем листе, ничего не про­ изойдет. Точнее, кнопка будет выделена, но это не приведет к инициализа­ ции каких-либо действий. Причина этого заключается в том, что программа Excel по-прежнему остается в режиме конструктора, в который она перехо­ дит автоматически после добавления элемента управления ActiveX. Для вы­ хода из режима конструктора щелкните на кнопке Разработчик^Элементы управления^Режим конструктора (Developer^Controls^Design Mode). Если же требуется изменить кнопку, снова перейдите в режим конструктора. Глава 13. Работа с пользовательскими формами 425 После выхода из режима конструктора щелчок на кнопке приведет к отображению пользовательского диалогового окна (рис. 13.11). Е Александр Мужчина Наталья Женщ ина Степан Мужчина Лю дмила Ж енщина Валерий Мужчина Маргарита Ж енщ ина F G Н I Показать форму *1 ... ^ужчим а: 14 15 16 17 Г" Женщина 18 19 20 Г \Js i j !s s l J S L :Z fipyroe и<I. .....1.. :::::: П ► .! Рис. 13.11. Процедура обработки события Click объекта CommandButton ото­ бражает форму UserForm Когда диалоговое окно будет отображено, введите произвольный текст в текстовом поле и щелкните на кнопке ОК. В результате ничего не произойдет, что совершенно естественно, так как для объекта U serF o rm не создано ни одной процедуры обработ­ ки событий. Примечание Для закрытия диалогового окна щелкните на крестике в его заголовке. Добавление процедур обработки событий В этом разделе рассматривается создание процедур, которые обрабатывают события, возникающие после открытия пользовательского диалогового окна. Выполните следую­ щие действия. 1. Для активизации VBE нажмите комбинацию клавиш <Alt+Fl 1>. 2. Удостоверьтесь в том, что пользовательское окно отображено на экране, и дваж­ ды щелкните на кнопке Отмена. . 3. После этого активизируется окно кода для формы U serForm , а также добавляет­ ся пустая процедура C lo s e B u tto n _ C lic k . Обратите внимание, что название процедуры состоит из имени объекта, символа подчеркивания и названия обраба­ тываемого события. 4. Измените процедуру, как указано ниже. (Это обработчик события C lic k объекта C lo se B u tto n .) Часть IV. Пользовательские формы 426 P r iv a t e Sub C lo s e B u tto n _ C lic k () U n lo a d U se rF o rm l End Sub Эта процедура, которая вызывается после щелчка на кнопке Отмена, выгружает из памяти форму UserForml. 5. Нажмите комбинацию клавиш <Shift+F7> для повторного отображения формы UserForml (либо щелкните на значке View Object (Просмотр объекта) в верх­ ней части окна Project Explorer (Просмотр объектов)). 6. Дважды щелкните на кнопке ОК и введите код следующей процедуры (это код обработчика событий для события Click объекта OKButton). P r iv a t e Sub O K B u tto n _ C lic k () Dim NextRow As Long ' ' А ктиви за ц ия листа S h e e ts ( " Л и с т 1 " ) . A c t i v a t e О пределение следующей п у с т о й с т р о к и NextRow = _ A p p lic a tio n .W o r k s h e e tF u n c tio n .C o u n tA ( R a n g e ( " А : А " ) ) + 1 1 П ередача им ени C e lls (N e x tR o w , ' = TextN am e. T e x t П ередача пола If If If ' 1) O p tio n M a le Then C e lls (N e x tR o w , 2) = "М уж чи на " O p tio n F e m a le Then C e lls (N e x tR o w , 2) = "Женщина" O ptionU nknow n Then C e lls (N e x tR o w , 2) = " Д р у г о е " О ч и с тк а эл е м е н то в у п р а в л е н и я для следующих з а п и с е й TextN am e. T e x t = " " O ptionU nknow n = T ru e T extN am e. S e tF o cus End Sub 7. Перейдите в окно Excel и щелкните на кнопке еще раз, чтобы отобразить пользо­ вательское диалоговое окно. Запустите процедуру повторно. Элементы управления диалогового окна должны функционировать правильно. Теперь с помощью пользовательской формы можно добавлять новые имена в ра­ бочий лист. Процедура OKButton_Click работает следующим образом. Сначала она проверяет, активен ли лист Л и с т 1 . После этого запускается функция Excel СЧЁТЗ (COUNTA) для определения следующей пустой ячейки в столбце А. Затем текст из текстового поля Text Box передается в определенную ячейку столбца А. С помощью операторов If оп­ ределяется выделенный элемент управления OptionButton, что обеспечивает запись соответствующего текста в столбец В (Мужчина, Женщина, Другое). Наконец, диало­ говое окно перезапускается (чтобы обеспечить возможность введения следующей запи­ си). Заметим, что щелчок на кнопке ОК не приведет к закрытию диалогового окна. Для завершения ввода данных (и выгрузки пользовательского диалогового окна) щелкните на кнопке Отмена. Проверка правильности введенных данных Приведенному в этом разделе примеру следует уделить особое внимание. Возможно, вы заметили, что не устранена небольшая проблема — отсутствует проверка введенных Глава 13. Работа с пользовательскими формами 427 втекстовом поле данных (вы не знаете, ввел ли пользователь свое имя). Следующий код добавлен в процедуру O K B u t t o n _ C lic k перед оператором вставки текста на рабочий лист. Он проверяет, ввел ли пользователь свое имя (на самом деле проверяется наличие любого текста) в поле T e x tB o x . Если текстовое поле T e x tB o x осталось пустым, то вы­ водится соответствующее сообщение, и текстовое поле снова становится активным. Та­ ким образом, пользователь сможет приступить к введению своего имени. Оператор E x it Sub завершает процедуру без выполнения дополнительных действий. ' Проверка ввода имени I f TextN am e. T e x t = " " Then MsgBox "Введите и м я . " TextN am e. S e tF o cus E x i t Sub End I f Ура,заработало! После внесения соответствующих исправлений диалоговое окно будет работать безу­ пречно (не забудьте проверить работоспособность комбинаций клавиш). На практике вам может потребоваться собрать много дополнительной информации, а не только све­ дения об имени и поле пользователя. Но в любом случае следует применять изложенные выше принципы. Вам останется добавить в диалоговое окно большее количество эле­ ментов управления. Компакт-диск Рабочая книга с рассмотренным выше примером находится на прилагаемом компакт-диске в файле g e t name and s e x .x ls m . События объекта U se rF o rm Каждый элемент управления в форме U s e rF o rm (а также сам объект U s e rF o rm ) разрабатывается для того, чтобы реагировать на определенные события. Эти события возникают в результате действий пользователя или генерируются программой Excel. На­ пример, щелчок на кнопке (C o m m a n d B u tto n ) приводит к возникновению события C lic k объекта C o m m a n d B u tto n . Можно создать код, который будет выполняться при возникновении определенного события. Некоторые действия приводят к возникновению сразу нескольких событий. Напри­ мер, щелчок на кнопке со стрелкой, направленной вверх, в элементе управления S p in B utton приведет к возникновению события S p in U p и события C hange. После того как пользовательское диалоговое окно будет отображено с помощью метода Show, Excel сгенерирует события I n i t i a l i z e и A c t i v a t e объекта U s e rF o rm . (На самом деле событие I n i t i a l i z e генерируется после загрузки объекта U s e rF o rm в память и до его фактического отображения.) Перекрестная ссылка В Excel также поддерживаются события, связанные с объектами S heet (Лист), C h a rt (Диаграмма) и T h isW o rkb o o k (ЭтаКнига). Эти события будут подробно рассмотрены в главе 18. Часть IV. Пользовательские формы 428 Получение дополнительных сведений о событиях Для того чтобы получить информацию о событиях, которые генерируются конкрет­ ным элементом управления, выполните следующие действия. 1. Добавьте элемент управления в пользовательское диалоговое окно. 2. Дважды щелкните на элементе управления, чтобы открыть модуль кода для объ­ екта U s e rF o rm . VBE вставит пустую процедуру обработки события, принятого по умолчанию. 3. Щелкните на раскрывающемся списке в правом верхнем углу окна модуля и про­ смотрите полный список событий, которые поддерживаются текущим элементом управления. На рис. 13.12 показан список событий для элемента управления C h e c k B o x . 4. Выберите событие из списка, и VBE создаст пустой обработчик события. - lo t x l ■13 £Ut ErJrt View Insert ■A AH Format Debug Bun 5 > i 0 3 (J Д в В и Д Ш Й (POfMaker-xU) it) ^ PUP7TR1AL (pup/jdam ) Й | $ VBAProject {KRSOHMJaSB) V S/Wt 1(Iki 1) ЭтлКнига ‘' а Tools ы% AiM-lro jf J Window & №2,0 Private Sub CheckBox2_Click() End Sub____________________ Private Sub CloseButton_Click() Unload UserForml End Sub__ Private Sub OKButtonClickO Dim NextRow As Long ' Активизация листа Sheets("Лист1").Activate ' Определение следующей пустой строки NextRow = _ Application.WorksheetFunction.CountA(Range("A:A")) ' Передача имени Cells(NextRow, 1) = TextName.Text ' Передача пола If OptionMale Then Cells(NextRow, 2) = "Мужчина" If OptionFemale Then Cells(NextRow, 2) = "Женщина" If OptionUnknown Then Cells(NextRow, 2) = "Другое” ' Очистка элементов управления для следующих записей TextName.Text = "" OptionUnknown = True Рис. 13.12. Список событий для элемента управления CheckBox Примечание Для получения дополнительных сведений о событии обратитесь к интерак­ тивной справочной системе. Здесь же можно найти описание событий, под­ держиваемых тем или иным элементом управления. После нахождения со­ бытия для объекта убедитесь в том, что отображается содержание справоч­ ной системы. Здесь можно увидеть список всех других событий для объекта. Предупреждение Имя процедуры обработки событий включает имя объекта, который сгене­ рировал событие. Таким образом, если изменить имя элемента управления, придется внести соответствующие изменения и в имя процедуры обработки события. Имя процедуры не изменяется автоматически! Чтобы облегчить работу, присвойте описательные имена элементам управления до того, как приступите к созданию процедуры обработки соответствующих событий. Глава 13. Работа с пользовательскими формами 429 События объекта U s e r F o r m Несколько событий непосредственно связано с отображением и выгрузкой объекта UserForm. • Initialize. Происходит перед загрузкой и отображением формы UserForm. Не происходит, если объект UserForm до этого был скрыт. • Activate. Происходит в момент активизации объекта UserForm. • Deactivate. Происходит в момент деактивизации объекта UserForm. Не про­ исходит при сокрытии формы UserForm. • QueryClose. Происходит перед выгрузкой объекта UserForm. • Terminate. Происходит после выгрузки объекта UserForm. Примечание Важно правильно выбрать подходящее событие для процедуры обработки событий, а также проанализировать порядок выполнения событий. Исполь­ зование метода Show приводит к возникновению событий I n i t i a l i z e и A c ­ t i v a t e (в указанном порядке). Применение команды Load приводит к вызо­ ву события I n i t i a l i z e . Команда U n lo a d вызывает события Q u eryC lo se и T e rm in a te (в указанном порядке). Метод H id e не приводит к вызову ка­ ких-либо событий. Компакт-диск На прилагаемом компакт-диске находится рабочая книга u s e rfo rm e v e n ts .x ls m , которая управляет описанными событиями и отображает в момент возникновения события специальное сообщение. Если изучение событий объекта U serF orm вызывает у вас затруднения, то, проанализиро­ вав код этого примера, вы получите ответы на многие вопросы. События элемента управления S p i n B u t t o n Для того чтобы разобраться в концепции событий, в этом разделе мы подробно рас­ смотрим события, связанные с элементом управления SpinButton. Компакт-диск На прилагаемом компакт-диске содержится рабочая книга u s e rfo rm e v e n ts .x ls m , которая демонстрирует применение событий, генерируемых объектами S p in B u tto n и U serForm (первый содержится во втором). Рабо­ чая книга включает несколько процедур обработки событий — по одной для каждого события элемента управления S p in B u tto n и объекта userForm . Каждая из этих процедур создает окно сообщения, которое указывает на возникновение соответствующего события. В табл. 13.1 перечислены события элемента управления SpinButton. Часть IV. Пользовательские формы 430 Таблица 13.1. События элемента управления S p in B u tto n Событие Описание A fte rU p d a te Происходит после того, как элемент управления изменяется с по­ мощью пользовательского интерфейса Происходит в процессе выполнения операции перетаскивания объекта Происходит перед тем, как пользователь отпустит перетаскиваемый объект или скопирует его из буфера обмена Происходит перед изменением элемента управления Происходит в момент изменения свойства V alue Происходит перед тем, как элемент управления S p in B u tto n будет активизирован после другого элемента управления этой же формы BeforeD ragO ver B eforeD ropO rP aste B eforeU pdate Change E n te r UserForm E rro r E x it KeyDown KeyPress KeyUp SpinDown SpinUp Происходит в момент обнаружения элементом управления ошибки. При этом элемент управления не может передать сведения об ошибке вызывающей программе Происходит непосредственно перед деактивизацией элемента управления с последующей активизацией другого элемента управ­ ления текущей формы Происходит, когда пользователь нажимает клавишу, и активизиру­ ется объект Происходит, когда пользователь нажимает клавишу на алфавитноцифровой клавиатуре Происходит, когда пользователь отпускает клавишу, а объект оста­ ется активным Происходит, когда пользователь щелкает на нижней (или левой) кнопке элемента управления S p in B u tto n Происходит, когда пользователь щелкает на верхней (или правой) кнопке элемента управления S p in B u tto n Пользователь может управлять объектом S p i n B u t t o n с помощью мыши или (если элемент управления активен) клавиш управления курсором. События мыши Когда пользователь щелкает мышью на верхней кнопке элемента управления S p in ­ B u t t o n , происходят следующие события: 1) E n t e r (генерируется только в том случае, если элемент управления неактивен); 2) Change; 3) SpinU p. События клавиатуры Пользователь может нажать клавишу <ТаЬ> для того, чтобы сделать активным эле­ мент управления S p in B u tto n . Только после этого можно использовать клавиши управления курсором для изменения значения элемента управления. Если все именно так и происходит, то события генерируются в следующем порядке: Глава 13. Работа с пользовательскими формами 431 1) E n t e r ; 2) KeyDown; 3) C h a n g e; 4) S p in U p (или S p in D o w n ); 5) K eyUp. События, генерируемые кодом Элемент управления S p i n B u t t o n может изменяться в коде VBA, что также прово­ цирует возникновение соответствующих событий. Например, представленный далее оператор устанавливает свойство V a l u e элемента управления S p i n B u t t o n l равным О, а это приводит к возникновению события C h a n g e . Такой результат достигается только в том случае, если исходное свойство V a l u e не равно нулю. S p in B u tto n l. V a lu e = О Вы вправе предположить, что выполнить отмену генерирования событий можно, ус­ тановив свойство E n a b l e E v e n t s объекта A p p l i c a t i o n равным значению F a l s e . К сожалению, это свойство поддерживается только объектами, которые являются “истинными” в Excel: W o rk b o o k , W o r k s h e e t и C h a r t . Совместное использование элементов управления SpinButton И T e x t B o x Элемент управления S p i n B u t t o n имеет свойство V a l u e , но не может отображать значение этого свойства. В большинстве случаев требуется, чтобы пользователь мог из­ менить значение элемента управления S p i n B u t t o n непосредственно, а не многократно щелкая на элементе управления. Эффективным решением может стать объединение ЯЯЯЙМИта элемента управления S p i n B u t t o n с элементом управукажитеучение между i иioo: ления T e x t B o x , что позволяет пользователю вводить — je| значение элемента управления S p i n B u t t o n непосред- I _____________________________ ственно, используя для этого поле элемента управления Рис. 13.13. Комбинирование элеT extB ox. Кроме того, щелчок на элементе управления ментов управления S p in B u tton S p in B u tt o n позволит изменить значение, отображае- MTextBox мое в элементе управления T e x t B o x . На рис. 13.13 приведен простой пример. Свойство M in элемента управления S p i n ­ B u tto n имеет значение 1, а свойство Мах — значение 100. Таким образом, щелчок на одной из стрелок элемента управления S p i n B u t t o n приведет к изменению значения в пределах от 1 до 100. Компакт-диск Рабочая книга, включающая рассматриваемый пример, доступна на прила­ гаемом компакт-диске в файле s p in b u tto n and te x tb o x .x ls m . Код, реализующий “связывание” элементов управления S p i n B u t t o n и T e x t B o x , достаточно прост. В целом все сводится к созданию процедур обработки событий, кото­ рые будут синхронизировать свойство V a l u e элемента управления S p i n B u t t o n и свойство T e x t элемента управления T e x t B o x . 432 Часть IV. Пользовательские формы Представленная далее процедура выполняется каждый раз при возникновении собы­ тия C ha ng e элемента управления S p in B u t t o n . Таким образом, процедура выполняет­ ся тогда, когда пользователь щелкает на элементе управления S p in B u t t o n или изменя­ ет его значение, нажав одну из клавиш управления курсором. P r iv a t e Sub S p in B u tto n l_ C h a n g e () T e x t B o x l. T e x t = S p in B u tt o n l.V a lu e End Sub Процедура просто приравнивает значение свойства V a lu e элемента управления S p i n B u t t o n к свойству T e x t элемента управления T e x t B ox. В данном случае эле­ менты управления имеют имена, заданные по умолчанию ( S p i n B u t t o n l и T e x tB o x l) . Если пользователь введет значение непосредственно в элемент управления T e x tB o x , то будет сгенерировано событие C hange, после чего должен выполняться следующий код. P r iv a t e Sub T e x tB o x l_ C h a n g e () NewVal = V a l( T e x t B o x l. T e x t ) I f NewVal >= S p in B u tt o n l.M in And _ NewVal <= S p in B u t t o n l. Max Then _ S p in B u tt o n l.V a lu e = NewVal End Sub Эта процедура начинается с вызова функции VBA V a l, которая преобразует текст элемента управления T e x t B o x в числовое значение (если элемент управления T e x tB o x содержит строку, то функция V a l возвращает значение 0). Следующий оператор опре­ деляет, попадает ли значение в указанный диапазон допустимых значений. Если это так, то свойство V a lu e элемента управления S p i n B u t t o n устанавливается равным значе­ нию, которое введено в поле элемента управления T e x tB o x . Пример организован таким образом, что щелчок на кнопке ОК (которая называется O K B u tto n ) передает значение элемента управления S p i n B u t t o n в активную ячейку. Процедура обработки события C l i c k элемента управления C o m m a n d B u tto n выглядит следующим образом. P r iv a t e Sub O K B u tto n _ C lic k () ' Введите значение в а ктивную я ч е й ку I f C S tr ( S p in B u tto n l.V a lu e ) = T e x t B o x l. T e x t Then A c t iv e C e ll = S p in B u tt o n l.V a lu e U n lo a d Me E ls e MsgBox "Н еправильное з н а ч е н и е .", v b C r i t i c a l T e x t B o x l. S e tF o cus T e x t B o x l. S e lS t a r t = 0 T e x t B o x l. S e lL e n g th = L e n ( T e x tB o x l. T e x t ) End I f End Sub Данная процедура выполняет последнюю проверку: анализируются текст, введенный в поле элемента управления T e x tB o x , и значения элемента управления S p in B u tt o n . Такая процедура обрабатывает ситуации неверного ввода данных. Например, если поль­ зователь введет в поле элемента управления T e x tB o x текст Зг, то значение элемента управления S p i n B u t t o n не изменится, а результат, который помещается в активную ячейку, будет отличным от ожидаемого. Обратите внимание, что значение свойства V a lu e элемента управления S p i n B u t t o n преобразуется в строку с помощью функции C S tr . Это позволяет предотвратить ошибку, которая возникает, когда числовое значение сравнивается с текстовым. Если значение элемента управления S p i n B u t t o n не соот­ Глава 13. Работа с пользовательскими формами 433 ветствует содержимому элемента управления T e x tB o x , то на экране отображается спе­ циальное сообщение. Причем объект T e x tB o x активен, а его содержимое — выделено (с помощью свойств S e l S t a r t и S e lL e n g th ) . Таким образом, пользователю проще исправить неправильные значения. Освойстве T ag Каждый объект U serForm и каждый элемент управления имеет свойство Tag. Оно не представляет конечные данные и по умолчанию не имеет значения. Свойство Tag мож­ но использовать для хранения информации, которая будет применена в программе. Например, можно создать набор элементов управления T e x tB o x в пользователь­ ском диалоговом окне. От пользователя требуется ввести текст только в некоторые из них. В отдельные поля вводить текст необязательно. Можно применять свойство Tag для идентификации полей, которые нужно заполнять. В таком случае значение свойст­ ваTag — это строка, например, R e q u ire d . Поэтому при написании кода обработки вве­ денных пользователем данных можно ссылаться на свойство Tag. Приведенный ниже пример представляет собой функцию, которая проверяет все элементы управления T e x tB o x объекта U se rF o rm l и возвращает количество пустых текстовых полей, которые “ требуют” ввода информации. Function Em ptyC ount () Dim c t l As C o n tr o l Em ptyCount= 0 For Each c t l I n U s e r F o r m l. C o n tr o ls I f T y p e N a m e (c tl) = "T e x tB o x " Then I f c t l . T a g = "R e q u ire d " Then I f c t l . T e x t = " " Then Em ptyC ount = Em ptyC ount + 1 End I f End I f End I f Next c t l End F u n c tio n Работая с пользовательскими диалоговыми окнами, можно придумать другое дос­ тойное применение для свойства Tag. Ссылка на элементы управления пользовательского диалогового окна При работе с элементами управления, находящимися в форме U se г Form , код VBA обычно содержится в модуле кода объекта U se г Form . Кроме того, на элементы управ­ ления диалогового окна можно ссылаться из модуля кода VBA общего назначения. Для выполнения этой задачи необходимо задать правильную ссылку на элемент управления, указав имя объекта U se г Form . В качестве примера рассмотрим процедуру, которая вве­ дена в модуле кода VBA. Эта процедура отображает пользовательское диалоговое окно, которое называется U s e r F o r m l. Sub GetData () U se rF o rm l. Show End Sub 434 Часть IV. Пользовательские формы Предполагается, что в диалоговом окне U s e r F o r m l содержится текстовое поле ( T e x t B o x l) . Вам же необходимо указать значение текстового поля по умолчанию. Про­ цедуру можно изменить следующим образом. Sub G e t D a t a () U s e rF o rm l. T e x t B o x l. V a lu e = "Джон Доу" U s e rF o rm l. Show End Sub Еще одним способом установки значения по умолчанию является использование со­ бытия I n i t i a l i z e объекта U s e rF o rm . Можно написать код процедуры U s e rF o r m _ I n i t i a l i z e , который будет располагаться в модуле кода диалогового окна. Ниже представлен соответствующий пример. P r iv a t e Sub U s e r F o r m _ I n i t i a li z e () T e x t B o x l. V a lu e = "Джон Доу" End Sub Обратите внимание, что при обращении к элементу управления из модуля кода диа­ логового окна необязательно вводить в ссылку имя объекта U se г Form . Подобное опре­ деление ссылок на элементы управления имеет свое преимущество: всегда можно вос­ пользоваться средством A u to L i s t M em ber, которое позволяет выбирать имена эле­ ментов управления из раскрывающегося списка. Совет Вместо того чтобы использовать фактическое имя объекта UserForm, предпоч­ тительнее применить имя Me. В противном случае, если имя объекта UserForm изменится, вам не придется изменять все ссылки (с его участием) в коде. Использование коллекций элементов управления Элементы управления пользовательских диалоговых окон образуют отдельную кол­ лекцию. Например, следующий оператор отображает количество элементов управле­ ния в форме U s e rF o rm l: MsgBox U s e rF o rm l. C o n t r o ls . C ount В VBA не поддерживаются коллекции для каждого типа элемента управления. Напри­ мер, не существует коллекции элементов управления CommandButton. Но тип элемента управления можно определить с помощью функции TypeName. Следующая процедура ис­ пользует структуру F o r Each для циклического просмотра элементов коллекции Con­ t r o l s . В результате отображается количество элементов управления CommandButton, которые входят в коллекцию элементов управления объекта U serF orm l. Sub C o u n tB u tto n s () Dim cbC ount As I n t e g e r Dim c t l as C o n tr o l cbC ount = 0 F o r Each c t l I n U s e rF o rm l. C o n tr o ls I f T y p e N a m e (c tl) = "Com m andButton" Then _ cbC ount = cbC ount + 1 N e xt c t l MsgBox cbC ount End Sub Глава 13. Работа с пользовательскими формами 435 Настройка панели инструментов Toolbox Если объект U s e r Form активен в редакторе VBE, на панели Toolbox отображаются элементы управления, которые можно добавить в пользовательское диалоговое окно. Вэтом разделе рассматриваются способы настройки панели Toolbox. Добавление новых страниц Панель Toolbox изначально содержит одну вкладку. Щелкните на ней правой кноп­ кой мыши и в контекстном меню выберите параметр New Page (Добавить страницу), чтобы добавить новую вкладку на панель Toolbox. Кроме того, можно изменить текст, который отображается на вкладке. Для этого выберите параметр Rename (Переимено­ вать) из контекстного меню. Настройка или комбинирование элементов управления Рекомендуется предварительно настроить элементы управления и сохранить их для дальнейшего использования. Можно, например, создать элемент управления Command­ Button, который настроен на выполнение роли кнопки ОК. Можно изменять следую­ щие параметры кнопки: W idth (Ширина), H e ig h t (Высота), C a p tio n (Подпись), De­ fa u lt (По умолчанию) и Name (Имя). После этого перетащите модифицированный элемент управления Com m andButton на панель инструментов Toolbox. Это приведет к созданию элемента управления. Щелкните на элементе управления правой кнопкой мы­ ши, чтобы переименовать его или изменить значок. Также можно создать раздел панели Toolbox, в котором будет содержаться несколько элементов управления. Например, вы вправе создать два элемента управления Com­ mandButton, которые будут представлять кнопки ОК и Отмена. Настройте их так, как это необходимо. Затем выберите обе кнопки и переместите их на панель инструментов Toolbox. Впоследствии можно использовать новый элемент управления панели Toolbox для быстрого создания необходимых кнопок. Этот метод также применим к элементам управления, которые используются в качестве контейнера. Например, создайте элемент управления Frame и добавьте в него четыре мо­ дифицированных элемента управления O p tio n B u tto n (соответствующим образом рас­ положив их на форме). После этого перетащите элемент управления Frame на панель ин­ струментов Toolbox, чтобы создать модифицированный элемент управления Frame. © Совет Иногда нужно разместить модифицированные элементы управления на от­ дельной вкладке панели Toolbox. Таким образом, появляется возможность экспортировать вкладку панели Toolbox для совместного применения другими пользователями Excel. Для экспорта вкладки панели Toolbox щелкните на ней правой кнопкой мыши и выберите пункт меню Export Page (Экспорт вкладки). Компакт-диск На прилагаемом к книге компакт-диске находится страничный файл (под именем n e w c o n tr o ls .рад), который включает некоторые настроенные элементы управления. Можно импортировать этот файл в качестве новой вкладки окна Toolbox. Щелкните правой кнопкой мыши на вкладке и выбери­ те команду Import Page (Импортировать вкладку). После этого укажите рас- Часть IV. Пользовательские формы 436 положение страничного файла. В результате панель Toolbox будет напоми­ нать показанную на рис. 13.14. Новые элементы управления будут такими: изображение восклицательного знака, “критический” знак красной буквы х, изображение вопросительного знака, информационное изображение, кноп­ ки ОК и Отмена, элемент управления Frame, включающий четыре элемента управления O p tio n B u tto n , элементы управления T e x tB o x и S pinner, а также шесть элементов управления CheckBox. Рис. 13.14. В окне Toolbox появилась страница с новыми элементами управления Добавление элементов управления ActiveX В пользовательском диалоговом окне содержатся и другие элементы управления ActiveX, разработанные компанией Microsoft и независимыми производителями. Для то­ го чтобы добавить дополнительные элементы управления ActiveX на панель инструмен­ тов Toolbox, щелкните правой кнопкой мыши на ней и выберите пункт Additional Controls (Дополнительные элементы управления). В результате будет отображено диа­ логовое окно, показанное на рис. 13.15. В диалоговом окне Additional Controls содержатся все элементы управления ActiveX, установленные в системе. Выберите элементы управления, которые необходимо доба­ вить на панель инструментов. После этого щелкните на кнопке ОК для добавления знач­ ков каждого из выбранных элементов управления. Пре ду п режден ие Не все элементы управления ActiveX, установленные в системе, поддержи­ ваются пользовательскими диалоговыми окнами. Более того, большая их часть не поддерживается, к тому же некоторые элементы управления тре­ буют лицензии на использование в приложениях. Если лицензия отсутству­ ет, на экране появится сообщение об ошибке. Глава 13. Работа с пользовательскими формами 437 Additional Controls Available Controls: □ :-) VideoS oft FlexArray Control □ :-) VideoS oft FlexString Control □ adbanner Class OK 3 Z j □ Adobe Acrobat Control for ActiveX □ Axis Class HlBrowseButton Class □ CCR S lider. ccrpS lider □ COMNSView Class □ Contact Selector □ ContentVerifier.XlateCheckControl □ CoverEdDrl Control □ Cube Class .1.1............... - ...- ..................1 I Show zi Ш Г" Selected Items Only BrowseButton Class-------------------------------------------------------- — -*---------------------— Location C:\Program Files\Nero\Nero 7\Nero WaveEditor\Controls.dll Рис. 13.15. В диалоговом окне Additional Controls можно найти дополнительные элементы управле­ ния ActiveX. Создание шаблонов диалоговых окон Зачастую при создании пользовательского диалогового окна каждый раз на форму добавляются одни и те же элементы управления. Например, все пользовательские диало­ говые окна имеют два элемента управления CommandButton, используемых в качестве кнопок О К и Отмена. В предыдущем разделе рассматривались методы комбинирования элементов управления с целью получения одного элемента управления, обладающего функциями двух. Еще одной программной уловкой может служить шаблон диалогового окна, который при необходимости импортируется для последующего создания на его ос­ нове других проектов. Преимущество шаблонного подхода заключается в следующем: процедуры обработки событий сохраняются вместе с шаблоном. Начните с создания пользовательского диалогового окна, содержащего все элементы управления и настройки, которые необходимо повторно использовать в других проектах. После этого убедитесь, что диалоговое окно выделено. Выберите команду File^ Export File (Файл^Экспорт файла) (или нажмите комбинацию клавиш <Ctrl+E>). После этого на экране появится запрос на ввод имени файла. Затем для создания проекта на основе шаблона выполните команду File ^Import File (Файл^Импорт файла), чтобы загрузить ранее сохраненное диалоговое окно. Имитация диалоговых окон Excel Внешний вид и поведение диалоговых окон Windows изменяются от программы к программе. При разработке приложений для Excel рекомендуется придерживаться стиля диалоговых окон Excel. Наилучшим методом изучения эффективных способов создания диалоговых окон явля­ ется повторное создание одного из стандартных диалоговых окон Excel. Например, удосто­ верьтесь, что вы правильно определили комбинации клавиш и активизировали элементы управления. Для создания копии одного диалогового окна Excel следует протестировать его в различных условиях. Один только анализ диалоговых окон Excel поможет улучшить позна­ ния в вопросах структуры окон и методов создания элементов управления. Со временем вы убедитесь, что невозможно повторить отдельные диалоговые окна Excel даже с помощью VBA. 438 Часть IV. Пользовательские формы Вопросы для самоконтроля Прежде чем предоставить самостоятельно созданное диалоговое окно на суд зрите­ лей, необходимо удостовериться, что оно работает правильно. Ниже перечислены вопро­ сы, ответы на которые позволяют выявить потенциальную проблему и ее причину. • • Все ли элементы управления одного типа имеют одинаковые размеры? • Равномерно ли распределены элементы управления? • Не возникают ли у зрителей трудности при просмотре диалогового окна? Если возникают, то следует перегруппировать элементы управления с помощью эле­ мента управления M u l t i Раде. • Ко всем ли элементам управления можно получить доступ с помощью клавиатуры? • Не повторяются ли комбинации клавиш? • Правильно ли установлен порядок активизации элементов управления? • Выполнит ли код VBA необходимые действия, если пользователь нажмет клавишу <Esc> или щелкнет на кнопке Отмена? • Нет ли в тексте ошибок? • Является ли правильным текст заголовка диалогового окна? • Насколько правильно будет отображаться диалоговое окно при всех разрешениях экрана? • Обеспечено ли логическое группирование элементов управления (в соответствии с выполняемой функцией)? • Ограничивают ли элементы управления S c r o l l B a r и S p i n B u t t o n диапазон допустимых значений? • Использутся ли в форме U se г F o rm элементы управления, которые могут быть не установлены в вашей системе? • Правильно ли настроены элементы управления L i s t B o x ( S i n g l e , M u l t i и E x te n d e d )? За дополнительными сведениями об элементах управления L i s t ­ B o x обратитесь к главе 14. Глава Примеры пользовательских форм Вэтой главе... ♦ ♦ ♦ ♦ ♦ ♦ ♦ Создание “меню” с помощью объекта Use г Form Выбор диапазона в пользовательской форме Создание заставки Отключение кнопки закрытия пользовательского диалогового окна Изменение размера диалогового окна Масштабирование и прокрутка листа в пользовательском диалоговом окне Использование элемента управления L is tB o x ♦ Применение элемента управления M u l t i Раде ♦ Использование внешних элементов управления ♦ Анимация элемента управления L a b e l В данной главе приведены полезные и информативные примеры использования поль­ зовательских диалоговых окон. Создание “меню” с помощью объекта u s e rF o rm Иногда требуется применить пользовательское диалоговое окно в качестве меню. Вданном разделе предлагаются два способа получения необходимого результата: с по­ мощью элементов управления C o m m a n d B u tto n и с помощью элемента управления L istB o x. Часть IV. Пользовательские формы 440 Перекрестная ссылка В главе 15 приведены примеры более сложных приемов работы с формами U se r F o r m . Использование элементов управления C o m m a n d B u t t o n На рис. 14.1 показан пример объекта U s e rF o rm , в котором использован элемент управления C o m m a n d B u tto n в качестве простого меню. Создание такого меню не вы­ зывает особых трудностей, а код, обеспечивающий работу пользовательского диалогово­ го окна, предельно прост. Каждый элемент управления C o m m a n d B u tto n имеет собст­ венную процедуру обработки событий. Например, представленная ниже процедура вы­ полняется после щелчка на кнопке C o m m a n d B u tto n l. P r i v a t e Sub C o m m a n d B u t t o n l _ C l i c k () C a ll M acrol U n l o a d Me End Sub Эта процедура приводит к вызову макроса M a c r o l и закрытию диалогового окна U s e rF o rm . После щелчка на других кнопках (отличных от C o m m a n d B u tto n l) вызы­ ваются похожие процедуры обработки событий. Использование элемента управления L i s t B o x На рис. 14.2 показан пример создания меню с помощью элемента управления L is t B o x . Перед отображением пользовательского диалогового окна вызывается проце­ дура обработки события I n i t i a l i z e . В приведенной ниже процедуре используется метод A d d I t e m для добавления шести опций в элемент управления L is t B o x . P r i v a t e Sub U s e r F o r m _ I n i t i a l i z e () W it h L i s t B o x l . A d d l t e m "Макрос1" . A d d l t e m "Макрос2" . A d d l t e m "МакросЗ" . A d d l t e m "Макрос4" . A d d l t e m "МакросБ" . A d d l t e m "Макросб" End W it h End Sub Рис. 14.1. В диалоговом окне отображается меню, в качестве пунктов которого используются элементы управления CommandButton Рис. 14.2. В этом диалоговом окне отображается меню, составленное на основе элементов управления ListBox Кроме того, процедура обработки события привязывается к кнопке Выполнить (Execute) для обработки щелчков на ней. Глава 14. Примеры пользовательских форм 441 Private Sub E x e c u te B u tto n _ C lic k () S e le c t Case L i s t B o x l . L is t ln d e x Case -1 MsgBox "Выберите макрос из с п и с ка . E x i t Sub Case 0 Макрос1 Case 1 Макрос2 Case 2 МакросЗ Case 3 Макрос4 Case 4 Макросб Case 5 Макросб End S e le c t Unload Me i Sub Данная процедура проверяет значение свойства L i s t l n d e x элемента управления L is tB o x , чтобы определить, какой элемент выбран в списке (если свойство L is t ln d e x равно -1 , то не выбран ни один из элементов). После этого запускается со­ ответствующий макрос. © © Компакт-диск Два примера, рассмотренных в этом разделе, находятся на прилагаемом к книге компакт-диске в файле u s e r f orm menus . xlsm . Перекрестная ссылка В главе 15 рассматривается похожий пример, в котором объект UserForm применяется для имитации панели инструментов. Выбор диапазона в пользовательской форме Некоторые встроенные диалоговые окна Excel предоставляют пользователю возмож­ ность выбирать диапазон. Например, диалоговое окно Подбор параметра (Goal Seek), для вызова которого достаточо выполнить команду Данные1^Работа с данными^ Анализ “что если’,с>Подбор параметра (Data^Data Tools^What-If Analysis^Goal Seek) запрашивает у пользователя два диапазона. Пользователь может или ввести имя диапазона непосредственно, или применить мышь для выделения диапазона на листе. Пользовательское диалоговое окно также обеспечивает подобную функциональность. Это достигается с помощью элемента управления R e f E d i t . Данный элемент выглядит иначе, чем элемент выбора диапазона во встроенных диалоговых окнах Excel, однако ра­ ботает точно так же. Если пользователь щелкнет на небольшой кнопке в правой части элемента управления, то диалоговое окно временно исчезнет, а на экране будет отобра­ жен небольшой указатель выбора диапазона (именно так все происходит при использо­ вании встроенного диалогового окна Excel). Примечание К сожалению, элемент управления R e fE d it не позволяет использовать специ­ альные клавиши при выделении диапазона (например, невозможно выделить ячейки до конца столбца, нажав комбинацию клавиш <Shift+Nl>). Кроме того, по­ сле щелчка мышью на маленькой кнопке в правой части элемента управления (для временного сокрытия диалогового окна) можно применять только выделе­ ния с помощью мыши. Клавиатуру в этом случае применять нельзя. 442 Часть IV. Пользовательские формы На рис. 14.3 представлено пользовательское диалоговое окно с добавленным элемен­ том управления R e f E d it. Это диалоговое окно выполняет простую математическую операцию над всеми не содержащими формул и непустыми ячейками указанного диапа­ зона. Выполняемая операция задается активным переключателем O p tio n B u tto n . 73 3 -9 -53 41 -22 93 -25 76 Выделение диапазона 63 -97 *1 62 Выберите диапазон: -41 -79 -6 -51 77 -55 -24 -21 $8$4:$D$10| Операция <? Сложить С 37 Вычесть умножить С Разделить -97 Операнд: ЛВИГС шяшя Рис. 14.3. С помощью элемента управления R e fE d it можно выбрать диапазон Компакт-диск Рассматриваемый в этом разделе пример находится на прилагаемом к кни­ ге компакт-диске в файле ra n g e s e le c t i o n demo. xlsm . Ниже изложены соображения, о которых следует помнить при использовании эле­ мента управления R e f E d i t . • Элемент управления R e f E d i t возвращает текстовую строку, которая представля­ ет выбранный диапазон. Можно преобразовать эту строку в объект R ange. Для этого используется следующий оператор: S e t UserRange = R a n g e (R e fE d it1 . T e x t ) • Удачной практикой считается инициализация элемента управления R e f E d i t для представления текущего выделения. Для этого в процедуре U s e r F o r m _ In it i a l i z e воспользуйтесь таким оператором: R e f E d i t l . T e x t = A c tiv e W in d o w . R a n g e S e le c tio n .A d d re s s • Для достижения наилучших результатов не помещайте элемент управления R e f E d i t внутри элемента F ra m e либо M u lt iP a g e . Это может привести к сбою в работе Excel. • Элемент управления R e f E d i t не всегда возвращает действительный диапазон. Выделение диапазона указателем мыши — это один из способов присвоения зна­ чения данному элементу управления. Пользователь может ввести в поле любой текст, а также отредактировать или удалить уже отображаемый текст. Таким < Глава 14. Примеры пользовательских форм 443 зом, предварительно необходимо убедиться, что диапазон является допустимым. Следующий код — это пример одного из способов проверки допустимости вве­ денного значения. Если определено, что значение неправильное, то пользователю выдается сообщение, а элемент управления R ef E d i t становится активным, пре­ доставляя возможность ввести корректный диапазон. On E r r o r Resume N e xt S e t UserRange = R a n g e ( R e fE d itl. T e x t) I f E rr.N u m b e r <> 0 Then MsgBox "Неправильный диапазон" R e f E d i t l . S e tF o cus E x i t Sub End I f On E r r o r GoTo 0 • Пользователь может щелкнуть на вкладке одного из листов при выборе диапазона, применив элемент управления R ef E d it. Поэтому не всегда выбранный диапазон находится на активном рабочем листе. Если пользователем выбран другой лист, то адрес диапазона указывается после имени листа, на котором этот диапазон нахо­ дится. Пример приведен ниже. Л и с т 2 ! $А$1: $С$4 • Если необходимо получить от пользователя выделение в виде одной ячейки, то можно указать верхнюю левую ячейку выделенного диапазона. В данном случае воспользуйтесь следующим оператором: Set O n e C e ll = R a n g e ( R e f E d i t l . T e x t ) . Ran ge ( " A l ") © Перекрестная ссылка Как отмечалось в главе 12, для выделения диапазона можно воспользовать­ ся методом Excel In p u tB o x . Создание заставки Некоторые разработчики предпочитают отображать определенную вступительную информацию при запуске приложения. Эта методика называется заставкой. Без сомне­ ния, все пользователи видели заставку Excel, которая отображается несколько секунд при запуске программы. В приложении Excel заставку можно создать с помощью пользовательского диалого­ вого окна. В приведенном ниже примере реализуется автоматическое отображение за­ ставки, которое исчезает по истечении пяти секунд. Компакт-диск иЦу На прилагаемом компакт-диске находится рабочая книга, демонстрирующая описанную в разделе процедуру. Соответствующий файл называется s p la s h s c re e n .x ls m . Для создания заставки выполните следующие действия. 1. Создайте рабочую книгу. 2. Активизируйте редактор Visual Basic Editor (VBE) и вставьте пользовательское диалоговое окно в проект. Код в этом примере предполагает, что объект U s e rF o rm называется U s e r F o r m l. 444 Часть IV. Пользовательские формы 3. Поместите любые необходимые элементы управления в только что созданное диалоговое окно U s e rF o rm l. Например, вам может понадобиться расположить элемент управления Im age, ко­ торый будет содержать логотип компании. На рис. 14.4 показан пример такого диалогового окна. A B D Г C E ! G F H 1 J К L M Отображение заставки X Y Z Pet S u p p ly Customer 11 12 13 f 14 15 1 16 17 18 Tracking Sysftrn & 19 20 21 22 f ? Copyright 2010. Company Confidential 23 24 25 26 | > И Sheet 1 / Sheet2 K'J .........................- eh i ................ . _ .j >ii Рис. 14.4. Эта заставка на короткое время появляется на экране после открытия рабочей книги 4. Вставьте следующую процедуру в модуль кода для объекта ЭтаКнига (ThisWorkbook). P r i v a t e Sub W o r k b o o k _ O p e n () U s e r F o r m l . Show End Sub 5. Вставьте приведенную далее процедуру в модуль кода для объекта U se rF o rm l (эта процедура обеспечивает пятисекундную задержку). Если нужно другое время задержки, измените значение аргумента функции Tim e V a lu e . P r i v a t e Sub U s e r F o r m _ A c t i v a t e () A p p l i c a t i o n . OnTime Now + _ T i m e V a l u e ( " 0 0 : 0 0 : 0 5 " ) , " K i ll T h e F o r m " End Sub 6. В общий модуль VBA вставьте следующую процедуру. P r i v a t e Sub K i l l T h e F o r m () U n lo a d U serF orm l End Sub При открытии рабочей книги будет выполнена процедура W o rkbo ok_O p e n и появится диалоговое окно U s e rF o rm (п. 4). В этот момент генерируется собы­ тие A c t i v a t e , которое приводит к выполнению процедуры U s e rF o rm A c t i v a t e (п. 5). Данная процедура использует метод O nT im e объекта Ap­ p l i c a t i o n для выполнения процедуры K i l l T h e F o r m в определенный момент 1 ава 14. Примеры пользовательских форм 445 времени. Однако предварительно определена задержка в пять секунд с момента возникновения события A c t i v a t e . Процедура K i l l T he F orm просто выгружает диалоговое окно U s e rF o rm из памяти. 7. В качестве необязательного действия можно добавить элемент управления C o m m a n d B u tto n с именем C ane e l B u t t o n , установить его свойство C a n c e l равным T r u e и добавить представленную ниже процедуру обработки события в модуль кода формы U s e rF o rm . P r iv a t e Sub C a n c e lB u tt o n _ C lic k () K illT h e F o r m End Sub Таким образом, пользователь сможет закрыть заставку, прежде чем пройдет ука­ занное время задержки. Окно будет закрыто также в результате нажатия клавиши <Esc>. Эту небольшую кнопку можно разместить за другим объектом, чтобы она не была видна. Jfflb Предупреждение М м Помните о том, что заставка не будет отображаться, если рабочая книга загружена не полностью. Другими словами, если нужно отобразить заставку только для того, чтобы пользователь не скучал во время загрузки рабочей книги, описанная выше методика не годится. £ПЬ Совет Ь Д Для того чтобы выполнить VBA-процедуру при открытии документа, нужно так отобразить пользовательское диалоговое окно в немодальном режиме, чтобы код продолжал выполняться. Для этого измените процедуру W orkbook Open следующим образом. P r iv a t e Sub W orkbook_O pen() U s e rF o rm l. Show vb M o d e le ss ' д р уго й код End Sub Отключение кнопки закрытия пользовательского диалогового окна Если пользовательское диалоговое окно уже отображено на экране, щелчок на кнопке Закрыть (Close) (в правом верхнем углу) приведет к выгрузке формы U s e rF o rm из па­ мяти. Иногда этого допускать нельзя. Например, иногда требуется, чтобы диалоговое окно U serF orm закрывалось только после щелчка на специальной кнопке Command­ Button. Несмотря на то что реально отключить кнопку Закрыть невозможно, вы впра­ ве предотвратить закрытие диалогового окна, вызванное щелчком на этой кнопке. Для этого воспользуйтесь обработчиком события Q u e r y C lo s e . Следующая процедура, которая расположена в модуле кода диалогового окна U s e r ­ Form, выполняется перед закрытием формы (т.е. в момент возникновения события QueryClose). Private Sub U serF orm _Q ue ryC lo se _ (Cancel As I n t e g e r , CloseMode As In te g e r ) I f CloseMode = vb F o rm C o n tro lM e n u Then Часть IV. Пользовательские формы 446 MsgBox "Щ елкните на кн о п ке ОК для закры тия формы." C an cel = T ru e End I f End Sub Процедура U s e r F o r m _ Q u e r y C lo s e использует два аргумента. Аргумент C lo s e ­ Mode содержит значение, которое указывает на причину возникновения события Query C lo s e . Если значение аргумента C lo se M o d e равно v b F o rm C o n tro lM e n u (встроенная константа), значит, пользователь щелкнул на кнопке Закрыть. В таком случае будет отобра­ жено сообщение; аргумент C a n c e l устанавливается равным T ru e , и форма не закрывается. Компакт-диск Рассматриваемый в этом разделе пример можно найти на прилагаемом к книге компакт-диске в файле q u e ry c lo s e demo. x ls m . Примечание Имейте в виду, что пользователь может нажать клавиши <Ctrl+Break>, пре­ кратив тем самым выполнение макроса. В рассматриваемом примере нажа­ тие клавиш <Ctrl+Break> во время отображения формы U serForm на экране приведет к тому, что пользовательское диалоговое окно будет закрыто. Во избежание этого выполните следующий оператор до отображения пользо­ вательского диалогового окна: A p p l i c a t i o n . E n a b le C a n ce lK e y = x lD is a b le d Прежде чем добавить этот оператор, удостоверьтесь, что в приложении нет ошибок. В противном случае возникает опасность формирования бесконеч­ ного цикла. Изменение размера диалогового окна Во многих приложениях используются окна, которые могут изменять собственные размеры. Например, высота диалогового окна Excel Найти и заменить (Find and Replace), которое отображается после выбора команды Главная ^Редактирование^ Найти и выделить1^Заменить (Home^Editing^Find & Select^Replace), увеличивается после щелчка на кнопке Параметры (Options). В рассматриваемом в этом разделе примере демонстрируется предоставление пользо­ вательскому диалоговому окну возможности динамически изменять свой размер. Изме­ нение размера диалогового окна осуществляется путем изменения значений свойств W id t h и H e i g h t объекта U s e rF o rm . Перекрестная ссылка Обратитесь к главе 15, в которой рассматривается пример формы User­ Form, размер которой изменяется путем перетаскивания нижнего правого угла окна. На рис. 14.5 показано первоначальное диалоговое окно, а на рис. 14.6 показано это же окно после щелчка на кнопке Параметры (Options). Обратите внимание на то, что над­ пись на кнопке изменяется в зависимости от размера диалогового окна. 447 лава 14. Примеры пользовательских форм Выберите распечатываемые листы, □ Ell 01 Выберите распечатываемые листы. [□ Лист! Ё ЛистЗ .1 Лист 2 □ Лист 4 □ Лист 5 — □ Листб zl Параметры » i | Рис. 14.5. Диалоговое окно, отображаемое в стандартном режиме □ □ □ ГЫст! ± Лист 2 « Параметры ЛистЗ Лист4 Лист 5 Листб — т Книжная ориентация |“ Печатать детку С Альбомная ориентация Рис. 14.6. Увеличенное диалоговое окно, отображающее дополнительные пара­ метры Создавая пользовательское диалоговое окно, определите его максимальный размер, чтобы получить доступ ко всем элементам управления. После этого воспользуйтесь проце­ дурой U s e r F o r m _ I n i t i a l i z e для установки размеров диалогового окна по умолчанию. В коде применяются две константы, определенные в верхней части модуля. Const SmallSize As Integer = 124 Const LargeSize As Integer = 164 Описанный пример предназначен для печати рабочих листов активной книги. Он позво­ ляет пользователю указать листы, которые необходимо распечатать. Ниже приведена про­ цедура обработки события, которая выполняется после щелчка на кнопке Параметры. Private Sub OptionsButton_Click () If OptionsButton.Caption = "Параметры >>" Then Me.Height = LargeSize OptionsButton.Caption = "<< Параметры" Else Me.Height = SmallSize OptionsButton.Caption = "Параметры >>" End I f End Sub Эта процедура проверяет значение свойства C a p t io n объекта C o m m a n d B u tto n иустанавливает значение свойства H e i g h t объекта U s e rF o rm в соответствии с полу­ ченным значением свойства C a p t io n . Примечание Если элементы управления не отображаются из-за того, что находятся за пределами границы диалогового окна, соответствующие этим элементам управления комбинации клавиш будут продолжать функционировать. В рас­ сматриваемом примере пользователь может нажать клавиши <Alt+L> (для выбора альбомной ориентации страницы), даже если соответствующий элемент управления не отображается на экране. Для блокирования доступа к невидимым элементам управления напишите код, который отключает эле­ менты управления, если они скрыты. Компакт-диск Рассматриваемый в этом разделе пример можно найти на прилагаемом к книге компакт-диске в файле change userform size. xlsm. 448 Часть IV. Пользовательские формы Масштабирование и прокрутка листа в пользовательском диалоговом окне Пример, приведенный в этом разделе, демонстрирует применение элемента управле­ ния S c r o l l B a r для прокрутки и масштабирования листа при активном диалоговом ок­ не. На рис. 14.7 отображен пример окна изменения масштаба рабочего листа (в диапазо­ не от 100 до 400%) с помощью элемента управления S c r o l l B a r , находящегося в верх­ ней части диалогового окна. Два элемента управления S c r o l l B a r в нижней части диалогового окна позволяют прокручивать лист по горизонтали и по вертикали. A B C D E F G H I J К L 5 97 297 99 225 441 480 432 466 375 439 261 6 149 421 498 239 417 271 91 20 472 18 228 111 9 7 96 372 176 82 375 78 483 263 251 172 8 139 ш ш ш явзгш тш 50 ■ j T* j **Г 52 468 259 205 81 193 426 287 230 9 265 97 173 147 219 293 99 132 491 59 363 10 404 08 25 107 361 307 390 348 406 270 438 11 164 42 70 157 35 218 425 49 236 212 231 12 174 208 121 141 335 339 226 450 376 295 250 102 13 251 45 7 147 223 233 315 188 242 394 402 253 14 273 133 107 279 405 159 30 475 257 360 265 431 15 320 124 498 331 362 327 407 148 258 233 265 265 16 178 304 383 452 244 258 56 380 219 271 481 427 17 56 174 11 140 16 389 130 209 178 55 140 263 18 122 24 188 209 140 224 145 437 285 375 80 163 19 311 130 214 170 98 48 264 473 414 455 202 11 20 309 11 390 7 315 386 358 348 271 182 126 288 487 108 473 362 129 424 328 324 321 371 315 185 н Рис. 14.7. Элементы управления ScrollBar позволяют прокручивать лист и изменять его масштаб К о м п а к т-д и с к Рассматриваемы й в этом разделе пример находится на прилагаемом к кни­ ге компакт-диске в файле zoom and s c r o l l s h e e t.x ls m . Просмотрев код этого примера, вы отметите для себя его простоту. Элементы управ­ ления инициализируются в процедуре U s e r F o r m _ I n i t i a l i z e , как показано ниже. P r iv a t e Sub U s e r F o r m _ I n i t i a li z e () L a b e lZ o o m .C a p tio n = A c tiv e W in d o w . Zoom & "%" ' М асш табирование W ith S c ro llB a rZ o o m .M in = 10 .Max = 400 .S m allC hange = 1 . LargeC hange = 10 .V a lu e = A ctive W in d o w .Z o o m End W ith ' Горизонтальная прокрутка W ith S c ro llB a rC o lu m n s .M in = 1 .Max = A c tiv e S h e e t.U s e d R a n g e . C olu m n s. C ount .V a lu e = A c tiv e W in d o w .S c ro llC o lu m n .LargeC hange = 25 .S m allC hange = 1 End W ith Глава 14. Примеры пользовательских форм ' В ертикальная 449 прокрутка W ith S c ro llB a rR o w s .M in = 1 .Max = A c tiv e S h e e t.U s e d R a n g e . Rows. C ount .V a lu e = A c tiv e W in d o w .S c ro llR o w .LargeC hange = 25 .S m allC hange = 1 End W ith End Sub Эта процедура позволяет устанавливать значения различных свойств элементов управления S c r o l l B a r . Значения определяются на основе данных, полученных из ак­ тивного окна. При использовании элемента управления S c r o l l B a r Zoom выполняется процедура S c r o l lB a r Z o o m _ C h a n g e (которая приведена ниже). Она устанавливает значение свойства Zoom объекта A c t iv e W in d o w равным значению свойства V a lu e элемента управления S c r o l l B a r . Кроме того, изменяется текст подписи, которая пред­ ставляет текущий масштаб рабочего листа. P rivate Sub S c ro llB a rZ o o m _ C h a n g e () W ith A c tiv e W in d o w .Zoom = S c ro llB a rZ o o m .V a lu e LabelZoom = .Zoom & "%" End W ith End Sub Прокрутка листа осуществляется с помощью двух процедур. Эти процедуры устанав­ ливают значение свойств S c r o l l R o w и S c r o l l C o lu m n s объекта A c t iv e W in d o w равными значениям свойств V a l u e элементов управления S c r o l l B a r . P rivate Sub S c ro llB a rC o lu m n s _ C h a n g e () A c tiv e W in d o w . S c ro llC o lu m n = S c ro llB a rC o lu m n s .V a lu e End Sub Private Sub S c ro llB a rR o w s _ C h a n g e () A c tiv e W in d o w .S c ro llR o w = S c ro llB a rR o w s .V a lu e End Sub Совет & В м есто события change в предыдущих процедурах лучше обратиться к с о ­ бытию s c r o l l . Разница заключается в том, что последнее событие наступа­ ет при прокрутке и масш табировании документа. Для использования собы ­ тия S c r o l l просто включите change в название процедуры s c r o l l . Использование элемента управления L is t B o x Элемент управления L i s t B o x довольно гибкий в использовании, но работа с ним может оказаться достаточно сложной. В данном разделе приведен ряд простых примеров распространенных методик использования элемента управления L i s t B o x . Примечание В большинстве случаев методы, описанные в этом разделе, могут приме­ няться и для работы с элементом управления ComboBox. 15Зак. 3107 Часть IV. Пользовательские формы 450 Ниже изложены рекомендации, о которых необходимо помнить при работе с элементом управления L i s t B o x . Примеры данного раздела наглядно иллюстрируют эти советы. • Опции списка элемента управления L i s t B o x могут извлекаться из диапазона ячеек (определяемого свойством R o w S o u r c e ) или добавляться с помощью VBA (для этого используется метод A d d lt e m ). • Элемент управления L i s t B o x может быть применен для выделения одной или нескольких опций. Соответствующее поведение определяется значением свойства M u ltiS e le c t. • Если элемент управления L i s t B o x не настроен на выделение нескольких опций, то значение элемента управления L i s t B o x может связываться с ячейкой листа с помощью свойства C o n t r o l S o u r c e . • Элемент управления L i s t B o x может отображаться без предварительно выбран­ ной опции (для этого необходимо установить свойство L i s t l n d e x равным -1 ). Но как только пользователь выделит одну из опций списка, отменить выделение будет невозможно. Исключение из этого правила— значение свойства M u l t i S e l e c t равно T r u e . • Элемент управления L i s t B o x может содержать несколько столбцов (что указы­ вается в свойстве C o lu m n C o u n t) и даже описательные заголовки (для этого ис­ пользуется свойство C o lu m n H e a d s). • Вертикальный размер элемента управления L i s t B o x , помещ енного в пользова­ тельское диалоговое окно, не всегда совпадает с вертикальным размером объекта U s e r F o r m на экране. • Опции списка элемента управления L i s t B o x могут отображаться в виде флаж­ ков, если разрешено выделение нескольких элементов, или в виде переключате­ лей, если поддерживается только единичное выделение. Это поведение определя­ ется значением свойства L i s t S t y l e . Для получения полной информации о свойствах и методах элемента управления L i s t B o x обратитесь к интерактивной справке. Добавление опций в элемент управления ListB ox Перед отображением пользовательского диалогового окна, которое содержит элемент управления L i s t B o x , следует заполнить элемент управления L i s t B o x необходимыми опциями. Элемент управления L i s t B o x заполняется на этапе разработки проекта по­ средством указания диапазона ячеек, которые содержат необходимы е данные. Его также можно заполнить на этапе выполнения, воспользовавшись кодом V B A для добавления всех опций списка. В двух примерах из настоящего раздела предполагается следующее: • используется диалоговое окно U s e r F o r m с именем U s e r F o r m l; • диалоговое окно U s e r F o r m l содержит элемент управления L i s t B o x , который называется L i s t B o x l ; • рабочая книга содержит лист Л и с т 1 , в диапазоне А 1:А 12 которого определены опции, отображаемые в элементе управления L i s t B o x . Глава 14. Примеры пользовательских форм 451 Добавление опций в элемент управления L i s t B o x на этапе разработки Для добавления опций в элемент управления L i s t B o x на этапе разработки необхо­ димо, чтобы они хранились в диапазоне ячеек рабочей книги. Воспользуйтесь свойством RowSource для указания диапазона, который содержит опции элемента управления L is tB o x . На рис. 14.8 показано окно Properties (Свойства) для элемента управления L is tB o x . Свойство R o w S o u rc e установлено равным Л и с т 1 ! A l : А12. Когда диалого­ вое окно U s e rF o rm отображается на экране, элемент управления L i s t B o x содержит двенадцать опций из этого диапазона. Опции добавляются в элемент управления L is tB o x на этапе разработки, сразу после того, как диапазон определяется в качестве значения свойства R o w S o u rc e . Ш Ш Ш т Январь ~ Март Май Монь Июль Летует 4 * т J. Рис. 14.8. Установка свойства RowSource на этапе разработки Предупреждение Удостоверьтесь, что в значении свойства RowSource присутствует имя листа. В противном случае элемент управления L is tB o x будет применять указанный диапазон в активном рабочем листе. Иногда следует идентифицировать диа­ пазон максимально точно, указав даже имя рабочей книги, например: [ b u d g e t . x ls x ] Л и ст1 !А 1 :А 1 2 Лучше всего сначала определить имя для диапазона, а затем включить его в состав разработанного кода. Это гарантирует использование требуемого диапазона, даже если были добавлены или удалены строки, не входящие в диапазон. Часть IV. Пользовательские формы 452 Добавление опций в элемент управления L i s t B o x на этапе выполнения Чтобы добавить опции элемента управления L is t B o x на этапе выполнения, необхо­ димо реализовать следующее: • с помощью кода определить значение свойства R ow Source, чтобы указать диапа­ зон, хранящий необходимые данные; • создать код, использующий метод A d d ltem для добавления опций в элемент управления L is tB o x . Как и следовало ожидать, значение свойства R ow Source устанавливается с помо­ щью кода, а не в окне Properties. Например, представленная далее процедура устанавли­ вает значения свойства R ow Source элемента управления L is t B o x перед тем, как ото­ бражается диалоговое окно U se г Form. В этом случае опции состоят из значений в ячей­ ках диапазона C a t e g o r i e s рабочего листа B u d get. U s e rF o rm l. L i s t B o x l . RowSource = "B u d g e t! C a te g o r ie s " U s e rF o rm l. Show Если опции элемента управления L is t B o x не содержатся в диапазоне ячеек листа, то можно создать специальный код VBA для заполнения элемента управления L istB ox перед кодом отображения диалогового окна. Следующая процедура заполняет окно спи­ ска элемента управления L is t B o x названиями месяцев года с помощью метода A ddltem . Sub Show U serForm 2() ' Заполнение сп и ска W ith U s e rF o rm l. L is t B o x l R ow S o u rce = "" A d d lte m " Я н в а р ь " A d d lte m " Ф е в р а л ь " A d d lte m " М а р т " A d d lte m " А п р е л ь " A d d lte m "М а й " A d d lte m "И ю н ь" A d d lte m "И ю л ь " A d d lte m " А в г у с т " A d d lte m " С е н т я б р ь A d d lte m " О к т я б р ь " A d d lte m " Н о я б р ь " A d d lte m " Д е к а б р ь " W ith U s e rF o rm l. Show End Sub Предупреждение В предыдущем коде свойство RowSource сначала приравнивалось к пустой строке. Таким образом предотвращалась потенциальная ошибка, которая появляется в том случае, когда в окне Properties свойство RowSource эле­ мента управления L is t B o x имеет определенное значение. Если попытаться добавить опции в элемент управления L is t B o x с ненулевым ^значением свойства RowSource, появится сообщ ение об ошибке “permission denied” (отсутствуют права доступа). лава 14. Примеры пользовательских форм 453 Можно также использовать метод A d d ltem для выборки опций элемента управления ListBox, хранящихся в диапазоне ячеек. Ниже рассмотрен пример заполнения элемен­ тауправления L is t B o x содержимым диапазона А1:А12 листа Лист1. For Row = 1 Т о 12 U s e rF o rm l. L is t B o x l .A d d lte m S h e e ts (11Л и с т1 " ) . C e lls (Row, 1) Next Row Использование свойства L i s t еще больше облегчает решение задачи. Приведенный ниже оператор дает тот же эффект, что и предыдущий цикл For N ex t. U serForm l. L i s t B o x l . L i s t = A p p l i c a t i o n . T ra n s p o s e (S h e e ts ( _ " Л и с т 1 " ) . R a n g e ("A 1 :A 1 2 ")) Обратите внимание, что использовалась функция T r a n sp o s e , поскольку свойство List настроено на ввод массива-строки, в то время как диапазон ячеек представляет со­ бой массив-столбец. Если данные хранятся в одномерном (векторном) массиве, можно воспользоваться свойством L i s t . Например, предположим, что имеется массив M yL ist, который со­ держит 50 элементов. Приведенный ниже оператор создает 50-элементный список в эле­ менте управления L is t B o x l . UserForm l. L i s t B o x l . L i s t = M y L is t Компакт-диск Примеры из этого раздела находятся на прилагаемом к книге компакт-диске lis t b o x . x l s m . в файле f i l l Добавление в элемент управления L i s t B o x только уникальных элементов В определенных случаях возникает необходимость в заполнении элемента управле­ ния L is tB o x уникальными (неповторяющимися) опциями из существующего списка. Предположим, у нас есть лист, который содержит данные о заказчиках. В одном из столбцов могут содержаться названия штатов (рис. 14.9). Необходимо заполнить элемент управления L is t B o x названиями штатов, в которых проживают потребители, исключив при этом дублирование названий штатов. Один из методов заполнения предполагает использование объекта C o l l e c t i o n . Элементы в объект C o l l e c t i o n добавляются с помощью следующего синтаксиса: object.A dd ite m , k e y , b e fo r e , a fte r Аргумент k e y (если он используется) содержит уникальную текстовую строку, кото­ рая необходима для получения доступа к элементам коллекции. Если к коллекции доба­ вить неуникальный ключ, то возникнет ошибка, и в результате элемент добавлен не бу­ дет. Этим можно воспользоваться и создать коллекцию, которая содержит только уни­ кальные элементы. Представленная далее процедура демонстрирует использование этого способа. Процедура начинается с объявления нового объекта коллекции — NoDupes. Предпо­ лагается, что диапазон, называющийся D a ta , содержит список элементов, часть кото­ рых повторяется. 454 Часть IV. Пользовательские формы Е D 6 7 9 10 8 1005 Массачусетс 1006 Пенсильвания 1007 Калифорния Г ------------- 1008 И ллинойс ~ ~ ~ 1 1009 А ризон а _________ 11 1010 Индиана 12 1011 Ц 1012 Н G Калифорния i_________i Флорида 14 1013 Невада 15 1014 Нью -Дж ерси 16 1015 М иннесота 17 1016 Калифорния 18 1017 Нью -Й орк Уникальные записи: 41 19 1018 И ллинойс Калифорния Огайо Флорида Нью-Йорк Массачусетс Пенсильвания 20 1019 М эр и л ен д Аризона 21 1020 Пенсильвания 22 1021 Ф лорида 23 1022 Ф лорида 24 1023 Флорида 25 1024 Массачусетс 26 1025 Округ Колумбия 27 1026 Калифорния 28 1027 Калифорния 29 1028 М и ннесота 30 1029 Нью -Й орк 31 1030 И ллинойс ... 1. .... 1.. _1L т в j >£ Рис. 14.9. Объект C o l l e c t i o n применяется для заполнения элемента управления L i s t B o x уникальными значениями из столбца В В коде циклически просматриваются ячейки диапазона, и в коллекцию NoDupes до­ бавляются значения только уникальных ячеек. Кроме того, значение ячейки (преобра­ зованное в строку) используется в качестве значения аргумента k ey. Применение опера­ тора On E r r o r Resume N e x t приводит к тому, что в коде VBA игнорируется ошиб­ ка, которая возникает при добавлении в коллекцию неуникального ключа. Если возника­ ет ошибка, элемент в коллекцию не добавляется — это именно то поведение, которого необходимо добиться. Затем процедура передает элементы коллекции NoDupes в эле­ мент управления L is t B o x . В диалоговом окне U serForm также содержится подпись, которая указывает количество уникальных элементов коллекции. Sub R e m o v e D u p lic a te s l() Dim A l l C e l l s As Range, C e ll As Range Dim NoDupes As New C o l l e c t io n On E r r o r Resume N e x t F o r Each C e ll I n R an ge ( " S t a t e " ) N oD upes.Add C e ll. V a lu e , C S tr ( C e ll. V a lu e ) N e x t C e ll On E r r o r GoTo 0 1 Д обавление уникальны х элем ентов F o r Each Ite m I n NoDupes U s e r F o r m l. L is t B o x l. A d d lt e m N e x t Ite m 1 О тображ ение количества в элемент управления L is t B o x Ite m элем ентов U s e r F o r m l. L a b e l l . C a p tio n = " У н и к а л ь н ы е э л е м е н т ы : ' О т о б р а ж е н и е д и а л о г о в о г о о к н а U serForm U s e r F o r m l. Show End Sub " & NoDupes. Count Глава 14. Примеры пользовательских форм 455 К о м п а к т-д и ск Рассматриваемы й в этом разделе пример находится на прилагаемом к кни­ ге компакт-диске (в файле l i s t b o x u n iq u e it e m s i .x ls m ). В рабочей кни­ ге l i s t b o x u n iq u e ite m s 2 .x ls m находится более сложный пример, выво­ дящий на экран отсортированные элементы. Определение выделенного элемента списка В примерах, рассмотренных в предыдущих разделах, отображалось диалоговое окно UserForm с элементом управления L i s t B o x , который содержит список из нескольких элементов. Эти процедуры не включают главной функции: определения опции или оп­ ций, которые выбраны пользователем. • ч П римечание В дальнейшем будет рассматриваться элемент управления L is t B o x с од­ ним выделенным элементом списка — его свойство M u l t i s e l e c t должно иметь значение о. Чтобы определить, какой элемент списка выбран, необходимо узнать значение свой­ ства V a lu e элемента управления L i s t B o x . Оператор, показанный ниже, отображает текст выделенного в объекте L i s t B o x l элемента. MsgBox L is t B o x l. V a lu e Если не выбран ни один элемент списка, то выполнение оператора приведет к воз­ никновению ошибки. Чтобы узнать расположение выделенного элемента в списке (а не только его содер­ жимое), воспользуйтесь значением свойства L i s t l n d e x элемента управления L istB o x . В следующем примере демонстрируется простое окно сообщения, в котором указан номер выделенной позиции элемента управления L i s t B o x . MsgBox "Вы выбрали позицию #" & L i s t B o x l . L is t ln d e x Если не выделен ни один элемент списка, свойство L i s t l n d e x возвращает значение -1 . Примечание Нумерация позиций в элементе управления L is t B o x начинается с о, а не c l . Таким образом, значение свойства L is t ln d e x для первого элемента будет о, а для последнего элемента значение свойства соответствует значе­ нию свойства L is t c o u n t , равному 1. Определение нескольких выделенных элементов списка Свойство M u l t i S e l e c t элемента управления L i s t B o x может принимать одно из трех приведенных ниже значений. • 0 ( f m M u lt i S e l e c t S i n g l e ) . Может быть выбран только один элемент. Эта ус­ тановка задана по умолчанию. • 1 ( f m M u lt i S e l e c t M u l t i ) . Нажмите клавишу пробела или щелкните мышью для выделения (отмены выделения) элементов в списке. Часть IV. Пользовательские формы 456 • 2 ( f m M u l t i S e l e c t E x t e n d e d ) . Удерживая клавишу <Shift>, щелкайте мышью для расширения области выделения от предыдущего до текущего элемента. Для расширения выделенной области можно также удерживать нажатой клавишу <Shift> и нажимать одну из клавиш управления курсором. Если элемент управления L i s t B o x разрешает выделение нескольких элементов (свойство M u l t i S e l e c t равно 1 или 2), попытка доступа к свойству L i s t l n d e x либо V a lu e приведет к ошибке. В этом случае лучше использовать свойство S e le c t e d , воз­ вращающее массив, первый элемент которого имеет индекс 0. Например, следующий оператор возвращает значение T ru e , если выделен первый элемент в списке L is t B o x . MsgBox L i s t B o x l . S e le c t e d (0) Компакт-диск На прилагаемом компакт-диске находится рабочая книга, которая демонст­ рирует способы идентификации выбранных опций элемента управления L is tB o x . Эта рабочая книга включает элементы управления L is tB o x , кото­ рые допускают однократное и многократное выделение опций, и находится в файле l i s t b o x s e le c te d ite m s , xlsm . Следующий код, “заимствованный” из рабочей книги, находящейся на прилагаемом компакт-диске, демонстрирует циклический обход каждой опции элемента управления L i s t B o x . Если опция выделена, соответствующий ей текст добавляется в переменную M sg. И наконец, названия всех выделенных опций отображаются в окне сообщения. P r iv a t e Sub O K B u tto n _ C lic k () Msg = " " F o r i = 0 To L i s t B o x l . L is tC o u n t - 1 I f L i s t B o x l . S e le c t e d ( i) Then _ Msg = Msg & L i s t B o x l . L i s t ( i ) & v b C rL f N ext i MsgBox "Вы выбрали: " & v b C rL f & Msg U n lo a d Me End Sub На рис. 14.10 показан результат выделения нескольких опций элемента управления L is t B o x . Рис. 14.10. В окне сообщения отображается список выделенных оп ций элемента управления L istB o x Глава 14. Примеры пользовательских форм 457 Несколько списков в одном элементе управления ListBox В приведенном ниже примере демонстрируется создание элемента управления L is tB o x , изменяющего свое содержимое в зависимости от того, какие переключатели O p tio n B u tto n установил пользователь. На рис. 14.11 показан пример диалогового окна U s e rF o rm . Элемент управления L is tB o x получает список значений из диапазона на листе. Процедуры, обрабатываю­ щие событие C l i c k для элементов управления O p t io n B u t t o n , устанавливают значе­ ние свойства RowS o u r с е элемента управления L i s t B o x равным необходимому диапа­ зону. Одна из таких процедур представлена далее. А В А 1 Январь 2 Ф евраль Дж ип Ф орд С D 1 Март Ш е вр оле Ж елтый Показать ..... Апрель Тойота Зелены й С Месяы 5 М ай Ниссан Синий Г машины Красный Оранжевый к L ‘ *1 Зеленый Синий <* Маета: Фольксваген Голубой И ю ль i I Оранж евый 3 7 н 6 vt 4 6 F Е Красный Ф иолетовы й ОК 3 Август 9 Сен тябрь 10 Октябрь 11 Ноябрь ........................1 j . 12 Д е ка бр ь . 13 14 15 16 . ... 17 .......... 18 19 1 :................. ! 20 ■| 21 22 ] 23 ............ . 24 .,....... L 25 26 и < ►И Лист! U 1 I 1 J, 1 ш ш яш ш иивдияиW 1 .... .. к», .. , . ... J >0 Рис. 14.11. Содержимое элемента управления ListBox зависит от того, какой элемент управления OptionButton выбран в настоящий момент P r iv a t e S u b o b M o n t h s _ C l i c k () L i s t B o x l . R o w S o u rc e = " Л и с т 1 !М есяцы " End Sub Щелчок на элементе управления O p t io n B u t t o n , называющемся o b M o n th s , при­ водит к изменению значения свойства R o w S o u rc e элемента управления L is t B o x , что заставляет его использовать диапазон М есяцы на листе Л и с т 1 . © Компакт-диск Рассматриваемы й в этом разделе пример можно найти на прилагаемом к книге компакт-диске в файле l i s t b o x m u l t i p l e l i s t s , x ls m . Передача опций элемента управления ListBox В некоторых приложениях требуется выбрать несколько элементов списка. Зачастую следует создать список на основе выделенных элементов. Примером такой ситуации мо­ Часть IV. Пользовательские формы 458 жет быть вкладка Панель быстрого доступа (Quick Access Toolbar) в диалоговом окне Параметры Excel (Excel Options). На рис. 14.12 показано диалоговое окно с двумя элементами управления L is tB o x . Кнопка Добавить добавляет элемент, выделенный в левом элементе управления L i s t ­ B o x , в правый элемент управления L i s t B o x . Кнопка Удалить удаляет выделенный элемент из правого списка. Флажок определяет поведение при добавлении в список по­ вторяющихся элементов. Если флажок Разрешить дублирование не установлен, то в случае, если пользователь попытается добавить элемент, который уже присутствует в списке, будет отображено окно сообщения. *J П еремещ ение э л ем е н то в списка Из списка Январь Февраль Март Апрель Июль Август В список л. JДобавить ] Январь Февраль Июнь Удалить 1| zi Разрешить дубликаты Рис. 14.12. Построение одного списка на основе другого Код этого примера на удивление прост. Ниже приведена процедура, которая выпол­ няется после щелчка на кнопке Добавить. P r iv a t e Sub A d d B u t to n _ C lic k () I f L i s t B o x l . L is t ln d e x = -1 Then E x i t Sub I f N ot c b D u p lic a te s Then ' П роверить сущ ествование элем ента For i If = 0 To L is t B o x 2 . L is tC o u n t - 1 L is t B o x l. V a lu e = L is t B o x 2 . L i s t ( i ) Then Beep E x i t Sub End I f N ext i End I f L is tB o x 2 .A d d lte m L i s t B o x l . V a lu e End Sub Код для управления кнопкой Удалить еще проще. P r iv a t e Sub R e m o v e B u tto n _ C lic k () I f L is t B o x 2 . L is t ln d e x = -1 Then E x i t Sub L is t B o x 2 . R em oveltem L is t B o x 2 . L is t ln d e x End Sub Обратите внимание, что обе процедуры проверяют существование выделенного эле­ мента. Если значение свойства L i s t l n d e x элемента управления L i s t B o x равно -1, значит, не выделен ни один элемент. В результате процедура завершается. Этот пример также включает две дополнительные процедуры, которые проверяют со­ стояние кнопки Удалить (активна или неактивна). При этом вызываются соответствую­ щие события в результате ввода данных в элемент управления L i s t B o x (с помощью клавиатуры или щелчка мышью). В результате кнопка Удалить активизируется только в том случае, когда пользователь работает с элементом управления L is t B o x 2 . Глава 14. Примеры пользовательских форм 459 P r iv a t e S u b L i s t B o x l _ E n t e r () R e m o v e B u tto n . E n a b le d = F a ls e End S u b P r iv a t e S u b L i s t B o x 2 _ E n t e r () R e m o v e B u tto n . E n a b le d = T r u e End S u b Компакт-диск Рассматриваемы й в этом разделе пример находится на прилагаемом к кни­ ге компакт-диске в файле l i s t b o x it e m t r a n s f e r . x l s m . Перемещение опций в списке элементов управления ListBox Часто порядок, в котором расположены опции ш ш Е ш ш и а * всписке, имеет значение. Из данного раздела вы уз­ Вверх J наете, как можно перемещать опции вверх или вниз в Вниз списке элемента управления L is t B o x . В VBE по­ Июнь добная техника применяется для контроля порядка Июль Август ZA активизации опций в окне U s e rF o rm (щелкните пра­ вой кнопкой мыши в окне U s e rF o rm и в контекст­ OK ном меню выберите команду Tab Order). На рис. 14.13 показано диалоговое окно с элемен­ том управления L i s t B o x и двумя элементами управ­ Рис. 14.13. Перемещаться вверх или вниз по списку можно с помо­ ления C o m m a n d B u tto n . Щелчок на кнопке Вверх щью специально предназначенных приведет к перемещению выделенной опции вверх по для этого кнопок списку элемента управления L is t B o x . Щелчок на кнопке Вниз приведет к перемещению выделенной опции вниз по списку. Компакт-диск Этот пример находится на прилагаемом к книге компакт-диске в файле lis t b o x m ove it e m s . x ls m . Ниже приведены процедуры-обработчики событий для двух элементов управления CommandBu 1 1 on. P r iv a t e S u b M o v e U p B u t t o n _ C l ic k () Dim N u m Ite rn s A s I n t e g e r , i A s I n t e g e r , Ite m N u m A s Dim T e m p lte m A s S t r i n g , T e m p L i s t O I f L i s t B o x l . L i s t l n d e x <= 0 T h e n E x i t S u b N u m lte m s = L i s t B o x l . L i s t C o u n t Dim T e m p L is t O ReDim T e m p L is t ( 0 T o N u m lte m s - 1) ' Заполнение м а с с и в а эл е м е н та м и с п и с к а F o r i = 0 Т о N u m lte m s - 1 T e m p L is t ( i) = L i s t B o x l . L i s t (i ) Next i 1 Выбранный э л е м е н т ItemNum = L i s t B o x l . L i s t l n d e x 1 Обмен э л е м е н т а м и In te g e r 460 Часть IV. Пользовательские формы T em pltem = T e m p L ist(Ite m N u m ) T e m p L ist(Ite m N u m ) = T e m p L is t( ItemNum - 1) T e m p L ist(Ite m N u m - 1 ) = Tem pltem L i s t B o x l . L i s t = T e m p L is t ' Изменение ин д е кса сп и ска L i s t B o x l . L is t ln d e x = ItemNum - 1 End Sub P r iv a t e Sub M o v e D o w n B u tto n _ C lic k () Dim Num ltem s As I n t e g e r , i As I n t e g e r , ItemNum As I n t e g e r Dim Tem pltem As S t r i n g , T e m p L is t() I f L i s t B o x l . L is t ln d e x = L i s t B o x l . L is tC o u n t - 1 Then E x i t Sub Num ltem s = L i s t B o x l . L is tC o u n t Dim T e m p L is t() ReDim T e m p L is t(0 To Num ltem s - 1) ' Заполнение массива элементами спи ска F o r i = 0 То Num ltem s - 1 T e m p L is t( i) = L i s t B o x l . L i s t ( i ) N ext i 1 Выделенный элемент ItemNum = L i s t B o x l . L is t ln d e x ' Обмен элементами Tem pltem = T e m p L is t( ItemNum) T e m p L ist(Ite m N u m ) = T e m p L is t( ItemNum + 1) T e m p L ist(Ite m N u m + 1) = Tem pltem L i s t B o x l . L i s t = T e m p L is t 1 Изменение ин де кса сп и ска L i s t B o x l . L is t ln d e x = ItemNum + 1 End Sub Работа с многоколоночными элементами управления ListB ox Как правило, элемент управления L i s t B o x содержит один столбец, в котором ото­ бражается один список. Однако можно создать элемент управления L is t B o x , который содержит несколько столбцов, а иногда — даже несколько столбцов с заголовками. На рис. 14.14 отображен элемент управления L i s t B o x с несколькими столбцами, который получает данные из диапазона ячеек рабочего листа. Компакт-диск Рассмотренный в этом разделе пример находится на прилагаемом к книге компакт-диске в файле l i s t b o x m u ltic o lu m n l .x ls m . Для того чтобы создать элемент управления L i s t B o x с несколькими столбцами, в которые заносятся данные, хранимые в диапазоне ячеек листа, выполните следующие действия. 1. Удостоверьтесь, что свойству C o lu m n C o u n t элемента управления L is t B o x присвоено правильное значение, которое соответствует количеству столбцов в элементе управления. 2. Укажите правильный исходный диапазон данных из нескольких столбцов, при­ своив соответствующее значение свойству R o w S o u rc e элемента управления L is t B o x . Глава 14. Примеры пользовательских форм 461 3. Если необходимо отобразить заголовки столбцов, присвойте свойству C o lu m n H eads значение T ru e . Не включайте заголовки столбцов в диапазон рабочего листа, указанный в свойстве R o w S o u rc e . VBA автоматически использует для них строку, которая находится сразу над строкой, указанной в значении свойства R o w S o u rce . Рис. 14.14. Этот элемент управления ListBox отображает трехколоночный список с заголовками колонок 4. Измените ширину столбцов, присвоив свойству C o lu m n W id th s значения, кото­ рые указываются в пунктах (1/72 часть дюйма) и разделены точками с запятой. Например, следующее значение свойства C o lu m n W id th s определяет ширину трех столбцов списка элемента управления L i s t B o x — 100 ; 4 0 ; 30. 5. Укажите столбец в качестве значения свойства B o u n d C o lu m n . Это свойство оп­ ределяет столбец, на который указывает ссылка при обращении к свойству V a lu e элемента управления L is t B o x . Чтобы заполнить элемент управления L i s t B o x дан­ ными из нескольких столбцов без использования диапазо­ на, необходимо создать двумерный массив, а затем при­ своить массив свойству L i s t элемента управления L is tB o x . Следующие операторы демонстрируют приме­ нение двумерного массива (размером 12x2) под названием Data. Двухколоночный список L i s t B o x отображает на­ звания месяцев в столбце 1, а количество дней — в столб­ це 2 (рис. 14.15). Обратите внимание, что процедура при­ сваивает свойству C o lu m n C o u n t значение 2. P rivate Sub U s e r F o r m _ I n i t i a li z e () 1 Заполнить элемент управления L is t B o x Dim D a t a ( l То 12, 1 То 2) Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь_______ 31 28 31 30 31 30 31 31 30 ш л Рис. 14.15. Двухколоночный спи­ сок ListBox, заполненный дан­ ными двумерного массива 462 Часть IV. Пользовательские формы F o r i = 1 То 12 D a t a ( i, 1) = F o r m a t( D a t e S e r ia l(2007, i , 1 ) , N ext i F o r i = 1 To 12 D a ta ( i , 2) = D a y ( D a te S e r ia l(2007, i + 1, 1) N e xt i L i s t B o x l . C olum nCount = 2 L i s t B o x l . L i s t = D ata End Sub "mmmm") - 1) Компакт-диск Пример из этого раздела находится на прилагаемом к книге компакт-диске в файле l i s t b o x m u ltic o lu m n 2 .x ls m . Примечание Не сущ ествует способа определить заголовки столбцов ColumnHeads, когда данные списка находятся в м ассиве VBA. в свойстве Использование элемента управления ListBox для выделения строк на листе Пример, приведенный в этом разделе, поможет вам в решении различных практиче­ ских задач. Он позволяет отображать элемент управления L is t B o x , который состоит из элементов заполненного диапазона на текущем листе (рис. 14.16). Пользователь может выбрать несколько опций списка в элементе управления L is t B o x . Щелкнув на кнопке Все, вы выберете все опции, а щелкнув на кнопке Сброс, отмените выбор всех опций. Щелчок на кнопке О К приводит к выделению строк, которые соответствуют выделен­ ным опциям элемента управления L is t B o x . Конечно, можно выделить несколько не­ смежных диапазонов непосредственно на листе. Эта задача выполняется с помощью кла­ виши <Ctrl>. Но со временем становится понятно, что метод, предложенный в этом раз­ деле, намного удобнее. Компакт-диск Рассматриваемы й в этом разделе пример находится на прилагаемом к кни­ ге компакт-диске в файле l i s t b o x s e le c t ro w s .x ls m . Выбор нескольких опций возможен, поскольку свойству M u l t i S e l e c t элемента управления L i s t B o x присвоено значение 1 — f m M u l t i S e l e c t M u l t i . Установка свойства L i s t S t y l e элемента управления L i s t B o x равным 1 ( f m L i s t S t y l e O p t io n ) приводит к отображению флажков для каждого элемента. Ниже приведена процедура объекта U s e rF o rm , применяемая для обработки события I n i t i a l i z e . Эта процедура создает объект r n g , который состоит из используемого диапазона активного листа. Дополнительный код устанавливает свойства R o w S o u rce и C o lu m n C o u n t элемента управления L is t B o x , а также изменяет значение свойства C o lu m n W id th s , чтобы столбцы элемента управления L i s t B o x по ширине соответст­ вовали столбцам активного рабочего листа. P r iv a t e Dim Dim Dim Sub U s e r F o r m _ I n i t i a li z e () C o lC n t As I n t e g e r rn g As Range cw As S t r in g Глава 14. Примеры пользовательских форм 463 Dim с As I n t e g e r C olC nt = A c t iv e S h e e t. U sedR ange. C olum ns. C ount Set rn g = A c tiv e S h e e t.U s e d R a n g e W ith L is t B o x l . Colum nCount = C o lC n t .RowSource = rn g .A d d re s s cw = " 11 F o r с = 1 To .C olum nC ount cw = cw & r n g . C o lu m n s (c ).W id th & " ; 11 N e xt с . C olum nW idths = cw .L is tln d e x = 0 End W ith End Sub A В ' 1 D С E F Н G 1 ] j 1 1 Вы делен ие JL 3 4 5 Агент 6 A dam s В 17.03.2010 *5jC.UX. Л1 zТП1А Z U1u A dam s 04.10.2009 A dam s 25.12.2009 Строка 15 10 A dam s 15.07.2009 [□ Агент 11 A dam s 07.01.2010 !□ Adams 7 9 Дата Е | Район В Цена ( Я Спальни $199 000 Central В Ванны В 3 П л о щ а В Тип 2,5 1510 Рез е р в В П р о д а В В Condo Л<)Ж Ь лож ь )ЖЬ лож ь Цена Ванны Тип А ИНА 17.0 Central $199 000 2,5 Condo Z j И НА £21 Adams 25.0 Central $214 500 2,5 Single [a| Adams □ Adams 04.H Central $265 000 3 25.1 Дат* Район лож ь )ЖЬ ИСТИН А лож ь Central $268 500 14 Rom ero 10.09.2009 □ Adams 15.0 Central $273 500 2 >жь S.ngte F a M ГИНА angle Far,.. Щ Sngte F a r ^ j >ЖЬ 15 Ham ilton 02.08.2009 □ Adams 07.0 Central $309950 3 SintfeFar 1 ИНА лож ь 16 Randolph 30.09.2009 □ Adams 23.0 Central $325000 2,5 Single Fat 1 ГИНА ИСТИНА 5 Single Far jj И НА ИСТИН А 3 Single Far 12 A da m s 13 Jenkins 23.06.2009 07.07.2009 17 A dam s 27.09.2009 18 Shasta 30.08.2009 19 K elly 15.11.2009 2,5 □ Jerfcns 07.0 N. County $1200 500 □ Hamlton 02.0i N. County $425 900 1<1 1 >f 23.01.2010 12.11.2009 22 A dam s 17.07.2009 23 Robinson 05.09.2009 N . County $379000 4 3 3000 24 Barnes 02.12.2009 , S. Co unty $208 750 4 2 1800 25 B en net 18.10.2009 Central $229 500 4 3 26 B en net 15.10.2009 Central $549 000 4 3 gee лож ь )ЖЬ лож ь лож ь >жь ИСТИН А Single Fam ily ЛОЖ Ь ИСТИН А Single Fam ily ЛОЖ Ь лож ь 2041 Single Fam ily ЛОЖ Ь И СТИН А 1940 S ingle Fam ily ИСТИНА лож ь ] [ OK j ____ Г лож ь )ЖЬ 1 Отмена Сброс I лож ь лож ь )ЖЬ )ЖЬ 20 Shasta 21 A dam s ИСТИНА ______.Г Г ▼ L Рис. 14.16. Этот элемент управления L is tB o x облегчает выделение строк в рабо­ чем листе V" м Г л и с т ! Fl< Кнопки Все и Сброс (называющиеся S e l e c t A l l B u t t o n и S e l e c t N o n e B u t t o n ) имеют простые процедуры обработки событий, которые показаны ниже. P rivate Sub S e l e c t A l lB u t t o n _ C li c k () Dim r As I n t e g e r For r = 0 To L i s t B o x l . L is t C o u n t - 1 L i s t B o x l . S e le c te d ( r ) = T ru e Next r End Sub P rivate Sub S e le c tN o n e B u tto n _ C lic k () Dim r As I n t e g e r For r = 0 To L i s t B o x l . L is tC o u n t - 1 L i s t B o x l . S e le c te d ( r ) = F a ls e Next r End Sub 464 Часть IV. Пользовательские формы Далее приведена процедура обработки события O K B u t t o n _ C lic k . Эта процедура создает объект R ange, называющийся RowRange. Он состоит из строк, соответствую­ щих выделенным опциям в элементе управления L is t B o x . Для того чтобы определить факт выделения опции, в коде проверяется значение свойства S e l e c t e d элемента управления L is t B o x . Обратите внимание на использование функции U n io n для добав­ ления дополнительных диапазонов к объекту RowRange. P r iv a t e Sub O K B u tto n _ C lic k () Dim RowRange As Range RowCnt = 0 F o r r = 0 To L i s t B o x l . L is tC o u n t - 1 I f L i s t B o x l . S e le c t e d ( r ) Then RowCnt = RowCnt + 1 I f RowCnt = 1 Then S e t RowRange = A c tiv e S h e e t.U s e d R a n g e . R o w s(r + 1) E ls e S e t RowRange = _ U nion(R ow R ange, A c t iv e S h e e t. UsedR ange. R o w s(r + 1 )) End I f End I f N ext r I f N o t RowRange I s N o th in g Then RowRange. S e le c t U n lo a d Me End Sub Компакт-диск Рассмотренны й в этом разделе пример находится на прилагаемом к книге компакт-диске в файле l i s t b o x s e le c t ro w s .x ls m . Использование элемента управления ListBox для активизации листа Пример, приведенный в этой главе, и полезен, и познавателен. В нем использован элемент управления L i s t B o x с несколькими столбцами (еще его называют многоколо­ ночным) для отображения списка рабочих листов активной рабочей книги. В столбцах содержатся следующие данные: • имя листа; • тип листа (рабочий лист, диаграмма или диалоговый лист Excel 5/95); • количество непустых ячеек в листе; • состояние листа. На рис. 14.17 показан пример подобного диалогового окна. Код процедуры U s e r F o r m _ I n i t i a l i z e (который приведен ниже) создает двумер­ ный массив и собирает информацию, циклически просматривая листы активной рабочей книги. После этого массив передается в элемент управления L is t B o x . P u b lic O r ig in a lS h e e t As O b je c t P r iv a t e Sub U s e r F o r m _ I n i t i a li z e () Dim S h e e tD a ta O As S t r i n g S e t O r ig in a lS h e e t = A c tiv e S h e e t S h tC n t = A c tiv e W o rk b o o k . S h e e ts . C ount ReDim S h e e tD a ta ( l To S h tC n t, 1 To 4) ShtNum = 1 Глава 14. Примеры пользовательских форм 465 F or Each S h t I n A c tiv e W o rk b o o k . S h ee ts I f Sht.Nam e = A c tiv e S h e e t.N a m e Then _ L is tP o s = ShtNum - 1 S h ee tD a ta(S h tN um , 1) = Sht.Nam e S e le c t Case TypeName(S h t) Case "W o rk s h e e t" S h ee tD a ta(S h tN um , 2) = "Л и ст" S h ee tD a ta(S h tN um , 3) = _ A p p l i c a t i o n . C o u n tA (S h t. C e lls ) Case " C h a r t" S h ee tD a ta(S h tN um , 2) = "Диаграмма" S h ee tD a ta(S h tN um , 3) = "Н /Д " Case " D ia lo g S h e e t" S h e e tD a ta (ShtNutib, 2) = "Д и а л о г" S h ee tD a ta(S h tN um , 3) = "Н /Д " End S e le c t I f S h t . V i s ib l e Then S h ee tD a ta(S h tN um , 4) = "Да" E ls e S h ee tD a ta(S h tN um , 4) = "Н ет" End I f ShtNum = ShtNum + 1 N ext S h t W ith L is t B o x l . C olum nW idths = "100 p t ; 3 0 p t ; 4 0 p t ; 5 0 p t " . L i s t = S h e e tD a ta . L i s t l n d e x = L is tP o s End W ith End Sub m jkJ ■ Тип i * ct2 ЛистЗ ЛистЧ Лист5 JV«ct6 Лист 7 /*с т 8 Лист9 Заполненные ячейки Отображаются я в в в Лист Лист Лист Л*ст Лист Лист Лист Лист 256 10 7 117 72 128 50 0 л! ......j.....;... Поеаюго листа Л,*„»М Л ^ т 1 /, Лип-2 . /КТЗ,„-,Г ■-'дисйй Рис. 14.17. С помощью этого диалогового окна пользователь активизирует лист Ниже приводится код процедуры L i s t B o x l _ C l i c k . P rivate Sub L is t B o x l _ C l i c k () I f c b P re v ie w Then _ S h e e t s ( L is t B o x l. V a lu e ) . A c t iv a t e End Sub 466 Часть IV. Пользовательские формы Значение элемента управления C heckBox (с названием c b P r e v ie w ) определяет не­ обходимость предварительного просмотра листа после того, как пользователь щелкнет на соответствующей опции списка элемента управления L is tB o x . Щелчок на кнопке ОК (объект OKButton) приводит к выполнению процедуры O K B u tto n _ C lick , которая показана ниже. P r iv a t e Sub O K B u tto n _ C lic k () Dim U se rS h e e t As O b je c t S e t U se rS h e e t = S h e e ts ( L is tB o x l.V a lu e ) I f U s e r S h e e t.V is ib le Then U s e r S h e e t.A c tiv a te E ls e I f MsgBox ( "О тобразить л исты ? 11, _ v b Q u e s tio n + vb Y esN o C an cel) = vbYes Then U s e r S h e e t.V is ib le = T ru e U s e r S h e e t.A c tiv a te E ls e O r ig in a lS h e e t . A c t iv a t e End I f End I f U n lo a d Me End Sub Процедура O K B u tto n _ C lick создает объектную переменную, которая представляет выделенный лист. Если лист отображается, то он активизируется. Если лист скрыт, то на экран выводится сообщение, в котором предлагается сделать лист видимым. Если поль­ зователь даст утвердительный ответ на запрос, то лист будет отображен и активизирует­ ся. В противном случае активизируется исходный лист (который хранится в переменной O r ig in a lS h e e t ) . Двойной щелчок на опции списка в элементе управления L is t B o x приводит к тому же результату, что и щелчок на кнопке ОК. Процедура L i s t B o x l_ D b lC lic k , которая отображена ниже, вызывает процедуру O K B u tto n _ C lick . P r iv a t e Sub L is t B o x l_ D b lC lic k ( B y V a l C a n ce l As _ S Form s. R e tu rn B o o le a n ) C a ll O K B u tto n _ C lic k End Sub Компакт-диск Рассматриваемы й в этом разделе пример находится на прилагаемом к кни­ ге компакт-диске в файле l i s t b o x a c t i v a t e s h e e t.x ls m . Применение элемента управления M u lt iP a g e Элемент управления M u ltiP a g e применяется при отображении в пользовательских диалоговых окнах множества элементов управления. Элемент управления M u ltiP a g e позволяет группировать опции, а также размещать каждую группу на отдельной вкладке. На рис. 14.18 показан пример формы U serForm , которая включает M u ltiP age. В этом случае элемент управления содержит три страницы, каждая из которых находится на своей вкладке. Глава 14. Примеры пользовательских форм М н о гостран и чн ы е элем ен ты 467 I *1 управления Показать JКнига | Активный лист | Закрыть Р ^j^gtcy формул| Р Строку ДОСТОЯНИЯ Показать Книга JАктивный лист | Масштабировать лист J J Закрыть Р ;ф«ЫЧКИ листовj Р Р М ногостран и чн ы е эл ем ен ты Показать | Книга *1 М н о гостран и чн ы е э л ем ен ты управлени я Горизонтальная полоса прокрутки Вертикальная полоса прокрутки *1 управления Активный лист | Закрыть р ;2аголовки строк И | Г”Разрывы страниц Р Линии сетки Рис. 14.18. Элемент управления M ultiPage группирует элементы управ­ ления на страницах, доступ к которым обеспечивается с вкладки <§) Компакт-диск Пример из этого раздела находится на прилагаемом к книге компакт-диске в файле m u ltip a g e c o n t r o l dem o.xlsm . Примечание Панель инструментов T o o lb o x также включает элемент управления T a b s tr ip , напоминающий элемент управления M u ltiP a g e . Однако в отли­ чие от M u ltiP a g e , элемент управления T a b s t r ip не может включать другие объекты. Поскольку элемент управления M u ltiP a g e является более гибким, вряд ли вам придется обращаться к элементу управления T a b s tr ip . Применение элемента управления M u lt iP a g e может вызвать определенные про­ блемы. Ниже описаны факторы, которые необходимо учитывать при использовании эле­ мента управления M u lt iP a g e . • Вкладка (или страница), которая отображается поверх всех остальных, определяется значением свойства V a lu e элемента управления M u ltiP a g e . Значение 0 соответ­ ствует первой вкладке. Значение 1 вызывает отображение второй вкладки и т.д. • По умолчанию элемент управления M u lt iP a g e состоит из двух страниц. Для того чтобы добавить дополнительные вкладки, щелкните на любой вкладке правой кноп­ кой мыши и в контекстном меню выберите пункт New Page (Новая страница). • При работе с элементом управления M u lt iP a g e щелкните на вкладке, чтобы ус­ тановить свойства страницы. В окне Properties отобразятся свойства, значения которых можно изменить. • Иногда сложно выделить сам элемент управления M u lt iP a g e , так как щелчок на нем приводит к выделению страницы элемента управления. Для того чтобы выде­ Часть IV. Пользовательские формы 468 лить только элемент управления, щелкните на его границе. Кроме того, можете воспользоваться клавишей <ТаЬ> для циклического перемещения между элемен­ тами управления. Еще одним вариантом выделения элемента управления является выбор пункта MultiPage из раскрывающегося списка окна Properties. • Если элемент управления M u lt iP a g e содержит много вкладок, то присвойте его свойству M u lt iR o w значение T ru e , чтобы отобразить вкладки в несколько строк. • Если необходимо, то вместо вкладок можно отображать кнопки. Достаточно из­ менить значение свойства S t y l e на 1. Если значение свойства S t y l e равно 2, элемент управления M u lt iP a g e не будет отображать ни вкладки, ни кнопки. • Свойство T a b O r i e n t a t i o n управления M u lt iP a g e . • Для каждой страницы можно установить эффект перехода. Для этого воспользуй­ тесь свойством T r a n s i t i o n E f f e c t . Например, щелчок на вкладке приведет к то­ му, что новая страница “отодвинет” старую. Применяйте свойство T r a n s i t i o n P e r io d , чтобы задать скорость эффекта перехода. определяет расположение вкладок на элементе Использование внешних элементов управления Пример, рассматриваемый в этом разделе, основан на элементе управления Microsoft Windows Media Player. Несмотря на то что он не является элементом управления Excel (настраивается при установке Windows), он прекрасно работает с формами U serF orm . Для того чтобы воспользоваться элементом управления Microsoft Windows Media Player выполните следующие действия. 1. Активизируйте среду VBE. 2. Щелкните правой кнопкой мыши на панели T o o lb o x и в контекстном меню вы­ берите параметр Additional Controls (Дополнительные элементы управления). Если окно Toolbox не отображается, выполните команду Viev\F>Toolbox (Вид1^ Окно Tookbox). 3. В окне Additional Controls установите флажок Windows Media Player. 4. Щелкните на кнопке ОК. Набор инструментов пополнится новым элементом управления. На рис. 14.19 показаны элемент управления Windows Media Player, встроенный в форму U se г Form , а также окно Properties. Свойство URL определяет URL-ссылку вос­ производимой композиции (музыкальная запись или видеоролик). Если композиция на­ ходится на жестком диске вашего компьютера, свойство URL определяет полный путь и имя соответствующего файла. На рис. 14.20 показан пример использования этого элемента управления. Для сокры­ тия окна, предназначенного для отображения видеороликов, была уменьшена высота ок­ на элемента управления Windows Media Player. Также был добавлен список, созданный на основе элемента управления L is t B o x , в котором отображаются аудиофайлы MP3. После щелчка на кнопке Пуск (Play) начинается воспроизведение выбранного файла. Щелчок на кнопке Закрыть (Close) приведет к прекращению воспроизведения и к за­ крытию окна U s e rF o rm . Форма U s e rF o rm отображается в немодальном режиме, по­ этому можно продолжать работу во время отображения диалогового окна. Глава 14. Примеры пользовательских форм 469 Рис. 14.19. Элемент управления Windows Media Player, встроенный в форму applause, mp3 beeping.mp3 gong.mp3 horses.mp3 pump.mp3 гап.ггрЗ siren.mp3 thunder.mp3 zJ 19 : ,: Рис. 14.20. Элемент управления Windows Media Player в действии Компакт-диск Рассматриваемы й в этом разделе пример можно найти на прилагаемом к книге компакт-диске в файле m e d i a p l a y e r . x l s m . Этот файл находится в отдельной папке вместе с бесплатно распространяемыми М РЗ-файлами. Часть IV. Пользовательские формы 470 Рассматриваемый пример весьма прост. Названия МРЗ-файлов в окне списка отобра­ жаются с помощью процедуры U s e r F o r m _ I n i t i a l i z e . В целях упрощения алгорит­ ма аудофайлы находятся в той же папке, что и рабочая книга. Можно реализовать и бо­ лее гибкий подход, предусматривающий выбор пользователем папки, содержащей тре­ буемые аудиофайлы. P r iv a t e Sub U s e r F o r m _ I n i t i a li z e () Dim F ileN am e As S t r in g ' Заполнение списка н а з в а н и я м и М Р З -ф а й л о в F ileN am e = D ir( T h is W o r k b o o k . P a th & " \ * . m p 3 " , Do W h ile L e n (F ile N a m e ) > 0 L is t B o x l.A d d lte m F ileN am e F ileN am e = D i r ( ) Loop L i s t B o x l . L is t ln d e x = 0 End Sub vb N o rm a l) Перекрестная ссылка Дополнительные сведения об использовании команды D i r можно найти в главе 27. Код обработчика событий P l a y B u t t o n _ C l i c k включает единственный оператор, который присваивает выбранное имя файла свойству URL объекта W in d o w s M e d ia P la y e r l. P r iv a t e Sub P la y B u t t o n _ C lic k () 1 С в о й с т в о URL з а г р у ж а е т м у з ы к а л ь н ы й т р е к и з а п у с к а е т п л е е р W in d o w s M e d ia P la y e rl.U R L = _ T h is W o rk b o o k . P a th & " \ " & L i s t B o x l . L i s t ( L i s t B o x l . L is t ln d e x ) End Sub Подумайте о возможной доработке этого простого приложения. Анимация элемента управления Label В последнем примере этой главы демонстрируется анимация элемента управления L a b e l. Форма U s e rF o rm , показанная на рис. 14.21, представляет собой интерактивный генератор случайных чисел. Два элемента управления T e x t B o x содержат верхнее и нижнее значения для слу­ чайного числа. Элемент управления L a b e l изначально отображает четыре знака во­ проса, а после щелчка мышью на кнопке Пуск отображаются анимированные случай­ ные числа. При этом кнопка Пуск превращается в кнопку Остановить, а щелчок на ней мышью приводит к прекращению анимации и отображению случайного числа. На рис. 14.22 показано диалоговое окно, в котором отображается случайное число в диа­ пазоне от 1 до 10000. Ниже приводится код, связанный с кнопкой генератора случайных чисел. Dim S top pe d As B o o le a n P r iv a t e Sub S t a r t S t o p B u t t o n _ C lic k () Dim Low As D o u b le , H i As D ou ble If 1 S t a r tS t o p B u tto n .C a p t io n = " S t a r t " Then П ро верка м и н и м ал ьн о го и м а кси м а л ь н о го значений I f N o t Is N u m e r ic ( T e x tB o x l. T e x t ) Then MsgBox " Н е ч и с л о в о е з н а ч е н и е . " , v b ln f o r m a t io n Глава 14. Примеры пользовательских форм 471 W ith T e x tB o x l . S e lS t a r t = О .S e lL e n g th = L e n ( .T e x t) . S e tF o cus End W ith E x i t Sub End I f I f N ot Is N u m e ric ( T e x tB o x 2 . T e x t ) Then MsgBox " Н е ч и с л о в о е к о н е ч н о е з н а ч е н и е . " , W ith TextB o x2 . S e lS t a r t = 0 .S e lL e n g th = L e n ( .T e x t) . S e tF o cus End W ith E x i t Sub End I f ' А теперь удостоверим ся, что v b ln fo r m a t io n вы бран правильны й п о р яд о к Low = A p p lic a t io n . M in ( V a l( T e x t B o x l. T e x t ) , _ V a l( T e x tB o x 2 . T e x t )) H i = A p p lic a t io n . M a x ( V a l( T e x t B o x l. T e x t ) , _ V a l( T e x tB o x 2 . T e x t) ) ' Н а с т р о й к а р а з м е р а ш риф та (п р и н е о б х о д и м о с т и ) S e le c t Case A p p lic a t io n . M a x ( L e n ( T e x t B o x l. T e x t ) , _ L e n (T e x tB o x 2 . T e x t )) Case I s < 5: L a b e l l . F o n t. S iz e = 72 Case 5: L a b e l l . F o n t. S iz e = 60 Case 6 : L a b e l l . F o n t. S iz e = 48 Case E ls e : L a b e l l . F o n t. S iz e = 36 End S e le c t S t a r tS t o p B u tto n .C a p t io n = " О с т а н о в и т ь " S topped = F a ls e Randomize Do U n t i l S top pe d L a b e l l . C a p tio n = I n t ( (H i - Low + 1) D oE vents ' В ы п о л н е н и е а н и м а ц и и Loop Else S topped = T ru e S t a r t S t o p B u t t o n . C a p tio n = " П у с к " End I f End Sub * Rnd + Low) Поскольку кнопка выполняет две функции (запуск и остановка анимации), в процеду­ ре используется общедоступная переменная S to p p e d , с помощью которой отслежива­ ется состояние кнопки. Первая часть процедуры состоит из двух структур I f - T h e n , с помощью которых проверяется содержимое элементов управления T e x tB o x . Два дру­ гих подобных оператора позволяют удостовериться в том, что меньшая величина дейст­ вительно не превосходит большей величины. В следующем разделе кода осуществляется настройка размера шрифта элемента управления L a b e l на основании максимальной ве­ личины. Цикл Do U n t i l lo o p генерирует и отображает случайные числа. Обратите внимание на оператор D o E v e n ts . Он позволяет Excel использовать все возможности операционной системы. Если бы его не было, элемент управления L a b e l не смог бы отобразить каждое генерируемое случайное число. Другими словами, именно оператор DoEvents делает возможной анимацию. Часть IV. Пользовательские формы 472 [Г е н е р а то р с л у ч а й н ы х чисел шшшшшти (Name)____________ jUserForml j S S S E S S H B H f l 8H8000000F& BorderCokx i aH80000012& 0 fmBorderStyteNone BorderStyte Caption Генератор случайных чисел 0 fmCydeAlFarms Cyde DrawBuffer Enabled Font ForeCotor Height HeipContextID KeepSooJBarsVaabie Left Mouselcnn MousePonter РкЛже PictureAignment PtetureSzeMode PSctureTlrig RightToLeft SaoCars ScrolHex/it Smibcft SaolTop SooMfcfth ShowModal SpeoaEffect Star tlJpPos bon fag Гор WhatsTtasButton W hatsTh^H p L Width Zoom | 6332 32000 True Tahoma ■ 8H80000012& 113,25 0 3 - fmScrotearsBoth 0 (None) 0 - fmMousePonterDefault (None) 2 - frnPictureAigrwnen tCenter 0 - frnPictixeSizeModeCSp F *e False 0 fmScroearsNone .. o 0 0 to True 0 - ftnSpedaCffeclflat 1 -CenterOwner 0 False M b 4?.5,/b 100........ Рис. 14.21. Генератор случайных чисел [Генератор случайных чисел ш . Отображение случайного числа между: [* j Отмена П»™ Пуск Рис. 14.22. Сгенерированное случайное число Форма U s e rF o rm также включает элемент управления C o m m a n d B u tto n , который выполняет функции кнопки Отмена. Этот элемент управления находится за пределами окна U s e rF o rm , поэтому невидим. Свойству C a n c e l элемента управления Command­ B u t t o n присвоено значение T ru e . Вследствие этого нажатие клавиши <Esc> дает тот же эффект, что и щелчок на кнопке Отмена. Соответствующая процедура обработки событий присваивает переменной S to p p e d значение T r u e и выгружает форму U s e rF o rm . P r i v a t e S u b C a n c e l B u t t o n _ C l i c k () S to p p e d = T ru e U n lo a d Me End Sub Компакт-диск Пример из этого раздела находится на прилагаемом к книге комггакт-диске в файле ra n d o m n u m b e r g e n e r a t o r . x ls m . Глава Дополнительные приемы работы с пользовательскими формами Вэтой главе... ♦ Немодальные диалоговые окна ♦ Отображение индикатора текущего состояния ♦ Создание мастеров ♦ Имитация работы функции M sgBox ♦ Диалоговое окно U s e rF o rm с перемещаемыми элементами управления ♦ Диалоговое окно U se r F o r m без строки заголовка ♦ Имитация панели инструментов с помощью диалогового окна U s e rF o rm ♦ Диалоговое окно U se r F o r m с изменяемыми размерами ♦ Несколько кнопок с одной процедурой обработки событий ♦ Диалоговое окно выбора цвета ♦ Отображение диаграммы в пользовательском диалоговом окне U se г F orm ♦ Создание полупрозрачной формы ввода данных ♦ Расширенная форма ввода данных ♦ Игра в “ пятнашки” ♦ Играем в видеопокер в окне U s e rF o rm В этой главе рассматриваются примеры, которые не вошли в главу 14, в частности дополнительные примеры форм U s e rF o rm . 474 Часть IV. Пользовательские формы Немодальные диалоговые окна Большинство диалоговых окон, о которых речь шла выше, модальные, т.е. их необхо­ димо удалять с экрана, прежде чем приступать к работе с окном приложения, находя­ щимся под этим окном. Некоторые же диалоговые окна являются немодальными. Это означает, что пользователь может продолжать работу в приложении, даже когда диало­ говое окно отображено на экране. Для отображения немодального окна U s e rF o rm воспользуйтесь следующим оператором: U s e rF o rm l. Show vb M o de less Слово v b M o d e le s s является встроенной константой, которая имеет значение 0. Та­ ким образом, представленный ниже оператор будет идентичен предыдущему. U s e rF o rm l. Show 0 На рис. 15.1 показано немодальное диалоговое окно, которое отображает информа­ цию об активной ячейке. Если диалоговое окно представлено на экране, пользователь может продолжать работу с ячейками, перемещаться на другие листы, а также выполнять другие действия, поддерживаемые в Excel. Рис. 15.1. Немодальное диалоговое окно остается видимым, даже если пользователь про­ должает работать с электронной таблицей Компакт-диск П ример из данного раздела находится на прилагаемом к книге компактдиске в файле m odeless u s e r f o r m l. x ls m . Важным моментом в использовании немодального диалогового окна является опре­ деление времени, когда необходимо обновить его содержимое. С этой целыа в нашем примере используются два события рабочей книги: S h e e tS e le c tio n C h a n g e и S h e e t A c t i v a t e . Процедуры обработки этих событий находятся в модуле кода объекта T h is W o r k b o o k (ЭтаКнига). Глава 15. Дополнительные приемы работы с пользовательскими формами 475 Перекрестная ссылка U J Обратитесь к главе 19 за дополнительными сведениями о событиях. Ниже приведен код процедур-обработчиков событий. Private Sub W o rk b o o k _ S h e e tS e le c tio n C h a n g e _ (ByVal Sh As O b je c t, B yV al T a rg e t As Range) C a ll U pdateB ox End Sub Private Sub W o rk b o o k _ S h e e tA c tiv a te (B y V a l Sh As O b je c t) C a ll U pdateB ox End Sub Описанные выше процедуры вызывают процедуру U p d a te B o x , код которой приво­ дится ниже. Sub UpdateBox () W ith U se rF o rm l ' Проверка активности листа I f T y p e N a m e (A c tiv e S h e e t) <> "W o rk s h e e t" Then . lb lF o r m u la . C a p tio n = "Н /Д " . lb lN u m F o rm a t. C a p tio n = "Н /Д " . lb lL o c k e d .C a p t io n = "Н /Д " E x i t Sub End I f .C a p tio n = " Я ч е й к а : " & A c t iv e C e ll. A d d r e s s ( F a ls e , F a ls e ) Ф о р м ул а I f A c t i v e C e l l . H asF orm ula Then . lb lF o r m u la . C a p tio n = A c t i v e C e l l . F orm ula E lse . lb lF o r m u la . C a p tio n = " ( н е т ) " End I f 1 Ч и сл о в о й ф ормат . lb lN u m F o rm a t. C a p tio n = A c tiv e C e ll.N u m b e rF o rm a t 1 Заблокировано . lb lL o c k e d . C a p tio n = A c t i v e C e l l . Locked End W ith End Sub Процедура U p d a te B o x изменяет заголовок диалогового окна U s e rF o rm , который отображает адрес активной ячейки. После этого обновляются три элемента управления Label ( lb l F o r m u l a , lb lN u m F o r m a t и l b l L o c k e d ) . Ниже приведена информация, которая поможет понять, как работает этот код. • Форма U s e rF o rm отображается в немодальном режиме, вследствие чего она ос­ тается на экране, даже если пользователь работает с листом. • Код в верхней части процедуры проверяет, является ли рабочий лист активным. Ес­ ли это не рабочий лист, то элементы управления L a b e l получают заголовок Н/Д. • Активная ячейка отслеживается благодаря событию S e le c t io n _ C h a n g e (которое обрабатывается в модуле T h is W o r k b o o k (ЭтаКнига)). • Информация отображается в элементе управления L a b e l пользовательской формы. Часть IV. Пользовательские формы 476 На рис. 15.2 показан более сложный пример. Данная версия отображает достаточно много дополнительной информации о выделенной ячейке. Пользователи, которые давно работают с Excel, могут заметить, что это диалоговое окно напоминает диалоговое окно Инфо (Info) (оно было удалено из Excel несколько лет назад). Код этого примера слиш­ ком велик для того, чтобы приводить его в книге, но вы сможете его увидеть (вместе с дополнительными комментариями) в примере рабочей книги. ПродуктА Продукт а 1 ;.... 3331 Январь Февраль 2909 Март 2579 8819 Продукт вИ того Изменение 2122] 2 791 8 244 1 892 3111; 7912 j 4,0%| 8 756 10,7% 2 321 $ 6 335 3856 $ 9 758 «Н /Д $2 4 912 19 Книга включает форму UserForm, Г воркулы 8 формате &1С1 которая отображает сведения об активной ячейке. Если форма UserForm Знамение: Ч02717Ш607М7Е-02 отображается, м ож но выбрать другие Отображено в виде: -4,0% ячейки, причем информация в форме обновляется автоматически. <—Длинный т ек ст Тип»*«йки: Double числовой формат: 0.0% Фоступа: -{ЬН»5)£5 Имя: (нет) «ДЕЛ/0! «ССЫЛКА! Зашита: Заблокировано Комментарий к ячейке: $чет) Зависящие ячейки: Ячейка не используется в формулах. Список зависящих ячеек: Ячейка не используется в формулах. Предыдущие ячейки: в Список предыдущих ячеек: 2 Рис. 15.2. В этом немодальном окне userForm отображаются сведения об активной ячейке Компакт-диск Этот пример под названием m od ele ss u s e r fo r m 2 .x ls m находится на при­ лагаемом к книге компакт-диске. А теперь приведем несколько замечаний, касающихся этого более сложного примера. • Диалоговое окно U se г F o rm содержит флажок Автоматическое обновление (Auto Update). Если этот флажок установлен, диалоговое окно обновляется авто­ матически. Если же он не установлен, для обновления информации нужно щелк­ нуть мышью на кнопке Обновить (Update). • Рабочая книга использует модуль класса с целью обнаружения двух событий для всех открытых рабочих книг: S h e e t S e le c t io n C h a n g e и S h e e t A c t iv a t e . В результате код, отображающий информацию о текущей ячейке, выполняется ав­ томатически независимо от того, в какой рабочей книге происходят события (предполагается, что установлен флажок Автоматическое обновление). Некото­ рые действия (например, изменение числового формата ячейки) не приводят к вы­ зову какого-либо из описанных событий. Поэтому диалоговое окно U s e rF o rm также содержит кнопку Обновить. Перекрестная ссылка Обратитесь к главе 29 для получения дополнительных сведений о модулях классов. Глава 15. Дополнительные приемы работы с пользовательскими формами • 477 Счетчики зависящих ячеек и ячеек, от которых зависит текущая, отображают дан­ ные только для активного листа. Это ограничение свойств P r e c e d e n ts и D e p e n d e n ts . • Так как длина отображаемой информации может изменяться, код VBA изменяет размер и расстояние между элементами управления L a b e l, а также размер самого диалогового окна U s e rF o rm в соответствии с длиной отображаемой информации. Отображение индикатора текущего состояния Одним из самых волнующих вопросов для разработчиков приложений Excel является воз­ можность использования индикат ора текущего состояния. Это графический “измеритель”, который отображает текущее состояние выполняемой задачи, например долго работающего макроса. Отобразить на экране подобный индикатор сравнительно несложно. В этом разделе рассматриваются методы создания индикаторов текущего состояния. • Макрос, который запускается за пределами (отдельный индикатор текущего состояния). диалогового окн