Text
                    
Нина Комолова Андрей Клименко Санкт-Петербург «БХВ-Петербург» 2020
УДК 004.4 ББК 32.973.26-018.2 К63 К63 Комолова, Н. В. Программирование на VBA в Excel 2019. Самоучитель / Н. В. Комолова, А. В. Клименко. — СПб.: БХВ-Петербург, 2020. — 496 с.: ил. — (Самоучитель) ISBN 978-5-9775-6593-6 Книга научит самостоятельно создавать приложения для автоматизации работы в программе Microsoft Office Excel 2019 с использованием макросов и языка программирования Visual Basic for Applications (VBA). Приведена информация о новинках программы, а также сервисах Power по работе с данными. Даны теоретические сведения о программировании, элементах объектной модели Excel, запуске и отладке макросов. Рассмотрены вопросы автоматизации рабочего листа при помощи элементов управления Excel. Описаны приемы создания макросов, пользовательских функций и форм в редакторе VBE. Приведены способы взаимодействия при помощи VBA с другими программами пакета Microsoft Office. Для закрепления материала рассмотрены примеры пользовательских приложений с анализом и поясняющими комментариями. Основные термины VBA и редактора VBE приведены в глоссарии. Файлы рабочих книг с поддержкой макросов для каждой главы размещены на сайте издательства. Для широкого круга пользователей УДК 004.4 ББК 32.973.26-018.2 Группа подготовки издания: Руководитель проекта Зав. редакцией Компьютерная верстка Дизайн серии Оформление обложки Евгений Рыбаков Екатерина Сависте Ольги Сергиенко Марины Дамбиевой Карины Соловьевой "БХВ-Петербург", 191036, Санкт-Петербург, Гончарная ул., 20. ISBN 978-5-9775-6593-6 © ООО "БХВ", 2020 © Оформление. ООО "БХВ-Петербург", 2020
Оглавление Введение .......................................................................................................................... 11 Язык VBA ....................................................................................................................................... 11 Новинки Excel 2019 и службы Power ........................................................................................... 11 Зачем нужен VBA в Excel 2019? .................................................................................................. 17 Объектно-ориентированное программирование ......................................................................... 18 Объект ..................................................................................................................................... 19 Объектная модель Microsoft Excel 2019 ...................................................................................... 19 Объектная модель VBA .........................................................................................................20 Объект Application ................................................................................................................. 20 Классы..................................................................................................................................... 21 Свойства ................................................................................................................................. 22 Методы ................................................................................................................................... 22 События .................................................................................................................................. 24 Глава 1. Основные понятия VBA ............................................................................... 25 Базовые конструкции языка Visual Basic..................................................................................... 25 Типы данных в VBA .............................................................................................................. 26 Константы и переменные, переменные объектов ............................................................... 28 Область действия переменных и констант ................................................................. 28 Объявление констант и переменных ........................................................................... 29 Начало работы ............................................................................................................................... 29 Настройка безопасности ............................................................................................................... 32 Запись макроса ............................................................................................................................... 34 Имя макроса ........................................................................................................................... 34 Разработка проекта ........................................................................................................................ 35 Создание модуля ............................................................................................................................ 37 Создание модуля с помощью контекстно-зависимого меню ............................................. 38 Окно кода................................................................................................................................ 38 Оператор Option Explicit ....................................................................................................... 39 Первая процедура .......................................................................................................................... 40 Объявление переменной в VBA ........................................................................................... 41 Оператор Debug.Print ............................................................................................................ 42 Автоматический ввод атрибутов команд ............................................................................. 44
4 Оглавление Структура кода процедуры ........................................................................................................... 45 Метод Worksheets.Activate ..................................................................................................... 45 Активная ячейка ActiveCell ................................................................................................... 46 Открытие книги с макросом ................................................................................................. 47 Ввод данных ........................................................................................................................... 49 Оператор With ........................................................................................................................ 50 Свойство Selection.................................................................................................................. 51 Свойство Orientation.............................................................................................................. 52 Объект Range.......................................................................................................................... 53 Кнопка (элемент управления ActiveX) ................................................................................. 54 Свойство Offset ....................................................................................................................... 55 Функция Environ .................................................................................................................... 56 Функция MsgBox .................................................................................................................... 57 Константы табуляции Chr(9) и перевода строки Chr(10) ................................................... 59 Диалоговое окно, создаваемое функцией InputBox ............................................................ 60 Переменная типа String ......................................................................................................... 61 Переменная типа Long ........................................................................................................... 61 Переменная типа Byte ............................................................................................................ 62 Методы Protect и Unprotect................................................................................................... 62 Запуск макроса при помощи нажатия сочетания клавиш .......................................................... 64 Как удалить модуль? ..................................................................................................................... 66 Глава 2. Основы программирования в VBA ........................................................... 69 Ячейка и диапазон ячеек ............................................................................................................... 69 Арифметические выражения ........................................................................................................ 70 Правила записи арифметических выражений ..................................................................... 71 Арифметические выражения в ячейке ................................................................................. 71 Арифметические выражения с ячейками ............................................................................. 72 Обрамление ячейки — метод BorderAround ............................................................................... 73 Оператор With ................................................................................................................................ 74 Вложенные операторы With .......................................................................................................... 75 Генерация случайных чисел RAND .............................................................................................. 76 Перевод градусов по Фаренгейту в градусы по Цельсию .......................................................... 77 Замена значений формул числом .................................................................................................78 Работа с цветом .............................................................................................................................. 81 Функция RGB ......................................................................................................................... 81 Свойства Color и ColorIndex ................................................................................................. 82 Свойство Color .............................................................................................................. 82 Свойство ColorIndex ..................................................................................................... 82 Палитра цветов.............................................................................................................. 86 Подсчет цветов в рисунке ............................................................................................ 88 Заливка ячейки цветом ................................................................................................. 91 Защита ячеек рабочего листа от форматирования ..................................................... 93 Выделение ячеек по цветовому соответствию в диапазоне ...................................... 94 Заливка строк с заданным шагом ................................................................................ 95 Выделение миганием .................................................................................................... 96 Календарь ...................................................................................................................... 98 Заливка ячеек, содержащих формулы ....................................................................... 100 Подсветка минимального и максимального значений ............................................ 101 Цветовая шкала ........................................................................................................... 103
Оглавление 5 Глава 3. Логические операторы ............................................................................... 105 Оператор If...Then...Else............................................................................................................... 105 Операторы сравнения .................................................................................................................. 105 Неполная форма оператора If...Then .................................................................................. 107 Полная форма оператора If...Then...Else ............................................................................ 108 Оператор ElseIf..................................................................................................................... 108 Вложенные логические операторы ............................................................................................ 109 Примеры использования логических операторов ..................................................................... 110 Свойство Name ..................................................................................................................... 110 Свойство Value ..................................................................................................................... 110 Функции IsEmpty и IsNumeric ............................................................................................. 111 Свойство Range.HasFormula ............................................................................................... 111 Переход к ячейке A2019 ...................................................................................................... 112 Пример с оператором Case ................................................................................................. 113 Функция InputBox ................................................................................................................ 115 Оператор GoTo ..................................................................................................................... 116 Проверка существования файла ......................................................................................... 117 Свойства объекта Application.............................................................................................. 118 Глава 4. Операторы цикла ........................................................................................ 119 Цикл For...To...Step...Next ............................................................................................................ 119 Цикл For...To...Next ...................................................................................................................... 120 Заполнение столбца ............................................................................................................. 121 Заполнение столбца с большим шагом .............................................................................. 122 Отрицательный шаг .............................................................................................................122 Выход из цикла по условию ................................................................................................ 123 Кнопка для запуска макроса (элемент управления формы) ..................................................... 124 Вложенный цикл For...To...Next.......................................................................................... 125 Цикл For...Each ............................................................................................................................ 127 Цикл Do...Loop .............................................................................................................................128 Цикл While...Wend ........................................................................................................................ 131 Время работы программы ........................................................................................................... 132 Глава 5. Функции, определенные пользователем ................................................ 139 Построение функций ................................................................................................................... 139 График функции одной переменной .................................................................................. 139 Структура кода функции пользователя .............................................................................. 140 График функции одной переменной (продолжение) ........................................................ 140 График кусочно-непрерывной функции с двумя условиями ........................................... 143 График кусочно-непрерывной функции с тремя условиями ............................................ 145 Названия формул на английском языке ............................................................................. 148 Пользовательская функция с тремя аргументами ............................................................. 149 Создание собственной категории ...............................................................................................150 Функция без параметров ..................................................................................................... 152 Переименование рабочего листа ........................................................................................ 152 Функция с аргументом типа Range .................................................................................... 153 Функция с массивом ............................................................................................................155 Функция с массивом в качестве аргумента ....................................................................... 156 Вызов функции из процедуры ............................................................................................ 158
6 Оглавление Вызов процедуры, использующей функцию, из другой процедуры ............................... 159 Запись названий формул ..................................................................................................... 161 Вычисление определенного интеграла ...................................................................................... 162 Метод прямоугольников ..................................................................................................... 163 Метод трапеций ................................................................................................................... 163 Метод Симпсона .................................................................................................................. 164 Переключатели OptionButton ...................................................................................................... 167 Глава 6. Пользовательская форма........................................................................... 171 Создание форм средствами VBA ............................................................................................... 171 Форма UserForm .......................................................................................................................... 171 Семейство форм ................................................................................................................... 172 Свойства формы................................................................................................................... 172 Разметочная сетка ................................................................................................................ 174 Методы формы..................................................................................................................... 175 События формы ................................................................................................................... 175 Командная кнопка для показа формы ................................................................................ 176 Элементы управления ................................................................................................................. 178 Префиксы ............................................................................................................................. 181 Элемент управления Label .................................................................................................. 181 Элемент управления CommandButton ................................................................................ 184 Элемент управления TextBox .............................................................................................. 187 Элементы управления OptionButton и Frame .................................................................... 190 Ключевое слово Me.............................................................................................................. 193 Элемент управления ScrollBar ............................................................................................ 194 Элемент управления ListBox ............................................................................................... 198 Элемент управления ComboBox.......................................................................................... 201 Элемент управления Image ................................................................................................. 204 Элемент управления SpinButton.......................................................................................... 209 Элемент управления TabStrip ............................................................................................. 213 Элементы управления CheckBox и MultiPage .................................................................... 216 Элемент управления RefEdit ............................................................................................... 220 Элемент управления ToggleButton...................................................................................... 223 Пользовательский элемент управления ..................................................................................... 225 Элементы управления формы .....................................................................................................226 Элемент управления Полоса прокрутки............................................................................ 227 Глава 7. Программирование объектов Shape ........................................................ 231 Типы объектов, свойства и методы семейства Shapes ............................................................. 231 Тип объекта msoShapeRectangle (прямоугольник) с заливкой (Fill) ............................... 232 Тип объекта msoConnectorCurve (соединительная линия) ............................................... 234 Метод AddConnector ............................................................................................................ 235 Метод Patterned ................................................................................................................... 236 Рисование линии: метод AddLine ....................................................................................... 238 Тип объекта msoShapeSmileyFace....................................................................................... 239 Свойство Name ..................................................................................................................... 240 Стрелка ................................................................................................................................. 241 Метод FillFormat.OneColorGradient .................................................................................. 243 Текстовый фрейм ................................................................................................................. 243 Тип фигуры msoShapeHeart (сердце) с заливкой (Fill) ..................................................... 245
Оглавление 7 Метод Group ......................................................................................................................... 246 Создание выноски с текстовым фреймом.......................................................................... 247 Свойство ThreeD .................................................................................................................. 248 Частичное и полное удаление фигур .................................................................................. 250 Оператор Set ......................................................................................................................... 252 Создание собственных элементов инфографики ...................................................................... 253 Фракталы ...................................................................................................................................... 255 Тип данных, определенный пользователем ....................................................................... 256 Фракталы из треугольников ................................................................................................ 257 Фракталы из многоугольников ........................................................................................... 261 Фракталы из четырехугольников ....................................................................................... 263 Глава 8. Работа с ячейками и областями ............................................................... 267 Объект Application ....................................................................................................................... 267 Свойства объекта Application.............................................................................................. 267 Методы объекта Application................................................................................................ 268 Объект Range ............................................................................................................................... 269 Адресация ячеек ................................................................................................................... 269 Свойства объекта Range ...................................................................................................... 270 Методы объекта Range ........................................................................................................ 271 Объект Selection ........................................................................................................................... 272 Объект Cell ................................................................................................................................... 272 Выделение нескольких областей ................................................................................................272 Выделение последней ячейки в диапазоне ................................................................................ 273 Свойство Range.End .................................................................................................................... 275 Выделение ячеек с формулами ...................................................................................................276 Выделение используемого диапазона данных .......................................................................... 278 Форматирование объединенных ячеек ...................................................................................... 278 Выделение по условию................................................................................................................ 279 Удаление символов из ячеек ....................................................................................................... 280 Убираем текст .............................................................................................................................. 282 Имена и фамилии ......................................................................................................................... 283 Метод Delete................................................................................................................................. 284 Метод Clear .................................................................................................................................. 285 Метод Application.Goto ............................................................................................................... 286 Скрытие данных........................................................................................................................... 286 Копирование и специальная вставка .......................................................................................... 286 Поиск минимума и максимума в диапазоне .............................................................................. 287 Глава 9. Работа с данными ........................................................................................ 289 Массив из трех элементов ........................................................................................................... 289 Динамический массив данных ....................................................................................................291 Сравнение областей на одном листе .......................................................................................... 293 Сравнение областей на разных листах ....................................................................................... 294 Сортировка ................................................................................................................................... 298 Сортировка диапазона данных ........................................................................................... 300 Сортировка областей (блоков) ............................................................................................ 301 Простая сортировка блоков ....................................................................................... 301 Сортировка блоков с изменением ее условий .......................................................... 303 Сортировка по цвету ............................................................................................................ 305
8 Оглавление Контроль автофильтра посредством VBA ................................................................................. 308 Команда Итоги ............................................................................................................................ 308 Сортировка данных при помощи Среза..................................................................................... 311 Сводные таблицы PivotTable ...................................................................................................... 316 Глава 10. Автоматизация диаграмм ........................................................................ 319 Объектная модель диаграмм....................................................................................................... 319 Типы диаграмм .................................................................................................................... 321 Свойства объекта Chart ....................................................................................................... 324 Методы объекта Chart ......................................................................................................... 324 Первая диаграмма ........................................................................................................................ 325 Создание диаграммы с помощью VBA .............................................................................. 328 Коническая гистограмма ..................................................................................................... 332 Печать диаграмм .................................................................................................................. 334 Удаление диаграммы ...........................................................................................................336 Форматирование параметров диаграммы .................................................................................. 337 Форматирование цветов поверхности ....................................................................................... 339 Добавление линии тренда ........................................................................................................... 341 Геолокация ................................................................................................................................... 345 Изменение прозрачности ............................................................................................................ 347 Красивые узоры ........................................................................................................................... 349 Глава 11. Программирование объектов и событий.............................................. 353 Где и как создаются процедуры обработки событий? .............................................................. 354 Процедура для объекта ЭтаКнига ..................................................................................... 355 События, связанные с нажатием кнопок мыши ........................................................................ 356 Процедура в модуле ............................................................................................................. 356 Событие для объекта Worksheet (Лист) .............................................................................. 357 Ключевое слово ByVal и параметр Target.......................................................................... 358 Очистка ячейки .................................................................................................................... 359 Свойства ScrollRow и ScrollColumn .................................................................................... 360 События активации и деактивации ............................................................................................ 360 Свойство приложения ActiveWindow .................................................................................. 360 Активный лист ..................................................................................................................... 361 Число обращений к макросу ............................................................................................... 362 Управление выделением области ....................................................................................... 363 События Activate и Deactivate рабочего листа .................................................................. 364 Двойной щелчок левой кнопкой мыши ............................................................................. 365 Щелчок правой кнопкой мыши .......................................................................................... 366 Введите пароль..................................................................................................................... 366 Событие закрытия книги ..................................................................................................... 368 Событие сохранения книги ................................................................................................. 368 Глава 12. Операторы даты и времени .................................................................... 371 Вывод даты и времени в окно Immediate оператором Debug.Print ......................................... 371 Печать даты и времени с помощью функции CDate ................................................................ 372 Функции DateSerial и TimeSerial ................................................................................................ 373 Текущие дата и время .................................................................................................................. 373 Текущие дата и время с учетом минут и секунд ....................................................................... 374
Оглавление 9 Функция Weekday — день недели .............................................................................................. 374 Функция Format ........................................................................................................................... 375 Функция DateDiff ......................................................................................................................... 377 Функция DatePart ........................................................................................................................ 377 Функция WeekdayName ............................................................................................................... 378 Вывод сообщения на 3 секунды .................................................................................................379 Метод Application.OnTime........................................................................................................... 380 Автоматическое заполнение ячеек датами методом AutoFill .................................................. 381 Подсветка даты ............................................................................................................................ 383 Поиск даты ................................................................................................................................... 385 Календарь ..................................................................................................................................... 386 Календарь по месяцам ................................................................................................................. 389 Календарь по неделям ................................................................................................................. 392 Определение возраста ................................................................................................................. 395 Глава 13. Действия с рабочей книгой ..................................................................... 397 Свойства объекта Workbook ........................................................................................................ 397 Методы объекта Workbook .......................................................................................................... 398 Событие и метод Open ................................................................................................................ 399 Открытие рабочей книги методом Workbooks.Open ......................................................... 400 Свойство Application.Dialogs для работы со встроенными диалоговыми окнами ......... 401 Открытие рабочей книги в диалоговом окне .................................................................... 402 Открытие приложения Блокнот..................................................................................................404 Свойство Workbook.Name ........................................................................................................... 405 Создание рабочей книги.............................................................................................................. 406 Имя приложения .......................................................................................................................... 406 Сохранение рабочей книги ......................................................................................................... 408 Метод Workbook.Save .......................................................................................................... 408 Метод Workbook.SaveAs ...................................................................................................... 408 Метод Workbook.SaveCopyAs .............................................................................................. 411 Сохранение всех книг и выход из программы .................................................................. 412 Сохранение всех книг и выход по запросу ........................................................................ 413 Защита рабочей книги методом Workbook.Protect ............................................................ 413 Объект Worksheet ......................................................................................................................... 414 Свойства объекта Worksheet................................................................................................ 414 Методы объекта Worksheet и семейства Worksheets ......................................................... 414 Защита рабочего листа методом Worksheet.Protect .......................................................... 415 Деление рабочего листа на страницы для печати ..................................................................... 419 Глава 14. Файловые операции .................................................................................. 421 Форматы файлов Microsoft Excel ...............................................................................................421 Метод CreateTextFile для объекта FileSystemObject ................................................................. 422 Список файлов указанной папки ................................................................................................423 Режим доступа Input/Output ........................................................................................................ 424 Файлы из Application.AddIns ....................................................................................................... 426 Объект FileDialog ........................................................................................................................ 428 Функция GetAttr ........................................................................................................................... 430 Документирование информации о файле .................................................................................. 431 Проверка существования файла .................................................................................................433
10 Оглавление Оператор Kill для удаления файла.............................................................................................. 434 Оператор FileCopy для копирования файла .............................................................................. 435 Переименование файла ............................................................................................................... 436 Перемещение файла .................................................................................................................... 436 Глава 15. Отладка программ и сообщения об ошибках ...................................... 439 Возникновение ошибок ............................................................................................................... 439 Выявление и исправление ошибок ............................................................................................. 440 Три окна для просмотра ошибок ................................................................................................442 Окно просмотра Immediate.................................................................................................. 442 Окно Locals........................................................................................................................... 444 Окно наблюдения Watches .................................................................................................. 445 Объект Err .................................................................................................................................... 448 Оператор On Error ....................................................................................................................... 448 Оператор On Error Resume Next ......................................................................................... 449 Оператор On Error GoTo: вариант 1................................................................................... 450 Оператор On Error GoTo: вариант 2................................................................................... 450 Константы xlDisabled и xlInterrupt свойства Application.EnableCancelKey .................... 452 Массив листов ...................................................................................................................... 453 Команда меню Debug .................................................................................................................. 453 Глава 16. Программирование связей ...................................................................... 455 Гиперссылки................................................................................................................................. 455 Кнопка гиперссылки .................................................................................................................... 457 Передача данных из Excel в Word ..............................................................................................458 Внедрение документа Word в Excel ........................................................................................... 459 Передача данных из Excel в PowerPoint .................................................................................... 461 Передача данных из PowerPoint в Excel .................................................................................... 463 Приложение 1. Глоссарий терминов Visual Basic for Applications .................... 465 Приложение 2. Глоссарий терминов Visual Basic Editor ..................................... 469 Приложение 3. Описание электронного архива .................................................... 485 Предметный указатель .............................................................................................. 487
Введение Программа Microsoft Excel, наряду с Microsoft Word, Microsoft Access, Microsoft PowerPoint, представляющая собой приложение программного пакета Microsoft Office, весьма популярна и технически хорошо разработана. Но даже если вы с ней ежедневно работали, то могли не заметить еще одно ее удивительное достоинство — возможность программирования на языке Visual Basic for Applications (VBA). Как известно, VBA — встроенный язык программирования всех приложений Microsoft Office. Соответственно, на VBA можно программировать и в Microsoft Word, и в Microsoft Access, и в других приложениях этого пакета. Центральное понятие VBA — макрос, или макрокоманда — последовательность команд на языке VBA, сохраненных под каким-либо именем. Язык VBA Язык VBA освоить не трудно, это достаточно легкий язык программирования, и с его помощью можно быстро получить ощутимые результаты — профессионально сконструированные приложения, решающие практически все задачи в операционной среде Windows. Visual Basic for Applications относится к числу объектно-ориентированных языков, т. е. при разработке проектов на VBA все данные и действия над ними представляются в виде объектов. VBA основан на технологии визуального программирования, предлагающей конструирование рабочей поверхности приложения и элементов его управления непосредственно на экране, а также запись всей программы или ее частей при помощи макрорекордера. Новинки Excel 2019 и службы Power Microsoft Excel в новой версии конечно поражает своим многообразием инструментов и имеющихся дополнительных служб. Все функции мы, разумеется, рассматривать не будем, остановимся на основных новинках Microsoft Excel 2019.
12 Введение Итак, появились новые типы диаграмм Воронка, Карта (для визуализации геолокационных данных). Облегчает работу расширенная подсказка по выбору функции при вводе названия функции в строке формул (рис. В1). Рис. В1. Всплывающие меню с возможностью выбора функции В программе реализованы и улучшены очень мощные сервисы по работе с данными, такими как Power Query, Power Pivot, Power View и Power Map. Power Query — это технология подключения к данным, с помощью которой можно обнаруживать, подключать, объединять и уточнять данные из различных источников для последующего анализа. Доступна загрузка данных из файлов различных форматов, из целого множества баз данных (рис. В2), в том числе созданных с использованием профессиональных СУБД, из веб-служб и других источников. Для импорта данных табличного типа устанавливается соединение с выбранной базой данных и через соответствующие диалоговые окна осуществляется импорт. При этом таблицы автоматически преобразуются в таблицы с управляющими элементами для фильтрации столбцов. Надстройка Power Query ранее находилась на отдельной вкладке Excel, теперь доступ к ней осуществляется при помощи перехода на вкладку Данные и использования команд в области Получить и преобразовать данные. При успешном размещении таблиц на рабочих листах справа появляется окно Запросы и подключения с расширенной информацией о запросах и имеющихся подключениях к источникам информации (рис. В3). Переход в редактор Power Query осуществляется при двойном щелчке левой кнопкой мыши на строке с названием запроса (рис. В4). Power Pivot — это технология моделирования данных, которая позволяет создавать модели данных, устанавливать отношения и добавлять вычисления. С помощью Power Pivot возможно работать с большими наборами данных, создавать разверну-
Введение 13 Рис. В2. Импортирование таблицы из базы данных Рис. В3. Окно Запросы и подключения
14 Введение Рис. В4. Переход в редактор Power Query Рис. В5. Просмотр диаграммы — модели данных внедренной базы данных
Введение 15 тые отношения и сложные (или простые) вычисления. Работа с сервисом осуществляется при помощи вкладки Power Pivot. Также можно просмотреть модель импортированной базы данных в специальном окне Power Pivot (рис. В5). Следующая надстройка, применяемая в Microsoft Excel для визуализации данных, с помощью которой можно создавать интерактивные диаграммы, графики, карты и другие наглядные элементы, позволяющие оживить информацию, — это технология Power View, доступная в Excel, SharePoint, SQL Server и Power BI. Управлять подключением надстройки можно при помощи диалогового окна Параметры Excel, вызываемого при помощи команды меню Файл | Параметры. Для подключения вкладки Power View перейдите в диалоговом окне в раздел Настроить ленту и поставьте галочку напротив Power View в списке вкладок в области Основные вкладки (рис. В6). Рис. В6. Подключение надстройки Power View Также в программе широко используется надстройка Power Map — надстройка, предназначенная для трехмерной геопространственной визуализации, — теперь интегрирована в Excel. Для вызова окна работы с надстройкой (рис. В7) выделите необходимый диапазон данных и на вкладке ленты Вставка в области Обзоры разверните список кнопки 3D-карта. Укажите команду Открыть в 3D Maps. На основе созданных визуализаций с использованием географических данных в Power Map можно создавать видеоролики (рис. В8) для наглядной иллюстрации
16 Введение Рис. В7. Работа с надстройкой 3D Maps Рис. В8. Воспроизведение обзора в 3D Maps данных таблицы на карте мира или вставки эффектного ролика в презентацию Power Point. Среди новинок Microsoft Excel стоит отметить поддержку масштабируемой векторной графики в виде SVG-файлов, которые можно вставить на рабочий лист, пользовательскую форму и другие элементы и преобразовать в фигуры. Коллекция
Введение 17 значков, которые можно вставить для оформления таблиц и отчетов находится в диалоговом окне Вставка значков, вызываемом при помощи нажатия кнопки Значки, расположенной на вкладке ленты Вставка в группе Иллюстрации. Зачем нужен VBA в Excel 2019? С помощью макросов VBA можно автоматизировать ежедневную рутинную работу в программе Microsoft Excel — ведь действия, доступные пользователю на ее рабочем листе, составляют 10% от всех возможностей приложения. Кроме того, VBA объединяет (интегрирует) приложения Microsoft Office, позволяет, не выходя из Excel, управлять работой других приложений и внедрять в Excel объекты из других приложений пакета. Перечислим основные возможности VBA в Excel 2019.  Автоматизированный доступ к рабочему листу, диапазону данных, ячейке.  Защита VBA-кода, защита информации на уровне: рабочей книги, рабочего листа, ячейки с данными. Возможность установки защиты с различными параметрами.  Работа с циклами и управление потоками данных.  Работа с формулами с помощью стиля ссылок R1C1.  Создание и управление имен в VBA.  Доступ к встроенным функциям VBA и создание собственных функций.  Обработка событий.  Работа с массивами данных, в том числе с динамическими.  Создание классов и коллекций.  Автоматизация при помощи элементов управления формы и ActiveX.  Создание пользовательских форм.  Использование VBA для анализа данных и расширенной фильтрации.  Работа со сводными таблицами при помощи VBA.  Создание графиков и диаграмм.  Визуализация данных, дополнительное форматирование и создание собственных элементов инфографики.  Работа со спарклайнами.  Считывание информации из Интернета и выкладывание информации в Интернет.  Обработка текстовых файлов.  Интеграция с другими приложениями Microsoft Office.  Запросы данных из популярных баз данных.  Многопользовательский доступ к данным.
18 Введение  Работа с интерфейсом Windows API.  Обработка ошибок различного рода.  Создание надстроек, собственных команд меню, настройка ленты.  Доступ к новым возможностям Microsoft Excel 2019. Объектно-ориентированное программирование Объектно-ориентированное программирование (ООП) вобрало в себя все лучшие идеи структурного программирования, объединив их с рядом новых понятий. В самом общем виде программа может быть организована одним из двух способов: вокруг кода (т. е. того, что фактически исполняется) или вокруг данных (т. е. того, что подвергается воздействию). Программы, созданные только методами структурного программирования, как правило, организованы вокруг кода. Такой подход можно рассматривать "как код, воздействующий на данные". Объектно-ориентированные программы организованы вокруг данных, исходя из принципа: "данные управляют доступом к коду". В объектно-ориентированном языке программирования определяются данные и код, которому разрешается воздействовать на эти данные. Следовательно, тип данных точно определяет операции, которые могут быть выполнены над данными. Все объектно-ориентированные языки программирования обладают тремя общими свойствами: инкапсуляцией, полиморфизмом и наследованием. Инкапсуляция — это механизм программирования, объединяющий вместе код и данные, которыми он манипулирует, исключая как вмешательство извне, так и неправильное использование данных. В объектно-ориентированном языке данные и код могут быть объединены как бы в совершенно автономный "черный ящик". Внутри такого ящика находятся все необходимые данные и код. Когда код и данные связываются вместе подобным образом, создается объект. Иными словами, объект — это элемент, поддерживающий инкапсуляцию. Полиморфизм — это свойство, позволяющее одному интерфейсу получить доступ к общему классу действий. Полиморфизм помогает упростить программу, позволяя использовать один и тот же интерфейс для описания общего класса действий. Выбрать конкретное действие (т. е. метод) в каждом отдельном случае — это задача компилятора. Наследование представляет собой процесс, в ходе которого один объект приобретает свойства другого объекта. Это обеспечивает принцип иерархической классификации. Если пользоваться иерархиями, то для каждого объекта пришлось бы явно определять все его свойства. А если воспользоваться наследованием, то достаточно определить лишь те свойства объекта, которые делают его особенным в классе. Объект может также наследовать общие свойства своего родителя. Следовательно, благодаря механизму наследования один объект становится отдельным экземпляром более общего класса.
Введение 19 Таким образом, ООП — это совокупность принципов разработки программ, понятий и элементов языка, позволяющих успешно создавать программы большого объема. ООП базируется на связи в единое целое свойств и поведения предмета или процесса. Свойства объекта — это данные, которые его характеризуют. Поведение задается функциями. В программу Microsoft Excel 2019 встроены два языка программирования макросов: XLM и VBA. Изначально был создан язык XLM, но к настоящему моменту он устарел и полностью заменен на VBA. Тем не менее в Microsoft Excel 2019 можно запускать большинство XLM-макросов, а также создавать макросы этого типа. Но при этом невозможно записывать XLM-макросы. Поэтому для создания макросов следует использовать VBA. Редактор VBA представляет собой окно, в котором осуществляется работа с кодом VBA. Это окно организовано на традиционном интерфейсе, предусматривающем использование меню и панелей инструментов. Объект Объект — это парадигма, основное понятие объектно-ориентированного программирования, означающее инкапсуляцию данных вместе с кодом, предназначенным для их обработки, т. е. объединение данных и кода в нечто целое, именуемое объектом. Существует несколько определений объекта.  Объект — это данные плюс функции.  Объект — это инкапсулированная абстракция с четким протоколом доступа.  Объект — это совокупность переменных состояния и связанных с ними методов.  Объект — это сущность в адресном пространстве вычислительной системы, по- являющаяся при создании экземпляров класса.  Объект — это характеристика, назначенная элементу класса. Объектная модель Microsoft Excel 2019 Объектная модель Microsoft Excel 2019 содержит свыше 280 объектов — полный их список приведен в файле Введение\Объектная модель Microsoft Excel 2019.doc сопровождающего книгу электронного архива. Э ЛЕКТРОННЫЙ АРХИВ Книгу сопровождает электронный архив, содержащий тексты всех сохраненных листингов, которые мы будем разрабатывать в процессе изучения ее материала (см. приложение 3). Скачать электронный архив с FTP-сервера издательства можно по ссылке ftp://ftp. bhv.ru/9785977565936.zip, а также со страницы книги на сайте www.bhv.ru.
20 Введение Объектная модель VBA Объектная модель Microsoft Excel представляет собой иерархию объектов, подчиненных одному объекту — Application (само приложение Excel). Объектов в VBA много (более 100), самые главные из них: Application, Workbook (Рабочая книга, т. е. ваш файл), Worksheet (Рабочий лист), Worksheet Function (Мастер функций). Есть и другие, например Range (Диапазон), Chart (Диаграмма), Cell (Ячейка), Row (Строка), Column (Столбец), Style (Стиль), Border (Границы), Interior (Цвет фона), Font (Шрифт), Shapes (Фигуры), а также Phonetic, Phonetics, TextEffectFormat, TickLabels, AxisTitle, ChartTitle, DataLabel, DataLabels, DisplayUnitLabel, Style, TextFrame. Многие объекты собраны в библиотеку объектов Microsoft Excel, но некоторые, например Assistant, входят в библиотеку Microsoft Office, общую для всех офисных приложений. На рис. В9 показаны основные компоненты объектной модели Microsoft Excel. Рис. В9. Иерархия основных объектов объектной модели Microsoft Excel Объект Application Объект Application — это главный (корневой) объект Microsoft Excel, представляющий само приложение Microsoft Excel. Объект Application имеет очень много свойств, и чтобы понять, сколько потребуется времени, если писать программы со
Введение 21 всеми объектами, со всеми свойствами, методами, событиями, вы можете ознакомиться с полным их списком, содержащемся в файле Введение\Свойства объекта Application.doc, сопровождающего книгу электронного архива (см. приложение 3). Точно так же с перечнем объектов объектной модели Microsoft Excel можно ознакомиться в файле Введение\Объектная модель Microsoft Excel 2019.doc, со списком методов объекта Application — в файле Введение\Методы объекта Application.doc, а со списком событий, управляющих объектом Application, — в файле Введение\События объекта Application.doc сопровождающего книгу электронного архива (см. приложение 3). Итак, перечислим основные объекты VBA в порядке иерархии:  Application (само приложение Excel); • Workbook (Рабочая книга — ваш файл);  Worksheet (Рабочий лист);  Range (Диапазон);  Chart (Диаграмма);  Character (Символ);  Style (Стиль); ‒ Border (Граница); ‒ Interior (Цвет фона); ‒ Font (Шрифт); • WorksheetFunction (Мастер функций). Множество некоторых объектов составляют семейства: Workbooks, Worksheets, Charts. Классы Класс — это одно из важнейших понятий ООП. Класс представляет собой разновидность абстрактного типа данных в ООП, характеризующийся способом своего построения. Класс описывает свойства и методы, которые будут доступны объекту, построенному по описанию, заложенному в класс. Понятие "класс" подразумевает некоторое поведение и способ представления. Объект — это экземпляр класса. Класс обычно описывается как проект, на основе которого впоследствии создается конкретный объект. Класс определяет имя объекта, его свойства и действия, над ним выполняемые. В ООП классом называется определенный пользователем тип данных, который обладает внутренними данными и методами для работы с ними в форме процедур и функций.
22 Введение Свойства Объекты обладают свойствами (действиями над объектами). Свойства характеризуют отличительные черты объектов, они сформированы для объектов. Например, свойство "Форматирование ячейки" следует искать для объекта "Ячейка". Свойство (property) — это атрибут объекта, определяющий его характеристики, такие как надпись, размер, отступы, цвет заднего и переднего фона, положение на экране, гарнитура шрифта надписей, доступность, видимость и многие другие. При изменении значений свойств меняются характеристики объекта. Синтаксис задания значений свойства: Объект.Свойство = Значение_свойства Приведем конкретный пример: Cells(3, 5).Value = 0 Для объекта Cells(3, 5) (ячейка C5) устанавливается значение 0 при помощи свойства Value. Методы Объекты обладают методами (действиями самих объектов). Метод (method) — это действия, выполняемые над объектом, уведомления, получаемые или передаваемые объектом другим объектам или приложениям. Когда речь идет о методе, то решается вопрос о выборе объекта. Основные методы объекта Workbook (Рабочая книга) приведены в табл. В1. Таблица В1. Методы для рабочей книги Excel Название метода Назначение метода Activate Активировать первое окно, ассоциируемое с рабочей книгой Close Закрыть книгу PrintOut Печатать книгу Save Сохранить изменения в текущем файле SaveAs Сохранить изменения книги в другом файле В табл. В2 приведены основные методы для листа книги. Таблица В2. Методы для листа рабочей книги Excel Название метода Назначение метода Activate Сделать текущий лист книги активным листом Copy Копировать рабочий лист
Введение 23 Таблица В2 (окончание) Название метода Назначение метода Delete Удалить рабочий лист Move Переместить рабочий лист PrintOut Напечатать рабочий лист Protect/Unprotect Защитить лист от изменений/снять защиту рабочего листа Select Выбрать рабочий лист В табл. В3 приведены основные методы для работы с диапазоном ячеек. Таблица В3. Методы для работы с диапазоном ячеек Название метода Назначение метода Activate Активировать одну ячейку в текущем выделении AddComment Добавить комментарий к диапазону (ячейке) ClearComments Удалить все комментарии к ячейкам заданного диапазона AutoFill Выполнить автозаливку ячеек заданного диапазона AutoFilter Отфильтровать список автофильтром BorderAround Задать обрамляющие границы диапазона Clear Удалить формулы и форматирование в ячейках ClearContents Очистить формулы, оставить форматирование ClearFormats Очистить форматирование Copy Копировать в заданный диапазон либо в буфер обмена CopyPicture Копировать объект в буфер обмена в виде рисунка Delete Удалить (можно со сдвигом) Find Найти указанную информацию FindNext Найти следующее FindPrevious Найти предыдущее FunctionWizard Запустить мастер функций для верхней левой ячейки Insert Вставить PasteSpecial Специальная вставка Replace Заменить Select Выбрать ячейку или диапазон ячеек Show Отобразить диапазон из одной ячейки
24 Введение События Событие (event) — это распознаваемое объектом действие, для которого можно запрограммировать отклик. События бывают разные: это и открытие, и сохранение, и закрытие проекта. Это и щелчок левой или правой кнопкой мыши, удержание нажатия кнопки и перетаскивание курсора и т. д. События могут быть инициированы как пользователями компьютера или его программой, так и операционной системой. Событие рассматривается с двух сторон: как действие и как отклик на это действие. В этом и состоит суть программирования на VBA. Например, при щелчке по кнопке выполняется код процедуры, созданной программистом. Если программа не написана или написана с ошибками, то не будет и отклика на событие. Специальный вид процедур, генерирующих отклик на событие, называется процедурами обработки событий. Можно сказать, что программирование на VBA состоит в создании кода программ, которые генерируют прямо или косвенно отклики на события. В заключение можно отметить, что VBA — это интерпретатор, он не создает исполнимых exe-файлов. Сам код в виде текста (Юникод) хранится в том же документе, созданном приложением, в которое встроен VBA. Макросы выполняются достаточно медленно, но в большинстве случаев для автоматизации документооборота большая скорость не требуется.
ГЛАВА 1 Основные понятия VBA Базовые конструкции языка Visual Basic Начиная изучение языка программирования Microsoft Visual Basic for Applications (VBA), рассмотрим сначала такое понятие, как язык. Язык — это знаковая система, предназначенная для хранения и передачи информации. Причем неважно, естественный это язык или язык программирования (а может, математический или язык жестов). Безусловно, языки различаются между собой, однако большинству языков присущи общие закономерности и системная организация. Для каждого языка определены следующие понятия:  алфавит, определяющий допустимые символы языка;  лексика — словарь языка и способы образования слов из символов;  синтаксис — способы и правила записи и соединения слов в предложения. В VBA это правила записи лексем языка: констант, имен переменных, массивов, ключевых слов, строк и др., а также способы соединения слов пользователя, знаков операций и ключевых слов VBA в различные программные конструкции;  семантика — значения отдельных слов, словосочетаний и предложений. В VBA этот термин определяет значение и логический смысл выражений и записываемых пользователем программных конструкций;  прагматика — назначение и область применения языка. Как и все языки программирования высокого уровня, Visual Basic имеет свой набор допустимых для использования символов — алфавит. Алфавит VBA содержит следующие группы символов:  буквы: заглавные и строчные буквы латинского алфавита и кириллицы — A, B, ..., Z, a, b, ..., z, А, Б, ..., Я, а, б, ..., я;  арабские цифры: 0, 1, ..., 9;
26 Глава 1  специальные символы: + - * / \ ' " . , = > < [ ] ( ) : { } & @ % $ ! ;  разделители: пробел, символ продолжения строки (_), символ табуляции, сим- вол новой строки. Из символов алфавита конструируются все структуры языка, в том числе составные символы (<=, <>, >=), ключевые слова (Dim, As, Binary и т. п.), а также имена констант, переменных, процедур, функций и т. п. Заглавные и строчные буквы в записи имен VBA не различаются. Транслятор запоминает формат первой записи идентификатора в программе, и при повторном использовании идентификатора в тексте программы он автоматически преобразуется к первоначальному формату. Типы данных в VBA Тип данных программного элемента определяет данные, которые могут содержаться в нем, и способы их хранения. Типы данных применяются ко всем значениям, которые могут храниться в памяти компьютера или участвовать в вычислении выражения. Каждая переменная, литерал, константа, перечисление, свойство, параметр процедуры, аргумент процедуры и возвращаемое значение процедуры имеют тип данных. Переменные подразделяются на простые и индексированные (переменные с индексом). Индексированными переменными являются элементы массивов. Все подробности о массивах будут рассмотрены позднее. Все слова, задействованные в конструкциях языка, являются зарезервированными словами и не могут применяться для других целей. В языке программирования Visual Basic версии для Microsoft Excel 2019 определены различные типы данных (табл. 1.1), используемые как напрямую, так и в универсальных типах данных (например, Decimal в Variant): Boolean, Byte, Currency, Date, Double, Decimal, Integer, Long\LongLong, LongPtr, Object, Single, String, Variant, а также типы данных, определяемые пользователем так же, как некоторые типы объектов. Таблица 1.1. Типы данных, используемые в программах на Visual Basic для Excel 2019 Тип Занимаемый объем памяти Boolean 2 байта Логическая величина, имеющая значения True (Истина) или False (Ложь) Byte 1 байт Целое число без знака в диапазоне от 0 до 255 Currency 8 байтов Число с фиксированной десятичной точкой от –922 337 203 685 477,5808 до 922 337 203 685 477,5807 (денежный) Диапазон значений
Основные понятия VBA 27 Таблица 1.1 (окончание) Тип Занимаемый объем памяти Date 8 байтов Дата от 1 января 100 года до 31 декабря 9999 года. Время от 0:00:00 до 23:59:59 Double 8 байтов Число с плавающей запятой двойной точности от ±1,79769313486231570E+308 до ±4,94065645841246544E–324 Decimal 14 байтов От 0 до ±79 228 162 514 264 337 593 543 950 335 (±7,9E+28) без десятичной запятой; от 0 до ±7,9228162514264337593543950335 с 28 разрядами справа от десятичной запятой; наименьшее ненулевое число — это ±0,0000000000000000000000000001 (±1E–28). Тип данных используется только в элементе Variant Integer 2 байта Целое число от –32 768 до 32 767 Long 4 байта Целое число от –2 147 483 648 до 2 147 483 647 8 байтов Тип данных предназначен для 64-разрядных систем. Целое число от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 LongPtr 4 байта/8 байтов Ненастоящий тип данных, преобразуется в целое число типа Long в 32-разрядных системах либо в целое число типа LongLong в 64-разрядных Object 4 байта Любая ссылка на объект VBA Single 4 байта Число с плавающей запятой одинарной точности от ±3,402823E38 до ±1,401298E–45 String a) 10 байтов + длина строки; а) переменной длины — до 231 символов; (целое число Long) LongLong (целое число LongLong) б) длина строки Variant Type а) строковое значение: 22 байта + длина строки; Диапазон значений б) фиксированной длины — до 64K (216) символов Тип данных, определяемый по умолчанию для переменных, не объявленных явно: а) любое числовое значение до диапазона типа Double; б) числовое значение: 16 байтов б) диапазон как для типа String переменной длины В зависимости от числа элементов Тип данных, определяемый пользователем. Диапазон каждого элемента совпадает с диапазоном его типа данных В экспоненциальном представлении символ E обозначает основание степени 10. Поэтому 3,56E+2 означает 3,56·102 или 356, а 3,56E–2 означает 3,56/102 или 0,0356.
28 Глава 1 Константы и переменные, переменные объектов В VBA для хранения значений предусмотрены просто переменные, переменные объектов и константы.  Константа — именованная область памяти, используемая для хранения фикси- рованного значения, не изменяемого при выполнении программы.  Переменная — именованная область памяти, используемая для хранения значе- ния, которое можно изменить при выполнении программы.  Переменная объектов — именованная область памяти, используемая для хране- ния любого объекта, используемого в Microsoft Excel (ячейка, диапазон ячеек, рабочий лист и т. д.), над которым выполняются действия при работе программы. Переменные объектов используются для ускорения работы программы и более наглядного кода. Область действия переменных и констант Область действия переменных и констант определяется с помощью ключевых слов Private, Public и Static.  Private — определяет область действия в пределах конкретного модуля про- граммы. После завершения выполнения модуля память, отведенная под эти переменные, освобождается. Переменные и константы, объявленные как Private, сохраняют свои значения только во время выполнения блока кода, в котором они определены.  Public — область действия в пределах приложения. Переменные и константы, объявленные как Public, сохраняют свои значения до конца выполнения программы.  Static — область действия в пределах конкретного модуля и внешних процедур, задействованных в этом модуле. После завершения выполнения модуля значения этих переменных сохраняются между вызовами процедур и могут быть использованы при повторном выполнении модуля. Переменные и константы, объявленные без ключевых слов Public, Private, Static, сохраняют свое значение согласно месту их объявления (описания). Переменные и константы в зависимости от области действия подразделяются на глобальные и локальные.  Если переменная или константа объявлена внутри процедуры, то она является локальной, т. е. она определена и доступна только в пределах данной процедуры.  Если переменная или константа объявлена вне процедуры, то она будет глобаль- ной. Такая переменная или константа может быть доступна в нескольких процедурах.
Основные понятия VBA 29 Объявление констант и переменных В VBA допускаются два способа включения идентификаторов в текст программы.  Во-первых, это неявное объявление нового объекта при записи ранее не использовавшегося в тексте идентификатора в каком-либо выражении.  Во-вторых, явное объявление, в котором все новые идентификаторы объявляются (описываются) явно с помощью ключевых слов Private, Public, Static, Dim, а для того чтобы явно указать тип переменной, либо указывается ключевое слово As, либо в имя переменной включается символ объявления типа (см. табл. 1.1). Примеры описания простых переменных: Private X# 'тип переменной Х# объявляется как Double Public i As Integer, r As Long, c As Date Static Строка As String Dim Y 'переменная Y объявлена, ее тип по умолчанию Variant Примеры описания переменных объектов: Dim Cell As Object Dim C As Range 'переменная Cell объявляется как объект Object 'переменная C объявляется как объект Range Константы объявляются с помощью ключевого слова Const. При этом используемой константе можно указать тип, область действия и присвоить значение. Синтаксис объявления констант: [{Private|Public|Static}] Const <имя> [As <тип>] = <значение> Если в константе явно не указан тип данных, то VBA назначает ей тип, соответствующий значению выражения. Примеры: Private Const q = Public Const pi = Static Const QWER Const Y = 34 Const Con As Byte Const Z As Single 44,55 3,1459 = 2,54 = 34 = -3,8374E-22 В объявлениях строковых констант их значения указываются в двойных кавычках, например: Const prv As String = "Язык программирования VBA" Public Const prv = "Язык программирования VBA" Начало работы Запустите программу Microsoft Excel 2019 — самую мощную электронную таблицу, разработанную для использования в среде Windows (рис. 1.1). Вид окна запуска зависит от того, имеется ли у вас в данный момент соединение с Интернетом или вы работаете в автономном режиме.
30 Глава 1 а б Рис. 1.1. Начало работы в Microsoft Excel 2019: а — запуск программы в автономном режиме; б — запуск программы при наличии соединения с Интернетом
Основные понятия VBA 31 Откройте знакомую вам книгу или создайте пустую книгу. Вы попадете в привычный мир столбцов, строк и ячеек (рис. 1.2). Из рисунка сразу понятно, как переходить в среду VBA, — видна кнопка Visual Basic. Рис. 1.2. Интерфейс программы Microsoft Excel 2019 Рис. 1.3. Диалоговое окно Параметры Excel
32 Глава 1 Если же вы всерьез решили заниматься программированием в среде VBA, то вызовите на ленту вкладку Разработчик. Обычно при запуске программы Microsoft Excel 2019 этой вкладки на ленте нет. 1. Для вызова диалогового окна Параметры Excel нажмите правой кнопкой мыши в любой области ленты с командами и в появившемся контекстном меню выберите команду Настройка ленты.... 2. В диалоговом окне Параметры Excel необходимо выбрать раздел Настроить ленту и активизировать вкладку Разработчик (рис. 1.3) — отметить ее флажком, а затем нажать кнопку OK в правом нижнем углу окна. Теперь эта вкладка всегда будет на экране. Настройка безопасности Настройка безопасности при работе с VBA в программе Microsoft Excel 2019 весьма важна. 1. Активизируйте на ленте вкладку Разработчик (рис. 1.4). Рис. 1.4. Лента Excel с активной вкладкой Разработчик 2. В группе команд Код нажмите кнопку со значком Безопасность макросов — откроется диалоговое окно Центр управления безопасностью (рис. 1.5). В этом диалоговом окне в разделе Параметры макросов указаны опции для макросов, находящихся в документе не из надежного расположения (4 уровня безопасности): • Отключить все макросы без уведомления; • Отключить все макросы с уведомлением; • Отключить все макросы, кроме макросов с цифровой подписью; • Включить все макросы (не рекомендуется, возможен запуск опасной программы). По умолчанию выбран первый вариант. Если файл сохранен с поддержкой макросов, выберите второй вариант. В этом случае на экране под лентой появится предупреждение системы безопасности (рис. 1.6), предлагающее включить отключенное содержимое, если в этом есть необходимость. В диалоговом окне Центр управления безопасностью в разделе Параметры макросов есть еще раздел Параметры макросов для разработчика, в котором можно
Основные понятия VBA 33 Рис. 1.5. Диалоговое окно Центр управления безопасностью Рис. 1.6. Предупреждение системы безопасности включить или отключить флажок Доверять доступ к объектной модели проектов VBA. Для того чтобы получить свою цифровую подпись (для приобретения коммерческого сертификата), необходимо обратиться к соответствующим коммерческим организациям. Рис. 1.7. Диалоговое окно Параметры Excel, раздел Центр управления безопасностью
34 Глава 1 Как можно видеть, в диалоговом окне Параметры Excel, кроме прочих, имеется также раздел Центр управления безопасностью (рис. 1.7). С помощью этого диалогового окна можно решить вопросы обеспечения безопасности документа, а также защиты и работоспособности компьютера. Запись макроса Что же такое макрос? Самый простой ответ — это запись некоторых команд, т. е. небольшая программа, которая выполняется при ее вызове или нажатии соответствующего ей значка. Иными словами, макрос — программный алгоритм действий, записанный пользователем. Программа Microsoft Excel позволяет записывать макросы. В буквальном смысле слова, как при работе с магнитофоном: нажали кнопку Запись и говорите в микрофон, произносите речь — она записывается. Нажали кнопку Стоп — запись прекратилась. А теперь можете слушать свою запись сколько угодно раз. Аналогично в программе Microsoft Excel к записанному макросу можно обращаться неоднократно. Все ваши действия при записи макроса запишутся в виде последовательности команд, а по завершении записи ее можно будет просмотреть в модуле. Имя макроса Имя (идентификатор) константы или переменной — это произвольная последовательность символов, начинающаяся с буквы и удовлетворяющая следующим правилам:  в составе имени нельзя использовать символы: . (точка), !, @, &, $, # , пробел;  в качестве имен переменных и констант недопустимы ключевые (зарезервиро    ванные) слова, входящие в конструкции языка VBA; длина имени не может быть более 255 символов; имя нельзя повторно объявлять в пределах области его видимости (действия); в имени может присутствовать символ подчеркивания; в конце имени можно указать один из символов объявления типа (табл. 1.2). Включение такого символа в имя заменяет в тексте программы запись оператора объявления типа. Таблица 1.2. Символы, определяющие тип переменных Тип данных Integer Символ объявления типа % Long & Single ! Double # Currency @ String $
Основные понятия VBA 35 Разработка проекта Начните знакомиться со средствами визуализации разработки проектов в VBA. 1. Запустите программу Microsoft Excel 2019. 2. Сохраните вновь созданную книгу с поддержкой макросов под именем Старт.xlsm. Для этого необходимо выбрать команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла выбрать вариант сохранения файла: Книга Excel с поддержкой макросов (рис. 1.8). 3. Перейдите в среду VBA, нажав на вкладке ленты Разработчик в группе Код кнопку Visual Basic . На экране откроется окно интегрированной среды разработки приложений Microsoft Visual Basic for Applications - Название книги - Активный компонент. Можно для этого воспользоваться и клавиатурным сокращением, одновременно нажав клавиши <Alt>+<F11>. П РИМЕЧАНИЕ Самый быстрый переход в среду VBA — нажатие комбинации клавиш <Alt>+<F11>. Рис. 1.8. Выбор варианта сохранения книги
36 Глава 1 4. Для знакомства с приложением и объектами VBA нажмите клавишу <Alt> или воспользуйтесь командой View | Objeсt Browser (Вид | Просмотр объектов). 5. В раскрывающемся списке <All Libraries> выберите библиотеку Excel. 6. В списке Classes выберите пункт Application. На экране откроется окно Application с перечислением объектов (рис. 1.9, а). Если вставить модуль при помощи команды меню Insert | Module (Вставить | Модуль), он будет называться Module1. Переименовать модуль в Мой_МАКРОС (рис. 1.9, б) можно, изменив его название в поле (Name) (Имя) в окне Properties (Свойства). На рис. 1.9, а можно увидеть и другие компоненты редактора VBA:  окно проекта Project - VBAProject;  окно свойств Properties;  рабочее окно (окно кода, окно форм UserForm, окно просмотра объектов);  панели инструментов. В нашем случае в окне просмотра объектов видны все объекты класса Application (Приложение): ActiveWorkbook (Активная рабочая книга), ActiveSheet (Активный лист), ActiveCell (Активная ячейка), ActiveChart (Активная диаграмма), ActivePrinter (Активный принтер) и др. а Рис. 1.9. (Часть 1 из 2) Редактор VBA: а — режим обозревателя объектов
Основные понятия VBA 37 б Рис. 1.9. (Часть 2 из 2) Редактор VBA: б — режим окна кода Кроме того, можно увидеть иерархически построенную систему объектов. Эти объекты составляют как собственно Microsoft Excel, так и задают методы и свойства. Окно проекта Project - VBAProject показывает структуру проекта (файла). Это окно активизируется в редакторе VBA выбором команды View | Project Explorer, Project Explorer, или нажатием комбинации клавиш <Ctrl>+<R>. или кнопкой Окно кода предназначено для хранения кода, связанного с объектом. У каждого объекта есть свой код, расположенный в окне кода. Так, каждый рабочий лист Worksheet (Лист1) имеет свой код, и рабочая книга Workbook (ЭтаКнига) — свой код. Если что-то не ясно, всегда можно воспользоваться справкой в меню Help или кнопкой как непосредственно в программе, так и в режиме онлайн. Создание модуля Макросы или пользовательские функции создаются в виде модулей. Вообще, модуль — это часть программы, оформленная в виде, допускающем ее независимую трансляцию. Модуль добавляется к проекту (рис. 1.10) с помощью команды Insert | Module (Вставить | Модуль), и в окне проекта он отобразится на уровне вашего приложения.
38 Глава 1 Рис. 1.10. Выбор команды Insert | Module из меню Создание модуля с помощью контекстно-зависимого меню Создать модуль можно и с помощью команды Insert | Module (Вставить | Модуль), выбрав ее из контекстно-зависимого меню, появляющегося при щелчке правой кнопкой мыши по объекту ЭтаКнига в окне проекта Project - VBAProject (рис. 1.11). Рис. 1.11. Выбор команды Insert | Module из контекстно-зависимого меню Окно кода Как только модуль создан, появляется окно кода модуля (рис. 1.12). Для того чтобы посмотреть в этом окне свойства модуля или рабочего листа, следует нажать клавишу <F4>. На рис. 1.12, кроме того, можно увидеть иерархическое строение объектов в окне проекта Project - VBAProject и окно свойств объекта Properties - Module1.
Основные понятия VBA 39 Рис. 1.12. Окно кода модуля В окне кода в верхней строке расположены раскрывающиеся списки: справа — раздел объявлений Declarations, слева — General. В списке General перечислены текущие объекты в зависимости от того, какой элемент выбран в окне рабочего проекта Project - VBAProject. В списке Declarations перечислены доступные для данного объекта события, при выборе которых в окне кода автоматически появятся заготовки данных процедур-обработчиков событий с параметрами по умолчанию. Оператор Option Explicit Оператор Option Explicit необходимо поместить в окне кода в самом начале (см. рис. 1.12) перед последующими процедурами и функциями для обязательного объявления всех переменных. Использование этого оператора не допускает возможности неправильного ввода имени переменной, которая задействована в одной или нескольких процедурах модуля. Например, если переменная была объявлена как НАЛОГ, а в коде при наборе вместо русской буквы О была набрана латинская буква О, то это приведет к ошибке. Без оператора Option Explicit подобную ошибку было бы трудно отследить. П РИМЕЧАНИЕ Если после создания модуля оператор Option Explicit в самом его начале не появляется, то, чтобы не дописывать его самостоятельно каждый раз при создании модуля, вызовите диалоговое окно параметров VBA при помощи команды меню Tools | Options (Сервис | Параметры) и на вкладке Editor (Редактор) установите флажок Require Variable Declaration (Требовать объявление переменных).
40 Глава 1 Первая процедура Процедура — это минимальная семантически законченная программная конструкция, допускающая выполнение. Просто так операторы не выполняются и не пишутся, они находятся в описании процедур и функций. Функция отличается от процедуры тем, что помимо выполнения операторов она возвращает некоторое значение. 1. Запустите программу Microsoft Excel 2019. 2. Перейдите в среду VBA, нажав кнопку Visual Basic в группе Код на вкладке ленты Разработчик. На экране откроется окно интегрированной среды разработки приложений Microsoft Visual Basic for Application - Книга 1.xlsx. Можно также воспользоваться и сочетанием клавиш <Alt>+<F11>. 3. Добавьте к проекту модуль с помощью команды Insert | Module (Вставить | Модуль). 4. Создайте первую процедуру. Для этого выполните команду Insert | Procedure (Вставить | Процедура) — откроется диалоговое окно Add Procedure (Добавить процедуру), показанное на рис. 1.13. Рис. 1.13. Диалоговое окно Add Procedure 5. В поле Name (Имя) введите имя создаваемой процедуры, например Первая_ процедура. Имя процедуры может быть написано как русскими, так и латинскими буквами, но должно состоять из одного слова, поэтому в нашем примере два слова соединены подчеркиванием. Очень важно, чтобы имя функции не совпадало с номером какой-либо ячейки на рабочем листе. Нарушение этого условия приводит к появлению ошибок при выполнении процедур и функций. В настоящее время в последних версиях программы номера ячеек меняются от А1 до XFD1048576. П РИМЕЧАНИЕ До версии Excel 2007 на нумерацию столбцов выделялся 1 байт памяти, что позволяло работать в 256 столбцах, а на нумерацию строк отводилось 2 байта памяти, что позволяло работать в 65 536 строках. Начиная с версии Excel 2007, на нумерацию столбцов выделяется 2 байта памяти, а на нумерацию строк — 4 байта памяти. Однако, в связи с трудностью отображения такого количества столбцов и строк, номера ячеек меняются от А1 до XFD1048576, что существенно больше, чем прежде.
Основные понятия VBA 41 По умолчанию стандартная таблица Excel 2019, как и версия Excel 2010, содержит 16 384 столбца, обозначенных сочетаниями букв латинского алфавита, начиная с A и заканчивая XFD, и 1 048 576 строк (более миллиона!), пронумерованных подряд. В группе Type (Тип) выберите переключатель, определяющий тип создаваемой процедуры:  тип Sub (Подпрограмма) пригоден для создания процедур, выполняющих какие- либо действия и не передающих в основную программу числовые значения;  тип Function (Функция) служит для определения подпрограмм, результатом вы- полнения которых является одно числовое или логическое значение, возвращаемое в основную программу через имя функции. П РИМЕЧАНИЕ Сокращение Sub выбрано из названия Subroutine, что в переводе с английского означает "подпрограмма". В нашем примере мы выбираем переключатель типа Sub (Подпрограмма). В поле Scope (Область видимости) выберите переключатель Public (Общедоступный), обеспечивая тем самым доступность функции пользователя из любых других книг Excel. Переключатель Private (Локальный) задает для процедуры ограниченную область видимости — только модуль, в котором она описана. В этом случае ее могут вызывать лишь процедуры того же модуля. Переключатель Public, наоборот, объявляет процедуру доступной для всех модулей проекта. По умолчанию процедура общедоступна, т. е. имеет статус Public. После нажатия кнопки OK в диалоговом окне, в поле редактора (после оператора Option Explicit) вносятся две строки-заготовки процедуры, и она выглядит так: Public Sub Первая_процедура() End Sub Объявление переменной в VBA Во многих языках программирования все используемые переменные должны быть объявлены. Для явного объявления переменной в VBA служит оператор Dim (от англ. Dimension — измерение, размеры, величина, объем). Назначение оператора Dim — объявить переменную, т. е. задать ее имя и ее тип. Синтаксис оператора Dim: Dim Имя1 [As типДанных] [,..., ИмяN [As типДанных]] Здесь:  Dim, As — ключевые слова VBA;  Имя — имя объявляемой переменной;  типДанных — одно из ключевых слов (названий типов): Integer, Single и т. д.
42 Глава 1 В этой записи прямоугольные скобки [] служат для обрамления конструкций, которые могут отсутствовать. Примеры:  Dim f As Integer — переменная f объявлена как переменная целого типа еди- ничной точности и может принимать только целые значения;  Dim sngA As Single — переменная sngA объявлена как переменная вещественно- го типа единичной точности. Оператор Dim объявляет переменную внутри тела процедуры и в любом месте процедуры, но до операторов, использующих ее. Время жизни такой переменной — рамки процедуры, т. е. при входе в эту процедуру под переменную выделяется память и происходит ее инициализация, затем, в ходе выполнения процедуры, значение переменной может меняться, а после выхода из процедуры выделенная память освобождается, и соответственно теряется значение переменной. Оператор Static антагонистичен оператору Dim — он объявляет статическую переменную. Разница в том, что при выходе из процедуры у статической переменной память не отбирается, а становится (в силу области видимости) временно недоступной, а соответственно сохраняется ее значение, которым при повторном обращении к процедуре можно воспользоваться. Оператор Debug.Print На основе полученной ранее заготовки допишите процедуру в соответствии с листингом 1.1, не забывая указать в окне кода в самом начале кода оператор Option Explicit. Листинг 1.1. Пример использования оператора Debug.Print Public Sub Первая_процедура() Dim i As Integer For i = 1 To 10 Debug.Print "Шаг_цикла :" & i Next i End Sub Для выполнения процедуры воспользуйтесь командой Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). Запустить макрос на выполнение можно также кнопкой или нажатием клавиши <F5>. Если макрос запускается, когда курсор стоит в управляющей его процедуре, то он выполняется автоматически. Если макрос запускается, когда курсор стоит не в его управляющей процедуре, а в другом месте, то после запуска макроса открывается окно Macros (Макрос), показанное на рис. 1.14, в котором можно выбрать макрос по его имени Macro Name (Имя макроса).
Основные понятия VBA 43 Рис. 1.14. Диалоговое окно Macros Посмотреть результат выполнения оператора Debug.Print по печати результатов отладки можно в окне немедленного исполнения команд Immediate (Окно отладки), вызываемом командой View | Immediate Window (Вид | Окно отладки). Это окно также можно вызвать, одновременно нажав клавиши <Ctrl>+<G> (рис. 1.15). Закрыть это окно элементарно — следует просто щелкнуть по кнопке закрытия окна. Рис. 1.15. Просмотр результатов в окне Immediate
44 Глава 1 Сохраните вновь созданную книгу с поддержкой макросов под именем Листинг_1.1_ Для этого выберите команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла укажите вариант сохранения файла: Книга Excel с поддержкой макросов. Для того чтобы открыть диалоговое окно Сохранение документа непосредственно в редакторе VBA, без переключения на рабочий лист, нажмите кнопку Save (Со. хранить) Первая_процедура.xlsm. Э ЛЕКТРОННЫЙ АРХИВ Практически все листинги, которые разрабатываются в процессе изучения материала книги, содержатся в сопровождающем книгу электронном архиве (см. приложение 3). Так, листинг 1.1 вы найдете в папке Глава_1_Основные_понятия_VBA этого архива. Скачать электронный архив с FTP-сервера издательства можно по ссылке ftp://ftp.bhv.ru/ 9785977565936.zip, а также со страницы книги на сайте www.bhv.ru. Автоматический ввод атрибутов команд Для корректного ввода атрибутов команд программа предлагает их всплывающий список, который появляется сразу после ввода точки (рис. 1.16, a). Для того чтобы список появлялся, убедитесь, что в диалоговом окне Options (Параметры) на вкладке Editor (Редактор), вызываемом в редакторе VBA при помощи команды Tools | Options (Сервис | Параметры), установлен флажок Auto List Members (Автоматический список атрибутов). Посмотрите внимательно — каждая команда имеет свой список атрибутов. Например, если вы напишете команду Application (рис. 1.16, б), то всплывающий список а Рис. 1.16. (Часть 1 из 2) Список атрибутов команд во всплывающем списке: а — для Debug
Основные понятия VBA 45 б Рис. 1.16. (Часть 2 из 2) Список атрибутов команд во всплывающем списке: б — для Application атрибутов команд будет насчитывать более 100 наименований. Перечислим некоторые из них: ActiveSheet, Build, Calculation, Cells, Columns, DisplayFullScreen, Interactive, Name, Windows и др. Структура кода процедуры Ранее уже был создан модуль, написана первая процедура, запущен макрос. Пришло время остановиться и сформулировать теоретические основы построения процедуры. В общем случае процедура имеет вид: Sub Имя_процедуры(Список_параметров) Инструкции End Sub  Список_параметров — это список параметров, от которых зависит процедура. Раз- делителем в списке параметров служит запятая. Список параметров может быть пуст.  Инструкции — это последовательность инструкций, составляющих тело процеду- ры, исполняемых при выполнении процедуры. Кроме обычных процедур, в VBA есть процедуры, обрабатывающие события, связанные с тем или иным объектом. В общем случае эти процедуры имеют вид: Sub Имя_объекта_имя_события(Список_параметров) Инструкции End Sub П РИМЕЧАНИЕ Не забудьте — имя процедуры не должно содержать пробелов. Метод Worksheets.Activate 1. Создайте новый файл в программе Microsoft Excel 2019. По умолчанию он содержит только один лист — добавьте в книгу несколько листов. 2. Перейдите в среду VBA, выбрав на вкладке ленты Разработчик раздел Visual Basic. Откроется окно интегрированной среды разработки приложений
46 Глава 1 Microsoft Visual Basic for Applications - Книга 1. Можно также воспользоваться комбинацией клавиш <Alt>+<F11>. 3. Добавьте к проекту модуль, выполнив команду Insert | Module (Вставить | Модуль). Сделайте рабочий лист активным с помощью макроса (листинг 1.2) с использованием метода Worksheets.Activate. Не забудьте только правильно указать имя рабочего листа в скобках и в кавычках. Листинг 1.2. Пример активизации указанного листа Sub Активный_лист() Worksheets("Лист2").Activate End Sub 4. Для выполнения процедуры воспользуйтесь командой Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). В открывшемся диалоговом окне Macros укажите имя макроса Активный_лист. Для запуска нажмите кнопку Run Sub/UserForm. Произойдет переход на рабочий лист с именем Лист2. 5. Сохраните вновь созданную книгу с поддержкой макросов под именем Листинг_1.2_Активный_лист.xlsm. Э ЛЕКТРОННЫЙ АРХИВ Листинг 1.2 вы найдете в папке главы 1 сопровождающего книгу электронного архива. Активная ячейка ActiveCell Активным может быть не только лист, но и ячейка, и диапазон ячеек. 1. Создайте новый файл Microsoft Excel 2019. 2. Перейдите в среду VBA, одновременно нажав клавиши <Alt>+<F11>. 3. Добавьте к проекту модуль с помощью команды Insert | Module (Вставить | Модуль). Казалось бы, проще простого — в ячейке на рабочем листе написать: Hello, традиционно первое обращение программистов во всех программах. Но VBA предоставляет возможность сделать эту надпись, сначала выбрав активную ячейку ActiveCell и введя в нее запись ActiveCell.FormulaR1C1 = "Привет, мир!", а потом еще и в выбранной активной ячейке ActiveCell.Select задать начертание Selection.Font.Italic = True, цвет Selection.Font.Color = -869745 и размер шрифта Selection.Font.Size = 80 (листинг 1.3). World — П РИМЕЧАНИЕ Любой комментарий вводится после апострофа ('). Причем комментарий может быть как целой строкой, так и продолжением строки.
Основные понятия VBA 47 Листинг 1.3. Пример создания макроса ввода и форматирования текста Sub Мой_первый_макрос() 'Текст вводится в активную ячейку – ЭТО КОММЕНТАРИЙ ActiveCell.FormulaR1C1 = "Привет, мир!" ActiveCell.Select Selection.Font.Italic = True Selection.Font.Color = -869745 'Это цвет Selection.Font.Size = 80 End Sub 4. Для выполнения процедуры воспользуйтесь командой Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму) — на рабочем листе появится надпись (рис. 1.17). 5. Сохраните вновь созданную книгу с поддержкой макросов под именем Листинг_1.3_Актуальное_сообщение.xlsm. Э ЛЕКТРОННЫЙ АРХИВ Листинг 1.3, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_1_Основные_понятия_VBA сопровождающего книгу электронного архива. Рис. 1.17. Пример введенного в ячейку отформатированного текста Открытие книги с макросом Если книга Microsoft Excel 2019 сохранена с поддержкой макросов и ее необходимо открыть, то Microsoft Excel 2019 сразу под лентой выдаст полосу сообщения, в которой говорится о том, что запуск макросов отключен (см. рис. 1.6).
48 Глава 1 Рис. 1.18. Пример сообщения об отключенном макросе Но там имеется кнопка Включить содержимое, посредством которой и включаются макросы. Если вы не воспользуетесь этой кнопкой, но все же запустите макрос, то появится сообщение о том, что макрос в данном проекте выключен (рис. 1.18). Если нажать в полосе предупредительного сообщения на предложении Запуск макросов отключен, то появится предупреждение системы безопасности на вкладке Сведения (рис. 1.19, а). При выборе из списка предупреждающей кнопки а б Рис. 1.19. (Часть 1 из 2) Сообщения системы безопасности: а — на вкладке Сведения; б — подключение макросов
Основные понятия VBA 49 в Рис. 1.19. (Часть 2 из 2) Сообщения системы безопасности: в — оповещение системы безопасности Включить содержимое элемента Дополнительные параметры (рис. 1.19, б) появится отдельное диалоговое окно с возможностью подключить макросы (рис. 1.19, в). Обратите внимание, что если вы в этот же день (не выключая компьютер) повторно откроете файл, в котором были включены макросы с предварительным отключением, то вопросы задаваться не будут, и макросы будут включены. Ввод данных Если вам не интересно самим вводить данные, то можно создать макрос, заполняющий одинаковыми значениями ячейки на листе (листинг 1.4). 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>). Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). Листинг 1.4. Пример создания макроса ввода данных Sub Ввод_данных() Range("A1:B5").Value = 200 End Sub 2. Для выполнения процедуры воспользуйтесь кнопкой с А1 по В5 появится значение 200. — в десяти ячейках 3. Сохраните вновь созданную книгу с поддержкой макросов под именем Листинг_1.4_Заполнение_ячеек.xlsm (Файл | Сохранить как).
50 Глава 1 Оператор With 1. Продолжите работать с той же программой. 2. Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 3. Текст будет вводиться в ячейку B2, заданную в виде Range("C2"). В программе задействован оператор With, если вместо строки With Range("C2") ввести With ActiveCell, то текст будет отображен на рабочем листе в активной ячейке. 4. Дополните форматирование текста, сделав его полужирным Bold и подчеркнутым Underline. Свойство TintAndShade изменяет заданный цвет, принимая значения от –1 до 1 (листинг 1.5). Листинг 1.5. Пример создания макроса с оператором With Sub Параметры_надписи() With Range("C2") .Value = "МИРУ МИР!" With .Font .Color = RGB(255, 128, 0) .Bold = True .Underline = True .Size = 32 .TintAndShade = -0.5 End With End With End Sub 5. Для исполнения процедуры воспользуйтесь кнопкой — после выполнения макроса на рабочем листе в ячейке C2 появится надпись (рис. 1.20). Рис. 1.20. Пример введенного в область отформатированного текста
Основные понятия VBA 51 6. Сохраните измененную книгу с поддержкой макросов под именем Листинг_1.5_ Параметры_надписи.xlsm (Файл | Сохранить как). Свойство Selection 1. Создайте новый файл Microsoft Excel 2019. На рабочем листе выделите диапазон смежных либо несмежных ячеек. 2. Перейдите в среду VBA (<Alt>+<F11>). Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 3. Создайте макрос (листинг 1.6) и запустите его кнопкой — на рабочем листе программы предварительно выделенная область и активная ячейка окрасятся заданным цветом: vbRed — красным, vbBlue — синим (рис. 1.21). Рис. 1.21. Действия с выделенной областью и выделенной ячейкой Листинг 1.6. Пример изменения цвета выделенной области и выделенной ячейки Sub Цвет_выделенной_области() Selection.Interior.Color = vbRed ActiveCell.Interior.Color = vbBlue End Sub
52 Глава 1 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_1.6_Цвет_выделенной_области.xlsm. Свойство Orientation 1. Создайте новый файл Microsoft Excel 2019, добавьте к рабочему листу еще несколько. 2. Перейдите в среду VBA (<Alt>+<F11>). Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 3. В листинге 1.7 приведен код программы, содержащий операторы, выводящие текстовое значение в указанную ячейку. Для текста задан наклон при помощи свойства Orientation (рис. 1.22). Рис. 1.22. Печать текста под углом в 45 градусов 4. Для выполнения процедуры воспользуйтесь кнопкой рабочем листе Лист2 в ячейке A20. . Надпись появится на 5. Сохраните книгу с поддержкой макросов под именем Листинг_1.7_Наклон_ текста.xlsm. Листинг 1.7. Пример создания вертикального текста Sub Наклон_текста() With ThisWorkbook.Worksheets(2).Range("A20")
Основные понятия VBA 53 .Interior.Color = vbYellow .Value = "УРА!" .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .Orientation = 45 .Font.Bold = True .Font.Italic = True .Font.Size = 16 .Font.Color = vbRed End With End Sub Объект Range 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>). Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. Введите код из листинга 1.8. Это пример закрашивания сразу трех областей, задаваемых при помощи указания диапазона ячеек: для объектов Range указаны значения свойств Interior.Color (рис. 1.23). Рис. 1.23. Установка цветов для трех диапазонов ячеек 3. Выполните процедуру нажатием кнопки окрашены. . Заданные диапазоны ячеек будут 4. Сохраните документ с поддержкой макросов под именем Листинг_1.8_ Закраска_диапазона_ячеек.xlsm.
54 Глава 1 Листинг 1.8. Пример создания макроса закрашивания трех областей Sub Закраска_диапазона_ячеек() Range("A1:B5").Interior.Color = vbRed 'Это красный! Range("C2:D6").Interior.Color = vbBlue 'Это синий! Range("E3:F7").Interior.Color = vbGreen 'Это зеленый! End Sub Кнопка (элемент управления ActiveX) Продолжим работать с тем же примером и рассмотрим вызов макроса с помощью щелчка на кнопке, расположенной на рабочем листе. 1. На рабочем листе создайте командную кнопку. Для этого на вкладке ленты Разработчик в группе Элементы управления нажмите раскрывающуюся кнопку Вставить, в группе Элементы ActiveX (рис. 1.24) выберите инструмент управления Кнопка (элемент ActiveX), активизируйте его и в рабочем поле Microsoft Excel нарисуйте кнопку. Как только вы закончите рисование, в строке формул появится запись: =ВНЕДРИТЬ("Forms.CommandButton.1";"") (см. рис. 1.23). П РИМЕЧАНИЕ Кнопка — элемент графики. Если при ее создании держать нажатой клавишу <Shift>, кнопка получится квадратной. Для привязки кнопки к сетке рабочего листа следует удерживать нажатой клавишу <Alt>. Посредством маркеров изменения можно задавать размеры кнопки, с помощью маркера перемещения — менять ее положение. 2. Щелкните по кнопке правой кнопкой мыши и в контекстно-зависимом меню найдите команду Просмотреть код (рис. 1.25). Выбор этой команды обеспечивает переход в окно редактора VBA и вывод в нем текста заготовки процедуры: Private Sub CommandButton1_Click() End Sub Рис. 1.24. Набор элементов управления Элементы ActiveX Рис. 1.25. Контекстно-зависимое меню внедренной кнопки
Основные понятия VBA 55 3. Между строками шаблона процедуры введите одну строку (листинг 1.9) — команду вызова Call и имя макроса, созданного в предыдущем примере: Три_выделенные_области, — в соответствии с листингом 1.9. Листинг 1.9. Пример вызова макроса Private Sub CommandButton1_Click() Call Закраска_диапазона_ячеек End Sub 4. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение ВЫЗОВ МАКРОСА. 5. Выйдите из режима конструктора, нажав кнопку Режим конструктора , и щелкните по кнопке ВЫЗОВ МАКРОСА на рабочем листе — макрос выполнит одновременное закрашивание трех областей. Приятная неожиданность — вызвать макрос можно и без команды Call, просто написав: Private Sub CommandButton1_Click() Закраска_диапазона_ячеек End Sub 6. Сохраните книгу под тем же именем командой Файл | Сохранить. Свойство Offset 1. Создайте новый файл Microsoft Excel 2019. 2. Перейдите в среду VBA, одновременно нажав клавиши <Alt>+<F11>. Добавьте к проекту модуль с помощью команды Insert | Module (Вставить | Модуль). Впишите в него процедуру (листинг 1.10). В данном листинге текст вводится в ячейки, полученные путем смещения относительно активной ячейки (она должна быть выделена). Если, например, активна ячейка A1, то слово "Microsoft" будет помещено в ячейку C1 после смещения относительно ячейки A1 на 0 строк вниз и на 2 столбца вправо, а "Excel" — в ячейку B4 после смещения на 3 строки вниз и на 1 столбец вправо. Затем сама активная ячейка меняет позицию и сдвигается до ячейки D4. Листинг 1.10. Смещение и запись текста относительно активной ячейки Sub Свойство_Offset() ActiveCell.Offset(0, 2).Value = "Microsoft" ActiveCell.Offset(3, 1).Value = "Excel" ActiveCell.Offset(rowOffset:=3, columnOffset:=3).Activate End Sub
56 Глава 1 3. Для выполнения процедуры воспользуйтесь кнопкой . 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_1.10_Смещение.xlsm (Файл | Сохранить как). Функция Environ Функция Environ используется для получения различной системной информации Windows в зависимости от введенного аргумента. В нашем случае конструкция Environ("username") возвращает строку, содержащую оперативную системную информацию об имени пользователя. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>). Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. Напишите еще один макрос, выводящий диалоговое окно с информацией о пользователе и времени (листинг 1.11). Результатом его выполнения будет сообщение о пользователе, дате и времени (рис. 1.26). 3. Для выполнения процедуры воспользуйтесь кнопкой . Рис. 1.26. Сообщение с информацией о пользователе, дате и времени П РИМЕЧАНИЕ Обратите внимание, что в листинге задействованы переносы строки в виде символов " _" (пробел — нижнее подчеркивание), при этом код, относящийся к аргументам функции MsgBox, можно писать в одну строку. При разрыве непрерывного кода на несколько строк в редакторе VBA также используются символы " _". Листинг 1.11. Пример макроса с сообщением и функцией Environ Public Sub Окно_сообщения() MsgBox "Имя вошедшего в систему пользователя: " & _ Environ("username") & vbLf & "Сегодня " & _ Format(Date, "DDDD,"" ""DD.MM.YYYY") & _ vbLf & "Текущее время: " & Time & _ " часов ", vbInformation, _ "Актуальное сообщение" ' Перенос строки - знак "_" End Sub
Основные понятия VBA 57 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_1.11_Окно_сообщения.xlsm. Функция MsgBox Уже в предыдущем макросе было создано диалоговое окно сообщения с помощью функции MsgBox. Внутри диалогового окна сообщения располагаются значок и кнопка, вид которых регулируется аргументом функции. 1. Создайте новый файл Microsoft Excel 2019 с несколькими рабочими листами, перейдите в среду VBA. 2. Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). Если в листинге 1.11 был указан аргумент vbInformation (показана пиктограмма информационного сообщения), то в листинге 1.12 используются значения аргумента: vbYesNo + vbQuestion (кнопки Да и Нет, а также пиктограмма сообщения с предостережением). 3. Выполните макрос, нажав кнопку . Результаты показаны на рис. 1.27. Листинг 1.12. Пример макроса с вопросительным сообщением Public Sub Процесс_опроса_1() Dim i As Integer i = MsgBox("Хотите ли Вы действительно продолжать процесс?", _ vbYesNo + vbQuestion, "Запрос") End Sub Рис. 1.27. Вопросительное сообщение с двумя кнопками выбора 4. Продолжите работать с той же программой — создайте в ней новый модуль, напишите макрос с сообщением и условием (листинг 1.13). Листинг 1.13. Пример макроса с сообщением и условием Public Sub Процесс_опроса_2() Dim i As Integer i = MsgBox("Хотите ли Вы действительно продолжать процесс?", _ vbYesNo + vbQuestion, "Запрос") If i = 6 Then MsgBox "Вы нажали на кнопку Да!" Else MsgBox "Вы _ нажали на кнопку Нет!" End Sub
58 Глава 1 5. Сохраните документ под тем же именем Листинг_1.12_Листинг_1.13_Процесс_ опроса.xlsm. Как можно видеть, функция MsgBox выводит на экран диалоговое окно, содержащее сообщение, устанавливает режим ожидания нажатия кнопки пользователем, а затем возвращает значение типа Integer, указывающее, какая кнопка была нажата. С ОВЕТ Для того чтобы отобразить всплывающие подсказки редактора VBA, при наборе названий функций, процедур, методов и свойств задайте режим при помощи команды Tools | Options (Сервис | Параметры), на вкладке Editor (Редактор) открывшегося диалогового окна установите флажок Auto Quick Info (Автоматически отображать краткую информацию). Если по каким-то причинам всплывающая подсказка не отобразилась, подведите курсор к введенному слову в окне редактирования кода, нажмите на нем правой кнопкой мыши и в контекстном меню выберите команду Quick Info (Быстрые сведения). Пример всплывающей подсказки для функции MsgBox показан на рис. 1.28. Рис. 1.28. Краткие сведения о синтаксисе функции MsgBox Синтаксис: MsgBox(Promt, [Buttons], [Title], [Helpfile], [Context]) Аргументы:  Promt — обязательный аргумент, строковое выражение типа String, отображае- мое как сообщение в диалоговом окне;  Buttons — числовое выражение, представляющее сумму значений, которые ука- зывают число и тип отображаемых кнопок, тип используемого значка, основную кнопку и вид окна сообщения. По умолчанию значение этого аргумента равно 0;  Title — строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот аргумент опущен, то в строку заголовка помещается имя приложения;  Helpfile — строковое выражение, определяющее имя файла справки, содержа- щего справочные сведения об этом диалоговом окне. Если этот аргумент указан, то следует задать и аргумент Context;  Context — числовое выражение, определяющее номер соответствующего разде- ла справочной системы. Если этот аргумент указан, то следует задать и аргумент Helpfile.
Основные понятия VBA 59 В функции MsgBox для аргумента Buttons имеется целый список констант для вывода знаков и кнопок в окне сообщения, некоторые из них приведены в табл. 1.3. Таблица 1.3. Символы кнопок и значков Константа, используемая для аргумента Buttons Числовое значение Назначение vbCritical 16 Запрет vbQuestion 32 Вопрос vbExclamation 48 Предупреждение vbInformation 64 Информация vbMsgBoxHelpButton 16384 Значок, кнопка/кнопки OK и Справка vbOKOnly 0 OK vbOKCancel 1 OK и Отмена Константы табуляции Chr(9) и перевода строки Chr(10) 1. Создайте новый файл Microsoft Excel 2019, перейдите в среду VBA. 2. Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). В листинге 1.14 приведен код программы, которая содержит длинное, затейливое сообщение MsgBox. Так как аргумент Promt содержит несколько строк, то для ввода специальных символов используется функция Chr с одной из констант, в нашем случае это знак табуляции Chr(9) и знак перевода строки Chr(10). В строке заголовка окна отображена надпись, задаваемая при помощи аргумента функции MsgBox, — Title (рис. 1.29). Обратите внимание, что в коде, приведенном далее, используется ввод знаков продолжения строки, здесь знаки вводятся после знака & — знака конкатенации строк. 3. Для выполнения процедуры воспользуйтесь кнопкой . Листинг 1.14. Пример использования отступов в сообщении с названием Sub Табулированное_сообщение() MsgBox "Дорогие читатели!" & Chr(10) & Chr(10) & _ "Это, пожалуй," & Chr(10) & _ "самое длинное сообщение " & Chr(10) & _ "в нашей книге." & Chr(10) & Chr(10) & _
60 Глава 1 "Успехов!" & Chr(10) & Chr(10) & _ Chr(9) & "Авторы, Санкт-Петербург", Title:="ВАЖНОЕ СООБЩЕНИЕ!" End Sub 4. Сохраните документ под именем Листинг_1.14_Табулированное_сообщение.xlsm. Рис. 1.29. Пример сообщения с текстом из нескольких строк П РИМЕЧАНИЕ Текстовый амперсанд конкатенации (&) служит для объединения нескольких текстовых строк в одну строку, например: "Математическое "&"обеспечение". Диалоговое окно, создаваемое функцией InputBox Если в предыдущем примере появлялось окно сообщения, то здесь мы рассмотрим создание диалогового окна ввода информации при помощи функции VBA InputBox. 1. Создайте новый файл Microsoft Excel 2019, перейдите в среду VBA. 2. Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). В коде для функции InputBox имеются обязательный аргумент Promt — сообщение в диалоговом окне в виде строкового выражения и необязательный — Title, задающий заголовок диалогового окна. 3. Введите код из листинга 1.15. 4. Для выполнения процедуры воспользуйтесь кнопкой . Листинг 1.15. Пример ввода данных в диалоге Public Sub Ввод_данных_в_диалоге() Dim Str1 As String Str1 = InputBox("Введите дату Вашего рождения!", "Определение _ возраста") If Str1 <> "" And IsDate(Str1) Then MsgBox "Вы родились " & Format(Date - CDate(Str1), "YY") & " _ лет (года) назад!" End If End Sub
Основные понятия VBA 61 После запуска макроса открывается диалоговое окно InputBox. Если в него ввести дату рождения, то появится сообщение о том, сколько лет назад Вы родились. 5. Сохраните документ под именем Листинг_1.15_Ввод_данных_в_диалоге.xlsm. Переменная типа String Мы уже рассматривали ранее примеры с переменными типа Integer. А в листинге 1.15 впервые использовали переменную типа String. Рассмотрим еще один пример с переменной типа String. Более подробную информацию о типах данных см. в табл. 1.1. Переменная типа String (строка) — это структурированный тип данных, представляющих собой последовательность строковых символов. Последовательность символов, присваиваемых строковой переменной, следует взять в кавычки. Строковая переменная может быть объявлена строкой как переменной, так и постоянной длины. 1. Создайте новый файл в программе Microsoft Excel 2019, перейдите в среду VBA. 2. Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). В листинге 1.16 приведен пример программы, работающей со строковой переменной типа String. 3. Для выполнения процедуры воспользуйтесь кнопкой . Листинг 1.16. Пример программы с переменной типа String Sub Строковая_переменная() Dim str As String str = "МИР! ТРУД!" Debug.Print str End Sub Результат выполнения этого макроса с использованием команды Debug.Print можно увидеть в окне отладки Immediate, вызываемом командой View | Immediate Windows (Вид | Окно отладки). Это окно (см. рис. 1.7) также можно вызвать, одновременно нажав клавиши <Ctrl>+<G>. 4. Сохраните документ под именем Листинг_1.16_ Строковая_переменная.xlsm. Переменная типа Long Продолжите работать с той же программой, создайте в ней новый модуль. В листинге 1.17 приведен пример программы, работающей с типом данных Long, служащим для хранения длинного целого числа. Переменная I задана при помощи оператора Dim.
62 Глава 1 Листинг 1.17. Пример программы с переменной типа Long Public Sub Переменная_типа_Long() Dim I As Long I = I + 2147483647 MsgBox I End Sub В результате работы программы появляется сообщение с максимальным значением числа для данной переменной: 2147483647. Попробуйте прибавить еще одну единицу, в результате наступит переполнение. Сохраните документ под именем Листинг_1.17_ Переменная_типа_Long.xlsm. Переменная типа Byte В листинге 1.18 приведен пример программы, работающей с переменной типа Byte, объявленной с помощью оператора Dim и хранящей целые числа от 0 до 255. Листинг 1.18. Пример программы с переменной типа Byte Sub Переменная_типа_Byte() Dim byt As Byte byt = 255 If byt = 255 Then MsgBox " Переменная_типа_Byte", vbExclamation End If End Sub В программе переменной byt типа Byte присваивается максимально допустимое значение 255. Затем в цикле, если byt равна 255, появляется сообщение "Переменная_типа_Byte". Сохраните документ под именем Листинг_1.18_ Переменная_типа_Byte.xlsm. Методы Protect и Unprotect Защита информации в Microsoft Excel при помощи средств VBA может быть реализована посредством метода Protect. Защиту можно установить как для всей рабочей книги, так и на уровне рабочего листа, ячейки. Метод имеет множество необязательных аргументов. В общем случае защита на уровне рабочего листа выполняется при помощи конструкции expression.Protect(Password, ...) В листинге 1.19 приведен код программы, устанавливающий защиту без пароля на все ячейки всех листов книги методом Protect, таким образом, что рабочий лист не может быть изменен.
Основные понятия VBA 63 1. Создайте новый файл Microsoft Excel 2019, перейдите в среду VBA. 2. Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). Листинг 1.19. Защита рабочего листа от изменений методом Protect Sub Защитить_рабочий_лист() Dim ws As Worksheet For Each ws In Worksheets ws.Protect Next ws End Sub 3. Для выполнения процедуры воспользуйтесь кнопкой . Если выполнить макрос, а потом в ячейках на листе рабочей книги попытаться начать вводить информацию, то сделать это будет нельзя — появится предупреждение (рис. 1.30, а). Для того чтобы снять эту защиту, необходимо нажать а б Рис. 1.30. Работа с защищенными данными: а — предупреждение о защите листа; б — кнопка Снять защиту листа
64 Глава 1 кнопку Снять защиту листа, расположенную на вкладке Рецензирование (рис. 1.30, б). 4. Сохраните документ под именем Листинг_1.19_Листинг_1.20_Защита_листа.xlsm. Метод Unprotect служит для удаления защиты с защищенного листа (листинг 1.20). Листинг 1.20. Снятие защиты от изменений методом Unprotect Sub Снять_защиту_листа() Dim ws As Worksheet For Each ws In Worksheets ws.Unprotect Next ws End Sub Так как теперь у нас в окне кода имеются два листинга (1.19 и 1.20), то для выполнения второго листинга убедитесь, что курсор установлен на одной из строк вве. В таком случае вызов денного кода. Запустите процедуру при помощи кнопки диалогового окна Macros (Макрос) с указанием имени макроса не потребуется. Сохраните документ под тем же именем Листинг_1.19_Листинг_1.20_Защита_ листа.xlsm. Запуск макроса при помощи нажатия сочетания клавиш 1. Создайте новый файл Microsoft Excel 2019. 2. Введите в ячейку А1 текст: Запуск макроса: <Ctrl>+<Shift>+<A>. 3. Создайте макрос, отображающий окно сообщения с надписью "Привет, мир!", при этом осуществим запуск макроса на рабочем листе Microsoft Excel с помощью комбинации клавиш <Ctrl>+<Shift>+<A>. Для этого на вкладке Разработчик в группе Код нажмите кнопку Макросы (рис. 1.31, а) — откроется диалоговое окно Макрос. 4. В диалоговом окне Макрос задайте имя макроса: МОЙ_МАКРОС, нажмите кнопку Создать. Произойдет автоматический переход в среду VBA, в окне кода курсор будет находиться уже в автоматически созданном коде: Sub МОЙ_МАКРОС() ... End Sub Обратите внимание, что макрос находится в отдельном модуле. Вам осталось только вписать между строк MsgBox "Привет, мир!", что означает появление текстового сообщения в мини-окне (листинг 1.21).
Основные понятия VBA 65 а б в г Рис. 1.31. Запуск макроса по нажатию клавиш: а — кнопка создания макроса; б — диалоговое окно Макрос; в — диалоговое окно Параметры макроса; г — результат нажатия клавиатурного сокращения в Microsoft Excel
66 Глава 1 Листинг 1.21. Пример кода макроса, запуск которого будет осуществляться при помощи нажатия клавиш в Microsoft Excel Sub МОЙ_МАКРОС() MsgBox "Привет, мир!" End Sub 5. Теперь настроим параметры макроса. Перейдите обратно на рабочий лист из редактора VBA, нажмите кнопку View Microsoft Excel (Alt + F11) (Перейти в Microsoft Excel (Alt + F11)), расположенную в окне VBA на панели инструментов Standard (Стандартная). 6. Еще раз вызовите диалоговое окно Макрос, нажмите в нем кнопку Параметры... (рис. 1.31, б) и в новом диалоговом окне определите сочетание клавиш, по которому будет запускаться макрос, например <Ctrl>+<Shift>+<A> (рис. 1.31, в). 7. Находясь в программе Microsoft Excel на рабочем листе, кода, нажмите клавиатурное сокращение <Ctrl>+<Shift>+<A> для запуска определенного макроса. В результате появится окно сообщения с надписью «Привет, мир!» (рис. 1.31, г). 8. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_1.21_Клавиатурное_сокращение.xlsm. Как удалить модуль? Удалить модуль можно с помощью команды Remove (Удалить). Нажмите правой кнопкой мыши на названии модуля в окне проектов и в контекстно-зависимом а Рис. 1.32. (Часть 1 из 2) Удаление модуля: а — команда Remove
Основные понятия VBA 67 б Рис. 1.32. (Часть 2 из 2) Удаление модуля: б — запрос на экспорт перед удалением модуля меню (рис. 1.32, а) выберите команду Remove (с названием модуля, в нашем случае Модуль_2). В появившемся окне сообщения будет предложено экспортировать модуль в отдельный файл перед тем, как удалить модуль (рис. 1.32, б). Если вы не хотите это делать, нажмите кнопку Нет.
68 Глава 1
ГЛАВА 2 Основы программирования в VBA В предыдущей главе было рассказано об основных объектах Visual Basic for Applications, базовых конструкциях языка, допустимых именах, типах данных. Двигаемся дальше, начав рассмотрение основополагающих правил программирования в ячейках. Ячейка и диапазон ячеек Работа с ячейкой и диапазоном ячеек через VBA осуществляется с применением объекта Range, который представляет ячейку, столбец, выделение ячеек, содержащих один или несколько смежных блоков, 3D-диапазон. 1. Создайте новый файл Microsoft Excel 2019. 2. Перейдите в среду VBA, выбрав на вкладке ленты Разработчик раздел Visual Basic. На экране откроется окно интегрированной среды разработки приложений Microsoft Visual Basic. Книга 1. Можно для этого воспользоваться комбинацией клавиш <Alt>+<F11>. 3. Добавьте к проекту модуль с помощью команды Insert | Module (Вставить | Модуль). 4. Напишите программу, в которой в ячейку и в диапазон ячеек вводятся данные (листинг 2.1). Не забывайте при этом использовать в начале окна кода оператор Option Explicit. Значение в ячейку A1 вводится при помощи свойства Cells(row, column), относящегося к объекту Range. Значения в ячейках с А2 по В5 заносятся при помощи одноименного свойства объекта Range(arg), где arg служит для обозначения диапазона ячеек. 5. Для выполнения процедуры воспользуйтесь командой Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). Запустить макрос на выполнение также можно нажатием кнопки или клавиши <F5>. П РИМЕЧАНИЕ Не забудьте, что при запуске выполняется тот макрос, на котором стоит курсор.
70 Глава 2 Листинг 2.1. Ввод данных в ячейку и диапазон ячеек Public Sub Ввод_данных() Cells(1, 1) = 50 Range("A2:B5")=30 End Sub Действительно, в ячейке А1 (Cells(1, 1)) появилось число 50, а в ячейках с А2 по В5 (Range("A2:B5")) — числа 30. 6. Сохраните созданный документ с поддержкой макросов под именем Листинг_2.1Листинг_2.5_Ввод_данных.xlsm. Для этого выберите команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла укажите вариант сохранения файла Книга Excel с поддержкой макросов. Э ЛЕКТРОННЫЙ АРХИВ Листинг 2.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_2_Программирование_в_ячейках сопровождающего книгу электронного архива. Арифметические выражения В VBA переменные можно использовать в арифметических выражениях. Арифметическим выражением называется выражение, результатом выполнения которого являются целые или вещественные числа. Арифметическое выражение образуется из арифметических операндов, соединенных знаками арифметических операций. Например, вычисление длины окружности можно записать выражением: 2*3,14159*R Операндами называются константы, переменные, функции, а также выражения, заключенные в круглые скобки. Для записи формул применяются арифметические (математические) операции. Список арифметических операций VBA в порядке убывания старшинства приведен в табл. 2.1. Таблица 2.1. Список арифметических операций VBA Операция Математическое действие Пример ^ Возведение в степень a^b (x+y)^(1/3) - Изменение знака числа -x * Умножение X*Y / Деление X/Y
Основы программирования в VBA 71 Таблица 2.1 (окончание) Операция Математическое действие Пример Целочисленное деление X\Y Остаток от целочисленного деления X Mod Y + Сложение X+Y - Вычитание X-Y \ Mod Правила записи арифметических выражений  Последовательность выполнения определяется порядком старшинства операций.  Для изменения порядка выполнения операций, как и в математике, используют- ся круглые скобки. При наличии в арифметическом выражении скобок вначале вычисляются выражения в скобках.  Нельзя пропускать знаки операций.  Если операции одного и того же уровня старшинства следуют подряд, то они выполняются слева направо. Примеры записи арифметических выражений приведены в табл. 2.2. Таблица 2.2. Примеры записи арифметических выражений Математическая запись выражения Запись выражения в VBA a + b x+4 +e c+3 (а+в)/(с+3)+Ехр(х+4) sin 2 x + ctg( x) Sin(x)^2+1/Tan(x) a ⋅b a + b + c ⋅ d 4c ⋅ d a*b/(c*d)+(a+b)/(4*c*d) ln x + x a*b/c/d+(a+b)/4/c/d 3 1+ x Application.Ln(Abs(x))+ Abs(x)*3/(1+Sqr(Abs(x))) Арифметические выражения в ячейке В арифметических выражениях можно использовать внутренние (стандартные) функции VBA, встроенные функции рабочего листа и функции, созданные пользователем. Рассмотрим пример с арифметическим выражением. 1. Продолжите работу с тем же файлом в Microsoft Excel, перейдите в среду VBA. 2. Продолжаем работу в том же модуле Module1.
72 Глава 2 3. Напишите процедуру, в которой в ячейку вводятся данные в соответствии с формулами (листинг 2.2). 4. Для запуска макроса нажмите кнопку . Листинг 2.2. Пример ввода данных, задаваемых арифметическим выражением Public Sub Ввод_данных_задаваемых_арифметическим_выражением() Cells(1, 2) = Log(Abs(10))+ Abs(-5)*3/(1 + Sqr(Abs(-4))) Cells(1, 6)=(7+8)/(5+3) + Ехр(2+4) End Sub Действительно, в ячейке В1 (Cells(1, 2)) появилось число 7,30258509299405, а в ячейке F1 (Cells(1, 6)) — число 405,303793492735. Не забудьте, что функция Ехр пишется латинскими буквами. 5. Сохраните документ с поддержкой макросов под тем же именем Листинг_2.1Листинг_2.5_Ввод_данных.xlsm (Файл | Сохранить). П РИМЕЧАНИЕ В выражении Cells(i, j): i — номер строки, j — номер столбца. В переводе с англ. Cells — ячейки. Арифметические выражения с ячейками Арифметические выражения можно не только вводить в ячейках, но и использовать имена ячеек в арифметических выражениях. 1. Продолжите работу с тем же файлом Microsoft Excel, перейдите в среду VBA. 2. Продолжите работу в том же модуле Module1. 3. Напишите процедуру, в которой в ячейку вводятся данные в соответствии с формулами (листинг 2.3). При этом вычисления осуществляются на основе значений, содержащихся в указанных ячейках. 4. Для запуска макроса нажмите клавишу <F5>. Листинг 2.3. Пример арифметических выражений с ячейками Public Sub Арифметические_выражения_с_ячейками() Cells(2, 6) = Cells(1, 1) / Cells(4, 1) + Cells(2, 1) - _ Cells(3, 1) * Cells(1, 2) End Sub 5. Сохраните документ с поддержкой макросов под тем же именем Листинг_2.1Листинг_2.5_Ввод_данных.xlsm (Файл | Сохранить). После выполнения процедуры в ячейке F2 (Cells(2, 6)) появится результат вычисления.
Основы программирования в VBA 73 Обрамление ячейки — метод BorderAround Напишите программу, в которой в активную ячейку вводится дата, задаются обрамляющие границы ячейки и цвет шрифта. В тексте программы VBA необходимо сформировать ссылку на ячейку, к которой осуществляется доступ. Полная ссылка на объект состоит из ряда имен, указанных последовательно друг за другом и отделяемых друг от друга точками. Например, ссылка: Application.Workbooks("Архив").Worksheets("Лист1").Range("A1") служит для доступа к ячейке A1 на листе Лист1 рабочей книги Архив в объекте, которым является приложение Application — программа Excel. Для активной ячейки ActiveCell (т. е. которая в данный момент выделена) задается обрамление при помощи метода BorderAround, имеющего синтаксис: expression.BorderAround(LineStyle, Weight, ColorIndex, Color, ThemeColor) Аргументы:  LineStyle — одна из констант перечисления XlLineStyle, служащая для задания типа линии;  Weight — толщина линии, выбираемая из перечисления XlBorderWeight;  ColorIndex — цвет границы, задаваемый при помощи одной из констант XlColorIndex либо в виде индекса цвета из текущей цветовой палитры;  Color — цвет границы, задаваемый как RGB-значение;  ThemeColor — цвет, задаваемый в виде индекса цвета из текущей цветовой гам- мы или при помощи константы либо значения из перечисления XlThemeColor. Выполните следующие действия. 1. Продолжите работу с тем же файлом Microsoft Excel, перейдите в среду VBA. 2. Новый модуль не добавляйте, продолжите вводить код в модуле Module1. 3. Напишите процедуру, в которой в активную (т. е. выделенную в данный момент) ячейку заносится текущая дата с заданным цветом шрифта и обрамлением границы ячейки (листинг 2.4). 4. Для запуска макроса нажмите клавишу <F5>. Листинг 2.4. Пример записи текущей даты в отформатированную ячейку Public Sub Запись_даты() ActiveCell.Value = Date ActiveCell.Font.ColorIndex = 4 ActiveCell.BorderAround LineStyle:= xlDouble, ColorIndex:=18 End Sub
74 Глава 2 В этом примере выражение ActiveCell.Value задает значение активной ячейки, Font.ColorIndex — цвет шрифта (рис. 2.1). Толщина обрамления определяется одним из значений перечисления XlBorderWeight, а цвет границы — при помощи одной из констант XlColorIndex. 5. Сохраните документ под тем же именем Листинг_2.1-Листинг_2.5_Ввод_данных.xlsm (Файл | Сохранить). Рис. 2.1. Пример форматирования ячейки Оператор With Оператор With позволяет одновременно изменить несколько свойств одного объекта. Синтаксис оператора With, изменяющего несколько свойств одного объекта: With объект .Свойство1 = ЗначениеСвойства1 .Свойство2 = ЗначениеСвойства2 . . . .СвойствоN = ЗначениеСвойстваN End With Предыдущий пример можно переписать с использованием оператора With (листинг 2.5). Продолжайте работу с файлом Листинг_2.1-Листинг_2.5_Ввод_данных.xlsm с тем же модулем. Листинг 2.5. Пример использования оператора With Public Sub Немного_другая_запись_даты() With ActiveCell .Value = Date .Font.ColorIndex = 4 .BorderAround LineStyle:= xlDouble, ColorIndex:=5 End With End Sub
Основы программирования в VBA 75 Воспользуйтесь для запуска макроса кнопкой — результат будет такой же, как в предыдущем примере. Сохраните изменения в файле. Приведем пример программы создания красной вертикальной надписи в ячейке с желтой заливкой, в которой используются два вложенных друг в друга оператора With (см. листинг 2.6, рис. 2.2). В этом случае главным объектом является диапазон данных в виде одной ячейки A2 (Range(A2)), расположенной на первом рабочем листе (Worksheets(1)). Достаточно один раз записать объект через выражение, а затем выполнить для него ряд инструкций. Во вложенном операторе действия осуществляются над объектом Font. Обратите внимание на то, что обращение к свойствам указанного в начале кода объекта выполняется при помощи оператора "точка" (.). При использовании конструкции With...End With нет необходимости каждый раз писать полный путь к объекту и указывать свойство, например, ThisWorkbook.Worksheets(1).Range("A2").Interior.Color = vbYellow Достаточно обратиться к свойствам объекта через точку. Вложенные операторы With 1. Создайте новый файл Microsoft Excel 2019. 2. Перейдите в среду VBA и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 3. Напишите программу согласно листингу 2.6. Листинг 2.6. Вложенные операторы With Sub Вложенные_With() With ThisWorkbook.Worksheets(1).Range("A2") .Interior.Color = vbYellow ' Цвет фона .Value = "VBA Excel 2019" ' Текст надписи .HorizontalAlignment = xlCenter ' Выравнивание по горизонтали .VerticalAlignment = xlCenter ' Выравнивание по вертикали .Orientation = 90 ' 90° Направление текста With .Font .Bold = True ' Жирный .Italic = True ' Курсив .Size = 16 ' 16 пунктов .Color = vbBlue ' Синий – цвет текста End With End With End Sub В этом примере в ячейку A2 на рабочем листе Лист1 вводится текст с соответствующим форматированием.
76 Глава 2 Рис. 2.2. Пример программы, содержащей два оператора With 4. Сохраните документ с поддержкой макросов под именем Листинг_2.6_Вложенные_ With.xlsm. Генерация случайных чисел RAND Visual Basic позволяет использовать функции рабочего листа, зарезервированные для использования в приложении Microsoft Excel 2019. Для того чтобы вставить функцию рабочего листа в заданную ячейку или диапазон ячеек, необходимо обозначить функцию как значение свойства Formula соответствующего объекта Range. В следующем примере функция рабочего листа RAND() (которая генерирует случайное число) назначена для свойства Formula диапазона ячеек A1:B5 на рабочем листе Лист1 активной рабочей книги. Отметим, что в русской версии программы функция имеет название СЛЧИС(). 1. Создайте новый файл Microsoft Excel. Перейдите в среду VBA (<Alt>+<F11>). Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. Напишите программу, в которой ячейки (листинг 2.7) заполняются случайными числами (рис. 2.3). В области ячеек Range("A1:D5") значения вычисляются по формуле или функции "=RAND()". Дополнительно шрифт задан полужирным. 3. Для запуска макроса нажмите клавишу <F5>. Листинг 2.7. Пример генерации случайных чисел Sub Случайное_число() Dim S As Range Set S = Worksheets("Лист1").Range("A1:D5")
Основы программирования в VBA 77 S.Formula = "=RAND()" S.Font.Bold = True End Sub 4. Сохраните документ с поддержкой макросов под именем Листинг_2.7_Случайное_ число.xlsm. Рис. 2.3. Диапазон ячеек, заполненный случайными числами Перевод градусов по Фаренгейту в градусы по Цельсию Рассмотрим пример программы, использующей внешнюю функцию пересчета градусов по Фаренгейту в градусы по Цельсию. 1. Создайте новый файл Microsoft Excel. Перейдите в среду VBA (<Alt>+<F11>). Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. Напишем процедуру Расчет() (листинг 2.8), в которой числовое значение градусов по Фаренгейту вводится в диалоговом окне InputBox. Потом данное значение подставляется в функцию Градусы_по_Цельсию(f) в качестве параметра функции. В ней осуществляется пересчет в градусы по Цельсию по заданной формуле. Затем в окне сообщений MsgBox выводится соответствующее сообщение. Листинг 2.8. Пример пересчета градусов по Фаренгейту в градусы по Цельсию Sub Расчет() Dim t As Integer t = Application.InputBox(Prompt:= _ "Введите температуру в градусах по Фаренгейту", Type:=1) MsgBox "Температура равна " & Градусы_по_Цельсию (t) & _ " градусов C." End Sub
78 Глава 2 Function Градусы_по_Цельсию(f) Градусы_по_Цельсию = (f - 32) * 5 / 9 End Function 3. Запустите макросы на выполнение. Сначала появляется диалоговое окно ввода значения температуры (рис. 2.4, а), а затем — окно сообщений с ответом (рис. 2.4, б). 4. Сохраните документ с поддержкой макросов под именем Листинг_2.8_Фаренгейт.xlsm. а б Рис. 2.4. Окна: а — диалоговое окно ввода температуры; б — ответ программы Замена значений формул числом Иногда в финансовых документах в ячейках требуется иметь просто числа, а не значения формул. Рассмотрим способ замены значений формул числом на примере построения поверхности: z = x 2 − 2exp(0, 2 x) y 2 , при x ∈ [−2; 1,8], y ∈ [−2; 2,5] . 1. Создайте новый файл Microsoft Excel. 2. Введите в ячейку А1 строку Xверт.\Yгориз. В ячейки А2 и А3 введите начальное (–2) и последующее (-1,8, с учетом шага 0,2) значения X, выделите их и "протащите" (вниз) с помощью маркера заполнения до конечного значения. Аналогично, в ячейки В1 и С1 введите начальное (-2) и последующее (-1,5, с учетом шага 0,5) значения Y, выделите их и "протащите" (вправо) с помощью маркера заполнения до конечного значения. 3. В ячейку В2 введите формулу для расчета поверхности: =$A2^2-2*EXP(0,2*$A2)* B$1^2. Те значения, перед которыми указан знак $, при дальнейшем "протаскивании" формулы маркером заполнения изменяться не будут. 4. Выполните автозаполнение: вначале вниз, затем вправо. Для этого подведите указатель мыши в правый нижний угол ячейки В2 (на маркер заполнения), превратите "белый" крест курсора в "черный", нажмите левую кнопку мыши и протащите курсор до ячейки В21. Отпустите мышь, не снимая выделения. 5. Подведите указатель мыши к правому нижнему углу ячейки В21 (на маркер заполнения), превратите "белый" крест курсора в "черный", нажмите левую кнопку мыши и протащите курсор до ячейки K21. Отпустите мышь, не снимая выделения.
Основы программирования в VBA 79 6. По выделенной области В2:K21 постройте поверхность: на вкладке ленты Вставка в группе Диаграммы раскройте список пиктограммы Вставить гистограмму или линейчатую диаграмму и выберите пункт Другие гистограммы. В открывшемся диалоговом окне перейдите на вкладку Поверхностная. Поверхность готова (рис. 2.5), отформатируйте ее по своему желанию. Рис. 2.5. Поверхность 7. В ячейках В2:K21 находятся формулы, замените их числами (листинг 2.9, а). 8. Теперь в редакторе Visual Basic вставьте рабочий модуль Module1. 9. Создайте процедуру в соответствии с листингом 2.9, а, при выполнении которого формулы будут удалены, а на их месте окажутся просто значения, полученные при расчете ранее использованных формул. Формулы из ячеек удаляются в том случае, если вы получили расчетные значения и далее планируете использовать только числовые значения, поскольку при случайном изменении ячеек, на которые есть ссылки, происходит автоматический пересчет данных. В листинге задействовано свойство Selection, которое возвращает объект, представляющий собой текущее выделение активного рабочего листа — набор ячеек.
80 Глава 2 Листинг 2.9, а. Замена формул числом в выделенной области для ячейки как объекта Public Sub Замена_формул_числом_1() Dim Cell As Object For Each Cell In Selection Cell.Formula = Cell.Value Next Cell End Sub 10. Для корректной работы процедуры необходимо предварительно выделить диапазон ячеек В2:K21 на рабочем листе. Будьте внимательны, после работы макроса вернуть формульные данные нельзя. Для запуска макроса в VBA нажмите клавишу <F5>. 11. Обратите внимание, что переменная Cell, задающая ячейку, описана как переменная объекта Object. В этом примере формула заменяется числовым значением каждой ячейки текущего выделения. 12. Сохраните рабочий документ с поддержкой макросов под именем Листинг_2.9_ Поверхность.xlsm. Добавьте к документу новый рабочий модуль Module2. 13. Рассмотрим другой способ вставки в ячейку числового значения вместо формулы (листинг 2.9, б). В предыдущем примере ячейка была описана как переменная объекта Object, теперь опишем ее как переменную объекта Range. В макросе применяется свойство UsedRange, возвращающее объект Range, представляющий собой текущее выделение обозначенного рабочего листа (в данном случае активного рабочего листа). Если свойство HasFormula, отвечающее за наличие формулы в ячейке, возвращает значение True, то формула из строки формул удаляется, а вместо нее записывается результат вычисления по формуле. Листинг 2.9, б. Замена формул числом для ячейки как диапазона Public Sub Замена_формул_числом_2() Dim C As Range For Each C In ActiveSheet.UsedRange If C.HasFormula = True Then C.Formula = C.Value End If Next C End Sub 14. А вот и еще один пример замены формул числом, который работает с формулами, а не с числами (листинг 2.9, в). Пропишем его в модуле Module2. Листинг 2.9, в. Поддержка формул Public Sub Поддержка_формул() Dim Cl As Range
Основы программирования в VBA 81 For Each Cl In ActiveSheet.UsedRange With Cl If .HasFormula = False Then .Clear End If End With Next Cl End Sub Если свойство ячейки HasFormula равно False, то после выполнения макроса ячейка очищается, а в тех ячейках, в которых были формулы, происходит пересчет значений. 15. Сохраните документ под тем же именем Листинг_2.9_Поверхность.xlsm командой Файл | Сохранить. Работа с цветом В данном разделе рассмотрим различные примеры по цветовому оформлению ячеек рабочего листа с использованием VBA. Функция RGB Функция RGB возвращает целое число типа Long, представляющее значение в цветовой модели RGB. Синтаксис функции RGB: RGB(Red, Green, Blue) Аргументы Red, Green и Blue — числа, принимающие значения в диапазоне 0–255 и описывающие соответственно интенсивность красного, зеленого и синего компонентов цвета. Методы и свойства приложения VBA, содержащие цвет, используют его числовые значения. Кроме числовых значений, для задания цвета предусмотрены символьные цветовые константы, например vbRed, vbYellow и др. В табл. 2.3 приведены значения аргументов для стандартных цветов. Таблица 2.3. Цвет и цветовые константы Значение аргумента Red Значение аргумента Green Значение аргумента Blue vbBlack 0 0 0 Синий vbBlue 0 0 255 Зеленый vbGreen 0 255 0 Голубой vbCyan 0 255 255 Красный vbRed 255 0 0 Пурпурный vbMagenta 255 0 255 Цвет Цветовая константа Черный
82 Глава 2 Таблица 2.3 (окончание) Цвет Цветовая константа Значение аргумента Red Значение аргумента Green Значение аргумента Blue Желтый vbYellow 255 255 0 Белый vbWhite 255 255 255 Свойства Color и ColorIndex Свойство Color Свойство Color позволяет задать цветовое оформление для различных объектов Microsoft Excel. При работе с ячейкой или диапазоном ячеек в VBA вначале прописывается сам объект: Range, затем вложенный объект (в нашем случае это Font), а потом свойство для вложенного объекта. 1. Создайте новый файл Microsoft Excel. Введите текстовые и числовые данные в ячейки с B6 по G9. Мы будем их форматировать при помощи цветовой константы vbRed. 2. Перейдите в среду VBA. 3. Добавьте к проекту модуль с помощью команды Insert | Module (Вставить | Модуль). 4. Напишите программу, в которой показан пример использования одной из цветовых констант (листинг 2.10, а). Здесь для указанного диапазона ячеек задается цвет шрифта при помощи свойства Color. 5. Для выполнения процедуры воспользуйтесь командой Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). Запустить макрос на выполнение можно также нажатием кнопки или клавиши <F5>. Листинг 2.10, а. Пример использования цветовой константы vbRed Sub Использование_цветовой_константы() Range("B6:G9").Font.Color = vbRed End Sub 6. Выполните процедуру — цвет шрифта для данных, находящихся в ячейках B6:G9, будет заменен на красный. 7. Сохраните документ с поддержкой макросов под именем Листинг_2.10_Цветной_ столбик.xlsm. Свойство ColorIndex Индексы определяют большее количество цветов, чем цветовые константы. Свойство ColorIndex задает цвет по индексу из палитры (рис. 2.6).
Основы программирования в VBA 83 Рис. 2.6. Палитра цветов и соответствующие индексы Эту палитру можно увидеть и с помощью примеров, программирующих раскрашивание ячеек в соответствии с цветовыми индексами. Цвета из палитры ColorIndex можно отобразить в ячейке на рабочем листе (см. листинг 2.10, б). Иногда удобно знать, какое значение RGB соответствует цвету из палитры (табл. 2.4). Таблица 2.4. Значения RGB-функции для индексов палитры ColorIndex Индекс цвета из палитры RGB-значение Индекс цвета из палитры RGB-значение Индекс цвета из палитры RGB-значение 1 (0, 0, 0) 20 (204, 255, 255) 39 (204, 153, 255) 2 (255, 255, 255) 21 (102, 0, 102) 40 (255, 204, 153) 3 (255, 0, 0) 22 (255, 128, 128) 41 (51, 102, 255) 4 (0, 255, 0) 23 (0, 102, 204) 42 (51, 204, 204) 5 (0, 0, 255) 24 (204, 204, 255) 43 (153, 204, 0) 6 (255, 255, 0) 25 (0, 0, 128) 44 (255, 204, 0) 7 (255, 0, 255) 26 (255, 0, 255) 45 (255, 153, 0) 8 (0, 255, 255) 27 (255, 255, 0) 46 (255, 102, 0) 9 (128, 0, 0) 28 (0, 255, 255) 47 (102, 102, 153) 10 (0, 128, 0) 29 (128, 0, 128) 48 (150, 150, 150) 11 (0, 0, 128) 30 (128, 0, 0) 49 (0, 51, 102) 12 (128, 128, 0) 31 (0, 128, 128) 50 (51, 153, 102) 13 (128, 0, 128) 32 (0, 0, 255) 51 (0, 51, 0) 14 (0, 128, 128) 33 (0, 204, 255) 52 (51, 51, 0) 15 (192, 192, 192) 34 (204, 255, 255) 53 (153, 51, 0) 16 (128, 128, 128) 35 (204, 255, 204) 54 (153, 51, 102) 17 (153, 153, 255) 36 (255, 255, 153) 55 (51, 51, 153) 18 (153, 51, 102) 37 (153, 204, 255) 56 (51, 51, 51) 19 (255, 255, 204) 38 (255, 153, 204)
84 Глава 2 Для того чтобы задать в ячейке заливку цветом из палитры ColorIndex, в Microsoft Excel перейдите на вкладку ленты Главная, в группе Шрифт нажмите на значке заливки и выберите команду Другие цвета…. Откроется диалоговое окно Цвета (рис. 2.7). Перейдите на вкладку Спектр, здесь можно задать значения цвета для цветовой модели RGB, аналогичные значениям для RGB-функции в VBA. Рис. 2.7. Задание цвета в RGB-модели цветов 1. Продолжите работу с предыдущим файлом. 2. Перейдите в среду VBA, в том же модуле напишите программу (листинг 2.10, б), в которой добавляется новый рабочий лист, и на нем нумеруются ячейки Cells от 1 до 56 в столбце A, а затем в столбце B ячейки последовательно раскрашиваются при помощи задания свойства ColorIndex. В нашем случае свойство применяется для установки заливки ячейки через обращение к вложенному объекту Interior. 3. Убедитесь, что курсор находится на одной из строк введенного кода. Восполь. зуйтесь для запуска макроса кнопкой Листинг 2.10, б. Пример закрашивания и нумерации ячеек Public Sub Разноцветный_столбик_на_новом_листе() Dim i As Integer Sheets.Add For i = 1 To 56 With ActiveSheet Cells(i, 1).Value = I 'Установить числовое значение 'для ячеек столбца A Cells(i, 2).Interior.ColorIndex = i 'Установить цветовое значение 'для ячеек столбца B End With
Основы программирования в VBA 85 Next i End Sub 4. Действительно, получился цветной столбик (рис. 2.8). Сохраните документ с поддержкой макросов под тем же именем Листинг_2.10_Цветной_столбик.xlsm. Рис. 2.8. Пример создания палитры цветов Тем, кто любит раскрашивать, можно предложить поэкспериментировать и изменить немного программу и палитру цветов из раскрашенных столбцов (листинг 2.11). 1. Создайте новый файл Microsoft Excel 2019. 2. Напишите программу в среде VBA в модуле Module1 в соответствии с листингом 2.11. 3. Для выполнения процедуры нажмите клавишу <F5>. Листинг 2.11. Закрашенные столбики Public Sub Задание_цветов() Dim i As Integer Dim j As Integer Sheets.Add For i = 1 To 56 With ActiveSheet Cells(1, i).Value = i For j = 1 To 56 Cells(j, i).Interior.ColorIndex = i
86 Глава 2 Next j End With Next i End Sub 4. В результате выполнения программы столбцы будут последовательно окрашены указанными цветами (рис. 2.9). Обратите внимание, что закрашиваются первые 56 ячеек каждого столбца, при работе с диапазонами данных всегда необходимо внимательно указывать конечные значения. 5. Сохраните документ с поддержкой макросов под именем Листинг_2.11_Закрашенные_ столбики.xlsm. Рис. 2.9. Пример раскрашивания столбцов Обратите внимание, что при каждом запуске макроса палитра цветов создается на новом листе, т. к. в программе есть команда добавления листа Sheets.Add. Палитра цветов Для того чтобы без прокрутки увидеть на экране все цвета, напишем программу, которая отобразит четыре столбца по 16 цветов. 1. Создайте новый файл Microsoft Excel 2019. 2. На рабочем листе создайте командную кнопку Создание_ПАЛИТРЫ_ЦВЕТОВ. Для этого на вкладке ленты Разработчик в группе Элементы управления откройте опцию Вставить, в элементах управления Элементы ActiveX (см. рис. 1.24–1.25) выберите инструмент управления Кнопка, активизируйте его и на листе рабочей книги нарисуйте эту кнопку.
Основы программирования в VBA 87 Рис. 2.10. Кнопка создания и палитра цветов Как только вы закончите рисование, в строке формул появится запись (рис. 2.10): =ВНЕДРИТЬ("Forms.CommandButton.1";"") 3. Щелкните по кнопке правой кнопкой мыши и в контекстно-зависимом меню найдите команду Просмотреть код (см. рис. 1.25). Выбор этой команды обеспечивает переход в окно редактора VBA и вывод в нем текста заготовки процедуры: Private Sub CommandButton1_Click() End Sub 4. Между строками шаблона процедуры введите код программы создания палитры цветов в соответствии с листингом 2.12. Обратите внимание, что создание отдельного модуля не потребуется, код располагается в окне кода для рабочего листа Лист1. 5. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение Создание_ПАЛИТРЫ_ЦВЕТОВ. 6. Выйдите из режима конструктора, нажав кнопку Режим конструктора , и щелкните мышью по кнопке Создание_ПАЛИТРЫ_ЦВЕТОВ на рабочем листе — макрос создаст палитру цветов.
88 Глава 2 Листинг 2.12. Пример создания палитры цветов Private Sub CommandButton1_Click() Dim i As Integer For i = 1 To 14 'Индекс и цвет в столбцах A и B Cells(i, 1).Value = i Cells(i, 2).Interior.ColorIndex = 'Индекс и цвет в столбцах C Cells(i, 3).Value = i + 14 Cells(i, 4).Interior.ColorIndex = 'Индекс и цвет в столбцах E Cells(i, 5).Value = i + 28 Cells(i, 6).Interior.ColorIndex = 'Индекс и цвет в столбцах G Cells(i, 7).Value = i + 42 Cells(i, 8).Interior.ColorIndex = Next i 'Ширина столбца 6 пунктов Columns("A:H").ColumnWidth = 6 End Sub i и D i + 14 и F i + 28 и H i + 42 7. Сохраните документ с поддержкой макросов под именем Листинг_2.12_Палитра_ цветов.xlsm. Подсчет цветов в рисунке 1. Создайте новый файл Microsoft Excel 2019. 2. Уберите сетку с экрана: на вкладке ленты Вид в области Отображение снимите флажок Сетка. 3. Уменьшите ширину столбцов с A до M, задав ее равной, например, 2. 4. Нарисуйте на листе цветки, закрашивая ячейки разными цветами и изменяя цвет фона. Для первого цветка будет использоваться диапазон ячеек B2:L12, а для второго — B14:L24. Первый цветок может содержать любые цвета, и подсчет цветов будет осуществляться для всех значений, а для второго цветка задайте гамму цветов: желтый, зеленый, синий, красный. Для правильного подсчета цветов необходимо назначить фиксированные значения указанных цветов в соответствии с RGB-моделью (см. табл. 2.3). 5. Создайте, как показано в предыдущем примере, три кнопки (элементы управления ActiveX): CommandButton1, CommandButton2 и CommandButton3, управляющие подсчетом цветов (рис. 2.11). 6. В режиме конструктора щелкните правой кнопкой мыши по каждой из кнопок, из контекстно-зависимого меню выберите команду Просмотреть код, в появившейся заготовке напишите соответствующий код (листинг 2.13).
Основы программирования в VBA 89 Обратите внимание, что в коде для первой кнопки для каждой ячейки диапазона выполняется проверка на наличие цвета для фона ячейки. Interior — это вложенный объект диапазона Range, служащий для работы с цветом. Если свойство цветового индекса для содержимого ячейки ColorIndex не равно константе "-4142" перечисления XlColorIndex, т. е. "бесцветный", то счетчик увеличивается на единицу. В коде для второй кнопки Подсчет_цветов для подсчета цветов используется свойство Color, работающее с цветом при помощи аргументов либо цветовых констант функции RGB. Имейте в виду, что Excel работает с ограниченным количеством цветов, а именно 56-ю цветами палитры. Тогда цвет, заданный при помощи RGB-функции, будет округлен до ближайшего цвета из палитры. В коде для третьей кнопки поиск цвета осуществляется по индексу цвета из палитры цветов (см. рис. 2.6). П РИМЕЧАНИЕ В листинге 2.13 подсчет количества ячеек, окрашенных одинаковыми цветами, реализован с помощью операторов цикла. Более подробно операторы цикла описаны в главе 4. Рис. 2.11. Пример программы подсчета цветов в рисунке
90 Листинг 2.13. Пример подсчета закрашенных ячеек Sub CommandButton1_Click() 'Подсчет всех цветов при помощи свойства ColorIndex Dim c As Range Dim i As Integer For Each c In Range("B2:L12") If c.Interior.ColorIndex <> -4142 Then '-4142 - цветовая константа i = i + 1 End If Next c MsgBox "Используется " & i & " закрашенных ячеек." End Sub Sub CommandButton2_Click() 'Подсчет определенных цветов при помощи свойства Color Dim c As Range Dim Y As Integer Dim R As Integer Dim B As Integer Dim G As Integer For Each c In Range("B14:L24") Select Case c.Interior.Color Case vbYellow Y = Y + 1 Case vbRed R = R + 1 Case vbBlue B = B + 1 Case vbGreen G = G + 1 End Select Next c MsgBox Y & " желтых ячеек." & Chr(10) & _ R & " красных ячеек." & Chr(10) & _ B & " синих ячеек." & Chr(10) & _ G & " зеленых ячеек." End Sub Sub CommandButton3_Click() 'Подсчет определенных цветов при помощи свойства ColorIndex Dim c As Range Dim Y As Integer Dim R As Integer Dim B As Integer Dim G As Integer Глава 2
Основы программирования в VBA 91 For Each c In Range("B14:L24") Select Case c.Interior.ColorIndex Case 6 Y = Y + 1 Case 3 R = R + 1 Case 5 B = B + 1 Case 4 G = G + 1 End Select Next c MsgBox Y & " желтых ячеек." & Chr(10) & _ R & " красных ячеек." & Chr(10) & _ B & " синих ячеек." & Chr(10) & _ G & " зеленых ячеек." End Sub 7. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение Подсчет_всех_цветов. Аналогично выполните надписи для двух других кнопок. , 8. Выйдите из режима конструктора, нажав кнопку Режим конструктора и щелкните мышью по кнопке Подсчет_всех_цветов на рабочем листе — макрос подсчитает число закрашенных ячеек в указанном диапазоне. 9. Сохраните документ с поддержкой макросов под именем Листинг_2.13_ Цветок.xlsm. Заливка ячейки цветом 1. Создайте новый файл Microsoft Excel 2019. 2. Заполните ячейки цифрами 500 и 1000 в диапазоне A1:D7, применяя заливку красным для ячеек, содержащих значение 1000. 3. Создайте кнопки (элементы управления ActiveX): CommandButton1 — для перекрашивания красных ячеек в желтый цвет при помощи свойства Interior.Color и CommandButton2 — для обратного перекрашивания. В режиме конструктора щелкните правой кнопкой мыши по создаваемой кнопке, из контекстнозависимого меню выберите команду Просмотреть код, в появившейся заготовке напишите соответствующий код для каждой из кнопок (листинг 2.14). В программе используются операторы цикла нахождения ячеек, окрашенных красным цветом, с заменой красного цвета на желтый. Код для второй кнопки восстанавливает исходные цвета.
92 Глава 2 Листинг 2.14. Пример замены цветов Sub CommandButton1_Click() 'Заливка желтым Dim c As Range For Each c In Range("A1:D7") If c.Interior.Color = vbRed Then c.Interior.Color = vbYellow End If Next c End Sub Sub CommandButton2_Click() 'Заливка красным Dim c As Range For Each c In Range("A1:D7") If c.Interior.Color = vbYellow Then c.Interior.Color = vbRed End If Next c End Sub 4. Используя свойства кнопок, расположенных на рабочем листе, переименуйте их в Заливка жёлтым и в Заливка красным. Запустите макросы на исполнение, нажав на каждую из этих кнопок (рис. 2.12). 5. Сохраните документ с поддержкой макросов под именем Листинг_2.14_ Замена_цвета.xlsm. Рис. 2.12. Смена заливки ячеек с красной на желтую
Основы программирования в VBA 93 Защита ячеек рабочего листа от форматирования 1. Создайте новый файл Microsoft Excel 2019. 2. Примените заливку разными цветами для некоторых ячеек из диапазона данных A1:D7 (рис. 2.13). Сделаем так, чтобы вносить любые изменения можно было только для тех ячеек, которые содержат заливку. 3. Для этого создадим две кнопки (элементы управления ActiveX): CommandButton1 — для выборочной защиты ячеек и CommandButton2 — для снятия защиты активного рабочего листа. В режиме конструктора щелкните правой кнопкой мыши по каждой из создаваемых кнопок, из контекстно-зависимого меню выберите команду Просмотреть код, в появившейся заготовке напишите соответствующий код (листинг 2.15). а б Рис. 2.13. Пример программы блокировки ячеек с исключением: а — ввод данных разрешен только в ячейки с заливкой; б — с сообщением о защищенном листе
94 Глава 2 Листинг 2.15. Пример кода для блокировки ячеек листа с исключением Sub CommandButton1_Click() Dim c As Range ActiveSheet.Unprotect 'Отменить защиту активного рабочего листа ActiveSheet.Cells.Locked = True 'Заблокировать все ячейки For Each c In Range("A1:D7") If c.Interior.ColorIndex <> xlColorIndexNone Then c.Locked = False End If Next c ActiveSheet.Protect 'Защитить лист от форматирования MsgBox "Ввод данных возможен только в цветные ячейки" End Sub Sub CommandButton2_Click() ActiveSheet.Unprotect MsgBox "Отменить защиту рабочего листа" End Sub 4. При нажатии первой кнопки устанавливается блокировка всех ячеек рабочего листа от любого изменения, за исключением цветных ячеек из диапазона данных A1:D7. Для этого применяется свойство Range.Locked со значением False, что означает разрешение на изменение объекта, даже если лист защищен (ActiveSheet.Protect). При нажатии второй кнопки происходит снятие защиты рабочего листа при помощи метода Unprotect. 5. Сохраните документ с поддержкой макросов под именем Листинг_2.15_ Блокировка_с_условием.xlsm. Выделение ячеек по цветовому соответствию в диапазоне 1. Создайте новый файл Microsoft Excel 2019. 2. Закрасьте некоторые смежные ячейки желтым цветом в диапазоне данных A1:С6. 3. На том же рабочем листе создайте командную кнопку CommandButton1 (элемент управления ActiveX) для выделения ячеек, окрашенных желтым цветом (рис. 2.14). 4. В свойствах командной кнопки установите свойство Caption в значение Выделить_ячейки. Дважды щелкните левой кнопкой мыши на кнопке в режиме конструктора и введите соответствующий код из листинга 2.16. Листинг 2.16. Пример выделения красных ячеек Private Sub CommandButton1_Click() 'Выделить ячейки по цветовому соответствию Dim c As Range
Основы программирования в VBA 95 Dim strA As String For Each c In Range("A1:C6") If c.Interior.Color = 65535 Then strA = strA & c.Address(False, False) & "," End If Next c If strA <> "" Then Range(Left(strA, Len(strA) - 1)).Select End If End Sub Рис. 2.14. Пример выделения желтых ячеек по нажатию кнопки 5. Сохраните документ с поддержкой макросов под именем Листинг_2.16_ Выделение_ячеек.xlsm. Заливка строк с заданным шагом 1. Создайте новый файл Microsoft Excel 2019. 2. Введите информацию в ячейки (рис. 2.15). Можно применить к ним произвольную заливку. 3. Создайте кнопку CommandButton1 (элемент управления ActiveX) для вызова макроса по закрашиванию строк с данными указанным цветом с шагом 2. Задайте для нее подходящее название при помощи свойства Caption. В режиме конструктора щелкните правой кнопкой мыши по кнопке, из контекстно-зависимого меню выберите команду Просмотреть код, в появившейся заготовке напишите соответствующий код (листинг 2.17). 4. Вначале при работе первого макроса свойство ColorIndex всех ячеек устанавливается равным константе xlNone. Таким образом удаляется начальная заливка ячеек. В коде используется свойство Count для определения количества строк
96 Глава 2 используемого диапазона. Затем в цикле с шагом 2 свойство ColorIndex нечетных строк устанавливается равным 15, тем самым происходит заливка строк серым цветом. 5. Вторая кнопка CommandButton2 (элемент управления ActiveX) предназначена для удаления заливки строк. Листинг 2.17. Пример программы выделения серым цветом строк с шагом 2 Sub CommandButton1_Click() Dim i As Integer Cells.Interior.ColorIndex = xlNone 'Удалить заливку ячеек For i = 1 To ActiveSheet.UsedRange.Rows.Count Step 2 Rows(i).Interior.ColorIndex = 15 Next i End Sub Sub CommandButton2_Click() Cells.Interior.ColorIndex = xlNone End Sub Рис. 2.15. Пример программы выделения ячеек серым цветом 6. Сохраните документ с поддержкой макросов под именем Листинг_2.17_Подсветка_ серым.xlsm. Выделение миганием 1. Создайте новый файл Microsoft Excel 2019. 2. Введите информацию в ячейки в диапазоне данных A1:C13 в соответствии с рис. 2.16. 3. Создайте две кнопки (элементы управления формы): Мигающая подсветка и Выключить мигание на листе рабочей книги. В редакторе Visual Basic вставьте модуль Module1 (команда меню Insert | Module).
Основы программирования в VBA 97 Рис. 2.16. Пример программы выделения миганием 4. В модуле создайте процедуру Включить_мигание (листинг 2.18) — для выделения миганием красным цветом температур ниже нуля. В листинге используется диапазон данных B2:B13. Следующая процедура Выключить_мигание служит для отключения режима мигания, причем если кнопка нажата при подсветке ячеек красным, то закраска не удаляется. 5. Созданным кнопкам, расположенным на рабочем листе, назначьте соответствующие макросы при помощи команды Назначить макрос... из контекстного меню кнопок. Листинг 2.18. Пример выделения миганием Sub Включить_мигание() Static blnStart As Boolean Dim c As Range Range("C1") = blnStart If blnStart = True Then For Each c In Range("B2:B13") If c < 0 Then c.Interior.Color = vbRed Next c blnStart = False ElseIf blnStart = False Then Range("B2:B13").Interior.ColorIndex = xlNone blnStart = True End If Application.OnTime _ EarliestTime:=Now + TimeValue("00:00:01"), _
98 Глава 2 Procedure:="Включить_мигание", _ Schedule:=True End Sub Sub Выключить_мигание() On Error Resume Next Application.OnTime _ EarliestTime:=Now + TimeValue("00:00:01"), _ Procedure:="Включить_мигание", _ Schedule:=False End Sub 6. Сохраните документ с поддержкой макросов под именем Листинг_2.18_ Выделение_миганием.xlsm. Календарь 1. Создайте новый файл Microsoft Excel 2019. Мы будем вводить в ячейки A1, A2 даты, поэтому установите следующий формат ячеек: (все форматы), Тип ДД.ММ.ГГГГ. 2. Введите в ячейку А1 строку Календарь 2020, в ячейку А2 — 01.01.2020, в ячейку B2 — 01.02.2020, выделите ячейки A2 и B2. 3. Позиционируйте курсор мыши на маленьком черном квадрате — белый крест курсора превратится в черный. 4. Нажмите левую кнопку мыши и выполните автозаполнение строки. Благодаря автозаполнению появятся следующие значения: • в ячейке C2 — 01.03.2020; • в ячейке H2 — 01.08.2020; • в ячейке D2 — 01.04.2020; • в ячейке I2 — 01.09.2020; • в ячейке E2 — 01.05.2020; • в ячейке J2 — 01.10.2020; • в ячейке F2 — 01.06.2020; • в ячейке K2 — 01.11.2020; • в ячейке G2 — 01.07.2020; • в ячейке L2 — 01.12.2020. 5. Выполняя автозаполнение столбцов вниз из перечисленных ячеек, сформируйте календарь на 2020 год. Для отображения дат, так же как на рис. 2.17, необходимо установить следующий формат ячеек: (все форматы), Тип ДДД*.ДД.ММ. 6. Закрасьте ячейки, содержащие выходные дни синим цветом, шрифт сделайте белым и полужирным, для этого создайте кнопку CommandButton1 (элемент управления ActiveX) для вызова макроса и напишите соответствующий код. Вторая кнопка CommandButton2 (элемент управления ActiveX) предназначена для снятия подсветки (листинг 2.18). Для определения дня недели, соответствующего дате, используется метод WorksheetFunction.Weekday. По умолчанию день задается целым числом от 1 до 7. Если возвращаемое значение 7 — это суббота, 1 — воскресенье.
Основы программирования в VBA 99 Рис. 2.17. Форматирование в календаре 7. На рабочем листе переименуйте командные кнопки в ВЫХОДНЫЕ и Убрать_форматирование. Запустите обработчики событий, выполняемые по нажатию кнопок. Для этого не забудьте выйти из режима конструктора. Листинг 2.19. Построение календаря и выделение выходных синим цветом Private Sub CommandButton1_Click() Dim c As Range For Each c In Range("A2:L32") If Weekday(c) = 1 Or c <> "" And Weekday(c) = 7 Then c.Interior.Color = vbBlue c.Font.Color = vbWhite c.Font.Bold = True End If Next c End Sub Private Sub CommandButton2_Click() With Range("A2:L32") .Interior.ColorIndex = xlNone .Font.Color = 0 .Font.Bold = False End With End Sub
100 Глава 2 8. Сохраните документ с поддержкой макросов под именем Листинг_2.19_ КАЛЕНДАРЬ.xlsm. Заливка ячеек, содержащих формулы 1. Создайте новый файл Microsoft Excel 2019. 2. Введите в ячейку B2 значение 500, в B3 — 400, в B4 — 300, в С2 — 300, в С4 — 600, в D2 — 500, в D3 — 400, в D4 — 300 (рис. 2.18). Рис. 2.18. Подсветка формул 3. Введите формулы: • в ячейку А1 — =СУММ(B2:B4); • в E1: =СУММ(E2:E5); • в А2 — =СУММ(B3:B3); • в E2: =СУММ(В2:D2); • в А3 — =СУММ(B3:E3); • в E3: =СУММ(В3:D3); • в А4 — =СУММ(B4:E4); • в E4: =СУММ(В4:D4); • в А5 — =СУММ(B5:E5); • в E5: =СУММ(E2:E4); • в В1 — =СУММ(B2:B5); • в C3: =СУММ(B2:B4); • в B5 — =СУММ(B2:B4); • в D1: =СУММ(D2:D5); • в С1 — =СУММ(С2:С5); • в D5: =СУММ(D2:D4). • в C5 — =СУММ(C2:C4); 4. Применим заливку к ячейкам, содержащим формулы, красным и синим цветом. Для этого на рабочем листе создайте две кнопки для форматирования при вызове макроса: CommandButton1 и CommandButton2 и одну кнопку CommandButton3 — для удаления форматирования (элементы управления ActiveX). Переименуйте командные кнопки рабочего листа (см. рис. 2.18) и назначьте им соответствующие макросы. В листинге 2.20 приведен код для заливки ячеек, содержащих формулы, красным и синим цветами, и для отмены форматирования. В коде для первой кнопки
Основы программирования в VBA 101 формульные ячейки находятся при использовании метода SpecialCells с перечислением xlCellTypeFormulas. Во втором примере задействовано свойство HasFormula: если возвращаемое значение True, это означает, что ячейка из используемого диапазона UsedRange содержит формулу. Листинг 2.20. Примеры заливки формульных ячеек Private Sub CommandButton1_Click() ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas).Interior.Color = _ vbRed End Sub Private Sub CommandButton2_Click() Dim c As Range For Each c In ActiveSheet.UsedRange If c.HasFormula = True Then c.Interior.Color = vbBlue End If Next c End Sub Private Sub CommandButton3_Click() Range("A1:E5").Interior.ColorIndex = -4142 End Sub В третьем примере управление заливкой ячейки осуществляется через свойство Interior.ColorIndex, которое приравнивается значению –4142 (либо xlColorIndexNone), что означает отмену заливки. 5. Сохраните документ с поддержкой макросов под именем Листинг_2.20_Выделение_ формул.xlsm. Подсветка минимального и максимального значений 1. Создайте новый файл Microsoft Excel 2019. 2. Введите в ячейки информацию в соответствии с рис. 2.19. В диапазоне ячеек B2:E5 содержатся числовые данные. 3. Создайте командные кнопки на рабочем листе (категория Элементы управления ActiveX): кнопку CommandButton1 — для форматирования закраски ячеек и кнопку CommandButton2 — для удаления форматирования. Переименуйте кнопки в МинМакс и Удалить заливку ячеек. 4. В редакторе VBA создайте макрос (листинг 2.21), подсвечивающий ячейки с минимальными значениями красным цветом и ячейки с максимальными значениями — зеленым. Поиск минимумов и максимумов ведется по столбцам. Обратите внимание, что в листинге определена переменная, представляющая собой
102 Глава 2 объект WorksheetFunction, содержащий все функции рабочего листа, которые можно вызвать в редакторе VBA. Поиск наименьшего и наибольшего значений ведется с использованием методов WorksheetFunction.Min и WorksheetFunction.Max соответственно. В обработчике события, выполняемого по нажатию второй кнопки, удаляется заливка ячеек заданного диапазона. Рис. 2.19. Подсветка минимаксных значений Листинг 2.21. Подсветка ячеек с минимальным и максимальным значениями Sub CommandButton1_Click 'Подсветка минимаксных значений Dim c As Range Dim f As WorksheetFunction Set f = Application.WorksheetFunction For Each c In Range("B2:E5") c.Interior.ColorIndex = xlNone If c = f.Min(Columns(c.Column)) Then c.Interior.Color = vbRed End If If c = f.Max(Columns(c.Column)) Then c.Interior.Color = vbGreen End If Next c Set f = Nothing End Sub Sub CommandButton2_Click Range("B2:E5").Interior.ColorIndex = xlNone End Sub
Основы программирования в VBA 103 5. Сохраните документ с поддержкой макросов под именем Листинг_2.21_ МинМакс.xlsm. Цветовая шкала 1. Создайте новый файл Microsoft Excel 2019. 2. Перейдите в среду VBA (<Alt>+<F11>). Можно также нажать комбинацию клавиш <Alt>+<F11>. 3. Добавьте к проекту модуль Module1 (Insert | Module (Вставить | Модуль)). 4. Создайте макрос, генерирующий цветовую шкалу (рис. 2.20), и запустите его (листинг 2.22). Не забывайте при этом указать в начале окна кода оператор Option Explicit. Обратите внимание, что в листинге определена переменная, представляющая собой объект VBA ColorScale, для работы с цветовой шкалой, заданной по определенным правилам условного форматирования. 5. Для выполнения процедуры нажмите клавишу <F5>. Листинг 2.22. Пример создания цветовой шкалы Sub Создание_цветовой_шкалы() Dim cfColorScale As ColorScale With ActiveSheet .Range("A1") = 1 .Range("B1") = 2 .Range("A1:B1").AutoFill Destination:=Range("A1:R1") 'Автозаполнение ячеек данными от 1 до 10 End With Range("A1:R1").Select Set cfColorScale = _ Selection.FormatConditions.AddColorScale(ColorScaleType:=2) 'Создать двухцветную цветовую шкалу как объект ColorScale 'для выделенного диапазона ячеек, содержащих числовые данные 'Задать минимальный порог цвета красным, максимальный - голубым cfColorScale.ColorScaleCriteria(1).FormatColor.Color = RGB(255, 0, 0) cfColorScale.ColorScaleCriteria(2).FormatColor.Color = RGB(0, 0, 255) End Sub 6. Сохраните документ с поддержкой макросов под именем Листинг_2.22_Цветовая_ шкала.xlsm.
104 Глава 2 Рис. 2.20. Цветовая шкала
ГЛАВА 3 Логические операторы Оператор If...Then...Else Алгоритмом ветвящейся структуры, или логическим оператором, называется алгоритм, в котором выбирается один из нескольких возможных путей (вариантов) вычислительного процесса. Ветвью алгоритма называется каждый подобный путь. Признак разветвляющегося алгоритма — наличие операций условного перехода, когда проверяется истинность некоторого логического выражения (проверяемого условия) и в зависимости от его истинности или ложности для выполнения выбирается та или иная ветвь алгоритма. Алгоритм предполагает выполнение действия 1, если записанное условие истинно (выполняется), и выполнение действия 2, если условие ложно (не выполняется). В частном случае один из блоков (действие 1 или действие 2) может отсутствовать. На рис. 3.1 показан логический алгоритм, записанный с помощью псевдокода и графически в виде блок-схемы. Пусть, например, В — проверяемое условие, а S1, S2 — некоторые выполняемые инструкции (действия). Тогда: Если условие В выполняется (истинно), то выбрать для исполнения S1, иначе выбрать для исполнения S2 Операторы сравнения Логические операторы могут содержать арифметические операторы сравнения (табл. 3.1). Наряду с арифметическими операторами сравнения в логических выражениях If...Then...Else используются словесные операторы алгебры логики (табл. 3.2).
106 Глава 3 Псевдокод Блок-схема 1. Начало 2. Ввод (...) 3. Если В то S1 иначе S2 4. Вывод (...) 5. Конец Рис. 3.1. Логический алгоритм, записанный на псевдокоде и графически в виде блок-схемы Таблица 3.1. Арифметические операторы сравнения Оператор сравнения Описание = Равно <> Не равно > Больше >= Больше либо равно < Меньше <= Меньше либо равно Таблица 3.2. Операторы алгебры логики Оператор сравнения Описание AND Логическое И EQV Логическая эквиваленция. Операция, выражаемая связками "тогда и только тогда", "необходимо и достаточно" или "... равносильно ...", называется эквиваленцией (двойной импликацией) и обозначается знаком ↔ или ~. Высказывание А↔В истинно тогда и только тогда, когда значения А и В совпадают
Логические операторы 107 Таблица 3.2 (окончание) Оператор сравнения Описание IMP Логическая импликация (от лат. implico — тесно связаны). Операция, выражаемая связками "если ..., то", "из ... следует" или "... влечет" и обозначаемая знаком →. Высказывание А→В ложно тогда и только тогда, когда А истинно, а В — ложно NOT Логическое НЕ OR Логическое ИЛИ XOR Логическое Исключающее ИЛИ Неполная форма оператора If...Then 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>). Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. Напишите программу, в которой используется только первая часть логического оператора If...Then (если...то) (листинг 3.1), когда оператор выполняется только в случае, если условие истинно. Не забудьте указать в начале окна кода оператор Option Explicit. 3. Для выполнения процедуры воспользуйтесь командой Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). Запустить макили нажатием клавиши <F5>. рос на выполнение можно также кнопкой Листинг 3.1. Пример логического оператора If...Then Sub Если_то() Dim temp As Double temp = 36.6 If temp = 36.6 Then MsgBox "Вы здоровы" End If End Sub В результате выполнения этого макроса появляется текстовое сообщение в мини-окне с надписью: Простой логический оператор. 4. Сохраните документ с поддержкой макросов под именем Листинг_3.1-Листинг_3.3_ Простые_логические_операторы.xlsm. Для этого необходимо выбрать команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла выбрать вариант сохранения файла: Книга Excel с поддержкой макросов. Э ЛЕКТРОННЫЙ АРХИВ Сохраненные листинги этой главы вы найдете в папке Глава_3_Условие сопровождающего книгу электронного архива.
108 Глава 3 Полная форма оператора If...Then...Else 1. Продолжите работу с предыдущим документом. Примером полной формы логического оператора If...Then...Else (если...то...иначе) служит листинг 3.2. Здесь в случае, если условие истинно, выполняется один оператор, а если условие ложно, выполняется другой оператор. Заметьте, конструкция Option Explicit повторно не используется. 2. На рабочем листе в ячейку A1 введите ненулевое значение. Остальные ячейки пусть будут пустыми. 3. Для выполнения процедуры нажмите клавишу <F5>. Листинг 3.2. Пример логического оператора If...Then...Else Sub Если_то_иначе() Dim k As Byte k = Application.InputBox(prompt:="Укажите ячейку", Type:=8) If k <> 0 Then 'Если k не равно 0 MsgBox "Ячейка содержит число" Else MsgBox "Значение не задано" End If End Sub 4. При выполнении процедуры необходимо в диалоговом окне ввода указать при помощи левой кнопки мыши ячейку A1 на рабочем листе в Microsoft Excel. Будет выведено соответствующее сообщение. 5. Сохраните видоизмененный документ с поддержкой макросов под тем же именем Листинг_3.1-Листинг_3.3_Простые_логические_операторы.xlsm. Оператор ElseIf 1. Продолжите работу с тем же документом. Усложните немного предыдущую программу, добавив логический оператор ElseIf (иначе-если) (листинг 3.3). Здесь в случае, если условие истинно, выполняется оператор, а если условие ложно, проверяется другое условие. Заметьте, конструкция Option Explicit повторно не используется. 2. Для выполнения процедуры нажмите клавишу <F5>. Листинг 3.3. Пример использования логического оператора ElseIf Sub Решение_3() Dim k As Integer k = Application.InputBox(prompt:="Введите номер дома", Type:=1) If k Mod 2 = 0 And k > 0 Then MsgBox "Четная сторона"
Логические операторы 109 ElseIf k Mod 2 <> 0 And k > 0 Then _ 'Если остаток от деления k на 2 не равен 0 и k больше 0 MsgBox "Нечетная сторона" ElseIf k = 0 Then MsgBox "Нумерация неправильная" Else MsgBox "Отрицательное значение" End If End Sub 3. Сохраните видоизмененный документ с поддержкой макросов под тем же именем Листинг_3.1-Листинг_3.3_Простые_логические_операторы.xlsm. Вложенные логические операторы 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>). Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. Напишите программу, в которой используются вложенные логические операторы If...Then...Else (если...то...иначе) (листинг 3.4). Не забывайте указывать в начале окна кода оператор Option Explicit. 3. Для выполнения процедуры нажмите клавишу <F5>. Листинг 3.4. Пример вложенных логических операторов If...Then...Else Sub ВЛОЖЕННЫЕ_РЕШЕНИЯ() Dim strKredit As String Dim strRaschet As String strKredit = "Да" strRaschet = "RUB" If strKredit = "Да" Then If strRaschet = "EUR" Then MsgBox "Кредитование. Расчет в EUR." Else MsgBox " Кредитование. Расчет в рублях." End If Else MsgBox "Нет кредитования." End If End Sub 4. Сохраните видоизмененный документ с поддержкой макросов под именем Листинг_3.4_Вложенные_логические_операторы.xlsm.
110 Глава 3 Примеры использования логических операторов Рассмотрим несколько примеров, содержащих не только уже известные логические операторы, но и другие команды. Свойство Name 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. Напишите программу, использующую свойство Name, которое возвращает значение типа String, представляющее собой имя объекта (листинг 3.5). 3. Для выполнения процедуры нажмите клавишу <F5>. 4. Если активный лист называется Прибыль, то появится сообщение о расчете прибыли по месяцам, в противном случае — сообщение с просьбой переименовать лист. Листинг 3.5. Определение объектов приложения Microsoft Excel Sub Активный_лист() If ActiveSheet.Name = "Прибыль" Then MsgBox "Расчет прибыли по месяцам" Else MsgBox "Переименуйте лист!" End If End Sub 5. Сохраните документ под именем Листинг_3.5_If_Then_Else.xlsm. Свойство Value 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). В листинге 3.6 приведен код программы, определяющей при помощи свойства пуста активная ячейка или содержит значение в виде числа или текста с выдачей соответствующего сообщения. Value, 2. Для запуска макроса нажмите кнопку . Листинг 3.6. Значение для активной ячейки Public Sub Значение_активной_ячейки() If ActiveCell.Value = "" Then MsgBox "Ячейка пустая", vbInformation
Логические операторы 111 Else MsgBox "Ячейка не пустая", vbInformation End If End Sub 3. Сохраните документ под именем Листинг_3.6_Свойство_Name.xlsm. Функции IsEmpty и IsNumeric 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). В листинге 3.7 приведен код программы, определяющей, содержит ячейка число, текст или она пуста. Для этого использованы функция IsEmpty, определяющая, была ли активная ячейка пустой, и функция IsNumeric, определяющая, содержит ли активная ячейка число. Если не подходит ни первый, ни второй случай, ячейка определяется как текстовая. Обе функции являются логическими, принадлежат VBA и используют синтаксис Function ...(Expression) As Boolean. 2. Для запуска макроса нажмите кнопку . Листинг 3.7. Пример программы, определяющей, содержит ячейка число, текст или она пуста Sub Тип_данных_в_ячейке() If IsEmpty(ActiveCell.Value) Then MsgBox "Ячейка пустая", vbInformation Else If IsNumeric(ActiveCell.Value) Then MsgBox "Ячейка содержит число", vbInformation Else MsgBox "Ячейка содержит текст", vbInformation End If End If End Sub В результате выполнения макроса выдается результирующее сообщение "Ячейка содержит число", если ячейка содержит число, сообщение "Ячейка пустая", если ячейка пуста, и сообщение "Ячейка содержит текст", если она содержит текст. 3. Сохраните документ под именем Листинг_3.7_Тип_данных_в_ячейке.xlsm. Свойство Range.HasFormula 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)).
112 Глава 3 В листинге 3.8 приведен код программы, определяющей по свойству ячейки Range.HasFormula, содержит ли ячейка формулу (свойство возвращает значение True) или нет. Обратите внимание, что результирующее сообщение MsgBox имеет в заголовке надпись, задаваемую свойством Title (рис. 3.2). 2. Для запуска макроса нажмите кнопку . Листинг 3.8. Пример программы, определяющей, содержит ли ячейка формулу Public Sub Проверка_формулы() If ActiveCell.HasFormula = True Then MsgBox "Ячейка " & ActiveCell.Address & " содержит формулу!", _ Title:="Свойство HasFormula" Else MsgBox "Ячейка " & ActiveCell.Address & " не содержит формулу!" End If End Sub Рис. 3.2. Пример определения наличия формулы в ячейке В результате выполнения макроса выдается результирующее сообщение "Ячейка ... содержит формулу!", если ячейка содержит формулу, и сообщение "Ячейка ... не содержит формулу!", если ячейка не содержит формулу. 3. Сохраните документ под именем Листинг_3.8_Формула_или_нет.xlsm. Переход к ячейке A2019 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)).
Логические операторы 113 2. Напишите программу, содержащую операторы, которые позволят осуществить переход к ячейке A2019 (листинг 3.9). В программе содержится оператор GoTo (Переход к) для автоматического перехода программы к строке, помеченной меткой, в случае возникновения ошибки. В этом примере если в момент выполнения программы пользователь нажимает клавишу <Esc> или сочетание клавиш <Ctrl>+<Break>, то данное прерывание программа воспринимает как ошибку, перехватываемую обработчиком события, описанным при помощи конструкции On Error GoTo. Тогда выполнение программы прекращается, и возникает окно с сообщением об ошибке. 3. Для запуска макроса нажмите кнопку . Листинг 3.9. Пример программы перехода по метке Sub Код_ошибки18() Dim i As Integer, str As String On Error GoTo METKA Application.EnableCancelKey = xlErrorHandler str = MsgBox("Внимание, понадобится время. " & _ "Эту процедуру не прервать. " & _ "ВЫ ПРОДОЛЖИТЕ?", vbOKCancel) If str = vbOK Then For i = 1 To 2019 Cells(i, 1).Select Next i End If Exit Sub METKA: If Err = 18 Then MsgBox "Ошибка." End Sub Интересно, как долго будет работать программа, если вместо перехода к ячейке A2019 вы захотите перейти к ячейке А1048576? П РИМЕЧАНИЕ В этом примере использовалась инструкция On Error, которая обеспечивает выявление ошибок. Далее, в главе 15, будут рассматриваться вопросы перехвата ошибок и их обработки программой. 4. Сохраните документ под именем Листинг_3.9_Переход_по_метке.xlsm. Пример с оператором Case 1. Создайте новый файл Microsoft Excel 2019. Создадим программу, которая будет определять цвет активной ячейки и в соответствии с цветом осуществлять вывод сообщения. 2. На рабочем листе закрасьте три ячейки красным, желтым и зеленым цветом для имитации светофора (рис. 3.3). Также можно закрасить несколько смежных ячеек,
114 Глава 3 Рис. 3.3. Работа программы Светофор придав картинке форму. К выбору цвета и последующей работе с ним в VBA необходимо подходить аккуратно. Задайте цвета при помощи цветовых компонентов модели RGB (см. табл. 2.4) в диалоговом окне Цвета. 3. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). В листинге 3.10 содержится код программы с оператором Case с числовыми значениями, служащими для описания цвета для свойства ColorIndex. 4. Для выполнения процедуры нажмите клавишу <F5>. Предварительно выберите на рабочем листе Excel ячейку светофора. Листинг 3.10. Пример использования оператора Case Sub Оператор_SelectCase() Dim svet As Variant svet = ActiveCell.Interior.ColorIndex Select Case svet Case 3 MsgBox "Остановись" Case 6 MsgBox "Жди" Case 4 MsgBox "Иди" Case Else MsgBox "Светофор не работает" End Select End Sub
Логические операторы 115 В результате выполнения процедуры в переменную типа Variant записывается значение цвета активной ячейки. В зависимости от него появляется то или иное сообщение. Если ячейка пустая, то появляется сообщение "Светофор не работает". 5. Сохраните документ под именем Листинг_3.10_SelectCase.xlsm. Функция InputBox Функция InputBox инициирует появление диалогового окна InputBox, предназначенного для ввода информации. Это окно содержит сообщение и поле ввода, а также две кнопки: OK и Cancel. Возвращаемое значение — строка. Функция устанавливает режим ожидания ввода текста пользователем или нажатия им кнопки, а затем возвращает значение типа String, содержащее текст, введенный в поле. Синтаксис функции: InputBox(Promt, [Title], [Default], [xpos], [ypos], [Helpfile, Context]) as String Аргументы:  Promt — строковое выражение, отображаемое в качестве сообщения в диалого- вом окне, обязательный аргумент;  Title — строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот аргумент опущен, то в строку заголовка помещается имя приложения;  Default — строковое выражение, отображаемое в поле ввода по умолчанию, если пользователь не введет другую строку. Если этот аргумент опущен, поле ввода отображается пустым;  xpos — обозначает положение по x в пунктах для диалогового окна по отноше- нию к левому верхнему краю экрана. Если этот аргумент опущен, диалоговое окно выравнивается по центру экрана по горизонтали;  ypos — обозначает положение по y в пунктах для диалогового окна по отноше- нию к левому верхнему краю экрана;  Helpfile — строковое выражение, которое определяет имя файла справки, со- держащего справочные сведения о данном диалоговом окне. Если этот аргумент указан, то следует задать и аргумент Context;  Context — числовое выражение, определяющее номер соответствующего разде- ла справочной системы. Если этот аргумент указан, то следует задать и аргумент Helpfile. Рассмотрим пример с функцией InputBox. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)).
116 Глава 3 2. Напишите программу (листинг 3.11), показывающую работу оператора Case, с помощью которого выбор определяется по значению, введенному в диалоговое окно InputBox (рис. 3.4). 3. Для запуска макроса нажмите кнопку . Листинг 3.11. Пример оператора Case Public Sub Целое_число() Dim i As Integer i = InputBox("Введите целое число >= 1") Select Case i Case 1 To 5 MsgBox "Число лежит в пределах от 1 до 5" Case 6 To 8 MsgBox "Число лежит в пределах от 6 до 8" Case 9 To 15 MsgBox "Число лежит в пределах от 9 до 15" Case 15 To 50 MsgBox "Число лежит в пределах от 15 до 50" Case Is > 50 MsgBox "Число больше 50" Case Else MsgBox "Допустимое значение не было введено" End Select End Sub 4. Сохраните документ под именем Листинг_3.11_CASE_InputBox.xlsm. а б Рис. 3.4. Диалоговые окна: а — ввод данных в окне InputBox; б — вывод результата Оператор GoTo 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). В листинге 3.12 приведен код программы с оператором GoTo для перехода в указанную строку процедуры в случае возникновения ошибки On Error.
Логические операторы 117 2. Для выполнения процедуры нажмите клавишу <F5>. Листинг 3.12. Пример использования оператора GoTo при возникновении ошибки Sub ОператорGoTo() Dim s1 As String On Error GoTo Переход_к_метке s1 = "Запрос.xls" Workbooks.Open s1 Переход_к_метке: MsgBox "Файл Microsoft Excel с названием " & s1 & " не найден" Workbooks.Close End Sub При попытке открыть несуществующую рабочую книгу возникает ошибка. При этом осуществляется переход по метке с выводом сообщения (рис. 3.5). 3. Сохраните документ под именем Листинг_3.12_Оператор_Goto.xlsm. Рис. 3.5. Пример результата использования оператора GoTo Проверка существования файла 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). В листинге 3.13 приведен код программы, в которой показан еще один вариант использования оператора If...Then...Else (если...то...иначе). В строке s1 пропишите полный путь к первому файлу, а в строке s2 — полный путь ко второму файлу. Не забывайте при этом указать в начале окна кода оператор Option Explicit. 2. Для выполнения процедуры нажмите клавишу <F5>. Листинг 3.13. Пример программы с оператором If...Then...Else Sub Открыть_книгу() Dim s1 As String Dim s2 As String s1 = "C:\Листинг_3.14_CASE_Свойства_Excel.xlsm" s2 = "C:\Проверка.xlsm"
118 Глава 3 If Dir(s2) = "" Then MsgBox "Файл " & (s2) & " не существует." Else _ Workbooks.Open s2 End Sub В результате выполнения процедуры из листинга 3.13 появляется сообщение "Файл С:\Проверка.xlsm не существует"; если же искомый файл будет найден, то он откроется в программе Microsoft Excel. 3. Сохраните документ под именем Листинг_3.13_If_Then_Else_Книги_нет.xlsm. Свойства объекта Application 1. Создайте новый файл Microsoft Excel 2019. Напишем программу, в которой определим при помощи свойств Application.Version, Application.Build, Application.OperatingSystem версию приложения Microsoft Excel, номер сборки, а также тип операционной системы, для которой запущено приложение Excel. Отметим, что все свойства относятся к объекту Application и характеризуют приложение Microsoft Excel. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 3. Текст программы приведен в листинге 3.14. Вывод версии программы осуществляется в окне сообщений, а все три свойства — в окно Immediate (Окно отладки) редактора Visual Basic. Кроме того, в программе показана работа оператора Case. 4. Для запуска макроса нажмите кнопку . Листинг 3.14. Пример работы оператора Case для определения версии программы Public Sub Версия_Excel() Select Case Left(Application.Version, 2) Case "14" MsgBox "Microsoft Excel версии 2010" Case "15" MsgBox "Microsoft Excel версии 2013" Case "16" MsgBox "Microsoft Excel версии 2016" Case "17" MsgBox "Microsoft Excel версии 2019" Case Else MsgBox "Нет данных относительно версии", vbInformation End Select Debug.Print Application.Version Debug.Print Application.Build Debug.Print Application.OperatingSystem End Sub 5. Сохраните документ под именем Листинг_3.14_CASE_Свойства_Excel.xlsm.
ГЛАВА 4 Операторы цикла Алгоритм называется циклическим, если он содержит многократное выполнение одних и тех же ветвей при различных значениях промежуточных данных. Число повторений этих ветвей алгоритма может быть задано в явной или неявной форме. Циклические алгоритмы включают в себя циклы. Циклом называется многократное выполнение одних и тех же действий при различных значениях параметров. Последовательность операторов, выполняемых в цикле многократно, называется телом цикла. Каждое выполнение тела цикла называется шагом цикла. Существует несколько базовых структур цикла: цикл с параметром (цикл с заданным количеством повторений), цикл с предусловием (когда на каждом шаге сначала проверяется условие, а затем выполняется тело цикла), цикл с постусловием (когда на каждом шаге сначала выполняется тело цикла, а затем проверяется условие). В VBA существует несколько видов циклических инструкций (операторов цикла), с помощью которых можно организовать данные структуры. Рассмотрим эти операторы и примеры их использования. Цикл For...To...Step...Next Этот оператор реализует цикл с параметром. Он используется, как правило, когда заранее известно количество повторений тела цикла. Синтаксис оператора: For Счетчик = Начальное значение To Конечное значение [Step Шаг] Тело цикла Next Счетчик Здесь Счетчик — целочисленная переменная, называемая параметром цикла; Начальное значение и конечное значение — переменные или выражения, задающие значение параметра цикла на первом и последнем шагах; Шаг — целочисленное значение, определяющее шаг изменения параметра цикла. Шаг указывать не обязательно; если шаг не указан, он считается равным 1.
120 Глава 4 1. Перейдите в среду VBA (<Alt>+<F11>). Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. Напишите программу, в которой ячейки выделяются с помощью макроса (листинг 4.1). Не забудьте ввести в начале окна кода оператор Option Explicit. 3. Для выполнения процедуры воспользуйтесь командой Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). Запустить макили нажатием клавиши <F5>. рос на выполнение можно также кнопкой Листинг 4.1. Пример цикла For...To...Step...Next Public Sub Выделение_ячеек() Dim i As Integer For i = 1 To 50 Step 5 Cells(i, 1).Select Next i End Sub Здесь и далее целочисленная переменная i — переменная цикла. В этом примере в цикле последовательно выделяются ячейки A6, A11, A16, A21, A26, A31, A36, A41, A46. В результате окажется выделенной ячейка A46. 4. Сохраните вновь созданную книгу с поддержкой макросов под именем Листинг_4.1_Выделение_ячеек.xlsm. Для этого выберите команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла укажите вариант сохранения файла Книга Excel с поддержкой макросов. Э ЛЕКТРОННЫЙ АРХИВ Листинг 4.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_4_Цикл сопровождающего книгу электронного архива. Для того чтобы выделить ячейку А2019, необходимо немного изменить код: For i = 1 To 2019 Cells(i, 1).Select Next i Цикл For...To...Next В следующем примере используются операторы цикла For...To...Next. Поскольку в программе не указан оператор Step, то считается, что шаг по умолчанию равен 1. 1. Создайте новый файл Microsoft Excel 2019, содержащий два листа: Лист1 и Лист2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. Напишите программу с операторами цикла For...To...Next (листинг 4.2).
Операторы цикла 3. Для запуска макроса нажмите кнопку 121 . Листинг 4.2. Пример цикла For...To...Next Sub Указатель_цикла() Dim Counter As Integer For Counter = 1 To 20 Worksheets("Лист2").Cells(3, Counter).Value = Counter Next Counter End Sub В этом примере в цикле последовательно заполняются ячейки с A3 по Т3 рядом целых чисел с 1 до 20, т. е. формируется строка. Причем заполнение осуществляется на рабочем листе Лист2. 4. Сохраните документ с поддержкой макросов под именем Листинг_4.2_Указатель_ цикла.xlsm. Заполнение столбца Приведем пример аналогичной программы, только в ней после работы макроса заполняется столбец ячеек с A1 по А5 рядом целых чисел от 1 до 5 (листинг 4.3). В коде программы содержится объект Workbook.Worksheets, указывающий на лист рабочей книги. При этом заполнение осуществляется на рабочем листе Лист3. С ОВЕТ Чтобы каждый раз не писать конструкцию ThisWorkbook.Worksheets(N), где N — номер листа, можно использовать запись ActiveSheet (Активный лист). В этом случае программа выполняется на текущем листе приложения Microsoft Excel. 1. Создайте новый файл Microsoft Excel 2019, а в нем три рабочих листа. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 3. Напишите программу согласно листингу 4.3. 4. Для запуска макроса нажмите кнопку . Листинг 4.3. Пример цикла For...To...Next: заполнение столбца Sub For_To() Dim i As Integer For i = 1 To 5 ThisWorkbook.Worksheets(3).Cells(i, 1) = i Next i End Sub 5. Сохраните документ с поддержкой макросов под именем Листинг_4.3_Цикл_ For_То_столбец.xlsm.
122 Глава 4 Заполнение столбца с большим шагом Приведем пример аналогичной программы, только в ней после работы макроса заполняется столбец ячеек с B1 по B5 рядом целых чисел с большим шагом (листинг 4.4, рис. 4.1). При этом заполнение осуществляется на Листе1. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. Напишите программу согласно листингу 4.4. 3. Для выполнения процедуры нажмите клавишу <F5>. Листинг 4.4. Пример цикла For...To...Next: заполнение столбца с большим шагом Sub Большой_шаг() Dim i As Integer Dim x As Integer For i = 1 To 50 Step 10 x = x + 1 ThisWorkbook.Worksheets(1).Cells(x, 2) = i Next i End Sub Рис. 4.1. Заполнение столбца числами с шагом 10 4. Сохраните документ с поддержкой макросов под именем Листинг_4.4_Большой_ шаг.xlsm. Отрицательный шаг Приведем пример программы, в которой в цикле задан отрицательный шаг. После работы макроса заполняется столбец ячеек с С1 по С5 рядом целых чисел (лис-
Операторы цикла 123 тинг 4.5, рис. 4.2). При этом заполнение осуществляется на Листе1. Целая переменная i — переменная цикла. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. Напишите программу согласно листингу 4.5. 3. Для выполнения процедуры нажмите клавишу <F5>. Листинг 4.5. Пример цикла For...To...Next: отрицательный шаг Sub Отрицательный_шаг() Dim i As Integer Dim x As Integer For i = 50 To 1 Step -10 x = x + 1 ThisWorkbook.Worksheets(1).Cells(x, 3) = i Next i End Sub Рис. 4.2. Отрицательный шаг 4. Сохраните документ с поддержкой макросов под именем Листинг_4.5_ Отрицательный шаг.xlsm. Выход из цикла по условию Приведем пример программы, в которой выход из цикла контролируется условием. После работы макроса на Листе1 заполняется столбец ячеек с D1 по D5 рядом целых чисел 1, 2, 3, 4, 5 (листинг 4.6, рис. 4.3). 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)).
124 Глава 4 2. Напишите программу согласно листингу 4.6. 3. Для выполнения процедуры нажмите клавишу <F5>. Листинг 4.6. Пример цикла For...To...Next: выход из цикла по условию Sub Выход_по_условию() Dim i As Integer For i = 1 To 10 If i > 5 Then Exit For End If ThisWorkbook.Worksheets(1).Cells(i, 4) = i Next i End Sub В программе выход из цикла управляется условием: If i > 5 Then Exit For End If 4. Сохраните документ с поддержкой макросов под именем Листинг_4.6_Условие_ выхода.xlsm. Рис. 4.3. Выход из цикла по условию Кнопка для запуска макроса (элемент управления формы) Ранее было рассмотрено несколько способов запуска макроса: команда Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму), кнопка и клавиша <F5>.
Операторы цикла 125 Было описано также создание для запуска макроса кнопки — элемента управления ActiveX. Теперь создадим для запуска макроса кнопку — элемент управления формы. Вложенный цикл For...To...Next Покажем создание для запуска макроса, назначенного для кнопки типа Элементы управления формы, расположенной на рабочем листе, на примере программы, содержащей вложенный цикл. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. На рабочем листе создайте командную кнопку ВЫПОЛНИТЬ. Для этого на вкладке ленты Разработчик в группе Элементы управления откройте опцию Вставить и в элементах управления категории Элементы управления формы (см. рис. 1.24) выберите инструмент управления Кнопка . 3. После щелчка мышью по инструменту управления Кнопка курсор превратится в маленький черный крестик — позиционируйте его на листе рабочей книги и нарисуйте кнопку. По завершении рисования откроется диалоговое окно Назначить макрос объекту (рис. 4.4, а). 4. Для макроса Кнопка1_Щелчок, заданного по умолчанию, нажмите кнопку Создать. Выбор этой команды обеспечивает переход в окно редактора VBA и вывод в нем текста заготовки процедуры: Sub Кнопка1_Щелчок() End Sub 5. Между строками шаблона процедуры введите код программы в соответствии с листингом 4.7. Листинг 4.7. Пример вложенного цикла For...To...Next Sub Кнопка1_Щелчок() Dim i1 As Integer Dim i2 As Integer Dim x As Integer For i1 = 1 To 3 x = x + 1 ThisWorkbook.Worksheets(1).Cells(x, 5) = "Внешний цикл - шаг " & i1 For i2 = 1 To 5 x = x + 1 ThisWorkbook.Worksheets(1).Cells(x, 5) = i2 & _ " шаг – вложенный цикл" Next i2 Next i1 End Sub
126 Глава 4 6. Созданная кнопка имеет название Кнопка1. Для того чтобы ее переименовать в ВЫПОЛНИТЬ, щелкните по ней правой кнопкой мыши и в контекстнозависимом меню найдите команду Изменить текст (рис. 4.4, б). а в Рис. 4.4. Работа с вложенными циклами: а — диалоговое окно Назначить макрос объекту; б — контекстно-зависимое меню внедренной кнопки; в — пример программы, содержащей вложенный цикл б
Операторы цикла 127 П РИМЕЧАНИЕ Обратите внимание, что диалоговое окно Macros (Макрос) на рис. 1.1 и диалоговое окно Назначить макрос объекту (см. рис. 4.4, а) похожи. Первое окно возникает при запуске макроса непосредственно в редакторе Visual Basic, а второе — при назначении макроса управляющей кнопке из категории элементов управления формы. Разница в названии кнопок CommandButton1 (см. рис. 1.25) и Кнопка1 принята для того, чтобы разграничить элементы ActiveX и элементы управления формы. Напомним, что макрос для элемента ActiveX прописывается в редакторе Visual Basic. Переход в него осуществляется двойным щелчком левой кнопкой мыши на управляющем элементе. После работы макроса столбец последовательно заполняется надписями (рис. 4.4, в), которые пошагово фиксируют в ячейках работу во внутреннем и внешнем циклах. 7. Сохраните документ с поддержкой макросов под именем Листинг_4.7_Вложенные_ циклы.xlsm. Цикл For...Each Синтаксис оператора: For Each элемент In коллекция Тело цикла Next элемент Приведем пример программы, в которой используется конструкция For...Each. Листинг 4.8 содержит код программы, печатающей в цикле адреса ячеек в заданном диапазоне ("F1:F4") для столбцов E:H (5–8). Причем начинают печататься сначала абсолютные, а затем относительные адреса ячеек (рис. 4.5). 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). Рис. 4.5. Пример программы, содержащей цикл For...Each
128 Глава 4 Листинг 4.8. Пример цикла For...Each Sub Адресация_ячеек() Dim c As Range Dim i As Integer With ThisWorkbook.Worksheets(3) .Unprotect For Each c In .Range("F1:F4") i = i + 1 .Cells(i, 5) = c.Address .Cells(i, 6) = c.Address(True, False) .Cells(i, 7) = c.Address(False, True) .Cells(i, 8) = c.Address(False, False) Next c End With End Sub В этом примере определяется адрес ячейки (абсолютный и относительный). Данные заполняются на Листе3. Например, запись c.Address(True, False) означает адрес ячейки c со значением True для параметра RowAbsolute свойства Address, т. е. абсолютная ссылка для строки адреса. Второе значение False для параметра ColumnAbsolute означает относительную ссылку для столбца адреса ячейки. 2. Сохраните документ с поддержкой макросов под именем Листинг_4.8_For_ Each.xlsm. Цикл Do...Loop Для реализации структур "цикл с предусловием" и "цикл с постусловием" используется оператор цикла Do...Loop. В случае цикла с предусловием синтаксис этого оператора имеет вид: Do While условие Тело цикла Loop или Do Until условие Тело цикла Loop В случае цикла с постусловием синтаксис имеет вид: Do Тело цикла Loop While условие
Операторы цикла 129 или Do Тело цикла Loop Until условие Здесь условие — логическое выражение, Loop (от англ. петля) — обязательное ключевое слово, означающее завершение цикла Do. Когда используется ключевое слово While: тело цикла выполняется, если условие истинно, а выход из цикла происходит, когда условие становится ложным. Когда используется ключевое слово Until: тело цикла выполняется, если условие ложно, а выход из цикла происходит, когда условие становится истинным. Приведем пример программы с циклом Do...While...Loop (листинг 4.9, рис. 4.6). 1. Создайте новый файл Microsoft Excel 2019. Введите исходные данные в виде произвольной таблицы чисел. а б Рис. 4.6. Пример программы, содержащей цикл Do...While...Loop: а — исходные данные; б — сообщение после работы цикла
130 Глава 4 2. Перейдите в среду VBA и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). Введите текст программы из листинга 4.9. Запустите модуль на исполнение. Листинг 4.9. Пример цикла Do...While...Loop Sub Цикл_DoWhileLoop() Dim i As Integer i = 1 Do While ThisWorkbook.Worksheets(1).Range("B" & i) <> "" i = i + 1 Loop MsgBox "Это цикл Do...While...Loop," & Chr(10) & Chr(10) & _ " первая пустая ячейка в столбце B," & Chr(10) & Chr(10) & _ "– это " & Range("B" & i).Address End Sub В этом примере определяется адрес первой пустой ячейки в столбце B на Листе1. 3. Сохраните документ с поддержкой макросов под именем Листинг_4.9_Цикл_ DoWhileLoop.xlsm. Приведем пример программы, в которой используется цикл Do...Until...Loop (листинг 4.10, рис. 4.7). 1. Создайте новый файл Microsoft Excel 2019. Введите исходные данные в виде произвольной таблицы чисел. Рис. 4.7. Пример программы, содержащей цикл Do...Until...Loop: слева — исходные данные; справа — сообщение после работы цикла
Операторы цикла 131 2. Перейдите в среду VBA и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). Введите текст программы из листинга 4.10. Запустите модуль на исполнение. Листинг 4.10. Пример цикла Do...Until...Loop Sub Цикл_DoUntilLoop() Dim i As Integer i = 1 Do Until ThisWorkbook.Worksheets(1).Range("A" & i) = "" i = i + 1 Loop MsgBox "Это цикл Do...Until...Loop," & Chr(10) & Chr(10) & _ " первая пустая ячейка в столбце A," & Chr(10) & Chr(10) & _ "– это " & Range("A" & i).Address End Sub В этом примере определяется адрес первой пустой ячейки в столбце A на Листе1. 3. Сохраните документ с поддержкой макросов под именем Листинг_4.10_Цикл_ DoUntilLoop.xlsm. Цикл While...Wend Синтаксис оператора: While условие Тело цикла Wend Выполняет тело цикла до тех пор, пока заданное условие имеет значение True. Приведем пример программы, в которой используется цикл While...Wend (листинг 4.11). 1. Создайте новый файл Microsoft Excel 2019. Введите исходные данные в виде произвольной таблицы чисел, следуя рис. 4.8. 2. Перейдите в среду VBA и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). Введите текст программы из листинга 4.11. Запустите модуль на исполнение. Листинг 4.11. Пример цикла с операторами While...Wend Sub Цикл_WhileWend() Dim i As Integer i = 1 While ThisWorkbook.Worksheets("Лист WhileWend").Range("C" & i) <> "" i = i + 1 Wend
132 Глава 4 MsgBox "Это цикл While...Wend," & Chr(10) & Chr(10) & _ " первая свободная ячейка в столбце C:" & Chr(10) & Chr(10) & _ "- это " & Range("C" & i).Address End Sub В этом примере определяется адрес первой свободной ячейки в столбце C на листе с названием Лист WhileWend. Номер листа не важен, т. к. в кавычках конструкции ThisWorkbook.Worksheets мы указали название листа непосредственно из Excel. 3. Сохраните документ с поддержкой макросов под именем Листинг_4.11_Цикл_ WhileWend.xlsm. Рис. 4.8. Пример программы, содержащей цикл While...Wend: слева — исходные данные; справа — сообщение после работы цикла Время работы программы Для изучения продолжительности работы цикла приведем примеры программ, в которых измеряется время работы процедур. Обратите внимание, что все эти процедуры используют встроенную API-функцию GetTickCount из библиотеки Lib "kernel32". При попытке вызвать API-функцию, задекларированную для 32-разрядной версии в виде Private Declare Function GetTickCount Lib "kernel32" () As Long в ОС Windows в 64-разрядной версии возникает сообщение об ошибке компиляции (рис. 4.10).
Операторы цикла 133 Рис. 4.9. Ошибка компиляции Для обеспечения совместимости с 64-разрядной версией программы Microsoft Excel 2019 предлагается использовать атрибут PtrSafe после слова Declare в виде: Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long Сначала мы рассмотрим пример процедуры без цикла (листинг 4.12, а). Посмотрите на длительность работы процедуры. Увидеть результат выполнения команды Debug.Print можно в окне просмотра, вызываемом командой View | Immediate Windows (Вид | Окно просмотра). Это окно также можно вызвать, одновременно нажав клавиши <Ctrl>+<G>. 1. Создайте новый файл Microsoft Excel 2019. 2. Перейдите в среду VBA и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). Не забудьте указать в начале окна кода оператор Option Explicit. Листинг 4.12, а. Пример измерения времени работы процедуры без цикла Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long Sub Время_работы() Dim lngStart As Long lngStart = GetTickCount Debug.Print GetTickCount - lngStart & " Миллисекунд" Debug.Print (GetTickCount - lngStart) / 1000 & " Секунд" End Sub Эта процедура без цикла работает быстро — 0 миллисекунд (рис. 4.10). 3. Продолжите работу. Добавьте к проекту еще один модуль с помощью команды Insert | Module (Вставить | Модуль) — появится Module2. 4. Напишите новую процедуру (листинг 4.12, б) и добавьте в нее цикл типа For...Each, с помощью которого в тысяче ячеек появится надпись "VBA - Visual Basic for Applications" с закрашенным первым столбцом (рис. 4.11). Оцените длительность работы процедуры с циклом.
134 Глава 4 Рис. 4.10. Пример измерения времени работы процедуры без цикла в Module1 Рис. 4.11. Пример работы цикла с надписью: окно программы Microsoft Excel 2019 Листинг 4.12, б. Время работы процедуры цикла типа For...Each Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long Sub Test1() Dim lngStart As Long Dim c As Range
Операторы цикла 135 lngStart = GetTickCount For Each c In Range("A1:A1000") With c .Interior.Color = vbYellow .Value = "VBA - Visual Basic for Applications" End With Next c Debug.Print GetTickCount - lngStart & " Миллисекунд" Debug.Print (GetTickCount - lngStart) / 1000 & " Секунд" End Sub Эта процедура с циклом работает быстро, но уже в течение 250 миллисекунд (рис. 4.12). Рис. 4.12. Пример работы цикла с надписью: окно VBA с управляющим макросом Module2 5. Продолжите работу. Добавьте к проекту еще модуль — появится Module3. 6. Напишите новую процедуру (листинг 4.12, в) и добавьте в нее цикл типа For...To...Next, с помощью которого в тысяче ячеек появится надпись "VBA Visual Basic for Applications". Посмотрим на длительность его работы. Листинг 4.12, в. Время работы процедуры цикла типа For...To...Next Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long Sub Test2() Dim lngStart As Long Dim i As Long lngStart = GetTickCount
136 Глава 4 For i = 1 To 1000 Cells(i, 1).Interior.Color = vbYellow Cells(i, 1).Value = "VBA - Visual Basic for Applications" Next i Debug.Print GetTickCount - lngStart & " Миллисекунд" Debug.Print (GetTickCount - lngStart) / 1000 & " Секунд" End Sub Работа процедуры занимает 110 миллисекунд. Это немного меньше, чем время работы предыдущего листинга, но человеку сложно уловить небольшое изменение долей секунд. Следует заметить, что доли секунды рассчитать трудно, поэтому при разных запусках макроса число миллисекунд будет варьироваться. На разных компьютерах эти макросы также будут работать разное время — ведь производительность компьютеров различна. 7. Продолжите работу. Добавьте к проекту модуль — появится Module4. 8. Напишите новую процедуру (листинг 4.12, г) и добавьте в цикле оператор выбора ячейки Cells(i, 1).Select. Посмотрите на длительность работы этой процедуры с циклом. Сразу можно понять, что длительность работы цикла будет значительной, т. к. оператор стоит непосредственно в цикле. Листинг 4.12, г. Время работы цикла с выбором ячейки в теле цикла Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long Sub Test3() Dim lngStart As Long Dim i As Long lngStart = GetTickCount For i = 1 To 1000 Cells(i, 1).Select ActiveCell.Interior.Color = vbYellow ActiveCell.Value = "VBA - Visual Basic for Applications" Next i Debug.Print GetTickCount - lngStart & " Миллисекунд" Debug.Print (GetTickCount - lngStart) / 1000 & " Секунд" End Sub Результат работы программы для 64-разрядной версии Microsoft Excel показан на рис. 4.13 и составляет 2875 миллисекунд, т. е. примерно 3 секунды. При работе на 32-разрядной версии программы эта процедура с оператором в теле цикла работает гораздо медленнее — 22 682 миллисекунды или 22,682 секунды. 9. Сохраните этот документ, содержащий несколько модулей, с поддержкой макросов под именем Листинг_4.12_Время_работы_цикла.xlsm.
Операторы цикла Рис. 4.13. Пример определения времени работы цикла в Module4 137
138 Глава 4
ГЛАВА 5 Функции, определенные пользователем Весь мир — число. Пифагор В программе Microsoft Excel 2019 имеется достаточно много встроенных функций: математических, логических, финансовых, текстовых, надстроек и автоматизации, инженерных и других, классифицированных по категориям. Каждой категории даже присваивается свой индекс. Количество отображаемых категорий может варьироваться и задается настройками системы. Кроме того, редактор Visual Basic for Applications позволяет создавать собственные функции, которые автоматически попадают в категорию "Определенные пользователем". Эти функции создаются в специальном модуле сопровождения объекта WorksheetFunction. Модуль добавляется с помощью команды Insert | Module (Вставить | Модуль), в окне проекта он отобразится на уровне вашего приложения. Построение функций Функция (отображение, оператор, преобразование) — это математическое понятие, отражающее связь между какими-либо значениями. Можно сказать, что функция — это "закон", по которому одна величина зависит от другой. Функции строятся по формулам. Формула — совокупность значений, ссылок на другие ячейки, именованных объектов, функций и операторов, позволяющая получить новое значение. Формулы представляют собой выражения, по которым выполняются вычисления на листе. Формула начинается со знака равенства (=) и может содержать такие элементы, как функции, ссылки, операторы и константы. Формулы отображаются в строке формул (см. рис. 5.1, а). График функции одной переменной Для примера рассмотрим построение графика функции одной переменной y ( x) при x ∈ [−2; 5,5] .
140 Глава 5 Функция задана формулой ( ) e −2 x x+2 . + 2 x2 + 1 Для построения графика сначала необходимо составить таблицу его значений при различных значениях аргумента, выбрав шаг аргумента (например, шаг = 0,5 ). y = cos 2 1. В программе Microsoft Excel 2019 на листе Лист1 создайте заголовок таблицы. Для этого введите: в ячейку A1 — x; в В1 — y; в С1 — Пользовательская функция. 2. Сформируйте ряд значений переменной x, для чего введите: в ячейку A2 — –2; в А3 — –1,5 (следующее с учетом шага 0,5). Выделите эти ячейки. Затем установите указатель мыши на маркере заполнения выделенного диапазона (при этом белый крест курсора превратится в маленький черный крестик), нажмите левую кнопку мыши и, удерживая ее, протащите курсор вниз до тех пор, пока не получится числовой ряд нужной длины. 3. В ячейку В2 введите формулу: =COS((A2+2)/2)^2+EXP(-2*A2)/(A2^2+1)^(1/2) и с помощью маркера заполнения протащите ее до ячейки В17. Далее мы продолжим построение графика функции. Структура кода функции пользователя В общем виде функция пользователя имеет вид: Function Имя_функции (Список_параметров) Инструкции End Function  Список_параметров — это список аргументов функции в виде переменных, пере- дающихся в функцию. Разделителем в списке параметров является запятая. Список параметров может быть пуст.  Инструкции — это последовательность инструкций, выполняемых при нахожде- нии значения функции, в совокупности образующих так называемое тело функции. Важная особенность функции пользователя состоит в том, что носителем возвращаемого ею значения является Имя_функции. Поэтому среди инструкций должен присутствовать, по крайней мере, один оператор, который присваивает имени функции значение какого-либо выражения. График функции одной переменной (продолжение) 1. Постройте по данным, приведенным на рис. 5.1, а, график с помощью VBA. Для этого перейдите в среду VBA, выбрав на вкладке ленты Разработчик раздел Visual Basic. На экране откроется окно интегрированной среды разработки приложений Microsoft Visual Basic - Книга 1. Можно также одновременно нажать комбинацию клавиш <Alt>+<F11>.
Функции, определенные пользователем 141 а б в г д Рис. 5.1. Построение графика функции пользовательской функцией VBA: а — интерфейс программы со строкой формул; диалоговые окна: б — Add Procedure; в — кнопка Вставить функцию; г — Вставка функции; д — Аргументы функции
142 Глава 5 2. Для создания пользовательской функции выполните команду Insert | Procedure (Вставить | Процедура) — откроется диалоговое окно Add Procedure (Добавить процедуру), показанное на рис. 5.1, б. 3. В группе Type (Тип) этого окна выберите переключатель, определяющий создание функции, — Function (Функция). Этот тип служит для определения подпрограмм, результатом выполнения которых является одно числовое или логическое значение, возвращаемое в основную программу через имя функции. 4. В поле Name (Имя) введите имя создаваемой функции, например y. В листинге 5.1 приведен код только что созданной пользовательской функции. Запустите ее на исполнение. Не забудьте указать в начале кода оператор Option Explicit. Листинг 5.1. Функция с одним условием Function y(x) y = Cos((x + 2) / 2) ^ 2 + Exp(-2 * x) / (x ^ 2 + 1) ^ 0.5 End Function 5. В ячейке С2 вызовите функцию y, определенную пользователем. Для этого (рис. 5.1, в) — откроется щелкните мышью по кнопке Вставить функцию диалоговое окно Вставка функции (рис. 5.1, г). В этом окне выберите категорию Определенные пользователем. 6. Вставьте аргумент функции, щелкнув курсором мыши по ячейке А2 (рис. 5.1, д), нажмите кнопку ОK — значение появится в ячейке С2. С помощью маркера заполнения протащите значение функции в ячейке С2 до ячейки С17. 7. Выделите диапазон ячеек A2:B17 или A2:A17 и С2:С17. Вызовите мастер диаграмм: на вкладке ленты Вставка в группе Диаграммы выберите кнопку с раскрывающимся списком Вставить точечную (X, Y) или пузырьковую диаграмму и укажите тип графика Точечная с гладкими кривыми — график готов, отформатируйте его по своему желанию. 8. Сохраните рабочую книгу с поддержкой макросов под именем Графики_ Листинги_5.1-5.5.xlsm. Для этого необходимо выбрать команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла выбрать вариант сохранения файла: Книга Excel с поддержкой макросов. Э ЛЕКТРОННЫЙ АРХИВ Листинг 5.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_5_Функции, определенные_пользователем сопровождающего книгу электронного архива.
Функции, определенные пользователем 143 График кусочно-непрерывной функции с двумя условиями Рассмотрим построение кусочно-непрерывной функции одной переменной y ( x) с двумя условиями при x ∈ [−2; 1,2] : ⎧ 5 1 + x4 , x ≤ 0; ⎪ 2 y=⎨ 2 5x , x > 0. ⎪sin (3x) + 1 + sin 2 ( x) ⎩ Для построения графика сначала необходимо составить таблицу его значений при различных значениях аргумента, выбрав шаг аргумента (например, шаг = 0, 2 ). 1. В программе Microsoft Excel 2019 на листе Лист1 создайте заголовок таблицы. Для этого введите: в ячейку A24 — x; в В24 — y; в С24 — Пользовательская функция. 2. Далее сформируйте ряд значений переменной x. Для этого введите: в ячейку A25 — –2; в А26 — –1,8 (следующее с учетом шага 0,2). Выделите эти ячейки. Затем установите указатель мыши на маркере заполнения выделенного диапазона (при этом белый крест курсора превратится в маленький черный крестик), нажмите левую кнопку мыши и, не отпуская нажатия, протащите курсор вниз до тех пор, пока не получится числовой ряд нужной длины. 3. В ячейку В25 введите формулу: =ЕСЛИ($A25<=0;(1+$A25^4)^0,2;(SIN(3*$A25))^2+(5*$A25^2)/(1+(SIN($A25))^2)) С помощью маркера заполнения протащите ее до ячейки В41. 4. В столбце C получим значения функции, рассчитанные при помощи пользовательской функции, созданной в VBA. Для этого перейдите в среду VBA, создайте модуль и функцию yy (листинг 5.2) и запустите ее на исполнение. Листинг 5.2. Функция с двумя условиями с использованием If...Then...Else Function yy(x) If x <= 0 Then yy = (1 + x ^ 4) ^ 0.2 Else yy = (Sin(3 * x)) ^ 2 + (5 * x ^ 2) / (1 + (Sin(x)) ^ 2) End If End Function 5. В ячейке С25 вызовите функцию yy, определенную пользователем, вставьте аргумент функции, щелкнув мышью по ячейке А25, и с помощью маркера заполнения протащите значение функции в ячейке С25 до ячейки С41. 6. А теперь воспользуемся альтернативной функцией VBA iif, заменяющей конструкцию If...Then...Else. Для этого в среде VBA напишите в модуле текст программы из листинга 5.3.
144 Глава 5 Функция iif проверяет, выполняется ли условие, и возвращает одно значение, если оно выполняется, и другое значение в противном случае. Синтаксис функции iif: iif(Expression, TruePart, FalsePart) Аргументы: • Expression — аналог аргумента лог_выражение функции ЕСЛИ, любое значение или выражение, которое при вычислении дает значение True (ИСТИНА) или False (ЛОЖЬ); • TruePart — аналог аргумента Значение_если_истина функции ЕСЛИ, возвращаемое значение если аргумент Expression принимает значение True. Допустимая глубина вложенности — семь. • FalsePart — аналог аргумента Значение_если_ложь функции ЕСЛИ, возвращаемое значение если аргумент Expression принимает значение False. Листинг 5.3. Функция с двумя условиями с использованием функции iif Function f(x) f = iif(x <= 0, (1 + x ^ 4) ^ 0.2, Sin(3 * x) ^ 2 + (5 * x ^ 2) / _ (1 + (Sin(x)) ^ 2)) End Function Рис. 5.2. Интерфейс программы со строкой формул и график функции с двумя условиями
Функции, определенные пользователем 145 7. В ячейке D25 вызовите функцию f, определенную пользователем, вставьте аргумент функции, щелкнув мышью по ячейке D25, и с помощью маркера заполнения протащите значение функции в ячейке D25 до ячейки D41. Рассчитанные значения должны совпасть со значениями из столбца C. 8. Выделите диапазон ячеек с A25 по B41 или A25:A41 и С25:С41. Вызовите мастер диаграмм: на вкладке ленты Вставка в группе Диаграммы выберите кнопку с раскрывающимся списком Вставить точечную (X, Y) или пузырьковую диаграмму и укажите тип графика Точечная с гладкими кривыми — график готов (рис. 5.2), отформатируйте его по своему желанию. 9. Сохраните рабочую книгу с поддержкой макросов под именем Листинг_5.1Листинг_5.5_Графики.xlsm. График кусочно-непрерывной функции с тремя условиями Продолжим работу с файлом Листинг_5.1-Листинг_5.5_Графики.xlsm. Добавьте еще один рабочий лист и переименуйте его в если. Рассмотрим построение кусочно-непрерывной функции одной переменной y ( x) с тремя условиями при x ∈ [ −1,7; 1,3] : ⎧1 + x + x 2 x < 0; , ⎪ 1 + x2 ⎪ ⎪ y=⎨ 2x 0 ≤ x < 1; ⎪ 1 + x2 + 1, ⎪ ⎪ ⎩ 2 ⋅ 0,5 + sin( x) , x ≥ 1, Для построения графика сначала необходимо составить таблицу его значений при различных значениях аргумента, выбрав шаг аргумента (например, шаг = 0,1 ). 1. В программе Microsoft Excel 2019 на листе если файла Листинг_5.1-Листинг_5.5_ Графики.xlsm создайте заголовок таблицы. Для этого введите: в ячейку A1 — x; в В1 — y; в С1 — Пользовательская функция. 2. Сформируйте ряд значений переменной x, для чего введите: в ячейку A2 — –1,7, в А3: –1,6 (следующее с учетом шага 0,1). Выделите эти ячейки. Затем установите указатель мыши на маркере заполнения выделенного диапазона (при этом белый крест курсора превратится в маленький черный крестик), нажмите левую кнопку мыши и, не отпуская нажатия, протащите курсор вниз до тех пор, пока не получится числовой ряд нужной длины. 3. В ячейку В2 введите формулу: =ЕСЛИ(A2<0;(1+A2+A2^2)/(1+A2^2);ЕСЛИ(A2<1;КОРЕНЬ(1+2*A2/(A2^2+1)); 2*ABS(0,5+SIN(A2)))) С помощью маркера заполнения протащите ее до ячейки В32.
146 Глава 5 Согласитесь, эта запись с использованием вложенных функций ЕСЛИ не совсем удобна. В новой версии программы Microsoft Excel появилась новая функция ЕСЛИМН. Она проверяет соответствие одному или нескольким условиям и возвращает значение для первого условия со значением ИСТИНА. Таким образом, важно указать данные условия в правильной последовательности. В нашем случае х принимает значения для трех диапазонов данных: меньше нуля, в пределах от нуля до единицы, больше единицы. Логичным будет прописать в первом условии аналогично для условия функции ЕСЛИ выражение x < 0 . Если бы мы написали, к примеру, x < 1 в качестве первого условия, то программа не смогла отреагировать на условие x < 0 , т. к. оно входит в интервал x < 1 , условие для которого проверяется первым. В результате возникла бы ошибка. 4. В ячейку C2 введите формулу в одну строку: =ЕСЛИМН(A2<0;(1+A2+A2^2)/(1+A2^2);A2<1;КОРЕНЬ(1+2*A2/(A2^2+1)); A2>=1;2*ABS(0,5+SIN(A2))) С помощью маркера заполнения протащите ее до ячейки C32. Рассчитанные значения должны совпасть со значениями из столбца B. 5. Теперь воспользуемся редактором VBA и создадим в нем функцию для расчета значения в зависимости от трех условий. Для этого перейдите в среду VBA, создайте модуль и функцию yyy (листинг 5.4) и запустите ее на исполнение. Листинг 5.4. Функция с двумя условиями с использованием If...Then...Else Function yyy(x) If x < 0 Then yyy = (1 + x + x ^ 2) / (1 + x ^ 2) ElseIf x < 1 Then yyy = (1 + 2 * x / (1 + x ^ 2)) ^ (1 / 2) Else: yyy = 2 * Abs(0.5 + Sin(x)) End If End Function 6. В ячейке D2 вызовите функцию yyy, определенную пользователем, вставьте аргумент функции, щелкнув мышью по ячейке А2, и с помощью маркера заполнения протащите значение функции в ячейке D2 до ячейки D32. Если функция написана правильно, содержимое столбцов B:D должно совпасть. 7. В листинге 5.5 приведен код программы по расчету функции с тремя условиями с использованием VBA-функции iif. Теперь все условия можно прописать в одной строке. Код программы сократился на несколько строк. Листинг 5.5. Функция с двумя условиями с использованием функции iif Function ff(x) ff = iif(x < 0, (1 + x + x ^ 2) / (1 + x ^ 2), _ iif(x < 1, (1 + 2 * x / _ (1 + x ^ 2)) ^ (1 / 2), 2 * Abs(0.5 + Sin(x)))) End Function
Функции, определенные пользователем 147 8. В ячейке E2 вызовите функцию iff, определенную пользователем, вставьте аргумент функции, щелкнув мышью по ячейке А2, и с помощью маркера заполнения протащите значение функции в ячейке E2 до ячейки E32. Если функция написана правильно, содержимое столбцов B:E должно совпасть. 9. Выделите диапазон ячеек с A2 по B32 или A2:A32 и С2:С32. Вызовите мастер диаграмм: на вкладке ленты Вставка в группе Диаграммы выберите кнопку с раскрывающимся списком Вставить точечную (X, Y) или пузырьковую диаграмму и укажите тип графика Точечная с гладкими кривыми — график готов (рис. 5.3), отформатируйте его по своему желанию. Рис. 5.3. Интерфейс программы со строкой формул и график функции с тремя условиями В НИМАНИЕ ! В новой версии программы появилась возможность ввода рукописного текста прямо на рабочем листе поверх сетки. Настройте ленту, добавив вкладку Рисование, и для оформления воспользуйтесь перьями, расположенными в группе Перья. Предварительно в группе Инструменты нажмите кнопку Рисование. Рукописный текст можно вписать пальцем на сенсорном экране, стилусом либо посредством левой кнопки мыши, как на рис. 5.3. При этом графика рисуется поверх содержимого рабочего листа на новом слое. 10. Сохраните рабочую книгу с поддержкой макросов под именем Листинг_5.1Листинг_5.5_Графики.xlsm.
148 Глава 5 Названия формул на английском языке При работе с русифицированной версией программы Microsoft Excel мы пользуемся функциями с русскими названиями, у которых есть аналоги на английском языке. То же самое наблюдается и для версий на других языках. Иногда полезно знать оригинальное название функции. Можно определить название на английском языке, например, при помощи записи макросов. Так, рассмотрим функцию ОКРУГЛ программы Microsoft Excel. Выполните следующие действия, чтобы узнать ее английское имя. 1. Создайте новый файл Microsoft Excel 2019. 2. Введите в ячейку A1 значение 900,758. Введите в ячейку B1 формулу =ОКРУГЛ(А1;2). Она округляет число до указанного количества десятичных разрядов. 3. Завершите ввод формулы нажатием клавиши <Enter>. 4. Активизируйте ячейку B1. 5. Включите запись макроса, для чего выполните команду Запись макроса из группы Код на вкладке ленты Разработчик. 6. Нажмите клавишу <F2>, а затем клавишу <Enter>. 7. Остановите запись. Теперь в редакторе VBA можно посмотреть код макроса (листинг 5.6). 8. Перейдите в среду VBA, одновременно нажав клавиши <Alt>+<F11>. Листинг 5.6. Макрос определения названия функции в ячейке Sub Макрос1() 'Макрос1 Макрос ActiveCell.FormulaR1C1 = "=ROUND(RC[-1],2)" Range("B1").Select End Sub Из листинга 5.4 видно, что функция с русским названием ОКРУГЛ имеет английское название ROUND. Кроме того, здесь использована альтернативная система адресации, называемая "стилем R1C1". В этой системе и строки, и столбцы обозначаются цифрами. Адрес ячейки B3 в такой системе будет выглядеть так: R3C2 (R=row=строка, C=column=столбец) RC[-1] в листинге означает, что функция применена к значению, которое находится в той же строке и в столбце, стоящем слева. Сохраните рабочую книгу с поддержкой макросов под именем Листинг_5.6.xlsm.
Функции, определенные пользователем 149 Пользовательская функция с тремя аргументами Создайте определенную пользователем функцию с тремя аргументами Цена_со_скидкой(n As Long, P As Double, Discount As Double) типа Double для расчета стоимости партии изделий со скидкой. 1. Создайте новый файл Microsoft Excel 2019. 2. Введите в ячейки информацию в соответствии с диапазоном ячеек A1:B3 из рис. 5.4. Обратите внимание, что ячейка B3 имеет формат Процентный. Ячейку B4 не заполняйте. 3. Перейдите в среду VBA (<Alt>+<F11>). Добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 4. Для создания пользовательской функции выполните команду Insert | Procedure (Вставить | Процедура) — откроется диалоговое окно Add Procedure (Добавить процедуру), показанное на рис. 5.1, б. 5. В группе Type (Тип) этого окна выберите переключатель, определяющий создание функции, — Function (Функция). Этот тип служит для определения подпрограмм, результатом выполнения которых является одно числовое или логическое значение, возвращаемое в основную программу через имя функции. 6. В поле Name (Имя) введите имя создаваемой функции, например Цена_со_ скидкой. В только что созданной пользовательской функции переменная n описывает количество изделий, P — цену одного изделия, а Discount — скидку. Тип данных значения, которое возвращает функция, — Double. Результат работы функции — сумма всех изделий с учетом скидки (листинг 5.7). Листинг 5.7. Пользовательская функция с тремя аргументами Function Цена_со_скидкой(n As Long, P As Double, Discount As Double) _ As Double Dim SS As Double SS = n * P Цена_со_скидкой = SS - SS * Discount End Function Обратите внимание на то, что в заголовке процедуры описаны как ее параметры, так и сама функция. 7. Пользовательская функция вызывается как обыкновенная функция, только она принадлежит категории Определенные пользователем (см. рис. 5.1, г). Так что, в ячейке В4 вызовите функцию Цена_со_скидкой, определенную пользователем, задайте необходимые параметры функции (ячейки B1, B2, B3) — появится результат (рис. 5.4). 8. Сохраните созданную книгу с поддержкой макросов под именем Листинг_5.7_ Функция_с_3_параметрами.xlsm.
150 Глава 5 Рис. 5.4. Результат работы программы Создание собственной категории Редактор Visual Basic for Applications позволяет не только создавать собственные функции, которые автоматически попадают в категорию Определенные пользователем, но и перемещать функции в другие категории и даже создавать собственные категории. Рассмотрим вопрос создания своей категории на примере функции dRound. 1. Создайте новый файл Microsoft Excel 2019. В ячейку A1 введите число, содержащее знаки после запятой. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1 (Insert | Module (Вставить | Модуль)). Создайте функцию Округлить, возвращающую значение типа Double (листинг 5.8). В коде используется функция рабочего листа ОКРУГЛ категории Математические и в VBA называется Round. Она предназначена для округления числа до заданного количества знаков после запятой. Обращение к функции в VBA осуществляется при помощи метода WorksheetFunction.Round. Листинг 5.8. Пользовательская функция для округления числа до ближайшего целого Function Округлить(S As Range) As Double Округлить = Application.WorksheetFunction.Round(S, 0) End Function 3. Обратитесь к функции Округлить, определенной пользователем, на листе рабочей книги. Эта функция автоматически попадает в категорию Определенные пользователем.
Функции, определенные пользователем 151 При желании функцию, определенную пользователем, можно переместить в другую категорию, например в категорию Финансовые, задав ей значение, равное 1 (листинг 5.9). Категориям Дата и время соответствует значение 2, Математические — 3, Статистические — 4, Ссылки и массивы — 5, Работа с базой данных — 6, Текстовые — 7, Логические — 8 и т. д. Добавьте к проекту модуль Module2 и введите там текст листинга 5.9. Листинг 5.9. Перемещение функции в категорию Финансовые Sub Другая_категория() Application.MacroOptions _ Macro:="Округлить", _ Description:="Округление числа до ближайшего целого", _ Category:=1 End Sub 4. Обратитесь к этой же определенной пользователем функции Округлить на листе рабочей книги. Теперь эта функция попадает в категорию Финансовые. Там же, в Module2, напишите процедуру, создающую собственную категорию и перемещающую функцию Округлить в категорию МОЯ_СОБСТВЕННАЯ_ КАТЕГОРИЯ (листинг 5.10, рис. 5.5). Рис. 5.5. Диалоговое окно Вставка функции: создание категории МОЯ_СОБСТВЕННАЯ_КАТЕГОРИЯ
152 Глава 5 Листинг 5.10. Создание категории МОЯ_СОБСТВЕННАЯ_КАТЕГОРИЯ Sub МОЯ_СОБСТВЕННАЯ_КАТЕГОРИЯ() Application.MacroOptions _ Macro:="Округлить", _ Description:="Округление числа до ближайшего целого", _ Category:="МОЯ_СОБСТВЕННАЯ_КАТЕГОРИЯ" End Sub 5. Сохраните созданную книгу с поддержкой макросов под именем Листинг_5.8Листинг_5.10_Создание_собственной_категории.xlsm. Функция без параметров Рассмотрим пример создания пользовательской функции без аргументов, возвращающей строковое значение типа String с названием активного рабочего листа (листинг 5.11). 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (клавиши <Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). Листинг 5.11. Функция без параметров Function stroka() As String Stroka = ActiveSheet.Name End Function 2. Для запуска макроса нажмите кнопку . 3. При попытке вызвать эту функцию на рабочем листе для ячейки A1 появится сообщение о том, что данная функция не имеет аргументов. Вместе с тем она возвращает значение — имя текущего активного листа, в нашем случае это Лист1. 4. Сохраните книгу с поддержкой макросов под именем Листинг_5.11_Функция без параметров.xlsm. Переименование рабочего листа Если вы не знаете, как написать код процедуры переименования листа, то включите запись макроса, переименуйте лист вручную и остановите запись. Макрорекордер сравнивают с магнитофоном, но магнитофон записывает звук во времени, а макрорекордер фиксирует только действия, но не контролирует время, так что при записи действий можно не торопиться. 1. Создайте новый документ с рабочим листом в Microsoft Excel 2019. Добавьте к документу еще один рабочий лист. 2. Переименуйте лист в РабочийЛист1 с использованием макрорекордера.
Функции, определенные пользователем 153 3. Перейдите в среду VBA (<Alt>+<F11>) — автоматически появился модуль Module1, а в нем процедура переименования листа (листинг 5.12). В макросе фиксируется событие выделения листа Лист1 (это имя рабочего листа по умолчанию) — макрорекордер интерпретирует его при помощи метода Sheets.Select, а затем назначение ему нового имени посредством свойства Name. Листинг 5.12. Создание процедуры с помощью макрорекордера Sub Макрос1() 'Макрос1 Макрос Sheets("Лист1").Select Sheets("Лист1").Name = "РабочийЛист1" End Sub 4. Теперь самостоятельно напишите процедуру переименования листа. Для ее создания выполните команду Insert | Procedure (Вставить | Процедура) и в группе Type (Тип) открывшегося диалогового окна Add Procedure (Добавить процедуру) выберите переключатель, определяющий создание процедуры. Присвойте этой процедуре без аргументов название Переименовать_лист. В листинге 5.13 приведен ее код. Листинг 5.13. Процедура переименования листа Sub Переименовать_лист() Sheets("Лист2").Name = "РабочийЛист2" End Sub 5. Запустите код на исполнение. Рабочий лист Лист2 буден переименован в соответствии с указанным значением. 6. Сохраните книгу с поддержкой макросов под именем Листинг_5.12_Листинг_5.13_ Переименование_листа.xlsm. Функция с аргументом типа Range Создайте пользовательскую функцию, которой в качестве аргумента задается диапазон данных Range. В макросе воспользуемся функцией рабочего листа Microsoft Excel СУММ, встроенной в программу. Ее вызов в редакторе VBA осуществляется при помощи метода Application.WorksheetFunction.Sum. В НИМАНИЕ ! Функции рабочего листа программы Microsoft Excel, вызываемые в редакторе VBA, отличаются строго английским названием. При этом функция VBA может не совпадать с функцией Microsoft Excel по количеству параметров. Например, функция СУММ может иметь до 255 аргументов, а аналогичная функция VBA Sum ограничена 30 аргументами (числами (ячейками) или соразмерными диапазонами чисел (диапазонами ячеек), которые необходимо суммировать).
154 Глава 5 1. Создайте новый файл Microsoft Excel 2019. 2. Введите в ячейки A1:A4 различные числа, в том числе отрицательные. 3. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). В окне проекта он отобразится на уровне вашего приложения. 4. Для создания пользовательской функции выполните команду Insert | Procedure (Вставить | Процедура). В диалоговом окне Add Procedure (Добавить процедуру) в группе Type (Тип) выберите переключатель Function (Функция), определяющий создание функции, и назовите ее, например, Суммировать (листинг 5.14). Листинг 5.14. Функция с аргументом типа Range Function Суммировать(S As Range) As Double Суммировать = Application.WorksheetFunction.Sum(S) End Function 5. В ячейке С1 вызовите определенную пользователем функцию Суммировать. Задайте требуемый массив данных в виде диапазона A1:A4 (рис. 5.6). Для этого выделите при помощи белого крестика массив, диапазон данных отобразится Рис. 5.6. Диалоговое окно Аргументы функции, указание диапазона значений
Функции, определенные пользователем 155 в диалоговом окне Аргументы функции в поле аргумента S. Функция выполнит вычисления и возвратит значение типа Double. 6. Сохраните книгу с поддержкой макросов под именем Листинг_5.14_Сумма.xlsm. Функция с массивом Создадим пользовательскую функцию, формирующую массив данных. В примере, приведенном далее, используется массив данных с названиями дней недели. В НИМАНИЕ ! Не забудьте, что при работе с массивами вместо клавиши <Enter> необходимо нажимать комбинацию клавиш <Ctrl>+<Shift>+<Enter>. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. Выполните команду Insert | Procedure (Вставить | Процедура). В диалоговом окне Add Procedure (Добавить процедуру) в группе Type (Тип) выберите переключатель Function (Функция), определяющий создание функции, и назовите ее, например, Массив_дней_недели. Эта функция (листинг 5.15) не имеет аргументов и возвращает значение типа Variant. Листинг 5.15. Функция без параметров с массивом Function Массив_дней_недели() As Variant Массив_дней_недели = Array("Понедельник", "Вторник", "Среда", _ "Четверг", "Пятница", "Суббота", "Воскресенье") End Function Рис. 5.7. Работа с массивом
156 Глава 5 3. На рабочем листе в программе Microsoft Excel выделите семь смежных ячеек в строке и вызовите пользовательскую функцию Массив_дней_недели. 4. Закончите работу с массивами, нажав одновременно клавиши <Ctrl>+<Shift> и <Enter>. Ячейки заполнятся названиями дней недели (рис. 5.7). Этот строковый массив можно переписать в столбец, используя функцию =ТРАНСП(A1:G1). 5. Сохраните книгу с поддержкой макросов под именем Листинг_5.15_Массив.xlsm. Функция с массивом в качестве аргумента В этом примере рассматривается динамический числовой массив, используемый в качестве аргумента пользовательской функции. При этом действия возможны с выборочными элементами массива, а не со всеми элементами. К примеру, можно сложить указанные элементы массива. Создадим пользовательские функции, работающие с массивами (листинги 5.16, 5.17). 1. Создайте новый файл Microsoft Excel 2019, содержащий массив чисел. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). Выполните команду Insert | Procedure (Вставить | Процедура). В диалоговом окне Add Procedure (Добавить процедуру) в группе Type (Тип) выберите переключатель Function (Функция), определяющий создание функции, и назовите ее, например, dSum. Вторая пользовательская функция называется dMultiSum. В листинге 5.16 приведен их код. В первой функции dSum для использования массива список_аргументов() вводится ключевое слово ParamArray. Оно служит для задания функции с неопределенным количеством параметров, в данном случае массива чисел. Выполним суммирование элементов массива с использованием оператора +. Листинг 5.16. Функция с аргументом в виде массива с неопределенным количеством аргументов массива Function dSum(ParamArray список_аргументов() As Variant) As Double Dim аргумент As Variant For Each аргумент In список_аргументов dSum = dSum + аргумент Next аргумент End Function 3. На рабочем листе в программе Microsoft Excel заполните ячейки числами, образовав массив данных, и вызовите определенную пользователем функцию dSum (рис. 5.8). При вызове функции аргументы (аргумент — элемент массива) из
Функции, определенные пользователем 157 Рис. 5.8. Ввод аргументов функции dSum массива список_аргументов должны быть указаны при помощи ссылки на одну ячейку. При указании диапазона ячеек из массива возникнет ошибка. 4. Вторая функция (см. листинг 5.17) содержит два аргумента: диапазон ячеек DSum и массив L() с неопределенным количеством параметров. В программе также будет использована функция, аналогичная функции Microsoft Excel СУММ, вызываемая в VBA при помощи метода WorksheetFunction.Sum. Выполним суммирование элементов массива с использованием функции Microsoft Excel СУММ. Листинг 5.17. Функция с двумя аргументами, один из которых — массив Function dMultiSum(DSum As Range, ParamArray L() As Variant) As Double Dim V As Variant For Each V In L dMultiSum = dMultiSum + V Next V dMultiSum = dMultiSum + Application.WorksheetFunction.Sum(DSum) End Function 5. При работе второй функции происходит суммирование ячеек диапазона DSum, затем это значение складывается с элементами динамического массива L(), указываемыми в диалоговом окне аргументов функции (рис. 5.9).
158 Глава 5 Рис. 5.9. Ввод аргументов функции dMultiSum 6. Сохраните книгу с поддержкой макросов под именем Листинг_5.16_Листинг_5.17_ Аргумент_функции_массив.xlsm. Вызов функции из процедуры В этом примере демонстрируется вызов функции из процедуры, для чего мы создадим соответствующие макросы. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль Module1 (Insert | Module (Вставить | Модуль)). 2. Для создания пользовательской функции выполните команду Insert | Procedure (Вставить | Процедура), в диалоговом окне Add Procedure (Добавить процедуру) выберите переключатель Function (Функция), определяющий создание функции, и назовите ее, например, rndrgb. Эта функция (листинг 5.18) возвращает целое случайное число от 0 до 255. Процедура colors закрашивает фон ячеек диапазона A1:J10 в случайный цвет с использованием функции RGB, при этом значения яркости красного, зеленого и синего определяются функцией rndrgb (рис. 5.10). Листинг 5.18. Вызов функции из процедуры — закраска фона ячеек Public Sub colors() Dim i, j, r, g, b As Integer For i = 1 To 10 For j = 1 To 10 r = rndrgb g = rndrgb b = rndrgb Cells(i, j).Interior.Color = RGB(r, g, b)
Функции, определенные пользователем 159 Next j Next i End Sub Public Function rndrgb() As Integer rndrgb = 255 * Rnd() End Function Рис. 5.10. Закрашивание ячеек в случайные цвета 3. Сохраните книгу с поддержкой макросов под именем Листинг_5.18_Закрашивание_ ячеек.xlsm. Вызов процедуры, использующей функцию, из другой процедуры Рассмотрим вызов процедуры, использующей функцию, из другой процедуры, для чего создадим соответствующие макросы. 1. Создайте новый файл Microsoft Excel 2019. 2. На рабочем листе Microsoft Excel введите числовую информацию в несколько ячеек (рис. 5.11). 3. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 4. Создайте пользовательскую функцию, назовите ее, например, dRound. Эта функция округляет значение, введенное в указанную ячейку, до целого, в противном случае ставит 0. Процедура Создание_клавиатурного_сокращения() управляет созданием клавиатурного сокращения <Ctrl>+<J>, вызывающего макрос Macro:= "CallFunction". В листинге 5.19 приведен соответствующий код.
160 Глава 5 Рис. 5.11. Вызов процедуры, использующей функцию, из другой процедуры Листинг 5.19. Вызов процедуры, использующей функцию, из другой процедуры Sub Создание_клавиатурного_сокращения() Application.MacroOptions _ Macro:="CallFunction", _ HasShortcutkey:=True, _ ShortcutKey:="j" MsgBox "Клавиатурное сокращение создано." End Sub Function dRound(rCell As Range) As Double dRound = Application.WorksheetFunction.Round(rCell, 0) End Function Sub CallFunction() ActiveCell.Value = dRound(ActiveCell) End Sub 5. На рабочем листе можно создать кнопку из категории Элементы управления формы и назначить ей макрос по созданию клавиатурного сокращения (см. рис. 5.11). Для проверки работы программы перейдите в ячейку с числовыми данными, например в ячейку G6, и нажмите сочетание клавиш <Ctrl>+<J>. Произойдет округление до целого.
Функции, определенные пользователем 161 6. Сохраните документ с поддержкой макросов под именем Листинг_5.19_ Клавиатурное сокращение.xlsm. Запись названий формул Напишем несколько чисел и применим к ним ряд формул. Для этого создадим столбцы с названиями формул на русском и английском языках. 1. Создайте новый файл Microsoft Excel 2019. 2. На рабочем листе Microsoft Excel введите информацию в ячейки, в столбце A приведены числовые данные, а в столбце B — значения, рассчитанные по формулам с использованием данных столбца A (рис. 5.12). Рис. 5.12. Пример записи названий формул 3. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 4. Выполните команду Insert | Procedure (Вставить | Процедура), в диалоговом окне Add Procedure (Добавить процедуру) выберите переключатель Function (Функция), определяющий создание функций, и назовите их, например, LocalLanguage и English (листинг 5.20). В функциях используются свойства FormulaLocal и Formula диапазона Range, возвращающие название формулы на языке пользователя и на английском языке. 5. Создайте на рабочем листе командную кнопку из категории Элементы управления формы (вкладка ленты Разработчик, группа Элементы управления, раскрывающаяся кнопка Вставить). Назначьте ей макрос Запись_формул_ русский_английский, текст которого приведен в листинге 5.20. В этой процедуре проверяется диапазон ячеек B2:B8 на наличие формул и, если формулы имеются, в следующий столбец C выводятся локальные названия формул, в стол-
162 Глава 5 бец D — на английском языке при помощи свойства Offset указанного диапазона. Листинг 5.20. Запись формул на языке пользователя и на английском Function LocalLanguage(rngCell As Range) As String LocalLanguauge = rngCell.FormulaLocal 'Формула в локальном варианте (местный язык) End Function Function English(rngCell As Range) As String English = rngCell.Formula 'Формула на английском языке End Function Sub Запись_формул_русский_английский() Dim c As Range For Each c In Range("B2:B8") With c If .HasFormula Then .Offset(0, 1) = "'" & .FormulaLocal .Offset(0, 2) = "'" & .Formula End If End With Next c Columns("C:D").AutoFit End Sub Нажмите на созданной кнопке для запуска макроса. В столбцах C и D отобразятся названия формул. Проверьте работу пользовательских функций. 6. Сохраните книгу с поддержкой макросов под именем Листинг_5.20_Названия_ формул.xlsm. Вычисление определенного интеграла В этом примере мы напишем процедуры, вычисляющие интеграл. Геометрический смысл интеграла — расчет площади под кривой. Значение определенного интеграла мы вычислим тремя методами: прямоугольников, трапеций и Симпсона. Но сначала рассмотрим теорию этого вопроса. Методы численного интегрирования применяются тогда, когда невозможно или очень сложно найти первообразную для подынтегральной функции. Сущность численного интегрирования заключается в замене значения интеграла b ∫ f ( x)dx a вели- чиной площади S криволинейной фигуры, ограниченной осью абсцисс Ox, кривой f ( x) , прямой x = a и прямой x = b .
Функции, определенные пользователем 163 Для вычисления этой площади отрезок [a; b] необходимо разделить на n равных частей (рис. 5.13). Число n должно быть четным. Пронумеруйте точки деления от 0 до n так, чтобы первая точка x = a имела номер 0, а последняя точка x = b — номер n. Расстояние между соседними точками h = xi +1 − xi можно вычислить по формуле h = (b − a ) / n , а значение — xi = a + ih . Тогда площадь криволинейной фигуры S можно представить как сумму площадей элементарных фигур Si : b ∫ f ( x)dx = S = ∑ S . n a i В свою очередь, площадь каждой элементарной криволинейной фигуры моделируется площадями фигур, которые легко вычислить: прямоугольником, трапецией и фигурой, ограниченной параболой. Рис. 5.13. Вычисление интеграла Метод прямоугольников Одна сторона каждого прямоугольника равна h, а другая — f ( x) , тогда: b ∫ a n −1 n −1 i =0 i =0 f ( x)dx = ∑ f ( xi ) ⋅ h = h ⋅ ∑ f (a + ih) . Обратите внимание на то, что суммируются n − 1 площадей прямоугольников. Метод трапеций Площадь элементарной фигуры заменяется площадью трапеции с высотой h и параллельными сторонами, равными соответственно f ( xi ) и f ( xi +1 ) . Тогда формула метода трапеции будет:
164 Глава 5 b ∫ a n −1 f ( x)dx = ∑ Si = i =0 h h h ⋅ ( f ( x0 ) + f ( x1 ) ) + ⋅ ( f ( x1 ) + f ( x2 ) ) + ⋅ ( f ( x2 ) + f ( x3 ) ) + ... + 2 2 2 h + ⋅ ( f ( xn −1 ) + f ( xn ) ) . 2 После алгебраических преобразований получим окончательный вид формулы трапеции: b ∫ f ( x)dx ≈ a n −1 h ⎛ ⎞ ⋅ ⎜ f (a ) + f (b) + 2 ⋅ ∑ f (a + i ⋅ h) ⎟ . 2 ⎝ 1 ⎠ Метод Симпсона Этот метод основан на замене на промежутках [ xi ; xi +1 ] функции f ( x) параболой: b h ⎛ n −1 ∫ f ( x)dx ≈ 3 ⋅ ⎜⎝ f (a) + f (b) + 4 ⋅ ∑ i =1,3,5 a f ( xi ) + 2 ⋅ ⎞ f ( xi ) ⎟ . i = 2,4,6 ⎠ n−2 ∑ Для этого метода принципиально важно, чтобы n было четным, иначе параболы построить будет невозможно. * * * Сравните результаты, полученные тремя методами, — число разбиений n должно быть одинаковым во всех трех формулах. Пусть необходимо вычислить интеграл: 1,2 ∫ 0 3 xdx 1+ x 3 . Примите шаг вычислений: h = 0,1 . 1. Создайте новый файл Microsoft Excel 2019 и переименуйте лист Лист1, назвав его Интеграл. 2. Сформируйте заголовок таблицы. Для этого введите в ячейки A1:Н1 соответственно: а=; 0; в=; 1,2; N=; 12; Н=; 0,1. Введите в ячейки B2:F2 соответственно: x; f(x); Прям.; Трап.; Симп. Введите в ячейки A3:A15 соответственно: 1, 2, ... 13. 3. Сформируйте последовательность аргументов. Для этого введите: в ячейку В3 — 0; в B4 — 0,1 (следующее с учетом шага 0,1). Выделите эти ячейки. Затем установите указатель мыши на маркере заполнения выделенного диапазона (при этом белый крест курсора превратился в маленький черный крестик), нажмите левую кнопку мыши и, не отпуская нажатия, протащите курсор вниз до ячейки B15 — получится значение 1,2. 4. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 5. Выполните команду Insert | Procedure (Вставить | Процедура), в диалоговом окне Add Procedure (Добавить процедуру) выберите переключатель Function
Функции, определенные пользователем 165 (Функция), определяющий создание функции, и назовите ее, например, d. В листинге 5.21, а приведен код вычисления подынтегрального выражения. Листинг 5.21, а. Функция подынтегрального выражения Function d(x) d = 3 * x / (1 + x ^ 3) ^ (1 / 2) End Function 6. Аналогично наберите код созданных пользователем функций для вычисления интеграла тремя методами: прямоугольников (листинг 5.21, б), трапеций (листинг 5.21, в) и Симпсона (листинг 5.21, г). Входные аргументы — пределы интегрирования a и b и число разбиений отрезка N. Листинг 5.21, б. Вычисление интеграла методом прямоугольников Function ПРЯМ(a As Double, b As Double, N As Integer) As Double h = (b - a) / N S = 0 For i = 0 To N - 1 S = S + d(a + i * h) Next i ПРЯМ = S * h End Function Листинг 5.21, в. Вычисление интеграла методом трапеций Function ТРАП(a As Double, b As Double, N As Integer) As Double h = (b - a) / N S = d(a) + d(b) For i = 1 To N - 1 S = S + 2 * d(a + i * h) Next i ТРАП = S * h / 2 End Function Листинг 5.21, г. Вычисление интеграла методом Симпсона Function СИМП(a As Double, b As Double, N As Integer) As Double h = (b - a) / N S = d(a) + d(b) For i = 1 To N - 1 Step 2 S = S + 4 * d(a + i * h) Next i For i = 2 To N - 2 Step 2 S = S + 2 * d(a + i * h)
166 Глава 5 Next i СИМП = S * h / 3 End Function 7. В ячейку С3 введите формулу =d(B3), распространите ее до ячейки С15. В ячейку D3 введите формулу =C3*$H$1, распространите ее до ячейки D14. В ячейку E3 введите формулу =(C3+C4)*$H$1/2, распространите ее до ячейки E14. Обратите внимание, что для метода Симпсона формулы для четных и нечетных ячеек разные. Так, в ячейку F3 введите формулу =(C3+2*C4)*$H$1/3, в ячейку F4 — формулу =(2*C4+C5)*$H$1/3, распространите их вниз до ячейки F14. 8. Вычислите интеграл с помощью выражений Excel. В ячейку D18 введите формулу =СУММ(D3:D14); в E18 — формулу =СУММ(E3:E14); в F18 — формулу =СУММ(F3:F14). 9. Вычислите интеграл с помощью VBA. В ячейку D19 введите формулу =ПРЯМ(B1;D1;F1); в E19 — формулу =ТРАП(B1;D1;F1); в F19 — формулу =СИМП(B1;D1;F1). Результат вычислений показан на рис. 5.14. 10. Сохраните книгу с поддержкой макросов под именем Листинг_5.21_Интеграл.xlsm. Рис. 5.14. Пример вычисления интеграла
Функции, определенные пользователем 167 Переключатели OptionButton Продолжите работу с предыдущим файлом. Создайте на рабочем листе три переключателя для изменения цвета ячеек, содержащих расчеты. 1. На вкладке ленты Разработчик в группе Элементы управления откройте кнопку Вставить и в элементах управления Элементы ActiveX (см. рис. 1.24) выберите инструмент управления Переключатель , активизируйте его — курсор превратится в маленький черный крестик. С его помощью в рабочем поле Microsoft Excel нарисуйте переключатель. Как только вы закончите рисование, на листе появится кнопка OptionButton1, а в строке формул — запись: =ВНЕДРИТЬ("Forms. OptionButton.1";"") 2. Щелкните по созданной кнопке правой кнопкой мыши и в контекстнозависимом меню выберите команду Просмотреть код (рис. 5.15, а). Выбор этой команды обеспечивает переход в окно редактора VBA и вывод в нем текста заготовки процедуры: Private Sub OptionButton1_Click() End Sub 3. Между строками шаблона процедуры введите только одну строчку (листинг 5.22, а) — команду закраски ячеек. Не забудьте в начале кода оператор Option Explicit. Листинг 5.22, а. Пример вызова переключателя СИНИЙ Private Sub OptionButton1_Click() If OptionButton1 = True Then Worksheets("Интеграл").Range("C17:F19").Interior.Color = vbBlue End If End Sub 4. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение СИНИЙ. 5. Создайте еще два переключателя — КРАСНЫЙ и ЗЕЛЕНЫЙ, и напишите для них макросы (листинги 5.22, б и в). Листинг 5.22, б. Пример вызова переключателя КРАСНЫЙ Private Sub OptionButton2_Click() If OptionButton2 = True Then Worksheets("Интеграл").Range("C17:F19").Interior.Color = vbRed End If End Sub
168 Глава 5 а б Рис. 5.15. Элемент ActiveX Переключатель: а — контекстно-зависимое меню внедренного переключателя; б — интерфейс программы с переключателями Листинг 5.22, в. Пример вызова переключателя ЗЕЛЕНЫЙ Private Sub OptionButton3_Click() If OptionButton3 = True Then Worksheets("Интеграл").Range("C17:F19").Interior.Color = vbGreen End If End Sub
Функции, определенные пользователем 169 6. Выйдите из режима конструктора, нажав кнопку Режим конструктора . Теперь выберите переключатель ЗЕЛЕНЫЙ на рабочем листе — макрос выполнит закрашивание (рис. 5.15, б). С ОВЕТ Помимо стандартных цветов языка Visual Basic: красного (vbRed), зеленого (vbGreen) и синего (vbBlue), — в Visual Basic допускается задавать цвет через численные значения цветовой модели RGB, например RGB(128, 0, 0), либо задействуя обширный список XlRgbColor Enumeration, использующий для обозначения цветов зарезервированные слова, например rgbAqua. 7. Сохраните книгу с поддержкой макросов под именем Листинг_5.21_Листинг_22_ Интеграл.xlsm.
170 Глава 5
ГЛАВА 6 Пользовательская форма VBA предоставляет разработчику не только возможность работы с ячейками, диапазонами ячеек, коррекцию рабочих листов и встроенных диалоговых окон, но и средства разработки собственных пользовательских форм. Пользовательская форма — это диалоговое окно, в котором можно разместить элементы управления, обеспечивающие программиста-пользователя средствами создания собственного интерфейса, наиболее приспособленного для решения конкретных задач. Создание форм средствами VBA Пользовательские формы UserForm в программе Microsoft Excel 2019 — это один из наиболее интересных инструментов языка VBA, используемых при разработке интерактивных приложений. С точки зрения VBA форма представляет собой объект UserForm, который, как и любой объект, имеет свои свойства, методы и события. В VBA пользовательская форма задает семейство (коллекцию) объектов, определяющее диалоговые окна. Формат этих окон использует стандартный интерфейс, поддерживаемый операционными системами типа Windows. В проекте может быть как одна, так и несколько форм. Форма UserForm Для того чтобы добавить форму в проект, выполните следующие шаги. 1. Запустите программу Microsoft Excel 2019 и откройте новую книгу. 2. Перейдите в среду VBA, выбрав на вкладке ленты Разработчик раздел Visual Basic. На экране откроется окно интегрированной среды разработки приложений Microsoft Visual Basic - Книга 1. Можно также одновременно нажать клавиши <Alt>+<F11>.
172 Глава 6 Рис. 6.1. Пример новой пользовательской формы с отображением ее свойств 3. В меню Insert (Вставить) выполните команду UserForm — в проекте появится новая форма (рис. 6.1). Семейство форм Компоненты семейства UserForms представляют все загруженные формы приложения. Как и у всех семейств, у UserForms имеются свойства: Count (возвращает число компонентов в семействе) и Item (возвращает определенный компонент семейства), а также метод Add (добавляет к семейству новый компонент). Свойства формы Форма имеет много свойств, но наиболее важные базовые свойства — те, которые задают ее имя и текст, отображаемый в заголовке окна (табл. 6.1). При создании окна в заголовке записывается его стандартное название: UserFormN, где N — число, соответствующее порядковому номеру создаваемой формы. В поле окна проекта (на дереве структуры проекта) в папке Forms (Формы) при этом появится объект UserFormN.
Пользовательская форма 173 Кроме названия формы в строке заголовка имеется кнопка Закрыть, позволяющая закрыть форму UserFormN. Таблица 6.1. Свойства формы Name и Caption Свойство формы Описание Name Имя пользовательской формы (объекта) Caption Текст, отображаемый в строке заголовка формы Для своей первой формы оставьте свойство Name без изменений: UserForm1, а в свойство Caption введите ее значение: МОЯ ПЕРВАЯ ФОРМА. Измените еще несколько самых распространенных свойств пользовательской формы (табл. 6.2). Таблица 6.2. Другие свойства формы Свойство формы Описание Font Определяет параметры шрифта: гарнитуру, начертание, кегль ForeColor Цвет переднего плана формы (точек, подписей). Цвета кодируются в шестнадцатеричной системе счисления BackColor Устанавливает цвет заднего плана (фона) Left и Top Определяют местоположение верхнего левого угла формы в пунктах Height и Width Определяют высоту и ширину формы в пунктах. Эти свойства учитывают толщину границы формы и строку заголовка BorderStyle Тип рамки формы. Имеет значения: 0 — fmBorderStyleNone (нет видимой рамки) и 1 — fmBorderStyleSingle (рамка есть), используемое по умолчанию Picture Выбор фонового рисунка Bitmap, отображаемого на форме PictureSizeMode Определяет способ размещения изображения на форме. Допустимые значения: 0 — fmPictureSizeModeClip (части рисунка, выходящего за границы формы, обрезаются), используется по умолчанию; 1 — fmPictureSizeModeStretch (растягивает рисунок по размерам формы без сохранения пропорций); 3 — fmPictureSizeModeZoom (растягивает рисунок по размерам формы с сохранением пропорций) PictureTiling Логическое свойство, принимающее значение True или False, определяющее необходимость покрытия формы мозаикой, созданной из изображения, заданного свойством Picture RightToLeft Возвращает значение типа Boolean, обозначающее отображение направления текста ScrollBars Отвечает за наличие вертикальных и/или горизонтальных полос прокрутки
174 Глава 6 Таблица 6.2 (окончание) Свойство формы Описание ScrollHeight Обозначает высоту в пунктах для общей области, которая может быть просмотрена при перемещении полосы прокрутки на форме ScrollTop Обозначает отступ сверху полосы прокрутки ScrollWidth Обозначает ширину в пунктах для общей области, которая может быть просмотрена при перемещении полосы прокрутки на форме ScrollLeft Обозначает отступ слева полосы прокрутки Zoom Отвечает за допустимый масштаб отображения Выберите значение свойства ForeColor из предложенной таблицы значений, задайте Height = 300 и Width = 310 — новая форма UserForm1 создана. Для запуска формы достаточно выбрать в окне VBA команду Run | Run Sub/UserForm или нажать кнопку Run Sub/UserForm на панели инструментов Standard. Можно также нажать клавишу <F5>. В результате в окне Excel откроется диалоговое окно UserForm1 - МОЯ ПЕРВАЯ ФОРМА, интерфейс которой не позволяет что-либо делать. Закройте диалоговое окно UserForm1 - МОЯ ПЕРВАЯ ФОРМА, нажав кнопку Закрыть в заголовке окна. Внимательно просмотрите все остальные свойства формы, попробуйте изменить их значения и проанализировать результаты. Разметочная сетка На поверхности UserForm может отображаться разметочная сетка, облегчающая размещение в окне формы элементов управления, включаемых в создаваемое приложение. Разработчик формы может задать частоту точек разметочной сетки, выбрав в основном меню Visual Basic команду Tools | Options (Инструменты | Параметры). В открывшемся диалоговом окне Options (рис. 6.2) на вкладке General в группе Form Grid Settings можно определить:  режим отображения сетки (флажок Show Grid);  параметры сетки (расстояния между точками сетки) — в полях ввода Grid Units: Points (Width и Height);  режим привязки элементов управления, создаваемых на форме, к узлам сетки — Align Controls to Grid. Посмотрите и проанализируйте другие вкладки этого окна.
Пользовательская форма 175 Рис. 6.2. Диалоговое окно Options Методы формы Методы — это действия, которые могут быть выполнены над объектом VBA и, в частности, над объектом UserForm. Перечислим наиболее известные методы формы (табл. 6.3). Таблица 6.3. Методы формы Метод Описание Show Отображает форму на экране Hide Скрывает форму Move Изменяет положение и размер формы PrintForm Печатает форму Load Загружает форму, генерирует событие инициализации формы Unload Генерирует появление событий QueryClose и Terminate Кроме того, для объектов наиболее часто используются методы Delete (Удалить), Clear (Очистить), Copy (Копировать), Save (Сохранить), Write (Запись). События формы События — это действия, распознаваемые объектом. Для события, распознанного объектом, можно запрограммировать отклик. События происходят в результате действия пользователя, выполнения какой-либо программной операции или какихто действий, выполняемых системой. Например, событием является щелчок левой кнопкой мыши по форме, кнопке или какому-либо иному объекту в окне формы.
176 Глава 6 Отклики на события реализуются в VBA как процедуры. Для некоторых событий заготовки текстов процедур создаются на листе модуля формы автоматически, для других событий программист должен полностью написать процедуру их обработки. Приведем некоторые события формы (табл. 6.4). Таблица 6.4. События формы Событие Описание Initialize Инициализация, происходит во время загрузки формы в память, до ее отображения на экране QueryClose Происходит перед выгрузкой формы или ее закрытием Resize Происходит при изменении размеров формы Click, DblClick Происходят при щелчке или двойном щелчке левой кнопкой мыши по форме, за исключением выбора управляющих элементов формы MouseDown, MouseUp Происходят при нажатии или отпускании кнопки мыши Activate Происходит, когда форма отображается или заново активизируется. Событие происходит только при переключении между пользовательскими формами и только тогда, когда форма является видимой. Форма, загруженная при помощи события Load, невидима до тех пор, пока не будет использован метод Show Deactivate Происходит при деактивации формы, т. е. когда она теряет фокус KeyDown Происходит при нажатии любой клавиши, когда форма отображается KeyUp Происходит при отжатии любой клавиши во время отображения формы KeyPress Происходит при нажатии клавиши ANSI во время отображения формы Resize Происходит при изменении размеров формы Scroll Происходит при прокрутке содержимого формы Zoom Происходит при масштабировании формы Terminate Происходит после выгрузки формы из памяти Командная кнопка для показа формы Рассмотрим пример использования метода Show. 1. На листе рабочей книги Microsoft Excel создайте командную кнопку из категории Элементы ActiveX для вызова формы (см. рис. 1.24). Как только вы закончите рисование, на листе появится кнопка CommandButton1, а в строке формул — запись: =ВНЕДРИТЬ("Forms.CommandButton.1";"") 2. Щелкните по кнопке правой кнопкой мыши и в контекстно-зависимом меню выберите команду Просмотреть код (см. рис. 1.25). Выбор этой команды обеспечивает переход в окно редактора VBA (рис. 6.3) и вывод в нем текста заготовки процедуры:
Пользовательская форма 177 Private Sub CommandButton1_Click() End Sub 3. Между строками шаблона процедуры введите только одну строку: в соответствии с листингом 6.1. Не забудьте использовать в начале окна кода оператор Option Explicit. UserForm1.Show — Листинг 6.1. Управление показом формы Private Sub CommandButton1_Click() UserForm1.Show End Sub Рис. 6.3. Заготовка процедуры для управления кнопкой 4. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение: ВЫЗОВ_ФОРМЫ. 5. Выйдите из режима конструктора, нажав кнопку Режим конструктора . Теперь щелкните мышью на листе по кнопке ВЫЗОВ_ФОРМЫ — пользовательская форма появилась (рис. 6.4). 6. Сохраните созданный документ с формой под именем Листинг_6.1_Кнопка_ вызова_формы.xlsm. Для этого необходимо выбрать команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла выбрать вариант сохранения файла Книга Excel с поддержкой макросов.
178 Глава 6 Э ЛЕКТРОННЫЙ АРХИВ Листинг 6.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_6_Пользовательская_форма сопровождающего книгу электронного архива. Рис. 6.4. Кнопка для вызова формы Элементы управления В VBA имеется обширный набор встроенных элементов управления, являющихся объектами. Как и любые объекты, они обладают свойствами, методами и событиями. Элементы управления создаются при помощи панели элементов Toolbox, которая автоматически появляется при создании формы (рис. 6.5, а). П РИМЕЧАНИЕ Изначально на панели элементов Toolbox присутствуют не все элементы управления, можно добавить и другие. Для этого следует щелкнуть правой кнопкой мыши по панели элементов Toolbox и из появившегося контекстно-зависимого меню (рис. 6.5, б) выбрать команду Additional Controls (Дополнительные элементы управления). Появится диалоговое окно Additional Controls, из которого можно выбрать дополнительные элементы управления (рис. 6.5, в). Аналогично можно удалить элемент управления, выбрав из появившегося контекстнозависимого меню (см. рис. 6.5, б) команду Delete элемент_управления (Удалить элемент_управления). Можно также создать свой личный управляющий элемент со своим значком. Как только вы начнете изменять свойства формы, панель элементов Toolbox может исчезнуть. Для того чтобы возвратить панель на экран, следует вызвать ее командой View | Toolbox (Вид | Панель элементов) либо нажать кнопку Toolbox
Пользовательская форма 179 а б в Рис. 6.5. Этапы добавления элемента управления на панель: а, б — панель элементов Toolbox; в — диалоговое окно Additional Controls панели инструментов Standard (Стандартная). В табл. 6.5 приведены основные элементы управления, их англоязычные названия, используемые в VBA, а также названия на русском языке. Аналогичные элементы управления категории Элементы ActiveX, применяемые на рабочем листе Microsoft Excel, префиксы, а также соответствующие им кнопки панели элементов. У пользовательской формы нет специальной кнопки по созданию на панели инструментов Toolbox, но есть префикс. Обратите внимание, что названия кнопок элементов ActiveX представлены на русском языке, но сами элементы управления после создания имеют англоязычные названия. При этом панель элементов управления ActiveX и панель Toolbox совпадают не полностью. Таблица 6.5. Элементы управления панели элементов Toolbox и ActiveX Элемент управления ActiveX (название кнопки) Назначение элемента управления на панели Toolbox Префикс Название элемента управления на панели Toolbox — — frm UserForm Выбор объектов осуществляется при помощи левой кнопки мыши Выбор объектов — Select Objects Вид кнопки на Toolbox —
180 Глава 6 Таблица 6.5 (окончание) Элемент управления ActiveX (название кнопки) Назначение элемента управления на панели Toolbox Префикс Название элемента управления на панели Toolbox Подпись Подпись lbl Label Текстовое поле Текстовое поле txt TextBox Поле со списком Поле со списком cbo ComboBox Список Список lst ListBox Флажок Флажок chk CheckBox Переключатель Переключатель opt OptionButton Выключатель Выключатель tgl ToggleButton — Рамка fra Frame Кнопка Кнопка cmd CommandButton — Набор вкладок tab TabStrip — Набор страниц mlt MultiPage Полоса прокрутки Полоса прокрутки scr ScrollBar Счетчик Счетчик spn SpinButton Изображение Изображение img Image — (можно вставить через дополнительные элементы) Ссылка ref RefEdit Другие элементы управления Вызов диалогового окна Additional Controls — Вид кнопки на Toolbox Команда Additional Controls
Пользовательская форма 181 Префиксы В табл. 6.5 появилась еще одна характеристика элементов управления — префикс, т. е. укороченное имя объекта, отображающее его сущность. Когда создается форма и на ней размещаются элементы управления, им присваиваются имена, т. е. свойство объекта Name, заданное по умолчанию с номером, соответствующим номеру поочередного создания объекта. Например, для первой созданной кнопки значение свойства Name будет CommandButton1, для второй — CommandButton2 и т. д. Если таких кнопок мало, с ними разобраться легко. Но может возникнуть ситуация, когда на форме окажется много кнопок или будет создано много форм с кнопкой CommandButton1. Тогда станет трудно разобраться, какое действие вызывает кнопка CommandButton1 одной формы, а что делает кнопка CommandButton1 другой. Поэтому кнопки или объекты рекомендуется переименовывать, чтобы легче их различать. Для переименования объектов и переменных в мире Windows существует соглашение, названное венгерской нотацией: имя объекта начинается с короткого префикса, одинакового для объектов одного и того же рода, а далее следует название, придуманное проектировщиком формы и отражающее суть объекта. Далее в примерах форм для объектов будут использоваться как придуманные имена, так и префиксы. Возможны их комбинации. Элемент управления Label Элемент управления Label (Подпись) создается кнопкой (см. табл. 6.2). Обычно элемент управления Label служит для отображения подписей, например заголовков элементов управления, не имеющих свойства Caption. Текст, отображаемый в подписи, невозможно изменить во время выполнения программы. Работу элемента управления Label (Подпись) рассмотрим на примере создания формы UserFormSqr, предназначенной для вычисления корней квадратного уравнения ax 2 + bx + c = 0 . 1. Запустите программу Microsoft Excel 2019 и создайте новую книгу. 2. На рабочем листе книги Microsoft Excel создайте командную кнопку Кнопка категории Элементы ActiveX (см. рис. 1.24) для вызова формы. 3. Щелкните по кнопке правой кнопкой мыши и в контекстно-зависимом меню выберите команду Просмотреть код (см. рис. 1.25). 4. Между строками шаблона процедуры введите строку: UserFormSqr.Show (здесь форма имеет новое имя): Private Sub CommandButton1_Click() UserFormSqr.Show End Sub 5. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение: Решение квадратного уравнения.
182 Глава 6 6. В редакторе Visual Basic for Applications в меню Insert (Вставить) выберите объект UserForm — в проекте появится новая форма UserForm1. Переименуйте ее в UserFormSqr. 7. Разместите в проекте (рис. 6.6) форму UserFormSqr и другие элементы управления согласно табл. 6.6. Рис. 6.6. Пример формы для решения квадратного уравнения Таблица 6.6. Элементы управления, находящиеся на форме Решение квадратного уравнения Объект Свойство Name Свойство Caption UserForm UserFormSqr Решение квадратного уравнения TextBox TextA — TextBox TextB — TextBox TextC — TextBox TextX1 — TextBox TextX2 — Label Label1 A Label Label2 B Label Label3 C
Пользовательская форма 183 Таблица 6.6 (окончание) Объект Свойство Name Свойство Caption Label LabelX1 X1 Label LabelX2 X2 CommandButton CmdOk Вычислить CommandButton CmdExit Выход 8. Для формы в редакторе кода, вызываемого командой View | Code (Вид | Окно кода), напишите код в соответствии с листингом 6.2. В приведенном далее коде выполняются следующие действия: • с помощью функции IsNumeric(TextBox) проверяется, введены ли в соответствующие поля значения параметров a, b, c. Функция IsNumeric (TextBox) принимает значение True, если введено какое-либо число; • вычисляется дискриминант d; • если d > 0 , то вычисленные значения корней записываются в поля TextX1 и TextX2; • если d = 0 , то вычисляется значение одного корня и в поле TextX1 записывается результат; • если d < 0 , то появляется сообщение "d<0; Решений нет!". Листинг 6.2. Управление формой Решение квадратного уравнения Private Sub CmdOk_Click() 'Текст кода к UserFormSqr - квадратное уравнение Dim a As Double 'Объявление переменных Dim b As Double Dim c As Double Dim d As Double 'Вычисление дискриминанта Dim x1 As Variant Dim x2 As Variant If IsNumeric(TextA) And IsNumeric(TextB) And IsNumeric(TextC) Then a = CDbl(TextA) 'Cdbl - convert to Double - переводит тип данных Single 'в тип данных Double b = CDbl(TextB) c = CDbl(TextC) d = b ^ 2 - 4 * a * c If d > 0 Then 'Если дискриминант больше нуля, TextX1.Visible = True TextX2.Visible = True LabelX1.Caption = "x1" LabelX2.Caption = "x2"
184 Глава 6 x1 = (-b + d ^ 0.5) / 2 / a 'то вычисляются корни уравнения x2 = (-b - d ^ 0.5) / 2 / a TextX1 = x1 'В текстовые поля выводится результат TextX2 = x2 End If If d = 0 Then TextX1.Visible = True TextX2.Visible = False LabelX1.Caption = "x1" x1 = (-b) / 2 / a LabelX2.Caption = " " TextX1 = x1 End If Else MsgBox "Введите значения a, b и c" End If If d < 0 Then TextX1.Visible = False TextX2.Visible = False MsgBox ("d<0; Решений нет!") 'Если дискриминант меньше нуля, то вывод сообщения End If End Sub Private Sub CmdExit_Click() 'Закрытие UserFormSqr Unload Me End Sub 9. Запустите проект на выполнение, нажав кнопку Вычислить, но не вводите бездумно коэффициенты квадратного уравнения, — задайте реальные значения для квадратного уравнения, которое имеет решение, например: ( x − 3)( x + 2) = x 2 − x − 6 . Для уравнения, имеющего корни x1 = 3, x2 = −2 , коэффициенты квадратного уравнения следующие: a = 1, b = −1, c = −6 . 10. Сохраните созданный документ с формой под именем Листинг_6.2_Квадратное уравнение.xlsm. Элемент управления CommandButton Элемент управления CommandButton (Кнопка) (см. табл. 6.5) позволяет создавать кнопки и/или командные кнопки. Рассмотрим основные свойства элемента управления CommandButton (табл. 6.7).
Пользовательская форма 185 Таблица 6.7. Свойства элемента управления CommandButton Свойство Описание Name Обозначает имя кнопки, используемое в программе для обращения Caption Задает описывающий текст, появляющийся в центре кнопки для идентификации или описания BackColor Устанавливает цвет фона кнопки, выбирается из предложенной таблицы — например, &H00C0C000& Enabled Делает кнопку доступной или недоступной для нажатия Font Позволяет задать гарнитуру, начертание и размер шрифта MousePointer Позволяет задать вид курсора, принимающего вид при наведении на кнопку, выбирается из списка предложенных. Например, курсор в виде белого креста задается так: fmMousePointerSizeWE Picture Загружает рисунок для отображения на кнопке 1. Запустите Microsoft Excel 2019 и создайте новую книгу. 2. В редакторе Visual Basic for Applications в меню Insert (Вставить) выберите объект UserForm — в проекте появится новая форма UserForm1. 3. Разместите в проекте форму UserForm1 (см. рис. 6.7), а на ней элементы управления в соответствии с табл. 6.8. Настройте свойства элементов управления Height, Width, Top, Left таким образом, чтобы с формой было удобно работать. Подпись Движущаяся надпись (элемент управления Label1) будет перемещаться по форме вверх (Вверх), вниз (Вниз), влево (Влево) и вправо (Вправо) при нажатии на соответствующую кнопку (рис. 6.7). Если дальнейшее перемещение в какомлибо направлении невозможно, соответствующая кнопка становится недоступной для нажатия (ее свойство Enabled получает значение False). Таблица 6.8. Элементы управления, находящиеся на форме Работа с кнопками Объект Свойство Name Свойство Caption UserForm UserForm1 Работа с кнопками Label Label1 Движущаяся надпись CommandButton ButtonUp Вверх CommandButton ButtonDown Вниз CommandButton ButtonLeft Влево CommandButton ButtonRight Вправо 4. Разместите все кнопки на форме, щелкните дважды по командной кнопке Вверх и наберите следующий код (листинг 6.3).
186 Глава 6 Рис. 6.7. Макет формы с командными кнопками Листинг 6.3. Управление формой Работа с кнопками Private Sub ButtonDown_Click() Label1.Top = Label1.Top + 5 If Label1.Top > UserForm1.InsideHeight - Label1.Height - 50 Then ButtonDown.Enabled = False End If If ButtonUp.Enabled = False Then ButtonUp.Enabled = True End If End Sub Private Sub ButtonLeft_Click() Label1.Left = Label1.Left - 5 If Label1.Left < 5 Then ButtonLeft.Enabled = False End If If ButtonRight.Enabled = False Then ButtonRight.Enabled = True End If End Sub
Пользовательская форма 187 Private Sub ButtonRight_Click() Label1.Left = Label1.Left + 5 If Label1.Left > UserForm1.InsideWidth - Label1.Width - 5 Then ButtonRight.Enabled = False End If If ButtonLeft.Enabled = False Then ButtonLeft.Enabled = True End If End Sub Private Sub ButtonUp_Click() Label1.Top = Label1.Top - 5 If Label1.Top < 5 Then ButtonUp.Enabled = False End If If ButtonDown.Enabled = False Then ButtonDown.Enabled = True End If End Sub 5. Сохраните созданный документ с формой под именем Листинг_6.3_Кнопки.xlsm. Элемент управления TextBox Элемент управления TextBox (Текстовое поле) позволяет вводить данные в поля и создается кнопкой (см. табл. 6.5). 1. Запустите программу Microsoft Excel 2019 и создайте новую книгу. 2. В редакторе Visual Basic for Applications в меню Insert (Вставить) выберите объект UserForm — в проекте появится новая форма UserForm1. 3. На форме UserForm1 (рис. 6.8) разместите элементы управления согласно табл. 6.9. Таблица 6.9. Элементы управления, находящиеся на форме ПЕРСОНАЛИЗАЦИЯ ДАННЫХ Объект Свойство Name Свойство Caption UserForm UserForm1 ПЕРСОНАЛИЗАЦИЯ ДАННЫХ Label Label1 ФИО студента Label Label2 Факультет Label Label3 Группа Label Label4 Дата рождения Label Label5 Форма обучения TextBox TextBox1 —
188 Глава 6 Таблица 6.9 (окончание) Объект Свойство Name Свойство Caption TextBox TextBox2 — TextBox TextBox3 — TextBox TextBox4 — TextBox TextBox5 — CommandButton1 CommandButton1 Ввести данные Рис. 6.8. Пример формы с пятью элементами управления TextBox 4. Создайте на этом листе рабочей книги Microsoft Excel бланк со списком. Для этого на вкладке ленты Вставка в группе Иллюстрации нажмите на значке Фигуры. 5. Выберите автофигуру Прямоугольник и растяните ее так, чтобы она покрывала собой все ячейки, которые будут заполняться с помощью макроса, например ячейки B6:F9. Отмените заливку прямоугольника, изменив его прозрачность до 100%, и уберите границы, нажав на вкладке ленты Формат в группе Стили фигур кнопки Заливка фигуры и Контур фигуры. 6. Назначьте этому прямоугольнику способность вызова формы ПЕРСОНАЛИЗАЦИЯ ДАННЫХ, установив курсор на прямоугольнике, нажав правую кнопку мыши и выбрав команду Назначить макрос. Сразу появится шаблон:
Пользовательская форма 189 Sub Прямоугольник1_Щелчок() End Sub 7. Между строками шаблона процедуры введите строку: UserForm1.Show — в соответствии с листингом 6.4. Листинг 6.4. Управление показом формы Sub Прямоугольник1_Щелчок() UserForm1.Show End Sub Теперь при щелчке на любой из соответствующих ячеек появится диалоговая форма для ввода данных. 8. Для того чтобы на листе рабочей книги Microsoft Excel данные были введены, необходимо написать обработчик события по нажатию кнопки Ввести данные, расположенной на форме UserForm1, в соответствии с листингом 6.5. Листинг 6.5. Обработчик события кнопки CommandButton1 Private Sub CommandButton1_Click() Dim Лист1 As Object Dim I As Integer Set Лист1 = Sheets("Лист1") Worksheets("Лист1").Activate For I = 6 To 100 If Лист1.Cells(I, 2) = "" Then Лист1.Cells(I, 2) = TextBox1.Value Лист1.Cells(I, 3) = TextBox2.Value Лист1.Cells(I, 4) = TextBox3.Value Лист1.Cells(I, 5) = TextBox4.Value Лист1.Cells(I, 6) = TextBox5.Value Exit For End If Next UserForm1.Hide End Sub 9. В листинге 6.5 переменная I определена как Integer. В этом проекте I меняется в пределах от 6 по 100 (т. е. пустые ячейки заполняются, начиная со строки 6). Вторую координату ячейки (столбец) задайте сами. В нашем случае она меняется от 2 до 6. В обозначенные ячейки вводится текст из соответствующих полей элементов управления TextBox (рис. 6.9). 10. Сохраните созданный документ с формой под именем Листинг_6.5_Студент.xlsm.
190 Глава 6 Рис. 6.9. Пример ввода данных при помощи формы Элементы управления OptionButton и Frame Следующие два элемента управления рассмотрим на примере пользовательской формы (рис. 6.10). Рис. 6.10. Пример формы с элементами управления OptionButton и Frame
Пользовательская форма 191 Элемент управления OptionButton (Переключатель) позволяет выбрать одно значение из нескольких возможных и создается кнопкой (см. табл. 6.5). Элемент управления Frame (Рамка), создаваемый кнопкой (см. табл. 6.5), позволяет несколько возможных объектов объединить в группу, т. е. он служит для визуальной группировки элементов управления. Основное свойство рамки — Caption, задающее подпись при ней. 1. Создайте новую форму. Для формы оставьте свойство Name без изменений — UserForm1. В свойство Caption введите значение: ФОРМАТИРОВАНИЕ. 2. Разместите на форме (рис. 6.10): • с помощью элемента управления Label (Подпись) — подпись Label, свойство Name: lbl_Input, свойство Caption: Введите, пожалуйста, текст:; • с помощью элемента управления TextBox (Текстовое поле) — поле ввода TextBox, свойство Name — txt_Input; • с помощью элемента управления OptionButton (Переключатель) — 12 переключателей OptionButton1–OptionButton12 (свойства Caption: Красный, Зеленый, Синий, Красный, Зеленый, Синий, 12 пунктов, 14 пунктов, 16 пунктов, Arial, Times New Roman, Courier New) и две кнопки CommandButton, в свойства Caption которых введите их значения: Заменить текст и Закрыть форму; • с помощью элемента управления Frame (Рамка) создайте две рамки: Frame1 и Frame2. Для этих объектов внесите изменения в строки свойства Caption, введя в них соответственно значения: Цвет фона: и Цвет шрифта:; • для остальных переключателей создайте еще две подписи элементом управления Label (Подпись): для первой подписи свойство Name: lbl_Cell, свойство Caption: Кегль: и для второй подписи свойство Name: lbl_Font, свойство Caption: Гарнитура:. Для этих двух подписей свойству BackColor задайте значение &H8000000A&. 3. Создайте на листе рабочей книги Microsoft Excel командную кнопку типа CommandButton для вызова формы. Из контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Name укажите cmd_UserForm, для Caption введите значение ВЫЗОВ ФОРМЫ. Щелкните дважды по командной кнопке cmd_UserForm для вызова обработчика событий. В открывшемся редакторе Visual Basic на том месте, где мигает курсор, введите UserForm1.Show. Обратите внимание, что управляющий код принадлежит Лист1 (Форматирование), при этом отдельный модуль не создается. Нажатие кнопки ВЫЗОВ ФОРМЫ в режиме, отличном от режима конструктора, будет вызывать отображение пользовательской формы UserForm1 для ввода данных. Как это сделать, было показано в разд. "Командная кнопка для вызова формы" ранее в этой главе.
192 Глава 6 4. Теперь, чтобы на листе рабочей книги Microsoft Excel появились данные, необходимо написать обработчики событий для управляющих кнопок пользовательской формы Заменить текст и Закрыть форму. Обработчик событий для первой кнопки приведен в листинге 6.6. Листинг 6.6. Пример управления формой ФОРМАТИРОВАНИЕ Private Sub CommandButton1_Click() With ActiveCell .Value = txt_Input.Value With .Interior 'Цвет фона If OptionButton1.Value = True Then .Color = vbRed ElseIf OptionButton2.Value = True Then .Color = vbGreen Else .Color = vbBlue End If End With With .Font 'Цвет шрифта If OptionButton4.Value = True Then .Color = vbRed ElseIf OptionButton5.Value = True Then .Color = vbGreen Else .Color = vbBlue End If End With With .Font 'Размер шрифта If OptionButton7.Value = True Then .Size = 12 ElseIf OptionButton8.Value = True Then .Size = 14 Else .Size = 16 End If End With With .Font 'Тип шрифта If OptionButton10.Value = True Then .Name = "Arial" ElseIf OptionButton11.Value = True Then .Name = "Times New Roman" Else .Name = "Courier New" End If End With End With End Sub
Пользовательская форма 193 В листинге 6.6 показана работа оператора With. На рабочем листе появились надписи, выполненные с помощью формы (рис. 6.11). 5. Сохраните созданный документ с формой под именем Листинг_6.6_ Форматирование.xlsm. Рис. 6.11. Пример ввода записей из формы Ключевое слово Me Продолжим работать с предшествующей формой и напишем код для второй кнопки: CommandButton2 с названием Закрыть форму. В режиме конструктора двойным щелчком левой кнопкой мыши по кнопке Закрыть форму откройте окно редактора VBА. Там будет представлена стандартная заготовка программного кода: Private Sub CommandButton2_Click() End Sub Между строками заготовки введем код инструкции: Unload Me Объект, определяемый ключевым словом Me, присутствующим в записи этого оператора, определяет в коде модуля формы ссылку на саму форму. Оператор Unload (Выгрузить) выгружает форму с экрана и из памяти. Записав эту процедуру, проверьте ее работу (листинг 6.7). Листинг 6.7. Пример закрытия формы Private Sub CommandButton2_Click() Unload Me End Sub
194 Глава 6 Сохраните документ с пользовательской формой под тем же именем Листинг_6.6_ Форматирование.xlsm. Элемент управления ScrollBar Элемент управления ScrollBar (Полоса прокрутки) создается кнопкой (см. табл. 6.5) и служит для установки числового целого неотрицательного значения. Приведем наиболее часто используемые свойства полосы прокрутки (табл. 6.10). Таблица 6.10. Наиболее часто используемые свойства полосы прокрутки Свойство Описание Name Обозначает имя полосы прокрутки, используемое в программе для обращения Value Возвращает текущее значение полосы прокрутки Min Задает минимальное значение полосы прокрутки Max Задает максимальное значение полосы прокрутки SmallChange Устанавливает малый шаг величины перемещения ползунка при щелчке по одной из стрелок полосы прокрутки LargeChange Устанавливает большой шаг величины перемещения ползунка при щелчке по одной из стрелок полосы прокрутки Orientation Задает направление полосы прокрутки. Допустимые значения:  fmOrientationAuto или -1 (расположение зависит от размера элемента управления, используется по умолчанию);  fmOrientationHorizontal или 1 (горизонтальное расположение);  fmOrientationVertical или 0 (вертикальное расположение) В качестве примера создадим форму и кнопку, которые будут изменять цвет фона под управлением элемента управления ScrollBar (Полоса прокрутки). 1. В редакторе Visual Basic создайте пользовательскую форму. Свойству Name формы придайте значение UserFormColor, в свойство Caption введите значение Цвет. В табл. 6.11 приведены элементы управления, которые необходимо разместить на форме. Здесь будет использовано правило формирования цвета RGB, согласно которому на каждый из основных цветов (красный, зеленый, синий) отводится по одному байту, т. е. от 0 до 255 различных оттенков каждого цвета. Для формирования оттенков потребуются элементы ScrollBar (Полоса прокрутки). При перемещении движка на полосах прокрутки будут, во-первых, меняться цвет фона формы UserFormColor и кнопки на рабочем листе Microsoft Excel и, вовторых, фиксироваться цифровой код оттенка. 2. Переименуйте рабочий лист Microsoft Excel в Модель_rgb. На рабочем листе Модель_rgb для вызова формы UserFormColor необходимо создать кнопку
Пользовательская форма 195 (свойство Name — CmdColor, свойство Caption — ЦВЕТОВАЯ МОДЕЛЬ RGB). Код этой кнопки: Private Sub CmdColor_Click() UserFormColor.Show End Sub 3. В проекте разместите на форме UserFormColor (см. рис. 6.12) элементы управления согласно табл. 6.11. Таблица 6.11. Элементы управления для формы UserFormColor Свойство Max Свойство Объект Свойство Name Свойство Caption UserForm UserFormColor Цвет ScrollBar ScrollBarRed — 255 Red &H000000FF& ScrollBar ScrollBarGreen — 255 Green &H0000FF00& ScrollBar ScrollBarBlue — 255 Blue &H00FF0000& TextBox TextRed — — — TextBox TextGreen — — — TextBox TextBlue — — — Label Label1 Red — — Label Label2 Green — — Label Label3 Blue — — BackColor 4. Для того чтобы правильно соотнести код из листинга 6.8 для всех элементов управления, щелкните в режиме конструктора по одному из элементов управления, например типа ScrollBar — ScrollBarGreen, и введите текст процедурыобработчика события ScrollBarGreen_Change(), приведенный в листинге 6.8. Проделайте данные действия для всех остальных элементов управления. Помимо назначения обработчиков события элементам управления формы необходимо в окне кода прописать процедуру, отвечающую за действия, выполняемые при инициализации самой формы при помощи события Initialize. Листинг 6.8. Цветовая модель RGB Private Sub UserForm_Initialize() 'Инициализация формы TextRed = 255 Label1.BackColor = RGB(255, 0, 0) TextGreen = 255 Label2.BackColor = RGB(0, 255, 0)
196 TextBlue = 255 Label3.BackColor = RGB(0, 0, 255) End Sub Private Sub ScrollBarGreen_Change() 'Обработчик события, выполняемый при перемещении бегунка на полосе _ прокрутки, отвечающей за зеленый цвет UserFormColor.BackColor = RGB(ScrollBarRed, ScrollBarGreen, _ ScrollBarBlue) TextGreen.Text = CStr(ScrollBarGreen) Sheets("Модель_rgb").CmdColor.BackColor = RGB(ScrollBarRed, _ ScrollBarGreen, ScrollBarBlue) End Sub Private Sub ScrollBarRed_Change() 'Обработчик события, выполняемый при перемещении бегунка на полосе _ прокрутки, отвечающей за красный цвет UserFormColor.BackColor = RGB(ScrollBarRed, ScrollBarGreen, _ ScrollBarBlue) TextRed.Text = CStr(ScrollBarRed) Sheets("Модель_rgb").CmdColor.BackColor = RGB(ScrollBarRed, _ ScrollBarGreen, ScrollBarBlue) End Sub Private Sub ScrollBarBlue_Change() 'Обработчик события, выполняемый при перемещении бегунка на полосе _ прокрутки, отвечающей за синий цвет UserFormColor.BackColor = RGB(ScrollBarRed, ScrollBarGreen, _ ScrollBarBlue) TextBlue.Text = CStr(ScrollBarBlue) Sheets("Модель_rgb").CmdColor.BackColor = RGB(ScrollBarRed, _ ScrollBarGreen, ScrollBarBlue) End Sub Private Sub TextBlue_Change() 'Обработчик события, выполняемый при вводе значения в текстовое поле, 'отвечающего за синий цвет Dim blue As Byte If Not IsNumeric(TextBlue) Then TextBlue = 0 blue = TextBlue ScrollBarBlue.Value = blue UserFormColor.BackColor = RGB(ScrollBarRed, ScrollBarGreen, _ ScrollBarBlue) End Sub Private Sub TextGreen_Change() 'Обработчик события, выполняемый при вводе значения в текстовое поле, 'отвечающего за зеленый цвет Глава 6
Пользовательская форма 197 Dim green As Byte If Not IsNumeric(TextGreen) Then TextGreen = 0 green = TextGreen ScrollBarGreen.Value = green UserFormColor.BackColor = RGB(ScrollBarRed, ScrollBarGreen, _ ScrollBarBlue) End Sub Private Sub TextRed_Change() 'Обработчик события, выполняемый при вводе значения в текстовое поле, 'отвечающего за красный цвет Dim red As Byte If Not IsNumeric(TextRed) Then TextRed = 0 red = TextRed ScrollBarRed.Value = red UserFormColor.BackColor = RGB(ScrollBarRed, ScrollBarGreen, _ ScrollBarBlue) End Sub 5. Вызовите форму на экран с помощью кнопки ЦВЕТОВАЯ МОДЕЛЬ RGB. Вид формы и кнопки, изменяющей цвет, показан на рис. 6.12. 6. Сохраните созданный документ с формой под именем Листинг_6.8_COLOR.xlsm. Рис. 6.12. Пример кнопки и формы, управляющей цветом в цветовой модели RGB
198 Глава 6 Элемент управления ListBox Элемент управления ListBox (Список) позволяет создавать список в поле ввода, он создается кнопкой (см. табл. 6.5). Приемы работы с элементом управления ListBox (Список) рассмотрим на следующем примере. 1. Запустите программу Microsoft Excel 2019 и создайте новую книгу с двумя рабочими листами. Создадим пользовательскую форму, в которую будут помещаться данные из таблицы, расположенной на Листе2, а также кнопку вызова формы на рабочем листе Лист1. При запуске формы при возникновении события "выбор записи из списка" будет выполнена процедура — обработчик события lst_MultiCol_Change() (см. листинг 6.9). 2. На листе Лист2 в ячейки А1:С7 введите данные в соответствии с рис. 6.13 (или какие-либо другие аналогичные). Рис. 6.13. Пример данных 3. В редакторе Visual Basic for Applications в меню Insert (Вставить) выберите объект UserForm — в проекте появится новая пользовательская форма. 4. Разместите на форме UserForm1 (см. рис. 6.14) элементы управления согласно табл. 6.12. Таблица 6.12. Элементы управления для формы с элементом управления ListBox Объект Свойство Name Свойство Caption Свойство BackColor UserForm UserForm1 КВАРТПЛАТА &H80000002& Label lbl_Title Список жильцов — ListBox lst_MultiCol — — CommandButton cmd_Cancel Закрыть форму —
Пользовательская форма 199 5. Для элемента управления ListBox установите свойства в соответствии с рис. 6.14. Обратите внимание, что число столбцов равно трем (ColumnCount = 3), столбцы имеют заголовки (ColumnHeads = True), ширина столбцов задана в пунктах (ColumnWidths: 56.7 pt; 56.7 pt; 28.35 pt), источником данных для поля со списком является Лист2 (RowSource = Лист2!A2:C7). Рис. 6.14. Пример элемента управления ListBox с тремя столбцами 6. На листе Лист1 создайте командную кнопку категории Элементы ActiveX (см. рис. 1.24) для вызова формы (рис. 6.15). 7. Щелкните по кнопке правой кнопкой мыши и в контекстно-зависимом меню выберите команду Просмотреть код (см. рис. 1.25). Выбор этой команды обеспечивает переход в окно редактора VBA и вывод в нем текста заготовки процедуры: Private Sub CommandButton1_Click() End Sub 8. Между строками шаблона процедуры введите только одну строку: UserForm1.Show в соответствии с записью: Private Sub CommandButton1_Click() UserForm1.Show End Sub
200 Глава 6 Рис. 6.15. Данные из таблицы Листа2 помещены в форму и заносятся в строку 1 Листа1 9. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение: ВЫЗОВ ФОРМЫ. 10. Для формы в редакторе кода, вызываемого командой View | Code (Вид | Окно кода), напишите код в соответствии с листингом 6.9. Листинг 6.9. Обработчик события для элемента управления ListBox Private Sub lst_MultiCol_Change() Dim str1 As String Dim str2 As String Dim str3 As String With lst_MultiCol str1 = .List(.ListIndex, 0) str2 = .List(.ListIndex, 1) str3 = .List(.ListIndex, 2) End With With Worksheets("Лист1") .Range("A1").Value = str1 .Range("B1").Value = str2 .Range("C1").Value = str3 End With End Sub
Пользовательская форма 201 Private Sub cmd_Cancel_Click() Unload Me End Sub 11. На листе Лист1 щелкните мышью по командной кнопке ВЫЗОВ ФОРМЫ для вызова формы. В форме выберите запись. Данные трех колонок списка lst_MultiCol будут определять строки, которые затем, на указанном рабочем листе, будут записаны в ячейки А1, B1, C1 соответственно (рис. 6.15). 12. Сохраните созданный документ с формой под именем Листинг_6.9_Список.xlsm. Элемент управления ComboBox Элемент управления ComboBox (Поле со списком) позволяет вывести раскрывающийся список или поле со списком, где можно выбрать значение или ввести новое значение. Создается этот элемент кнопкой (см. табл. 6.5). Свойство Style определяет, действует ли элемент управления ComboBox как раскрывающийся список (0 — fmStyleDropDownCombo) или как поле со списком (2 — fmStyleDropDownList). Создадим в этом примере калькулятор, действующий на основе элемента управления ComboBox. В пользовательскую форму frm_Calculate пользователем вводятся числа в соответствующие поля, из раскрывающегося списка выбирается арифметическое действие и выдается результат вычисления (рис. 6.16). Рис. 6.16. Пример формы с элементом управления ComboBox
202 Глава 6 1. На рабочем листе для вызова формы frm_Calculate создайте кнопку (свойство Name — CommandButton1, свойство Caption — ВЫЗОВ КАЛЬКУЛЯТОРА). Код этой кнопки: Private Sub CommandButton1_Click() frm_Calculate.Show End Sub 2. В проекте разместите на форме frm_Calculate (см. рис. 6.16) элементы управления, приведенные в табл. 6.13. Таблица 6.13. Элементы управления формы frm_Calculate с ComboBox Объект Свойство Name Свойство Caption UserForm frm_Calculate КАЛЬКУЛЯТОР: Label lbl_Calculator КАЛЬКУЛЯТОР: Label lbl_Frame — TextBox txt_V1 — TextBox txt_V2 — ComboBox cmb_Fact — Label lbl_Result Результат вычислений: ListBox lst_Result CommandButton cmd_DeleteAll Очистить список CommandButton cmd_Cancel Закрыть форму 3. Наберите для формы следующий код, содержащий следующие подпрограммы: процедура-обработчик события инициализации формы Initialize, процедураобработчик события Change элемента управления ComboBox (Поле со списком), функция Calculate(), служащая для вычисления арифметического действия над двумя числами, встроенная процедура lst_Result_DblClick и процедуры, выполняемые по нажатию командных кнопок (листинг 6.10). Листинг 6.10. Пример формы с элементом управления ComboBox Private Sub UserForm_Initialize() 'Инициализация формы cmb_Fact.AddItem "+" 'Добавить сложение в раскрывающийся список cmb_Fact.AddItem "-" cmb_Fact.AddItem "*" cmb_Fact.AddItem "/" End Sub Private Sub cmb_Fact_Change() lst_Result.AddItem Calculate 'При выборе действия вызывается функция Вычислить, 'результат заносится в lst_Result End Sub
Пользовательская форма 203 Function Calculate() 'Функция Вычислить If IsNumeric(txt_V1) And IsNumeric(txt_V2) Then If cmb_Fact = "+" Then Calculate = CDbl(txt_V1) + CDbl(txt_V2) 'CDbl - conversion to double, преобразует содержимое 'текстового поля в число типа double ElseIf cmb_Fact = "-" Then Calculate = CDbl(txt_V1) - CDbl(txt_V2) ElseIf cmb_Fact = "*" Then Calculate = CDbl(txt_V1) * CDbl(txt_V2) ElseIf cmb_Fact = "/" Then If txt_V2 > 0 Or txt_V2 < 0 Then Calculate = CDbl(txt_V1) / CDbl(txt_V2) Else MsgBox "Деление на ноль невозможно." 'Сообщение об ошибке End If End If Else Calculate = "Ошибка" End If End Function Private Sub lst_Result_DblClick(ByVal Cancel As MSForms.ReturnBoolean) If lst_Result <> "Ошибка" Then ActiveCell = lst_Result.Value Else ActiveCell = lst_Result End If End Sub Private Sub cmd_DeleteAll_Click() lst_Result.Clear End Sub Private Sub cmd_Cancel_Click() Unload Me End Sub 4. Для вывода результата в активную ячейку рабочего листа Лист1 создана встроенная процедура lst_Result_DblClick(ByVal Cancel As MSForms.ReturnBoolean), обработчик события DblClick по нажатию двойным щелчком левой кнопкой мыши по полю lst_Result (более подробная информация о встроенных процедурах приведена в главе 11). В поле Результат выделите двойным щелчком левой кнопкой мыши строку, и она будет занесена в активную ячейку. 5. Сохраните созданный КАЛЬКУЛЯТОР.xlsm. документ с формой под именем Листинг_6.10_
204 Глава 6 Элемент управления Image Элемент управления Image (Изображение) позволяет внедрять на форму изображение. Создается этот элемент кнопкой (см. табл. 6.5). Рассмотрим приемы работы с элементом управления Image (Изображение). 1. Запустите программу Microsoft Excel 2019 и создайте новую книгу. 2. В ячейки А1:С16 листа рабочей книги введите данные в соответствии с рис. 6.17 (или другие аналогичные). Рис. 6.17. Пример данных о платежах 3. В редакторе Visual Basic for Applications в меню Insert (Вставить) выберите объект UserForm — в проекте появится новая форма. 4. Разместите на форме UserForm1 (рис. 6.18, а) элементы управления, приведенные в табл. 6.14. Настройте свойства элементов управления Height, Width, Top, Left таким образом, чтобы с формой было удобно работать и элементы управления с надписями полностью помещались на форме. 5. Для элемента управления Image (Изображение) (см. рис. 6.18, а) установите свойства в соответствии с рис. 6.18, б. При нажатии кнопки с символом многоточия свойства Picture открывается диалоговое окно (рис. 6.18, в) загрузки
Пользовательская форма 205 а Рис. 6.18. Использование элемента управления Image: а — рисунок в форме; б — его свойства; в — диалоговое окно Load Picture б в
206 Глава 6 Таблица 6.14. Элементы управления на форме с рисунком Объект Свойство Name Свойство Caption UserForm UserForm1 ПЛАТЕЖИ Label Label1 СПЕЦИФИКАЦИЯ ПЛАТЕЖЕЙ Image Image1 — Frame Frame1 Подсветка: OptionButton opt_Yellow Желтый OptionButton opt_Orange Оранжевый OptionButton opt_Green Зеленый OptionButton opt_Blue Голубой ComboBox cmb_Choose — CommandButton cmd_Apply Включить подсветку CommandButton cmd_Remove Выключить подсветку CommandButton cmd_Quit Закрыть форму 6. 7. 8. 9. рисунка Load Picture. Рисунок необходимо подготовить заранее, продумать его размеры, а также размеры и формат файла хранения рисунка. На листе рабочей книги создайте командную кнопку категории Элементы ActiveX для вызова формы. Щелкните по кнопке правой кнопкой мыши и в контекстно-зависимом меню выберите команду Просмотреть код (см. рис. 1.25). В появившейся заготовке редактора VBA между строками шаблона процедуры введите строку: UserForm1.Show. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение ВЫЗОВ ФОРМЫ. Наберите для формы код из листинга 6.11. П РИМЕЧАНИЕ Код можно набирать в редакторе макросов непосредственно единым целым, либо последовательно выполнять двойной щелчок на управляющих элементах формы и вводить соответствующие обработчики события. С точки зрения программиста лучше все делать последовательно, постепенно отлаживая код, настраивая свойства и проверяя работу программы. При "ручном" режиме увеличивается вероятность появления ошибок, связанных с неправильным вводом. Листинг 6.11. Пример формы с рисунком Private Sub UserForm_Initialize() 'Инициализация формы With cmb_Choose .AddItem ("Подоходный налог")
Пользовательская форма 207 .AddItem ("НДС") .AddItem ("Налог на прибыль") End With End Sub Private Sub cmd_Apply_Click() 'Обработчик события по нажатию кнопки Включить подсветку Dim r As Range Dim c As Control Dim str As String Range("A3:C16").Interior.ColorIndex = xlNone For Each c In Frame1.Controls If c = True Then str = c.Name End If Next c For Each r In Range("C3:C21") If r = cmb_Choose Then r.Offset(0, -2).Resize(1, 3). _ Interior.ColorIndex = Цвет_подсветки(str) 'Вызов функции 'из модуля 1 End If Next r End Sub Private Sub cmd_Remove_Click() 'Обработчик события по нажатию кнопки Выключить подсветку Range("A3:C21").Interior.ColorIndex = xlNone End Sub Private Sub cmd_Quit_Click() 'Обработчик события по нажатию кнопки Закрыть форму Unload Me End Sub 10. Попробуйте запустить форму. В процессе заполнения формы появится сообщение компилятора "Sub or Function not defined" для функции Цвет_подсветки. Создайте модуль Module1 и определите в нем эту функцию. Вот ее код: Function Цвет_подсветки(MyColor As String) As Byte Select Case MyColor Case Is = "opt_Yellow" Цвет_подсветки = 36 Case Is = "opt_Orange" Цвет_подсветки = 40 Case Is = "opt_Green" Цвет_подсветки = 35
208 Глава 6 Case Is = "opt_Blue" Цвет_подсветки = 34 End Select End Function Запустите форму из рабочего листа книги Microsoft Excel, нажав на кнопку ВЫЗОВ ФОРМЫ. Результат работы макросов показан на рис. 6.19. 11. Сохраните созданный документ с формой под именем Листинг_6.11_Image.xlsm. а б Рис. 6.19. Форма с рисунком (а) и результат форматирования таблицы (б)
Пользовательская форма 209 Элемент управления SpinButton Элемент управления SpinButton (Счетчик) позволяет внедрять на форму счетчик, он создается кнопкой (см. табл. 6.5). Счетчик, в отличие от полосы прокрутки, не имеет ползунка и служит для выбора нужного значения при нажатии кнопок уменьшения или увеличения текущего значения. Часто используется в комбинации с элементом управления Textbox (Текстовое поле). Рассмотрим основные свойства элемента управления SpinButton (табл. 6.15). Таблица 6.15. Свойства элемента управления SpinButton Свойство Описание Name Обозначает имя счетчика, используемое для обращения в программе Delay Определяет интервал между двумя событиями. По умолчанию равен 50 миллисекундам Max Задает максимальное значение счетчика (по умолчанию — 100) Min Задает минимальное значение счетчика (по умолчанию — 0) Orientation Определяет направление расположения счетчика:  –1 — fmOrientationAuto (автоматически по свойствам формы);  0 — fmOrientationVertical (вертикальное);  1 — fmOrientationHorizontal (горизонтальное) SmallChange Устанавливает шаг при нажатии на кнопки счетчика (1 — по умолчанию) Value Содержит значение в текущий момент времени из диапазона Min и Max, в соответствии с положением ползунка Приемы работы с элементом управления SpinButton (Счетчик) рассмотрим на следующем примере. 1. Запустите программу Microsoft Excel 2019 и создайте новую книгу. 2. На листе рабочей книги в ячейки А1:D8 введите данные в соответствии с рис. 6.20 (или другие аналогичные). 3. На листе рабочей книги создайте командную кнопку категории Элементы ActiveX для вызова формы. 4. Из контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение ВЫЗОВ ФОРМЫ, а для свойства Name — cmd_Show. 5. Щелкните по кнопке правой кнопкой мыши и в контекстно-зависимом меню выберите команду Просмотреть код (см. рис. 1.25). Между строками шаблона появившейся процедуры введите строку frm_Club.Show. Таким образом, при нажатии кнопки, расположенной на рабочем листе, будет вызываться пользовательская форма frm_Club, хранящаяся в редакторе VBA.
210 Глава 6 Рис. 6.20. Пример текстовых данных для работы с формой 6. В меню Insert (Вставить) редактора VBA выберите объект UserForm — в проекте появится новая форма UserForm1, переименуйте ее в frm_Club. 7. Разместите на форме frm_Club (см. рис. 6.21) элементы управления и настройте их свойства согласно табл. 6.16. Свойства Height, Width, Top, Left задайте так, чтобы с формой было удобно работать и элементы управления с надписями полностью помещались на форме. Таблица 6.16. Элементы управления на форме со счетчиком Объект Свойство Name Свойство Caption UserForm frm_Club ПОБЕДИТЕЛИ ОЛИМПИАД Image Image1 — SpinButton spn_Change — Label lbl_Surname Имя Label lbl_FirstName Фамилия Label lbl_Discipline Дисциплина Label lbl_Joining Учебное заведение TextBox txt_Имя — TextBox txt_Фамилия — TextBox txt_Дисциплина — TextBox txt_Место_учебы — CommandButton cmd_Clear Убрать данные из формы
Пользовательская форма 211 Таблица 6.16 (окончание) Объект Свойство Name Свойство Caption CommandButton cmd_New Ввод новых данных CommandButton cmd_Save Сохранить данные CommandButton cmd_Delete Удалить активную запись CommandButton cmd_Quit Закрыть форму Рис. 6.21. Пример формы для работы с данными 8. Для формы в редакторе кода, вызываемого командой View | Code (Вид | Окно кода), напишите код в соответствии с листингом 6.12. Листинг 6.12. Пример управления формой со счетчиком Private Sub UserForm_Initialize() If ActiveCell.Row < 3 Then spn_Change = 3 Else spn_Change = ActiveCell.Row End If End Sub Private Sub spn_Change_Change() spn_Change.Min = 3 spn_Change.Max = 1048576
212 Cells(spn_Change, 1).Select txt_Имя = ActiveCell txt_Фамилия = ActiveCell.Offset(0, 1) txt_Дисциплина = ActiveCell.Offset(0, 2) txt_Место_учебы = ActiveCell.Offset(0, 3) End Sub Private Sub cmd_Clear_Click() txt_Имя = "" txt_Фамилия = "" txt_Дисциплина = "" txt_Место_учебы = "" End Sub Private Sub cmd_New_Click() Dim i As Long Dim lngMax As Long For i = 1 To 4 If Cells(1048576, i).End(xlUp).Row > lngMax Then lngMax = Cells(1048576, i).End(xlUp).Row End If Next i Cells(lngMax + 1, 1) = txt_Имя Cells(lngMax + 1, 2) = txt_Фамилия Cells(lngMax + 1, 3) = txt_Дисциплина Cells(lngMax + 1, 4) = txt_Место_учебы End Sub Private Sub cmd_Save_Click() ActiveCell = txt_Имя ActiveCell.Offset(0, 1) = txt_Фамилия ActiveCell.Offset(0, 2) = txt_Дисциплина ActiveCell.Offset(0, 3) = txt_Место_учебы End Sub Private Sub cmd_Delete_Click() ActiveCell.EntireRow.Delete txt_Имя = "" txt_Фамилия = "" txt_Дисциплина = "" txt_Место_учебы = "" End Sub Private Sub cmd_Quit_Click() Unload Me End Sub Глава 6
Пользовательская форма 213 С помощью созданной формы можно переходить от записи к записи, вводить новые записи и удалять ненужные (рис. 6.21). 9. Сохраните созданный документ с формой под именем Листинг_6.12_SpinButton.xlsm. Элемент управления TabStrip Элемент управления TabStrip (Набор вкладок) позволяет работать с несколькими вкладками, создается он кнопкой (см. табл. 6.5). Переход от вкладки к вкладке осуществляется щелчком на соответствующем ярлычке. Создадим пользовательскую форму с интерфейсом для ввода новых данных о количестве и цене для разных рабочих листов, по которым будут рассчитаны итоговые значения (рис. 6.22). 1. Запустите программу Microsoft Excel 2019 и создайте новую книгу. 2. Переименуйте четыре рабочих листа книги соответственно: • Лист1 — в ПРЕДПРИЯТИЯ; • Лист2 — в КЛИЕНТЫ; • Лист3 — в ПОСТАВЩИКИ; • Лист4 — в СМЕЖНИКИ. 3. На всех четырех листах в соответствии с рис. 6.22 введите в ячейки А1:С3 заголовки столбцов: в А1 — Количество, в А2 — Цена, в А3 — Итого. Рис. 6.22. Пример заголовков столбцов и ярлычков листов 4. На листе ПРЕДПРИЯТИЯ создайте командную кнопку категории Элементы ActiveX для вызова формы. 5. Щелкните по кнопке правой кнопкой мыши и в контекстно-зависимом меню выберите команду Просмотреть код (см. рис. 1.25). Между строками шаблона процедуры введите строку UserForm1.Show. 6. Установите свойство Caption командной кнопки: ВЫЗОВ ФОРМЫ. 7. В среде Microsoft Excel в редакторе VBA в меню Insert (Вставить) выберите объект UserForm — в проекте появится новая форма.
214 Глава 6 При использовании элемента управления TabStrip (Набор вкладок) первоначально по умолчанию создается набор, состоящий из двух вкладок (рис. 6.23, а). Новые вкладки добавляются с помощью команды New Page (Новая страница), выбираемой из контекстно-зависимого меню (рис. 6.23, б). Для того чтобы отобразить данное меню, выделите ярлычок Tab1 либо Tab2 и нажмите на нем правой кнопкой мыши. а б Рис. 6.23. Набор вкладок (а) и контекстно-зависимое меню (б) 8. Выберите из контекстно-зависимого меню команду Rename (Переименовать) и переименуйте: Tab1 — в ПРЕДПРИЯТИЯ, Tab2 — в КЛИЕНТЫ, Tab3 — в ПОСТАВЩИКИ, Tab4 — в СМЕЖНИКИ. 9. Разместите на форме UserForm1 (см. рис. 6.24) элементы управления, настраивая их свойства согласно табл. 6.17. Задайте свойства Height, Width, Top, Left так, чтобы с формой было удобно работать и элементы управления с надписями полностью помещались на форме. Таблица 6.17. Элементы управления на форме с вкладками TabStrip Объект Свойство Name Свойство Caption UserForm UserForm1 УЧЕТ И КОНТРОЛЬ TabStrip tbs_Names — Label lbl_Piece Количество Label lbl_Price Цена TextBox txt_Piece — TextBox txt_Price — CommandButton cmd_OK OK CommandButton cmd_Cancel ВЫХОД 10. Для формы в окне кода, вызываемом командой View | Code (Вид | Окно кода), напишите код в соответствии с листингом 6.13. Листинг 6.13. Пример управления формой с вкладками Private Sub UserForm_Initialize() Worksheets("ПРЕДПРИЯТИЯ").Activate End Sub
Пользовательская форма 215 Sub Preparation() With ActiveSheet .Cells(1048576, 1).End(xlUp).Offset(1, 0) = CDbl(txt_Piece) .Cells(1048576, 2).End(xlUp).Offset(1, 0) = CDbl(txt_Price) .Cells(1048576, 3).End(xlUp).Offset(1, 0) = txt_Piece * txt_Price 'Расчет итогового значения End With End Sub Private Sub cmd_OK_Click() If IsNumeric(txt_Piece) And IsNumeric(txt_Price) Then Preparation Else MsgBox "Введите числовые данные!" txt_Piece = "" txt_Price = "" End If txt_Piece = "" txt_Price = "" End Sub Private Sub tbs_Names_Change() Select Case tbs_Names.SelectedItem.Index Case 0 Worksheets("ПРЕДПРИЯТИЯ").Activate Case 1 Worksheets("КЛИЕНТЫ").Activate Case 2 Worksheets("ПОСТАВЩИКИ").Activate Case 3 Worksheets("СМЕЖНИКИ").Activate End Select End Sub Private Sub cmd_Cancel_Click() Unload Me End Sub Пользовательская форма в режиме работы показана на рис. 6.24. При вводе числовых данных в поле Количество и Цена выбранной вкладки, например ПРЕДПРИЯТИЯ, и нажатии кнопки OK произойдет ввод чисел в ближайшие сверху свободные ячейки столбцов A, B. В соответствующей ячейке столбца C рассчитывается итоговая сумма. Данные из формы появляются на листах в соответствии с названиями вкладок. 11. Сохраните созданный документ с формой под именем Листинг_6.13_Вкладки.xlsm.
216 Глава 6 Рис. 6.24. Пример формы для расчета итоговой цены Элементы управления CheckBox и MultiPage Элемент управления CheckBox (Флажок) позволяет выбрать несколько значений из (см. табл. 6.5). Элемент управленескольких возможных и создается кнопкой ния MultiPage (Набор страниц) позволяет реализовать многостраничные диалого(см. табл. 6.5). Переход от страницы к странице вые окна и создается кнопкой осуществляется щелчком мыши на соответствующем ярлычке. Создадим пользовательскую форму по управлению отображением данных с возможностью показа формул, сетки, ярлычков листов, масштаба и других свойств. 1. Запустите программу Microsoft Excel 2019 и создайте новую книгу. 2. Введите на листе рабочей книги Microsoft Excel в ячейку А1 значение 500, в А2 — 300, в А3 — формулу =СУММ(A1:A2). 3. С помощью кнопки Создать примечание, находящейся на вкладке Рецензирование ленты Microsoft Excel, создайте на этом листе для ячейки А3 примечание (см. рис. 6.26). 4. На листе рабочей книги создайте командную кнопку категории Элементы ActiveX для вызова формы. 5. Из контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение ВЫЗОВ ФОРМЫ, а для свойства Name — cmd_UserForm. 6. Щелкните по кнопке правой кнопкой мыши и в контекстно-зависимом меню выберите команду Просмотреть код (см. рис. 1.25). 7. Между строками появившегося шаблона процедуры введите строку UserForm1. Show. 8. В среде Microsoft Excel в редакторе VBA в меню Insert (Вставить) выберите объект UserForm — в проекте появится новая форма UserForm1. 9. Разместите на форме UserForm1 (рис. 6.25, а) элемент управления MultiPage (Набор страниц) со страницами Page1 (Показ), Page2 (Комментарий), Page3 (Масштаб) и другие элементы управления, приведенные в табл. 6.18. По умолчанию элементом управления MultiPage создаются две страницы. Новые страницы добавляются с помощью команды New Page (Новая страница), выби-
Пользовательская форма 217 раемой из контекстно-зависимого меню, появляющегося при щелчке правой кнопкой мыши по ярлычкам Page1 или Page2 элемента управления MultiPage (Набор страниц). 10. На странице Page1 (Показ) разместите три элемента управления категории CheckBox. На странице Page2 (Комментарий) разместите три элемента управления: OptionButton1, OptionButton2, OptionButton3. Может получиться, что при вводе текстовых обозначений элементов управления OptionButton текст может иметь неудобный для просмотра размер шрифта. Для вызова диалогового окна а б Рис. 6.25. Окна: а — пользовательская форма со страницами MultiPage в режиме конструктора; б — настройка шрифта для элемента управления OptionButton
218 Глава 6 Таблица 6.18. Элементы управления на форме с вкладками MultiPage Объект Свойство Name Свойство Caption UserForm UserForm1 ОТОБРАЖЕНИЕ ДАННЫХ MultiPage MultiPage — Для страницы Page1 (Caption — Показ) CheckBox CheckBox1 Формулы CheckBox CheckBox2 Сетка CheckBox CheckBox3 Ярлычки_листов Для страницы Page2 (Caption — Комментарий) OptionButton OptionButton1 Нет OptionButton OptionButton2 Индикатор OptionButton OptionButton3 Комментарий и индикатор Для страницы Page3 (Caption — Масштаб) ScrollBar ScrollBar1 — Label lbl_Zoom — Шрифт в окне свойств Properties элемента управления OptionButton1 щелкните левой кнопкой мыши на свойстве Font. Справа появится кнопка с многоточием (рис. 6.25, б). Нажав на этой кнопке, вы увидите диалоговое окно Шрифт, в котором сможете установить необходимые параметры шрифта. На страницу Page3 (Масштаб) поместите элемент управления ScrollBar. Объект не имеет свойства Caption, и на нем нельзя сделать надпись. Не забудьте для этого элемента управления задать свойство Min — минимальное значение полосы прокрутки (50) и свойство Max — максимальное значение полосы прокрутки (например, 100, 200 или 500). Также укажите начальное значение свойства Value, в нашем случае 51. Создайте элемент управления Label (Подпись) для управления текстом подписи, отвечающей за масштаб. ScrollBar 11. Поместите на форму кнопку CommandButton1, в свойство Caption которой введите значение Закрыть_форму. 12. Для формы в редакторе кода, вызываемом командой View | Code (Вид | Окно кода), напишите код в соответствии с листингом 6.14. В коде приведены обработчики событий по установке флажков, выборе переключателей, а также обработчики событий по нажатию командных кнопок. 13. Для управления способом отображения комментариев и индикаторов служит свойство Application.DisplayCommentIndicator (объекта Application), которое может принимать одну из констант перечисления XlCommentDisplayMode: xlCommentAndIndicator — отображать комментарий и значок комментария все время, xlCommentIndicatorOnly — отображать только значок комментария, ком-
Пользовательская форма 219 ментарий виден при проведении указателем мыши через ячейку, xlNoIndicator — не отображать значок комментария и сам комментарий. 14. При перемещении полосы прокрутки изменяется масштаб отображения документа, такая возможность появляется при использовании свойства Zoom объекта ActiveWindow, отвечающего за масштаб. Листинг 6.14. Пример кода управления пользовательской формой с MultiPage Private Sub CheckBox1_Click() If CheckBox1.Value = True Then 'Если установлен флажок, 'то отобразить формулы ActiveWindow.DisplayFormulas = True Else ActiveWindow.DisplayFormulas = False End If End Sub Private Sub CheckBox2_Click() If CheckBox2.Value = True Then 'Если установлен флажок, 'то отобразить линии сетки ActiveWindow.DisplayGridlines = True Else ActiveWindow.DisplayGridlines = False End If End Sub Private Sub CheckBox3_Click() If CheckBox3.Value = True Then 'Если установлен флажок, 'то отобразить ярлычки рабочих листов ActiveWindow.DisplayWorkbookTabs = True Else ActiveWindow.DisplayWorkbookTabs = False End If End Sub Private Sub CommandButton1_Click() UserForm1.Hide 'Скрыть форму, но запомнить установленные значения End Sub Private Sub OptionButton1_Click() Application.DisplayCommentIndicator = xlNoIndicator End Sub Private Sub OptionButton2_Click() Application.DisplayCommentIndicator = xlCommentIndicatorOnly End Sub
220 Глава 6 Private Sub OptionButton3_Click() Application.DisplayCommentIndicator = xlCommentAndIndicator End Sub Private Sub ScrollBar1_Change() ActiveWindow.Zoom = ScrollBar1.Value lbl_Zoom.Caption = ScrollBar1.Value & "% Масштаб" End Sub 15. Перейдите из редактора кода в приложение Microsoft Excel. Запустите форму на исполнение при помощи кнопки ВЫЗОВ ФОРМЫ, расположенной на Листе1. Результат работы программы приведен на рис. 6.26. 16. Сохраните созданный документ с формой под именем Листинг_6.14_MultiPage.xlsm. Рис. 6.26. Пример работы пользовательской формы по отображению данных Элемент управления RefEdit Элемент управления RefEdit (Ссылка) позволяет ссылаться из формы на любой диапазон данных электронной таблицы и создается кнопкой (см. табл. 6.5). Создадим пользовательскую форму по форматированию области ячеек, указываемых при помощи указателя мыши непосредственно из пользовательской формы. 1. Запустите программу Microsoft Excel 2019 и создайте новую книгу. 2. На листе рабочей книги Microsoft Excel введите произвольные числа (см. рис. 6.28). 3. В редакторе VBA в меню Insert (Вставить) выберите объект UserForm — в проекте появится новая форма UserForm1. Ее назначение — преобразование выде-
Пользовательская форма 221 ленного диапазона ячеек в текстовые данные, целочисленные и числа с точностью двух цифр после запятой. 4. Разместите на форме UserForm1 элемент управления RefEdit (Ссылка) и другие элементы управления, приведенные в табл. 6.19. Внимательно настройте все необходимые свойства, в том числе для самой пользовательской формы. Таблица 6.19. Элементы управления на форме с полем ссылки RefEdit Объект Свойство Name Свойство Caption UserForm UserForm1 ФОРМАТИРОВАНИЕ ЯЧЕЕК RefEdit ref_Format — Frame fra_Range Форматирование выделенной области OptionButton opt_Text Текст OptionButton opt_Long Число без запятой OptionButton opt_Dbl 2 цифры после запятой CommandButton cmd_Cancel ЗАКРЫТЬ ФОРМУ 5. Для формы, представленной в режиме конструктора на рис. 6.27, в окне, вызываемом командой View | Code (Вид | Окно кода), напишите код в соответствии с листингом 6.15. В процедуре Preparation с ее параметром strFormat используется свойство NumberFormat, возвращающее значение, представляющее собой Рис. 6.27. Пользовательская форма в режиме конструктора, настройка свойства элемента управления RefEdit
222 Глава 6 формат кода ячейки диапазона. Далее следуют процедуры обработчиков событий, выполняемых при выборе переключателей OptionButton. Для каждого из трех переключателей (текст, целое число, вещественное число с двумя знаками после запятой) приведена своя обработка события. Листинг 6.15. Пример управления формой с RefEdit Sub Preparation(strFormat As String) Dim c As Range If ref_Format.Value = "" Then Exit Sub End If For Each c In Range(ref_Format.Value) c.NumberFormat = strFormat Next c ref_Format.SetFocus End Sub Private Sub opt_Text_Click() Preparation "@" End Sub Private Sub opt_Long_Click() Preparation "0" End Sub Private Sub opt_Dbl_Click() Preparation "0.00" End Sub Private Sub cmd_Cancel_Click() Unload Me End Sub 6. Теперь для вызова пользовательской формы на листе рабочей книги создайте командную кнопку категории Элементы ActiveX. 7. Щелкните по кнопке правой кнопкой мыши и в контекстно-зависимом меню выберите команду Просмотреть код (см. рис. 1.25). В появившейся заготовке между строками шаблона процедуры введите строку UserForm1.Show. 8. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение ВЫЗОВ ФОРМЫ. 9. Перейдите из редактора кода в приложение Microsoft Excel. Запустите форму на исполнение при помощи кнопки ВЫЗОВ ФОРМЫ, расположенной на Листе1. Для выбора диапазона ячеек на форме ФОРМАТИРОВАНИЕ ЯЧЕЕК в поле
Пользовательская форма 223 выбора диапазона данных нажмите кнопку , расположенную в правом углу поля (рис. 6.28, а). Пользовательская форма временно исчезнет, и появится поле ввода диапазона ячеек. Выделите при помощи нажатой правой кнопки мыши данные на рабочем листе, они будут автоматически отображаться в виде ссылки в поле элемента управления RefEdit (рис. 6.28, б). Закончив выделение, нажмите на кнопке возврата в пользовательскую форму. Результат работы программы приведен на рис. 6.28, в. а б в Рис. 6.28. Использование элемента RefEdit: а — кнопка перехода в режим выбора диапазона ячеек; б — выбранный диапазон; в — результат форматирования ячеек 10. Сохраните созданный файл с пользовательской формой под именем Листинг_6.15_ RefEdit.xlsm. Элемент управления ToggleButton Элемент управления Выключатель (ToggleButton — в VBA), создаваемый на рабочем листе, представляет собой кнопку с фиксацией и может находиться в двух состояниях: либо в нажатом, либо в отпущенном. Элемент управления Выключа-
224 Глава 6 тель (ToggleButton) создается кнопкой ключателя на простом примере. (см. табл. 6.5). Рассмотрим работу вы- 1. Запустите программу Microsoft Excel 2019 и создайте новую книгу. 2. На листе рабочей книги создайте элемент управления Выключатель категории Элементы ActiveX. 3. Из контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение имени кнопки ВЫКЛЮЧАТЕЛЬ (рис. 6.29, а). Если на значке Выключатель прорисовываются две кнопки, то на рабочем листе видна только одна, которая может находиться либо в нажатом, либо в отжатом состоянии. а б Рис. 6.29. Элемент управления ToggleButton1: а — окно свойств; б — контекстно-зависимое меню
Пользовательская форма 225 4. Щелкните по кнопке правой кнопкой мыши и в контекстно-зависимом меню выберите команду Просмотреть код (рис. 6.29, б). Используя заготовку, напишите код управления выключателем (листинг 6.16). Обратите внимание, что код записывается на Листе1, создание отдельного модуля не требуется. Не забудьте указать в начале окна кода оператор Option Explicit. Листинг 6.16. Пример работы элемента управления ToggleButton1 Private Sub ToggleButton1_Click() If ToggleButton1 = True Then MsgBox "Кнопка в нажатом состоянии!" End If End Sub 5. Сохраните рабочую книгу с элементом управления под именем Листинг_6.16_ Выключатель.xlsm. Пользовательский элемент управления Ранее уже было показано, как можно создавать новые элементы управления и размещать их на панели элементов Toolbox в редакторе VBA. Рассмотрим, как создать собственный элемент управления. 1. Запустите программу Microsoft Excel 2019 и откройте новую книгу. 2. Перейдите в среде Microsoft Excel в редактор VBA (<Alt>+<F11>). 3. В меню Insert (Вставить) выберите объект UserForm — в проекте появится новая форма UserForm1. 4. Создайте на форме два элемента управления: CommandButton1 — OK и CommandButton2 — ВЫХОД. 5. Выделите обе созданные кнопки, щелкните по выделению левой кнопкой мыши и, не отпуская этой кнопки, перетащите выделенные элементы на панель элементов Toolbox (рис. 6.30, а), — появится новый элемент управления New Group (Новая группа). 6. Щелкните по элементу управления New Group (Новая группа) правой кнопкой мыши и из появившегося контекстно-зависимого меню (рис. 6.30, б) выберите команду Customize New Group (Настроить новую группу) — откроется диалоговое окно Customize Control (Настроить элемент управления) (рис. 6.31, а). 7. В диалоговом окне Customize Control (Настроить элемент управления) загрузите новый значок и с помощью команды Load Picture (Загрузить рисунок) назовите элемент управления, например, МОЯ НОВАЯ ГРУППА (рис. 6.31, б) — результат налицо (рис. 6.31, в). Обратите внимание, что ваш рисунок должен быть небольшого размера, иначе он не поместится на значке. Пример пользовательского элемента управления приведен в файле NewGroup_Глава 6.xlsm.
226 Глава 6 а б Рис. 6.30. Элемент управления New Group: а — создание нового значка; б — его контекстно-зависимое меню а б в Рис. 6.31. Этапы создания новой группы: а — открытие диалогового окна Customize Control; б — задание имени рисунка; в — новый элемент управления на панели Toolbox Элементы управления формы Ранее уже были рассмотрены панели элементов управления и объекты — отдельные элементы управления. В данной главе мы уже рассмотрели работу с элементами управления, размещаемыми на пользовательской форме в VBA. На рис. 6.32, а показаны две панели элементов управления: Элементы ActiveX и Элементы управления формы, предназначенные для автоматизации рабочих листов Microsoft Excel. Рассмотрим теперь элементы управления на панели Элементы управления формы (табл. 6.20). Для элемента управления панели Элементы управления формы можно назначить макрос, выполняемый при нажатии на элементе, но написать обработчик события с применением VBA, как, например, для элемента категории ActiveX, нельзя. Также при помощи элементов управления формы можно ссылаться на данные ячеек без использования VBA, этот прием будет рассмотрен в следующем разделе. Редактировать элемент управления можно только в режиме конструктора а управлять с его помощью — только выйдя из этого режима (см. рис. 6.32, а). ,
Пользовательская форма 227 Таблица 6.20. Элементы управления на панели Элементы управления формы Кнопка Название Кнопка Поле со списком Флажок Счетчик Список Переключатель Группа Подпись Полоса прокрутки Элемент управления Полоса прокрутки Работу элемента управления Полоса прокрутки продемонстрируем на примере построения таблицы умножения чисел от 1 до 10. Автоматизируйте процесс изменения числа десятков n от 0 до 9, чтобы иметь возможность просматривать произведения чисел от 10*n+1 до 10*(n+1). 1. Создайте новый файл Microsoft Excel 2019. 2. Введите в ячейку А1 название: ТАБЛИЦА УМНОЖЕНИЯ. По умолчанию надпись набрана гарнитурой Calibri, кеглем 11. Измените шрифт на Arial и кегль на 14, используйте полужирное начертание. 3. Вторую строку оставьте свободной. 4. В ячейку L1 введите n, а в ячейку L2 — значение 0. Завершите ввод щелчком в строке формул. курсора мыши по кнопке 5. На вкладке ленты Разработчик в группе Элементы управления выберите значок Вставить . 6. На панели инструментов Элементы управления формы (рис. 6.32, а) выберите значок Полоса прокрутки и нарисуйте ее около ячейки M2, растягивая курсором по диагонали при нажатой левой кнопке мыши.
228 Глава 6 а б Рис. 6.32. Вставка элемента управления формы в Microsoft Excel: а — панель инструментов Элементы управления формы; б — контекстно-зависимое меню полосы прокрутки 7. Щелкните по полосе прокрутки правой кнопкой мыши и в появившемся контекстно-зависимом меню выберите команду Формат объекта (рис. 6.32, б). 8. Установите параметры в диалоговом окне Формат элемента управления на вкладке Элемент управления согласно рис. 6.33, а. 9. Сформируйте последовательность 1:10 в ячейках В3:K3, для чего в ячейке В3 наберите формулу =10*$L$2+1. Завершите ввод щелчком указателя мыши по кнопке в строке формул. 10. В ячейку С3 введите формулу =B3+1 и выполните автозаполнение формулы на ячейки D3:K3. 11. Аналогично сформируйте столбец чисел, для чего в ячейке A4 наберите формулу =10*$L$2+1. Завершите ввод щелчком курсора мыши по кнопке в строке формул. 12. В ячейку А5 введите формулу =A4+1 и выполните автозаполнение формулы на ячейки A6:A13. 13. В ячейку В4 введите формулу =B$3*$A4 и скопируйте ее на диапазон B4:K13. В результате получаем таблицу умножения. Проверьте работу полосы прокрутки, выйдя из режима конструктора (рис. 6.33, б). 14. Сохраните созданный документ с формой под именем Листинг_6.17_Таблица_ умножения.xlsm. Для этого необходимо выбрать команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла выбрать вариант сохранения файла: Книга Excel с поддержкой макросов.
Пользовательская форма 229 а б Рис. 6.33. Работа с элементом управления: а — настройка его свойств; б — использование элемента управления для прокрутки таблицы умножения на рабочем листе
230 Глава 6
ГЛАВА 7 Программирование объектов Shape Завалилась суббота за пятницу. В этой главе рассматриваются объекты Shape: линии, стрелки, овалы, треугольники, прямоугольники, надписи, WordArt, ClipArt и др. Некоторое внимание мы уделим здесь также таким интересным объектам. Объектом Shape становится любой графический объект, размещенный на рабочем листе или диаграмме, который можно создать при помощи вставки автофигур категории Фигуры на вкладке Вставка или программно в VBA. Все фигуры (объекты Shape) рабочего листа представляют собой семейство Shapes. Типы объектов, свойства и методы семейства Shapes Один из популярных методов семейства Shapes — AddShape — предназначен для добавления автофигуры типа Shape на рабочий лист. Синтаксис метода AddShape: AddShape(Type, Left, Top, Width, Height) Здесь аргументы (свойства) Type, Left, Top, Width, Height задают тип объекта автофигуры перечисления MsoAutoShapeType, координаты левого верхнего угла автофигуры, ее ширину и высоту соответственно. Некоторые типы объектов семейства Shapes перечислены в табл. 7.1. Они задаются при помощи констант перечисления MsoAutoShapeType и служат для обозначения автофигуры. Таблица 7.1. Примеры констант объектов автофигур семейства Shapes Тип объекта Значение Описание msoShapeRectangle 1 Прямоугольник msoShape24pointStar 95 24-конечная звезда
232 Глава 7 Таблица 7.1 (окончание) Тип объекта Значение Описание msoShape5pointStar 92 5-конечная звезда msoShapeArc 25 Дуга msoShapeBalloon 137 Воздушный шар msoShapeBevel 15 Фаска msoShapeCloud 179 Форма облака msoShapeCube 14 Куб msoShapeChartX 180 Квадрат, разделенный на четыре части диагональными линиями msoShapeFrame 158 Прямоугольный фрейм для картинки msoShapeHeart 21 Сердце msoShapeLeftArrowCallout 54 Выноска со стрелкой, указывающей влево msoShapeLineCallout3 111 Выноска с линией под углом msoShapeMoon 24 Луна msoShapeSmileyFace 17 Улыбающееся лицо msoShapeWave 103 Волна У объекта Shape имеется интересная особенность: многие его свойства устанавливаются опосредованно — через свойства объектов нижнего уровня иерархии. Например, для задания цвета, типа и толщины линии границы объекта Shape следует воспользоваться свойством Line, которое возвращает объект LineFormat. А свойство OnAction объекта Shape назначает фигуре макрос, выполняющийся при щелчке по фигуре. Среди методов объекта Shape можно отметить IncrementLeft, IncrementTop и сдвигающие фигуру на указанное количество пунктов по горизонтали, вертикали и поворачивающие объект. IncrementRotation, Тип объекта msoShapeRectangle (прямоугольник) с заливкой (Fill) Объект Shape, имеющий тип msoShapeRectangle (прямоугольник), строится из левого верхнего угла при заданных ширине и высоте. 1. Создайте новый файл Microsoft Excel 2019. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1 (Insert | Module (Вставить | Модуль)). Не забудьте использовать в начале окна кода оператор Option Explicit. В листинге 7.1 приведен код программы, которая на активном листе рисует прямоугольник и закрашивает его двухцветной градиентной заливкой методом
Программирование объектов Shape 233 от центра при помощи константы msoGradientFromCenter, задавая тон переднего ForeColor.RGB и заднего BackColor.RGB цветов (рис. 7.1). TwoColorGradient Листинг 7.1. Пример объекта Shape с типом msoShapeRectangle (прямоугольник) и градиентной заливкой (TwoColorGradient) Public Sub Закрашенный_прямоугольник() Set myDocument = Worksheets(1) With myDocument.Shapes.AddShape(msoShapeRectangle, _ 150, 150, 200, 100).Fill .ForeColor.RGB = RGB(0, 255, 0) .BackColor.RGB = RGB(57, 170, 170) .TwoColorGradient msoGradientFromCenter, 4 End With End Sub Рис. 7.1. Пример нарисованного прямоугольника 3. Для выполнения процедуры воспользуйтесь командой Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). Запустить макили нажатием клавиши <F5>. рос на выполнение можно также кнопкой Обратите внимание, что при выделении нарисованного объекта на ленте появляется вкладка Формат, содержащая средства рисования. 4. Сохраните созданный документ с фигурой под именем Листинг_7.1_Закрашенный_ прямоугольник.xlsm. Для этого выберите команду Файл | Сохранить как и в диа-
234 Глава 7 логовом окне Сохранение документа в раскрывающемся списке Тип файла укажите вариант сохранения файла Книга Excel с поддержкой макросов. Э ЛЕКТРОННЫЙ АРХИВ Листинг 7.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_7_Графические_элементы сопровождающего книгу электронного архива. Тип объекта msoConnectorCurve (соединительная линия) Рассмотрим пример с использованием соединительной линии — объекта Shape, имеющего тип msoConnectorCurve в виде кривой. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1 (Insert | Module (Вставить | Модуль)). 2. Нарисуем программно два прямоугольника, соединенные линией (листинг 7.2, рис. 7.2). В макросе для объекта ConnectorFormat при помощи методов BeginConnect и EndConnect прикрепляются начало и конец соединительной линии к указанным фигурам. Рис. 7.2. Пример двух прямоугольников, связанных соединительной линией Листинг 7.2. Пример объекта Shape с типом msoConnectorCurve Public Sub Соединительная_линия() Set myDocument = Worksheets(1) Set s = myDocument.Shapes
Программирование объектов Shape 235 Set Прям1 = s.AddShape(msoShapeRectangle, 50, 25, 100, 80) Set Прям2 = s.AddShape(msoShapeRectangle, 280, 60, 90, 60) Set c = s.AddConnector(msoConnectorCurve, 0, 0, 0, 0) With c.ConnectorFormat .BeginConnect ConnectedShape:=Прям1, ConnectionSite:=1 .EndConnect ConnectedShape:=Прям2, ConnectionSite:=1 c.RerouteConnections ' Поиск наикратчайшего пути End With End Sub 3. Для запуска макроса нажмите кнопку . 4. Сохраните созданный документ с фигурой под именем Листинг_7.2_Соединительная_ линия.xlsm. Метод AddConnector Метод AddConnector(Type, BeginX, BeginY, EndX, EndY), добавляющий соединительную линию, тип которой задается при помощи константы Type из перечисления MsoConnectorType, уже использовался в предыдущем примере. Также в аргументах для линии необходимо указать значения начальных (BeginX, BeginY) и конечных координат (EndX, EndY), отсчет ведется от левого верхнего угла документа. Но в данном примере на рабочий лист добавляются две фигуры в виде полумесяца (тип msoShapeMoon объекта Shape). Для их соединения применяются две соединительные линии, изогнутые под прямым углом (константа msoConnectorElbow). Начало обеих соединительных линий привязывается к первой точке соединения первой фигуры, а концы линий прикрепляются к первой и последней точкам соединения второй фигуры. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль Module1. 2. Используя метод AddConnector, нарисуйте два месяца, соединенных двумя линиями msoConnectorElbow (листинг 7.3, рис. 7.3). Листинг 7.3. Пример использования метода AddConnector Public Sub Добавить_соединитель() Set s = ActiveSheet.Shapes Set Луна1 = s.AddShape(msoShapeMoon, 100, 50, 100, 100) Set Луна2 = s.AddShape(msoShapeMoon, 300, 300, 200, 200) lastsite = Луна2.ConnectionSiteCount With s.AddConnector(msoConnectorElbow, _ 0, 0, 100, 100).ConnectorFormat .BeginConnect ConnectedShape:=Луна1, ConnectionSite:=1 .EndConnect ConnectedShape:=Луна2, ConnectionSite:=1 End With
236 Глава 7 With s.AddConnector(msoConnectorElbow, _ 0, 0, 100, 100).ConnectorFormat .BeginConnect ConnectedShape:=Луна1, ConnectionSite:=1 .EndConnect ConnectedShape:=Луна2, ConnectionSite:=lastsite End With End Sub Рис. 7.3. Пример двух фигур в виде месяца, соединенных двумя прямоугольными линиями 3. Убедитесь, что курсор находится на одной из строк введенного макроса. Для . запуска макроса нажмите кнопку 4. Сохраните созданный документ с фигурой под именем Листинг_7.3_Соединение.xlsm. Метод Patterned Ранее уже рассматривалось построение прямоугольника с градиентной заливкой. Теперь приведем пример с заливкой по образцу, которая выполняется при использовании метода Patterned. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль Module1.
Программирование объектов Shape 237 В листинге 7.4 приведен код программы, рисующей два куба (тип msoShapeCube объекта Shape), закрашенных заливкой по образцу, заданной при помощи одной из констант типа MsoPatternType (рис. 7.4). Листинг 7.4. Пример использования метода Patterned Public Sub Заливка_по_образцу() With ActiveSheet.Shapes With .AddShape(msoShapeCube, 100, 20, 160, 120) With .Fill .ForeColor.RGB = RGB(0, 0, 255) .BackColor.RGB = RGB(0, 204, 255) .Patterned msoPatternDiagonalBrick End With 'Задать форматирование по умолчанию .SetShapesDefaultProperties End With 'Создание новой фигуры с форматированием, заданным по умолчанию .AddShape msoShapeCube, 200, 100, 80, 60 End With End Sub 2. Убедитесь, что курсор находится на одной из строк введенного макроса. Для выполнения процедуры нажмите клавишу <F5>. 3. Сохраните созданный документ с фигурой под именем Листинг_7.4_Заливка_ по_образцу.xlsm. Рис. 7.4. Пример двух кубов, закрашенных заливкой по образцу
238 Глава 7 Рисование линии: метод AddLine Рассмотрим пример построения линии. Новая линия в семействе Shapes добавляется методом AddLine. Синтаксис метода AddLine: AddLine(BeginX, BeginY, EndX, EndY) где аргументами являются координаты точек, определяющих линию (отрезок). 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. В листинге 7.5 приведен код программы, рисующей штрихпунктирную линию, тип которой определяется свойством DashStyle (рис. 7.5). Также в свойствах линии заданы цвет и толщина. Поскольку аргументы BeginY и EndY совпадают, линия расположена горизонтально. Рис. 7.5. Пример линии Листинг 7.5. Пример использования метода AddLine Sub Линия() Set myDocument = ActiveSheet With myDocument.Shapes.AddLine(100, 100, 300, 100).Line .DashStyle = msoLineDashDot .ForeColor.RGB = RGB(255, 34, 56) .Weight = 6 End With End Sub
Программирование объектов Shape 239 2. Убедитесь, что курсор находится на одной из строк введенного макроса. Для выполнения процедуры нажмите клавишу <F5>. 3. Сохраните созданный документ с фигурой под именем Листинг_7.5_Линия.xlsm. Тип объекта msoShapeSmileyFace Рассмотрим пример построения объекта Shape, имеющего тип msoShapeSmileyFace. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль Module1. В листинге 7.6 приведен код программы, рисующей смайлик (рис. 7.6). Листинг 7.6. Пример использования объекта Shape с типом msoShapeSmileyFace Public Sub Свойства_фигуры() Set myDocument = Worksheets(1) With myDocument.Shapes.AddShape(msoShapeSmileyFace, _ 80, 93, 150, 150).Line .Weight = 3 .ForeColor.RGB = rgbRed End With End Sub 2. Убедитесь, что курсор находится на одной из строк введенного макроса. Для выполнения процедуры нажмите клавишу <F5>. 3. Сохраните созданный документ с фигурой под именем Листинг_7.6_Смайл.xlsm. Рис. 7.6. Пример рисования смайлика
240 Глава 7 Свойство Name Рассмотрим еще один пример создания автофигуры типа "волна" (тип msoShapeWave) с заливкой голубым цветом и обводкой линией, состоящей из круглых точек (константа msoLineRoundDot). Автофигуре присваивается имя Name. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. В листинге 7.7 приведен код программы, рисующей автофигуру с заданными свойствами (рис. 7.7). Рис. 7.7. Пример автофигуры "волна" с заливкой и обводкой Листинг 7.7. Пример использования свойства Name Sub Автофигура() Set myDocument = Worksheets(1) With myDocument.Shapes.AddShape(msoShapeWave, 144, 144, 72, 72) .Name = "Голубая волна" .Fill.ForeColor.RGB = rgbAqua .Line.DashStyle = msoLineRoundDot End With End Sub 2. Убедитесь, что курсор находится на одной из строк введенного макроса. Для запуска макроса нажмите кнопку . У созданного объекта есть имя Name = "Голубая волна". Если выделить на рабочем листе созданную фигуру, то имя отобразится в поле имя. Можно изменить
Программирование объектов Shape 241 цвет заливки квадрата .Fill.ForeColor.RGB, задав его датчиком случайных чисел Rnd: .Fill.ForeColor.RGB = RGB(Rnd * 256, Rnd * 256, Rnd * 256) 3. Сохраните созданный документ с автофигурой под именем Листинг_7.7_Свойство_ Name.xlsm. Стрелка К уже знакомым нам линии и соединительной линии добавим стрелку, у которой есть свойства длины, ширины, вида начала и конца. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. В листинге 7.8 приведен код программы, рисующей стрелку. Вообще-то, это прямая соединительная линия, у которой заданы начало и конец (рис. 7.8). Рис. 7.8. Пример стрелки Листинг 7.8. Пример рисования стрелки Sub Стрелка() With ActiveSheet.Shapes With .AddLine(100, 100, 300, 130).Line .BeginArrowheadLength = msoArrowheadLengthMedium .BeginArrowheadStyle = msoArrowheadDiamond .BeginArrowheadWidth = msoArrowheadWidthMedium .EndArrowheadLength = msoArrowheadShort .EndArrowheadStyle = msoArrowheadStealth .EndArrowheadWidth = msoArrowheadWide End With End With End Sub
242 Глава 7 2. Для запуска макроса нажмите кнопку . 3. Сохраните созданный документ с фигурой под именем Листинг_7.8_Стрелка.xlsm. Свойства BeginArrowheadWidth и EndArrowheadWidth возвращают или задают ширину наконечника стрелки, расположенного в начале и в конце обозначенной линии. Они могут принимать одно из значений перечисления MsoArrowheadWidth (табл. 7.2). Таблица 7.2. Константы ширины стрелки в начале или конце линии Имя Значение Описание msoArrowheadNarrow 1 Узкий msoArrowheadWide 3 Широкий msoArrowheadWidthMedium 2 Средний msoArrowheadWidthMixed –2 Только возвращает значение, указывает на комбинацию других состояний Стиль стрелки для начала и конца линии задается свойствами BeginArrowheadStyle и EndArrowheadStyle. Возможно применение констант перечисления MsoArrowheadStyle (табл. 7.3). Таблица 7.3. Константы стиля стрелки в начале или конце линии Имя Значение Описание msoArrowheadDiamond 5 Ромбовидный msoArrowheadNone 1 Без стрелки msoArrowheadOpen 3 Открытый msoArrowheadOval 6 Овальный msoArrowheadStealth 4 Вогнутый msoArrowheadStyleMixed -2 Только возвращает значение, указывает на комбинацию других состояний msoArrowheadTriangle 2 Треугольный Свойства BeginArrowheadLength и EndArrowheadLength возвращают или устанавливают длину стрелки в начале и конце обозначенной линии. Они могут принимать одно из значений перечисления MsoArrowheadLength (табл. 7.4). Таблица 7.4. Константы длины стрелки в начале и конце линии Имя Значение Описание msoArrowheadShort 1 Короткий msoArrowheadLong 3 Длинный msoArrowheadLengthMedium 2 Средний
Программирование объектов Shape 243 Таблица 7.4 (окончание) Имя msoArrowheadLengthMixed Значение -2 Описание Только возвращает значение, указывает на комбинацию других состояний Метод FillFormat.OneColorGradient Рассмотрим пример преобразования заливки всех графических объектов, расположенных на рабочем листе, в одноцветную градиентную заливку при помощи метода OneColorGradient(Style, Variant, Degree) объекта FillFormat. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>), добавьте к проекту модуль Module1 и создайте несколько графических объектов. В листинге 7.9 приведен код программы, в которой показан способ преобразования заливки для всех графических фигур указанного листа. Так, если на рабочем листе Лист1 уже были созданы объекты разных цветов, то их все сразу можно залить одноцветным градиентом, используя программу из листинга 7.9. Листинг 7.9. Пример использования метода FillFormat.OneColorGradient Sub Изменить_заливку() For Each s In Лист1.Shapes With s.Fill .OneColorGradient msoGradientFromCenter, 2, 1 End With Next End Sub 2. Для выполнения процедуры нажмите клавишу <F5>. В нашем случае все графические объекты заливаются одноцветной градиентной заливкой от центра. Текстовый фрейм Рассмотрим пример текстового фрейма в виде солнца и настройку его свойств — заливки фона и параметров текстовой надписи, находящейся во фрейме. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль Module1. В листинге 7.10 приведен код программы, рисующей текстовый фрейм с надписью с использованием объекта TextFrame. Тип фигуры задается при помощи константы msoShapeSun. Для настройки параметров текста, надписи, цвета шрифта и расположения в текстовом фрейме применяются различные свойства и методы. Свойства фрейма TextFrame.MarginBottom, TextFrame.MarginLeft, TextFrame. MarginRight и TextFrame.MarginTop задают соответственно нижнее, левое, правое
244 Глава 7 и верхнее поля. Также для созданной фигуры (текстового фрейма) применена заливка при помощи настройки свойств объекта Fill. Листинг 7.10. Пример использования объекта TextFrame Public Sub Текстовый_фрейм() Set myDocument = Worksheets(1) With myDocument.Shapes.AddShape(msoShapeSun, _ 150, 150, 150, 150).TextFrame 'Создание фигуры - солнца и настройка свойств текстового фрейма .Characters.Text = "Солнце" .Characters.Font.Color = rgbBrown .MarginBottom = 5 .MarginLeft = 5 .MarginRight = 5 .MarginTop = 5 End With For Each s In myDocument.Shapes With s.Fill 'Настройка свойств заливки фигур, имеющихся на рабочем листе .Solid .ForeColor.RGB = rgbYellow End With Next End Sub 2. Запустите макрос Текстовый_фрейм на исполнение. На Листе1 появится текстовый фрейм в виде солнца с надписью внутри (рис. 7.9). Рис. 7.9. Пример фрейма в виде солнца с текстом
Программирование объектов Shape 245 3. Сохраните созданный документ с фигурой под именем Листинг_7.10_Текстовый_ фрейм.xlsm. Замените в коде фигуру в виде солнца msoShapeSun, 150, 150, 150, 150 на овал msoShapeOval, 180, 200, 280, 130, и вы получите надпись в овале. Тип фигуры msoShapeHeart (сердце) с заливкой (Fill) Рассмотрим пример построения сердца — объекта типа Shape, при помощи числового обозначения 21, означающего константу msoShapeHeart. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. В листинге 7.11 приведен код программы, которая рисует на рабочем листе с порядковым номером 1 фигуру в виде сердца и закрашивает его двухцветной горизонтальной градиентной заливкой TwoColorGradient, задавая тон переднего ForeColor.RGB и заднего BackColor.RGB цветов (рис. 7.10). Для объекта заданы координаты левой вершины X и Y и размеры (ширина и высота) по осям x и y. Рис. 7.10. Пример фигуры в виде сердца с заливкой Листинг 7.11. Пример объекта Shape типа msoShapeHeart (сердце) с заливкой (Fill) Public Sub Фигура_сердце() With Worksheets(1).Shapes.AddShape(21, 15, 10, 200, 90).Fill ' 21 - числовое обозначение константы .ForeColor.RGB = RGB(250, 0, 0)
246 Глава 7 .BackColor.RGB = RGB(170, 170, 250) .TwoColorGradient msoGradientHorizontal, 1 End With End Sub 2. Убедитесь, что курсор находится на одной из строк введенного макроса. Для выполнения процедуры нажмите клавишу <F5>. 3. Сохраните созданный документ с фигурой под именем Листинг_7.11_Сердце.xlsm. Метод Group Рассмотрим пример с методом группировки объектов после их создания: облака, элемента блок-схемы и трапеции. Здесь, как и в предыдущем примере, константы обозначены числами: 179 означает константу msoShapeCloud, 64 — msoShapeFlowchartData, 3 — msoShapeTrapezoid. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ <F11>) и добавьте к проекту модуль Module1. В листинге 7.12 приведен код программы, рисующей три заданные фигуры, объединяемые затем в группу методом Group (рис. 7.11). Рис. 7.11. Пример группировки фигур разного типа Листинг 7.12. Пример использования метода Group Sub Группировка_объектов() With Worksheets(1).Shapes .AddShape(179, 10, 10, 100, 100).Name = "Cloud" .AddShape(64, 150, 10, 100, 100).Name = "FlowchartData" .AddShape(3, 300, 10, 100, 100).Name = "Trap"
Программирование объектов Shape 247 With .Range(Array("Cloud", "FlowchartData", "Trap")).Group .Fill.Patterned msoPattern90Percent 'Заливка применена ко всем объектам группы .GroupItems(1).Fill.PresetTextured msoTextureBouquet 'Применение текстуры к указанному объекту из группы End With End With End Sub 2. Убедитесь, что курсор находится на одной из строк введенного макроса. Для выполнения процедуры нажмите клавишу <F5>. 3. Сохраните созданный документ с фигурой под именем Листинг_7.12_Группировка_ объектов.xlsm. Создание выноски с текстовым фреймом Рассмотрим пример построения объекта в виде информационного значка (здесь задействована константа msoShapeActionButtonInformation) с выноской, содержащей текстовый фрейм. К фигурам будет применена градиентная заливка. Для текста в текстовом фрейме указан размер шрифта, а размер текстового фрейма подбирается автоматически с использованием свойства .TextFrame.AutoSize. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль Module1. В листинге 7.13 приведен код программы, рисующей знак информации (рис. 7.12). Далее создается выноска с текстовой надписью. При этом вертикальная линия, отделяющая текст от выноски, отсутствует (.Accent = msoFalse). Рис. 7.12. Пример значка информации с выноской
248 Глава 7 Листинг 7.13. Пример объекта Shape с типом msoShapeActionButtonInformation (информация) и выноской, созданной при помощи метода AddCallout Sub Знак_информации_с_выноской() With Worksheets("Лист1").Shapes .AddShape msoShapeActionButtonInformation, 160, 160, 100, 100 For Each s In Лист1.Shapes With s.Fill .OneColorGradient msoGradientFromCenter, 2, 1 End With Next With .AddCallout(msoCalloutTwo, 280, 166, 57, 40) .TextFrame.Characters.Text = "Информация" .TextFrame.Characters.Font.Size = 14 .TextFrame.AutoSize = True With .Callout .Accent = msoFalse .Border = True End With End With End With End Sub 2. Для запуска макроса нажмите кнопку . Текстовый фрейм присоединяется к значку информации выноской — соединительной линией msoCalloutTwo, располагающейся под любым углом. 3. Сохраните созданный документ с фигурой под именем Листинг_7.13_Выноска.xlsm. Свойство ThreeD Рассмотрим пример программы, рисующей три объемных цилиндра. Эффект объемности для овалов msoShapeOval достигается благодаря свойству ThreeD. Овалы выдавливаются с нужной глубиной экструзии с заданными углами. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль Module1. В листинге 7.14 приведен код программы, рисующей три цилиндра при помощи выдавливания овалов (рис. 7.13). Сначала нарисованы овалы, затем к ним применено свойство ThreeD. Листинг 7.14. Пример использования свойства ThreeD Sub Рисуем_в_3D() Set myDocument = Worksheets(1) With myDocument.Shapes
Программирование объектов Shape 249 With .AddShape(msoShapeOval, 30, 30, 50, 25).ThreeD .Visible = True .RotationX = 40 .RotationY = 20 .Depth = 50 End With With .AddShape(msoShapeOval, 140, 30, 50, 25).ThreeD .Visible = True .RotationX = 60 .RotationY = -20 .Depth = 45 End With With .AddShape(msoShapeOval, 250, 30, 50, 25).ThreeD .Visible = True .RotationX = 30 .RotationZ = 30 .Depth = 70 End With End With End Sub Рис. 7.13. Пример трех построенных цилиндров 2. Убедитесь, что курсор находится на одной из строк введенного макроса. Для выполнения процедуры нажмите клавишу <F5>. 3. Сохраните созданный документ с фигурой под именем Листинг_7.14_Цилиндры.xlsm.
250 Глава 7 Частичное и полное удаление фигур Рассмотрим способы частичного и полного удаления фигур, расположенных в рабочей книге. 1. Создайте новый файл Microsoft Excel 2019 с несколькими фигурами либо воспользуйтесь файлом Листинг_7.15_Листинг_7.16_Фигуры.xlsm (рис. 7.14, а). Обратите внимание, что на рабочем листе находятся графические элементы разного типа: файлы векторной графики в формате CDR (msoPicture) и SVG (msoGraphic), графическая схема SmartArt (msoSmartArt), знак "умножить" (msoAutoShape), а также командная кнопка и текст в ячейке. На рис. 7.14, а, выделен рисунок в масштабируемом векторном формате SVG, поддержка этого формата появилась в новой версии Microsoft Excel 2019. Для того чтобы вставить рисунок SVG-формата из библиотеки значков Microsoft Office, требуется подключение к Интернету. Перейдите на вкладку Вставка и в группе Иллюстрации нажмите на кнопке Значки. В открывшемся диалоговом окне Вставка значков (рис. 7.14, б) выберите один или несколько значков из разнообразных категорий и нажмите кнопку Вставка. Если же подключение к Интернету отсутствует, не беда, воспользуйтесь для вставки рисунком РисунокSVG.svg, расположенным в электронном архиве к главе 7, либо создайте свой векторный рисунок. П РИМЕЧАНИЕ Вкладка Формат, расположенная на ленте программы, при выделении SVG-рисунка, отличается по командам от команд, появляющихся на одноименной вкладке при выделении, например, рисунка в формате BMP. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. 3. Если необходимо удалить только объекты определенных типов, то можно использовать листинг 7.15, в котором приведен код программы, удаляющей объекты типов заданных типов msoPicture, msoGraphic, msoAutoShape, msoSmartArt, находящихся на рабочем листе программы Microsoft Excel. Листинг 7.15. Пример удаления заданных объектов Sub Удалить_заданное() Dim shp As Shape For Each shp In ActiveSheet.Shapes With shp If .Type = msoPicture Or .Type = msoGraphic Or _ .Type = msoAutoShape Or .Type = msoSmartArt Then .Delete End If End With Next shp End Sub
Программирование объектов Shape 251 а б Рис. 7.14. Работа с графикой в Microsoft Excel 2019: а — различные типы графики на рабочем листе; б — вставка SVG-значка из библиотеки
252 Глава 7 4. Запустите макрос на исполнение. Будут удалены указанные объекты графики. В листинге 7.16 приведен код программы, удаляющий все фигуры — объекты Shape, входящие в коллекцию фигур ActiveSheet.Shapes активного рабочего листа Microsoft Excel, включая командную кнопку. Листинг 7.16. Пример удаления всех объектов Sub Удалить_все() Dim shp As Shape For Each shp In ActiveSheet.Shapes shp.Delete Next shp End Sub Оператор Set Рассмотрим пример построения объектов с использованием оператора Set. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ <F11>) и добавьте к проекту модуль Module1. 2. На рабочем листе Microsoft Excel предварительно нарисуйте кнопку категории Элементы управления формы и назначьте для нее макрос Подгонка_объекта(). По щелчку на кнопке рисуется овал в указанном диапазоне ячеек и закрашивается цветом, установленным по умолчанию (рис. 7.15). В листинге 7.17 приведен код программы, в нем определены две переменные типа объект Shape и объект Range, а затем при помощи оператора Set для них устанавливается диапазон данных и в заданном диапазоне добавляется фигура методом AddShape. 3. В конце листинга оператор Set используется с ключевым словом Nothing для освобождения ресурсов и памяти, выделенных для объектов Shape и Range. Листинг 7.17. Пример использования оператора Set Sub Подгонка_объекта() Dim shp As Shape Dim rng As Range With Worksheets(1) Set rng = .Range("G10:J17") Set shp = .Shapes.AddShape _ (Type:=msoShapeOval, _ Left:=rng.Left, _ Top:=rng.Top, _ Width:=rng.Width, _ Height:=rng.Height) End With Set rng = Nothing Set shp = Nothing End Sub
Программирование объектов Shape 253 Рис. 7.15. Пример овала, созданного при нажатии кнопки 4. Запустите макрос на исполнение либо непосредственно в VBA, либо при помощи нажатия на созданной кнопке на рабочем листе. Овал будет нарисован с подгонкой размеров под заданный диапазон ячеек и окрашен цветом, используемым по умолчанию. 5. Сохраните созданный документ с фигурой под именем Листинг_7.17_Управление_ овалом.xlsm. Создание собственных элементов инфографики Средства VBA для работы с различного рода графикой позволяют создавать собственные инфографические элементы, тем самым облегчить понимание пользователем информации в виде цветового оформления фигур, добавления средств трансформации объектов в виде поворота, масштабирования. Программа Microsoft Excel мощно усилила способы работы с графикой, добавляя возможность обработки векторных форматов, преобразования фигуры в кривые, применения различных фильтров и эффектов. В последней версии программы стало возможным выполнять профессиональные операции обработки растровой и векторной графики, не прибегая к специализированным пакетам. Создадим инфографический элемент с иллюстрацией всех цветов радуги. Для этого создадим треугольный текстовый фрейм с определенным положением на рабочем
254 Глава 7 листе, применим к нему заливку. Затем будем последовательно создавать новые текстовые фреймы с заданным поворотом относительно друг друга, изменяя цвет фона. Текст программы приведен в листинге 7.18. Листинг 7.18. Инфографика средствами VBA Public Sub Инфографика_радуга() Dim i As Integer Dim tr(7) As Object Dim colors(7) As Long Dim lefts(7), tops(7) As Integer Dim st(7) As String st(1) = "Р" st(2) = "А" st(3) = "Д" st(4) = "У" st(5) = "Г" st(6) = "А" st(7) = "!" colors(1) = RGB(255, 0, 0) colors(2) = RGB(255, 128, 0) colors(3) = RGB(255, 255, 0) colors(4) = RGB(0, 255, 0) colors(5) = RGB(0, 255, 255) colors(6) = RGB(0, 0, 255) colors(7) = RGB(255, 0, 255) lefts(1) = 70 lefts(2) = 77 lefts(3) = 95 lefts(4) = 120 lefts(5) = 145 lefts(6) = 163 lefts(7) = 170 tops(1) = 200 tops(2) = 175 tops(3) = 157 tops(4) = 150 tops(5) = 157 tops(6) = 175 tops(7) = 200 For i = 1 To 7 Set tr(i) = Worksheets(1).Shapes.AddShape( _ msoShapeIsoscelesTriangle, lefts(i), tops(i), 50, 100) tr(i).Fill.ForeColor.RGB = colors(i) tr(i).Rotation = 60 + i * 30 tr(i).TextFrame.Characters.Text = st(i)
Программирование объектов Shape 255 tr(i).TextFrame.Orientation = 5 Next i End Sub 1. Запустите макрос на исполнение либо непосредственно в Visual Basic, либо при помощи нажатия на созданной кнопке на рабочем листе. Будет нарисован инфографический элемент со всеми цветами радуги (рис. 7.16). При желании можно изменить узлы выбранного треугольника, используя вкладку Формат, группу Вставка фигур, нажать на кнопке с раскрывающимся списком Изменить фигуру и выбрать команду Начать изменение узлов. 2. Сохраните созданный документ с фигурой под именем Листинг_7.18_ Инфографика.xlsm. Рис. 7.16. Инфографический элемент в виде радуги Фракталы В конце XX века стали весьма популярными математические труды о фракталах. Поэтому, рассматривая рисование отрезков средствами VBA Microsoft Excel 2019, мы не смогли пройти мимо создания фракталов. Еще несколько лет назад вся графика разделялась на растровую и векторную, но в последнее время стали отдельно рассматривать фрактальную графику. Фрактальная графика — графика, описанная математическими формулами комплексных переменных. Ее главная особенность — самоподобие. На международных научных конгрессах часто продают открытки и показывают видеофильмы, содержащие фрактальные изображения гор, воды, различных компьютерных узоров.
256 Глава 7 Что же такое фракталы? Термин "фрактал" введен Бенуа Мандельбротом в 1977 г. в его фундаментальной работе "Фракталы, Форма, Хаос и Размерность". Согласно Мандельброту слово "фрактал" происходит от лат. fractus — дробный и frangere — ломать, что отражает суть фрактала, как "изломанного", нерегулярного множества. Мандельброт дал строгое математическое определение фрактала как множества, хаусдорфова размерность которого строго больше топологической размерности. Он, однако, так и не был удовлетворен этим определением, т. к. оно не включает в себя некоторые множества, рассматриваемые многими математиками, как фракталы. Фрактал — математическое множество, обладающее свойством самоподобия, т. е. однородности в различных шкалах измерения (любая часть фрактала подобна всему множеству целиком). В математике под фракталами понимают множества точек в евклидовом пространстве, имеющие дробную метрическую размерность (в смысле Минковского или Хаусдорфа), либо метрическую размерность, отличную от топологической, поэтому их следует отличать от прочих геометрических фигур, ограниченных конечным числом звеньев. Так, линия имеет размерность 1, круг — 2, а размерность фрактала находится между 1 и 2. Классический пример фрактала — множество Мандельброта, описываемое формулой Z n +1 = KZ n2 + 1 , где K = const . Существует большое число математических объектов, называемых фракталами (например, треугольник Серпинского, снежинка Коха, кривая Пеано, множество Мандельброта и лоренцевы аттракторы). Фракталы с большой точностью описывают многие физические явления и образования реального мира: горы, облака, турбулентные (вихревые) течения, корни, ветви и листья деревьев, кровеносные сосуды, далеко не соответствующие простым геометрическим фигурам. Самоподобные и самоаффинные фракталы строят простым и быстрым алгоритмом итераций отображений подобия. Среди изображений, построенных компьютером, встречаются естественно выглядящие картины растений и деревьев. Тип данных, определенный пользователем В примере, который описывает построение фракталов, мы используем тип данных, определенный пользователем. Сначала кратко рассмотрим теоретические основы. Тип данных, определенный пользователем, — это способ создания структурного типа (иногда программисты называют такой тип записью). Запись — это совокупность нескольких элементов, каждый из которых может иметь свой тип. Элемент записи называется полем. Запись является частным случаем класса, в котором не определены свойства и методы. Синтаксис типа данных, определенных пользователем: [Private | Public]Type ИмяПеременной ИмяЭлемента [(Индексы)] As Тип [ИмяЭлемента [(Индексы)] As Тип] ... End Type
Программирование объектов Shape 257 Здесь:  Public служит для описания определяемых пользователем типов данных, кото- рые доступны для всех процедур во всех модулях всех проектов;  Private служит для описания определяемых пользователем типов данных, кото- рые доступны только в модуле, в котором выполняется описание;  ИмяПеременной — имя типа данных, определяемого пользователем;  ИмяЭлемента — имя элемента, определяемого пользователем;  Индексы — размерности элемента, являющегося массивом. Для задания массива, размеры которого могут изменяться, указываются только скобки. Этот аргумент имеет следующий синтаксис: [Нижний То] Верхний [ , [Нижний То] Верхний]  Тип — тип данных элемента. Поддерживаются типы: Byte, Boolean, Integer, Decimal, Long, LongLong, LongPtr, Currency, Single, Double, Date, String (для строк переменной длины), String*длина (для строк фиксированной длины), Object, Variant, а также другой, определяемый пользователем, тип или объектный тип. Фракталы из треугольников В приведенном далее примере фракталы построены с помощью рекурсивных (вызывающих сами себя) процедур, которые можно создать в VBA Function и Sub. 1. Создайте новый файл Microsoft Excel 2019. Добавьте к рабочей книге пустой рабочий лист, на котором будет отрисована фрактальная графика. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1 (Insert | Module (Вставить | Модуль)). В листинге 7.19 приведен код программы, использующей пользовательский тип данных Private Type Точка x As Long y As Long End Type. Процедура Фигура(x, y, Size, n) является рекурсивной. На рис. 7.17 показаны фракталы из треугольников. Листинг 7.19. Пример построения фракталов Private Pi As Double 'Описано число Пи Private Type Точка x As Long y As Long End Type 'Описан пользовательский тип данных Sub Фигура (x, y, Size, n) Dim pТочка (1 To 10) As Точка
258 Глава 7 а б Рис. 7.17. (Часть 1 из 2) Фракталы из треугольников: а — один; б — один и один из вершины
Программирование объектов Shape 259 в г Рис. 7.17. (Часть 2 из 2) Фракталы из треугольников: в — один и три из вершины; г — вариант Size = 1000
260 Глава 7 'Пользовательский тип описывает массив x и y для многоугольников 'от 1 до 10 Dim i As Integer If Size < 60 Then Exit Sub For i = 0 To n - 1 With pТочка (i + 1) .x = x + Size * Cos(2 * Pi * i / n - Pi / 2) .y = y + Size * Sin(2 * Pi * i / n - Pi / 2) End With Next i For i = 1 To n With pТочка((i + 1) Mod n + 1) ActiveSheet.Shapes.AddLine(.x, .y, pТочка(i).x, _ pТочка(i).y).Select 'Рисование отрезка End With Next i For i = 1 To n With pТочка (i) Фигура .x, .y, Size / 2.5, n End With Next i 'Уменьшение размера многоугольника End Sub Private Sub Фрактал() Pi = Application.WorksheetFunction.Pi() Фигура 200, 200, 100, 3 'Если вместо 3 поставить 5, 6, ..., 9, 'то будут созданы соответственно 5-, 6-, ..., 9-угольники End Sub 2. Для запуска макроса, создающего фрактал, установите текстовый курсор в прона панели инструментов цедуру Фрактал() и нажмите на кнопку запуска Standard (Стандартная). 3. Перейдите в Microsoft Excel из редактора VBA при помощи нажатия кнопки View Microsoft Excel (Переход в Microsoft Excel) . Убедитесь, что фрактал нарисован. Для удобства восприятия рисунка можно отключить сетку, сняв одноименный флажок Сетка, расположенный на вкладке Вид в группе Отображение. 4. Сохраните созданные документы с фигурами в виде фракталов под именами соответственно Листинг_7.19_Фрактал_3.xlsm, Листинг_7.19_Фрактал_3_1.xlsm и Листинг_7.19_Фрактал_3_2.xlsm.
Программирование объектов Shape 261 Фракталы из многоугольников 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1, однако работайте на базе предыдущего примера. Если в процедуре Фигура (x, y, Size, n) переменной n задать значения 5, 6, ..., 9, то будут созданы соответственно 5-, 6-, ..., 9-угольники, причем их количество зависит от размера Size и от условия Size<const. 2. На рис. 7.18 показаны фракталы из разных многоугольников. Эти фракталы состоят из отрезков, принадлежащих окружности, и их координаты вычисляются через синус Sin(2 * Pi * i / n - Pi / 2) и косинус Cos(2 * Pi * i / n - Pi / 2). Для удобства восприятия рисунков изменяйте масштаб отображения рабочего листа и регулируйте видимость сетки. Разнообразные фракталы типа изображенных на рис. 7.17 и 7.18 вы можете найти в дополнительных листингах главы 7: Листинг_7.19_Фрактал_3_3.xlsm, Листинг_7.19_ Фрактал_5.xlsm, Листинг_7.19_Фрактал_5_1.xlsm, Листинг_7.19_Фрактал_5_2.xlsm, Листинг_7.19_Фрактал_6.xlsm, Листинг_7.19_Фрактал_9.xlsm. а б Рис. 7.18. (Часть 1 из 3) Фракталы из многоугольников: а — одна звезда; б — одна звезда и одна из вершины
262 Глава 7 в г Рис. 7.18. (Часть 2 из 3) Фракталы из многоугольников: в — много звезд; г — шестиугольники
Программирование объектов Shape 263 д Рис. 7.18. (Часть 3 из 3) Фракталы из многоугольников: д — девятиугольники Фракталы из четырехугольников У четырехугольника концы отрезков соединяются, вместо квадратов появляются простые линии и поэтому для создания фракталов предлагается другая программа. 1. Создайте новый файл Microsoft Excel 2019. Добавьте к рабочей книге пустой рабочий лист, на котором будет отрисована фрактальная графика. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1 (Insert | Module (Вставить | Модуль)). Не забудьте использовать в начале окна кода оператор Option Explicit. В листинге 7.20 приведен код программы, выполняющей построение вложенных четырехугольников, а на рис. 7.19, а показаны фракталы из разных четырехугольников.
264 Глава 7 а б Рис. 7.19. Фракталы из четырехугольников: а — вложенные четырехугольники; б — структура из четырехугольников
Программирование объектов Shape 265 Листинг 7.20. Построение вложенных четырехугольников Sub Квадрат(x, y, Размер) If Размер < 80 Then Exit Sub ActiveSheet.Shapes.AddLine(x, y, x, y + Размер).Select ActiveSheet.Shapes.AddLine(x, y + Размер, x + Размер, _ y + Размер).Select ActiveSheet.Shapes.AddLine(x + Размер, y + Размер, _ x + Размер, y).Select ActiveSheet.Shapes.AddLine(x + Размер, y, x, y).Select End Sub Sub Рисуем() For i = 0 To 25 Квадрат 300 - 10 * i, 300 - 10 * i, 100 + 20 * i Next i End Sub 2. Для запуска макроса, создающего фрактал, установите текстовый курсор в прона панели инструментов цедуру Рисуем() и нажмите на кнопку запуска Standard (Стандартная). 3. Перейдите в Microsoft Excel из редактора VBA при помощи нажатия кнопки View Microsoft Excel (Переход в Microsoft Excel) . Убедитесь, что фрактал нарисован. Для удобства восприятия рисунка можно отключить сетку, сняв одноименный флажок Сетка, расположенный на вкладке Вид в группе Отображение. 4. Сохраните созданный документ с фигурой под именем Листинг_7.20_Квадрат.xlsm. Еще одна структура из четырехугольников, код программы которой приведен в листинге 7.21, показана на рис. 7.19, б. Здесь опять использована рекурсивная процедура. Листинг 7.21. Построение структуры из четырехугольников Sub Квадрат (x, y, Размер) If Размер < 20 Then Exit Sub ActiveSheet.Shapes.AddLine(x, y, x, y + Размер).Select ActiveSheet.Shapes.AddLine(x, y + Размер, x + Размер, _ y + Размер).Select ActiveSheet.Shapes.AddLine(x + Размер, y + Размер, _ x + Размер, y).Select ActiveSheet.Shapes.AddLine(x + Размер, y, x, y).Select Квадрат x - Размер / 2, y - Размер / 2, Размер / 2 Квадрат x + Размер, y - Размер / 2, Размер / 2
266 Глава 7 Квадрат x - Размер / 2, y + Размер / 2, Размер / 2 Квадрат x + Размер / 2, y + Размер / 2, Размер / 2 End Sub Sub Рисуем() Квадрат 1000, 1000, 800 End Sub 5. Сохраните созданный документ с фигурой под именем Листинг_7.21_Фрактал_4.xlsm.
ГЛАВА 8 Работа с ячейками и областями Уже пройдена почти половина учебного материала, рассмотрено множество серьезных понятий, выполнена масса интересных упражнений, и вдруг опять переход к элементарной работе с ячейками и областями. В чем дело? Это задумано специально, чтобы читатель книги с самого начала почувствовал мощь языка VBA, а теперь смог остановиться и отдохнуть, понимая, что с помощью VBA можно решить очень много полезных задач. Объект Application Мы уже не раз отмечали, что объект Application — это основной объект Microsoft Excel, представляющий само приложение Microsoft Excel (см. рис. В1). Пришло время систематизировать наши знания об этом объекте. Объект Application имеет множество свойств и методов, позволяющих установить общие параметры приложения Excel. Свойства объекта Application Рассмотрим основные свойства объекта Application:  ActiveWorkbook — возвращает активную рабочую книгу;  ActiveSheet — возвращает активный рабочий лист, содержится в ActiveWorkbook;  ActiveCell — возвращает объект Range, представляющий собой активную рабочую ячейку;  ActiveChart — возвращает объект типа Chart, представляющий собой активную диаграмму;  ThisWorkbook — возвращает объект типа Workbook в виде рабочей книги, в которой выполняется текущий макрос;  Calculation — устанавливает режим вычислений. Допустимые значения: • xlCalculationAutomatic — Excel управляет пересчетом; • xlCalculationManual — вычисления выполняются при запросе пользователя;
268 Глава 8 • xlCalculationSemiautomatic — Excel выполняет пересчет, но игнорирует изменения в таблицах;  Caption — возвращает или устанавливает значение типа String в виде текста, отображаемого в строке заголовка главного окна Microsoft Excel. Если это свойство равно Empty (Application.Caption.Empty), то команда возвращает окну имя, установленное по умолчанию, т. е. Microsoft Excel;  Cursor — возвращает или устанавливает вид указателя мыши в Microsoft Excel;  DisplayFormulaBar — регулирует отображение строки формул;  DisplayScrollBars — регулирует отображение полос прокрутки;  DisplayStatusBar — регулирует отображение строки состояния;  EnableCancelKey — определяет действие компьютера по нажатию комбинации клавиш, используемому для прерывания выполнения процедуры. Допустимые значения: • xlDisabled — запрет прерывания процедуры; • xlInterrupt — разрешение прерывания процедуры; • xlErrorHandler — прерывание воспринимается как ошибка;  Width, Height — возвращают или устанавливают значения типа Double, представ- ляющие собой ширину и высоту окна приложения в пунктах;  Left, Top — устанавливают расстояние в пунктах от левой/верхней границы экрана до левой/верхней границы главного окна Microsoft Excel;  Path — возвращает путь к файлу приложения за исключением последнего разде- лителя и имени приложения;  StatusBar — возвращает или устанавливает текст, выводимый в строке состоя- ния;  Version — возвращает номер текущей версии Microsoft Excel;  Windows — возвращает семейство всех окон во всех рабочих книгах;  WindowState — возвращает или устанавливает состояние окна. Допустимые зна- чения: • xlMaximized — окно максимизировано; • xlMinimized — окно минимизировано; • xlNormal — обычное окно. Методы объекта Application Перечислим основные методы объекта Application:  Calculate — вызывает принудительное вычисление во всех открытых рабочих книгах или в обозначенном рабочем листе рабочей книги, или диапазоне ячеек;  CentimetersToPoints — преобразует измерения из сантиметров в пункты;
Работа с ячейками и областями 269  ConvertFormula — преобразует формульные ссылки на ячейки между стилями А1 и R1C1, между относительными и абсолютными ссылками или выполняет оба этих преобразования;  Goto — выбирает любой диапазон либо процедуру VBA в любой рабочей книге;  Help — отображает файл справки. Правда, когда мы запустили макрос с одной строчкой Application.Help, то получили ответ, что компьютер не подключен к Интернету;  Volatile — вызывает перевычисление функции пользователя при изменениях в ячейках рабочего листа;  OnTime — назначает выполнение указанной процедуры на определенное время;  Quit — закрывает приложение Microsoft Excel;  Wait — приостанавливает работу приложения без остановки работы других про- грамм до указанного момента времени. Возвращает значение True, если обозначенный момент времени наступил. Объект Range Итак, объект Application — это самый главный объект Microsoft Excel, представляющий само приложение Microsoft Excel. Далее следуют объекты Workbook (Рабочая книга — ваш файл) и Worksheet (Рабочий лист). Пришла очередь подробного рассмотрения таких объектов, как Range (Диапазон) и Cell (Ячейка). Адресация ячеек Каждый рабочий лист Worksheet состоит из ячеек, образующих своего рода сетку (эта сетка на печать не выводится). Ячейка рабочего листа Cell образуется пересечением строки и столбца, а ее адрес определяется буквой столбца и номером строки. Так, например, ячейка F3 находится на пересечении столбца F и строки номер 3. Номера строк проставлены в заголовках строк. Столбцы обозначены буквами латинского алфавита, начиная с А (A, B, C, D, ..., Z, AA, AB, ..., AZ, BA, BB, ..., IV, ...). При работе с такими объектами, как Range (Диапазон) и Cell (Ячейка), следует помнить, что в Excel имеются три способа ссылки (адресации) на ячейки рабочего листа: относительная (например, А1 или G15), абсолютная (например, $А$1), смешанная (например, $G15). Кроме того, имя ячейки может состоять из имени столбца и номера строки (например, Y8 или J10 — один стиль ссылок) или задаваться индексом строки и индексом столбца (например, R6C1 или R1C5 — другой стиль ссылок).  Абсолютный адрес ячейки — это просто ссылка на ячейку, которая не изменяет- ся при копировании содержащей ее формулы. Чтобы сделать адрес (ссылку) ячейки абсолютным, следует ввести знак доллара ($) перед его компонентами: буквой столбца и номером строки.
270 Глава 8  Относительный адрес ячейки — это ссылка на ячейку, которая подстраивается при копировании содержащей ее формулы в другое место. Например, если в ячейке содержится формула с относительной ссылкой на ячейку, при копировании формулы на одну строку вниз адрес ячейки в формуле изменится на одну строку.  В смешанном адресе (ссылке) ячейки только один из его компонентов абсолют- ный. Для того чтобы создать смешанную ссылку на ячейку, следует ввести знак доллара перед нужным компонентом ссылки. Так, в ячейке $A1 абсолютен только компонент столбца, а в ссылке A$1 — только компонент строки. П РИМЕЧАНИЕ Для того чтобы ввести знак доллара ($) в адрес ячейки, следует нажать клавишу <F4>. При этом курсор должен стоять в строке формул на адресе ячейки. В формате R1C1 — вспомните термины Row (Строка) и Column (Столбец) — указывается смещение по отношению к активной ячейке. Смещение приводится в квадратных скобках, причем знак указывает направление смещения. Например, если активной ячейкой является R6C8, то R[−1]C[1] дает ссылку на ячейку R5C9. Адресация ячейки рабочего листа является лишь частью полного адреса, который включает адрес книги и имя рабочего листа. При задании полного адреса за именем листа следует знак !, а адрес книги заключается в скобки, например: ='[Листинг 8.4_формулы.xlsm]Лист1'!$C$4 Здесь указан адрес ячейки $C$4, находящейся на листе Лист1, файла Листинг 8.4_ формулы.xlsm. Свойства объекта Range Перечислим основные свойства объекта Range:  Value — возвращает или устанавливает значение в ячейках диапазона, например Range("A1:А6").Value =500;  Name — возвращает или устанавливает имя диапазона, например Range("A1:А6"). Name ="Урожай";  CurrentRegion — возвращает текущий диапазон, т. е. область, ограниченную пустыми строками и столбцами. Например, переменная x = Range("A7"). CurrentRegion.Value.Row.Count вычисляет значение, равное числу строк в текущем диапазоне, содержащем ячейку А7;  WrapText — логическое свойство, разрешающее/запрещающее перенос текста по словам в ячейках диапазона;  EntireColumn, EntireRow — возвращают объекты типа Range, столбец (-цы) и строку (-и), которые содержатся в обозначенном диапазоне;  Columns, Rows — возвращают объекты типа Range, представляющие собой столб- цы и строки, из которых состоит диапазон;
Работа с ячейками и областями 271  ColumnWidth — возвращают или устанавливают ширину всех столбцов, из кото- рых состоит диапазон;  Width, Height — возвращают или устанавливают ширину и высоту диапазона;  Hidden — возвращает или устанавливает значение типа Variant, которое показы- вает, являются ли строки или столбцы скрытыми;  Comment — возвращает объект Comment, который при отображении на экране свя- зан с ячейкой в левом верхнем углу диапазона;  Interior — возвращает объект Interior, представляющий собой фон ячейки;  Font — возвращает объект Font, представляющий собой шрифт;  Orientation — возвращает или устанавливает значение типа Variant, задает направление текста. Допускается угол поворота текста в градусах от –90 до 90 либо одна из следующих констант: • xlDownward — текст располагается сверху вниз; • xlHorizontal — расположение текста по горизонтали; • xlUpward — текст располагается снизу вверх; • xlVertical — текст располагается сверху вниз и выравнивается в ячейке по центру;  Top — возвращает значение типа Variant, представляющее собой расстояние в пунктах от верхнего края первой строки до верхнего края диапазона;  Left — возвращает значение типа Variant, представляющее собой расстояние в пунктах от левого края столбца A до левого края диапазона;  Areas — возвращает семейство Areas, представляющее собой все диапазоны, входящие в выделение множества областей;  End — возвращает объект Range, представляющий собой ячейку в конце области, содержащей диапазон-источник;  Address — возвращает значение типа String, представляющее собой адрес диа- пазона. Методы объекта Range Перечислим основные методы объекта Range:  AutoFit — автоматически подбирает ширину столбца или высоту строки так, чтобы в ячейке помещались введенные данные;  Clear — очищает диапазон ячеек от значений, формул и форматирования;  ClearComments, ClearContents, ClearFormats и ClearNotes — очищают во всех ячейках обозначенного диапазона комментарии, формулы, форматирование и заметки, в том числе звуковые;  Copy — копирует диапазон в другой диапазон или в буфер обмена;
272 Глава 8  Cut — вырезает объект в буфер обмена или вставляет его в указанный диапазон;  Delete — удаляет диапазон;  Insert — вставляет ячейку или диапазон ячеек со сдвигом других ячеек;  Select — выделяет диапазон;  PasteSpecial — специальная вставка из буфера обмена в указанный диапазон;  DataSeries — создает последовательности с данными в указанном диапазоне;  AutoFill — выполняет автозаполнение для ячеек указанного диапазона элемен- тами последовательности. Объект Selection Объект Selection возникает в VBA двумя способами: либо как результат работы метода Select, либо при вызове свойства Selection. Тип получаемого объекта зависит от типа выделенного объекта. Чаще всего объект Selection принадлежит классу, и при работе с ним можно использовать свойства и методы объекта Range. Интересная особенность объектов Selection состоит в том, что они не являются элементами какого бы то ни было семейства объектов. Объект Cell Ячейка — частный случай диапазона, состоящего из одной-единственной ячейки. Ячейку А5 можно описать двумя равносильными способами: Range("A5") и Cells(1,5). Выделение нескольких областей Рассмотрим пример с использованием метода Range.Select. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. Напишите программу, в которой выделяется несколько областей (листинг 8.1). Не забудьте указать в начале окна кода оператор Option Explicit. Листинг 8.1. Пример выделения нескольких областей Public Sub Выделение_нескольких_областей() Dim S1 As Range, S2 As Range Dim S3 As Range, S4 As Range Dim SS As Range With Лист1 Set S1 = . Range("A1:A3") Set S2 = . Range("C1:C3")
Работа с ячейками и областями 273 Set S3 = . Range("E1:E3") Set S4 = . Range("G1:G3") Set SS = Union(S1, S2, S3, S4) SS.Select End With End Sub 3. Убедитесь, что курсор находится на одной из строк введенного кода. Восполь. зуйтесь для запуска процедуры кнопкой После запуска макроса, действительно, несколько областей оказались выделенными в результате использования метода Union, предназначенного для объединения двух и более диапазонов ячеек (рис. 8.1). Рис. 8.1. Пример выделения нескольких областей 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_8.1_Выделение_областей.xlsm. Для этого выберите команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла укажите вариант сохранения файла Книга Excel с поддержкой макросов. Э ЛЕКТРОННЫЙ АРХИВ Листинг 8.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_8_Работа_с ячейками_и_областями сопровождающего книгу электронного архива. Выделение последней ячейки в диапазоне Рассмотрим пример с использованием свойства Range.Address объекта Range. Его синтаксис: Range.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo)
274 Глава 8 Здесь:  RowAbsolute — необязательный логический параметр. Если значение параметра равно True или он опущен, то возвращается абсолютная ссылка на строку;  ColumnAbsolute — необязательный логический параметр. Если значение пара- метра равно True или он опущен, то возвращается абсолютная ссылка на столбец;  ReferenceStyle — необязательный параметр, задающий стиль ссылок. Допусти- мы два значения: xlA1 и xlR1C1. Если значение равно xlА1 или опущено, то возвращается ссылка в формате А1;  External — необязательный логический параметр, задающий тип ссылки;  RelativeTo — необязательный параметр. Если RowAbsolute и ColumnAbsolute рав- ны False, а ReferenceStyle — xlR1C1, необходимо установить начальную точку для относительной ссылки. Этот аргумент определяет начальную ячейку диапазона, относительно которой производится адресация. Выполните следующие действия. 1. Создайте новый файл Microsoft Excel 2019. На рабочем листе создайте диапазон данных, содержащий, например, текст, число, дату, время. Мы будем использовать диапазон данных A1:D8. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 3. Напишите программу, в которой выделяется последняя ячейка в диапазоне данных (листинг 8.2), в нашем примере это правая нижняя ячейка для прямоугольного выделения. Последняя ячейка в используемом диапазоне данных, заданная посредством константы xlCellTypeLastCell для метода Range.SpecialCells, выделяется при помощи метода Select, а затем ее адрес определяется через свойство Address. Листинг 8.2. Пример выделения последней ячейки с данными на рабочем листе Sub Последняя_ячейка_диапазона_данных() With Лист1 .Activate .Cells.SpecialCells(xlCellTypeLastCell).Select End With MsgBox "Последняя ячейка диапазона данных " & _ ActiveCell.Address, vbInformation End Sub 4. Убедитесь, что курсор находится на одной из строк введенного кода. Для запус. ка макроса нажмите кнопку После запуска макроса, действительно, оказалась выделенной последняя ячейка в диапазоне, даже если она не содержит никакого значения (рис. 8.2), при этом диапазон определен как прямоугольная табличная форма.
Работа с ячейками и областями 275 Рис. 8.2. Пример выделения последней ячейки диапазона данных 5. Сохраните документ с поддержкой макросов под именем Листинг_8.2_ Последняя_ячейка_диапазона_данных.xlsm. Свойство Range.End Рассмотрим пример с использованием свойства Range.End для нахождения ячейки, означающей конец области данных, содержащий диапазон-источник. 1. Создайте новый файл Microsoft Excel 2019. Нам понадобится таблица с заполненными числовыми данными, к примеру для столбцов A:I, для первых пяти строк. Также отступите на строку вниз и в строке 7 введите другие числовые данные. Таким образом, у нас будут два рабочих диапазона — A1:I5 и A7:I7. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 3. Напишите программу, в которой выделяется последняя ячейка столбца B по направлению вниз от указанного диапазона-источника (ячейки B1), при этом B1 должна входить в определяемый диапазон данных (листинг 8.3). Листинг 8.3. Пример выделения последней ячейки в определяемом диапазоне Sub Выделение_последней_ячейки_в_определяемом_диапазоне() With Лист1 .Activate .Range("B1").End(xlDown).Select 'Выделение последней ячейки по направлению вниз, 'для области данных, содержащей ячейку B1 End With MsgBox "Адрес ячейки: " & ActiveCell.Address, vbInformation End Sub
276 Глава 8 4. Убедитесь, что курсор находится на одной из строк введенного кода. Для запуска макроса нажмите клавишу <F5>. Последняя ячейка диапазона данных, содержащего ячейку B1 по направлению сверху вниз, — $B$5 (рис. 8.3). 5. Сохраните документ с поддержкой макросов под именем Листинг_8.3_Последняя_ ячейка_в_определяемом_диапазоне.xlsm. Рис. 8.3. Пример выделения последней ячейки в столбце B, для диапазона данных, содержащего B1 Выделение ячеек с формулами Рассмотрим выделение всех ячеек, содержащих формулы на указанном рабочем листе Лист1, и применим к выделению полужирное начертание шрифта. 1. Создайте новый файл Microsoft Excel 2019 и введите данные в соответствии с рис. 8.4, а. Данные для значений Остаток рассчитываются как Доход – Расход. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 3. Напишите программу, в которой выделяются полужирным значения для найденных ячеек, содержащих формулы (листинг 8.4, а). Для определения таких ячеек используется константа xlCellTypeFormulas метода SpecialCells. В методе возвращается объект типа Range, представляющий собой все формульные ячейки. Листинг 8.4, а. Пример выделения ячеек с формулами Sub Найти_ячейки_с_формулами() On Error GoTo M With Лист1 .Activate
Работа с ячейками и областями 277 .Cells.SpecialCells(xlCellTypeFormulas).Select Selection.Font.Bold = True End With Exit Sub M: MsgBox Err End Sub 4. Воспользуйтесь для запуска макроса кнопкой . После запуска макроса, действительно, оказались выделенными ячейки с формулами (рис. 8.4). 5. Сохраните документ с поддержкой макросов под именем Листинг_8.4_Выделение_ ячеек_с_формулами.xlsm. а б Рис. 8.4. Поиск ячеек с формулами: а — исходные данные; б — результат работы программы
278 Глава 8 Выделение используемого диапазона данных Создайте в предыдущей рабочей книге еще один модуль Module2. Добавьте еще одну возможность и выделите рабочий диапазон для всего рабочего листа при помощи свойства Worksheet.UsedRange, показанную на рис. 8.4, б (листинг 8.4, б). Листинг 8.4, б. Пример выделения рабочего диапазона Sub Используемый_диапазон() With Лист1 .Activate .UsedRange.Select End With End Sub Запустите макрос Используемый_диапазон() на исполнение — будет выделен один диапазон данных A2:H8. Если на рабочем листе используется несколько диапазонов данных, то для выделения диапазона ячеек из конкретной области с помощью свойства Range. CurrentRegion необходимо указать хотя бы одну ячейку из рабочей области и в коде вместо .UsedRange.Select написать .Range("A2").CurrentRegion.Select. Сохраните рабочую книгу под тем же именем с помощью команды Файл | Сохранить. Форматирование объединенных ячеек Рассмотрим пример форматирования объединенных ячеек при помощи свойства Interior объекта Range. Свойство Range.Interior возвращает объект Interior, представляющий собой фон ячейки. Объект Interior имеет свойство ColorIndex. В главе 2 уже было подробно описано это свойство. Если значение свойства равно xlColorIndexNone, то ячейка не окрашивается. 1. Создайте новый файл Microsoft Excel 2019 и введите данные в соответствии с рис. 8.5: в ячейки с А1 по L1 введите названия месяцев с января по декабрь, а ниже — соответствующие кварталы. 2. Объедините ячейки А1:С1, D1:F1, G1:I1, J1:L1. Для этого выделите их, нажмите на выделении правой кнопкой мыши и выберите команду Формат ячеек. В открывшемся диалоговом окне перейдите на вкладку Выравнивание и в области Отображение установите флажок объединение ячеек. 3. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 4. Напишите программу, в которой выделяются зеленым цветом объединенные ячейки (листинг 8.5). Используемый диапазон рабочего листа проверяется на
Работа с ячейками и областями 279 наличие объединенных ячеек при помощи свойства Range.MergeCells. Если его значение True (Истина), то для таких ячеек устанавливается заданный цвет фона. Листинг 8.5. Цвет фона объединенных ячеек Sub Изменить_фон() Dim S As Range For Each S In Лист1.UsedRange If S.MergeCells=True Then S.Interior.ColorIndex =4 Else S.Interior.ColorIndex = xlColorIndexNone End If Next S End Sub 5. Убедитесь, что курсор находится на одной из строк введенного кода. Восполь. зуйтесь для запуска макроса кнопкой 6. После запуска макроса, действительно, оказались выделенными объединенные ячейки (см. рис. 8.5). 7. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_8.5_Цвет_фона_для_ячеек.xlsm. Рис. 8.5. Пример выделения объединенных ячеек Выделение по условию Часто требуется из множества чисел выбрать значения по условию, например, большие либо равные 100. Рассмотрим пример на выбор значений. 1. Создайте новый файл Microsoft Excel 2019 и введите числовые данные в соответствии с рис. 8.6. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту (Insert | Module (Вставить | Модуль)).
280 Глава 8 3. Напишите программу, в которой ячейки, содержащие значения больше либо равно 100, закрашиваются голубым цветом (листинг 8.6). Листинг 8.6. Пример выделения по условию Sub Поиск_по_условию() Dim S As Range Dim SSS As Range Set SSS = Лист1.Range("A1:L3") For Each S In SSS If S.Value >= 100 Then S.Interior.ColorIndex = 17 Else S.Interior.ColorIndex = xlColorIndexNone End If Next S End Sub 4. Для выполнения процедуры воспользуйтесь командой Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). После запуска макроса, действительно, оказались выделенными ячейки, значения в которых больше либо равны 100 (рис. 8.6). 5. Сохраните документ с поддержкой макросов под именем Листинг_8.6_ По_условию.xlsm. Рис. 8.6. Пример выделения по условию Удаление символов из ячеек Пусть в рабочей книге имеются ячейки с данными, содержащими черточки, точки и нули (- . 0). Требуется из множества таких данных убрать эти лишние символы. 1. Создайте новый файл Microsoft Excel 2019 и введите данные в соответствии с рис. 8.7, а. Обратите внимание, что все данные — цифровые.
Работа с ячейками и областями 281 2. Перейдите в среду VBA (нажав клавиши <Alt>+<F11>) и добавьте к проекту модуль с помощью команды Insert | Module (Вставить | Модуль). 3. Напишите программу, в которой из множества данных убираются черточки, точки и нули (листинг 8.7). В этой программе используется функция Mid, которая считывает из строки заданное количество символов, начиная с заданной позиции, и возвращает строку, состоящую из считанных символов. В данном случае из строки каждый раз считывается один символ, т. е. фактически осуществляется посимвольный просмотр строки. а б Рис. 8.7. Удаление заданных символов: а — исходные данные; б — результат выполнения макроса Листинг 8.7. Пример удаления заданных символов Sub Убираем_лишнее() Dim S As Range Dim I As Integer Dim Stroka As String For Each S In Selection For I = 1 To Len(S) Select Case Mid(S, I, 1) Case 0, ".", "-" Case Else Stroka = Stroka & Mid(S, I, 1) End Select Next I
282 Глава 8 S.Value = Stroka Stroka = "" Next S End Sub 4. Убедитесь, что курсор находится на одной из строк введенного кода. Для запуска макроса нажмите клавишу <F5> — не забудьте предварительно выделить ячейки, поскольку макрос воздействует именно на выделенные ячейки. После запуска макроса указанные символы были удалены из ячеек (рис. 8.7, б). 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_8.7_Убрать символ_из_ячейки.xlsm. Убираем текст Немного изменим предыдущий пример — пусть в рабочей книге имеются данные, содержащие цифры и текст, и нам требуется убрать текст, оставив цифры. 1. Создайте новый файл Microsoft Excel 2019 и введите данные в соответствии с рис. 8.8, а. Обратите внимание, что данные состоят из цифр и текста. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту (Insert | Module (Вставить | Модуль)). 3. Напишите программу, в которой из данных убирается текст (листинг 8.8). Листинг 8.8. Пример удаления текста Sub Убираем_текст() Dim S As Range Dim I As Integer Dim Stroka As String For Each S In Selection For I = 1 To Len(S) Select Case Mid(S, I, 1) Case 0 To 9 Stroka = Stroka & Mid(S, I, 1) Case Else End Select Next I S.Offset(0, 1).Value = Stroka Stroka = "" Next S End Sub 4. Для запуска макроса нажмите кнопку — не забудьте предварительно выделить ячейки, поскольку макрос воздействует именно на выделенные ячейки.
Работа с ячейками и областями 283 а б Рис. 8.8. Удаление текстовых символов из ячеек: а — исходные данные; б — результат удаления После запуска макроса в соседнем столбце записывается результат, где текстовые данные удалены (рис. 8.8, б). 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_8.8_Лишний_текст.xlsm. Имена и фамилии Вот еще один пример на разделение информации в ячейке. Здесь используется свойство Range.Offset, которое возвращает объект типа Range, диапазон ячеек, смещенный относительно заданного на величины, обозначенные в аргументах. Его синтаксис: Range.Offset(RowOffset, ColumnOffset) Здесь:  RowOffset — целое число, указывающее сдвиг по строкам;  ColumnOffset — целое число, указывающее сдвиг по столбцам.
284 Глава 8 Пусть в рабочей книге в столбце зафиксированы фамилии и имена — разделите фамилии и имена, поместив их в отдельные столбцы. 1. Создайте новый файл Microsoft Excel 2019 и введите данные (фамилии и имена) в соответствии с рис. 8.9. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту (Insert | Module (Вставить | Модуль)). 3. Напишите программу, в которой разделяются фамилии и имена (листинг 8.9). Листинг 8.9. Пример разделения фамилий и имен Sub Фамилия_имя() Dim S As Range For Each S In Selection S.Offset(0, 1).Value = Mid(S.Value, InStr(S.Value, " ") + 1) S.Offset(0, 2).Value = Left(S.Value, InStr(S.Value, " ") - 1) Next S End Sub Рис. 8.9. Пример разделения фамилий и имен 4. Убедитесь, что курсор находится на одной из строк введенного кода. Для выполнения процедуры нажмите клавишу <F5> — не забудьте предварительно выделить ячейки, поскольку макрос воздействует именно на выделенные ячейки. После запуска макроса все фамилии и имена были разделены (рис. 8.9). 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_8.9_Фамилия_имя.xlsm. Метод Delete В ячейки можно не только вводить текст, но и удалять его (метод Delete), да еще и не просто в ячейках, а в ячейках со сдвигом вправо, влево, вниз и вверх.
Работа с ячейками и областями 285 1. Создайте новый файл Microsoft Excel 2019. Заполните рабочий лист информацией, а потом начните ее стирать в конкретных ячейках. 2. Перейдите в среду VBA (<Alt>+<F11>), создайте модуль и напишите макрос (листинг 8.10). Листинг 8.10. Пример удаления информации со сдвигом Sub Удалить_ячейки() Range("A3").Delete xlShiftUp Range("A4").Delete xlShiftToLeft End Sub Происходит не просто удаление информации в ячейках, при помощи констант xlShiftUp и xlShiftToLeft заданы сдвиги, чтобы поставить на место удаленных ячеек указанные ячейки. Так, содержимое ячейки А3 удалено, на ее место сдвигается содержимое ячейки A4. Затем в ячейку А4 переносится значение ячейки B4. 3. Воспользуйтесь для запуска макроса кнопкой . 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_8.10_Удаление_ячеек.xlsm. Метод Clear Стирать информацию можно с помощью не только метода Delete, но и Clear. 1. Создайте новый файл Microsoft Excel 2019. Заполните рабочий лист информацией, а потом начните ее очищать в конкретных ячейках. 2. Перейдите в среду VBA (<Alt>+<F11>), создайте модуль и напишите макрос (листинг 8.11). Листинг 8.11. Пример стирания информации Sub Очистить_форматирование_и_значение() Range("B9").Clear End Sub 3. Воспользуйтесь для запуска макроса кнопкой . Так как при ссылке на диапазон ячеек используется простая запись Range(...) без указания рабочего листа, то для корректной работы макроса активным должен быть рабочий лист с имеющимися данными в требуемом диапазоне. 4. Сохраните документ с поддержкой макросов под именем Листинг_8.11_Очистка_ ячеек.xlsm.
286 Глава 8 Метод Application.Goto В листинге 8.12 приведен код программы, показывающей переход с использованием метода Application.Goto к определенному листу и к заданному диапазону ячеек с их выделением. Листинг 8.12. Пример использования метода Application.Goto Sub Переход_к_области() Application.Goto Worksheets(1).Range("B7:C9") End Sub Самостоятельно проверьте работу макроса этого примера. Скрытие данных Воспользуемся одним из свойств объекта Range — Range.Hidden для скрытия необходимых данных из таблицы. 1. Создайте новый файл Microsoft Excel 2019. Создадим таблицу с данными либо воспользуемся готовой таблицей из файла Microsoft Excel PersonalMonthlyBudget1.xls, который можно выбрать из имеющихся файлов при нажатии кнопки Создать (Личный бюджет на месяц). 2. Так как этот файл сохранен в формате XLS, файл Microsoft Excel, пересохраните его как файл с поддержкой макросов. Перейдите в среду VBA (<Alt>+<F11>), создайте модуль и напишите макрос в соответствии с листингом 8.13. Листинг 8.13. Скрытие столбца таблицы Sub Переход_к_области() Worksheets("Sheet1").Columns("C").Hidden = True End Sub 3. Для запуска макроса нажмите кнопку . В результате работы макроса заданный столбец таблицы окажется скрытым. 4. Сохраните документ с поддержкой макросов под именем Листинг_8.13_Скрыть_ ячейки. Копирование и специальная вставка Теперь осуществим привычные действия пользователя — копирование и специальную вставку для ячеек указанного диапазона, используя методы VBA Range.Copy и Range.PasteSpecial.
Работа с ячейками и областями 287 1. Создайте новый файл Microsoft Excel 2019. Создадим таблицу с числовыми данными. Осуществим копирование таблицы и специальную вставку значений ячеек в новое место, указываемое пользователем. 2. Перейдите в среду VBA (<Alt>+<F11>), создайте модуль и напишите макрос (листинг 8.14). Листинг 8.14. Копирование диапазона и специальная вставка Public Sub Копирование_Специальная_вставка() Dim r As Range Dim s As Range Set r = Range("A1:B2") Set s = Worksheets(1).Range("A3:B4") r.Copy s.PasteSpecial End Sub 3. Для запуска макроса нажмите кнопку . В результате работы макроса заданный столбец таблицы окажется скрытым. 4. Сохраните документ с поддержкой макросов под именем Листинг_8.14_ Копирование_диапазона. Поиск минимума и максимума в диапазоне 1. Создайте новый файл Microsoft Excel 2019. Создадим таблицу с числовыми данными. Осуществим копирование таблицы и специальную вставку значений ячеек в новое место, указываемое пользователем. 2. Перейдите в среду VBA (<Alt>+<F11>), создайте модуль и напишите макрос (листинг 8.15). Листинг 8.15. Поиск минимума и максимума Public Sub MinMax() Dim r As Range Dim max, min As Single min = Cells(1, 1) max = Cells(1, 1) For Each r In Range("a1:c3") If r.Value > max Then max = r.Value End If If r.Value < min Then min = r.Value End If
288 Глава 8 Next r Cells(5, 1).Value = min Cells(5, 2).Value = max End Sub 3. Для запуска макроса нажмите кнопку . В результате работы макроса будет осуществлен поиск минимума и максимума. Эти значения будут помещены в ячейки A5 и B5 соответственно (рис. 8.10). 4. Сохраните документ с поддержкой макросов под именем Листинг_8.15_Поиск_ минимума_и_максимума. Рис. 8.10. Поиск минимаксных значений
ГЛАВА 9 Работа с данными Эта глава посвящена вопросам работы с данными. Мы рассмотрим примеры работы с массивами, сортировкой данных, с именованными диапазонами. Массив из трех элементов Напишем программу, в которой данные в таблице Microsoft Excel сравниваются с заданными значениями массива из трех элементов, расположенного в столбце A как вектор-столбец. Также имеется второй массив с числовыми значениями в диапазоне C1:G10. При сравнении элемента второго массива с элементами первого массива, при совпадении значений, происходит заливка цветом фона, в зависимости от того, с каким элементом из массива A1:A3 совпадает элемент массива G1:G10. 1. Создайте новый файл Microsoft Excel 2019. В диапазон ячеек A1:A3 введите числа, с которыми будут сравниваться элементы второй таблицы. В нашем случае, в А1 введите 2, в А2 — 5, а в А3 — 7 (рис. 9.1). Рис. 9.1. Сравнение значений в таблице со значениями в столбце и заливка цветом ячеек таблицы
290 Глава 9 2. На этом же листе заполните таблицу C1:G10 разными цифрами, но так, чтобы среди них обязательно были значения 2, 5 и 7. 3. Перейдите в среду VBA (нажав клавиши <Alt>+<F11>) и добавьте к проекту модуль с помощью команды Insert | Module (Вставить | Модуль). 4. Для создания процедуры выполните команду Insert | Procedure (Вставить | Процедура) — откроется диалоговое окно Add Procedure (Добавить процедуру). Назовите процедуру Сравнение_данных() — в ней значения в таблице сравниваются с тремя элементами столбца и в зависимости от результата сравнения ячейки закрашиваются соответствующими цветами (листинг 9.1). Не забывайте использовать в начале окна кода оператор Option Explicit. Листинг 9.1. Форматирование и подсчет количества ячеек при сравнении данных в таблице со значениями элементов массива из трех элементов Option Base 1 Sub Сравнение_данных() Dim arrNumbers(3) As Variant Dim i As Integer Dim c As Range Dim intRed As Integer 'Счетчик красных ячеек Dim intGreen As Integer 'Счетчик зеленых ячеек Dim intBlue As Integer 'Счетчик синих ячеек For i = 1 To 3 arrNumbers(i) = Cells(i, 1) Next i For Each c In Range("C1:G10") Select Case c Case arrNumbers(1) c.Interior.Color = vbGreen intGreen = intGreen + 1 Case arrNumbers(2) c.Interior.Color = vbBlue intBlue = intBlue + 1 Case arrNumbers(3) c.Interior.Color = vbRed intRed = intRed + 1 Case Else c.Interior.ColorIndex = -4142 End Select Next c MsgBox "Число цветных ячеек в таблице: " & Chr(10) & _ "зеленых - " & intGreen & Chr(10) & _ "синих - " & Chr(9) & intBlue & Chr(10) & _ "красных - " & intRed End Sub
Работа с данными 291 5. Для выполнения процедуры воспользуйтесь командой Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). Запустить макрос на выполнение можно также кнопкой или нажатием клавиши <F5>. В этом примере мы работали с массивом из трех элементов arrNumbers(3). Чтобы первый индекс массива был равен единице, в модуле определена инструкция Option Base 1. 6. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_9.1_Сравнение_данных.xlsm. Для этого выберите команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла укажите вариант сохранения файла Книга Excel с поддержкой макросов. Э ЛЕКТРОННЫЙ АРХИВ Листинг 9.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_9_Работа_с_данными сопровождающего книгу электронного архива. Динамический массив данных Напишем программу, в которой данные в таблице сравниваются с заданными значениями, расположенными в первой строке (с динамическим массивом arrNumber() с числом элементов, задаваемым переменной intCounter). 1. Создайте новый файл Microsoft Excel 2019. 2. На листе рабочей книги введите в ячейки информацию без заливки ячеек цветом (рис. 9.2). Рис. 9.2. Сравнение значений в строке со значениями в таблице и закрашивание ячеек
292 Глава 9 3. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 4. Создайте в модуле процедуру Сравнение_значений(). В процедуре описан динамический массив arrNumbers(). Для строки 1 используется метод End(xlToRight), определяющий, в каком столбце по направлению вправо находятся последние данные, так устанавливается размерность массива. Затем элементы массива сравниваются со значениями в таблице A3:E10, если значение ячейки из диапазона таблицы совпадает с одним из значений динамического массива, заданного в виде вектор-строки, то ячейка окрашивается в заданный цвет (листинг 9.2). П РИМЕЧАНИЕ Тип данных Variant — это "хамелеон", поскольку он зависит от содержимого. Если в переменной содержится число, то переменная типа Variant принимает соответствующий тип данных. Так, если содержимое переменной — число 5, она принимает тип Integer, если 1,2 — Single. Листинг 9.2. Пример сравнения значений в строке со значениями в таблице и закрашивание ячеек Option Base 1 Sub Сравнение_значений() Dim arrNumbers() As Variant Dim intCounter As Integer Dim i As Integer Dim c As Range intCounter = Rows(1).End(xlToRight).Column ReDim arrNumbers(intCounter) 'Оператор ReDim задает число элементов массива For i = 1 To intCounter arrNumbers(i) = Cells(1, i) Next i Range("A3:E10").Interior.ColorIndex = -4142 For i = LBound(arrNumbers) To UBound(arrNumbers) 'Функция LBound определяет нижнюю границу массива, UBound - верхнюю For Each c In Range("A3:E10") If c.Value = arrNumbers(i) Then c.Interior.ColorIndex = 20 End If Next c Next i End Sub 5. Для запуска макроса нажмите кнопку . Ячейки, значения которых совпали со значениями вектор-строки, оказались закрашенными указанным цветом.
Работа с данными 293 6. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_9.2_Расписание_уроков.xlsm. Сравнение областей на одном листе Если в двух предыдущих программах данные в таблице сравнивались с заданными значениями, расположенными в первом столбце или первой строке, то теперь напишем программу, проверяющую идентичность двух таблиц. Предположим, что одна таблица составлена верно, а другая — с орфографическими ошибками. Необходимо найти ячейки, содержащие ошибочные значения, и выделить их цветом. 1. Создайте новый файл Microsoft Excel 2019 и введите в ячейки информацию для первой и второй таблиц (рис. 9.3). 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). Создайте в модуле процедуру Сравнение_ областей()(листинг 9.3). 3. Для сравнения таблиц определим в коде VBA первую таблицу как образец для сравнения при помощи динамического массива arr().Число элементов массива задается значением intRange и определяется числом ячеек диапазона A2:D9. Доступ ко второй таблице осуществляется при помощи конструкции Range("F2:I9"). 4. Если значения ячеек из второго диапазона не совпадают ни с каким из значений массива, то к таким ячейкам применяется серая заливка цвета фона. Рис. 9.3. Сравнение таблицы 2 c таблицей 1 и закрашивание различающихся ячеек цветом Листинг 9.3. Пример сравнения областей значений в двух таблицах и заливка отличающихся ячеек второй таблицы Option Base 1 Sub Сравнение_областей() Dim arr() As Variant Dim intRange As Integer
294 Глава 9 Dim i As Integer Dim c As Range intRange = Range("A2:D9").Cells.Count ReDim arr(intRange) i = 1 For Each c In Range("A2:D9") arr(i) = c.Value i = i + 1 Next c Range("F2:I9").Interior.ColorIndex = -4142 i = 1 Do While i < intRange For Each c In Range("F2:I9") If c.Value <> arr(i) Then c.Interior.ColorIndex = 15 End If i = i + 1 Next c Loop End Sub 5. Убедитесь, что вы находитесь на листе с обозначенными таблицами. Запустите процедуру на исполнение. В этом примере мы работали с динамическим массивом arr() с числом элементов, определяемых переменной intRange. Нумерация элементов массива начинается с единицы из-за имеющейся в начале кода инструкции Option Base 1. 6. Сохраните документ с поддержкой макросов под именем Листинг_9.3_Расписание_ уроков_сравнение_таблиц.xlsm. Сравнение областей на разных листах Если в предыдущем примере проверялась идентичность двух таблиц, находящихся на одном листе, то теперь мы сравним две таблицы, находящиеся на разных листах. Предположим, что данные в двух таблицах немного различаются и необходимо найти эти отличия. 1. Создайте новый файл Microsoft Excel 2019. 2. На листах Лист1 и Лист2 рабочей книги в ячейки введите информацию для первой и второй таблиц (рис. 9.4, а). 3. В среде VBA в отдельном модуле создайте процедуру Сравнение_на_двух_ листах(). Переменным lngMaxR и intMaxC присваиваются наибольшие значения соответственно чисел строк и столбцов таблиц на двух листах. Затем в двойном цикле (по строкам от 1 до lngMaxR и по столбцам от 1 до intMaxC) значения в каждой ячейке одной таблицы сравниваются со значениями в каждой ячейке
Работа с данными 295 другой (листинг 9.4). В случае несовпадения значений ячейка на втором листе обводится красным овалом и к ней добавляется комментарий, содержащий значение из соответствующей ячейки первого листа. Листинг 9.4. Пример сравнения двух таблиц, находящихся на разных листах Sub Сравнение_на_двух_листах() Dim w1 As Worksheet, w2 As Worksheet Dim o1R As Object, o1C As Object Dim o2R As Object, o2C As Object Dim lngMaxR As Long, intMaxC As Integer Dim lngR As Long, intC As Integer Dim var1 As Variant, var2 As Variant Set Set Set Set Set Set w1 = Worksheets(1) w2 = Worksheets(2) o1R = w1.UsedRange.Rows o1C = w1.UsedRange.Columns o2R = w2.UsedRange.Rows o2C = w2.UsedRange.Columns Application.ScreenUpdating = False If o1R.Count > o2R.Count Then lngMaxR = o1R.Count Else lngMaxR = o2R.Count End If If o1C.Count > o2C.Count Then intMaxC = o1C.Count Else intMaxC = o2C.Count End If For intC = 1 To intMaxC For lngR = 1 To lngMaxR var1 = w1.Cells(lngR, intC) var2 = w2.Cells(lngR, intC) If var1 <> var2 Then With w2 With .Shapes.AddShape(msoShapeOval, _ .Cells(lngR, intC).Left, _ .Cells(lngR, intC).Top, _ .Cells(lngR, intC).Width, _ .Cells(lngR, intC).Height) .Fill.Visible = msoFalse .Line.ForeColor.SchemeColor = 10 End With
296 .Cells(lngR, intC).AddComment var1 End With End If Next lngR Next intC Application.ScreenUpdating = True Set w1 = Nothing Set w2 = Nothing Set o1R = Nothing Set o1C = Nothing Set o2R = Nothing Set o2C = Nothing End Sub Sub Исправить_и_выделить() Dim w2 As Worksheet Dim shp As Shape Dim c As Range Set w2 = Worksheets(2) Call Сравнение_на_двух_листах For Each c In w2.UsedRange.Cells With c If Not .Comment Is Nothing Then .Value = .Comment.Text .Comment.Delete End If End With Next c Set w2 = Nothing End Sub Sub Удалить_комментарии_и_обводку() Dim ws2 As Worksheet Dim shp As Shape Dim c As Range Set ws2 = Worksheets(2) For Each shp In ws2.Shapes If shp.Type = msoAutoShape Then shp.Delete End If Next shp For Each c In ws2.UsedRange.Cells If Not c.Comment Is Nothing Then c.Comment.Delete End If Next c Set ws2 = Nothing End Sub Глава 9
Работа с данными 297 4. Для выполнения процедуры нажмите клавишу <F5>. При этом в редакторе Visual Basic откроется диалоговое окно Macros (Макрос). Так как в нашем проекте используется не одна процедура, а три, укажите для выполнения ключевой макрос Сравнение_на_двух_листах (рис. 9.4, б). а б Рис. 9.4. (Часть 1 из 2) Сравнение значений в двух таблицах на разных листах: а — табличные данные листа 1; б — запуск процедуры
298 Глава 9 в Рис. 9.4. (Часть 2 из 2) Сравнение значений в двух таблицах на разных листах: в — помеченные для исправления данные на листе 2 В этом примере ячейки на листе Лист2 со значениями, отличными от значений на листе Лист1, помечаются красной обводкой (рис. 9.4, в), к тому же в правом верхнем углу такой ячейки находится комментарий. Посмотрев комментарий, вы поймете, что он содержит значения аналогичной ячейки, находящейся на листе Лист1. Для удаления всех обводок и комментариев на листе Лист2 вызовите в диалоговом окне Macros (Макрос) макрос Удалить_комментарии_и_обводку. И наконец, макрос Исправить_и_выделить служит для замены неправильных значений ячеек листа 2, на правильные значения аналогичных ячеек таблицы листа 1. При этом исправленные значения также помечаются красной обводкой. 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_9.4 Расписание_уроков_сравнение_на_листах.xlsm. Сортировка Сортировка данных — любимейшая операция и пример почти во всех средах программирования. Дело в том, что сортировка средствами VBA возможна при наличии данных для сортировки на рабочем листе Microsoft Excel и использовании метода Range.Sort. Метод Range.Sort предназначен для сортировки диапазона значений. Его синтаксис: expression.Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, _ Header, OrderCustom, MatchCase, Orientation, SortMethod, _ DataOption1, DataOption2, DataOption3)
Работа с данными 299 Все параметры метода Sort являются необязательными. Здесь:  expression — переменная, представляющая объект типа Range;  Key1 — дополнительный параметр типа Variant, служит для обозначения первой области сортировки, либо в виде имени диапазона (строка), либо как объект Range. Параметр определяет значения, которые должны быть отсортированы;  Order1 — определяет порядок сортировки значений, обозначенных в Key1, и за- дается при помощи константы из перечисления XlSortOrder;  Key2 — служит для обозначения второй области сортировки; не может исполь- зоваться при сортировке сводной таблицы (Pivot);  Type — задает, какие элементы должны быть отсортированы;  Order2 — определяет порядок сортировки значений, обозначенных в Key2, и задается при помощи константы из перечисления XlSortOrder;  Key3 — служит для обозначения третьей области сортировки; не может исполь- зоваться при сортировке сводной таблицы (Pivot);  Order3 — определяет порядок сортировки значений, обозначенных в Key1, и задается при помощи константы из перечисления XlSortOrder;  Header — устанавливает, содержит ли первая строка заголовочную информацию;  OrderCustom — устанавливает целочисленное смещение в списке настраиваемых порядков сортировки;  MatchCase — при задании значения True выполняет сортировку, чувствительную к регистру, False служит для нечувствительной сортировки. Параметр не может быть использован для связанных таблиц;  Orientation — устанавливает при помощи константы из перечисления XlSortOrientation направление сортировки по столбцам или по строкам (по умолчанию); — устанавливает при помощи константы из перечисления XlSortDataOption, как происходит сортировка текста в диапазоне ячеек, определенных в Key1. Не применим для сортировки сводных таблиц;  DataOption1  DataOption2 — устанавливает при помощи константы из перечисления ячеек, опреде-  DataOption3 — устанавливает при помощи константы из перечисления ячеек, опреде- XlSortDataOption, как происходит сортировка текста в диапазоне ленных в Key2. Не применим для сортировки сводных таблиц; XlSortDataOption, как происходит сортировка текста в диапазоне ленных в Key3. Не применим для сортировки сводных таблиц. На ленте Microsoft Excel работе с данными отведена вкладка Данные, в том числе и группа Сортировка и фильтр. В примерах, приведенных далее, рассматривается применение сортировки данных средствами VBA.
300 Глава 9 Сортировка диапазона данных Данные на рабочем листе можно сортировать разными способами. Рассмотрим способы вертикальной сортировки в столбце и горизонтальной сортировки в строке с использованием метода Range.Sort. Обратите внимание, что сортировка будет осуществляться для диапазона данных. 1. Создайте новый файл Microsoft Excel 2019. 2. На листе рабочей книги введите в ячейки информацию о фамилиях и о возрасте (рис. 9.5) и нарисуйте кнопку категории ActiveX с названием Сортировка от А до Я столбца Фамилия. 3. Щелкните правой кнопкой мыши по кнопке сортировки фамилий и выберите команду Просмотреть код. Произойдет переход в редактор VBA к заготовке управления этой кнопкой. Напишите код в соответствии с листингом 9.5. В этой программе сортируются значения из диапазона A1:A8. По ключу Key1 в столбце А1 значения сортируются в порядке возрастания (Order1:=xlAscending), в данном случае происходит сортировка по алфавиту от А до Я, где А — минимальное значение (1). Листинг 9.5. Пример вертикальной сортировки в столбце с одним ключом Private Sub CommandButton1_Click() 'Сортировка в столбце от А до Я (A - минимальное значение) Range("A1:A8").Sort Key1:=Range("A1"), _ Order1:=xlAscending, _ Header:=xlYes, Orientation:=xlTopToBottom, SortMethod:=xlPinYin End Sub Рис. 9.5. Исходные данные для сортировки
Работа с данными 301 Процедура из листинга 9.5 управляет сортировкой первого столбца. Аргумент Orientation показывает, что сортировка идет от вершины к низу: Orientation:= xlTopToBottom. П РИМЕЧАНИЕ Начиная с версии Microsoft Excel 2007, число ключей возросло с 3 до 65. 4. Продолжите работу с этим примером: • на рабочем листе нарисуйте кнопку ActiveX с надписью Сортировка строки Возраст; • в заготовке, открывшейся по команде Просмотреть код для этой кнопки, напишите код в соответствии с листингом 9.6. Листинг 9.6. Пример горизонтальной сортировки в строке с одним ключом Private Sub CommandButton2_Click() 'Сортировка в строке по убыванию значений Range("A10:H10").Sort _ Key1:=Range("A10"), _ Order1:=xlDescending, _ Orientation:=xlColumns End Sub Эта процедура управляет сортировкой десятой строки. Значения после сортировки располагаются по убыванию. 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинги_9.5-9.6_Сортировка.xlsm. Сортировка областей (блоков) Если вам необходима сортировка областей (блоков), то VBA станет для вас первым помощником, потому что в Excel для этого нет специальной функции сортировки. Простая сортировка блоков Рассмотрим пример, в котором имеются пять блоков, состоящих каждый из трех столбцов (рис. 9.6). Число строк может варьироваться. Каждый блок содержит числа от 0 до 9, от 10 до 19, от 20 до 29 и т. д. Блоки должны быть отсортированы. За начало сортировки выбирается первый номер в блоке. 1. Создайте новый файл Microsoft Excel 2019. 2. На листе Лист1 введите в ячейки информацию согласно рис. 9.6, вставьте кнопку из категории Элементы управления формы. Переименуйте ее в СОРТИРОВКА_ ОБЛАСТИ.
302 Глава 9 Рис. 9.6. Пример для сортировки блоков 3. Вместо обработчика события по нажатию кнопки, размещаемого непосредственно на листе 1, создайте отдельный модуль Module1 и введите в нем код процедуры СОРТИРОВКА_БЛОКОВ1() из листинга 9.7. 4. Назначьте макрос СОРТИРОВКА_БЛОКОВ1 для выполнения по нажатию кнопки СОРТИРОВКА_ОБЛАСТИ. В режиме конструктора щелкните на кнопке правой кнопкой мыши и в контекстном меню выберите команду Назначить макрос. В поле перечисленных макросов укажите макрос для выполнения: СОРТИРОВКА_БЛОКОВ1. 5. Выйдите из режима конструктора и запустите макрос на исполнение, нажав кнопку СОРТИРОВКА_ОБЛАСТИ. Листинг 9.7. Пример сортировки пяти блоков, состоящих из трех столбцов каждый Sub СОРТИРОВКА_БЛОКОВ1() Dim var1 As Variant Dim i As Integer, j As Integer Dim r As Long, c As Integer c = 3 ' Число столбцов в блоке r = Range("A1").End(xlDown).Row 'Число строк в данной области For i = 1 To Cells(1, 16384).End(xlToLeft).Column Step c 'Цикл сравнения For j = 1 To Cells(1, 16384).End(xlToLeft).Column - c Step c 'Проверка значений первого и второго блока, 'если значения первого больше, чем второго If Cells(1, j).Value > Cells(1, j + c).Value Then 'Значения первого блока присваиваются переменной var1 var1 = Cells(1, j).Resize(r, c).Formula
Работа с данными 303 'Значения второго блока присваиваются значениям первого Cells(1, j).Resize(r, c).Formula = _ Cells(1, j + c).Resize(r, c).Formula 'Значения var1 присваиваются значениям второго блока Cells(1, j + c).Resize(r, c).Value = var1 End If Next j Next i End Sub Первый и второй циклы работают до значения, равного количеству столбцов в блоке. Свойство Resize упрощает работу с массивом. Свойство Formula показывает, что сортировка работает корректно, даже если вместо значений присутствуют формулы, возвращающие эти значения. Результаты сортировки показаны на рис. 9.7. 6. Сохраните вновь созданный документ с поддержкой макросов под именем Листинги_9.7-9.8_Сортировка_области.xlsm. Рис. 9.7. Пример выполнения сортировки области Сортировка блоков с изменением ее условий Код сортировки блоков немного изменится, если поменяется условие сортировки. Продолжите рассмотрение примера, в котором есть пять блоков, состоящих из трех столбцов каждый. Измените условие сортировки — например, пусть сортировка будет начинаться не с первой ячейки блока, а с ячейки второго столбца четвертой строки каждого блока (рис. 9.8). 1. На листе Лист2 введите в ячейки информацию согласно рис. 9.8 и вставьте кнопку из категории Элементы управления формы. Переименуйте ее в СОРТИРОВКА_ОБЛАСТИ 2.
304 Глава 9 Рис. 9.8. Сортировка начинается с ячейки второго столбца четвертой строки каждого блока 2. Вместо обработчика события по нажатию кнопки, размещаемого непосредственно на листе 1, создайте отдельный модуль Module1 и введите в нем код процедуры СОРТИРОВКА_БЛОКОВ2() из листинга 9.8. 3. Назначьте макрос СОРТИРОВКА_БЛОКОВ2 для выполнения по нажатию кнопки СОРТИРОВКА_ОБЛАСТИ 2. В режиме конструктора щелкните на кнопке правой кнопкой мыши и в контекстном меню выберите команду Назначить макрос. В поле перечисленных макросов укажите макрос для выполнения: СОРТИРОВКА_БЛОКОВ2. 4. Выйдите из режима конструктора и запустите макрос на исполнение, нажав кнопку СОРТИРОВКА_ОБЛАСТИ 2. Листинг 9.8. Пример сортировки пяти блоков, состоящих из трех столбцов (изменение условий) Sub СОРТИРОВКА_БЛОКОВ2() Dim varSimple As Variant Dim i As Integer, j As Integer Dim r As Long, c As Integer c = 3 r = Range("A1").End(xlDown).Row For i = 2 To Cells(4, 16384).End(xlToLeft).Column Step c 'Сортировка по значениям в четвертой строке и втором столбце For j = 2 To Cells(4, 16384).End(xlToLeft).Column - c Step c If Cells(4, j).Value > Cells(4, j + c).Value Then varSimple = Cells(4, j).Offset(-3, -1).Resize(r, c).Formula Cells(4, j).Offset(-3, -1).Resize(r, c).Formula = _ Cells(4, j + c).Offset(-3, -1).Resize(r, c).Formula Cells(4, j + c).Offset(-3, -1).Resize(r, c).Formula = varSimple End If Next j
Работа с данными 305 Next i End Sub В этой программе блоки сортируются по значениям в выделенных ячейках — результат сортировки показан на рис. 9.9. 5. Сохраните рабочую книгу под тем же именем: Листинги_9.7-9.8_Сортировка_ области.xlsm. Рис. 9.9. Результат сортировки блоков Сортировка по цвету Рассмотрим пример, в котором в столбце А несколько ячеек закрашено разными цветами, причем названия цветов подписаны (рис. 9.10). Отсортируем ячейки так, чтобы ячейки одного цвета разместились рядом и составили блоки ячеек красного, зеленого, синего и желтого цветов. 1. Создайте новый файл Microsoft Excel 2019. 2. На рабочем листе введите в ячейки информацию согласно рис. 9.10 и вставьте кнопку из категории Элементы управления формы. Переименуйте ее в СОРТИРОВКА_ПО_ЦВЕТУ. 3. Для этой кнопки в заготовке, открывшейся по команде Просмотреть код, напишите код в соответствии с листингом 9.9. В процедуре этой программы применен метод Range.Sort, использующий ключ Сортировка при этом осуществляется на основании индекса цвета. Результат сортировки показан на рис. 9.11. Key1. Листинг 9.9. Пример сортировки по цвету Private Sub CommandButton1_Click() Dim i As Integer Columns(1).Insert
306 Глава 9 For i = 1 To 12 Cells(i, 1) = Cells(i, 2).Interior.ColorIndex 'Определен цветовой _ индекс для ячейки (число) Next i Range("A1:B" & i).Sort Key1:=Range("A1"), Order1:=xlAscending 'Сортировка чисел по возрастанию Columns(1).Delete End Sub Рис. 9.10. Закрашенные ячейки, предназначенные для сортировки Рис. 9.11. Результат сортировки по цвету
Работа с данными 307 4. Для тех же исходных данных (см. рис. 9.10) можно предложить иной принцип сортировки — по индексу имени цвета. Для этого нарисуйте на рабочем листе еще одну кнопку категории Элементы управления формы с надписью СПЕЦИАЛЬНАЯ_СОРТИРОВКА. 5. Для созданной кнопки в заготовке, открывшейся по команде Просмотреть код, напишите код в соответствии с листингом 9.10. В листинге 9.10 также применен метод Range.Sort с ключом Key1. Сортировка при этом выполняется на основании индекса цвета ColorIndex (назначается в соответствии со специальной цветовой палитрой), используемого в качестве заливки Interior выбранной ячейки. Результат сортировки показан на рис. 9.12 — объединенные блоки желтого, зеленого, красного и синего цветов. Рис. 9.12. Результат сортировки по имени цвета Листинг 9.10. Пример сортировки цветных блоков с изменением условий Private Sub CommandButton2_Click() Dim i As Integer Columns(1).Insert For i = 1 To 12 Select Case Cells(i, 2).Interior.ColorIndex Case 6 Cells(i, 1) = 1 'Приоритет для сортировки ячеек 'с цветом 6 (желтый) Case 4 Cells(i, 1) = 2 Case 3 Cells(i, 1) = 3
308 Глава 9 Case 5 Cells(i, 1) = 4 End Select Next i Range("A1:B" & i).Sort Key1:=Range("A1"), Order1:=xlAscending Columns(1).Delete End Sub 6. Сохраните вновь созданный документ с поддержкой макросов под именем Листинги_9.9-9.10_Сортировка_по_цвету.xlsm. Контроль автофильтра посредством VBA Автофильтры служат для выборки конкретных данных из их общего количества по условию и устанавливаются вручную. Управление автофильтрами может быть возложено на средства VBA. П РИМЕЧАНИЕ Если данные были отфильтрованы и часть из них перестала отображаться, это не означает, что данные удалены, — они просто скрыты и могут быть показаны в любое время. Для того чтобы снова отобразить все записи, необходимо нажать на стрелочку фильтра и установить флажок Выбрать все. Иногда важен, например, расчет суммы не всех имеющихся данных, а только отфильтрованных. Тогда функцию =СУММ() нужно заменить на =ПРОМЕЖУТОЧНЫЕ. ИТОГИ(). П РИМЕЧАНИЕ Если отфильтрованные данные были скопированы из одного места в буфер обмена комбинацией клавиш <Ctrl>+<C> и затем вставлены в другое место комбинацией клавиш <Ctrl>+<V>, то эти операции будут проведены не над всеми данными, а только над отфильтрованными. Команда Итоги Подвести итоги можно в сводных таблицах (общие и промежуточные итоги), либо при помощи команды Данные | Структура | Промежуточный итог, которая позволяет из множества данных выделить промежуточную или итоговую информацию. Рассмотрим такой пример — пусть на листе рабочей книги отображена деятельность нескольких фирм (рис. 9.13). 1. Создайте новый файл Microsoft Excel 2019. 2. На рабочем листе введите в ячейки информацию согласно рис. 9.13. Доход рассчитывается из произведения рисков на объем и на стоимость.
Работа с данными 309 Рис. 9.13. Данные о работе фирм 3. Перейдите в среду VBA и добавьте к проекту новый модуль. 4. Создайте в модуле процедуру Упорядочивание(). В ней к объекту Range применяется метод AutoOutline (листинг 9.11), предназначенный для автоматического создания итогового представления данных для заданного диапазона. Не забывайте указать в начале окна кода оператор Option Explicit. Листинг 9.11. Пример использования метода AutoOutline Public Sub Упорядочивание() With Лист1 .UsedRange.AutoOutline End With End Sub 5. Для запуска макроса нажмите кнопку . Перейдите в Microsoft Excel. Результат вычленения итогов на рабочем листе показан на рис. 9.14, а (с промежуточными итогами) и на рис. 9.14, б (с общими итогами). Обратите внимание, что линейка итогов расположена наверху рабочего листа, а при обращении к команде Данные | Структура | Промежуточный итог она находится слева. 6. Если необходимо убрать представление данных в виде итогов, то к объекту Range следует применить метод ClearOutline (листинг 9.12).
310 Глава 9 а б Рис. 9.14. Итоги работы фирм: а — промежуточные; б — общие
Работа с данными 311 Листинг 9.12. Пример использования метода ClearOutline Public Sub Убрать_итоги() With Лист1 .UsedRange.ClearOutline End With End Sub 7. Для запуска макроса нажмите кнопку . 8. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_9.11-9.12_Упорядочивание.xlsm. Сортировка данных при помощи Среза Если в предыдущем разделе мы с вами сортировали одноколончатые или однострочные данные, не связанные друг с другом, то сейчас рассмотрим способ фильтрации при помощи среза. Срезы представляют данные в табличном виде, где строки с данными еще имеют функцию кнопок, с помощью которых можно фильтровать данные таблиц Excel или сводных таблиц, сводных диаграмм или функций куба. Помимо поддержки быстрой фильтрации срезы также указывают текущее состояние фильтрации, что позволяет легко понять данные в отфильтрованной сводной таблице. Для того чтобы вставить срез при помощи Microsoft Excel, нажмите одноименную кнопку Срез в группе Фильтры на вкладке ленты Вставка, предварительно выделив таблицу Excel либо сводную таблицу. Если использовать для этого данные, не представляющие собой таблицу Excel либо сводную таблицу, а просто диапазон данных, например, как на рис. 9.5, то вставить срез не удастся. Для управления и анализа группы взаимосвязанных данных можно преобразовать диапазон ячейки в таблицу Excel (ранее известную как список Excel). Рассмотрим такой пример — пусть на листе рабочей книги приведен одноколонный список фамилий со строкой заголовка, которые необходимо отсортировать при помощи преобразования диапазона данных в таблицу Excel и вставить срез. 1. Создайте новый файл Microsoft Excel 2019. 2. На рабочем листе введите в ячейки A1:A8 информацию о фамилиях согласно рис. 9.5, при этом в ячейке A1 должна присутствовать заголовочная информация "Фамилия И.О.". 3. На листе рабочей книги введите в ячейки информацию о фамилиях и о возрасте (рис. 9.15) и нарисуйте кнопку категории ActiveX с названием Преобразовать диапазон в таблицу. 4. Щелкните правой кнопкой мыши по кнопке сортировки фамилий и выберите команду Просмотреть код. Произойдет переход в редактор VBA к заготовке управления этой кнопкой. Напишите код в соответствии с листингом 9.13.
312 Глава 9 Рис. 9.15. Исходные данные для создания таблицы Excel Листинг 9.13. Пример преобразования диапазона данных в таблицу Excel Private Sub CommandButton1_Click() Range("A1:A8").Select Application.CutCopyMode = False ActiveSheet.ListObjects.Add(xlSrcRange,Range("$A$1:$A$8"), , xlYes). _ Name = "Таблица1" Range("Таблица1[[#All],[ Фамилия И.О.]]").Select End Sub 5. Выйдите из режима конструктора и запустите макрос на исполнение по нажатию созданной кнопки. Диапазон данных преобразовался в таблицу с именем Таблица1. При выделении любой строки таблицы Таблица1 на ленте появляется вкладка Конструктор (рис. 9.16). Сама таблица имеет чередующиеся по цвету строки, а строка заголовка содержит значок фильтрации быстро фильтровать или сортировать данные (рис. 9.17). , что позволяет В коде задействовано свойство Application.CutCopyMode, в данном случае устанавливающее отключение режима "вырезать-копировать". Объект ListObject представляет объект списка в коллекции ListObjects. Вставка таблицы осуществляется при помощи метода ListObjects.Add, служащего для создания нового объекта в виде списка. Его синтаксис выглядит следующим образом: expression.Add(SourceType, Source, LinkSource, XlListObjectHasHeaders, _ Destination, TableStyleName) Все параметры метода необязательные.  SourceType — указывает тип источника для запроса. Задается при помощи одной из констант перечисления XlListObjectSourceType (см. табл. 9.1).
Работа с данными 313 Рис. 9.16. Таблица Excel и вкладка Конструктор Рис. 9.17. Строка заголовка со значком фильтрации Таблица 9.1. Константы перечисления XlListObjectSourceType Название Значение Описание xlSrcExternal 0 Внешний источник данных. xlSrcModel 4 Модель PowerPivot xlSrcQuery 3 Query xlSrcRange 1 Диапазон Range xlSrcXml 2 XML
314 Глава 9  Source — дополнительный параметр типа Variant, служит для обозначения типа источника данных. Если параметр SourceType = xlSrcRange, то источником данных является объект Range. Если параметр опущен, то для Source будет задан диапазон по умолчанию, возвращенный кодом обнаружения диапазона списков. Если параметр SourceType = xlSrcExternal, то источником данных является массив строковых значений, указывающий подключение к источнику, содержащий следующие элементы: 0 — ссылка URL или сайт SharePoint, 1 — значение ListName, 2 — ViewGUID.  LinkSource — логический параметр типа Boolean. Указывает, следует ли связать внешний источник данных с объектом типа ListObject. Если параметр SourceType принимает значение xlSrcExternal, то значение по умолчанию True (Истина). Не работает при значении параметр SourceType = xlSrcRange и будет возвращать ошибку, если не опущен.  XlListObjectHasHeaders — параметр типа Variant, задается при помощи одной из констант перечисления XlYesNoGuess (см. табл. 9.2), служащей для указания, содержит ли первая строка заголовки. Не может использоваться при сортировке отчетов сводных таблиц. Таблица 9.2. Константы перечисления XlYesNoGuess Название Значение Описание xlGuess 0 Microsoft Excel определяет, есть ли заголовок и в каком месте xlNo 2 Значение по умолчанию. Целый диапазон должен быть отсортирован xlYes 1 Не следует сортировать диапазон полностью  Destination — параметр типа Variant, обозначает объект типа Range, указываю- щий ссылку на одну ячейку для верхнего левого угла нового объекта List в качестве значения параметра. Если объект Range ссылается на несколько ячеек, возникает ошибка.  TableStyleName — параметр типа String, обозначающий имя объекта TableStyle, задающего стиль, который можно применить к таблице или срезу, например TableStyleLight1. Продолжите работу с этим примером: 1. На рабочем листе нарисуйте кнопку ActiveX с надписью Вставить срез. 2. В заготовке, открывшейся по команде Просмотреть код для этой кнопки, напишите код в соответствии с листингом 9.14. Листинг 9.14. Пример создания среза Private Sub CommandButton2_Click() ActiveWorkbook.SlicerCaches.Add2(ActiveSheet.ListObjects("Таблица1"), _ " Фамилия И.О.").Slicers.Add ActiveSheet, , " Фамилия И.О.", _ " Фамилия И.О.", 74.25, 393.75, 144, 243.75
Работа с данными 315 ActiveSheet.Shapes.Range(Array(" Фамилия И.О.")).Select 'Добавление в книгу нового объекта SliсerCaches, содержащего таблицу _ с данными, и нового объекта Slicers на рабочий лист End Sub В примере вначале в рабочую книгу добавляется объект SliсerCaches при помощи метода SlicerCaches.Add2 с параметрами Source, SourceField, Name, SlicerCacheType, где аргументом, передаваемым параметру Source, может быть объект WorkbookConnection, объект сводной таблицы PivotTable или строка String. Для того чтобы добавить объект среза Slicer в коллекцию срезов Slicers, используется метод Slicers.Add. 3. Выйдите из режима конструктора и запустите макрос на исполнение по нажатию созданной кнопки. Результат создания среза показан на рис. 9.18. 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_9.13-9.14_Срез_в_таблице_Excel.xlsm. Рис. 9.18. Срез данных
316 Глава 9 Сводные таблицы PivotTable Сводные таблицы Excel используются для анализа данных, помещенных в таблицы или списки. Сводные таблицы позволяют группировать данные и производить их анализ. При создании сводной таблицы пользователь может оперировать именами полей, которые размещаются в ее строках и столбцах. Для работы со сводными таблицами используются объекты PivotCaches, PivotCache, PivotTables, PivotTable. Объект PivotCaches — это коллекция кэшей памяти из отчетов сводной таблицы в книге. Каждый кэш памяти представлен объектом PivotCache. Объект PivotCaches имеет следующие свойства и методы:  методы: • Create — создает новый объект PivotCache; • Item — возвращает один объект из коллекции;  свойства: • Application — возвращает объект Application, который представляет приложение Microsoft Excel. Только для чтения; • Count — возвращает значение типа Long, представляющее число объектов в коллекции; • Creator — возвращает 32-битное целое число, указывающее на приложение, в котором объект был создан. Только для чтения, Long; • Parent — возвращает родительский объект для указанного объекта. Только для чтения. Объект PivotTable представляет отчет сводной таблицы на листе. Он является членом коллекции сводных таблиц PivotTables. Коллекция сводных таблиц содержит все объекты сводной таблицы на отдельном листе. Метод Add объекта PivotTables добавляет новый отчет сводной таблицы. Метод Item и свойства Application, Count, Creator и Parent возвращают те же объекты и значения, что и для объекта PivotCaches, описанного выше. Рассмотрим следующий пример: таблица содержит список занятий в учебном заведении. В каждой строке указана фамилия преподавателя, вид занятия, день недели и количество часов. Требуется проанализировать учебную нагрузку каждого преподавателя по видам занятий и по дням недели. 1. Создайте новый файл Microsoft Excel 2019. 2. На рабочем листе введите в ячейки информацию согласно рис. 9.19. Перейдите в среду VBA и добавьте к проекту новый модуль. 3. Создайте в модуле процедуру pivot() в соответствии с листингом 9.15. 4. Запустите процедуру на выполнение. В результате в книге появится новый лист, на котором будет создана сводная таблица (рис. 9.20).
Работа с данными 317 Рис. 9.19. Исходная таблица Листинг 9.15. Сводная таблица Public Sub pivot() Dim ptc As PivotCache Dim pt As PivotTable Set ptc=ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, _ SourceData:="Лист1!R1C1:R13C4", Version:=6) Sheets.Add Set pt = ActiveSheet.PivotTables.Add(PivotCache:=ptc, _ TableDestination:=Range("A3")) With pt .PivotFields("Преподаватель").Orientation = xlRowField .PivotFields("Вид занятия").Orientation = xlRowField .PivotFields("День недели").Orientation = xlColumnField .PivotFields("Часы").Orientation = xlDataField End With End Sub В этом коде создается новый объект PivotCache при помощи метода PivotCaches.Create. Параметр SourceType задает тип источника данных. Пара-
318 Глава 9 метр xlDataBase означает, что источником данных является диапазон таблицы Excel. Параметр SourceData задает расположение диапазона. Затем в коллекцию PivotTables добавляется новый объект PivotTable при помощи метода PivotTables.Add. Параметр PivotCache задает источник данных, которым в данном случае является созданный объект PivotCache. Параметр TableDestination определяет расположение сводной таблицы на листе. Свойство PivotFields представляет коллекцию полей сводной таблицы. При помощи его свойства Orientation задается расположение полей сводной таблицы. Свойство Orientation может принимать следующие значения: xlRowField, если поле располагается в строках таблицы; xlColumnField, если поле располагается в столбцах таблицы; xlDataField, если поле располагается в области данных; и xlPageField, если поле является полем фильтра. 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_9.15_Сводные_таблицы.xlsm. Рис. 9.20. Сводная таблица
ГЛАВА 10 Автоматизация диаграмм Мороз не велик, да стоять не велит. Построенные в программе Microsoft Excel 2019 диаграммы, наглядно отображающие изменение данных, очень популярны. По ним можно визуально сравнивать и анализировать числовые характеристики, подводить итоги и т. п. Для построения и форматирования диаграмм, а также для управления ими, в Excel 2019 можно применять язык Visual Basic for Applications. Объектная модель диаграмм Семейство Sheets листов рабочей книги включает в себя два семейства: Worksheets (рабочих листов) и Charts (листов диаграмм). Объектами семейства Charts являются диаграммы, непосредственно внедренные в рабочие листы. Эти диаграммы принадлежат семейству ChartObjects. Его элементы — объекты класса ChartObject; это контейнеры, содержащие объект Chart. Объект ChartObject встроен в объект Worksheet, а объект Chart — в объект Workbook. У объектов Workbook и Application имеется общее свойство ActiveChart, которое возвращает активную диаграмму рабочей книги независимо от того, какому семейству она принадлежит. Объектная модель диаграмм показана на рис. 10.1. Как мы уже не раз отмечали, самый главный объект программы Microsoft Excel 2019 — объект Application (сама программа Microsoft Excel). Следующую ступень в иерархии объектов занимает Workbook (рабочая книга — ваш файл). Далее следует объект Worksheet (рабочий лист). Каждая диаграмма определяется характеристиками: ChartTitle (Заголовок диаграммы), ChartType (Тип диаграммы), Legend (Легенда), PlotArea (Область графика диаграммы), Trendlines (Линии тренда), SeriesCollection (Ряды данных), состоящий из Points (Точки), Marker (Маркер). Кроме того, для 3D-диаграмм присутствуют характеристики Floor (Основание) и Walls (Стенки).
320 Глава 10 Рис. 10.1. Иерархия объектов в диаграммах Каждой диаграмме присуща также характеристика Axis (Ось), для которой заданы параметры AxisTitle (Название оси), DisplayUnitLabel (Режим отображения осевых значений) и TickLabels (Подписи к осевым значениям). Диаграммы табличных данных (DataTable) характеризуются обрамлением их ячеек: Border (Граница) и Font (Шрифт). Семейства ChartObjects и Chart, как и любые другие, обладают методами Add (создает новый элемент семейства) и Delete (удаляет элемент семейства), а также свойством Count (возвращает число элементов семейства).
Автоматизация диаграмм 321 Метод Add у семейств Chartobjects и Chart имеет различный синтаксис. Синтаксис семейства ChartObjects: ChartObjects.Add(Left, Top, Width, Height) где:  Left, Top — координаты левого верхнего угла диаграммы на рабочем листе;  Width, Height — ширина и высота диаграммы. Синтаксис семейства Charts: Charts.Add(Before, After, Count) где:  Before — номер листа, перед которым добавляется диаграмма;  After — номер листа, после которого добавляется диаграмма;  Count — число добавляемых диаграмм. Все параметры метода Add необязательные. Типы диаграмм Программа Microsoft Excel предоставляет в распоряжение пользователей более 100 типов диаграмм. В табл. 10.1 в качестве образцов показаны основные типы диаграмм и перечислены их подтипы. В описании приведены значения типов диаграмм из перечисления XlChartType. На ленте отдельные виды диаграмм могут быть скрыты (цилиндрическая, пирамидальная, объемные гистограммы). Вы также можете добавить в шаблоны свои любимые разработки. Таблица 10.1. Основные типы диаграмм Тип диаграммы Подтип Тип диаграммы Подтип Гистограмма xlColumnClustered xlColumnStacked xlColumnStacked100 xl3DColumnClustered xl3DColumnStacked xl3DColumnStacked100 xl3DColumn Линейчатая xlBarClustered xlBarStacked xlBarStacked100 xl3DBarClustered xl3DBarStacked xl3DBarStacked100 График xlLine xlLineStacked xlLineStacked100 xlLineMarkers xlLineMarkersStacked xlLineMarkersStacked100 xl3DLine С областями xlArea xlAreaStacked xlAreaStacked100 xl3DArea xl3DAreaStacked xl3DAreaStacked100
322 Глава 10 Таблица 10.1 (продолжение) Тип диаграммы Подтип Тип диаграммы Подтип Точечная xlXYScatter xlXYScatterSmooth xlXYScatterSmoothNoMarkers xlXYScatterLines xlXYScatterLinesNoMarkers Круговая xlPie xl3DPie xlPieOfPie xlPieExploded xl3DPieExploded xlBarOfPie Карта xlRegionMap Дерево xlTreemap Солнечные лучи xlSunburst Гистограмма (другой тип) xlHistogram xlPareto Ящик с усами xlBoxwhisker Каскадная xlWaterfall Воронка xlFunnel Лепестковая гистограмма xlRadar xlRadarMarkers xlRadarFilled Пузырьковая xlBubble Комбинированная xlColumnClustered и xlLine — гистограмма с группировкой и график. xlBubble3DEffect xlAreaStacked и xlColumnClustered — с областями с накоплением и гистограмма с группировкой Кольцевая xlDoughnut xlDoughnutExploded Биржевая xlStockHLC xlStockOHLC xlStockVHLC xlStockVOHLC
Автоматизация диаграмм 323 Таблица 10.1 (окончание) Тип диаграммы Поверхностная Тип диаграммы Подтип xlSurface xlSurfaceWireframe Коническая гистограмма xlConeColClustered xlConeColStacked xlConeColStacked100 xlConeBarClustered xlConeBarStacked xlConeBarStacked100 xlConeCol Цилиндрическая гистограмма xlCylinderColClustered xlCylinderColStacked xlCylinderColStacked100 xlCylinderBarClustered xlCylinderBarStacked xlCylinderBarStacked100 xlCylinderCol xlSurfaceTopView xlSurfaceTopViewWireframe Пирамидальная гистограмма xlPyramidColClustered xlPyramidColStacked xlPyramidColStacked100 xlPyramidBarClustered xlPyramidBarStacked xlPyramidBarStacked100 xlPyramidCol Подтип Еще в версии программы Microsoft Excel 2016 появились новые типы диаграмм, такие как Каскадная, Дерево, Солнечные лучи, Парето, Ящик с усами, Частотная гистограмма, а в версии Microsoft Excel 2019 диаграммы обновились типами Воронка, Карта (для визуализации геолокационных данных). Если в названии константы присутствует запись 3D, это свидетельствует о ее объемности. В раскрывающемся списке свойства ChartType представлены константы диаграмм, в том числе только появившихся в Microsoft Excel 2019 (рис. 10.2). В НЕДРЕННАЯ ДИАГРАММА Внедренная диаграмма помещается на обычный лист, а не на отдельный лист диаграммы. Для того чтобы быстро создать внедренную диаграмму на основе типа диаграммы по умолчанию, выберите данные, которые следует использовать для ее построения, и нажмите комбинацию клавиш <Alt>+<F1>. Рис. 10.2. Пример списка констант диаграмм
324 Глава 10 Л ИСТ ДИАГРАММЫ Лист диаграммы — это лист книги, содержащий только диаграмму. Для того чтобы быстро создать диаграмму на отдельном листе, выберите данные, которые следует использовать для ее построения, и нажмите клавишу <F11>. Свойства объекта Chart Объект Chart имеет более 50 свойств, подробное описание которых можно найти в справочной системе Excel. Далее приведем лишь его основные свойства.  ChartTitle — возвращает объект ChartTitle, являющийся заголовком диаграммы.  ChartType — возвращает или устанавливает тип диаграммы.  Legend — возвращает объект Legend, отвечающий за легенду диаграммы.  Rotation — возвращает или устанавливает угол поворота вида трехмерной диа- граммы (поворот области графика вокруг оси z в градусах). Допустимые значения — от 0 до 360. По умолчанию задан угол 20°.  Elevation — возвращает или устанавливает угловые возвышения (в градусах), с которых смотрят на трехмерную диаграмму. Допустимые значения — от –90 до 90. По умолчанию задан угол 15°.  PlotBy — возвращает или устанавливает способ использования строк или стол- бов в виде рядов данных на диаграмме. Допустимые значения — xlColumns (по столбцам) и xlRows (по строкам).  Логические свойства HasTitle, HasLegend, а также свойство HasAxis типа Variant информируют о наличии соответствующего элемента (заголовка, легенды, оси). Методы объекта Chart Ранее уже упоминались некоторые методы объекта Chart, перечислим еще несколько.  Axes — возвращает объект, представляющий собой либо единственную ось, либо коллекцию осей диаграммы. Синтаксис метода: Axes(Type, AxisGroup) где: • Type — определяет возвращаемый тип оси. Принимает одно из значений констант XLAxisType; • AxisGroup — обозначает группу оси. Допустимые значения — xlPrimary и xlSecondary.  SetSourceData — устанавливает источник диапазона данных, по которым стро- ится диаграмма. Синтаксис метода: SetSourceData(Source, PlotBy)
Автоматизация диаграмм 325 где: • Source — диапазон, содержащий источник данных; • PlotBy — обозначает способ построения данных на графике. Допустимые значения — xlColumns (по столбцам) и xlRows (по строкам). Первая диаграмма Начнем изучение использования VBA для диаграмм с создания вручную самой простой диаграммы. 1. Запустите программу Microsoft Excel 2019 и создайте новую книгу. 2. На рабочем листе в ячейки А1:В5 введите данные в соответствии с рис. 10.3 (или другие аналогичные). Рис. 10.3. Пример данных для построения диаграмм 3. На основании этих данных постройте диаграмму. Для этого на вкладке Вставка ленты в группе Диаграммы выберите тип диаграммы, например Гистограмма. Отформатируйте область построения, оси, надписи и другие параметры диаграммы по своему усмотрению (см. рис. 10.3). 4. На этом же листе рабочей книги создайте три командные кнопки для управления диаграммой. Для создания первой кнопки на вкладке ленты Разработчик в группе Элементы управления откройте кнопку Вставить и в элементах управления Элементы ActiveX выберите инструмент управления Выклю-
326 Глава 10 чатель (в VBA ToggleButton), активизируйте его (рис. 10.4, а) и в рабочем поле Microsoft Excel нарисуйте кнопку ToggleButton1. 5. Щелкните по кнопке правой кнопкой мыши, в открывшемся контекстнозависимом меню выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение Управление диаграммой. а б Рис. 10.4. Добавление кнопок: а — вставка выключателя из категории Элементы ActiveX; б — диалоговое окно Назначить макрос объекту, появляющееся при вставке кнопки категории Элементы управления формы 6. В том же контекстно-зависимом меню измените свойство Name, задав ему значение tglChart. 7. В том же контекстно-зависимом меню выполните команду Просмотреть код. Выбор этой команды обеспечивает переход в окно редактора VBA и вывод в нем текста заготовки процедуры: Private Sub tglChart_Click() End Sub 8. Между строками шаблона процедуры введите код программы управления диаграммой в соответствии с листингом 10.1, а. Здесь свойство Visible устанавливает видимость/невидимость диаграммы, при этом изменяется свойство Caption управляющей кнопки. Листинг 10.1, а. Управление диаграммой Private Sub tglChart_Click() With ActiveSheet.ChartObjects(1)
Автоматизация диаграмм 327 If .Visible Then .Visible = False tglChart.Caption = "Показать диаграмму" Else .Visible = True tglChart.Caption = "Спрятать диаграмму" End If End With End Sub 9. Аналогично нарисуйте еще одну кнопку выключателя ToggleButton2 и для нее свойству Caption задайте значение Управление осями. В контекстно-зависимом меню кнопки измените свойство Name, задав ему значение tglAxis. 10. В том же контекстно-зависимом меню выполните команду Просмотреть код. Выбор этой команды обеспечивает переход в окно редактора VBA и вывод в нем текста заготовки процедуры: Private Sub tglAxis_Click() End Sub 11. Между строками шаблона процедуры введите код программы управления диаграммой в соответствии с листингом 10.1, б. Не забудьте указать в начале окна кода оператор Option Explicit. Листинг 10.1, б. Управление осями Private Sub tglAxis_Click() With ActiveSheet.ChartObjects(1).Chart If .HasAxis(xlCategory) And .HasAxis(xlValue) Then .HasAxis(xlCategory) = False .HasAxis(xlValue) = False tglAxis.Caption = "Показать оси" Else .HasAxis(xlCategory) = True .HasAxis (xlValue) = True tglAxis.Caption = "Спрятать оси" End If End With End Sub 12. Перейдите из редактора VBA в приложение Microsoft Excel, щелкнув на кнопке View Microsoft Excel (Переход в Microsoft Excel) панели инструментов Standard (Стандартная) либо нажав сочетание клавиш <Alt>+<F11>. На листе категории Элементы рабочей книги создайте командную кнопку Кнопка управления формы для управления легендой диаграммы.
328 Глава 10 13. Как только вы закончите рисование, откроется диалоговое окно Назначить макрос объекту (рис. 10.4, б). В нем следует щелкнуть мышью по кнопке Создать. Выбор этой кнопки обеспечивает переход в окно редактора VBA и появление шаблона процедуры: Private Sub Кнопка1_Click() End Sub 14. Между строками шаблона процедуры введите код программы управления легендой в соответствии с листингом 10.1, в. Листинг 10.1, в. Перемещение легенды Private Sub Кнопка1_Click() With ActiveSheet.ChartObjects(1).Chart .HasLegend = True 'Проверка того, что легенда отображается .Legend.Position = xlBottom 'Разместить легенду внизу End With End Sub 15. Щелкните по созданной кнопке левой кнопкой мыши — это событие перемещает легенду вниз. 16. Если необходимо отредактировать надпись на кнопке или исправить код программы, следует перейти в режим конструктора, активизировав одноименную кнопку (см. рис. 10.4, а). 17. Диаграмме можно задать новое имя, например МОЯ_ДИАГРАММА, добавив в код программы строку: ActiveSheet.ChartObjects(1).Name = "МОЯ_ДИАГРАММА" П РИМЕЧАНИЕ Обратите внимание, что элементы управления (кнопки, счетчики, переключатели и т. д.) создаются при помощи двух разных палитр: Элементы управления формы и Элементы ActiveX. Переход в среду VBA обеспечивает в первом случае команда Назначить макрос, а во втором — команда Просмотреть код (из контекстно-зависимого меню элемента управления). 18. Сохраните созданный документ с поддержкой макросов под именем Листинг_10.1_Диаграмма.xlsm. Э ЛЕКТРОННЫЙ АРХИВ Листинг 10.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_10_Диаграмма сопровождающего книгу электронного архива. Создание диаграммы с помощью VBA Для знакомства с объектами, методами и свойствами VBA, используемыми при создании диаграмм, создайте макрос VBA и постройте простую диаграмму.
Автоматизация диаграмм 329 1. Запустите Microsoft Excel 2019 и начните работать в новой книге. 2. На рабочем листе в ячейки А1:В5 введите данные в соответствии с рис. 10.5 (или другие аналогичные). 3. В среде VBA добавьте к проекту модуль и создайте в нем процедуру Диаграмма1. а б Рис. 10.5. (Часть 1 из 2) Диаграмма в Excel и VBA: а — диаграмма встроена в рабочий лист Лист1; б — диаграмма находится на отдельном листе диаграммы
330 Глава 10 в Рис. 10.5. (Часть 2 из 2) Диаграмма в Excel и VBA: в — значок листа Диаграмма1 в окне объектов Project - VBAProject П РИМЕЧАНИЕ Оказывается, построить диаграмму легко — необходимо только воспользоваться методом Charts.Add. 4. Между строками шаблона процедуры введите код программы создания диаграммы в соответствии с листингом 10.2, а. Листинг 10.2, а. Диаграмма, созданная с помощью VBA Sub Диаграмма1() Charts.Add ' Добавить диаграмму ActiveChart.ChartType = xlColumnClustered ActiveChart.SetSourceData _ Source:=Sheets("Лист1").Range("A1:B5"), _ PlotBy:=xlColumns ' Построение графика по столбцам ActiveChart.Location Where:=xlLocationAsObject, Name:="Лист1" 'Внедрена в_рабочий лист Лист1 'ActiveChart.Location Where:=xlLocationAsNewSheet 'Переместить на новый лист ActiveChart.HasLegend = True ' Отобразить легенду ActiveChart.Legend.Select Selection.Position = xlRight End Sub В этом примере источником данных для создания диаграммы является диапазон ячеек: Source:=Sheets("Лист1").Range("A1:B5"). Обратите внимание, что диаграмма будет встроенным объектом рабочего листа Лист1. Также можно поместить диаграмму на отдельный лист, содержащий только диаграмму. Для этого обязательному параметру Where метода ActiveChart.Location, который служит для перемещения диаграммы на новое место, укажите значение константы xlLocationAsNewSheet из перечисления XlChartLocation. Тогда созданная диаграмма будет перемещена на новый лист ДиаграммаN, где N — порядковый номер листа с диаграммой. 5. В редакторе VBA в окне кода установите курсор на одну из строк кода процедуры Sub Диаграмма1() и для запуска макроса нажмите кнопку панели инструментов Standard редактора VBA — как только макрос выполнится, на листе 1
Автоматизация диаграмм 331 рабочей книги появится диаграмма (рис. 10.5 а). Добавьте еще одну диаграмму на отдельный лист, указав соответствующую константу для метода ActiveChart. Location (рис. 10.5, б). При этом в редакторе VBA в окне объектов проекта появится значок листа с диаграммой в списке Microsoft Excel Objects (рис. 10.5, в). Ту же самую диаграмму можно построить, несколько изменив код программы и использовав оператор With (листинг 10.2, б). Листинг 10.2, б. Диаграмма, созданная с помощью VBA по заданному диапазону ячеек Range("A1:B5") с использованием оператора With Sub Диаграмма_с_VBA() With Charts.Add .ChartType = xlColumnClustered .SetSourceData Source:=Sheets("Лист1").Range("A1:B5"), _ PlotBy:=xlColumns .Location Where:=xlLocationAsObject, Name:="Лист1" End With End Sub 6. В редакторе VBA в окне кода установите курсор на одну из строк кода процеду. ры Sub Диаграмма_с _VBA() и нажмите кнопку запуска макроса 7. Выделите диаграмму, убедитесь, что она активна, и задайте ей название (листинг 10.2, в). Листинг 10.2, в. Заголовок диаграммы Sub Заголовок_диаграммы() With ActiveSheet.ChartObjects(1).Chart .HasTitle = True .ChartTitle.Text = "Гистограмма" End With End Sub End Sub Вот сколько операций можно выполнить с диаграммой! Кроме того, можно проверить наличие диаграммы на рабочем листе, если она на первый взгляд там отсутствует (листинг 10.2, г). Листинг 10.2, г. Поиск диаграммы на рабочем листе Sub Поиск_диаграммы() If ActiveSheet.ChartObjects.Count > 0 Then ActiveSheet.ChartObjects(1).Activate ' Выделить диаграмму End If End Sub
332 Глава 10 8. Для выполнения процедуры нажмите клавишу <F5>. Теперь мы знаем, как построить диаграмму на рабочем листе, где находятся исходные данные. Расположив диаграмму на отдельном листе, можно написать процедуру перехода на лист, содержащий диаграмму (листинг 10.2, д). Листинг 10.2, д. Переход на лист с диаграммой Sub Активизация_листа() Sheets("Диаграмма1").Activate End Sub 9. Для выполнения процедуры нажмите клавишу <F5>. 10. Сохраните созданный документ с поддержкой макросов под именем Листинг_10.2_ Диаграмма_созданная_VBA.xlsm. Коническая гистограмма Построим еще одну диаграмму типа конической гистограммы с помощью VBA, используя диапазон данных. 1. Запустите Microsoft Excel 2019 и создайте новую книгу. 2. На листе рабочей книги в ячейки А1:F6 введите данные в соответствии с рис. 10.6, а (или другие аналогичные). 3. Перейдите в среду VBA, нажав клавиши <Alt>+<F11>. 4. Добавьте к проекту модуль Module1 и создайте в нем процедуру Диаграмма_по_диапазону_ячеек. 5. На основании введенных данных постройте диаграмму (рис. 10.6, б), написав код программы с указанием диапазона ячеек Область (листинг 10.3, а). С ОВЕТ Поэкспериментируйте — постройте различные типы диаграмм, задавая не только значение ChartType = xlColumnClustered, но и другие, приведенные в табл. 10.1. Листинг 10.3, а. Пример конической гистограммы Private Sub Диаграмма_по_диапазону_ячеек() Dim Область As Range Set Область = Лист1.Range("A2:B6") Charts.Add 'Добавить диаграмму With ActiveChart .ChartType = xlConeCol .SetSourceData Source:=Область, PlotBy:=xlRows .HasTitle = True .ChartTitle.Text = Sheets("Лист1").Range("A1").Value End With End Sub
Автоматизация диаграмм 333 а б Рис. 10.6. Данные для построения диаграммы с помощью VBA (а) и построенная диаграмма (б) 6. Для выполнения процедуры выберите команду Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). Диаграмма будет создана и помещена на отдельный лист Диаграмма1. В НИМАНИЕ ! Обратите внимание, что в окне свойств Properties, отображаемом для выделенной пиктограммы диаграммы в окне проекта Project - VBA Project, диаграмма будет являться объектом типа Chart со свойством Name, равным Диаграмма1, а не Worksheet.
334 Глава 10 Если лист диаграммы имеет свойство Name (Имя), например Диаграмма1, то можно написать процедуру активизации этого листа диаграммы по ее имени (листинг 10.3, б). В листинге для нахождения диаграммы по заданному имени используются коллекция Charts, представляющая собой все листы с диаграммами активной рабочей книги, и ее свойство Charts.Name. Листинг 10.3, б. Переименование названия листа с диаграммой Sub Переименовать_диаграмму() Dim i As Integer For i = 1 To Charts.Count If Charts(i).Name = "Диаграмма1" Then Charts("Диаграмма1").Activate Charts("Диаграмма1").Name = " Коническая_гистограмма" 'Переименование листа с диаграммой End If Next i End Sub 7. Для выполнения процедуры установите курсор на листинге в окне редактора Visual Basic и нажмите клавишу <F5>. 8. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_10.3_ Диаграмма_по_области.xlsm. Печать диаграмм Продолжите работать с предыдущим примером — файлом Листинг_10.3_Диаграмма_ по_области.xlsm. Кроме диаграммы на отдельном листе, нам потребуется внедренная диаграмма. Добавьте ее в ручном режиме по данным листа 1. Рассмотрим способы печати диаграмм, внедренных в рабочий лист либо содержащихся на отдельных листах с диаграммами. И в том и другом случае для печати будет использоваться метод PrintOut. Так как мы не указали аргументы метода, то печать будет выполнена автоматически с настройками по умолчанию. Для изменения, например, типа принтера используйте раздел Печать (рис. 10.7). 1. Перейдите в среду VBA (<Alt>+<F11>), добавьте новый модуль Module2 и напишите процедуру печати всех внедренных диаграмм (листинг 10.4, а). Убедитесь, что Лист1 активный, т. к. внедренные объекты типа Диаграмма будут печататься с активного рабочего листа, в нашем случае будет напечатана одна диаграмма. Листинг 10.4, а. Процедура печати внедренных диаграмм активного рабочего листа Sub Печать_внедренных_диаграмм() Dim chtObj As ChartObject
Автоматизация диаграмм 335 For Each chtObj In ActiveSheet.ChartObjects chtObj.Chart.PrintOut Next chtObj End Sub 2. Для выполнения процедуры нажмите клавишу <F5>. Процедура печати всех диаграмм, размещенных на отдельных листах типа Chart, приведена в листинге 10.4, б. Листинг 10.4, б. Процедура печати диаграмм, размещенных на отдельных листах Sub Печать_диаграмм_размещенных_на_отдельных_листах() With ActiveWorkbook.Charts If .Count > 0 Then .PrintOut Else MsgBox "Диаграммы, размещенные на отдельных листах, отсутствуют" End If End With End Sub Рис. 10.7. Интерфейс печати
336 Глава 10 Запустите макрос на исполнение. Если диаграммы, размещенные на отдельных листах, отсутствуют, то после выполнения этой процедуры появится сообщение об ошибке. П РИМЕЧАНИЕ Если выполнить макрос печати при отключенном принтере, то появится соответствующее сообщение системы печати компьютера. Из самой книги Microsoft Excel 2019 диаграмму можно напечатать, вызвав команду Файл | Печать (рис. 10.7). Сохраните измененный документ под тем же именем: Листинг_10.3_Диаграмма_ по_области.xlsm. Удаление диаграммы При удалении диаграммы используются разные управляющие команды — в зависимости от того, является ли диаграмма внедренной или она размещается на отдельном листе. Процедура удаления внедренных диаграмм приведена в листинге 10.5, а. В коде используется обращение к объекту ChartObjects, представляющему собой все внедренные диаграммы активного рабочего листа. Листинг 10.5, а. Процедура удаления диаграмм, внедренных в активный рабочий лист Sub Удаление_внедренных_диаграмм() With ActiveSheet If .ChartObjects.Count > 0 Then .ChartObjects(1).Delete Else MsgBox "Диаграмма отсутствует" End If End With End Sub Процедура удаления диаграмм, размещенных на отдельных листах, приведена в листинге 10.5, б. Доступ к отдельным листам с диаграммой осуществляется при помощи коллекции ActiveWorkbook.Charts. Листинг 10.5, б. Процедура удаления диаграмм, размещенных на отдельных листах Sub Удаление_диаграмм_размещенных_на_отдельных_листах() Dim cht As Chart For Each cht In ActiveWorkbook.Charts cht.Delete Next cht End Sub
Автоматизация диаграмм 337 Процедура удаления всех объектов диаграмм на активном листе представлена в листинге 10.5, в. Листинг 10.5, в. Процедура удаления всех объектов диаграмм Sub Удалить_диаграммы() Dim chtObj As ChartObject For Each chtObj In ActiveSheet.ChartObjects chtObj.Delete Next chtObj End Sub Форматирование параметров диаграммы К параметрам диаграммы относятся легенда (свойство HasLegend), данные (свойство HasDataTable), название (свойство HasTitle) и т. п. Приведем пример форматирования параметров диаграммы с изменением их цветовых составляющих (листинг 10.6). 1. Создайте новый файл Microsoft Excel 2019. 2. На листе рабочей книги введите данные в соответствии с рис. 10.8. Рис. 10.8. Пример форматирования диаграмм
338 Глава 10 3. По одним и тем же данным постройте на листе четыре диаграммы разных типов: линейчатую, гистограмму, круговую и с областями. 4. На листе рабочей книги создайте командную кнопку из категории Элементы управления формы для управления форматированием диаграмм. Переименуйте ее в Форматирование цветов. 5. Как только вы закончите рисование кнопки, откроется диалоговое окно Назначить макрос объекту — в нем следует щелкнуть мышью по кнопке Создать. Выбор этой кнопки обеспечивает переход в окно редактора VBA и появление шаблона процедуры в только что автоматически созданном модуле Module1: Sub Кнопка1_Щелчок() End Sub 6. Между строками шаблона процедуры введите код программы в соответствии с листингом 10.6. Листинг 10.6. Процедура форматирования цветовых индексов диаграмм Sub Кнопка1_Щелчок() Dim bytRandom1 As Dim bytRandom2 As Dim bytRandom3 As Dim bytRandom4 As bytRandom1 bytRandom2 bytRandom3 bytRandom4 = = = = Rnd Rnd Rnd Rnd Byte Byte Byte Byte * * * * 56 56 56 56 'Линейчатая диаграмма With Worksheets(1).ChartObjects(1).Chart .SeriesCollection(1).Interior.ColorIndex = bytRandom1 .SeriesCollection(2).Interior.ColorIndex = bytRandom2 .SeriesCollection(3).Interior.ColorIndex = bytRandom3 .SeriesCollection(4).Interior.ColorIndex = bytRandom4 End With 'Гистограмма With Worksheets(1).ChartObjects(2).Chart .SeriesCollection(1).Border.ColorIndex = bytRandom1 .SeriesCollection(2).Border.ColorIndex = bytRandom2 .SeriesCollection(3).Border.ColorIndex = bytRandom3 .SeriesCollection(4).Border.ColorIndex = bytRandom4 End With 'Круговая диаграмма With Worksheets(1).ChartObjects(3).Chart.SeriesCollection(1) .Points(1).Interior.ColorIndex = bytRandom1
Автоматизация диаграмм 339 .Points(2).Interior.ColorIndex = bytRandom2 .Points(3).Interior.ColorIndex = bytRandom3 .Points(4).Interior.ColorIndex = bytRandom4 End With 'С областями With Worksheets(1).ChartObjects(4).Chart .SeriesCollection(1).Interior.ColorIndex = bytRandom1 .SeriesCollection(2).Interior.ColorIndex = bytRandom2 .SeriesCollection(3).Interior.ColorIndex = bytRandom3 .SeriesCollection(4).Interior.ColorIndex = bytRandom4 End With End Sub Доступ к параметрам рядов созданных диаграмм будет осуществляться через коллекцию SeriesCollection. К примеру, запись Chart.SeriesCollection(Index). Interior.ColorIndex означает, что в указанной диаграмме для ряда с индексом, заданным через номер либо название, будет устанавливаться новый цвет заливки. Аналогично осуществляется доступ к границам столбиков гистограммы и к секторам круговой диаграммы. В коде задействована встроенная функция VBA Rnd() из библиотеки математических функций, служащая для генерации случайных чисел в диапазоне от 0 до 1. 7. Перейдите из редактора VBA в приложение Microsoft Excel, щелкнув на кнопке панели инструментов View Microsoft Excel (Переход в Microsoft Excel) Standard (Стандартная) либо нажав сочетание клавиш <Alt>+<F11>. Нажмите на кнопку Форматирование цветов. Диаграммы будут отформатированы случайными цветами (см. рис. 10.8). 8. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_10.6_Форматирование_цветов.xlsm. Форматирование цветов поверхности Рассмотрим пример изменения цветов поверхности, задаваемой формулой: z = sin x sin y . Для этого на листе рабочей книги введите данные X и Y, формулу для расчета поверхности Z, постройте поверхность и внедрите на лист кнопку для управления изменением цвета поверхности (рис. 10.9). 1. Создайте новый файл Microsoft Excel 2019. 2. Введите: в ячейку B1 — значение 0; в C1 — 100; в D1 — 150. По двум выделенным ячейкам C1 и D1 выполните автозаполнение строки до значения 600 в ячейке M1.
340 Глава 10 Рис. 10.9. Изменение цвета поверхности 3. Введите: в ячейку А2 — значение 0; в А3 — 50. По двум выделенным ячейкам А2 и А3 выполните автозаполнение столбца до значения 1200 в ячейке А26. 4. Введите в ячейку В2 формулу =SIN(B$1)*SIN($A2). Выполните автозаполнение формулы сначала вниз до ячейки В26, потом направо до М26. 5. По выделенным ячейкам В2:М26 постройте поверхность с помощью команды Вставка | Рекомендуемые диаграммы. В открывшемся диалоговом окне Изменение типа диаграммы перейдите на вкладку Все диаграммы. Укажите категорию Поверхностная, тип Объемная поверхностная. 6. На листе рабочей книги создайте командную кнопку категории Элементы управления формы для управления легендой диаграммы. Переименуйте кнопку Кнопка1 в Изменить цвет диаграммы. 7. Сначала мы создадим процедуру изменения цвета поверхности в соответствии с листингом 10.7 в отдельном модуле Module1, а затем назначим этот макрос в качестве вызываемого по нажатию кнопки Изменить цвет диаграммы. Листинг 10.7. Код изменения цветов поверхности Sub Форматирование_поверхности() Dim chtLgdE As LegendEntries ' Элементы легенды Dim i As Integer
Автоматизация диаграмм 341 Set chtLgdE = Worksheets(1).ChartObjects(1).Chart _ .Legend.LegendEntries For i = 1 To chtLgdE.Count chtLgdE(i).LegendKey.Interior.ColorIndex = Rnd * 56 Next i Set chtLgdE = Nothing End Sub 8. В коде задействованы объекты LegendEntries и LegendKey. Вначале определяется количество элементов легенды из коллекции LegendEntries. Цвет диаграммы задается при помощи элементов легенды, которые состоят из двух частей (см. рис. 10.9): текстовой части элемента легенды и цветового маркера, ассоциируемого с рядом или линией тренда на диаграмме. За форматирование свойств цветового маркера и соответствующих им рядов отвечает объект LegendKey. 9. Перейдите из редактора VBA в приложение Microsoft Excel, щелкнув на кнопке View Microsoft Excel (Переход в Microsoft Excel) панели инструментов Standard (Стандартная) либо нажав сочетание клавиш <Alt>+<F11>. В режиме конструктора щелкните правой кнопкой мыши на кнопке Изменить цвет диаграммы, выберите команду Назначить макрос и в открывшемся диалоговом окне укажите макрос Форматирование_поверхности. 10. Запустите макрос на исполнение, нажав кнопку Изменить цвет диаграммы, — поверхность окрасится новыми цветами, определяемыми датчиком случайных чисел Rnd. 11. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_10.7_Изменение_цвета_диаграммы.xlsm. Добавление линии тренда С помощью диаграммы легко можно анализировать тренды и делать прогнозы. Все линии тренда, соответствующие тому или иному ряду, образуют семейство Trendlines, элементами которого являются объекты Trendline (Линия тренда). Семейство Trendlines имеет только два метода: Add, добавляющий новый элемент в семейство, и Item, возвращающий конкретный элемент семейства. Синтаксис метода Add семейства Trendlines: Trendlines.Add(Type, Order, Period, Forward, Backward, Intercept, _ DisplayEquation, DisplayRSquared, Name) где:  Type — устанавливает тип линии тренда. Допустимые значения: xlLinear (Ли- нейная), xlLogarithmic (Логарифмическая), xlExpontntial (Экспоненциальная), xlPolinomial (Полиномиальная), xlMovingAvg (Линейная фильтрация), xlPower (Степенная);
342 Глава 10  Order –– назначает порядок линии тренда. Допустимые значения: целые числа из интервала от 2 до 6. Используется, если аргумент Type принимает значение xlPolinomial;  Period — устанавливает период линии тренда. Допустимые значения: целое чис- ло больше 1 и меньше числа точек данных в ряде, по которым строится тренд. Используется, если аргумент Type принимает значение xlMovingAvg;  Forward — число периодов вперед (в будущее) для предсказания значений в со- ответствии с трендом;  Backward — число периодов назад (в прошлое) для предсказания значений в со- ответствии с трендом;  Intercept — находит отрезок, отсекаемый на оси линией линейной регрессии. Если этот аргумент опущен, то параметр автоматически устанавливается регрессией;  DisplayEquation — параметр, принимающий логические значения, показываю- щие необходимость отображения на диаграмме уравнения линии тренда;  DisplayRSquared — параметр, принимающий логические значения, показываю- щие необходимость помещения на диаграмме величины достоверности аппроксимации (R^2);  Name — строка, задающая название аппроксимирующей (сглаженной) кривой. Отметим, что все параметры являются необязательными. Рассмотрим пример добавления линии тренда. 1. Создайте новый файл Microsoft Excel 2019. 2. Введите исходные данные в соответствии с рис. 10.10, a. По введенным в ячейки А1:D5 данным постройте диаграмму с помощью команды Вставка | Диаграммы | Гистограмма. Щелкните правой кнопкой мыши по гистограмме и из контекстно-зависимого меню выберите команду Добавить линию тренда (рис. 10.10, б). Добавьте логарифмическую линию тренда. 3. На рабочем листе в режиме Элементы управления формы нарисуйте две кнопки с названиями: Добавить линии тренда и Удалить линии тренда (рис. 10.10, в), щелкните по каждой правой кнопкой мыши, вызовите команду Назначить макрос и напишите код добавления и удаления линии тренда (листинг 10.8). 4. В кодах введена переменная chtSC типа SeriesCollection, отвечающая за коллекцию из всех объектов типа Series для доступа к параметрам рядов созданных диаграмм. Для подсчета количества рядов данных используется свойство Count. Добавление линии тренда осуществляется при помощи метода Add, а удаление — методом Delete.
Автоматизация диаграмм 343 а Рис. 10.10. (Часть 1 из 2) Добавление линии тренда: а — контекстно-зависимое меню; б — формат линии тренда б
344 Глава 10 в Рис. 10.10. (Часть 2 из 2) Добавление линии тренда: в — кнопки управления линиями тренда Листинг 10.8. Код добавления и удаления линий тренда Sub Добавить_линии_тренда() Dim chtSC As SeriesCollection Dim i As Integer Dim x As Integer Set chtSC = Worksheets(1).ChartObjects(1).Chart.SeriesCollection For i = 1 To chtSC.Count With chtSC(i).Trendlines.Add .Type = xlLogarithmic ' Тип линии тренда .Border.Color = chtSC(i).Interior.Color ' Цвет линии тренда .Format.Line.Weight = 2.5 ' Толщина линии тренда End With Next i Set chtSC = Nothing End Sub
Автоматизация диаграмм 345 Sub Удалить_линии_тренда() Dim chtSC As SeriesCollection Dim i As Integer Dim x As Integer Set chtSC = Worksheets(1).ChartObjects(1).Chart.SeriesCollection For i = 1 To chtSC.Count For x = 1 To chtSC(i).Trendlines.Count chtSC(i).Trendlines(x).Delete Next x Next i Set chtSC = Nothing End Sub 5. Перейдите из редактора VBA в приложение Microsoft Excel (View Microsoft Excel (Переход в Microsoft Excel) либо <Alt>+<F11>). Проверьте работу кнопок управления. 6. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_10.8_Линия_тренда.xlsm. Геолокация Рассмотрим пример использования новой диаграммы для работы с географическими данными, появившейся в Microsoft Excel 2019. Так как построение карт возможно только при соединении с Интернетом, убедитесь, что доступ к нему у вас есть. Также необходимо использовать данные, подходящие для построения карт. Приложение Microsoft Excel автоматически работает с поисковой системой фирмы Microsoft под названием Bing. Географические данные требуется вводить в виде названий стран, городов, индексов. Лучше всего осуществляется работа на уровне визуализации стран на карте мира. С визуализацией городов по индексам дела обстоят сложнее, т. к. индексы, к примеру, в данной поисковой системе могут быть не идентифицированы или найдены с ошибкой. 1. Создайте новый файл в приложении. 2. Введите исходные данные в соответствии с рис. 10.11, а. 3. На рабочем листе книги создайте командную кнопку Создать диаграмму категории Элементы ActiveX для построения диаграммы и ее форматирования. 4. Дважды щелкните левой кнопкой мыши на кнопке Создать диаграмму и в открывшемся редакторе VBA в обработчике события по нажатию данной кнопки в окне кода введите код в соответствии с листингом 10.9. Листинг 10.9. Построение карты с размещением на новом листе Private Sub CommandButton1_Click() Application.ScreenUpdating = False Range("B1:C11").Select
346 Глава 10 а б Рис. 10.11. Построение географической карты: а — исходные данные; б — созданная диаграмма с заданным форматированием
Автоматизация диаграмм ActiveSheet.Shapes.AddChart2(494, xlRegionMap).Select ActiveChart.Location Where:=xlLocationAsNewSheet 'Разместить на отдельном листе With ActiveChart .ChartStyle = 495 .ChartTitle.Select .ChartTitle.Caption = "Численность населения по странам мира" .FullSeriesCollection(1).Select .FullSeriesCollection(1).RegionLabelOption = _ xlRegionLabelOptionsShowAll _ 'Отобразить название региона .ApplyDataLabels Type:=xlDataLabelsShowValue, LegendKey:=False 'Показать значения End With Application.ScreenUpdating = True End Sub 347 _ 5. Обратите внимание, что в коде обновление экрана управляется при помощи свойства Application.ScreenUpdating. Диаграмма в виде карты доступна для создания через объект Shapes и метод Shapes.AddChart2. Для сокращения длинных записей используется оператор With. Перейдите из редактора VBA в приложение Microsoft Excel (View Microsoft Excel (Переход в Microsoft Excel) или <Alt>+<F11>). На рабочем листе с исходными данными нажмите на кнопке Создать диаграмму. Результат работы макроса показан на рис. 10.11, б. 6. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_10.9_Геолокация.xlsm. Изменение прозрачности Рассмотрим пример изменения прозрачности диаграммы. 1. Создайте новый файл Microsoft Excel 2019. 2. По данным, введенным в ячейки А1:D5, постройте диаграмму с помощью команды Вставка | Диаграммы | Гистограмма (рис. 10.12, а). категории 3. На листе рабочей книги создайте командную кнопку Кнопка Элементы управления формы для изменения прозрачности диаграммы. Переименуйте кнопку в Изменение прозрачности. 4. Как только вы закончите рисование кнопки, откроется диалоговое окно Назначить макрос объекту — в нем следует щелкнуть мышью по кнопке Создать. Выбор этой кнопки обеспечивает переход в окно редактора VBA и появление шаблона макроса в автоматически созданном модуле Module1. Переименуйте процедуру в TransparentSeriesCollection() и напишите для нее соответствующий код (листинг 10.10).
348 Глава 10 а б Рис. 10.12. Изменение прозрачности диаграммы: а — первоначальный вид диаграммы; б — после изменения прозрачности
Автоматизация диаграмм 349 Листинг 10.10. Изменение прозрачности диаграммы Sub TransparentSeriesCollection() Dim chtS As Series For Each chtS In ActiveSheet.ChartObjects(1).Chart.SeriesCollection chtS.Format.Fill.Transparency = 0.3 ' Степень прозрачности Next chtS End Sub 5. Перейдите из редактора VBA в приложение Microsoft Excel (View Microsoft либо <Alt>+<F11>). Выйдите из режима Excel (Переход в Microsoft Excel) конструктора кнопки Изменение прозрачности и проверьте работу макроса VBA, выполняемого по нажатию элемента управления формы (рис. 10.12, б). 6. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_10.10_Прозрачность.xlsm. Красивые узоры В заключение этой главы рассмотрим формирование разноцветных узоров. 1. Создайте новый файл Microsoft Excel 2019. 2. Введите числа в соответствии с рис. 10.13, а (или аналогичные по усмотрению). 3. Постройте на Листе1 по этим исходным данным диаграмму с помощью команды Вставка | Диаграммы | С областями | Нормированная с областями и накоплением. категории 4. На листе рабочей книги создайте командную кнопку Кнопка Элементы управления формы для построения диаграммы при помощи макроса VBA. 5. Измените надпись на кнопке с Кнопка1 на Создать диаграмму с использованием контекстного меню. 6. Сначала мы напишем процедуру создания диаграммы Создание_узоров() в соответствии с листингом 10.11 в отдельном модуле Module1, а затем назначим этот макрос в качестве вызываемого по нажатию кнопки Создать диаграмму. Не забудьте использовать в начале окна кода оператор Option Explicit. Листинг 10.11. Генерирование диаграммы Sub Создание_узоров() On Error Resume Next ActiveSheet.ChartObjects.Delete With Charts.Add .ChartStyle = 281 .ChartType = xlAreaStacked100
350 Глава 10 а б Рис. 10.13. Исходные данные (а) и пример диаграммы с областями (б)
Автоматизация диаграмм 351 .SetSourceData Source:=Worksheets(1).UsedRange .Location Where:=xlLocationAsObject, Name:="Лист1" End With End Sub 7. Перейдите из редактора VBA в приложение Microsoft Excel (View Microsoft Excel (Переход в Microsoft Excel) либо <Alt>+<F11>). В контекстнозависимом меню кнопки управления выберите команду Назначить макрос и укажите в качестве исполняемого макрос Создание_узоров. Специально выделять диапазон данных для построения диаграммы не нужно. 8. Выйдя из режима конструктора, проверьте работу кнопки: диаграмма построена. Вот какие красивые рисунки получились (рис. 10.13, б)! Разместите диаграмму на отдельном листе. Для этого выделите ее, перейдите на вкладку Конструктор и в области Расположение нажмите на кнопку Переместить диаграмму. 9. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_10.11_Создание_узоров.xlsm.
352 Глава 10
ГЛАВА 11 Программирование объектов и событий VBA является языком программирования объектов и обработки событий. Объектов много, и событий много: открыть или закрыть книгу, нажать или отпустить кнопку мыши, создать или удалить файл и т. д. Объекты могут реагировать на события: на действия пользователя или другие внешние действия, например на щелчок мыши по кнопке. Программист в программном коде должен указать, что произойдет при возникновении этого события, т. е. написать код, который будет выполняться в ответ на событие, — процедуру обработки события. Основные действия пользователя, генерирующие вызов событий в программе:  запуск программы;  нажатие клавиши;  щелчок кнопкой мыши;  выход из программы. Для многих элементов управления общими являются следующие события:  Click — щелчок кнопкой мыши на объекте;  DblClick — двойной щелчок кнопкой мыши на объекте;  KeyPress — нажатие клавиши при условии, что объект находится в фокусе;  MouseDown — нажатие кнопки мыши при условии, что указатель мыши находится на объекте;  MouseMove — указатель мыши движется поверх объекта;  MouseUp — отпускается кнопка мыши при условии, что указатель мыши находит- ся на объекте.
354 Глава 11 Где и как создаются процедуры обработки событий? Важный момент для самого события — правильное размещение процедуры его обработки. Иначе событие может и не подчиниться обработке, если неизвестно, где находится процедура его обработки. Для каждой новой рабочей книги программы Microsoft Excel создается свой проект Project - VBAProject, в котором могут находиться пользовательские формы, модули и классы модулей (рис. 11.1, а). Для того чтобы выбрать список доступных событий для объекта Microsoft Excel ЭтаКнига, в редакторе VBA выполните двойной щелчок левой кнопкой мыши по одноименной пиктограмме в окне рис. 11.1, а и в открывшемся окне кода в левом а б Рис. 11.1. (Часть 1 из 2) Окно VBAProject с пользовательскими формами, модулями и классами модулей (а), список доступных событий для объекта Workbook (б)
Программирование объектов и событий 355 в Рис. 11.1. (Часть 2 из 2) Список доступных событий для объекта Worksheet (в) раскрывающемся списке Object укажите Workbook, а в списке Procedure — нужное событие. Тогда в окне кода будет автоматически помещена заготовка процедуры-обработчика события с доступными параметрами (рис. 11.1, б). Аналогично, чтобы выбрать список доступных событий для объекта Microsoft Excel Лист1, в редакторе VBA выполните двойной щелчок левой кнопкой мыши по одноименной пиктограмме в окне рис. 11.1, а и в открывшемся окне кода в левом раскрывающемся списке Object укажите Worksheet, а в списке Procedure — нужное событие. Тогда в окне кода будет автоматически помещена заготовка процедуры-обработчика события с доступными параметрами (рис. 11.1, в). Процедура для объекта ЭтаКнига Напишите программу, в которой в окне сообщения выводится определяемое свойством Name имя книги, открытой в Microsoft Excel (см. рис. 11.1). 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA, выбрав на вкладке ленты Разработчик раздел Visual Basic. На экране откроется окно интегрированной среды разработки приложений Microsoft Visual Basic - Книга 1. Можно также одновременно нажать клавиши <Alt>+<F11>. 2. Активизируйте в проекте Project - VBAProject объект ЭтаКнига, дважды щелкнув по нему мышью, и напишите код из листинга 11.1. Не забудьте использовать в начале окна кода оператор Option Explicit. Листинг 11.1. Процедура, созданная для объекта ЭтаКнига Private Sub Открытая_книга() MsgBox "В программе Microsoft Excel открыт файл ThisWorkbook.Name & """." End Sub """ & _
356 Глава 11 Убедитесь, что курсор мыши находится на одной из строк процедуры. Запустите процедуру на исполнение нажатием клавиши <F5>. Действительно, при запуске программы появляется сообщение об имени открытой книги (рис. 11.2). 3. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.1_Открытая_книга.xlsm. Для этого необходимо выбрать команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла выбрать вариант сохранения файла Книга Excel с поддержкой макросов. Рис. 11.2. Сообщение об имени открытой книги Э ЛЕКТРОННЫЙ АРХИВ Листинг 11.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_11_Программирование_объектов_и_событий сопровождающего книгу электронного архива. События, связанные с нажатием кнопок мыши Процедура в модуле Создадим процедуру, выполняющую закрашивание областей. 1. Создайте новый файл Microsoft Excel 2019. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 3. Создайте процедуру Заливка_цветом(), в которой используется пересечение цветовых диапазонов. Ее код приведен в листинге 11.2.
Программирование объектов и событий 357 Листинг 11.2. Процедура, созданная в модуле Sub Заливка_цветом() Dim S As Range Set S = Application.Intersect(Range("A1:C5"), Range("B2:D6")) Range("A1:C5").Interior.Color = vbYellow 'Цвет фона желтый Range("B2:D6").Interior.Color = vbGreen 'Цвет фона зеленый S.Interior.Color = vbRed 'Цвет пересечения End Sub 4. Для запуска макроса нажмите кнопку явятся закрашенные области (рис. 11.3). — при запуске макроса на листе по- В этом примере использовался метод Intersect, возвращающий объект типа Range, представляющий собой прямоугольное пересечение двух или более диапазонов. Рис. 11.3. Пример закрашенных областей 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.2_Пересечение_цветных_областей.xlsm. Событие для объекта Worksheet (Лист) 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>). 2. Активизируйте в проекте Project - VBAProject объект Лист1 (см. рис. 11.1, а), дважды щелкнув по нему мышью, и напишите код из листинга 11.3, используя при этом способ автоматического создания заготовки процедуры, проиллюстрированный на рис. 11.1, в. В этом коде применяется обработчик события Worksheet.SelectionChange, происходящего при изменении выделения ячеек для
358 Глава 11 рабочего листа. В результате работы процедуры при щелчках левой кнопкой мыши либо при выделении всего диапазона по ячейкам A1:F5 ячейки пересекающихся областей будут закрашиваться красным цветом. Листинг 11.3. Процедура с обработчиком события Worksheet.SelectionChange Private Sub Worksheet_SelectionChange(ByVal Target As Range) Set Target = Intersect(Target, Range("A1:F5")) 'Результат пересечения If Target Is Nothing Then Exit Sub Else Target.Interior.Color = vbRed ' Закрасить красным End If End Sub 3. Сохраните созданный документ с поддержкой макросов под именем Листинг_11.3_ Изменение_выделения.xlsm. Ключевое слово ByVal и параметр Target Ключевое слово ByVal, используемое далее во встроенных процедурах для обработчиков событий рабочего листа Worksheet либо рабочей книги Workbook, определяет передачу параметра в процедуру по значению. Параметр Target в обработчике события — это объект, в котором произошло само событие (например, тот или иной диапазон ячеек). 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>). Активизируйте в проекте Project - VBAProject объект Лист1 (см. рис. 11.1, а), дважды щелкнув по нему мышью. 2. Напишите процедуру со встроенным названием Worksheet_BeforeRightClick(ByVal Target As Range), где обработчик события Worksheet.BeforeRightClick выполняется до щелчка перед нажатием правой кнопки мыши. В нашем случае эта процедура генерирует появление сообщения при щелчке правой кнопкой мыши по любой ячейке на листе (листинг 11.4). Используйте при этом способ автоматического создания заготовки процедуры, проиллюстрированный на рис. 11.1, в. Листинг 11.4. Пример генерации сообщения при щелчке правой кнопкой мыши по любой ячейке рабочего листа Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _ Cancel As Boolean) Cancel = True MsgBox "Привет, МИР!" End Sub 3. Щелкните правой кнопкой мыши по любой ячейке на листе Лист1 (рис. 11.4). Появится информационное сообщение.
Программирование объектов и событий 359 Рис. 11.4. Пример появления сообщения при щелчке правой кнопкой мыши по любой ячейке на листе 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.4_Щелчок_правой_кнопкой_мыши.xlsm. Очистка ячейки 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>). Активизируйте в проекте Project - VBAProject объект Лист1 (см. рис. 11.1, а), дважды щелкнув по нему. 2. Используйте встроенную процедуру Worksheet_Change(ByVal Target As Range), осуществляющую обработку события Worksheet.Change, которое происходит при изменении ячеек рабочего листа пользователем либо при помощи внешней ссылки. В нашем случае процедура очищает введенное в ячейку А1 значение и ее цвет при выполнении заданного условия: если вводится любая информация, но не число, равное 10 (листинг 11.5). При этом сначала выводится предупреждение об очистке ячейки, а потом информация стирается. Листинг 11.5. Пример очистки ячейки при заданном изменении на рабочем листе Private Sub Worksheet_Change(ByVal Target As Range) 'Обработка события изменения ячеек рабочего листа Application.EnableEvents = False If Range("A1").Value <> 10 Then MsgBox "Информация будет удалена!" Range("A1").Clear End If Application.EnableEvents = True End Sub
360 Глава 11 3. Поэкспериментируйте с ячейкой А1 — вводите любое значение, не равное 10 и равное 10. 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.5_Событие_Worksheet.Change.xlsm. Свойства ScrollRow и ScrollColumn Свойства ScrollRow и ScrollColumn возвращают или устанавливают номер строки и столбца левого верхнего угла рабочего окна. С помощью этих свойств мы поместим выделенный диапазон данных в левый верхний угол. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>). Активизируйте в проекте Project - VBAProject объект Лист1, дважды щелкнув по нему мышью. 2. Для объекта Лист1 напишите код обработчика события Worksheet.SelectionChange, происходящего при изменении выделения на листе с использованием встроенной процедуры Worksheet_SelectionChange(ByVal Target As Range) (листинг 11.6). Применяйте при этом способ автоматического создания заготовки процедуры, проиллюстрированный на рис. 11.1, в. В результате работы кода, если выделить область где-то на рабочем листе, она буквально "отскочит" в левый верхний угол. Листинг 11.6. Пример возврата в левый верхний угол при изменении выделения на рабочем листе Private Sub Worksheet_SelectionChange(ByVal Target As Range) With ActiveWindow .ScrollRow = Target.Row .ScrollColumn = Target.Column End With End Sub 3. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.6_Скачок_в_угол.xlsm. События активации и деактивации События Worksheet.Activate и Worksheet.Deactivate относятся к рабочей книге и могут происходить при активации/деактивации рабочей книги, рабочего листа, листа с диаграммой либо встроенной диаграммой. Свойство приложения ActiveWindow Свойство приложения Application.ActiveWindow возвращает объект Window, представляющий собой активное окно.
Программирование объектов и событий 361 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>). Активизируйте в проекте Project - VBAProject объект ЭтаКнига, дважды щелкнув по нему мышью. 2. Напишите процедуру Изменение_размеров_окна(), после выполнения которой активное окно (а вместе с ним и вся рабочая книга) уменьшится по заданным ширине и высоте и сместится на экране относительно верха и левого края (листинг 11.7). Для свойства WindowState здесь устанавливается состояние рабочего окна при помощи одной из констант перечисления XlWindowState. Листинг 11.7. Пример изменения размеров окна Private Sub Изменение_размеров_окна() With ActiveWindow .WindowState = xlNormal .Top = 60 .Left = 60 .Height = 400 .Width = 400 End With End Sub 3. Воспользуйтесь для запуска макроса кнопкой уменьшилась. и убедитесь, что рабочая книга 4. Для того чтобы установить максимально возможный размер окна (на весь экран), следует задать для свойства WindowState значение xlMaximized (листинг 11.8). Листинг 11.8. Пример установки полноэкранного режима окна приложения Private Sub Полноэкранный_режим() ActiveWindow.WindowState = xlMaximized End Sub 5. Воспользуйтесь для запуска макроса кнопкой и убедитесь, что рабочая книга с активным рабочим окном занимает весь экран. 6. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.7_Листинг_11.8_Изменение_размеров_окна.xlsm. Активный лист 1. Создайте в Microsoft Excel новую рабочую книгу. По умолчанию в ней один лист. Добавьте еще шесть листов и переименуйте их в соответствии с названиями дней недели.
362 Глава 11 2. Напишите для объекта ЭтаКнига процедуру, в которой переменной b присваивается номер текущего дня недели. В цикле сравнения активным становится тот лист, номер которого на единицу меньше номера текущего дня недели, если считать первым днем недели воскресенье (листинг 11.9). Фактически происходит переход на лист, название которого совпадает с текущим днем недели. Листинг 11.9. Пример нахождения активного листа по дню недели Private Sub Активный_лист() Dim b As Byte b = Weekday(Date) If b > 1 Then Worksheets(b - 1).Activate Else Worksheets(7).Activate End If End Sub Если сегодня, например, пятница, то активным листом станет лист с названием ПТ (рис. 11.5). Рис. 11.5. Пример активного листа ПТ 3. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.9_Листинг_11.18_Дни_недели.xlsm. Число обращений к макросу 1. Создайте в Microsoft Excel новую рабочую книгу и напишите процедуру для объекта Лист1 (листинг 11.10), после выполнения которой каждый раз в ячейке А1 значение увеличивается на единицу и появляется информационное окно (рис. 11.6), сообщающее число обращений к макросу в соответствии с новым значением ячейки.
Программирование объектов и событий 363 Рис. 11.6. Пример подсчета числа обращений к макросу Листинг 11.10. Пример подсчета обращений к макросу Private Sub Подсчет_обращений_к_макросу() Range("A1").Value = Range("A1").Value + 1 MsgBox "К макросу обращались " & _ Range("A1").Value & " раз!" End Sub 2. Для запуска макроса нажмите кнопку . 3. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.10_Листинг_11.11_Подсчет_обращений_к_макросу.xlsm. Управление выделением области 1. Продолжите работу с книгой предыдущего примера и напишите новую процедуру для объекта Лист1, содержащую макрос, управляющий выделением области при помощи свойства рабочего листа Worksheet.ScrollArea (листинг 11.11). При попытке выделить любую область макрос будет ограничивать выделение, разрешая выделить только область в пределах границ, указанных в макросе, — в нашем случае это ячейки диапазона A1:H10. Листинг 11.11. Пример выделения в пределах границ, указанных в макросе Private Sub Ограничение_выделения() Worksheets(1).ScrollArea = "A1:H10" End Sub 2. Для запуска макроса нажмите кнопку .
364 Глава 11 3. Сохраните этот документ с поддержкой макросов под тем же именем Листинг_11.10_Листинг_11.11_Подсчет_обращений_к_макросу.xlsm. События Activate и Deactivate рабочего листа 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>). 2. Создайте в книге еще несколько листов, чтобы можно было из чего выбирать. 3. Двойным щелчком мыши активизируйте в проекте Project - VBAProject объект Лист1 (см. рис. 11.1, а) и напишите для него код активации листа (листинг 11.12) и код деактивации листа (листинг 11.13), используя при этом способ автоматического создания заготовки процедуры (см. рис. 11.1, в). Листинг 11.12. Пример кода активации листа Private Sub Worksheet_Activate() Me.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Value = Now End Sub Листинг 11.13. Пример кода деактивации листа Private Sub Worksheet_Deactivate() Me.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Now End Sub Переход с одного листа на другой сразу фиксируется (рис. 11.7). Обратите внимание в этих процедурах на свойство Offset, при помощи которого надпись смещается на строку ниже. События активации и деактивации листа Рис. 11.7. Пример активации и деактивации листа
Программирование объектов и событий 365 контролируются ключевым словом Me, которое реагирует на событие щелчка мышью по ярлычку листа. 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.12_Листинг_11.13_Активация_листа.xlsm. Двойной щелчок левой кнопкой мыши 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>). 2. Двойным щелчком мыши активизируйте в своем проекте Project - VBAProject объект Лист1 (см. рис. 11.1) и напишите для него обработчик события Worksheet.BeforeDoubleClick на основе встроенной процедуры Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) (листинг 11.14). Событие Worksheet.BeforeDoubleClick относится к событиям рабочего листа Worksheet и происходит до действия, принятого по умолчанию при двойном щелчке левой кнопкой мыши на ячейках. Для создания процедуры используйте способ автоматического создания ее заготовки (см. рис. 11.1, в). Листинг 11.14. Пример управления событием "двойной щелчок левой кнопкой мыши" Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Range, Cancel As Boolean) With Cells(Rows.Count, ActiveCell.Column).End(xlUp) If .Value = "" Then .Select Else .Offset(1, 0).Select End If End With End Sub Рис. 11.8. Пример перехода на ячейку F5 при двойном щелчке по ячейке F2
366 Глава 11 3. Перед запуском макроса введите на Лист1 информацию, например слово ТЕСТ. Если дважды щелкнуть левой кнопкой мыши по любой ячейке, расположенной на рабочем листе Лист1, то происходит переход на первую пустую ячейку столбца, следующую за последней заполненной в столбце (рис. 11.8). 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.14_Двойной_щелчок_мыши.xlsm. Щелчок правой кнопкой мыши 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ <F11>). 2. Активизируйте в своем проекте Project - VBAProject объект Лист1 (см. рис. 11.1, а), дважды щелкнув по нему, и напишите для него процедуру Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _ Cancel As Boolean) которая реагирует на событие Worksheet.BeforeRightClick, т. е. на нажатие правой кнопки мыши (листинг 11.15). Событие Worksheet.BeforeRightClick происходит до предопределенного по умолчанию действия по нажатию правой кнопкой мыши на ячейках рабочего листа. Листинг 11.15. Пример управления событием "щелчок правой кнопкой мыши" Private Sub Worksheet_BeforeRightClick _ (ByVal Target As Range, Cancel As Boolean) Cancel = True Application.Dialogs(xlDialogFunctionWizard).Show ' Вызов диалогового _ окна Вставка функции End Sub Щелчок правой кнопкой мыши по любой ячейке на объекте Лист1 активизирует появление знака "равно" в ячейке и открытие диалогового окна Вставка функции. 3. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.15_Щелчок_правой_кнопкой_мыши.xlsm. Введите пароль 1. Создайте новый файл Microsoft Excel 2019 с двумя рабочими листами: Лист1 и Лист2. Перейдите в среду VBA (<Alt>+<F11>). 2. Двойным щелчком активизируйте в своем проекте Project - VBAProject объект Лист1 (см. рис. 11.1, а) и напишите для него процедуру Лист_с_паролем(), которая скрывает на листе столбцы от A до D при запуске процедуры. Также столбцы могут быть автоматически скрыты либо при переходе пользователем на дру-
Программирование объектов и событий 367 гой рабочий лист, т. е. при возникновении события деактивации рабочего листа. Отобразить заново столбцы можно при вводе правильного пароля VBA при выполнении процедуры Лист_с_паролем() (листинг 11.16) (рис. 11.9). Рис. 11.9. Пример ввода пароля 3. Встроенная процедура Worksheet_Deactivate() является обработчиком события Worksheet.Deactivate, происходящего, если Лист1 становится неактивным. Как видно из кода листинга 11.16, при переходе на другой лист происходит скрытие обозначенных столбцов. Листинг 11.16. Пример листа с паролем Private Sub Лист_с_паролем() Dim strPassword As String Columns("A:D").Hidden = True strPassword = InputBox("Введите пароль!") If strPassword = "VBA" Then Columns("A:D").Hidden = False Else Worksheets(1).Activate End If End Sub Private Sub Worksheet_Deactivate() Columns("A:D").Hidden = True End Sub 4. Перейдите с одного листа на другой и посмотрите, скрыты ли на листе Лист1 столбцы с A по D. 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.16_Пароль.xlsm.
368 Глава 11 Событие закрытия книги 1. Откройте любую книгу, например Листинг_11.2_Пересечение_цветных_областей.xlsm. 2. Перейдите в среду VBA (<Alt>+<F11>). 3. Двойным щелчком курсора мыши активизируйте в проекте Project VBAProject объект ЭтаКнига (см. рис. 11.1, а) и напишите код встроенной процедуры Workbook_BeforeClose(Cancel As Boolean) из листинга 11.17, в ходе выполнения которой перед закрытием файла (при наступлении события Workbook.BeforeClose) он будет автоматически сохраняться без генерации диалогового окна сохранения файла. Используйте при этом способ автоматического создания заготовки процедуры (см. рис. 11.1, в). Листинг 11.17. Процедура автоматического сохранения файла при его закрытии Private Sub Workbook_BeforeClose(Cancel As Boolean) With Me If .Saved = False Then .Save End If End With End Sub При закрытии книги сообщение о сохранении изменений не появляется, и книга сохраняется автоматически. Событие сохранения книги 1. Откройте любую книгу, например Листинг_11.9_Листинг_11.18_Дни_недели.xlsm. 2. Перейдите в среду VBA (<Alt>+<F11>). 3. Активизируйте в проекте Project - VBAProject объект ЭтаКнига (см. рис. 11.1), щелкнув по нему дважды, и напишите код встроенной процедуры Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) для события рабочей книги Workbook.BeforeSave, выполняющегося до того, как рабочая книга сохранена при помощи команды Файл | Сохранить (листинг 11.18). При выполнении этой процедуры в ячейке А1 будет выведена дата последнего сохранения файла (рис. 11.10). Используйте при этом способ автоматического создания заготовки процедуры с обработчиком событий для рабочей книги (см. на рис. 11.1, б). Не забывайте указать в начале окна кода оператор Option Explicit.
Программирование объектов и событий 369 Рис. 11.10. Пример сообщения о последнем сохранении книги Листинг 11.18. Процедура записи времени последнего сохранения книги Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Worksheets(2).Range("A1") = "Последнее сохранение книги: " & Now End Sub 4. Сохраните этот документ с поддержкой макросов в том же файле.
370 Глава 11
ГЛАВА 12 Операторы даты и времени В этой главе мы научимся работать с датами, временем и календарем. Существует несколько форматов вывода дат. VBA, конечно же, поддерживает американский стандарт времени, в котором в дате сначала указывается месяц, потом день, а затем год. Русский и немецкий стандарты формата времени сначала указывают день, потом месяц, а затем год. Различаются также форматы вывода дополуденного и послеполуденного времени. Вывод даты и времени в окно Immediate оператором Debug.Print 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>). Активизируйте в проекте Project - VBAProject объект Лист1, дважды щелкнув по нему мышью. 2. Для объекта Лист1 напишите код (листинг 12.1). Не забудьте использовать в начале окна кода оператор Option Explicit. 3. Начнем с того, что просто посмотрим, как в окне отладки, вызываемом командой View | Immediate Window (Вид | Окно отладки), при выполнении оператора Debug.Print записываются заданные дата и время, дополуденное и послеполуденное. Окно Immediate (Окно отладки) также можно вызвать, одновременно нажав клавиши <Ctrl>+<G>. Листинг 12.1. Корректная запись даты Sub Корректная_запись_даты() Debug.Print #3/5/2019# Debug.Print #8:15:00 AM# Debug.Print #8:15:00 PM# End Sub
372 Глава 12 4. Для запуска макроса нажмите кнопку — в окне Immediate (Окно отладки) появится ряд чисел, соответствующих текущему формату даты/времени: 05.03.2019 8:15:00 20:15:00 В НИМАНИЕ ! Обратите внимание, что в программе дата и время окружены знаками решетки (#). Так называемый литерал даты #3/5/2019# интерпретируется VBA как дата в формате месяц-день-год, независимо от установок даты, принятых в используемой операционной системе. Запись даты в виде литерала позволяет добиться большей совместимости с локализованными языками. 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_12.1-Листинг_12.10_Дата_и_время.xlsm. Для этого выберите команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла укажите вариант сохранения файла Книга Excel с поддержкой макросов. Э ЛЕКТРОННЫЙ АРХИВ Листинги 12.1–12.10, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_12_Даты сопровождающего книгу электронного архива. Печать даты и времени с помощью функции CDate Продолжите работу с файлом из предыдущего примера. Точно так же заданные заранее дату и время можно вывести на экран с помощью функции CDate, относящейся к функции преобразования типов данных (листинг 12.2). Эта функция преобразует выражение в тип Date. В коде в качестве аргумента функции дата записана в кавычках. Листинг 12.2. Команда CDate Sub Дата_и_время() Debug.Print CDate("31.12.2019") Debug.Print CDate("20:15") End Sub В окне Immediate (Окно отладки) появятся дата и время: 31.12.2019 20:15:00 Сохраните этот документ под тем же именем: Листинг_12.1-Листинг_12.10_Дата_ и_время.xlsm. Для этого выберит команду Файл | Сохранить.
Операторы даты и времени 373 Функции DateSerial и TimeSerial Продолжите работу с файлом из предыдущего примера. Заранее заданные дату и время можно вывести с помощью функций DateSerial и TimeSerial (листинг 12.3), указывая конкретные значения: Day (день), Month (месяц), Year (год), Second (секунда), Minute (минута) и Hour (час). Листинг 12.3. Команды DateSerial и TimeSerial Sub Дата_и_время_заданные() Debug.Print DateSerial(2019, 12, 31) Debug.Print TimeSerial(20, 15, 0) Debug.Print DateSerial(Day:=5, Month:=8, Year:=1984) Debug.Print TimeSerial(Second:=20, Minute:=35, Hour:=7) End Sub В окне Immediate (Окно отладки) появится ряд чисел: 31.12.2019 20:15:00 05.08.1984 7:35:20 Сохраните этот документ под тем же именем: Листинг_12.1-Листинг_12.10_Дата_ и_время.xlsm. Текущие дата и время Продолжите работу с тем же файлом. Дату и время, представленные в формате системных часов и календаря, можно посмотреть с помощью двух функций: Date и Time (листинг 12.4). Листинг 12.4. Функции Date и Time Sub Дата_и_время_системные() Debug.Print Date Debug.Print Time End Sub В окне Immediate (Окно отладки) появится ряд значений, отражающих системные дату и время, например: 05.01.2020 17:50:01 Сохраните этот документ под тем же именем: Листинг_12.1-Листинг_12.10_Дата_ и_время.xlsm.
374 Глава 12 Текущие дата и время с учетом минут и секунд Продолжите работу с тем же файлом. Текущие дату и время, представленные в формате системных часов и календаря, можно детально посмотреть с помощью функций Day, Month, Year, Hour, Minute и Second, уточнив соответственно день, месяц, год, час, минуту и секунду текущего времени (листинг 12.5). Листинг 12.5. Функции Day, Month, Year, Hour, Minute и Second Sub Текущее_время() Debug.Print Day(Date) Debug.Print Month(Date) Debug.Print Year(Date) Debug.Print Hour(Time) Debug.Print Minute(Time) Debug.Print Second(Time) End Sub ' ' ' ' ' ' День Месяц Год Часы Минуты Секунды В окне Immediate (Окно отладки) появится ряд значений, отражающих настоящее время, например: 4 5 2020 17 50 49 Сохраните этот документ под тем же именем: Листинг_12.1-Листинг_12.10_Дата_ и_время.xlsm. Функция Weekday — день недели Продолжите работу с тем же файлом. День недели заданной даты можно узнать с помощью функции рабочего листа WorksheetFunction.Weekday. Функция имеет следующий синтаксис: Weekday(Date, [FirstDayOfWeek]) где аргумент Date — обязательный параметр, дата, день недели которой необходимо определить; аргумент FirstDayOfWeek — необязательный параметр, указывающий первый день недели при помощи одной из констант VbDayOfWeek. Напомним, что по умолчанию используется константа vbSunday, т. е. первый день недели — воскресенье. Адаптируем функцию под начало недели — понедельник. Для этого напишем процедуру День_недели() (листинг 12.6). Обратите внимание, что дата задана в формате месяц/день/год и заключена в символы #.
Операторы даты и времени 375 Листинг 12.6. Применение функции рабочего листа WorksheetFunction.Weekday Sub День_недели() Dim bytWeekday As Byte bytWeekday = Weekday(#5/4/2020#, vbMonday) Select Case bytWeekday Case 1 Debug.Print "Понедельник" Case 2 Debug.Print "Вторник" Case 3 Debug.Print "Среда" Case 4 Debug.Print "Четверг" Case 5 Debug.Print "Пятница" Case 6 Debug.Print "Суббота" Case 7 Debug.Print "Воскресенье" End Select End Sub В окне Immediate (Окно отладки) появится название дня недели заданного числа, например 4 мая 2020 это: Понедельник. Функция Weekday принимает значения в соответствии с целыми числами от 0 до 7. В США первым днем недели считается воскресенье (а у нас — понедельник), поэтому значение 1 соответствует воскресенью. Параметр VbDayOfWeek может принимать следующие значения: vbSunday — воскресенье, vbMonday — понедельник, vbTuesday — вторник, vbWednesday — среда, vb vbThursday — четверг, vbFriday — пятница, vbSaturday — суббота, vbUseSystemDayOfWeek — использование NLS APIустановок. Сохраните этот документ под тем же именем: Листинг_12.1-Листинг_12.10_Дата_ и_время.xlsm. Функция Format Продолжите работу с тем же файлом. По желанию дату можно отформатировать в соответствии с заданным форматом с помощью функции Format (листинг 12.7). Листинг 12.7. Функция Format Sub Форматирование_даты() Debug.Print Format(#6/4/2020#, "mmmm") & " " & _ Format(#6/4/2020#, "dddd") End Sub
376 Глава 12 В окне Immediate (Окно отладки) появится название месяца и дня недели заданного числа, например, в данном случае: Июнь четверг. Перечень доступных параметров функции Format приведен в табл. 12.1. Таблица 12.1. Параметры форматирования функции Format Параметр Описание s Секунда без нулей (0–59) ss Секунда с нулями (00–59) n Минута без нулей (0–59) nn Минута с нулями (00–59) h Час без нулей (0–23) hh Час с нулями (00–23) ttttt Полностью записанное время (08:15:30) d День без нулей (1–31) dd День с нулями (01–31) ddd День в коротком формате (Вс, Пн, Вт, Ср, Чт, Пт, Сб) dddd День в полном формате (Воскресенье, Суббота) ddddd Полностью записанная дата цифрами (01.01.2020) dddddd Полностью записанная дата словами (5 Август 2020 г.) w Номер дня недели (воскресенье — 1, ..., суббота — 7) ww Номер календарной недели (1–53) m Месяц цифрами без нулей (1–12) mm Месяц цифрами с нулями (01–12) mmm Месяц в коротком формате (янв, фев, ..., дек) mmmm Полностью записанный месяц (январь, ..., декабрь) q Квартал, записанный цифрами (1–4) y Календарный день (1–366) yy Год в коротком формате (00–99) yyy Год в полном формате (000–9999) Сохраните этот документ под тем же именем: Листинг_12.1-Листинг_12.10_Дата_ и_время.xlsm.
Операторы даты и времени 377 Функция DateDiff Продолжите работу с тем же файлом. С помощью функции DateDiff можно определить разность двух дат (листинг 12.8). Аргументы функции записываются в круглых скобках через запятые с использованием кавычек и знака решетки. Листинг 12.8. Функция DateDiff Sub Отсчет_времени() Debug.Print DateDiff("yyyy", Date, #12/31/2019#) & " лет" Debug.Print DateDiff("m", Date, #12/31/2019#) & " месяцев" Debug.Print DateDiff("ww", Date, #12/31/2019#) & " недель" Debug.Print DateDiff("d", Date, #12/31/2019#) & " дней" End Sub В окне Immediate (Окно отладки) появятся данные, показывающие количество лет, месяцев, недель, дней, которые отделяют текущую системную дату от заданной (рис. 12.1). Сохраните этот документ под тем же именем: Листинг_12.1-Листинг_12.10_Дата_ и_время.xlsm. Для этого необходимо выбрать команду Файл | Сохранить. Рис. 12.1. Время, отделяющее текущую дату от заданной Функция DatePart 1. Продолжите работу с тем же файлом. 2. Добавьте к проекту модуль Module1 с помощью команды Insert | Module (Вставить | Модуль).
378 Глава 12 3. Напишите процедуру Определить_год(), из которой вызывается внешняя функция Year (листинг 12.9), содержащая в коде встроенную VBA-функцию DatePart для определения указанной составляющей даты (в нашем случае — квартала). Листинг 12.9. Определение года указанной даты Public Sub Определить_год() MsgBox "Дата относится к " & Year("8.03") & " году" End Sub Public Function Year(Date1) Year = DatePart("yyyy", Date1) ' yyyy - год End Function 4. Так как выражение Year("8.03") использует запись даты в двойных кавычках без указания года, то год будет вставляться каждый раз автоматически в виде текущего при вычислении выражения с датой. Этот прием позволяет использовать код в разные годы. 5. Для запуска макроса нажмите кнопку — после выполнения макроса будет найдено, что указанная дата относится к текущему году. 6. Сохраните этот документ под тем же именем Листинг_12.1-Листинг_12.10_Дата_ и_время.xlsm. Функция WeekdayName 1. Продолжите работу с тем же файлом. 2. На вставленном вами модуле Module2 введите код процедуры Определение_дня_недели, в которой вызывается внешняя функция День_недели (листинг 12.10). В ней используется VBA-функция WeekdayName, которая возвращает строку, содержащую полное или сокращенное название дня недели. Листинг 12.10. Пример использования функции WeekdayName Public Sub Определение_дня_недели() MsgBox "День недели 01.09.2019 End Sub " & День_недели("01.09.2019") Public Function День_недели(n) День_недели = WeekdayName(Weekday(n, vbUseSystemDayOfWeek), False) 'False - полное название дня недели, True - сокращенное End Function 3. Для запуска макроса нажмите кнопку воскресенье. . Здесь определено, что 01.09.2019 —
Операторы даты и времени 379 4. Сохраните этот документ под тем же именем: Листинг_12.1-Листинг_12.10_Дата_ и_время.xlsm. Вывод сообщения на 3 секунды Интересно сгенерировать сообщение, которое будет существовать заданное время и затем автоматически исчезать. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. 2. Напишите процедуру (листинг 12.11), при запуске которой сообщение появляется не с помощью функции MsgBox, а благодаря объекту, объявленному инструкцией: Dim objMSR As Object и создаваемому функцией CreateObject: objMSR = CreateObject("WScript.Shell") Сообщение показывается на экране 3 секунды (рис. 12.2), а потом исчезает. Рис. 12.2. Сообщение, появляющееся на 3 секунды Листинг 12.11. Вывод сообщения на 3 секунды Sub Сообщение_на_3_секунды () Dim objMSR As Object Dim intPopUp As Integer
380 Глава 12 Set objMSR = CreateObject("WScript.Shell") intPopUp = objMSR.Popup("Три секунды", 3) End Sub 3. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_12.11_Сообщение_на_3_секунды.xlsm. Метод Application.OnTime Мы помним, что объект Application — это главный объект в иерархии объектов Excel, представляющий само приложение Excel. Объект Application имеет огромное число свойств и методов. Один из таких методов — Application.OnTime, назначающий выполнение процедуры на определенное время. Синтаксис метода: OnTime(EarliestTime, Procedure, LatestTime, Schedule) где:  EarliestTime — время запуска процедуры; обязательный параметр;  Procedure — имя запускаемой процедуры; обязательный параметр;  LatestTime — если на момент запуска процедуры Excel не может ее запустить в силу того, что он выполняет другое действие, то LatestTime назначает самое позднее время ее запуска. Если при наступлении этого времени Excel не может запустить процедуру, то она не будет запущена вообще. Если этот аргумент опущен, то Excel будет ждать до тех пор, пока не сможет выполнить эту процедуру. Необязательный параметр;  Schedule — значение параметра True задает выполнение новой процедуры OnTime, а значение False удаляет предварительно установленные настройки процедуры. Необязательный логический параметр. Рассмотрим пример. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль Module1. 2. Напишите состоящую из четырех процедур программу, в которой используется метод Application.OnTime (листинг 12.12). Листинг 12.12. Пример использования метода Application.OnTime Sub Цените_время() Application.OnTime TimeValue("22:44:30 pm"), "Текущее_время" End Sub Sub Текущее_время() MsgBox Time & " Текущее время" End Sub
Операторы даты и времени 381 Sub Процедура_вызова() Application.OnTime Now + TimeValue("00:00:05"), "Моя_процедура" ' Запуск процедуры Моя_процедура() через 5 секунд End Sub Sub Моя_процедура() MsgBox Time End Sub 3. Для запуска макроса нажмите кнопку . В первой процедуре используется функция TimeValue. В ней указывается конкретное время выполнения процедуры Текущее_время(). Вторая процедура с выводом сообщения (рис. 12.3) использует функцию Time без аргументов — она выдает текущее время, ориентируясь на системные часы компьютера. Рис. 12.3. Сообщение, появляющееся с использованием метода Application.OnTime В третьей процедуре применяется конструкция Now + TimeValue, вызывающая процедуру Моя_процедура() через указанное время с настоящего момента времени. Последняя процедура Моя_процедура() выдает сообщение о текущем времени. 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_12.12_Даты_и_время.xlsm. Автоматическое заполнение ячеек датами методом AutoFill Один из методов объекта Range (Диапазон) — метод Range.AutoFill, выполняет автозаполнение ячеек обозначенного диапазона элементами последовательности. Метод AutoFill программирует действия пользователя на рабочем листе, когда пользователь располагает указатель мыши на маркере заполнения выделенного диапазона (в который введены значения, порождающие создаваемую последовательность) и буксирует маркер заполнения вдоль диапазона (в котором будет располагаться создаваемая последовательность). Синтаксис метода AutoFill: Range.AutoFill(Destination, Type)
382 Глава 12 где:  Destination — обязательный параметр типа данных Range — ячейки, которые должны быть заполнены. Параметр должен включать диапазон источника;  Type — необязательный параметр, задает тип заполнения при помощи одной из констант перечисления XlAutoFillType, обозначая, как будет заполнен целевой диапазон, основываясь на содержании исходного диапазона. Рассмотрим пример. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>). В окне свойств проекта выполните двойной щелчок левой кнопкой мыши на пиктограмме ЭтаКнига. 2. Напишите программу (листинг 12.13), в которой рассматривается способ автоматического заполнения столбца датами (рис. 12.4). В ячейку А1 листа 1 введено значение текущей даты (функция Date) минус 5, в ячейку А2 введено значение, соответствующее текущей дате минус 4. Потом на основе этих двух ячеек методом AutoFill столбец автоматически заполняется датами до ячейки А99999. Листинг 12.13. Автоматическое заполнение столбца датами методом AutoFill Private Sub Открытая_книга() With ThisWorkbook.Worksheets(1) .Range("A1") = Date - 5 .Range("A2") = Date - 4 .Range("A1:A2").AutoFill Destination:=Range("A1:A99999") End With End Sub Рис. 12.4. Поиск сегодняшней даты
Операторы даты и времени 383 3. Для запуска макроса нажмите клавишу <F5>. С помощью команды Insert | Module (Вставить | Модуль) добавьте к проекту модуль Module1. Напишите в нем процедуру, которая в указанном диапазоне данных находит сегодняшнюю дату (листинг 12.14). Эту процедуру можно вызвать с помощью кнопки Текущая дата категории Элементы управления формы, которая запускает соответствующий макрос. Листинг 12.14. Поиск даты Sub Текущая_дата() Dim rng As Range Set rng = ThisWorkbook.Worksheets(1).Range("A1:A99999").Find(What:=Date) If rng Is Nothing Then MsgBox "Текущая дата не найдена" Else rng.Select End If End Sub 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_12.14_Управление_временем.xlsm. Подсветка даты Рассмотрим пример работы с ячейками и датами. 1. Создайте новый файл Microsoft Excel 2019. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. 3. Напишите программу (листинг 12.15, а), в которой рассматривается способ автоматического заполнения столбца датами (рис. 12.5). В ячейку А1 введено значение, соответствующее текущей дате минус 3, в ячейку А2 — текущей дате минус 2. Потом на основе этих двух ячеек автоматически заполняются датами ячейки A1:A5. Далее даты из ячеек A1:A5 копируются в ячейки A6:A10 и ячейки A11:A15. Листинг 12.15, а. Автоматическое заполнение столбца датами Private Sub Заполнение_датами() With ThisWorkbook.Worksheets(1) .Range("A1") = Date - 3 .Range("A2") = Date - 2 .Range("A1:A2").AutoFill Destination:=Range("A1:A5") .Range("A1:A5").Copy Destination:=Range("A6:A10") .Range("A1:A5").Copy Destination:=Range("A11:A15") End With End Sub
384 Глава 12 Рис. 12.5. Поиск ячеек с текущей датой и их выделение Напишите также процедуру, которая в указанном диапазоне ячеек находит ячейки с текущей датой и применяет к ним заливку красным цветом (листинг 12.15, б). Эту процедуру можно вызвать с помощью кнопки Найти ячейки с текущей датой категории Элементы управления формы, которая запускает соответствующий макрос. Листинг 12.15, б. Поиск ячеек с текущей датой Sub Кнопка2_Щелчок() Dim c As Range Dim rng As Range Set rng = ThisWorkbook.Worksheets(1).Range("A1:A15") rng.Interior.ColorIndex = xlNone For Each c In rng If c = Date Then c.Interior.Color = vbRed End If Next c End Sub 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_12.15_Выделить_ячейки.xlsm.
Операторы даты и времени 385 Поиск даты Рассмотрим еще один пример работы с ячейками и датами. 1. Создайте новый файл Microsoft Excel 2019. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. 3. Напишите программу (листинг 12.16), в которой рассматривается способ поиска конкретной даты в заполненном датами столбце А (рис. 12.6). В ячейку С4 вводится дата для поиска. Эту процедуру можно вызвать с помощью кнопки Поиск даты категории Элементы управления формы, которая запускает соответствующий макрос. Рис. 12.6. Поиск заданной даты и ее подсветка Листинг 12.16. Поиск даты Sub Поиск_даты() Dim c As Range Dim rng As Range Set rng = ThisWorkbook.Worksheets(1).Range("A1:A999") rng.Interior.ColorIndex = xlNone For Each c In rng If c = Range("C4") Then c.Interior.Color = rgbViolet
386 Глава 12 End If Next c End Sub 4. Для запуска макроса нажмите клавишу <F5>. Если значение ячейки из диапазона столбца A совпадет со значением ячейки A4, то для найденной ячейки задается цвет фона, в данном случае фиолетовый. 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_12.16_Поиск_даты.xlsm. Календарь Несмотря на наличие в новой версии Microsoft Excel 2019 шаблонов календарей, мы рассмотрим способ создания календаря с использованием VBA. Исходные данные для формирования календаря разместим на рабочем листе Лист1 (рис. 12.7). Очень удобно, что можно сформировать календарь для любого календарного года, указав его цифрами в ячейке B2. Мы формируем григорианский календарь, который учитывает так называемые високосные годы, февраль которых длится 29 дней, в отличие от обычного февраля длительностью 28 дней. Такие "длинные" феврали григорианский календарь предусматривает в каждом четвертом году — из ближайших это 2020, 2024. П РИМЕЧАНИЕ Год считается високосным в двух случаях: либо он кратен 4, но при этом не кратен 100, либо кратен 400. Год не високосный, если он не кратен 4, либо он кратен 100, но при этом не кратен 400. Предыдущим високосным годом был 2016, следующим будет 2020. Рис. 12.7. Исходные данные для формирования календаря
Операторы даты и времени 387 1. Создайте новый файл Microsoft Excel 2019. 2. Подготовьте для формирования календаря соответствующий лист (рис. 12.7), где в ячейку B2 будет вводиться год (в программе это переменная varYear), для которого рассчитывается календарь. 3. Создайте кнопку Создать календарь, по нажатию на которую должен выполняться макрос Календарь (листинг 12.17). Обратите внимание, что эта кнопка относится к элементам управления формы, а не к элементам ActiveX. 4. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. 5. В модуле создайте процедуру Календарь(), которая рассчитывает календарь на заданный в ячейке B2 год и создает новый лист с названием Год Число. Если такой лист уже существует, то он удаляется вместе с содержимым и создается заново. Календарь представлен в удобном виде с месяцами по столбцам. Дата задана в формате: "День недели (сокращенный вариант), число". Серым цветом подсвечены выходные дни. Каждая неделя пронумерована, номер обозначен в круглых скобках для всех понедельников. В коде используются функции работы с датами и временем. Листинг 12.17. Формирование календаря Sub Календарь() Dim ws As Worksheet Dim varYear As Variant Dim bytMonth As Byte Dim bytDay As Byte Dim bytWeekday As Byte Dim strWeekday As String Dim bytWeekNo As Byte Dim bytD As Byte ' ' ' ' ' ' ' ' Рабочий лист Год Месяц День (байт) День недели (байт) День недели (строка) Номер недели Промежуточная переменная varYear = Range("B2") ' Переменная Год приравнивается к значению из В2 For Each ws In Worksheets If ws.Name = "Год " & varYear Then ws.Delete ' Если рабочий лист с таким названием существует, ' то он удаляется End If Next ws Worksheets.Add ActiveSheet.Name = "Год " & varYear For bytMonth = 1 To 12 With Cells(1, bytMonth) .Value = Format(DateSerial(varYear, bytMonth, 1), "mmmm") .Interior.ColorIndex = 36 .Font.Bold = True End With
388 Глава 12 For bytDay = 1 To Day(DateSerial(varYear, bytMonth + 1, 0)) With Cells(bytDay + 1, bytMonth) bytWeekday = Weekday(DateSerial(varYear, bytMonth, bytDay)) Select Case bytWeekday Case 1 strWeekday = "Вс" Case 2 strWeekday = "Пн" Case 3 strWeekday = "Вт" Case 4 strWeekday = "Ср" Case 5 strWeekday = "Чт" Case 6 strWeekday = "Пт" Case 7 strWeekday = "Сб" End Select .Value = strWeekday & ", " & bytDay If bytWeekday = 7 Then .Interior.ColorIndex = 15 End If If bytWeekday = 1 Then .Interior.ColorIndex = 48 End If bytWeekNo = Format(DateSerial(varYear, bytMonth, bytDay), "ww") If bytD < bytWeekNo And strWeekday = "Пн" Then bytD = bytWeekNo .Value = .Value & " (" & bytD & ")" With .Characters(Start:=InStr(1, .Value, "("), Length:=4).Font .Size = 8 .Color = rgbDarkRed End With End If End With Next bytDay Next bytMonth End Sub Кто бы мог подумать, что так легко сделать календарь и не ошибиться (рис. 12.8). Умная программа за вас все рассчитает! 6. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_12.17_Календарь.xlsm.
Операторы даты и времени 389 Рис. 12.8. Календарь на 2020 год Календарь по месяцам В этом примере рассматривается способ расчета календаря по месяцам. Трудность создания такого календаря состоит в том, чтобы обеспечить правильное соответствие первого дня месяца названию дня недели, а потом правильно подключить следующий день и начать новую неделю с новой строки. 1. Создайте новый файл Microsoft Excel 2019. 2. Подготовьте для задания настроек календаря соответствующий лист (рис. 12.9). 3. В ячейку А10 введите текст: Введите желаемый год. В ячейку А11 предусмотрен ввод номера года (переменная intYear в листинге 12.18), для которого будет формироваться календарь. 4. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. 5. Создайте на рабочем листе кнопку Формирование календаря по месяцам категории Элементы управления формы для запуска макроса Календарь_по_ месяцам.
390 Глава 12 Рис. 12.9. Подготовка формирования календаря по месяцам 6. В листинге 12.18 приведен код программы, рассчитывающей календарь по месяцам. Проверьте работу программы. Листинг 12.18. Формирование календаря по месяцам Sub Календарь_по_месяцам() Dim intYear As Integer Dim bytWS As Byte Dim bytTitle As Byte Dim bytMonth As Byte Dim bytFirst As Byte Dim bytForward As Byte ' ' ' ' ' ' Год Номер листа Номер заголовка дня недели Номер месяца Первый день месяца Число месяца Dim bytCol As Byte ' Номер столбца Dim bytRow As Byte ' Номер строки Dim bytDays As Byte ' Счетчик дней месяца Dim bytIW As Byte ' Начальное количество листов intYear = Range("A4") bytIW = Worksheets.Count For bytWS = 1 To 12 Worksheets.Add After:=Worksheets(bytIW + bytWS - 1) Next bytWS For bytWS = bytIW + 1 To bytIW + 12 With Worksheets(bytWS) .Name = Format(MonthName(bytWS - bytIW), "mmmm") .Range("A1:G1").Merge .Range("A1") = .Name & " " & intYear
Операторы даты и времени 391 .Range("A1").NumberFormat = "mmmm yyyy" .Range("A1").HorizontalAlignment = xlLeft .Range("A1").Font.Bold = True .Range("A1").Font.Color = vbBlue .Range("A1").Font.Size = 16 For bytTitle = 1 To 7 .Cells(2, bytTitle) = WeekdayName(bytTitle) .Cells(2, bytTitle).Interior.ColorIndex = 15 .Cells(2, bytTitle).Font.Bold = True bytRow = 3 If Format(Weekday(DateSerial(intYear, bytWS - bytIW, 1)), _ "dddd") = .Cells(2, bytTitle) Then .Cells(bytRow, bytTitle) = 1 bytFirst = bytTitle End If Next bytTitle bytCol = bytFirst + 1 bytForward = 2 For bytDays = bytFirst + 1 To _ Day(DateSerial(intYear, bytWS - bytIW + 1, 0)) + _ (bytFirst - 1) If Weekday(DateSerial(intYear, bytWS - bytIW, bytForward), _ 2) = 1 Then bytRow = bytRow + 1 bytCol = 1 End If .Cells(bytRow, bytCol) = _ Day(DateSerial(intYear, bytWS - bytIW, bytForward)) bytCol = bytCol + 1 bytForward = bytForward + 1 Next bytDays With .Rows("3:" & bytRow) .RowHeight = 50 .VerticalAlignment = xlTop End With End With Next bytWS Application.Goto Worksheets(1).Range("A1") End Sub Для каждого месяца с января по декабрь формируется новый лист с соответствующим названием. На каждом листе для всех дней недели отводится по одному столбцу (рис. 12.10) и автоматически создается заголовок из названий семи дней недели. Затем определяется, каким днем недели является первое число рассчитываемого месяца. Начиная с этого дня, все числа месяца записываются в ячей-
392 Глава 12 Рис. 12.10. Пример календаря по месяцу на листе ки, при этом, если день является понедельником, происходит переход на следующую строку. 7. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_12.18_Календарь_по_месяцам.xlsm. Календарь по неделям В этом примере рассматривается способ расчета календаря по неделям. 1. Создайте новый файл Microsoft Excel 2019. 2. Подготовьте для формирования календаря соответствующий лист (рис. 12.11). На нем же будет размещена первая неделя календаря. 3. В ячейку А28 введите текст: Введите желаемый год. В ячейку А29 предусмотрен ввод номера года (это переменная intYear в листинге 12.19), для которого будет формироваться календарь. 4. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. 5. На рабочем листе создайте кнопку Формирование календаря по неделям из категории Элементы управления формы для запуска макроса Календарь_ по_неделям.
Операторы даты и времени 393 Рис. 12.11. Подготовка формирования календаря по неделям 6. В листинге 12.19 приведен код программы, рассчитывающей календарь по неделям. Эта процедура создает календарь на 53 листах, поэтому может быть громоздкой и медленно работать. Соответственно, чтобы отключить обновление экрана, свойство Application.ScreenUpdating устанавливается в False. 7. Назначьте кнопке Формирование календаря по неделям созданный макрос. Листинг 12.19. Формирование календаря по неделям Sub Календарь_по_неделям() Dim intYear As Integer ' Год Dim bytWS As Byte ' Номер рабочего листа Dim bytTitle As Byte ' День недели Dim intDay1 As Integer ' Номер столбца Dim bytCol As Byte ' Номер столбца Dim bytWeekDay As Byte ' День недели Application.ScreenUpdating = False intYear = Range("A29") ' Год для формирования For bytWS = Worksheets.Count + 1 To 53 Worksheets.Add After:=Worksheets(Worksheets.Count) Next bytWS For intDay1 = 2 To 8 With Worksheets(1)
394 For bytTitle = 1 To 7 .Cells(1, bytTitle + 1) = WeekdayName(bytTitle) Next bytTitle If Format(DateSerial(intYear, 1, 1), "dddd") = _ .Cells(1, intDay1) Then .Cells(2, intDay1) = DateSerial(intYear, 1, 1) If intDay1 > 2 Then .Cells(2, intDay1).AutoFill _ Destination:=.Range(.Cells(2, 2), .Cells(2, intDay1)) End If .Cells(2, intDay1).Font.Color = vbRed bytCol = intDay1 + 1 End If End With Next intDay1 intDay1 = 2 For bytWS = 1 To 53 With Worksheets(bytWS) .Name = bytWS & " Нед." For bytTitle = 1 To 7 .Cells(1, bytTitle + 1) = WeekdayName(bytTitle) Next bytTitle .Range("A3") = "00:00" ' Ввод времени в ячейку .Range("A3").AutoFill Destination:=.Range("A3:A26") ' Автозаполнение ячеек временными данными (по часам) With .Range("B1:H2,A1:A26") .HorizontalAlignment = xlCenter .Font.Bold = True .Interior.ColorIndex = 15 End With .Range("B3:H10,B20:H26").Interior.ColorIndex = 37 .Range("B11:H19").Interior.ColorIndex = 34 With .Range("A3:H26") .Borders(xlEdgeLeft).LineStyle = xlContinuous .Borders(xlEdgeTop).LineStyle = xlContinuous .Borders(xlEdgeBottom).LineStyle = xlContinuous .Borders(xlEdgeRight).LineStyle = xlContinuous .Borders(xlInsideVertical).LineStyle = xlContinuous .Borders(xlInsideHorizontal).LineStyle = xlContinuous End With For bytWeekDay = bytCol To 8 Worksheets(bytWS).Cells(2, bytCol) = _ DateSerial(intYear, 1, intDay1) bytCol = bytCol + 1 intDay1 = intDay1 + 1 Next bytWeekDay bytCol = 2 End With Глава 12
Операторы даты и времени 395 Next bytWS Application.Goto Worksheets(1).Range("A1") Application.ScreenUpdating = True End Sub Для каждой недели формируется лист с соответствующим названием, на каждом листе для дней недели отводится по одному столбцу (рис. 12.12). Каждая строка фиксирует один час от 0:00 до 23:00. Рис. 12.12. Пример календаря по неделям на листе В исходной книге был один лист, а теперь, после запуска макроса, в ней содержится 53 листа. 8. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_12.19_Календарь_по_неделям.xlsm. Определение возраста В этом примере рассматривается способ расчета возраста по введенной дате рождения.
396 Глава 12 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль Module1. 2. В листинге 12.20 приведен код программы расчета возраста по введенной дате рождения. Не забудьте использовать в начале окна кода оператор Option Explicit. Листинг 12.20. Расчет возраста по введенной дате рождения Public Sub Возраст() Dim Str1 As String Str1 = InputBox("Введите дату Вашего рождения!", _ " Определение возраста") If Str1 <> "" And IsDate(Str1) Then MsgBox " Вы родились" & DateDiff("y", CDate(Str1), Date) \ 365 & _ " года (лет) _ назад!" End If End Sub 3. Для запуска макроса нажмите кнопку . 4. В открывшееся диалоговое окно, инициированное функцией InputBox, введите дату рождения. Обратите внимание, что в заголовке диалогового окна функции InputBox появилось название: Определение возраста (рис. 12.13). Благодаря выполнению функции MsgBox можно увидеть сообщение о том, сколько лет назад вы родились. 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_12.20_Возраст.xlsm. Рис. 12.13. Пример определения возраста
ГЛАВА 13 Действия с рабочей книгой В этой главе рассмотрена работа с рабочей книгой. В иерархии Microsoft Excel объект Workbook идет сразу после объекта Application и представляет собой файл рабочей книги. Объекты Workbook составляют семейство Workbooks. Свойства объекта Workbook Все свойства объекта Workbook показаны на рис. 13.1. Рассмотрим назначение основных свойств объекта Workbook.  ActiveSheet — возвращает активный лист;  ActiveChart — возвращает активную диаграмму;  Sheets — возвращает семейство всех рабочих листов книги и диаграмм;  Worksheets — возвращает семейство всех рабочих листов книги;  Charts — возвращает семейство всех диаграмм книги;  Count — возвращает число объектов семейства Workbooks;  HasPassword — логическое свойство, устанавливающее, защищена ли книга паролем;  DisplayDrawingObjects — возвращает или устанавливает способ отображения фигур;  Name — возвращает строковое значение, представляющее собой имя объекта;  Path — возвращает полное имя папки нахождения книги;  FullName — возвращает строку, представляющую название книги, с указанием пути на диск;  Saved — логическое свойство, которое устанавливает, не было ли изменений в книге со времени ее последнего сохранения;  WriteReserved — логическое свойство, устанавливающее, защищена ли книга для сохранения изменений.
398 Глава 13 Рис. 13.1. Перечень свойств объекта Workbook Методы объекта Workbook Перечислим некоторые основные методы объекта Workbook и семейства Workbooks.  Activate — активизирует рабочую книгу, делая активным первый рабочий лист;  Add — создает новую рабочую книгу в семействе Workbooks, которая становится активной;
Действия с рабочей книгой 399  Protect — защищает рабочую книгу от внесения в нее изменений;  Unprotect — снимает защиту с листа рабочей книги;  Close — закрывает рабочую книгу;  Save — сохраняет изменения в указанной рабочей книге;  SaveAs — сохраняет рабочую книгу в другой файл. Событие и метод Open При работе с VBA для обозначения событий и методов могут использоваться одинаковые названия (рис. 13.2). Различаются они по назначению в зависимости от того, что стоит впереди до символа точка. Например, слово "Open" добавляют для обозначения метода объекта Workbooks, служащего для открытия рабочей книги, а также для обозначения события объекта Workbook, возникающего при открытии рабочей книги. В первом случае целесообразно в коде использовать запись Workbooks.Open, а во втором — Workbook.Open. Рис. 13.2. Одно слово "Open" задействовано для события и метода Итак, рассмотрим полный синтаксис метода Open, который открывает рабочую книгу: Workbooks.Open(FileName, UpdateLinks, ReadOnly, Format, Password, _ WriteResPassword, IgnoreReadOnlyRecommended, Origin, _ Delimiter, Editable, Notify, Converter, AddToMru, _ Local, CorruptLoad) где, в частности:  необязательный параметр FileName задает имя файла рабочей книги, которая должна быть открыта;  необязательный параметр UpdateLinks обозначает способ использования внешних ссылок в файле;  остальные необязательные параметры ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended означают соответственно: "Только для чтения",
400 Глава 13 "Формат", "Пароль", "Пароль для записи в защищенный файл", "Игнорирование рекомендации «Только для чтения»". Рассмотрим принципы работы с рабочей книгой на примерах. Открытие рабочей книги методом Workbooks.Open 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA, выбрав на вкладке ленты Разработчик раздел Visual Basic. На экране откроется окно интегрированной среды разработки приложений Microsoft Visual Basic - Книга 1. Можно также одновременно нажать клавиши <Alt>+<F11>. 2. Добавьте к проекту модуль Module1 с помощью команды Insert | Module (Вставить | Модуль). 3. Командой Add Procedure (Добавить процедуру) добавьте процедуру с названием Открыть_книгу и напишите программу, позволяющую открыть рабочую книгу с заданным именем при помощи метода Workbooks.Open (листинг 13.1). Не забудьте использовать в начале окна кода оператор Option Explicit. Листинг 13.1. Пример открытия рабочей книги методом Workbooks.Open Sub Открыть_книгу() Workbooks.Open ("F:\VBA\Старт.xlsm") End Sub Главное здесь — правильно прописать путь к файлу. 4. Для выполнения процедуры нажмите клавишу <F5>. Если путь указан верно, файл будет открыт в программе Microsoft Excel; в противном случае появится программное сообщение о том, что файл не найден. 5. Сохраните созданный документ с поддержкой макросов под именем Листинг_13.1Листинг_13.3_Метод_Workbooks.Open.xlsm. Для этого выберите команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла укажите вариант сохранения файла Книга Excel с поддержкой макросов. 6. Код открытия книги можно написать немного по-другому — используя параметры Filename и UpdateLinks (листинг 13.2). Напишите этот код в том же модуле того же файла. Листинг 13.2. Пример открытия рабочей книги методом Workbooks.Open при задании параметров Filename и UpdateLinks Sub Дополнительные_параметры() On Error GoTo L Workbooks.Open Filename:="F:\VBA\Старт.xlsm", UpdateLinks:=0 Exit Sub
Действия с рабочей книгой 401 L: MsgBox "Указанный файл не найден" End Sub 7. Для запуска макроса нажмите кнопку . 8. Сохраните этот документ под тем же именем: Листинг_13.1-Листинг_13.3_ Метод_Workbooks.Open.xlsm. Э ЛЕКТРОННЫЙ АРХИВ Листинги 13.1–13.3, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_13_Работа с рабочей книгой сопровождающего книгу электронного архива. Свойство Application.Dialogs для работы со встроенными диалоговыми окнами 1. Продолжите работу в Microsoft Excel с предыдущим файлом. 2. Напишите в том же модуле программу с применением константы xlDialogOpen свойства Application.Dialogs, используемой для открытия диалогового окна Открытие документа (листинг 13.3). В этом примере открывается папка Этот компьютер\Документы (рис. 13.3). Листинг 13.3. Вызов диалогового окна Открытие документа Sub Вызвать_диалоговое_окно() Application.Dialogs(xlDialogOpen).Show End Sub Рис. 13.3. Вызов диалогового окна Открытие документа
402 Глава 13 3. Сохраните книгу под тем же именем: Листинг_13.1-Листинг_13.3_Метод_Workbooks. Open.xlsm. Открытие рабочей книги в диалоговом окне 1. Создайте новый файл Microsoft Excel 2019. 2. Перейдите в среду VBA (<Alt>+<F11>) и в добавленном вами модуле напишите программу, содержащую код с применением метода Application. GetOpenFilename объекта Application, который отображает стандартное диалоговое окно Открытие документа и получает имя файла Excel, указываемое пользователем без действительного открытия любого файла. Само же имя файла передается для применения в методе Workbooks.Open, служащего для открытия рабочей книги (листинг 13.4). Листинг 13.4. Пример получения имени файла методом Application.GetOpenFilename и его открытия методом Workbooks.Open Sub Получить_имя_файла_и_открыть_книгу() Dim Dat as Variant Dat = Application.GetOpenFilename("Excel-Файлы (*.xl*), *xl*") If Dat =False Then Exit Sub Workbooks.Open FileName:= Dat End Sub 3. Для запуска макроса нажмите клавишу <F5>. При обычном открытии диалогового окна Открытие документа (см. рис. 13.1) по умолчанию предлагается либо указать опцию Все файлы Excel, либо открыть нужный тип файла, выбрав его из раскрывающегося списка. После выполнения макроса список будет иметь название Excel-файлы (рис. 13.2). Маска *xl*, использованная в листинге, означает, что могут быть выбраны файлы *.xlsm, *.xlsx в новых версиях программы или *.xls — в старых. 4. Измените немного программу, чтобы вызвать диалоговое окно Открытие документа с возможностью выбора в нем нескольких файлов для открытия (листинг 13.5). Напишите этот код в том же модуле того же файла. Листинг 13.5. Пример открытия нескольких книг выбором в одном диалоговом окне Sub Открыть_несколько_книг() Dim I as Integer Dim Dat as Variant I = 0 Dat = Application.GetOpenFilename("Excel-файлы (*.xl*), *xl*", _ MultiSelect:=True) If IsArray(Dat) Then For I = LBound(Dat) To UBound(Dat) Workbooks.Open Dat(I)
Действия с рабочей книгой 403 Next I Else MsgBox "Рабочие книги не могут быть открыты." End If End Sub После выполнения макроса откроется диалоговое окно Открытие документа, предлагающее выбрать файлы (рис. 13.4). Для того чтобы выбрать для открытия в диалоговом окне Открытие документа несколько файлов, следует удерживать нажатой клавишу <Ctrl>. Рис. 13.4. Выбор нескольких файлов в диалоговом окне Открытие документа 5. Раз вы уже начали открывать рабочие книги, то рассмотрим еще один пример, в котором открываются все связанные рабочие книги (листинг 13.6). Это становится возможным благодаря методу Workbook.LinkSources. Напишите этот код в том же модуле того же файла. Листинг 13.6. Пример открытия всех связанных рабочих книг Sub Открыть_все_связанные_книги() Dim I as Integer Dim AL as Variant AL = ActiveWorkbook.LinkSources(xlExcelLinks) If Not IsEmpty(AL) Then For I = 1 To UBound(AL) Workbooks.Open AL(I) Next I End If End Sub
404 Глава 13 6. Сохраните созданную книгу с поддержкой макросов под именем Листинг_13.4Листинг_13.6_Открыть_рабочие_книги.xlsm. Открытие приложения Блокнот VBA предоставляет возможность посредством функции Shell работать с bat-, exe- и com-файлами. Эта функция позволяет, находясь в VBA, запускать на выполнение другие программы. Ее синтаксис: Shell PathName, [WindowStyle] As Double Рассмотрим именованные аргументы функции:  PathName — название программы с указанием всех необходимых аргументов;  WindowStyle — задает стиль экранного режима окна, в котором будет запущена программа, при помощи одного из значений перечисления VbAppWinStyle. В перечислении содержатся следующие константы: • vbHide или 0; • vbNormalFocus или 1; • vbMinimizedFocus или 2; • vbMaximizedFocus или 3; • vbNormalNoFocus или 4; • vbMinimizedNoFocus или 6. Функция Shell запускает другие программы в асинхронном режиме. Возвращает значение типа Variant, содержащее идентификатор процесса программы. П РИМЕЧАНИЕ Аналогично можно запустить Калькулятор, Paint и другие программы, полностью прописав к ним путь. Однако современные разработчики программного обеспечения так далеко прячут файлы в папках, что порой этот полный путь бывает прописать очень трудно. Рассмотрим пример запуска Блокнота. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль (Insert | Module (Вставить | Модуль)). 2. Напишите код программы, при выполнении которого запускается программа Блокнот (листинг 13.7). Листинг 13.7. Пример запуска Блокнота Public Sub Запуск_Блокнота() Dim Val As Variant Val = Shell("C:\WINDOWS\NOTEPAD.EXE", 4) 'Запускает программу Блокнот 'Val = Shell("C:\WINDOWS\CALC.EXE", 1) 'Запускает программу Калькулятор 'Val = Shell("C:\WINDOWS\PAINT.EXE", 1) 'Запускает программу Paint End Sub
Действия с рабочей книгой 405 Значение 4 второго аргумента функции Shell открывает приложение в окне обычного размера, но не передает ему фокус. 3. Для запуска макроса нажмите кнопку . 4. Сохраните вновь созданную книгу с поддержкой макросов под именем Листинг_13.7_ Запуск_Блокнота.xlsm. Свойство Workbook.Name 1. Откройте несколько файлов Microsoft Excel 2019. В среде VBA добавьте к проекту модуль Module1. 2. Напишите программу, отображающую в окне сообщения названия открытых рабочих книг Microsoft Excel (листинг 13.8). Листинг 13.8. Пример списка открытых файлов Public Sub Список_файлов() Dim Файл As Workbook Dim strName As String For Each Файл In Application.Workbooks strName = strName & vbLf & Файл.Name Next Файл MsgBox "Сейчас открыты рабочие книги: " & vbLf & strName, vbInformation End Sub 3. Для запуска макроса нажмите клавишу <F5>. 4. Здесь свойство Application.Workbooks возвращает семейство Workbooks, представляющее собой все открытые рабочие книги Excel. Названия открытых книг возвращаются с помощью свойства Workbook.Name. В открывшемся сообщении (рис. 13.3) отображена информация об открытых в данный момент файлах приложения Microsoft Excel. 5. Сохраните созданный документ с поддержкой макросов под именем Листинг_13.8_ Список_открытых_рабочих_книг.xlsm. Рис. 13.5. Диалоговое окно сообщения об открытии файлов
406 Глава 13 Создание рабочей книги 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. 2. В модуль добавьте код программы, позволяющей создать новый файл Microsoft Excel с заданным именем (листинг 13.9). Новая рабочая книга создается с помощью метода Workbooks.Add и становится активной. Созданный файл будет сохранен с заданными именем и расширением при помощи метода Workbook.SaveAs. Обратите внимание на расширение файла xls, оно соответствует старой версии Microsoft Excel. Если же вы хотите создать файл нового формата, укажите соответствующее расширение. Листинг 13.9. Пример создания рабочей книги Sub Добавить_книгу() Dim NewBook As Workbook Set NewBook = Workbooks.Add With NewBook .Title = "Новая_книга" .Subject = "Моя_любимая_программа" .SaveAs Filename:="Новая_книга.xls" End With End Sub 3. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_13.9_Создание_новой_книги.xlsm. Имя приложения 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль Module1. 2. Командой Add Procedure (Добавить процедуру) создайте процедуру с названием Заголовок_в_титульной_полоске() (листинг 13.10). В листинге используется свойство Application.Caption для задания надписи, отображаемой в заголовке главного окна Microsoft Excel. Листинг 13.10. Пример использования свойства Application.Caption Sub Заголовок_в_титульной_полоске() Application.Caption = "Не потопаешь, не полопаешь!" End Sub 3. Для запуска макроса нажмите кнопку . После запуска макроса в заголовке окна после названия Книга1 появится надпись, задаваемая свойством Application.Caption. В нашем случае это фраза "Не
Действия с рабочей книгой 407 потопаешь, не полопаешь!". Правда, при сохранении этой книги ее предлагается сохранить под именем Книга1 без добавленного текста. Используйте значение Empty, чтобы вернуть первоначальные установки. 4. Можно также вывести в окне сообщения имя вашего приложения (листинг 13.11). Обращение происходит к объекту — активной рабочей книге ActiveWorkbook. Напишите этот код в том же модуле того же файла. Листинг 13.11. Пример вывода окна сообщения с именем Name активной книги Sub Имя_рабочей_книги() MsgBox ActiveWorkbook.Name End Sub 5. Для запуска макроса нажмите кнопку . При этом возвращается имя файла без указания полного адреса. Для отображения имени файла с указанием диска, т. е. с полностью прописанным путем, необходимо использовать свойство рабочей книги Application.FullName (листинг 13.12, рис. 13.4). Напишите этот код в том же модуле того же файла. Листинг 13.12. Пример вывода окна сообщения с полным именем активной книги Sub Полное_имя_приложения() MsgBox Application.ActiveWorkbook.FullName End Sub Рис. 13.6. Пример сообщения с именем вашего приложения Раз уж мы изучаем имя приложения, то можно рассмотреть еще один пример вывода имени открытого файла (листинг 13.13). Напишите этот код в том же модуле (Module1) того же файла. Результат выполнения процедуры совпадет с результатом из листинга 13.11. Листинг 13.13. Еще один пример вывода окна сообщения с именем активной книги Sub Имя_открытой_книги() Dim str As String Dim wb As Workbook
408 Глава 13 For Each wb In Workbooks str = str & wb.Name & Chr(10) Next wb MsgBox str End Sub 1. Для запуска макроса нажмите кнопку . 2. Сохраните этот документ с поддержкой макросов под именем Листинг_13.10Листинг_13.13_Название_рабочей_книги.xlsm. Сохранение рабочей книги Рассмотрим несколько способов сохранения рабочей книги. Метод Workbook.Save 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль Module1. 2. Напишите программу, содержащую процедуру обычного сохранения рабочей книги при помощи метода Workbook.Save. Свойство Application.ThisWorkbook возвращает объект Workbook, представляющий собой рабочую книгу в которой запущен на исполнение текущий макрос. Книга будет сохранена в папку, заданную для сохранения по умолчанию, в нашем случае это Документы. Так как имя файла не указано, то сохранение будет осуществлено с названием Книга1.xlsx либо с расширением xlsm, если вы укажете сохранение книги с поддержкой макросов (листинг 13.14). Листинг 13.14. Пример сохранения рабочей книги, метод Save Sub Сохранить_Save() ThisWorkbook.Save End Sub 3. Для выполнения процедуры нажмите кнопку . 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_13.14-Листинг_13.16_Сохранение_всех_книг.xlsm. Метод Workbook.SaveAs В отличие от метода Workbook.Save метод Workbook.SaveAs имеет большое количество параметров. Рассмотрим синтаксис метода Workbook.SaveAs: expression.SaveAs(FileName, FileFormat, Password, WriteResPassword, _ ReadOnlyRecommended, CreateBackup, AccessMode, _ ConflictResolution, AddToMru, TextCodepage, _ TextVisualLayout, Local)
Действия с рабочей книгой 409 Параметры метода:  FileName — имя сохраняемого файла; адрес задается в виде строки, либо с указа- нием полного адреса, либо с сохранением в текущей папке;  FileFormat — формат сохраняемого файла, указывается одна из констант пере- числения XlFileFormat. Для существующего файла форматом по умолчанию является последний указанный формат файла; для нового файла значением по умолчанию является формат используемой версии Excel;  Password — строка, состоящая не более чем из 15 символов, для задания пароля, запрашиваемого для открытия файла;  WriteResPassword — при использовании этого параметра рабочая книга приоб- ретает статус "только чтение", в случае ввода правильного пароля возможно осуществлять изменения и записывать их;  ReadOnlyRecommended — параметр принимает значение True (Истина) для реко- мендации "Только для чтения" в окне уведомления, появляющегося при открытии файла;  CreateBackup — параметр принимает значение True (Истина), чтобы автоматиче- ски создать файл резервной копии;  AccessMode — режим доступа рабочей книги, устанавливаемый при помощи одной из констант перечисления XlSaveAsAccessMode, а именно: xlExclusive — эксклюзивный режим, xlNoChange — по умолчанию (режим без изменений), xlShared — совместный список;  ConflictResolution — параметр отвечает за решение конфликтов при сохра- нении файла, возникающих при одновременной работе над файлом несколькими пользователями, например, с сервера. Устанавливается при помощи одной из констант перечисления XlSaveConflictResolution, а именно: xlLocalSessionChanges — изменения, внесенные локальным пользователем, всегда принимаются; xlOtherSessionChanges — изменения, внесенные локальным пользователем, всегда отклоняются; xlUserResolution — инициирует появление диалогового окна с запросом на разрешение конфликта;  AddToMru — для добавления книги в список недавно использовавшихся файлов устанавливается значение True (Истина). По умолчанию значение параметра — False (Ложь);  TextCodepage — параметр отвечает за кодовую страницу и игнорируется для всех языков в Microsoft Excel. При сохранении книги в Excel в одном из форматов CSV-файла или текстовых форматов, указанных с помощью параметра FileFormat, он использует кодовую страницу, соответствующую языку системы на текущем компьютере;  TextVisualLayout — параметр отвечает за визуальное отображение текста и иг- норируется для всех языков в Microsoft Excel. При сохранении книги в Excel в одном из форматов CSV-файла или текстовых форматов, указанных с помощью параметра FileFormat, он сохраняет эти форматы в логической структуре;
410 Глава 13  Local — параметр со значением False (Ложь) по умолчанию, сохраняет прило- жения с использованием языка VBA на английском языке (американский тип). Значение True (Истина) для параметра Local позволяет сохранять файлы на локальном языке установленной версии Microsoft Excel (включая параметры панели управления). Отметим, что все параметры являются необязательными. Теперь перейдем к созданию процедур, использующих методы сохранения рабочих книг. 1. Продолжите работу в Microsoft Excel с тем же файлом в модуле Module1. В случае использования метода Workbook.SaveAs все остается почти таким же, только следует прописать диск, папку и имя файла для сохранения (листинг 13.15). Для того чтобы сохранить книгу с паролем, запрашиваемым при открытии рабочей книги, используется параметр Password. Листинг 13.15. Пример сохранения рабочей книги с паролем для открытия файла, метод Workbook.SaveAs Sub Сохранить_как_SaveAs() ThisWorkbook.SaveAs("C:\Users\HOME\Documents\Пример1.xlsm"), _ Password:="hsdfHJK" End Sub 2. Для запуска макроса нажмите клавишу <F5>. И, пожалуйста, проверьте — на диске C: в указанной папке действительно появился файл Пример1.xlsm. При попытке открыть новый файл откроется диалоговое окно ввода пароля (рис. 13.7). 3. В случае неправильного ввода пароля файл не будет открыт. Рис. 13.7. Ввод пароля для открытия файла В НИМАНИЕ ! Используйте сильный пароль с комбинацией прописных и строчных букв, чисел и символов. Слабый пароль не содержит таких смешанных по типу элементов. Например,
Действия с рабочей книгой 411 сильный пароль — Y6dh!et5. Слабый пароль — House27. Придумывайте сильный пароль, который вы можете запомнить, чтобы избегать его хранения где-либо. 4. Попробуем модифицировать макрос с возможностью сохранения рабочей книги в режиме "только для чтения". Для этого в коде замените слово Password на слово WriteResPassword. 5. Вновь запустите макрос на исполнение. Также будет создан новый файл Пример1.xlsm. При попытке его открыть появится диалоговое окно ввода пароля для открытия файла с возможностью сохранения в нем изменений (рис. 13.8). В случае неправильного ввода пароля файл будет открыт в режиме "только для чтения". Рис. 13.8. Ввод пароля при открытии файла для снятия режима "только для чтения" 6. Сохраните этот документ под тем же именем Листинг_13.14-Листинг_13.16_ Сохранение_всех_книг.xlsm. Метод Workbook.SaveCopyAs А теперь создадим копию рабочей книги, при этом изменений в открытой рабочей книге не будет. Для этого предназначен метод Workbook.SaveCopyAs. В отличие от предыдущего метода у него только один необязательный параметр Filename, обозначающий имя файла, созданного копированием. 1. Запустите Microsoft Excel 2019. Откройте книгу Сохранение_всех_книг_Листинги_13.1413.16.xlsm. Перейдите в среду VBA. 2. Командой Add Procedure (Добавить процедуру) добавьте в модуле к проекту процедуру с названием Сохранение_копированием согласно листингу 13.16.
412 Глава 13 Листинг 13.16. Пример сохранения книги ее копированием Sub Сохранение_копированием() Dim str As String str = " C:\Users\HOME\Documents\Пример2.xlsm" If Dir(str) = "" Then ThisWorkbook.SaveCopyAs (str) ' Сохранить файл как копию Else MsgBox "Файл с таким именем уже существует!" End If End Sub 3. Для выполнения процедуры нажмите кнопку . И, пожалуйста, проверьте — на диске C: в указанной папке действительно появился файл-копия Пример2.xlsm. 4. Сохраните этот документ под тем же именем: Листинг_13.14-Листинг_13.16_ Сохранение_всех_книг.xlsm. Сохранение всех книг и выход из программы 1. Запустите Microsoft Excel 2019, откройте как можно больше рабочих книг и создайте еще одну новую книгу. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. 3. Командой Add Procedure (Добавить процедуру) добавьте процедуру с названием Сохранение_и_выход. 4. В листинге 13.17 приведен код программы, при выполнении которой все открытые книги сохраняются с использованием метода Workbook.Save, и осуществляется выход из программы при помощи метода Application.Quit объекта Application. Листинг 13.17. Пример сохранения всех книг и закрытия Microsoft Excel Sub Сохранение_и_выход() Dim wb As Workbook For Each wb In Workbooks wb.Save Next wb Application.Quit End Sub 5. Для выполнения процедуры нажмите кнопку . 6. Сохраните вновь созданную рабочую книгу с поддержкой макросов под именем Листинг_13.17_Листинг_13.18_Сохранить_и_выйти_из_программы.xlsm.
Действия с рабочей книгой 413 Сохранение всех книг и выход по запросу 1. Запустите Microsoft Excel 2019, откройте как можно больше книг и книгу Листинг_13.17_Листинг_13.18_Сохранить_и_выйти_из_программы.xlsm. 2. Перейдите в среду VBA. 3. Командой Insert | Procedure (Вставить | Процедура) добавьте в модуле Module1 к проекту процедуру с названием Сохранение_и_выход_по_требованию. 4. В листинге 13.18 приведен код программы, при выполнении которой в случае положительного ответа на соответствующий запрос сохраняются все открытые книги и происходит выход из приложения Microsoft Excel. Листинг 13.18. Пример сохранения всех книг и закрытия программы по запросу Sub Сохранение_и_выход_по_требованию() Dim wb As Workbook If MsgBox("Сохранить рабочие книги и выйти из программы?", _ vbYesNo + vbQuestion) = vbYes Then For Each wb In Workbooks wb.Save Next wb Application.Quit Else MsgBox "Отменить сохранение и закрытие.", vbCritical End If End Sub 5. Для выполнения процедуры нажмите кнопку . 6. Сохраните рабочую книгу под тем же именем: Листинг_13.17_Листинг_13.18_ Сохранить_и_выйти_из_программы.xlsm. Защита рабочей книги методом Workbook.Protect При работе с рабочей книгой иногда возникает необходимость защитить ее от каких-либо изменений, а именно добавления новых рабочих листов, удаления старых, изменения содержимого ячеек и т. д. Для осуществления защиты на уровне книги предназначен метод Workbook.Protect. Рассмотрим его синтаксис: expression.Protect(Password, Structure, Windows) Параметры метода:  Password — пароль для книги; строка, содержащая не менее 8 символов различ- ного рода;  Structure — для установки защиты структуры рабочей книги на уровне распо- ложения рабочих листов устанавливается значение True (Истина);
414 Глава 13  Windows — для установки защиты окон рабочей книги устанавливается значение True (Истина). Отметим, что все параметры являются необязательными. Объект Worksheet В иерархии Microsoft Excel объект Worksheet идет сразу после объекта Workbook и представляет собой лист рабочей книги. Объекты Worksheet составляют семейство Worksheets. Свойства объекта Worksheet Перечислим основные свойства объекта Worksheet:  Name — возвращает или устанавливает имя рабочего листа;  Visible — возвращает или устанавливает значение видимости рабочего листа;  UsedRange — возвращает используемый диапазон указанного рабочего листа;  Cells — возвращает объект типа Range, представляющий собой все ячейки рабо- чего листа;  Columns, Rows — возвращают объекты типа Range, представляющие собой все столбцы и строки активного рабочего листа;  StandardHeight — возвращает стандартную высоту всех строк рабочего листа в пунктах;  StandardWidth — возвращает или устанавливает стандартную ширину всех столбцов рабочего листа;  Comments — возвращает семейство всех комментариев (объектов Comments) обо- значенного рабочего листа;  Shapes — возвращает семейство всех фигур (объектов Shapes) рабочего листа. Методы объекта Worksheet и семейства Worksheets Перечислим основные методы объекта Worksheet и семейства Worksheets:  Activate — делает текущий лист активным листом;  Add — создает новый рабочий лист;  Select — выбирает указанный рабочий лист;  Protect — защищает рабочий лист от внесения в него изменений;  Unprotect — снимает защиту с рабочего листа;  Delete — удаляет рабочий лист или семейство Worksheets;  Copy — копирует рабочий лист в другое место в рабочей книге.
Действия с рабочей книгой 415 Защита рабочего листа методом Worksheet.Protect Для защиты рабочего листа средствами VBA применяется метод Worksheet.Protect. В отличие от метода Workbook.Protect метод имеет больше параметров. Рассмотрим синтаксис метода Worksheet.Protect: expression.Protect(Password, DrawingObjects, Contents, Scenarios, _ UserInterfaceOnly, AllowFormattingCells, _ AllowFormattingColumns, AllowFormattingRows, _ AllowInsertingColumns, AllowInsertingRows, _ AllowInsertingHyperlinks, AllowDeletingColumns, _ AllowDeletingRows, AllowSorting, AllowFiltering, _ AllowUsingPivotTables) Параметры метода:  Password — пароль для книги, строка символов. Рекомендуется использовать строки, содержащие не менее 8 символов различного рода;  DrawingObjects — значение True (Истина) устанавливает защиту фигур. Значение по умолчанию — True (Истина);  Contents — значение True (Истина) устанавливает защиту содержимого рабочей книги. Значение по умолчанию — True (Истина). Для диаграмм защищает диаграмму полностью, для рабочего листа защищает заблокированные ячейки;  Scenarios — параметр со значением по умолчанию True (Истина) используется для защиты сценариев. Параметр действителен только для рабочих листов;  UserInterfaceOnly — значение True (Истина) устанавливает защиту интерфейса пользователя, но не макросов. Если параметр не указан, то защита устанавливается и для макросов, и для интерфейса пользователя;  AllowFormattingCells — значение True (Истина) разрешает форматирование ячеек. Значение по умолчанию — False (Ложь);  AllowFormattingColumns — значение True (Истина) разрешает форматирование столбцов. Значение по умолчанию — False (Ложь);  AllowFormattingRows — значение True (Истина) разрешает форматирование строк. Значение по умолчанию — False (Ложь);  AllowInsertingColumns — значение True (Истина) разрешает вставку столбцов. Значение по умолчанию — False (Ложь);  AllowInsertingRows — значение True (Истина) разрешает вставку гиперссылок. Значение по умолчанию — False (Ложь);  AllowInsertingHyperlinks — значение True (Истина) разрешает вставку строк. Значение по умолчанию — False (Ложь);  AllowDeletingColumns — значение True (Истина) разрешает удаление столбцов, все ячейки которых разблокированы. Значение по умолчанию — False (Ложь);  AllowDeletingRows — значение True (Истина) разрешает удаление строк, все ячейки которых разблокированы. Значение по умолчанию — False (Ложь);
416 Глава 13  AllowSorting — значение True (Истина) разрешает сортировку. Все ячейки сор- тируемого диапазона должны быть со снятой защитой или разблокированы. Значение по умолчанию — False (Ложь);  AllowFiltering — значение True (Истина) разрешает установку фильтров. Поль- зователи могут изменять критерии фильтров, но не могут включать или отключать автофильтр. Значение по умолчанию — False (Ложь);  AllowUsingPivotTables — значение True (Истина) разрешает использование сводных таблиц. Значение по умолчанию — False (Ложь). Теперь перейдем к использованию методов защиты листа рабочей книги. 1. Запустите Microsoft Excel 2019 и создайте новую рабочую книгу. 2. На рабочем листе Лист1 нарисуйте четыре кнопки из категории Элементы управления формы и задайте им названия Установить защиту, Снять защиту, Разрешить форматирование ячеек, Запретить форматирование ячеек (рис. 13.9). Рис. 13.9. Кнопки для управления защитой листа 3. Перейдите в среду VBA. 4. Командой Insert | Procedure (Вставить | Процедура) добавьте в модуле Module1 к проекту процедуры с названием Защитить_лист() и Снять_защиту_листа(). 5. В листинге 13.19 приведен код программы, при выполнении которой в случае положительного ответа на соответствующий запрос сохраняются все открытые книги и происходит выход из приложения Microsoft Excel.
Действия с рабочей книгой 417 Листинг 13.19. Процедуры установки защиты листа и снятия защиты листа Public Sub Защитить_лист() Worksheets(1).protect End Sub Public Sub Снять_защиту_листа() Worksheets(1).unprotect End Sub 6. Перейдите в среду Microsoft Excel при помощи нажатия кнопки View Microsoft Excel и назначьте командной кнопке Установить защиту макрос Защитить_ лист в диалоговом окне Назначить макрос объекту (рис. 13.10). Аналогично назначьте макрос Снять_защиту_листа кнопке Снять защиту. Рис. 13.10. Назначение макросов командным кнопкам 7. Проверьте работоспособность командных кнопок. При установке защиты рабочий лист становится полностью защищенным от ввода данных в ячейки и от их форматирования. 8. Вернитесь обратно в редактор VBA. В том же модуле создадим процедуры Разрешить_форматирование_ячеек() и Запретить_форматирование_ячеек() для разрешения и запрета возможности форматировать ячейки защищенного рабочего листа (листинг 13.20). В коде используется свойство Protection.AllowFormattingCells,
418 Глава 13 которое возвращает значение True (Истина), если форматирование ячеек разрешено на защищенном рабочем листе. Листинг 13.20. Процедуры установки разрешения и запрета форматирования ячеек рабочего листа при примененном ранее методе Worksheet.Protect Public Sub Разрешить_форматирование_ячеек() If Worksheets(1).Protection.AllowFormattingCells = False Then Worksheets(1).protect AllowFormattingCells:=True End If End Sub Public Sub Запретить_форматирование_ячеек() If Worksheets(1).Protection.AllowFormattingCells = True Then Worksheets(1).protect AllowFormattingCells:=False End If End Sub 9. Перейдите в среду Microsoft Excel при помощи нажатия кнопки View Microsoft Excel и назначьте командной кнопке Разрешить форматирование ячеек макрос Разрешить_форматирование_ячеек в диалоговом окне Назначить макрос объекту (см. рис. 13.10). Аналогично назначьте кнопке Запретить форматирование ячеек макрос Запретить_форматирование_ячеек. 10. Проверьте работоспособность командных кнопок. Предварительно нажмите кнопку Установить защиту. Затем нажмите кнопку Разрешить форматирование ячеек, тогда команды для форматирования ячеек, расположенные на вкладке ленты Главная, будут доступны (рис. 13.11, а). При нажатии кнопки Запретить форматирование ячеек форматирование на вкладке ленты Главная будет недоступно. Снимите защиту рабочего листа. а б Рис. 13.11. Форматирование ячеек в режиме защищенного листа: а — форматирование разрешено; б — форматирование запрещено
Действия с рабочей книгой 419 11. Сохраните рабочую книгу под именем Листинг_13.19_Листиинг_13.20_Защита_ рабочей_книги.xlsm. Деление рабочего листа на страницы для печати 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+ +<F11>) и добавьте к проекту модуль Module1. 2. Напишите программу, в которой каждый лист рабочей книги делится на печатные страницы. В листинге 13.21 приведен код программы, задающей параметры печатных страниц рабочей книги. Рабочий лист книги Worksheet делится на части, соответствующие печатным страницам. Параметры печатаемой страницы определены при помощи свойства PageSetup. Не забудьте использовать в начале окна кода оператор Option Explicit. Листинг 13.21. Деление рабочего листа на печатные страницы Public Sub Деление_листов_на_страницы() Dim Лист As Worksheet Application.ScreenUpdating = False For Each Лист In ActiveWorkbook.Worksheets With Лист.PageSetup .LeftHeader = ActiveWorkbook.BuiltinDocumentProperties("company") .CenterHeader = Лист.Name .RightHeader = Date .LeftFooter = ActiveWorkbook.FullName .CenterFooter = " " .RightFooter = "С & P по & n" End With Next Лист Set Лист = Nothing Application.ScreenUpdating = True End Sub 3. Для выполнения процедуры нажмите кнопку . Теперь, если отправить файл на печать, страницы будут оформлены в соответствии с заданными установками. 4. Сохраните вновь созданную рабочую книгу с поддержкой макросов под именем Листинг_13.21_Деление_листов_при_печати.xlsm. На рис. 13.12 показан пример распечатки первой страницы Листа1, выполненной в соответствии с оформлением, заданным в листинге 13.21.
420 Глава 13 Рис. 13.12. Пример напечатанной первой страницы Листа1
ГЛАВА 14 Файловые операции При решении многочисленных задач обработки больших объемов информации, бухгалтерского учета, ведения различных картотек, справочников и баз данных используются файлы, которые позволяют запоминать, изменять, хранить и читать различную информацию на внешних носителях. В этой главе рассмотрены файловые операции. Конечно, мы все помним традиционное определение файла как поименованной области на диске компьютера. Соответственно, файл имеет имя. Полное имя файла состоит из пути к файлу, собственно имени и расширения. Расширение файла может содержать от одного до пяти символов. Уточняя определение файла можно отметить, что файл представляет собой структурированный набор данных, содержащий последовательность компонентов (чаще всего — записей) одного типа и одной длины. Образно файл можно представить в виде участка магнитной ленты, у которого есть начало, а конец не фиксирован. Число элементов в файле (длина файла) не ограничено. Это является основным отличием файла от массива. Файл, не содержащий ни одного элемента, называется пустым, — его длина равна нулю. Форматы файлов Microsoft Excel Обратите внимание, что в новых версиях программы Microsoft Excel файлы имеют новые расширения (табл. 14.1). Таблица 14.1. Новые расширения файлов Описание формата Новый Старый Excel — рабочая книга *.xlsx *.xls Excel — рабочая книга с поддержкой макросов *.xlsm *.xls Двоичная книга Excel *.xlsb *.xls Рабочая книга с поддержкой Add-In *.xlam *.xla
422 Глава 14 Таблица 14.1 (окончание) Описание формата Новый Старый Шаблон Excel *.xltx *.xlt Шаблон Excel с поддержкой макросов *.xltm *.xlt Далее мы рассмотрим приемы работы с файлами, начав с самого простого файла — текстового. Метод CreateTextFile для объекта FileSystemObject В примере мы рассмотрим использование методов объекта FileSystemObject, предоставляющего доступ к файловой системе компьютера. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1 с помощью команды Insert | Module (Вставить | Модуль). 2. В диалоговом окне Add Procedure (Добавить процедуру) добавьте процедуру с названием Создание_текстового_файла() и напишите программу, позволяющую создать текстовый файл с расширением txt (листинг 14.1, рис. 14.1). Не забудьте использовать в начале окна кода оператор Option Explicit. Рис. 14.1. Пример создания текстового файла 3. Вначале переменной fs присваивается объект FileSystemObject, содержащийся в библиотеке типов Scripting, который создается методом CreateObject. Затем методом CreateTextFile создается текстовый файл. Это, в свою очередь, объект TextStream, возвращаемый методом CreateTextFile для объекта FileSystemObject. Затем используются два метода объекта TextStream: метод WriteLine для записи указанного текста и символа новой строки в файл TextStream и метод Close — для закрытия файла. Листинг 14.1. Пример создания текстового файла с помощью метода CreateObject Public Sub Создание_текстового_файла() Dim fs As Object Dim a As Object
Файловые операции 423 Set fs = CreateObject("Scripting.FileSystemObject") Set a = fs.CreateTextFile("C:\Users\HOME\Documents\test.txt", True) a.WriteLine("Это текстовый файл с заданным названием, в него помещаются эти записи.") a.Close End Sub 4. Для запуска макроса нажмите клавишу <F5>. 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.1_Создание_текстового_файла.xlsm. Для этого необходимо выбрать команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла выбрать вариант сохранения файла Книга Excel с поддержкой макросов. Э ЛЕКТРОННЫЙ АРХИВ Листинг 14.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_14_Файлы сопровождающего книгу электронного архива. Список файлов указанной папки 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. Создайте процедуру с названием Наличие_файлов() и напишите программу, выводящую на рабочий лист названия Excel-файлов, имеющихся в заданной папке (листинг 14.2, рис. 14.2). Вначале переменной fs присваивается объект FileSystemObject, содержащийся в библиотеке типов Scripting, который создается методом CreateObject. Затем для доступа к папке вызывается метод GetFolder. Рис. 14.2. Пример определения наличия файлов
424 Глава 14 Листинг 14.2. Создание на рабочем листе списка файлов, находящихся в заданной папке Public Dim Dim Dim Dim Dim Dim Sub Список_файлов_в_папке() fs As Object fV As Object fD As Object Dat As Object strDat As String l As Long l = 1 strDat = ActiveWorkbook.Name Set fs = CreateObject("Scripting.FileSystemObject") Set fV = fs.GetFolder("C:\Users\HOME\Documents\Глава_14_Файлы") Set Dat = fV.Files For Each fD In Dat If InStr(fD, "xl") > 0 Then Лист1.Cells(l, 1).Value = fD l = l + 1 End If Next fD MsgBox strDat End Sub 3. Для запуска макроса нажмите клавишу <F5>. 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.2_Список_файлов_в_папке.xlsm. Режим доступа Input/Output Рассмотрим работу режима доступа к файлу Input/Output, используемому в качестве элемента метода открытия текстового файла OpenTextFile объекта FileSystemObject, на примере чтения файловых констант текстового файла. Допустимы следующие константы для задания режима доступа:  ForReading: значение 1 — файл открыт только для чтения;  ForWriting: значение 2 — файл открыт для записи;  ForAppending: значение 8 — файл открыт для добавления. Выполните следующие действия. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. В диалоговом окне Add Procedure (Добавить процедуру) добавьте процедуру типа Function (Функция): Открыть_только_для_чтения(strFileIn As String) As Long и введите код из листинга 14.3.
Файловые операции 425 Текстовый файл открывается при помощи метода OpenTextFile. В этом примере режим доступа Input/Output в методе открытия файла OpenTextFile определен константой ForReading. 3. Напишите программу, читающую текстовый файл (процедура Чтение()), находящийся в указанной папке. В нашем случае это файл C:\Users\HOME\ Documents\test.txt. Вы можете выбрать другой диск и другую папку, а текстовый файл назвать другим именем. 4. Для запуска процедуры вы можете создать управляющую кнопку на рабочем листе и назначить ей макрос Чтение. 5. В программе переменной f присваивается объект FileSystemObject, содержащийся в библиотеке типов Scripting. Для того чтобы это стало возможным, необходимо вызвать команду Tools | References (Инструменты | Ссылки) и в открывшемся диалоговом окне References - VBAProject подключить библиотеку Microsoft Scripting Runtime (рис. 14.3). Рис. 14.3. Диалоговое окно References - VBAProject Листинг 14.3. Открытие текстового файла только для чтения Public Function Открыть_только_для_чтения(strFileIn As String) As Long Dim f As Scripting.FileSystemObject Dim Pf As Scripting.TextStream Dim strT As String Dim i As Long Set f = New Scripting.FileSystemObject Set Pf = f.OpenTextFile(strF, ForReading, False) Do While Pf.AtEndOfStream <> True strT = Pf.ReadLine
426 Глава 14 i = i + 1 Debug.Print strT Loop Pf.Close Set Pf = Nothing Set f = Nothing TextDat_Читать = i End Function Public Sub Чтение() Открыть_только_для_чтения ("C:\Users\HOME\Documents\test.txt") End Sub 6. Для выполнения процедуры нажмите кнопку . Данные из текстового файла появляются в окне просмотра Immediate, вызываемого командой View | Immediate Window (Вид | Окно просмотра), при выполнении команды Debug.Print. 7. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.3_Чтение_текстового_файла.xlsm. Файлы из Application.AddIns AddIns — это коллекция объектов, представляющих собой все надстройки программы Microsoft Excel независимо от того, установлены они на вашем компьютере или нет. Список всех доступных надстроек представлен в диалоговом окне Add-in Manager, вызываемом командой Add-Ins из меню редактора Visual Basic. В самом приложении Microsoft Excel информация о надстройках и их описание представлено на вкладке Надстройки в диалоговом окне Параметры Excel (рис. 10.4), вызываемом при помощи команды Файл | Параметры. Файлы EUROTOOL.XLAM, ANALYS32.XLL, ATPVBAEN.XLAM, SOLVER.XLAM являются файлами надстроек Microsoft Excel и представляют собой пакет для конвертации и форматирования евровалюты, пакет анализа, пакет анализа VBA, поиск решений. Подключить перечисленные надстройки, относящиеся к типу Надстройки Excel, можно в диалоговом окне Надстройки. Для его вызова перейдите из редактора VBA в Microsoft Excel, нажав кнопку , затем перейдите на вкладку Разработчик и нажмите кнопку Надстройки Excel. Подключите настройку Поиск решения (рис. 14.5). Теперь напишем макрос, в котором проверим наличие надстроек, подключенных в рабочей книге. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. В диалоговом окне Add Procedure (Добавить процедуру) добавьте процедуру с названием Показать_надстройки() (листинг 14.4) и напишите программу,
Файловые операции 427 Рис. 14.4. Диалоговое окно Параметры Excel, раздел Надстройки Рис. 14.5. Диалоговое окно Надстройки
428 Глава 14 позволяющую выводить на лист информацию о надстройках текущей версии программы Microsoft Excel с сообщением, установлены они на компьютере или нет (сообщения "ИСТИНА"/"ЛОЖЬ"). Листинг 14.4. Пример вывода на лист информации об установленных надстройках Sub Показать_надстройки() Worksheets("Лист1").Activate rw = 1 For Each ad In Application.AddIns Worksheets("Лист1").Cells(rw, 1) = ad.Name Worksheets("Лист1").Cells(rw, 2) = ad.Installed rw = rw + 1 Next End Sub 3. Для запуска макроса нажмите клавишу <F5>. Результат работы макроса показан на рис. 14.6. Напротив ячейки с текстом SOLVER.XLAM находится значение ИСТИНА. Рис. 14.6. Пример вывода на лист информации о файлах надстроек 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.4_Надстройки.xlsm. Объект FileDialog 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. С использованием диалогового окна Add Procedure (Добавить процедуру) добавьте процедуру Файловый_диалог() и напишите программу, позволяющую выводить на экран окно Обзор (листинг 14.5).
Файловые операции 429 Листинг 14.5. Пример вывода на экран окна Обзор Sub Файловый_диалог() Dim fd As FileDialog Set fd = Application.FileDialog(msoFileDialogFilePicker) Dim vrtSelectedItem As Variant With fd If .Show = -1 Then For Each vrtSelectedItem In .SelectedItems MsgBox " Выбран путь: " & vrtSelectedItem Next vrtSelectedItem Else End If End With Set fd = Nothing End Sub 3. Для выполнения процедуры нажмите кнопку Обзор (рис. 14.7). — откроется диалоговое окно 4. Тип диалогового окна задается при помощи константы msoFileDialogFilePicker свойства Application.FileDialog. Когда пользователь выбирает файл в диалоговом окне и нажимает кнопку Да, выводится текстовое сообщение с указанием полного пути файла. 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.5_Файловый_диалог.xlsm. Рис. 14.7. Диалоговое окно Обзор, вызванное в программе
430 Глава 14 Функция GetAttr Рассмотрим пример с использованием функции GetAttr, которая возвращает значение типа Integer, определяющее атрибуты файла, каталога или папки. Значение, возвращаемое функцией GetAttr, является суммой значений перечисления: vbNormal — обычный, vbReadOnly — только для чтения, vbHidden — скрытый, vbSystem — системный, vbDirectory — каталог или папка, vbArchive — файл, измененный после создания последней резервной копии, vbAlias — файл, у которого есть другое имя. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. В диалоговом окне Add Procedure (Добавить процедуру) добавьте процедуру типа Function (Функция): Db_Ver(ByVal pFad As String) As Boolean и введите код из листинга 14.6. Здесь функция Db_Ver обращается к функции GetAttr, чтобы установить, существует файл или нет. 3. С использованием диалогового окна Add Procedure (Добавить процедуру) добавьте процедуру Поиск_файла() и напишите программу, выполняющую поиск файла. 4. Для запуска процедуры вы можете создать управляющую кнопку на рабочем листе и назначить ей макрос Поиск_файла. Листинг 14.6. Пример поиска файла Public Function Db_Ver(ByVal pFad As String) As Boolean On Error Resume Next Db_Ver = (GetAttr(pFad) And vbDirectory) = 0 End Function Public Sub Поиск_файла() b = Db_Ver("C:\Users\HOME\Documents\Глава_14_Файлы\Поиск_файла_Листинг_14.6.xlsm") If b = False Then MsgBox "Файл не найден!" Else MsgBox "Файл был найден по указанному адресу!" End If End Sub 5. Нажмите кнопку рис. 14.8. . Возможные результаты поиска файлов показаны на 6. Сохраните созданный документ с поддержкой макросов под именем Листинг_14.6_ Поиск_файла.xlsm.
Файловые операции 431 а б Рис. 14.8. Сообщения о файлах: а — отсутствие; б — наличие Документирование информации о файле Выполним документирование информации об активной рабочей книге, создав функцию, определенную пользователем. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. В диалоговом окне Add Procedure (Добавить процедуру) создайте функцию Doc(Nr As Integer) и напишите программу, использующую метод GetFile для объекта FileSystemObject (листинг 14.7). Данный метод возвращает объектфайл, соответствующий файлу по указанному пути. Получив доступ к файлу, можно определить его различные свойства, такие как Object.Path — полный адрес, определяющий местонахождение файла, Object.Name — имя указанного файла, Object.DateCreated — дату и время создания указанного файла и другие свойства. Листинг 14.7. Пример документирования файла Microsoft Excel Public Function Doc(Nr As Integer) Dim fso As Object Dim tmp As String On Error Resume Next Set fso = CreateObject("Scripting.FileSystemObject") With fso.GetFile(ActiveWorkbook.FullName) Select Case Nr Case Is = 1 tmp = .Path Case Is = 2 tmp = Mid(.Path, 1, Len(.Path) - Len(.Name)) Case Is = 3 tmp = .Name Case Is = 4 tmp = .Type Case Is = 5 tmp = .Size Case Is = 6 tmp = .DateCreated
432 Глава 14 Case Is = 7 tmp = .DateLastModified Case Is = 8 tmp = .DateLastAccessed Case Else tmp = "Номер N - данных нет" End Select End With Doc = tmp End Function 3. Заполните ячейки А1:А9 цифрами с 1 по 9 соответственно. В ячейке В1 вызовите функцию Doc категории Определенные пользователем (рис. 14.9, а), введите аргумент (рис. 14.9, б). 4. Выполните автозаполнение ячеек В1:В9 — результат налицо (рис. 14.9, в). Свойства активной рабочей книги записаны в ячейки. а б Рис. 14.9. (Часть 1 из 2) Работа с функцией Doc: а — ее вызов из категории Определенные пользователем; б — ввод аргумента
Файловые операции 433 в Рис. 14.9. (Часть 2 из 2) Работа с функцией Doc: в — результат выполнения функции 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.7_Документирование.xlsm. Проверка существования файла Ранее уже была показана процедура, выполняющая поиск файла (см. листинг 14.6). Программа обращалась к логической функции Db_Ver. Теперь напишем небольшую процедуру, использующую функции Dir, относящуюся к категории функций VBA для управления файлами. Функция Dir — давно, еще со времен DOS, известная команда, которая, тем не менее, применяется до сих пор. Она возвращает файл или папку (каталог), соответствующие образцу, указанному в аргументе PathName. Если образцу соответствуют несколько файлов, то возвращается первый из них. Таким образом, команда Dir позволяет проверить существование файлов на диске. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. С использованием диалогового окна Add Procedure (Добавить процедуру) добавьте процедуру Наличие_файла() и напишите программу, определяющую наличие файла (листинг 14.8). Листинг 14.8. Пример программы, определяющей наличие файла Sub Наличие_файла() Const str1 As String = "C:\test\Наличие.xlsm" If Dir (str1) <> "" Then MsgBox "Файл """ & str1 & """ в наличии."
434 Глава 14 Else MsgBox " Файл """ & str1 & """ не найден." End If End Sub 3. Для выполнения процедуры нажмите кнопку . 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.8_Наличие_файла.xlsm. Оператор Kill для удаления файла Напишем процедуры удаления заданного файла с помощью VBA-команды Kill. Не пугайтесь, что будут удалены все файлы из компьютера, — действие функции распространяется только на конкретный файл с указанным адресом. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. В диалоговом окне Add Procedure (Добавить процедуру) добавьте процедуру Удаление_файла() и напишите программу, удаляющую заданный файл (листинг 14.9). Листинг 14.9. Пример программы, выполняющей удаление файла Sub Удаление_файла() Const str1 As String = "C:\Users\Documents\test.xlsm" Dim i As Integer 'Ввод подтверждения удаления файла i = MsgBox("Вы действительно хотите удалить файл " & str1 & "?", _ vbYesNo) If Dir(str1) <> "" And i = vbYes Then Kill (str1) MsgBox "Файл в" & str1 & " будет удален." ElseIf i = vbNo Then MsgBox "Файл не будет удален." Else MsgBox " Файл в " & str1 & " не найден!" End If End Sub 3. Для выполнения процедуры нажмите кнопку . 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.9_Удаление_файла.xlsm.
Файловые операции 435 Оператор FileCopy для копирования файла Напишем процедуру копирования файлов с помощью VBA-оператора FileCopy. Не забудьте, что файл в компьютере должен быть создан, — действие функции распространяется только на прописанный в заданной папке файл. Синтаксис оператора FileCopy: FileCopy source, destination где используются следующие именованные аргументы:  source — обязательный аргумент в виде строки, задающей имя копируемого файла;  destination — обязательный аргумент в виде строки, задающей имя целевого файла. Для нашего примера заранее созданы две папки (Папка1 и Папка2) — для старого и нового файла и сам файл TEST1.xlsm. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. В диалоговом окне Add Procedure (Добавить процедуру) добавьте процедуру с названием Копирование_файла и напишите программу, выполняющую копирование заданного файла (листинг 14.10). Листинг 14.10. Пример программы, выполняющей копирование файла Sub Копирование_файла() Const strOld As String = "C:\Папка1\" Const strNew As String = "C:\Папка2\" Const strFile As String = "TEST1.xlsm" If Dir(strOld & strFile) <> "" And Dir(strNew, vbDirectory) <> "" Then FileCopy strOld & strFile, strNew & strFile MsgBox "Данные будут скопированы!" Else MsgBox "Путь к данным указан не верно!" End If End Sub 3. Для выполнения процедуры нажмите кнопку — файл удачно скопирован, и это подтверждается соответствующим сообщением. 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.10_Копирование_файла.xlsm.
436 Глава 14 Переименование файла Напишем процедуру переименования одного файла. Не забудьте, что этот файл в компьютере должен быть, — действие процедуры распространяется только на прописанный в заданной папке файл. Для нашего примера заранее создана папка Папка1 и сам файл TEST2.xlsm. Переименование осуществляется при помощи VBAоператора Name. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. В диалоговом окне Add Procedure (Добавить процедуру) добавьте процедуру с названием Переименование_файла и напишите программу, выполняющую переименование одного файла (листинг 14.11). Листинг 14.11. Пример программы, выполняющей переименование файла Sub Переименование_файла() Const strOld As String = "C:\Папка1\TEST2.xlsm" Const strNew As String = "C:\Папка1\TEST3.xlsm" If Dir(strOld) <> "" Then Name strOld As strNew MsgBox "Данные """ & strOld & _ """ будут переименованы! """ & strNew & """" Else MsgBox "Данные " & strOld & " не найдены!" End If End Sub 3. Для выполнения процедуры нажмите кнопку — файл удачно переименован, и это подтверждается соответствующим сообщением. 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.11_Переименование_файла.xlsm. Перемещение файла Напишем процедуру перемещения одного файла. Не забудьте, что этот файл в компьютере должен быть, — действие процедуры распространяется только на прописанный в заданной папке файл. Для нашего примера заранее созданы две папки (Папка1 и Папка2) — для исходного и перемещенного файла и сам файл TEST7.xlsm. Его следует переместить из папки Папка1 в папку Папка2. Для перемещения используется VBA-команда Name. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1.
Файловые операции 437 2. В диалоговом окне Add Procedure (Добавить процедуру) добавьте процедуру с названием Перемещение_файла и напишите программу, выполняющую перемещение одного файла (листинг 14.12). Не забудьте использовать в начале окна кода оператор Option Explicit. Листинг 14.12. Пример программы, выполняющей перемещение файла Sub Перемещение_файла() Const strOld As String = "C:\Папка1\TEST7.xlsm" Const strNew As String = "C:\Папка2\TEST7.xlsm" If Dir (strOld) <> "" And Dir(strNew) = "" Then Name strOld As strNew ElseIf Dir(strOld) = "" Then MsgBox "Файла нет в " & strOld ElseIf Dir(strNew) <> "" Then MsgBox "Файл уже в " & strNew End If End Sub 3. Для выполнения процедуры нажмите кнопку — файл удачно перемещен, и это подтверждается соответствующим сообщением. 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.12_Перемещение_файла.xlsm.
438 Глава 14
ГЛАВА 15 Отладка программ и сообщения об ошибках Не ошибается только тот, кто ничего не делает. Вы, наверное, слышали, что "Шахматы — это гимнастика ума". Про программирование можно сказать то же самое: "Программирование — это гимнастика ума". И, конечно же, процесс программирования неотделим от появления ошибок и их устранения, т. е. от отладки программ. В этой главе рассмотрены вопросы отладки программ и обработки сообщений. Возникновение ошибок При программировании на языке VBA могут возникнуть различные ошибки. И их не всегда легко обнаружить и ликвидировать. Согласно документации и глоссарию редактора VBE (Visual Basic Editor) ошибки делятся на ошибки выполнения (так называемые run-time error), ошибки компиляции (compile error) и логические ошибки. Ошибки могут случиться просто при наборе текста, в расчетах при переполнении, в результате неправильного объявления переменных, при не подключении библиотек и т. д. Ошибки могут быть синтаксические, возникающие, если в окне кода вводится строка, которую редактор VBA не может распознать, а также логические, приводящие к некорректным результатам выполнения кода или остановке выполнения. Логические ошибки образуются при неправильном именовании переменных, неправильных типах переменных, бесконечном цикле, ошибках сравнения или проблемах с массивами. Ранее уже было сказано о необходимости наличия оператора Option Explicit, который контролирует процесс выполнения программы. На рис. 15.1 показаны некоторые ошибки выполнения (рис. 15.1, а — ошибка переполнения; рис. 15.1, б — ошибка при делении на ноль; рис. 15.1, в — метод Workbook.FollowHyperlink, служащий для отображения документа, загружаемого из Интернета, не сработал; рис. 15.1, г — ошибка автоматизации) и ошибки компиля-
440 Глава 15 а б в г д е Рис. 15.1. Диалоговые окна: а–г — ошибки выполнения; д, е — ошибки компиляции ции (рис. 15.1, д — тип, определенный пользователем, не определен; рис. 15.1, е — переменная не определена). Выявление и исправление ошибок 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA, выбрав на вкладке ленты Разработчик раздел Visual Basic или нажав клавиши <Alt>+<F11>. На экране откроется окно интегрированной среды разработки приложений Microsoft Visual Basic. Книга 1. 2. Добавьте к проекту модуль Module1 с помощью команды Insert | Module (Вставить | Модуль). 3. Напишите программу, в которой переменная i описана как Byte — значения таких переменных определены в диапазоне от 0 до 255. В нашем случае пере-
Отладка программ и сообщения об ошибках 441 менная i принимает значение, равное 76 732 (листинг 15.1). Не забудьте использовать в начале окна кода оператор Option Explicit. Листинг 15.1. Пример переполнения Sub Проверка() Dim i As Byte i = 76732 End Sub 4. Для выполнения процедуры воспользуйтесь командой Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). Запустить макили нажатием клавиши <F5>. рос на выполнение можно также кнопкой 5. По выполнении макроса сразу появляется сообщение об ошибке выполнения, (рис. 15.2, а). А если вы нажмете кнопку Debug, то строка с ошибкой окрасится желтым цветом (рис. 15.2, б). К сожалению, в окне с констатацией ошибки содержится немного информации о том, как эту ошибку исправить, но это лучше, чем ничего. Понятно, что произошло переполнение (англ. overflow — переполнение). а б Рис. 15.2. Окно с сообщением об ошибке (а) и содержащая ее строка в VBE (б)
442 Глава 15 6. Сохраните этот документ с поддержкой макросов под именем Листинг_15.1_ Проверка.xlsm. Для этого выберите команду Файл | Сохранить как и в диалоговом окне Сохранение документа в раскрывающемся списке Тип файла укажите вариант сохранения файла Книга Excel с поддержкой макросов. Э ЛЕКТРОННЫЙ АРХИВ Листинг 15.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_15_Ошибки сопровождающего книгу электронного архива. Три окна для просмотра ошибок Вообще, для просмотра ошибок есть три окна, вызываемые командой View (Вид). Окно просмотра Immediate Окно просмотра Immediate (Окно просмотра) можно вызвать командой View | Immediate Window (Вид | Окно просмотра), а также одновременным нажатием клавиш <Ctrl>+<G>. Продолжите работу с файлом из предыдущего примера и вызовите это окно. Оказывается, в нем можно посмотреть не только результат выполнения команды Debug.Print, но и другую информацию. Причем это окно можно сделать "плавающим", убрав его закрепление на неподвижной "стоянке". Если набрать в этом окне ?ActiveSheet (рис. 15.3, а) и нажать клавишу <Enter>, то появится окно сообщения об ошибке 438, означающей, что объект не поддерживает это свойство или метод (рис. 15.3, б). А вот если теперь в этом же окне набрать ?ActiveSheet.Name и нажать клавишу <Enter>, то появится правильный ответ на вопрос (рис. 15.3, в). а б в Рис. 15.3. Запрос информации в окне Immediate: а — ввод строки запроса; б — появление сообщения об ошибке выполнения; в — ответ на правильный запрос Кстати, если вам не хочется вводить на лист книги данные вручную, следует написать в окне Immediate (Окно просмотра): Range("A1:B10").Value=50, и данные заполнят ячейки! 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1.
Отладка программ и сообщения об ошибках 443 2. Напишите процедуру, в процессе выполнения которой строковая переменная принимает два разных значения (листинг 15.2, а). Листинг 15.2, а. Пример со строковой переменной Sub Проверка1() Dim strT As String strT = "Excel-VBA" Debug.Print strT strT = "Автоматизация приложений средствами VBA" Debug.Print strT End Sub 3. Для запуска макроса нажмите клавишу <F5>. Надписи в окне Immediate (Окно просмотра) появились одна под другой (рис. 15.4, а). Значит, после каждого заполнения текущим содержимым переменная передается в окно проверки. а б Рис. 15.4. Надписи в окне Immediate: а — одна под другой; б — в одну строку 4. Для того чтобы надписи располагались в одну строку, необходимо изменить программу (листинг 15.2, б). Листинг 15.2, б. Пример с двумя строковыми переменными Sub Проверка2() Dim str1 As String, str2 As String Str1 = "Excel-VBA" Str2 = "Автоматизация приложений средствами VBA" Debug.Print str1, str2 End Sub 5. Для запуска макроса нажмите кнопку — надписи расположились в одной строке (рис. 15.4, б). 6. Сохраните этот документ с поддержкой макросов под именем Листинг_15.2_ Проверка.xlsm.
444 Глава 15 Окно Locals Второе окно для просмотра ошибок — это окно Locals (Локальные переменные), вызываемое командой View | Locals (Вид | Локальные переменные). Используйте это окно! В нем можно просмотреть содержимое переменных и типов. Окно состоит из трех разделов: Expression (Выражение), Value (Значение) и Type (Тип). Первоначально окно Locals (Локальные переменные) пустое. 1. Создайте новый файл Microsoft Excel 2019 и перейдите в среду VBA. Добавьте к проекту модуль Module1 и напишите программу для отображения набора данных (листинг 15.3). Листинг 15.3. Пример набора данных для отображения Sub Проверка3() Dim i As Integer, n As Single Dim d As Date, str As String i = 1293 n = 5.4321 d = Now str = "Excel VBA" End Sub 2. Установив курсор на последнюю строку процедуры и нажав клавишу <F9>, вы увидите, что строка стала коричневой, причем слева от нее появилась жирная коричневая точка (рис. 15.5, а) — это точка прерывания. При запуске макроса (нажатием клавиши <F5>) в окне Locals (Локальные переменные) появится информация (рис. 15.5, б). После выполнения макроса выбранная строчка из коричневой стала желтой, а точка превратилась в стрелку (рис. 15.5, в). 3. Для того чтобы убрать точку прерывания, нужно повторно нажать на клавишу <F9>, а чтобы удалить все точки прерывания, необходимо нажать одновременно клавиши <Ctrl>+<Shift>+<F9>. 4. Для того чтобы продолжить выполнение макроса, выполните команду меню Run | Continue (Выполнить | Продолжить). Если желтое выделение осталось, выполните команду меню Run | Reset (Выполнить | Сбросить). 5. Сохраните созданный документ с поддержкой макросов под именем Листинг_15.3_ Проверка.xlsm. Контрольную точку прерывания (точку останова) можно устанавливать или снимать не только с помощью клавиш, но и командой Debug | Toggle Breakpoint (Отладка | Точка останова). П РИМЕЧАНИЕ Точка прерывания — одно из ключевых понятий при нахождении ошибки. Вы должны вовремя остановиться и выяснить, нет ли в этом месте ошибки.
Отладка программ и сообщения об ошибках 445 а б в Рис. 15.5. Работа с окном Locals: а — установка точки прерывания в окне кода; б — отображение информации в окне Locals; в — подсветка строки с точкой прерывания желтым цветом Окно наблюдения Watches Третье окно для просмотра ошибок — это окно Watches (Окно наблюдения), вызываемое командой View | Watch Window (Вид | Окно наблюдения). Используйте и это окно! В нем можно просмотреть информацию о значениях переменных и их
446 Глава 15 типе. Окно Watches (Окно наблюдения) состоит из четырех разделов: Expression (Выражение), Value (Значение), Type (Тип) и Context (Область применения). Первоначально это окно пустое (рис. 15.6, а). Вообще-то, окно Watches (Окно наблюдения) очень похоже на предыдущее, но в нем появился новый столбец Context (Область применения). Надо отметить, что с этим окном работать несколько сложнее, чем с предыдущим. а б в г Рис. 15.6. Работа с окном Watches: а — исходный режим окна; б — его контекстно-зависимое меню; в — диалоговое окно Add Watch; г — список наблюдаемых переменных в окне Watches Обратитесь к файлу Листинг_15.3_Проверка.xlsm и вызовите окно Watches (Окно наблюдения). Щелкните правой кнопкой мыши по этому окну, появится контекстнозависимое меню (рис. 15.6, б). Выберите команду Add Watch (Добавить окно наблюдения) — откроется одноименно диалоговое окно (рис. 15.6, в). Задайте в нем наблюдаемую переменную, область применения (в нашем случае это процедура Проверка3()). Укажите способ наблюдения переменной в области Watch Type (Вид наблюдения), выбрав один из трех переключателей: Watch Expression (Наблюдать переменную), при этом вычисленное значение будет отражено в столбце Values; Break When Value Is True — остановиться и перейти в режим Break Mode (Режим останова), если значение наблюдаемой переменной True (Истина) и Break When Value Is Changes — остановиться и перейти в режим Break Mode (Режим остано-
Отладка программ и сообщения об ошибках 447 ва), если значение наблюдаемой переменной изменится. После установки необходимых параметров щелкните в диалоговом окне Add Watch (Добавить наблюдаемую переменную) по кнопке OK. В окне Watches (Окно наблюдения) появится информация о выделенной переменной (рис. 15.6, г). Так можно указывать любую переменную и повторять все эти действия, проанализировав работу каждой переменной. В процессе отладки или тестирования уже появлялись окна сообщений с ошибками (см. рис. 15.2, а и 15.3, б), и мы обсуждали причины их появления. В табл. 15.1 приведены коды наиболее часто встречающихся ошибок. Таблица 15.1. Коды наиболее часто встречающихся ошибок, перехватываемых Visual Basic Код Сообщение Описание 5 Invalid procedure call Неверный вызов процедуры 6 Overflow Переполнение 7 Out of memory Недостаточно памяти 9 Subscript out of range Индекс вне заданного диапазона 11 Division by zero Деление на ноль 13 Type mismatch Несоответствие типа 18 User interrupt occurred Произошло прерывание по команде пользователя 52 Bad file name or number Неверное имя или номер файла 53 File not found Файл не найден 54 Bad file mode Неверный режим открытия файла 55 File already open Файл уже открыт 57 Device I/O error Ошибка устройства ввода/вывода 61 Disk full Диск переполнен 68 Device unavailable Устройство недоступно 71 Disk not ready Диск не готов 76 Path not found Каталог не найден 368 The specified file is out of date. This program requires a later version Данный файл устарел. Эта программа требует более новой версии 424 Object required Необходим объект 429 ActiveX component can’t create object or return reference to this object Компонент ActiveX не может создать объект или возвратить ссылку на этот объект
448 Глава 15 Объект Err Объект Err содержит сведения об ошибках во время выполнения. Основные свойства объекта Err:  Number — возвращает код ошибки;  Source — возвращает имя программного файла, в котором возникла ошибка;  Description — возвращает строковое выражение, содержащее текст сообщения об ошибке, соответствующей коду ошибки;  HelpFile — возвращает полное имя файла справки (выход в Интернет и нахож- дение сайта) для уточнения информации об ошибке;  HelpContext — возвращает идентификатор раздела справочной системы, указан- ный в свойстве HelpFile;  LastDLLError — возвращает системный код ошибки для последнего вызова биб- лиотеки динамической компоновки (DLL). Основные методы объекта Err:  Clear — очищает все значения свойств объекта Err, служит для явной очистки значений свойств объекта после завершения обработки ошибки. Это необходимо, например, при отложенной обработке ошибки, которая задается оператором On Err Resume Next;  Raise — создает ошибку выполнения. Используется для моделирования ситуа- ций ошибки. Синтаксис метода: Raise Number, Source, Description, HelpFile, helpContext где Number — номер ошибки, целое число от 0 до 65 535 (т. е. на количество ошибок отведено 2 байта). Оператор On Error В идеале разрабатываемое приложение никогда не должно аварийно прерываться. Для перехвата любой возможной ошибки, ее обработки и выдачи сообщения пользователю в VBA существует оператор On Error. Оператор On Error перехватывает ошибку и задает действия программы при появлении ошибки. Процедура обработки ошибки определяет тип возникшей ошибки и устанавливает образ действий программы в зависимости от типа ошибки. Синтаксис процедуры: On Error GoTo Строка Здесь оператор On Error активизирует процедуру обработки ошибки, начало которой определяется обязательным параметром Строка. Его значением может быть либо метка, либо номер строки.
Отладка программ и сообщения об ошибках 449 Оператор On Error Resume Next указывает, что при возникновении ошибки во время выполнения управление передается оператору, следующему непосредственно за тем, в котором возникла ошибка, и выполнение продолжается с этой точки. Оператор On Error GoTo 0 отключает включенный обработчик ошибок в текущей процедуре и сбрасывает его в Nothing. Оператор On Error Resume Next 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. Напишите программу, в которой есть обращение к несуществующему листу (листинг 15.4, а). Листинг 15.4, а. Обращение к несуществующему листу Sub Имя_листа() Worksheets(5).Name = "Новое_имя" End Sub 3. Для запуска макроса нажмите кнопку (рис. 15.7). — появится сообщение об ошибке 9 Рис. 15.7. Сообщение об ошибке 9 4. Добавьте в программу оператор перехвата и обработки ошибки On Error Resume Next (листинг 15.4, б), и при повторном запуске макроса подобное сообщение не появится.
450 Глава 15 Листинг 15.4, б. Добавление оператора On Error Resume Next Sub Имя_листа() On Error Resume Next Worksheets(5).Name = "Новое_имя" End Sub 5. Сохраните созданный документ с поддержкой макросов под именем Листинг_15.4_ Переход_по_Resume.xlsm. Оператор On Error GoTo: вариант 1 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. Напишите программу (листинг 15.5), в которой прописан переход по метке, в случае, если файл с указанием его расположения (диск, папка, имя и расширение файла, т. е. полное имя файла) не найден, т. е. его невозможно открыть. При возникновении такой ошибки происходит переход по метке М. Листинг 15.5. Пример использования оператора On Error GoTo Sub Переход_по_метке() Dim str1 As String Dim str2 As String On Error GoTo M str1 = "E:\" str2 = "Листинг_15.4_Переход_по_Resume.xlsm" Workbooks.Open str1 & str2 Exit Sub M: MsgBox "Указанный файл с именем " & str2 & " не найден." End Sub 3. Для запуска макроса нажмите кнопку . Если возникнет ошибка, связанная с отсутствием файла, то появится сообщение, что указанный файл с именем Листинг_15.4_Переход_по_Resume.xlsm не найден, в противном случае файл будет открыт и произойдет выход из процедуры, заданный при помощи конструкции Exit Sub. 4. Сохраните созданный документ с поддержкой макросов под именем Листинг_15.5_ Оператор_On_Error_GoTo.xlsm. Оператор On Error GoTo: вариант 2 Рассмотрим пример действия оператора On Error GoTo с использованием свойства Application.EnableCancelKey, когда оно принимает значение xlErrorHandler.
Отладка программ и сообщения об ошибках 451 Свойство Application.EnableCancelKey управляет тем, как приложение Microsoft Excel реагирует на прерывания выполняемой процедуры пользователем, который нажимает сочетания клавиш <Ctrl>+<Break> или <Esc>. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. Напишите программу (листинг 15.6), в которой прописан переход к ячейке А20000. Предварительно появляется окно сообщения, что переход будет долгим, и если желание продолжить процедуру остается, то следует нажать кнопку OK. Установка свойства Application.EnableCancelKey в значение xlErrorHandler означает, что прерывание, созданное нажатием клавиш, воспринимается в процедуре как ошибка, перехватываемая обработчиком ошибок, настроенным с помощью оператора On Error GoTo. Листинг 15.6. Пример использования оператора On Error GoTo и свойства Application.EnableCancelKey Sub Ошибка18() Dim i As Integer, str As String On Error GoTo METKA Application.EnableCancelKey = xlErrorHandler str = MsgBox("Внимание, понадобится время. " & _ "Эту процедуру не прервать. " & _ "ВЫ ПРОДОЛЖИТЕ?", vbOKCancel) If str = vbOK Then For i = 1 To 20000 Cells(i, 1).Select Next i End If Exit Sub METKA: If Err = 18 Then MsgBox "Ошибка." End Sub Для запуска макроса нажмите кнопку . Если нажать кнопку OK, тогда после выполнения процедуры ячейка А20000 станет активной. Но если при выполнении процедуры нажать клавишу <Esc>, то процедура отреагирует на прерывание как на ошибку — с переходом по метке и выдачей указанного сообщения в информационном окне (рис. 15.8). 3. Сохраните созданный документ с поддержкой макросов под именем Листинг_15.6_ Переход_по_метке_и_ошибка.xlsm.
452 Глава 15 Рис. 15.8. Результат прерывания процедуры при нажатии клавиши <Esc> Константы xlDisabled и xlInterrupt свойства Application.EnableCancelKey 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. Напишите программу (листинг 15.7), в которой прописан переход к ячейке А20000. В этом примере свойство Application.EnableCancelKey определяет действие компьютера при нажатии комбинации клавиш, используемой для прерывания выполнения процедуры. Причем в нашем случае это свойство сначала принимает значение xlDisabled (перехват нажатия клавиши отмены полностью отключен), а затем значение xlInterrupt (текущая процедура прерывается, и пользователь может выполнить отладку или завершить процедуру). Листинг 15.7. Пример использования свойства EnableCancelKey Sub Разрешение_запрет_прерывания() Dim i As Integer ' В этом блоке процедуры она не будет прервана Application.EnableCancelKey = xlDisabled For i = 1 To 20000 Cells(i, 1).Select Next i ' Здесь процедура может быть прервана Application.EnableCancelKey = xlInterrupt For i = 1 To 20000 Cells(i, 2).Select Next i End Sub
Отладка программ и сообщения об ошибках 453 3. Для запуска макроса нажмите кнопку ка А20000 стала активной. — после выполнения процедуры ячей- 4. Сохраните созданный документ с поддержкой макросов под именем Листинг_15.7_ Свойство_EnableCancelKey.xlsm. Массив листов Рассмотрим еще один пример с использованием оператора On Error GoTo. Напишем программу (листинг 15.8), в которой выделяются листы заданного массива, а остальные листы не выделяются. 1. Создайте новый файл Microsoft Excel 2019, добавьте еще три листа: Лист2, Лист3 и Лист4. Расположение их не важно, главное, чтобы указанные в коде имена рабочих листов существовали, иначе возникнет ошибка и появится соответствующее сообщение. 2. Перейдите в среду VBA и добавьте к проекту модуль Module1. 3. Код содержит оператор обработки ошибки On Error GoTo, активируемый при отсутствии листа, указанного в массиве. Не забудьте указать в начале окна кода оператор Option Explicit. Листинг 15.8. Пример выделения листов массива Public Sub Выбор_массива_листов() On Error GoTo M Sheets(Array("Лист1", "Лист2", "Лист3")).Select Exit Sub M: If Err.Number = 9 Then MsgBox "Указанные листы не в наличии" End If End Sub 4. Для запуска макроса нажмите кнопку выделены. — три листа Лист1, Лист2 и Лист3 5. Сохраните созданный документ с поддержкой макросов под именем Листинг_15.8_ Массив_листов.xlsm. Команда меню Debug В среде VBA есть специальная команда меню Debug (Отладка) (рис. 15.9, а), открывающая вложенный список команд меню, содержащий сами команды и соответствующие комбинации клавиш, позволяющие проводить отладку пошагово. В переводе с англ. debug — отладка.
454 Глава 15 а б Рис. 15.9. Команды меню Debug (a) и ошибка, обнаруженная во время отладки (б) Для выполнения программы в пошаговом режиме предусмотрены четыре команды: 1. Команда Debug | Step Into (Отладка | Шаг с заходом) позволяет последовательно шаг за шагом отлаживать всю программу, включая процедуры, выполняемые в ней. 2. Команда Debug | Step Over (Отладка | Шаг с обходом) позволяет последовательно шаг за шагом отлаживать всю программу, но если встретится процедура, то она выполнится полностью, а не пошагово, как это делает предыдущая команда. 3. Команда Debug | Step Out (Отладка | Шаг с выходом) завершает выполнение процедуры и останавливается на следующей инструкции программы, откуда процедура была вызвана. 4. Команда Debug | Run To Cursor (Отладка | Выполнение до курсора) выполняет программу до инструкции, помеченной курсором. Можно вызывать команды из меню или пользоваться соответствующими клавиатурными сокращениями. Ошибки компиляции появляются в диалоговом окне, которое имеет типичную структуру (рис. 15.9, б).
ГЛАВА 16 Программирование связей В этой главе мы рассмотрим возможности связи с внешним миром. Здесь освещены вопросы управления Интернетом и использования гиперссылок посредством VBA, а также приведены примеры взаимодействия приложений Microsoft Office и внедрение одних объектов в другие методами OLE (Object Linking and Embedding). Следует иметь в виду, что при рассмотрении этих примеров необходимо с помощью VBA-команды Tools | Reference (Инструменты | Ссылки) подключить библиотеки Microsoft Office 16.0 Object Library (для рассылки e-mail и использования приложения Microsoft Outlook) и библиотеки Microsoft PowerPoint 16.0 Object Library (для работы с приложением Microsoft PowerPoint). Гиперссылки 1. Создайте новый файл Microsoft Excel 2019 и добавьте в книгу два листа. 2. Если на ленте перейти к группе Ссылки вкладки Вставка, то нажатие кнопки Ссылка (рис. 16.1, а) приведет к открытию диалогового окна Вставка гиперссылки (рис. 16.1, б), в левой панели которого можно выбрать тип связи. Таким образом можно создать гиперссылку с помощью ленты. В зависимости от выбора опции меняется центральная часть этого окна. Просмотрите все возможные команды, доступные в этом окне. 3. Перейдите в среду VBA (нажав клавиши <Alt>+<F11>) и добавьте к проекту модуль Module1 с помощью команды Insert | Module (Вставить | Модуль). 4. Напишите программу создания внутренней гиперссылки посредством VBA (листинг 16.1, а). Объект Hyperlinks здесь добавляется методом Add. Ячейка А1 является местом создания ссылки Anchor, о чем говорит текст, отражаемый на экране благодаря свойству TextToDisplay. Не забудьте использовать в начале окна кода оператор Option Explicit.
456 Глава 16 Листинг 16.1, а. Пример создания внутренней гиперссылки Option Base 1 Sub Внутренняя_гиперссылка() ActiveSheet.Hyperlinks.Add _ Anchor:=Range("A1"), _ Address:="", _ SubAddress:="Лист2!B5", _ TextToDisplay:="Внутренняя ссылка на Лист2 Ячейка B5" End Sub а б Рис. 16.1. Вставка гиперссылки: а — при помощи кнопки Ссылка; б — одноименное диалоговое окно 5. Подведите курсор к ячейке А1 (рис. 16.2) — символ курсора на экране приобретет вид "руки". Щелкните левой кнопкой мыши — реализуется переход к ячейке В5 листа 2. Рис. 16.2. Пример внутренней гиперссылки
Программирование связей 457 6. Аналогично можно написать программу создания внешней гиперссылки (листинг 16.1, б). Здесь задается якорь ссылки Anchor, т. е. место, с которого осуществляется переход по гиперссылке, и ее адрес Address. Листинг 16.1, б. Пример создания внешней гиперссылки Sub Внешняя_гиперссылка() ActiveSheet.Hyperlinks.Add _ Anchor:=Range("A2"), _ Address:="http://spbu.ru/", _ ScreenTip:="Санкт-Петербургский государственный университет", _ TextToDisplay:="СПбГУ" End Sub По внешней гиперссылке происходит переход на сайт http://spbu.ru/. П РИМЕЧАНИЕ Для перехода на сайт по гиперссылке необходимо подключение компьютера к Интернету. 7. Сохраните книгу как Листинг_16.1_Гиперссылка.xlsm. Э ЛЕКТРОННЫЙ АРХИВ Листинг 16.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_18_Программирование_связей сопровождающего книгу электронного архива. Кнопка гиперссылки Напишем программу, в которой выход в Интернет осуществляется при щелчке по созданной кнопке (рис. 16.3). 1. Создайте новый файл Microsoft Excel 2019. 2. На листе рабочей книги создайте командную кнопку для управления выходом в Интернет. Для этого на вкладке ленты Разработчик в группе Элементы управления откройте кнопку Вставить и в элементах управления Элементы ActiveX выберите инструмент управления Кнопка , активизируйте его и в рабочем поле Microsoft Excel нарисуйте кнопку. Как только вы закончите рисование, в строке формул появится запись: =ВНЕДРИТЬ("Forms.CommandButton.1";"") 3. Щелкните по созданной кнопке правой кнопкой мыши и в контекстнозависимом меню выберите команду Просмотреть код (см. рис. 1.25). В результате произойдет переход в окно редактора VBA и появится шаблон процедуры: Private Sub CommandButton1_Click() End Sub
458 Глава 16 Рис. 16.3. Кнопка для выхода в Интернет 4. Между строками шаблона процедуры введите текст программы в соответствии с листингом 16.2. Для свойства Caption управляющей кнопки, расположенной на рабочем листе, задайте http://www.bhv.ru. Листинг 16.2. Выход в Интернет Private Sub CommandButton1_Click() ActiveWorkbook.FollowHyperlink _ Address:="http://www.bhv.ru", _ NewWindow:=True End Sub 5. В коде используется метод ActiveWorkbook.FollowHyperlink для загрузки документа с указанным адресом из Интернета в новом окне браузера. При щелчке по созданной кнопке происходит переход на сайт издательства "БХВ-Петербург" по адресу в Интернете http://www.bhv.ru. 6. Сохраните книгу как Листинг_16.2_Выход_в_Интернет.xlsm. Передача данных из Excel в Word Напишем программу, в которой данные из Excel передаются в Word. 1. Создайте новый файл Microsoft Excel 2019. Введите в ячейки A1:B15 рабочего листа произвольные данные. Они будут скопированы методом Copy и добавлены из Excel в Word методом Paste.
Программирование связей 459 2. Перейдите в среду VBA и добавьте к проекту модуль Module1. 3. Напишите программу передачи данных из Excel в Word посредством VBA (листинг 16.3). Объект приложения Word создается здесь методом CreateObject("Word. Application"). Документ Word добавляется методом Documents.Add. Листинг 16.3. Пример передачи данных из Excel в Word Sub Экспорт_в_Word() Dim WordApp As Object 'Копирование данных в Excel ActiveSheet.Range("A1:B15").Copy Set WordApp = CreateObject("Word.Application") With WordApp .Visible = True 'Запуск приложения Word .Documents.Add 'Добавление нового документа .Selection.Paste 'Вставка скопированной области End With End Sub 4. Для запуска макроса нажмите клавишу <F5>. Табличные данные будут располагаться на странице автоматически созданного документа Документ1 приложения Microsoft Word. 5. Сохраните книгу как Листинг_16.3_Экспорт_в_Word.xlsm. Внедрение документа Word в Excel Напишем программу, в которой содержимое текстового документа Word импортируется в Excel. Для того чтобы макрос правильно нашел путь, предварительно поместите файл документа Word (у нас это файл Пример1.docx) в ту же самую папку, в которой вы будете создавать рабочую книгу Excel с представленным далее макросом. Э ЛЕКТРОННЫЙ АРХИВ Файл Пример1.docx вы найдете в папке главы 16 сопровождающего книгу электронного архива. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. Напишите программу передачи данных из Word в Excel посредством VBA (листинг 16.4). Здесь в строковой переменной strFile типа String указано имя файла: Пример1.docx. Этот файл открывается при помощи метода Documents.Open, его данные копируются методом Copy, затем в Excel методом Add добавляется новая рабочая книга и данные вставляются на активный рабочий лист методом Paste.
460 Глава 16 Рис. 16.4. Пример внедрения объекта Word в Excel Листинг 16.4. Пример внедрения документа Word в Excel Sub Импорт_из_Word() Dim WordApp As Object Dim str1 As String Const strFile As String = "Пример1.docx" Str1 = ThisWorkbook.Path 'Операции с Word Set WordApp = CreateObject("Word.Application") With WordApp .ChangeFileOpenDirectory str1 .Documents.Open strFile With .Selection .WholeStory .Copy
Программирование связей 461 End With End With 'Операции с Excel Workbooks.Add ActiveSheet.Paste End Sub 3. Для запуска макроса нажмите клавишу <F5>. Содержимое документа Пример1.docx в виде текста рисунков будут вставлены в столбец А листа новой рабочей книги. Увеличьте ширину столбца для удобочитаемости текста (рис. 16.4). 4. Сохраните книгу как Листинг_16.4_Импорт_из_Word.xlsm. Передача данных из Excel в PowerPoint Напишем программу, в которой данные из Excel передаются в PowerPoint. 1. Создайте новый файл Microsoft Excel 2019. В ячейки рабочего листа введите произвольные данные и постройте диаграмму (рис. 16.5, а). Она будет скопирована методом Copy и добавлена из Excel в PowerPoint методом Paste. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. 3. Напишите программу передачи данных из Excel в PowerPoint посредством VBA (листинг 16.5). Переменная PPTApp описана здесь как New PowerPoint.Application. Листинг 16.5. Пример передачи данных из Excel в PowerPoint ' Библиотека "Microsoft PowerPoint x.x Object Library" _ должна быть активирована Sub Экспорт_в_PowerPoint() Dim PPTApp As New PowerPoint.Application With PPTApp .Visible = msoTrue 'Запуск PowerPoint .Presentations.Add 'Добавление презентации With .ActivePresentation .Slides.Add 1, ppLayoutBlank 'Добавление нового слайда ActiveSheet.ChartObjects(1).Copy 'Копирование диаграммы Excel .Slides(1).Shapes.Paste 'Диаграмма вставлена With .Slides(1).Shapes(1) .Height = 400 'Высота диаграммы .Width = 400 'Ширина диаграммы .Top = 50 'Отступ сверху .Left = 160 End With .SlideShowSettings.Run 'Запуск презентации End With End With End Sub
462 Глава 16 а б Рис. 16.5. Диаграмма: а — в Excel; б — в PowerPoint
Программирование связей 463 4. Для запуска макроса нажмите клавишу <F5>. Диаграмма из программы Excel появилась в новой презентации PowerPoint (рис. 16.5, б). 5. Сохраните рабочую книгу Excel как Листинг_16.5_Экспорт_в_PowerPoint.xlsm. Передача данных из PowerPoint в Excel Напишем программу, в которой данные из PowerPoint передаются в Excel. Для того чтобы макрос правильно нашел путь, предварительно поместите файл презентации PowerPoint (у нас это файл 16.06.pptx) в ту же самую папку, в которой вы будете создавать рабочую книгу Excel с представленным далее макросом. Э ЛЕКТРОННЫЙ АРХИВ Файл 16.06.pptx вы найдете в папке главы 16 сопровождающего книгу электронного архива. 1. Создайте новый файл Microsoft Excel 2019. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. Напишите программу передачи данных из PowerPoint в Excel посредством VBA (листинг 16.6). Презентация открывается при помощи метода Presentations. Open, число листов в книге задается числом слайдов и определяется свойством Count. Не забывайте использовать в начале окна кода оператор Option Explicit. Листинг 16.6. Пример передачи данных из презентации PowerPoint в Excel Sub Импорт_из_PPT() Dim PPTApp As Object Dim bytTemp As Byte Dim i As Integer Set PPTApp = CreateObject("PowerPoint.Application") With PPTApp 'Запуск PowerPoint и открытие презентации .Visible = msoTrue .Presentations.Open ThisWorkbook.Path & "\16.06.pptx" With .ActivePresentation 'Создается новая рабочая книга bytTemp = Application.SheetsInNewWorkbook Application.SheetsInNewWorkbook = .Slides.Count 'Число листов в рабочей книге соответствует числу слайдов _ в презентации Workbooks.Add Application.SheetsInNewWorkbook = bytTemp For i = 1 To .Slides.Count .Slides(i).Copy Worksheets(i).Paste Next i End With
464 Глава 16 End With End Sub 3. Для запуска макроса нажмите клавишу <F5>. В первую очередь открылась презентация, находящаяся в файле 16.06.pptx. Затем была создана новая рабочая книга в Excel, в которой разместились слайды из презентации PowerPoint (рис. 16.6), причем на каждом рабочем листе находится по одному листу презентации. Так как в новой рабочей книге макрос автоматически не создается, создайте его в отдельном модуле. 4. Сохраните эту созданную книгу как Листинг_16.6_Импорт_из_PowerPoint.xlsm. Можно самостоятельно рассмотреть аналогичные задачи экспорта и импорта для приложений Microsoft Access и Microsoft Outlook. Рис. 16.6. Пример внедрения объекта PowerPoint в Excel
ПРИЛОЖЕНИЕ 1 Глоссарий терминов Visual Basic for Applications Ниже приведен список основных терминов языка программирования Visual Basic for Applications (VBA).  Placeholder — символ, маскирующий или скрывающий другой символ из сооб-       ражений безопасности. Например, при вводе пароля вместо каждого введенного символа на экране отображается знак звездочки. RGB — система значений цвета, используемая для описания цветов в виде смеси красного (R), зеленого (G) и синего (B). Цвет определяется как набор из трех целых чисел (R, G, B), каждое из которых может принимать значение от 0 до 255. Значение 0 обозначает полное отсутствие цветового компонента. Значение 255 обозначает наибольшую интенсивность цветового компонента. Блок сетки — пространство между двумя соседними точками сетки. "Быстрая" клавиша — один символ, используемый в качестве ярлыка для выбора объекта. Нажатие клавиши <Alt>, за которым следует нажатие клавиши вызова, дает фокус объекту и инициирует одно или несколько событий, связанных с объектом. Инициированное событие или события различны для разных объектов. Если код связан с событием, он выполняется при инициации события. Группа элементов — набор элементов управления, связанных концептуально или логически. Элементы управления, связанные концептуально, как правило, отображаются вместе, но не обязательно влияют друг на друга. Элементы управления, связанные логически, влияют друг на друга. Например, выбор одного переключателя из группы присваивает всем другим переключателям группы значение False. Источник данных — местоположение данных, с которыми связан элемент управления, например ячейка на листе. Текущее значение источника данных может храниться в свойстве value элемента управления. Однако элемент управления не хранит данные; он только отображает информацию, хранящуюся в источнике данных. Источник перетаскивания — выбранный текст или объект, который перемещается в ходе операции перетаскивания.
466 Приложение 1  Клиентская область — часть окна, в которой приложение отображает выход- ные данные, например текст или графику.  Код состояния OLE — часть структуры данных, содержащая номер ошибки и возвращающая сведения о ее условиях. Структура данных определяется связыванием и встраиванием объектов.  Контейнер OLE — элемент управления Visual Basic, используемый для связи и встраивания объектов из других приложений в приложениях Visual Basic.  Контекстный идентификатор — уникальное число или строка, соответствую- щие определенному объекту в приложении. Контекстные идентификаторы используются для создания связей между приложением и соответствующими разделами справки.  Курсор — часть программы, возвращающая строки данных приложению. Указа- тель обозначает текущую позицию в наборе результатов.  Несвязанный — описывает элемент управления, не привязанный к ячейке на листе. Напротив, связанный элемент управления является источником данных для ячейки листа, предоставляющей доступ к отображению и редактированию значения элемента.  Основной элемент управления — ориентир для команд Align (Выровнять) и Make Same Size (Сделать одного размера) в меню Format (Формат). При выравнивании элементов управления выбранные элементы выравниваются относительно основного. При изменении размеров элементов управления выбранным элементам присваиваются размеры основного. Основной элемент управления обозначается белыми маркерами. Остальные элементы обозначаются черными маркерами.  Очистить — для изменения установки на off (выкл) или удаления значения.  Перечисляемая константа — дополнительные сведения о перечисляемых эле- ментах данных можно найти в описании свойства, метода или события, использующего перечисление.  Повторно — перемещение по группе объектов в определенном порядке.  Подсказка элемента — краткая фраза, описывающая элемент управления, стра- ницу или вкладку. Всплывающая подсказка отображается, когда пользователь ненадолго удерживает указатель мыши на элементе управления без нажатия кнопки мыши. Подсказки элементов управления схожи с подсказками для инструментов. Приложение Microsoft Forms предоставляет объекты ToolTip разработчикам во время создания приложения, а разработчики предоставляют подсказки элементов управления конечным пользователям во время работы приложения.  Прозрачный — указывает на то, что фон объекта невидимый. Вместо фона ото- бражается то, что находится за объектом, например изображение, используемое как фон приложения. Для установки прозрачности фона используется свойство BackStyle.
Глоссарий терминов Visual Basic for Applications 467  Редактор метода ввода (IME) — приложение, которое переводит введенные данные в символы языка DBCS, например, японского или китайского. Как и пользовательские типы, IME отображает возможные эквиваленты. Пользователь выбирает наиболее подходящий вариант.  Связанный — описывает элемент управления, содержимое которого связано с определенным источником данных, например ячейкой или диапазоном ячеек на листе.  Системные цвета — цвета, определенные операционной системой для конкрет- ного типа монитора и видеоадаптера. В операционной системе Windows каждый цвет ассоциируется с определенной частью пользовательского интерфейса, например заголовком окна или меню.  Состояние клавиатуры — возвращаемое значение, обозначающее нажатые кла- виши и состояние модификаторов <Shift>, <Ctrl> и <Alt>.  Страница свойств — сгруппированный список свойств, представленный в виде страницы с вкладками на листе свойств.  Унаследованное свойство — свойство, получившее характеристики другого класса.  Формат данных — структура или внешний вид модуля данных, например фай- ла, базы данных и ее записей, ячейки на листе или текста в документе.  Цвет переднего плана — цвет, выбранный для рисования и отображения текста на экране. На монохромных экранах цветом переднего плана является цвет точечного рисунка или другого изображения.  Цвет фона — цвет клиентской области пустого окна или экрана, на которой вы- полняется рисование и отображение цветов.  Цель — объект, на который перетаскивается другой объект.
468 Приложение 1
ПРИЛОЖЕНИЕ 2 Глоссарий терминов Visual Basic Editor Ниже приведен список основных терминов для редактора Visual Basic, необходимых для усвоения языка программирования VBA и его применения в Microsoft Excel 2019.  Z-порядок — визуальное наслоение элементов управления в форме вдоль оси z        для формы (глубина). Z-порядок определяет, какие элементы управления будут находиться впереди остальных элементов управления. Автоматическое форматирование — компонент, обеспечивающий автоматическое форматирование кода по мере ввода. При этом автоматически заменяются на прописные первые буквы ключевых слов, устанавливаются стандартные интервалы, добавляются знаки препинания, а также устанавливаются основной и фоновый цвета. Аргумент (параметр) — константа, переменная или выражение, передаваемые в процедуру. Базовый класс — исходный класс, от которого наследуются производные классы. Библиотека динамической компоновки (DLL) — библиотека процедур, которая загружается в приложения и привязывается к ним во время выполнения. Для разработки библиотек DLL используются другие языки программирования, например C, MASM или FORTRAN. Библиотека объектов — файл с расширением olb, в котором хранятся сведения о доступных объектах, предоставляемые автоматическим контроллером, таким как Visual Basic. Можно использовать обозреватель объектов Object Browser, чтобы изучить контент библиотеки объектов для получения сведений об объектах. Библиотека типов — файл или компонент внутри файла, который содержит стандартные описания открытых объектов, свойств и методов, доступных для автоматизации. Файлы библиотеки объектов с расширением olb содержат библиотеки типов. Ведущее приложение — любое приложение, поддерживающее работу с Visual Basic для приложений, например Microsoft Excel, Microsoft Project и т. д.
470 Приложение 2  Время выполнения — время, в течение которого выполняется код. Во время вы- полнения нельзя изменить код.  Время компиляции — период, в течение которого осуществляется преобразова- ние исходного кода в исполняемый.  Время разработки — этап, на котором осуществляется построение приложения в среде разработки, добавление в него элементов управления, настройка свойств и элементов управления форм и т. д. В отличие от этого этапа, во время выполнения можно взаимодействовать с приложением, как его пользователь.  Вставляемый объект — объект приложения, который имеет тип настраиваемого элемента управления, например лист Microsoft Excel.  Встроенные константы — константы, предоставляемые приложением. В Visual Basic константы перечислены в библиотеку объектов, и их можно просматривать в обозревателе объектов Object Browser. Так как отключить встроенные константы нельзя, можно создать определяемую пользователем константу с тем же именем.  Вызов процедуры — оператор в коде, который сообщает Visual Basic о необхо- димости выполнения процедуры.  Выражение — сочетание ключевых слов, операторов, переменных и констант, позволяющее получить строку, число или объект. С помощью выражений можно выполнять вычисления, работать со строками и знаками, а также проверять данные.  Выражение времени — любое выражение, при вычислении которого получается время. Это любое сочетание литералов времени, чисел, которые выглядят как время, строк, которые выглядят как время, а также время, возвращаемое функциями. Время хранится в виде части вещественного числа. Значения в правой части десятичного числа представляют время. Например, полдень (12:00 P.M.) представлен как 0.5.  Выражение даты — любое выражение, которое можно интерпретировать как дату, в том числе литералы даты, похожие на дату числа и строки, а также значения даты, возвращаемые функциями. Выражение даты в любом сочетании должно представлять дату в диапазоне от 1 января 100 года до 31 декабря 9999 года. Даты хранятся в виде компонентов вещественного числа. Значение слева от десятичного разделителя представляет дату, а справа — время. Отрицательные числа определяют даты до 30 декабря 1899 года.  Выражение контрольного значения — определяемое пользователем выражение, позволяющее отслеживать поведение переменной или выражения. Выражения контрольных значений отображаются в окне контрольных значений редактора Visual Basic и автоматически обновляются при переходе в режим приостановки выполнения. Окно Watches (Окно наблюдения) отображает значение выражения в рамках заданного контекста. Выражения контрольных значений не сохраняются вместе с кодом.
Глоссарий терминов Visual Basic Editor 471  Выражение объекта — выражение, которое задает конкретный объект и может включать любой из контейнеров объекта. Например, в приложении может присутствовать объект Application, содержащий объект Document, который, в свою очередь, содержит объект Text.  Выражение типа Variant — любое выражение, вычисление которого дает чи- словые, строковые данные или дату, а также специальные значения Empty и Null.  Графический метод — метод, который работает с такими объектами, как Form, или Printer, и выполняет операции рисования (анимации или моделирования) во время выполнения. К графическим методам относятся Circle, Cls, Line, PaintPicture, Point, Print и PSet. PictureBox  Денежный тип данных — тип данных со значениями в диапазоне от 922 337 203 685 477,5808 до 922 337 203 685 477,5807. Используется для операций с денежными средствами и вычислений с фиксированной запятой, где особо важна точность.  Директива компилятора — команда, используемая для управления работой компилятора.  Документ — любой изолированный объект, созданный с помощью приложения и обладающий уникальным именем файла.  Дочерняя форма MDI — форма, размещаемая в форме MDI приложения с мно- годокументным интерфейсом. Для того чтобы создать дочернюю форму, свойству MDIChild формы MDI необходимо присвоить значение True.  Закрепленное окно — окно, прикрепленное к фрейму главного окна.  Знак продолжения строки — сочетание знаков пробела и подчеркивания " _" используется в среде разработки для размещения одной логической строки кода на нескольких физических строках. Однако этот знак нельзя использовать для размещения таким образом строки кода со строковым выражением.  Значение Null (Ноль) — значение переменной, не содержащей допустимых дан- ных. Значение Null получается в результате явного присвоения значения Null переменной или при выполнении любой операции между выражениями, содержащими значение Null.  Значок — графическое представление объекта или понятия. Чаще всего пред- ставляет свернутые приложения в Microsoft Windows. В качестве значка используются точечные рисунки размером не более 32×32 точек, хранящиеся в файлах с расширением ico.  Идентификатор — элемент выражения, задающий ссылку на константу или переменную.  Именованный параметр — аргумент, имя которого предварительно определено в библиотеке объектов. Именованные параметры, в отличие от обычных, можно использовать для присвоения значений в любом порядке. Например, следующий метод принимает три параметра: DoSomeThing namedarg1, namedarg2, namedarg3
472 Приложение 2 Присваивая значения именованным параметрам, можно использовать следующий оператор: DoSomeThing namedarg3 := 4, namedarg2 := 5, namedarg1 := 20 Обратите внимание, что при указании именованных параметров не обязательно соблюдать установленный в синтаксисе порядок размещения.  Индикатор полей — значок, отображаемый в панели Margin Indicator (Индика- тор полей) в окне кода. Содержит визуальные подсказки для редактирования кода.  Исполняемый файл — приложение для ОС Windows, которое может выполнять- ся вне среды разработки. Исполняемые файлы имеют расширение exe.  Клавиша доступа — клавиша, нажав которую одновременно с клавишей <Alt>, пользователь может открыть меню, выполнить команду, выбрать объект или перейти к нужному. Например, с помощью сочетания клавиш <Alt>+<F> можно открыть пункт меню File (Файл).  Класс — формальное определение объекта. По сути, класс представляет собой шаблон, на основе которого во время выполнения создается экземпляр объекта. В классе определяются свойства объекта и методы, управляющие его поведением.  Ключевое слово — слово или символ, распознаваемые как часть языка програм- мирования Visual Basic, например оператор или имя функции.  Код знака — номер знака в наборе символов, например, в наборе ANSI.  Коллекция — объект, содержащий набор связанных объектов. При изменении коллекции позиция любого объекта в ней может изменяться. Таким образом, каждый объект коллекции имеет переменную позицию. Объект Collection — это стандартный пример класса collection; экземпляры класса являются коллекциями. Коллекции должны применять метод NewEnum, который не принимает аргументы, возвращает соответствующий объект IUnknown, при этом его атрибуту VB_UserMemId должно быть присвоено значение –4.  Командная строка — путь, имя файла и аргументы, предоставленные пользова- телем при запуске программы.  Комментарий — текст в коде, поясняющий его работу. В Visual Basic строка комментария может начинаться апострофом (') или ключевым словом Rem с пробелом.  Константа — именованный элемент, в котором во время выполнения програм- мы хранится постоянное значение. Константа может содержать строковый или числовой литерал, другую константу и любое сочетание арифметических и логических операторов, за исключением Is и возведения в степень. В каждом ведущем приложении может определяться собственный набор констант. Пользователи могут определять дополнительные константы с помощью оператора Const. Константы можно использовать в любом месте кода вместо фактических значений.
Глоссарий терминов Visual Basic Editor 473  Константа условной компиляции — идентификатор Visual Basic, который опре- деляется с помощью директивы компилятора #Const или в ведущем приложении и используется другими директивами компилятора для определения порядка и необходимости компиляции отдельных блоков кода Visual Basic.  Конструктор — окно среды разработки Visual Basic, предназначенное для визу- альной разработки. В этом окне представлены визуальные функции создания новых классов.  Контейнер — объект, который может содержать другие объекты.  Литерал даты — любая последовательность знаков допустимого формата, за- ключенная в знаки решетки (#). Допустимые форматы включают формат даты, заданный региональными параметрами кода, или универсальный формат даты. Например, если для приложения установлены региональные параметры "Английский (США)", #12/31/92# — это литерал даты, который представляет 31 декабря 1992 года. Применение литералов обеспечивает эффективные возможности переноса между различными языковыми средами.  Логическая ошибка — ошибка программирования, в результате которой код пе- рестает выполняться или возвращает неверные результаты. Например, причиной логической ошибки может быть неверное имя или тип переменной, бесконечный цикл, ошибки сравнения или неверное определение массива.  Логическое выражение — выражение, при вычислении которого получается значение True (истина) или False (ложь).  Массив — набор последовательно индексируемых элементов, имеющих одина- ковый внутренний тип данных. Каждый элемент массива имеет уникальный индекс, идентифицирующий его в последовательности. Изменения одного элемента массива не влияют на остальные его элементы.  Массив элементов управления — группа элементов управления с общими име- нем, типом и процедурами событий. Каждому элементу в массиве присваивается уникальный индекс, который позволяет определить элемент, распознающий событие.  Метафайл — файл, в котором хранятся изображения как графические объекты, например, линии, круги и многоугольники, а не пикселы. Существует два типа метафайлов: стандартные и расширенные. Стандартные метафайлы обычно имеют расширение wmf. Расширенные метафайлы обычно имеют расширение emf. Метафайлы сохраняют изображение более точно, чем пикселы, при изменении размера изображения.  Метка строки — используется для обозначения одной строки кода. Метка строки может содержать любое сочетание знаков, но должна начинаться с буквы и заканчиваться двоеточием (:). Метки строк задаются без учета регистра и должны начинаться в первом столбце.  Метод — процедура, выполняющая действия в отношении объекта.  Модуль — набор объявлений, за которым следуют процедуры.
474 Приложение 2  Модуль класса — модуль, в котором содержится определение класса, а также его свойств и методов.  Модуль кода — модуль, в котором содержится открытый код, доступный всем модулям в проекте.  Модуль объекта — модуль, который содержит код, характерный для объекта, например, модуль класса, модуль формы и модуль документа. Модули объекта содержат программный код связанных объектов. Правила для модулей объекта отличаются от правил, используемых для стандартных модулей.  Модуль формы — файл с расширением frm, который содержит графическое опи- сание формы, ее элементы управления и их свойства; объявления констант, переменных и внешних процедур на уровне формы; а также процедуры событий и общие процедуры. Сохранить модуль формы в frm-файл можно, щелкнув правой кнопкой мыши в среде VBA по модулю формы (UserForm) и в контекстнозависимом меню выбрав команду Export File (Экспортировать файл).  Набор символов ANSI — набор 8-битовых символов Американского националь- ного института стандартов (American National Standards Institute), представляющий до 256 символов (от 0 до 255) символов клавиатуры. Первые 128 символов (от 0 до 127) соответствуют буквам и символам стандартной клавиатуры США. Остальные 128 символов (от 128 до 255) представляют специальные символы, например буквы национальных алфавитов, акценты и др.  Набор символов ASCII — 7-битный набор символов американской стандартной кодировки для обмена информацией (ASCII) представляет буквы и символы на клавиатуре в стандартной раскладке для США. Набор символов ASCII содержит первые 128 знаков (от 0 до 127) из набора символов ANSI.  Надстройка — настраиваемое средство, позволяющее расширить возможности среды разработки.  Начальное значение — начальное значение, используемое для генерации псев- дослучайных чисел. Например, оператор Randomize создает начальное число, используемое функцией Rnd для создания последовательности уникальных псевдослучайных чисел.  Номер ошибки — целое число в диапазоне от 0 до 65 535, которое соответствует значению свойства Number для объекта Err. Номер ошибки в сочетании со значением свойства Description для объекта Err представляет полное сообщение о конкретной ошибке.  Номер строки — идентифицирует отдельную строку кода. Может содержать любое сочетание цифр, уникальное в рамках модуля, в котором оно используется. Номера строк должны начинаться с первого столбца.  Номер файла — число, используемое в операторе Open, чтобы открыть файл. Номера в диапазоне от 1 до 255 включительно определяют файлы, недоступные другим приложениям. Номера в диапазоне от 256 до 511 определяют файлы, доступные из других приложений.
Глоссарий терминов Visual Basic Editor 475  Область — определяет видимость переменной, процедуры или объекта. Напри-             мер, переменная, объявленная как Public, доступна для всех процедур, описанных во всех модулях в проекте с прямой исходящей ссылкой, если только не действует опция Option Private Module. Когда опция Option Private Module активирована, модуль сам является частным, поэтому он недоступен для ссылающихся проектов. Переменные, объявленные в процедуре, доступны только внутри процедуры, и теряют свое значение в интервалах между вызовами, если только они не объявлены как Static. Область кода — область окна кода, в которой вы можете вводить и редактировать код. Окно кода может содержать несколько областей кода. Обозреватель объектов — диалоговое окно, в котором можно просмотреть содержимое библиотеки объектов и сведения о выбранных объектах. Oбщая процедура — процедура, которая должна явно вызываться из другой процедуры. В отличие от нее, процедура события вызывается автоматически в ответ на действие пользователя или системы. Объект — сочетание кода и данных, обрабатываемое как единое целое, например элемент управления, форма или компонент приложения. Каждый объект определяется соответствующим классом. Объект ActiveX — объект, взаимодействующий с другими приложениями или инструментами программирования через интерфейсы автоматизации. Объект автоматизации — объект, который доступен для других приложений и программных инструментов через интерфейсы автоматизации. Объект источника событий — объект, являющийся источником событий, возникающих в ответ на какое-либо действие. Объект источника событий возвращается свойством. Например, свойство CommandBarEvents возвращает объект CommandBarEvents. Объявление — неисполняемый код, который объявляет имя константы, переменной или процедуры, а также их характеристики, например тип данных. В процедурах DLL с помощью объявлений задаются имена, библиотеки и аргументы. Окно объектов — список в правом верхнем углу окна кода, в котором представлены форма и ее элементы управления, к которым присоединен код. Также список в верхней части окна Properties, в котором представлены форма и ее элементы управления. Окно проекта — окно, которое отображает список формы, класса и стандартных модулей; файл ресурсов и ссылки в проекте. Файлы с расширениями ocx и vbx не отображаются в окне Project. Окно свойств — окно, используемое для отображения или изменения свойств выбранной формы или элемента управления во время разработки. Некоторые настраиваемые элементы управления имеют настраиваемые окна Properties. Оператор — синтаксически завершенная единица, которая отражает один тип действия, объявления или определение. Оператор обычно занимает отдельную
476        Приложение 2 строку, хотя можно использовать двоеточие (:) для включения двух или нескольких операторов в одной строке. Можно использовать символ продолжения строки (" _"), чтобы продолжить отдельную логическую строку на вторую физическую строку. Оператор сравнения — символ, символы или слово, обозначающие отношение между двумя или более значениями или выражениями. К ним относятся следующие: меньше (<), меньше или равно (<=), больше (>), больше или равно (>=), не равно (<>) и равно (=). Дополнительными операторами сравнения являются Is и Like. Обратите внимание, что операторы Is и Like нельзя использовать в качестве операторов сравнения в выражениях Select Case. Ошибка времени выполнения — ошибка, возникающая при запуске кода. Ошибка времени выполнения возникает, когда оператор пытается выполнить недопустимое действие. Параметр — имя переменной, по которому аргумент, передаваемый в процедуру, известен в этой процедуре. Эта переменная получает аргумент, переданный в процедуру. Ее область действия заканчивается в конце процедуры. Переменная — место именованного хранения, содержащее данные, которые могут быть изменены во время выполнения программы. У каждой переменной есть имя, которое однозначно определяет ее. Тип данных для переменной может не указываться. Имена переменных должны начинаться с буквенного символа, должны быть уникальными в пределах одной области, не должны быть длиннее 255 знаков и не могут содержать точку или символ определения типа. Переменная Empty — определяет переменную Variant без начального значения. Числовая переменная Empty определяется значением 0, а строковая — строкой нулевой длины (""). Переменная модуля — переменная, объявленная за пределами кода процедуры Function, Sub или Property. Модульные переменные необходимо объявлять за пределами любых процедур в модуле. Они существуют, пока модуль загружен, и видны во всех процедурах в модуле. Переменная объекта — переменная, которая содержит ссылку на объект.  Переменные Public — общедоступные переменные, объявленные с помощью атрибута Public, доступны для всех процедур во всех модулях во всех приложениях, если только не активировано свойство Option Private Module. В этом случае переменные являются общедоступными только внутри проекта, в котором они находятся.  По значению — способ передачи значения аргумента в процедуру вместо его адреса. Обеспечивает доступ из процедуры к копии переменной. В результате процедура не может изменять переданное в нее фактическое значение переменной.  По ссылке — способ передачи адреса аргумента в процедуру вместо значения. Обеспечивает доступ из процедуры к фактическому значению. В результате
Глоссарий терминов Visual Basic Editor 477 процедура может изменять переданное в нее фактическое значение переменной. Если иное не задано явно, аргументы передаются по ссылке.  Побитовое сравнение — побитовое сравнение расположенных в одинаковых позициях битов для двух числовых выражений.  Порядок сортировки — принцип очередности, используемый для упорядочива- ния данных, например, по алфавиту, значению, возрастанию, убыванию и т. д.  Последовательность табуляции — порядок, в котором фокус перемещается с одного поля на другое при нажатии клавиши табуляции <Tab> или сочетания клавиш <Shit>+<Tab>.  Приложение — набор кода и визуальных элементов, которые работают вместе как одна программа. Для создания и выполнения приложений разработчики могут использовать среду разработки, в то время как пользователи чаще всего запускают приложения в виде исполняемых файлов вне среды разработки.  Проверка синтаксиса — функция, которая проверяет код на правильность син- таксиса. Если функция проверки синтаксиса включена, при вводе кода, который содержит синтаксическую ошибку, будет выводиться сообщение, а элемент кода будет выделен.  Проект — набор модулей.  Проект с исходящей ссылкой — текущий проект. Создание ссылки на проект зависит от хост-приложения. Например, чтобы прямо сослаться на проект в Microsoft Excel, надо выбрать проект в диалоговом окне References (Ссылки) в меню Tools (Инструменты). Общедоступные переменные в проекте с прямой ссылкой будут видны для проекта с прямой исходящей ссылкой, но общедоступные переменные в проекте с прямой исходящей ссылкой не будут видны в проекте, на который указывает ссылка.  Проект, на который указывает ссылка — проект, для которого создается ссыл- ка из текущего проекта. Проект, на который ссылается один из текущих проектов с прямой ссылкой, называется проектом с косвенной ссылкой. Его переменные, объявленные с атрибутом Public, недоступны в текущем проекте, за исключением случаев, когда выполняется обращение через имя проекта. Любое сочетание прямых и косвенных ссылок между проектами допустимо, если они не образуют цикл.  Процедура — именованная последовательность операторов, выполняемая как единое целое. Например, Function, Property и Sub являются типами процедуры. Имя процедуры всегда определено на уровне модуля. Весь исполняемый код должен находиться в процедуре. Процедуры не могут быть вложены в другие процедуры.  Процедура Sub — процедура, которая выполняет конкретную задачу в рамках программы, но не возвращает явное значение. Процедура Sub начинается с оператора Sub и заканчивается оператором End Sub соответственно.
478 Приложение 2  Процедура в виде функции — процедура, которая выполняет конкретную задачу в рамках программы и возвращает значение. Процедура Function начинается и заканчивается операторами Function и End Function соответственно.  Процедура Property — процедура, которая создает и управляет свойствами для модуля класса. Процедура Property начинается с оператора Property Let, Property Get или Property Set и заканчивается оператором End Property.  Путь (path) — строковое выражение, указывающее расположение каталога или папки. Расположение может включать спецификацию диска.  Разделители даты — знаки, разделяющие компоненты дня, месяца и года при форматировании даты. Они определяются параметрами системы или функцией Format.  Режим конструктора документа — режим конструктора, запускаемый хостприложением, как правило, через кнопку на ленте разработчика, где взаимодействия мыши с элементами управления, внедренными в документ, изменяют его расположение, размер и свойства, но не активируют его действия.  Режим приостановки выполнения (останова) — временная приостановка вы- полнения программы в среде разработки. В этом режиме можно осуществлять проверку, отладку, сброс, пошаговое выполнение или возобновить выполнение программы. Переход в этот режим осуществляется в следующих случаях, когда: • процесс выполнения программы доходит до точки останова; • во время выполнения программы нажаты клавиши <Ctrl>+<Break>; • во время выполнения программы обнаружены оператор Stop или не перехваченная ошибка; • добавлено контрольное выражение Break When True (Прервать, когда выражение станет истинным); • добавлено контрольное выражение Break When Changed (Прервать, когда выражение изменит значение). Выполнение останавливается при изменении контрольного значения.  Свойство — именованный атрибут объекта. Свойства определяют характери- стики объекта, например размер, цвет и расположение на экране, или состояние объекта, например включено или выключено.  Связанное окно — окно, связанное с любым другим окном, за исключением главного.  Связанный фрейм — фрейм окна, содержащий несколько связанных друг с дру- гом окон.  Связанный элемент управления — информационный элемент управления, обес- печивающий доступ к указанным полям базы данных с помощью элемента управления Data. Такие элементы управления обычно привязываются к элементу Data с использованием свойств DataSource и DataField. При переходе элемента Data между записями во всех связанных с ним элементах управления отобража-
Глоссарий терминов Visual Basic Editor 479 ются данные из полей текущей записи. При изменении данных в связанном элементе управления и переходе к другой записи изменения автоматически сохраняются в базе данных.  Символ объявления типа — символ, прикрепляемый к имени переменной и обо- значающий тип данных переменной. По умолчанию переменные имеют тип Variant, если только соответствующий оператор Deftype не присутствует в модуле.  Синтаксическая ошибка — ошибка, которая возникает при вводе строки кода, которую не распознает редактор VBE. Обратите внимание, что правила синтаксиса для отдельных ключевых слов представлены в специальном разделе справки, посвященном синтаксису. Для того чтобы получить справку по ключевому слову в среде разработки, выберите ключевое слово и нажмите клавишу <F1>.  Список процедур — список в правом верхнем углу окон кода и окне Debug, в котором отображаются процедуры, распознанные для объекта в окне Object.  Сравнение строк — сравнение двух последовательностей символов. Используй- те опцию сравнения Option Compare, чтобы задать сравнение двоичных данных или текста. Для английского языка (США) при двоичном сравнении учитывается регистр; а при сравнении текстовых значений регистр не учитывается.  Среда разработки — компонент приложения, в котором пишется код, создаются элементы управления, настраиваются свойства и элементы управления форм и т. д. Противопоставляется выполнению приложения.  Стандартный модуль — модуль, содержащий только процедуру, тип и объяв- ления и определения данных. Объявления и определения на уровне модуля в стандартном модуле являются общедоступными Public по умолчанию.  Стек — фиксированный объем памяти, применяемой для сохранения локальных переменных и аргументов во время вызовов процедур.  Строковая константа — любая константа (определенная с помощью ключево- го слова Const), состоящая из последовательности смежных знаков, которые интерпретируются как символы, а не как числовые значения.  Строковое выражение — любое выражение, результатом вычисления которого является последовательность смежных знаков. Элементы строкового выражения могут включать функцию, которая возвращает строку, строковый литерал, строковую константу, строковую переменную, строку Variant, или функцию, которая возвращает значение типа Variant.  Строковый литерал — любое выражение, состоящее из последовательности смежных символов, заключенной в кавычки, которое интерпретируется как символы в кавычках.  Строковый тип данных — тип данных, состоящий из последовательности смежных символов, которые представляют сами символы, а не их числовые значения. Строка String может включать буквы, числа, пробелы и знаки препина-
480 Приложение 2 ния. Тип данных String может хранить строки фиксированной длины, от 0 до приблизительно 63 тыс. символов, а динамические строки могут быть длиной от 0 до приблизительно 2 млрд символов.  Твип — единица измерения экрана, равная 1/20 точки. Твип является независи- мой от экрана единицей, которая позволяет убедиться, что расположение и пропорции элементов экрана в приложении на экране совпадают во всех системах отображения. В одном логическом дюйме примерно 1440 твипов, а в одном логическом сантиметре 567 твипов (длина элемента экрана, равная одному дюйму или сантиметру при печати).  Тип данных — характеристика переменной, определяющая тип содержащихся в ней данных. Поддерживаются следующие типы данных: Byte, Boolean, Integer, Long, Currency, Decimal, Single, Double, Date, String, Object, Variant (по умолчанию), а также определяемые пользователем типы и специальные типы объектов.  Тип данных Boolean — логический тип данных с двумя возможными значения- ми: True (–1) или False (0). Переменные типа Boolean хранятся в памяти как 16-битные (двухбайтовые) числа.  Тип данных Byte — тип данных, содержащий целые положительные числа в диа- пазоне от 0 до 255. Переменные типа байт хранятся в памяти как отдельные, беззнаковые 8-битовые (однобайтовые) числа.  Тип данных Date — используется для хранения вещественного числа, представ- ляющего дату и время. Переменные этого типа хранятся в виде 64-разрядных (8-битных) чисел. Значение слева от десятичного разделителя представляет дату, а справа — время.  Тип данных Decimal — тип данных, содержащий десятичные числа, кратные сте- пени 10. Поддерживаемый диапазон чисел без десятичных разрядов составляет ±79 228 162 514 264 337 593 543 950 335. Для чисел с 28 десятичными разрядами поддерживается диапазон ±7,9228162514264337593543950335. Наименьшее отличное от нуля число, которое может быть представлено с помощью типа –28 Decimal равно 10 . Обратите внимание, что на данный момент тип данных Decimal можно использовать только внутри типа Variant. Объявление переменных типа Decimal не поддерживается. Тем не менее можно создать объект типа Variant с подтипом Decimal с помощью функции CDec.  Тип данных Double — тип данных, который содержит значения с плавающей запятой двойной точности в виде 64-битных чисел в диапазоне от –1,79769313486231 ⋅ 10308 до –4,94065645841247 ⋅ 10–324 (для отрицательных значений) и от 4,94065645841247 ⋅ 10–324 до 1,79769313486232 ⋅ 10308 (для положительных значений).  Тип данных Integer — целочисленный тип данных, который содержит целочис- ленные переменные в виде 2-байтовых целых чисел в диапазоне от –32 768 до 32 767. Кроме того, тип данных Integer используется для представления значений перечисления.
Глоссарий терминов Visual Basic Editor 481  Тип данных Long — длинное целое, 4-байтовое целое число в диапазоне от –2 147 483 648 до 2 147 483 647.  Тип данных Object — тип данных, представленный любой ссылкой Object. Переменные Object хранятся в 32-битных (4-байтовых) адресах, ссылающихся на объекты.  Тип данных Single — тип данных с переменными с плавающей запятой единич- ной точности в виде 32-битных (4-байтовых) чисел с плавающими запятыми в диапазоне от –3,402823 ⋅ 1038 до –1,401298 ⋅ 10–45 для отрицательных значений и от 1,401298 ⋅ 10–45 до 3,402823 ⋅ 1038 для положительных значений.  Тип данных Variant — специальный тип данных, который может содержать числовые, строковые данные или дату, а также определенные пользователем типы данных и специальные значения Empty и Null. Тип данных Variant имеет размер числового хранилища в 16 байт и может содержать данные в диапазоне до десятичного, или размер символьного хранилища в 22 байт (плюс длина строки) и может хранить любые текстовые символы. Функция VarType определяет то, как данные типа Variant обрабатываются. Все переменные получают тип Variant, если явным образом не объявлен другой тип данных.  Тип объекта — тип объекта, предоставляемого приложением через автоматиза- цию, например Application (Приложение), File (Файл), Range (Диапазон) и Sheet (Лист). Используйте обозреватель объектов Object Browser для ознакомления с полным списком доступных объектов.  Тип, определенный пользователем — любой тип данных, который определяется с помощью оператора Type. Определяемые пользователем типы данных могут содержать один или несколько элементов любого типа данных. Массивы определяемых пользователем типов данных создаются с помощью оператора Dim. Массивы любого типа могут включаться в определяемые пользователями типы данных.  Точечный рисунок — точечное изображение, которое хранится в виде набора битов, каждый из которых соответствует одной точке. В цветовых системах одной точке обычно соответствует несколько битов. Файлы точечных рисунков обычно имеют расширение bmp.  Точка — точка равна 1/72 дюйма. Размеры шрифтов обычно измеряется в точ- ках.  Точка останова — строка программы, в которой автоматически останавливается выполнение. Точки останова не сохраняются вместе с кодом.  Универсальный формат даты — универсальный формат даты — это #yyyy-mmdd hh:mm:ss#. Тем не менее, как компонент даты (#yyyy-mm-dd#), времени (#hh:mm:ss#) могут быть представлены отдельно. так и компонент  Уровень модуля — описывает код в разделе объявлений модуля. Уровню модуля принадлежит любой код, находящийся вне процедуры. В первую очередь указываются объявления, после которых определяются процедуры.
482 Приложение 2  Уровень процедуры — описывает операторы, которые находятся в процедурах Function, Property или Sub. Объявления обычно указаны первыми, за ними следуют присваивания и другой исполняемый код. Обратите внимание, что код уровня модуля находится за пределами блока процедуры.  Фокус — способность элемента в конкретный момент времени считывать нажа- тия кнопок мыши или клавиш на клавиатуре. В среде Microsoft Windows в любой момент времени фокус может иметь только одно окно, одну форму или один элемент управления. Строка заголовка объекта, который находится в фокусе, обычно выделяется. Фокус может устанавливать как пользователь, так и само приложение.  Форма — окно или диалоговое окно. Формы представляют собой контейнеры для элементов управления. Формы многодокументного интерфейса (MDI) также могут выступать в качестве контейнеров для дочерних форм и некоторых элементов управления.  Форма MDI — окно, формирующее фон приложения с многодокументным ин- терфейсом. Форма MDI является контейнером для всех дочерних форм MDI в приложении.  Частные переменные (Private) — переменные, описываемые с использованием ключевого слова Private, доступные только в том модуле, где они объявлены.  Число π (пи) — 3,1415926535897932. математическая константа, приблизительно равная  Числовое выражение — любое выражение, при вычислении которого получает- ся число. Может содержать любое сочетание ключевых слов, переменных, констант и операторов, вычисление которых дает число.  Числовой тип — любой внутренний числовой тип данных (Byte, Boolean, Integer, Long, Currency, Single, Double или Date) или любой числовой подтип типа Variant (Empty, Integer, Long, Single, Double, Currency, Decimal, Date, Error, Boolean или Byte).  Числовой тип данных — любой внутренний числовой тип данных (Byte, Boolean, Integer, Long, Currency, Single, Double или Date).  Член — элемент коллекции, объекта или типа, определенного пользователем.  Элемент управления — размещаемый на форме объект, который обладает собст- венным набором распознаваемых свойств, методов и событий. Элементы управления могут принимать вводимые пользователем значения, отображать выходные значения и запускать процедуры событий. Для управления большинством таких элементов используются методы. Элементы управления могут быть интерактивными (реагируют на действия пользователя) и статическими (доступны только через код).  Элемент управления ActiveX — размещаемый на форме или на рабочем листе объект, который расширяет возможности пользовательского интерфейса прило-
Глоссарий терминов Visual Basic Editor 483 жения. Элементы ActiveX поддерживают события и могут встраиваться в другие элементы управления.  Юникод — стандарт символа Международной организации по стандартизации (ISO). Юникод использует 16-разрядную (2-байтовую) схему кодирования, позволяющую кодировать 65 536 отдельных знаков. Юникод включает в себя представления для знаков препинания, математических символов и графических методов и имеет значительный объем свободного места для будущего расширения.  Языковые стандарты — набор данных, определяющих параметры для заданных языка, региона или страны. Языковой стандарт кода определяет язык терминов (например, ключевых слов) и специальные параметры, в том числе десятичные разделители и разделители списков, форматы данных и порядок сортировки знаков. Системный языковой стандарт определяет поведение поддерживающих соответствующие возможности функций, например, функций отображения чисел или преобразования строк в даты. Для настройки системного языкового стандарта используются утилиты Панели управления операционной системы.
484 Приложение 2
ПРИЛОЖЕНИЕ 3 Описание электронного архива Электронный архив к книге выложен на FTP-сервер издательства "БХВ-Петербург" по адресу: ftp://ftp.bhv.ru/9785977565936.zip. Ссылка доступна и со страницы книги на сайте www.bhv.ru. В НИМАНИЕ ! Пароль для распаковки электронного архива: VBAMicrosoftExcel2019 Электронный архив состоит из разделов, соответствующих главам печатной книги.  Папка Введение содержит следующие материалы: • Объектная модель Microsoft Excel 2019.doc; • Свойства объекта Application.doc; • Методы объекта Application.doc;         • События объекта Application.doc. Папка Глава_1_Основные_понятия_VBA содержит листинги, приведенные в главе 1. Папка Глава_2_Программирование_в_ячейках содержит листинги, приведенные в главе 2. Папка Глава_3_Условие содержит листинги, приведенные в главе 3. Папка Глава_4_Цикл содержит листинги, приведенные в главе 4. Папка Глава_5_Функции, определенные_пользователем содержит листинги, приведенные в главе 5. Папка Глава_6_Пользовательская_форма содержит листинги, приведенные в главе 6. Кроме того, в этой папке находятся рисунки, которые можно внедрить в форму. Папка Глава_7_Графические_элементы содержит листинги, приведенные в главе 7. Папка Глава_8_Работа_с ячейками_и_областями содержит листинги, приведенные в главе 8.
486 Приложение 3  Папка Глава_9_Работа_с_данными содержит листинги, приведенные в главе 9.  Папка Глава_10_Диаграмма содержит листинги, приведенные в главе 10.  Папка Глава_11_Программирование_объектов_и_событий содержит листинги, при- веденные в главе 11.  Папка Глава_12_Даты содержит листинги, приведенные в главе 12.  Папка Глава_13_Работа с рабочей книгой содержит листинги, приведенные в гла- ве 13.  Папка Глава_14_Файлы содержит листинги, приведенные в главе 14.  Папка Глава_15_Ошибки содержит листинги, приведенные в главе 15.  Папка Глава_16_Программирование_связей содержит листинги, приведенные в гла- ве 16. Кроме того, в этой папке есть текстовый файл Пример1.doc и презентация 16.06.pptx.
Предметный указатель A Activate 176, 398, 414 ActiveCell 46, 51 ActiveChart 397 ActiveChart.Location 330 ActiveSheet.Shapes 252 ActiveWorksheet 397 ActiveX 179, 180 Add 398, 414 Add Procedure 40 AddCallout 248 AddConnector 235 Additional Controls 178 AddLine 238 Address 271, 273 AddShape 231 Anchor 455, 457 Application 20, 267, 380 ◊ DisplayCommentIndicator 218 ◊ методы 268 ◊ свойства 118, 267 Application.ActiveWindow 360 Application.AddIns 426, 428 Application.Caption 406 Application.Dialogs 401 Application.EnableCancelKey 451 Application.FileDialog 429 Application.FullName 407 Application.GetOpenFilename 402 Application.Goto 286 Application.OnTime 380 Application.Quit 412 AutoOutline 309 Axes 324 B BackColor 233 Blue 81 Boolean 26 Border 20 BorderAround 73 Break Mode 446 Byte 26, 62 ByVal 358 C Calculate 268 Caption 173, 181, 191 Case 118 CDate 372 Cell 20, 80, 269, 272 Cells 414 Chart 20, 319, 324 ChartObject 319 ChartObjects.Add 321 Charts 319, 397 Charts.Add 321 ChartTitle 319, 324 ChartType 319, 324 CheckBox 216 Clear 285 ClearOutline 309 Click 54, 176 Close 399 Color 82 ColorIndex 82 ColorScale 103 Column 20 Columns 414 ComboBox 201, 202
488 CommandButton 88, 127, 181, 184 Comments 414 Context 446 Copy 175, 414, 458, 461 Count 335 CreateObject 459 CreateTextFile 422 Currency 26 D DashStyle 238 Date 27, 373 DateDiff 377 DatePart 377 DateSerial 373 Day 374 DblClick 203 Deactivate 176 Debug 453 Debug.Print 42, 371 Decimal 27 Delete 175, 284, 414 Dim 41 Dir 433 DisplayDrawingObjects 397 Do...Loop 128 Do...While...Loop 129 Documents.Open 459 Double 27, 165, 257 E ElseIf 108 End(xlToRight) 292 Environ 56 Err 448 Expression 446 F FileCopy 435 FileDialog 428 FileName 399 Fill 245 Font 20 For...Each 127 For...To...Next 120 For...To...Step...Next 119 ForeColor 233 Format 375 Предметный указатель FormulaLocal 162 Frame 191 FullName 397 Function 41 G GetAttr 430 GetFile 431 GetFolder 423 GetTickCount Lib "kernel32" 132 Goto 269 GoTo 116 Green 81 Group 246 H HasAxes 324 HasFormula 111 HasLegend 324 HasPassword 397 HasTitle 324 Height 174 Help 269 Hide 175 Hour 374 Hyperlinks 455 I If...Then 107 If...Then...Else 105, 108 Iif 144 Image 204 Immediate 442 Immediate Window 43 Initilize 176 Input 424 InputBox 60, 115, 396 Integer 27 Interior 20 Interior.Color 92 Intersect 357 IsEmpty 111 IsNumeric 111 K Kill 434
Предметный указатель L Label 181, 182 LBound 292 Legend 319 LegendEntries 341 LegendKey 341 ListBox 198 ListObjects.Add 312 Load 175 Long 27, 62, 257 M Macros 42 Macros Name 42 MarginBottom 243 MarginLeft 243 MarginRight 243 MarginTop 243 Me 193, 365 Microsoft Excel, форматы файлов 421 Mid 281 Minute 374 Month 374 MsgBox 57, 396 MsoArrowheadLength 242 MsoArrowheadStyle 242 MsoAutoShapeType 231 msoConnectorCurve 234 msoPatternDiagonalBrick 237 msoShapeRectangle 232 MultiPage 216 N Name 110, 173, 181, 240, 326, 397, 414, 436 New Group 225 NumberFormat 221 O Object 27, 424 Offset 55 On Error 113, 448 On Error GoTo 229, 450 On Error Resume Next 449 OnAction 232 OnTime 269 OpenTextFile 424 Option Explicit 39, 41, 439 OptionButton 167, 191 489 Orientation 52, 301 Output 424 Overflow 441 P PageSetup 419 ParamArray 156 Password 409, 411 Paste 461 Path 397 PathName 433 Patterned 236 PivotTable 316 Power Pivot 12 Power Query 12 Power View 15 PowerMap 15 PowerPoint.Application 461 Presentations.Open 463 PresetTextured 247 PrintOut 334 Private 28, 41, 257 Private Type 257 Procedure 355 Protect 62, 399, 414 Protection.AllowFormattingCells 417 Public 28, 41, 257 Q Quit 269 R Raise 448 RAND 76 Range 20, 49, 53, 69, 76, 269 ◊ методы 271 ◊ свойства 270 Range.AutoFill 381 Range.Copy 286 Range.CurrentRegion 278 Range.End 275 Range.Hidden 286 Range.Interior 278 Range.Offset 283 Range.PasteSpecial 286 Range.Select 272 Range.Sort 298 Range.SpecialCells 274 Red 81
490 ReDim 292 RefEdit 220 RGB 81, 194 ROUND 148 Row 20 Rows 414 Run | Run Sub/UserForm 69 S Save 175, 399 SaveAs 399 Saved 397 Scripting.FileSystemObject 425 ScrollBar 194, 195 Second 374 Select 148, 414 Selection 51, 272 SeriesCollection 339 Set 252 SetSourceData 324 Shapes 20, 231, 414 Shapes.AddChart2 347 Sheets 319, 397 Shell 404 Show 175, 176, 189 Single 27 Slicers.Add 315 SpecialCells 101 SpinButton 209 Standard 172 StandardHeight 414 StandardWidth 414 Static 28 String 27, 61 Style 20 Sub 41 T TabStrip 213 TextBox 187 TextFrame 243 ThreeD 248 Time 373 TimeSerial 373 ToggleButton 223, 224 Toolbox 178, 179 Tools | Options 44, 58 Transparency 349 Trendline 341 Trendlines 319, 341 Предметный указатель Trendlines.Add 341 TwoColorGradient 233, 245 Type 27, 446 U UBound 292 Union 273 Unload 175 Unload Me 193 Unprotect 64, 399 UnProtect 414 UpdateLinks 399 UsedRange 414 UserForm 171 V Value 49, 50, 73, 110, 446 Variant 27 VBA 11 vbCritical 59 vbExclamation 59 vbHide 404 vbInformation 59 vbMaximizeFocus 404 vbMinimizeFocus 404 vbMinimizeNoFocus 404 vbNormalFocus 404 vbNormalNoFocus 404 vbQuestion 59 View | Immediate Windows 133 View Microsoft Excel 66 Visible 326, 414 Visual Basic for Applications 11 Volatile 269 W Wait 269 Weekday 98, 374 WeekdayName 378 While...Wend 131 Width 174 With 50, 74 Workbook 20, 319, 397 ◊ свойства 397 Workbook.BeforeClose 368 Workbook.BeforeSave 368 Workbook.FollowHyperlink 439, 458 Workbook.LinkSources 403 Workbook.Name 405
Предметный указатель Workbook.Protect 413 Workbook.Save 408 Workbook.SaveAs 408 Workbook.SaveCopyAs 411 Workbooks.Add 406 Workbooks.Open 399 Worksheet 20, 414 ◊ методы 414 ◊ свойства 414 Worksheet.Activate 360 Worksheet.BeforeDoubleClick 365 Worksheet.BeforeRightClick 358, 366 Worksheet.Change 359 Worksheet.Deactivate 360, 367 Worksheet.Protect 415 Worksheet.SelectionChange 357, 360 Worksheet.UsedRange 278 А Автоматический ввод атрибутов команд 44 Автофильтр 308 Б Безопасность макросов 32 Быстрые клавиши 64 В Вкладка: ◊ Данные 299 ◊ Разработчик 32 ◊ Рисование 147 Выражение арифметическое 70 Г Геолокация 345 Гистограмма коническая 332 Границы 20 График функции: ◊ построение 139 ◊ с двумя условиями 143 ◊ с тремя условиями 145 Графика: ◊ векторная 250 ◊ фрактальная 255 491 WorksheetFunction 102 Worksheets 397 Worksheets.Activate 46 WriteReserved 397 X XlChartType 321 xlErrorHandler 451 XlListObjectSourceType 312 XLM 19 Y Year 374 Д Дата 371 ◊ поиск 384 Диаграмма 20 ◊ в виде карты 347 ◊ внедренная 323 ◊ печать 334 ◊ прозрачность 347 ◊ свойства 324 ◊ создание узоров 349 ◊ тип 321 ◊ удаление 336 ◊ форматирование параметров 337 Диалоговое окно: ◊ Add Procedure (Добавить процедуру) 40 ◊ Add-in Manager 426 ◊ Additional Controls 178 ◊ Customize Control (Настроить элемент управления) 225 ◊ InputBox 60 ◊ Options 175 ◊ References - VBAProject 425 ◊ Вставка гиперссылки 455 ◊ Вставка значков 250 ◊ Вставка функции 142 ◊ Надстройки 427 ◊ Назначить макрос объекту 125 ◊ Обзор 429
492 ◊ Открытие документа 401 ◊ Параметры Excel 33, 427 ◊ Формат элемента управления 228 ◊ Центр управления безопасности 32 Диапазон 20, 269 ◊ объединение 273 ◊ поиск максимума 287 ◊ поиск минимума 287 З Защита: ◊ на уровне листа 62 ◊ рабочего листа 415 ◊ рабочей книги 413 ◊ снятие 64 ◊ ячеек рабочего листа 93 Значок фильтрации 312 И Измерение времени работы процедур 132 Имя 34 Инкапсуляция 18 Интеграл, вычисление методом: ◊ прямоугольников 163 ◊ Симпсона 164 ◊ трапеций 163 Инфографика 253 Итоги 308 К Календарь 386 ◊ по месяцам 389 ◊ по неделям 392 Карта 347 Категория, создание 150 Клавиатурное сокращение 159 Клавиши <Ctrl> и <G> 442 Класс 21 Книга Excel с поддержкой макросов 35 Кнопка 54, 86, 125, 457 ◊ CommandButton 181 ◊ View Microsoft Excel 66 ◊ Включить содержимое 48 ◊ Вставить функцию 142 ◊ вызова Toolbox 178 ◊ Режим конструктора 91, 169 ◊ Создать примечание 216 Предметный указатель Команда: ◊ Add-Ins 426 ◊ Debug | Run To Cursor 454 ◊ Debug 453 ◊ Debug | Step Into 454 ◊ Debug | Step Out 454 ◊ Debug | Step Over 454 ◊ Debug | Toggle Breakpoint 444 ◊ Insert | Module 37 ◊ Run | Run Sub 42, 46, 69, 82, 107, 114, 117, 120, 233, 280, 291, 333, 441 ◊ Tools | Options 44, 58, 174 ◊ Tools | Reference 455 ◊ View | Immediate Window 43, 371, 442 ◊ View | Locals 444 ◊ View | Project Explorer 37 ◊ View | Watches 445 ◊ Вставка | Гистограмма 325 ◊ Вставка | Значки 250 ◊ Данные | Структура | Промежуточный итог 308 ◊ Исходный текст 88, 326 ◊ Назначить макрос 188 ◊ Начать изменение узлов 255 ◊ объединение ячеек 278 ◊ Файл | Сохранить 72 ◊ Файл | Сохранить как 35, 44, 56, 70, 107, 120, 142, 177, 228, 233, 273, 291, 356, 372, 400, 423, 442 Комментарий 46 Константа 28 ◊ перечисления: C XlChartType 321 C XlListObjectSourceType 313 ◊ табуляции 59 ◊ функции MsgBox 59 ◊ цвета 81, 82 Л Линия: ◊ соединительная 234 ◊ тренда 341 Лист диаграммы 324 Литерал даты 372
Предметный указатель М Макрорекордер 152 Макрос 34 ◊ запись 152 ◊ число обращений 362 Массив 155 ◊ динамический 291 ◊ с параметром 156 Метод 175 ◊ ActiveChart.Location 330 ◊ AddCallout 248 ◊ AddConnector 235 ◊ AddLine 238 ◊ AddShape 231 ◊ Application.GetOpenFilename 402 ◊ Application.Goto 286 ◊ Application.OnTime 380 ◊ Application.Quit 412 ◊ AutoOutline 309 ◊ Axes 324 ◊ BorderAround 73 ◊ ChartObjects.Add 321 ◊ Charts.Add 321 ◊ Clear 285 ◊ ClearOutline 309 ◊ CreateObject 459 ◊ CreateTextFile 422 ◊ Debug.Print 42 ◊ Delete 284 ◊ Documents.Open 459 ◊ End(xlToRight) 292 ◊ GetFile 431 ◊ GetFolder 423 ◊ Group 246 ◊ Intersect 357 ◊ ListObjects.Add 312 ◊ OneColorGradient 243 ◊ OpenTextFile 424 ◊ Patterned 236 ◊ Presentations.Open 463 ◊ PrintOut 334 ◊ Protect. 62 ◊ Raise 448 ◊ Range.AutoFill 381 ◊ Range.Copy 286 ◊ Range.PasteSpecial 286 ◊ Range.Select 272 ◊ Range.Sort 298 ◊ Range.SpecialCells 274 493 ◊ SetSourceData 324 ◊ Shapes.AddChart2 347 ◊ Slicers.Add 315 ◊ SpecialCells 101 ◊ Trendlines.Add 341 ◊ Unprotect 64 ◊ Workbook.FollowHyperlink 439, 458 ◊ Workbook.LinkSources 403 ◊ Workbook.Protect 413 ◊ Workbook.Save 408 ◊ Workbook.SaveAs 408 ◊ Workbook.SaveCopyAs 411 ◊ Workbooks.Add 406 ◊ Workbooks.Open 399 ◊ WorksheetFunction.Weekday 98 ◊ Worksheets.Activate 46 Модуль 37 ◊ удаление 66 Н Надстройка 427 ◊ Power Pivot 12 ◊ Power Query 12 ◊ Power View 15 ◊ PowerMap 15 Наследование 18 О Область действия: ◊ Private 28 ◊ Public 28 ◊ Static 28 Обработчик события 353 Объект 19 ◊ Application 20, 118, 267 ◊ Cell 272 ◊ Chart 324 ◊ ColorScale 103 ◊ Err 448 ◊ FileDialog 428 ◊ FileSystemObject 422 ◊ FillFormat 243 ◊ Hyperlinks 455 ◊ LegendEntries 341 ◊ LegendKey 341 ◊ Range 53 ◊ Range 69 ◊ Selection 272
494 ◊ Workbook 397 ◊ Worksheet 414 ◊ WorksheetFunction 102 Объектно-ориентированное программирование 18 Окно: ◊ Immediate 442 ◊ Locals 444 ◊ Watches 445 ◊ проекта Project - VBA Project 37, 39 Оператор: ◊ Case 118 ◊ Case 114 ◊ Dim 41 ◊ ElseIf 108 ◊ FileCopy 435 ◊ GoTo 116 ◊ If...Then 107 ◊ If...Then...Else 105 ◊ Kill 434 ◊ Name 436 ◊ On Error 448 ◊ On Error GoTo 449, 450 ◊ On Error Resume Next 449 ◊ Set 252 ◊ Static 42 ◊ With 50, 74, 75 ◊ логический 105 C If...Then 107 C If...Then...Else 108 C вложенный 109 ◊ сравнения 105 ◊ цикла 119 C Do ... Loop 128 C Do...While...Loop 129 C For...Each 127 C For...To...Next 120 C For...To...Step...Next 119 C While...Wend 131 Оповещение системы безопасности 48, 49 Отладка программы 439 Ошибка: ◊ выполнения 439 ◊ коды ошибок 447 ◊ компиляции 439 ◊ логики 439 ◊ синтаксическая 439 Предметный указатель П Параметры страницы 419 Пароль 410 Переключатель 167 Переменная 28 ◊ Byte 62 ◊ Long 62 ◊ String 61 ◊ объектов 28 Переполнение 441 Перечисление: ◊ MsoArrowheadLength 242 ◊ MsoArrowheadStyle 242 ◊ MsoArrowheadWidth 242 ◊ MsoAutoShapeType 231 Перья 147 Поверхность 78 Подсказка всплывающая 58 Полиморфизм 18 Полоса прокрутки 194 Пользовательская форма 171 ◊ UserForm 171 ◊ закрытие 193 ◊ Калькулятор 202 ◊ Квартплата 198 ◊ методы 175 ◊ Отображение данных 218 ◊ Персонализация данных 187, 188 ◊ Платежи 206 ◊ Победители олимпиад 211 ◊ показ формы 178 ◊ Работа с кнопками 185 ◊ Решение квадратного уравнения 182, 183 ◊ свойства 173, 174 ◊ события 176 ◊ Учет и контроль 214 ◊ Форматирование 192 ◊ Форматирование ячеек 221 ◊ Цветовая модель RGB 195 Построение поверхности 78 Приложение 20 Процедура 40 ◊ вызов 159 ◊ обработки события 353 ◊ рекурсивная 257 Прямоугольник 188
Предметный указатель Р Рабочая книга 20 Рабочий лист 20 Разработка проекта 35 Режим: ◊ доступа 424 ◊ конструктора 55 ◊ останова 447 С Сводные таблицы PivotTable 316 Свойство 22 ◊ Address 273 ◊ Application.ActiveWindow 360 ◊ Application.Caption 406 ◊ Application.Dialogs 401 ◊ Application.DisplayCommentIndicator 218 ◊ Application.FileDialog 429 ◊ Application.FullName 407 ◊ Color 82 ◊ ColorIndex 82 ◊ DashStyle 238 ◊ Name 110 ◊ NumberFormat 221 ◊ Offset 55 ◊ Orientation 52 ◊ Protection.AllowFormattingCells 417 ◊ Range.CurrentRegion 278 ◊ Range.End 275 ◊ Range.HasFormula 112 ◊ Range.Hidden 286 ◊ Range.Interior 278 ◊ Range.Offset 283 ◊ Selection 51 ◊ ThreeD 248 ◊ Value 110 ◊ Visible 326 ◊ Workbook.Name 405 ◊ Worksheet.UsedRange 278 Символ конкатенации 60 Событие 24, 175, 353 ◊ Workbook.BeforeClose 368 ◊ Workbook.BeforeSave 368 ◊ Worksheet.BeforeDoubleClick 365 ◊ Worksheet.BeforeRightClick 358, 366 ◊ Worksheet.Change 359 ◊ Worksheet.Deactivate 367 ◊ Worksheet.SelectionChange 357, 360 495 Создание: ◊ календаря 98 ◊ категории 151 Сортировка 298 ◊ блоков 301 ◊ по цвету 305 ◊ при помощи среза 311 Сочетание клавиш 64, 159 ◊ <Ctrl>+<Shift>+<F9> 444 Срез 311 Ссылка 455 Стиль 20 Столбец 20 Стрелка 241 Строка 20 Структура кода процедуры 45 Т Таблица Excel, создание 311 Текстура 247 Тело цикла 119 Тип данных 26 ◊ определенный пользователем 256 Тип процедуры: ◊ Function 41 ◊ Sub 41 Точка прерывания 444 Ф Файл 421 ◊ атрибуты 430 ◊ документирование 431 ◊ копирование 435 ◊ переименование 436 ◊ перемещение 436 ◊ создание 422 ◊ список файлов 423 ◊ существование 433 ◊ удаление 434 Фигура 20 ◊ AddShape 231 ◊ заливка 245 ◊ имя 240 ◊ придание объемности 248 ◊ текстовая рамка 243 ◊ удаление 250 Формат SVG 250 Фрактал 256 ◊ из многоугольников 261, 262
496 Функция: ◊ API 132 ◊ CDate 372 ◊ Date 373 ◊ DateDiff 377 ◊ DatePart 377 ◊ DateSerial 373 ◊ Day 374 ◊ Dir 433 ◊ Environ 56 ◊ Format 375 ◊ GetAttr 430 ◊ Hour 374 ◊ Iif 144 ◊ InputBox 60, 115 ◊ IsEmpty 111 ◊ IsNumeric 111, 183 ◊ LBound 292 ◊ Mid 281 ◊ MsgBox 57, 58 ◊ RAND 76 ◊ RGB 81 ◊ ROUND 148 ◊ Shell 404 ◊ Time 373 ◊ TimeSerial 373 ◊ UBound 292 ◊ Weekday 374 ◊ WeekdayName 378 ◊ вызов из процедуры 158 ◊ определенная пользователем 140, 142, 432  с тремя аргументами 149  без параметров 152  с аргументом Range 153  с аргументом "массив" 156 Предметный указатель Э Элемент управления 178 ◊ ActiveX 54, 179, 180  переключатель 167, 168 ◊ CheckBox 216 ◊ ComboBox 201 ◊ CommandButton 184 ◊ Frame 191 ◊ Image 204 ◊ Label 181 ◊ ListBox 198 ◊ MultiPage 216 ◊ OptionButton 191 ◊ RefEdit 220 ◊ ScrollBar 194 ◊ SpinButton 209 ◊ TabStrip 213 ◊ TextBox 187 ◊ Выключатель 223, 326 ◊ панели Toolbox 179 ◊ полоса прокрутки 227 ◊ собственный 225 ◊ формы 124, 226, 227, 231 Я Ячейка 20, 269 ◊ адресация 269  абсолютная 269  относительная 270  смешанная 270 ◊ активная ActiveCell 46