Текст
                    
Нина Комолова Елена Яковлева Санкт-Петербург «БХВ-Петербург» 2024
УДК 004.42 ББК 32.973.26-018.2 К63 Комолова, Н. В. К63 Программирование на VBA в Excel. Самоучитель / Н. В. Комолова, Е. С. Яковлева. — СПб.: БХВ-Петербург, 2024. — 512 с.: ил. — (Самоучитель) ISBN 978-5-9775-1892-5 Книга посвящена возможностям программирования на языке Visual Basic for Applications (VBA) в современном офисном приложении Microsoft Office Excel. Приведена информация о сервисах Power по работе с данными, новинках Excel 2021, в том числе о динамических массивах и функциях для работы с ними. Даны теоретические сведения о программировании, элементах объектной модели Excel, запуске и отладке макросов. Рассмотрены вопросы автоматизации рабочего листа при помощи элементов управления Excel. Описаны приемы создания макросов, пользовательских функций и форм в редакторе Visual Basic. Приведены способы взаимодействия при помощи VBA с другими программами пакета Microsoft Office. Для закрепления материала рассмотрены примеры пользовательских приложений в виде листингов программ с анализом и поясняющими комментариями. В приложениях содержатся глоссарии с основными терминами VBA и редактора Visual Basic VBE. Файлы рабочих книг с поддержкой макросов для каждой главы размещены на сайте издательства. Для широкого круга пользователей УДК 004.42 ББК 32.973.26-018.2 Группа подготовки издания: Руководитель проекта Зав. редакцией Редактор Компьютерная верстка Дизайн серии Оформление обложки Евгений Рыбаков Людмила Гауль Григорий Добин Ольги Сергиенко Марины Дамбиевой Зои Канторович "БХВ-Петербург", 191036, Санкт-Петербург, Гончарная ул., 20 ISBN 978-5-9775-1892-5 © ООО "БХВ", 2024 © Оформление. ООО "БХВ-Петербург", 2024
Оглавление Введение .......................................................................................................................... 11 Язык VBA ....................................................................................................................................... 11 Нововведения Excel 2021 и службы Power.................................................................................. 11 Совместное редактирование рабочей книги ........................................................................ 12 Службы Power ........................................................................................................................ 12 Динамические массивы .........................................................................................................17 Новые функции в Excel 2021 ................................................................................................ 19 Оператор неявного пересечения ........................................................................................... 20 Зачем нужен VBA в Excel 2021? .................................................................................................. 21 Объектно-ориентированное программирование ......................................................................... 22 Общие положения .................................................................................................................. 22 Объект ..................................................................................................................................... 24 Объектная модель Microsoft Excel 2021 ...................................................................................... 24 Объектная модель VBA .........................................................................................................24 Объект Application ................................................................................................................. 25 Классы..................................................................................................................................... 26 Свойства ................................................................................................................................. 26 Методы ................................................................................................................................... 27 События .................................................................................................................................. 28 Глава 1. Основные понятия VBA ............................................................................... 31 Базовые конструкции языка Visual Basic..................................................................................... 31 Типы данных в VBA .............................................................................................................. 32 Константы и переменные, переменные объектов ............................................................... 34 Область действия переменных и констант ................................................................. 34 Объявление констант и переменных ........................................................................... 35 Начало работы ............................................................................................................................... 35 Настройка безопасности ............................................................................................................... 39 Запись макроса ............................................................................................................................... 41 Имя макроса ........................................................................................................................... 41 Разработка проекта ........................................................................................................................ 42 Создание модуля ............................................................................................................................ 44 Создание модуля с помощью контекстно-зависимого меню ............................................. 45
4 Оглавление Окно кода................................................................................................................................ 45 Оператор Option Explicit ....................................................................................................... 46 Первая процедура .......................................................................................................................... 47 Объявление переменной в VBA ........................................................................................... 48 Оператор Debug.Print ............................................................................................................ 49 Автоматический ввод атрибутов команд ............................................................................. 51 Структура кода процедуры ........................................................................................................... 52 Метод Worksheets.Activate ..................................................................................................... 53 Активная ячейка ActiveCell ................................................................................................... 53 Открытие книги с макросом ................................................................................................. 55 Ввод данных ........................................................................................................................... 56 Оператор With ........................................................................................................................ 57 Свойство Selection.................................................................................................................. 58 Свойство Orientation.............................................................................................................. 59 Объект Range.......................................................................................................................... 60 Кнопка (элемент управления ActiveX) ................................................................................. 61 Свойство Offset ....................................................................................................................... 62 Функция Environ .................................................................................................................... 63 Функция MsgBox .................................................................................................................... 64 Константы табуляции Chr(9) и перевода строки Chr(10) ................................................... 66 Диалоговое окно, создаваемое функцией InputBox ............................................................ 67 Переменная типа String ......................................................................................................... 68 Переменная типа Long ........................................................................................................... 68 Переменная типа Byte ............................................................................................................ 69 Методы Protect и Unprotect................................................................................................... 69 Запуск макроса при помощи нажатия сочетания клавиш .......................................................... 71 Как удалить модуль? ..................................................................................................................... 73 Глава 2. Основы программирования в VBA ........................................................... 75 Ячейка и диапазон ячеек ............................................................................................................... 75 Арифметические выражения ........................................................................................................ 76 Правила записи арифметических выражений ..................................................................... 77 Арифметические выражения в ячейке ................................................................................. 77 Арифметические выражения с ячейками ............................................................................. 78 Обрамление ячейки — метод BorderAround ............................................................................... 79 Оператор With ................................................................................................................................ 80 Вложенные операторы With .......................................................................................................... 81 Генерация случайных чисел СЛЧИС() ........................................................................................ 82 Генерация динамического массива случайных чисел RandArray .............................................. 83 Перевод градусов по Фаренгейту в градусы по Цельсию .......................................................... 84 Замена значений формул числом .................................................................................................85 Работа с цветом .............................................................................................................................. 88 Функция RGB ......................................................................................................................... 88 Свойства Color и ColorIndex ................................................................................................. 89 Свойство Color .............................................................................................................. 89 Свойство ColorIndex ..................................................................................................... 90 Палитра цветов.............................................................................................................. 93 Подсчет цветов в рисунке ............................................................................................ 95 Заливка ячейки цветом ................................................................................................. 98
Оглавление 5 Защита ячеек рабочего листа от форматирования ..................................................... 99 Выделение ячеек по цветовому соответствию в диапазоне .................................... 101 Заливка строк с заданным шагом .............................................................................. 102 Выделение миганием .................................................................................................. 103 Календарь ....................................................................................................................105 Заливка ячеек, содержащих формулы ....................................................................... 106 Подсветка минимального и максимального значений ............................................ 108 Цветовая шкала ........................................................................................................... 109 Глава 3. Логические операторы ............................................................................... 111 Оператор If...Then...Else............................................................................................................... 111 Операторы сравнения .................................................................................................................. 111 Неполная форма оператора If...Then .................................................................................. 113 Полная форма оператора If...Then...Else ............................................................................ 114 Оператор ElseIf..................................................................................................................... 114 Вложенные логические операторы ............................................................................................ 115 Примеры использования логических операторов ..................................................................... 116 Свойство Name ..................................................................................................................... 116 Свойство Value ..................................................................................................................... 116 Функции IsEmpty и IsNumeric ............................................................................................. 117 Свойство Range.HasFormula ............................................................................................... 117 Переход к ячейке A2021 ...................................................................................................... 118 Пример с оператором Case ................................................................................................. 119 Функция InputBox ................................................................................................................ 121 Оператор GoTo ..................................................................................................................... 122 Проверка существования файла ......................................................................................... 123 Глава 4. Операторы цикла ........................................................................................ 125 Цикл For...To...Step...Next ............................................................................................................ 125 Цикл For...To...Next ...................................................................................................................... 126 Заполнение столбца ............................................................................................................. 127 Заполнение столбца с большим шагом .............................................................................. 128 Отрицательный шаг .............................................................................................................128 Выход из цикла по условию ................................................................................................ 129 Кнопка для запуска макроса (элемент управления формы) ..................................................... 130 Вложенный цикл For...To...Next.......................................................................................... 131 Цикл For...Each ............................................................................................................................ 133 Цикл Do...Loop .............................................................................................................................134 Цикл While...Wend ........................................................................................................................ 137 Время работы программы ........................................................................................................... 138 Глава 5. Функции, определенные пользователем ................................................ 145 Построение функций ................................................................................................................... 145 График функции одной переменной .................................................................................. 145 Структура кода функции пользователя .............................................................................. 146 График функции одной переменной (продолжение) ........................................................ 146 Расчет функции одной переменной с использованием динамических массивов ........... 149 График кусочно-непрерывной функции с двумя условиями ........................................... 150 Расчет кусочно-непрерывной функции с двумя условиями с использованием динамических массивов ...................................................................................................... 153
6 Оглавление График кусочно-непрерывной функции с тремя условиями ............................................ 154 Расчет кусочно-непрерывной функции с тремя условиями с использованием динамических массивов ...................................................................................................... 156 Названия формул на английском языке ............................................................................. 158 Пользовательская функция с тремя аргументами ............................................................. 160 Создание собственной категории ...............................................................................................161 Функция без аргументов ..................................................................................................... 163 Переименование рабочего листа ........................................................................................ 164 Функция с аргументом типа Range .................................................................................... 165 Функция с массивом ............................................................................................................166 Формулы динамического массива ...................................................................................... 168 Функция с массивом в качестве аргумента ....................................................................... 169 Вызов функции из процедуры ............................................................................................ 171 Вызов процедуры, использующей функцию, из другой процедуры ............................... 173 Запись названий формул ..................................................................................................... 174 Вычисление определенного интеграла ...................................................................................... 176 Метод прямоугольников ..................................................................................................... 177 Метод трапеций ................................................................................................................... 177 Метод Симпсона .................................................................................................................. 177 Переключатели OptionButton ...................................................................................................... 180 Глава 6. Пользовательская форма........................................................................... 183 Создание форм средствами VBA ............................................................................................... 183 Форма UserForm .......................................................................................................................... 183 Семейство форм ................................................................................................................... 184 Свойства формы................................................................................................................... 184 Разметочная сетка ................................................................................................................ 186 Методы формы..................................................................................................................... 187 События формы ................................................................................................................... 187 Командная кнопка для показа формы ................................................................................ 188 Элементы управления ................................................................................................................. 190 Префиксы ............................................................................................................................. 193 Элемент управления Label .................................................................................................. 193 Элемент управления CommandButton ................................................................................ 196 Элемент управления TextBox .............................................................................................. 199 Элементы управления OptionButton и Frame .................................................................... 202 Ключевое слово Me.............................................................................................................. 205 Элемент управления ScrollBar ............................................................................................ 206 Элемент управления ListBox ............................................................................................... 210 Элемент управления ComboBox.......................................................................................... 213 Элемент управления Image ................................................................................................. 216 Элемент управления SpinButton.......................................................................................... 220 Элемент управления TabStrip ............................................................................................. 224 Элементы управления CheckBox и MultiPage .................................................................... 228 Элемент управления RefEdit ............................................................................................... 232 Элемент управления ToggleButton...................................................................................... 235 Пользовательский элемент управления ..................................................................................... 237 Элементы управления формы .....................................................................................................238 Элемент управления Полоса прокрутки............................................................................ 239
Оглавление 7 Глава 7. Программирование объектов Shape, инфографики и фракталов ........ 243 Типы объектов, свойства и методы семейства Shapes ............................................................. 243 Тип объекта msoShapeRectangle (прямоугольник) с заливкой (Fill) ............................... 244 Тип объекта msoConnectorCurve (соединительная линия) ............................................... 246 Метод AddConnector ............................................................................................................ 247 Метод Patterned ................................................................................................................... 248 Рисование линии: метод AddLine ....................................................................................... 250 Тип объекта msoShapeSmileyFace....................................................................................... 251 Свойство Name ..................................................................................................................... 252 Стрелка ................................................................................................................................. 253 Метод FillFormat.OneColorGradient .................................................................................. 255 Текстовый фрейм ................................................................................................................. 255 Тип фигуры msoShapeHeart (сердце) с заливкой (Fill) ..................................................... 257 Метод Group ......................................................................................................................... 258 Создание выноски с текстовым фреймом.......................................................................... 259 Свойство ThreeD .................................................................................................................. 260 Частичное и полное удаление фигур .................................................................................. 262 Оператор Set ......................................................................................................................... 264 Создание собственных элементов инфографики ...................................................................... 265 Фракталы ...................................................................................................................................... 267 Тип данных, определенный пользователем ....................................................................... 268 Фракталы из треугольников ................................................................................................ 269 Фракталы из многоугольников ........................................................................................... 273 Фракталы из четырехугольников ....................................................................................... 275 Глава 8. Работа с ячейками и областями ............................................................... 279 Объект Application ....................................................................................................................... 279 Свойства объекта Application.............................................................................................. 279 Методы объекта Application................................................................................................ 280 Объект Range ............................................................................................................................... 281 Адресация ячеек ................................................................................................................... 281 Свойства объекта Range ...................................................................................................... 282 Методы объекта Range ........................................................................................................ 284 Объект Selection ........................................................................................................................... 284 Объект Cell ................................................................................................................................... 284 Выделение нескольких областей ................................................................................................284 Выделение последней ячейки в диапазоне ................................................................................ 286 Свойство Range.End .................................................................................................................... 287 Выделение ячеек с формулами ...................................................................................................288 Выделение используемого диапазона данных .......................................................................... 290 Форматирование объединенных ячеек ...................................................................................... 290 Выделение по условию................................................................................................................ 292 Удаление символов из ячеек ....................................................................................................... 293 Убираем текст .............................................................................................................................. 294 Имена и фамилии ......................................................................................................................... 295 Метод Delete................................................................................................................................. 297 Метод Clear .................................................................................................................................. 298 Метод Application.Goto ............................................................................................................... 299 Скрытие данных........................................................................................................................... 299
8 Оглавление Копирование и специальная вставка .......................................................................................... 299 Поиск минимума и максимума в диапазоне .............................................................................. 300 Поиск минимума и максимума в динамическом массиве ........................................................ 301 Глава 9. Работа с данными ........................................................................................ 305 Массив из трех элементов ........................................................................................................... 305 Динамический массив данных ....................................................................................................308 Сравнение областей на одном листе .......................................................................................... 310 Сравнение областей на разных листах ....................................................................................... 311 Сортировка ................................................................................................................................... 316 Сортировка диапазона данных ........................................................................................... 317 Сортировка областей (блоков) ............................................................................................ 318 Простая сортировка блоков ....................................................................................... 319 Сортировка блоков с изменением ее условий .......................................................... 320 Сортировка по цвету ............................................................................................................ 322 Контроль автофильтра посредством VBA ................................................................................. 325 Команда Итоги ............................................................................................................................ 325 Сортировка данных при помощи среза...................................................................................... 328 Сводные таблицы PivotTable ...................................................................................................... 332 Глава 10. Автоматизация диаграмм ........................................................................ 337 Объектная модель диаграмм....................................................................................................... 337 Типы диаграмм .................................................................................................................... 339 Свойства объекта Chart ....................................................................................................... 342 Методы объекта Chart ......................................................................................................... 342 Первая диаграмма ........................................................................................................................ 343 Создание диаграммы с помощью VBA .............................................................................. 346 Коническая гистограмма ..................................................................................................... 350 Печать диаграмм .................................................................................................................. 352 Удаление диаграммы ...........................................................................................................354 Форматирование параметров диаграммы .................................................................................. 355 Форматирование цветов поверхности ....................................................................................... 357 Добавление линии тренда ........................................................................................................... 359 Геолокация ................................................................................................................................... 363 Красивые узоры ........................................................................................................................... 365 Глава 11. Программирование объектов и событий.............................................. 369 Где и как создаются процедуры обработки событий? .............................................................. 370 Процедура для объекта ЭтаКнига ..................................................................................... 371 События, связанные с нажатием кнопок мыши ........................................................................ 372 Процедура в модуле ............................................................................................................. 372 Событие для объекта Worksheet (Лист) .............................................................................. 373 Ключевое слово ByVal и параметр Target.......................................................................... 374 Очистка ячейки .................................................................................................................... 375 Свойства ScrollRow и ScrollColumn .................................................................................... 376 События активации и деактивации ............................................................................................ 376 Свойство приложения ActiveWindow .................................................................................. 376 Активный лист ..................................................................................................................... 377 Число обращений к макросу ............................................................................................... 378
Оглавление 9 Управление выделением области ....................................................................................... 379 События Activate и Deactivate рабочего листа .................................................................. 379 Двойной щелчок левой кнопкой мыши ............................................................................. 380 Щелчок правой кнопкой мыши .......................................................................................... 381 Введите пароль..................................................................................................................... 382 Событие закрытия книги ..................................................................................................... 383 Событие сохранения книги ................................................................................................. 384 Глава 12. Операторы даты и времени .................................................................... 385 Вывод даты и времени в окно Immediate оператором Debug.Print ......................................... 385 Печать даты и времени с помощью функции CDate ................................................................ 386 Функции DateSerial и TimeSerial ................................................................................................ 387 Текущие дата и время .................................................................................................................. 387 Текущие дата и время с учетом минут и секунд ....................................................................... 388 Функция Weekday — день недели .............................................................................................. 388 Функция Format ........................................................................................................................... 389 Функция DateDiff ......................................................................................................................... 391 Функция DatePart ........................................................................................................................ 391 Функция WeekdayName ............................................................................................................... 392 Вывод сообщения на 3 секунды .................................................................................................393 Метод Application.OnTime........................................................................................................... 394 Автоматическое заполнение ячеек датами методом AutoFill .................................................. 395 Подсветка даты ............................................................................................................................ 397 Поиск даты ................................................................................................................................... 398 Календарь ..................................................................................................................................... 400 Календарь по месяцам ................................................................................................................. 402 Календарь по неделям ................................................................................................................. 405 Определение возраста ................................................................................................................. 409 Глава 13. Действия с рабочей книгой ..................................................................... 411 Свойства объекта Workbook ........................................................................................................ 411 Методы объекта Workbook .......................................................................................................... 412 Событие и метод Open ................................................................................................................ 413 Открытие рабочей книги методом Workbooks.Open ......................................................... 414 Свойство Application.Dialogs для работы со встроенными диалоговыми окнами ............ 415 Открытие рабочей книги в диалоговом окне .................................................................... 416 Открытие приложения Блокнот..................................................................................................418 Свойство Workbook.Name ........................................................................................................... 419 Создание рабочей книги.............................................................................................................. 420 Имя приложения .......................................................................................................................... 420 Сохранение рабочей книги ......................................................................................................... 422 Метод Workbook.Save .......................................................................................................... 422 Метод Workbook.SaveAs ...................................................................................................... 422 Метод Workbook.SaveCopyAs .............................................................................................. 425 Сохранение всех книг и выход из программы .................................................................. 426 Сохранение всех книг и выход по запросу ........................................................................ 426 Защита рабочей книги методом Workbook.Protect ............................................................ 427 Объект Worksheet ......................................................................................................................... 427 Свойства объекта Worksheet................................................................................................ 428
10 Оглавление Методы объекта Worksheet и семейства Worksheets ......................................................... 428 Защита рабочего листа методом Worksheet.Protect .......................................................... 428 Деление рабочего листа на страницы для печати ..................................................................... 432 Глава 14. Файловые операции .................................................................................. 435 Форматы файлов Microsoft Excel ...............................................................................................435 Метод CreateTextFile для объекта FileSystemObject ................................................................. 436 Список файлов указанной папки ................................................................................................437 Режим доступа Input/Output ........................................................................................................ 438 Файлы из Application.AddIns ....................................................................................................... 440 Объект FileDialog ........................................................................................................................ 442 Функция GetAttr ........................................................................................................................... 444 Документирование информации о файле .................................................................................. 445 Проверка существования файла .................................................................................................447 Оператор Kill для удаления файла.............................................................................................. 448 Оператор FileCopy для копирования файла .............................................................................. 449 Переименование файла ............................................................................................................... 450 Перемещение файла .................................................................................................................... 450 Глава 15. Отладка программ и сообщения об ошибках ...................................... 453 Возникновение ошибок ............................................................................................................... 453 Выявление и исправление ошибок ............................................................................................. 454 Три окна для просмотра ошибок ................................................................................................456 Окно просмотра Immediate.................................................................................................. 456 Окно Locals........................................................................................................................... 458 Окно наблюдения Watches .................................................................................................. 459 Объект Err .................................................................................................................................... 462 Оператор On Error ....................................................................................................................... 462 Оператор On Error Resume Next ......................................................................................... 463 Оператор On Error GoTo: вариант 1................................................................................... 464 Оператор On Error GoTo: вариант 2................................................................................... 465 Константы xlDisabled и xlInterrupt свойства Application.EnableCancelKey .................... 466 Массив листов ...................................................................................................................... 467 Команда меню Debug .................................................................................................................. 468 Глава 16. Программирование связей ...................................................................... 471 Гиперссылки................................................................................................................................. 471 Кнопка гиперссылки .................................................................................................................... 473 Передача данных из Excel в Word ..............................................................................................475 Внедрение документа Word в Excel ........................................................................................... 475 Передача данных из Excel в PowerPoint .................................................................................... 477 Передача данных из PowerPoint в Excel .................................................................................... 479 Приложение 1. Глоссарий терминов Visual Basic for Applications .................... 481 Приложение 2. Глоссарий терминов Visual Basic Editor ..................................... 485 Приложение 3. Описание электронного архива .................................................... 501 Предметный указатель .............................................................................................. 503
Введение Программа 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 2021 и службы Power Microsoft Excel в новой версии 2021, конечно, поражает своим многообразием инструментов и имеющихся дополнительных служб. Все функции мы, разумеется,
12 Введение рассмотреть не сможем, но на основных нововведениях Microsoft Excel 2021 остановимся. Совместное редактирование рабочей книги После сохранения файлов MS Office в облачном сервисе OneDrive или на вебплатформе SharePoint становится доступна возможность совместного редактирования файлов программ Word, Excel (файлов с расширением xlsx) и PowerPoint. Для этого предназначена кнопка Поделиться, расположенная в правом верхнем углу экрана. По ее нажатию в правой части экрана появится одноименная область (рис. В1, а). В ней можно указать пользователей из контактных данных адресной книги, настроить права доступа, добавить сообщения. По нажатию левой кнопкой мыши на надписи Получить ссылку для совместного доступа, вы сможете создать ссылку для совместного редактирования сохраненного файла либо только для его просмотра (рис. В1, б). Создав ссылку, вернитесь в исходную область и нажмите кнопку Поделиться, — ссылка для просмотра/редактирования файла будет отправлена указанному пользователю, а вся информация о правах доступа — отображена в области (рис. В1, в). В программе Excel для MS Office 365 также доступны беседы с другими пользователями через комментарии и заметки. Службы Power В программе Excel реализованы и улучшены очень мощные сервисы (надстройки) по работе с данными — такие как Power Query, Power Pivot и Power Map. а Рис. В1. (Часть 1 из 2) Область Поделиться для настроек совместного редактирования
Введение 13 б в Рис. В1. (Часть 2 из 2) П РИМЕЧАНИЕ Надстройка Power View, применявшаяся в Microsoft Excel версии 2019, а также в SharePoint, SQL Server и Power BI для визуализации данных, с помощью которой можно было создавать интерактивные диаграммы, графики, карты и другие наглядные элементы, позволяющие оживить информацию, из программы удалена. Power Query — это технология подключения к данным, обеспечивающая возможность обнаруживать, подключать, объединять и уточнять данные из различных источников для последующего анализа. С ее помощью можно загружать данные из файлов разных форматов, из целого множества баз данных (рис. В2), в том числе созданных с использованием профессиональных СУБД, из веб-служб и других источников. Обратите внимание, что доступная для предыдущей версии Excel загрузка MDBфайлов баз данных теперь не поддерживается — требуется обновленный формат файла базы данных Access (ACCDB). Для импорта данных табличного типа устанавливается соединение с выбранной базой данных, и собственно импорт осуществляется через соответствующие диалоговые окна. При этом таблицы базы данных автоматически преобразуются в таблицы Excel с управляющими элементами для фильтрации столбцов. Надстройка Power Query ранее находилась на отдельной вкладке Excel, теперь же доступ к ней осуществляется со вкладки Данные с использованием команд в области Получить и преобразовать данные. При успешном размещении таблиц на рабочих листах справа появляется область Запросы и подключения с расширенной информацией о запросах и имеющихся подключениях к источникам информации (рис. В3). Переход в редактор Power
14 Введение Рис. В2. Импортирование таблицы из базы данных Рис. В3. Область Запросы и подключения
Введение 15 Query осуществляется по двойному щелчку левой кнопкой мыши на строке с названием запроса (рис. В4). Power Pivot — это технология моделирования данных, которая позволяет создавать модели данных, устанавливать отношения и добавлять вычисления. С помощью Power Pivot возможно работать с большими наборами данных, создавать развернутые Рис. В4. Переход в редактор Power Query Рис. В5. Подключение надстройки Power Pivot
16 Введение отношения и сложные (или простые) вычисления. Чтобы добавить в меню Excel вкладку (надстройку) Power Pivot, выполните команду меню Файл | Параметры, в открывшемся диалоговом окне Параметры перейдите в раздел Настроить ленту и поставьте в списке вкладок области Основные вкладки флажок у опции Power Pivot (рис. В5). Модель импортированной базы данных можно просмотреть в специальном окне Power Pivot (рис. В6). Рис. В6. Просмотр диаграммы — модели данных внедренной базы данных Надстройка Power Map, предназначенная для трехмерной геопространственной визуализации, теперь интегрирована непосредственно в Excel. Для вызова окна работы с этой надстройкой (рис. В7) выделите необходимый диапазон данных, на вкладке ленты Вставка в области Обзоры разверните список кнопки 3D-карта и выберите команду Открыть 3D Maps. На основе созданных визуализаций с использованием географических данных в Power Map можно создавать видеоролики (рис. В8) для наглядной иллюстрации данных таблицы на карте мира или вставки эффектного ролика в презентацию Power Point.
Введение 17 Рис. В7. Работа с надстройкой Power Map Рис. В8. Воспроизведение обзора в 3D Maps Динамические массивы Весной 2018 года компания Microsoft анонсировала новую возможность Microsoft Excel, названную формулы динамического массива. Это формулы, способные возвращать массивы переменного размера. Динамические массивы позволяют легко
18 Введение работать со множеством значений, управляя ими посредством формулы, введенной в задающую ячейку динамического массива. Устаревшие формулы массива, вводимые по нажатию комбинации клавиш <Ctrl>+<Shift>+<Enter>, по-прежнему поддерживаются в Microsoft Excel 2021 из соображений обратной совместимости, но их больше нельзя использовать для выполнения операций над диапазонами данных и массивами. С помощью формул, созданных для обработки массива, можно выполнять различные вычисления с одним или несколькими элементами в нем. Массив можно представить в виде строки или столбца значений или их сочетания. Формулы массива могут возвращать как отдельное значение, так и множество значений. Например, при использовании новой функции рабочего листа Excel СЛМАССИВ, возвращающей массив случайных чисел (рис. В9, а), при записи в строке формул выражения =СЛМАССИВ(5;5) автоматически возвращается соответствующий массив размером 5 строк на 5 столбцов без необходимости предварительного выделения диапазона данных для помещения в них возвращаемых значений. Теперь вы можете ввести формулу динамического массива или вызвать пользовательскую функцию в верхнюю левую ячейку (в нашем случае это ячейка A1). После ввода формулы достаточно нажать кнопку OK или клавишу <Enter> — формула автоматически распространится на оставшийся смежный диапазон данных (рис. В9, б). В этом случае Excel динамически определит размер диапазона вывода и поместит результаты в каждую ячейку в этом диапазоне. а б Рис. В9. Пример динамического массива: а — задающая ячейка массива с формулой; б — оставшаяся часть массива с формулой в неактивном режиме
Введение 19 Формулы Excel, возвращающие набор значений, также известный как массив, возвращают эти значения в смежные ячейки. Это действие называется переносом. Формулы, которые возвращают успешно переносимые массивы, можно назвать формулами перенесенного массива. Перенос означает, что формула привела к нескольким значениям, и эти значения были помещены в смежные ячейки. Динамические массивы и новые функции для их создания и операций над ними доступны только в программах Microsoft Excel 365 и Microsoft Excel 2021. Версии программы Excel 2019 и более ранние не поддерживают работу с динамическими массивами. Поэтому в книге будут приведены примеры с использованием обычных массивов и показано, как осуществить переход к динамическим массивам и воспользоваться их преимуществами. Новые функции в Excel 2021 После обновления версии Excel до 2021 в нем появилось восемь новых функций, которые раскрывают все достоинства применения динамических массивов для решения сложных задач, трудно решаемых при помощи обычных формул. Вот эти функции:  ФИЛЬТР(массив; включить; [если пусто]) — фильтрует массив или диапазон и воз- вращает соответствующие записи;  СЛМАССИВ([строки]; [столбцы]; [минимум]; [максимум]; [целое]) — возвращает массив случайных чисел;  ПОСЛЕД(строки; [столбцы]; [начало]; [шаг]) — возвращает последовательность чисел;  СОРТ(массив; [индекс_сортировки]; [порядок_сортировки]; [по_столбцу]) — сор- тирует диапазон или массив;  СОРТПО(массив; ключевой_массив1; [порядок_сортировки1]; [ключевой_массив2, порядок_сортировки2],…) — сортирует диапазон или массив на основе значений в сопоставленном с ним диапазоне или массиве;  УНИК(массив; [по_столбцам]; [только_один_раз]) — возвращает уникальные зна- чения из диапазона или массива;  ПРОСМОТРX(искомое_значение; просматриваемый_массив; возращаемый_массив; [если_ ничего_не_найдено]; [режим_сопоставления]; [режим_поиска]) — ищет совпадение в диапазоне или массиве и возвращает соответствующий элемент из второго диапазона или массива. По умолчанию используется точное соответствие (это современная замена функции ВПР). Пример работы функции ПРОСМОТРX показан на рис. В10;  ПОИСКПОЗX(искомое_значение; просматриваемый_массив; [режим_сопоставления]; [режим_ поиска]) — возвращает относительное положение элемента в массиве. По умолчанию требуется точное совпадение (это современная замена функции ПОИСКПОЗ).
20 Введение Рис. В10. Работа функции ПРОСМОТРX Вызов указанных функций рабочего листа доступен в VBA при помощи конструкций Application.WorksheetFunction и названий функций: Filter, RandArray, Sequence, Sort, SortBy, Unique, XLookup, XMatch. Оператор неявного пересечения В рамках существенного обновления языка формул Excel в целях обеспечения поддержки динамических массивов в него был добавлен оператор неявного пересечения. Обновленный язык формул Excel практически идентичен старому, за исключением того, что в нем используется оператор @, который указывает, в каких случаях может возникать неявное пересечение, тогда как в предыдущих версиях программы в формульных выражениях это не показывалось. Так что теперь вы можете заметить, что символ @ появляется в некоторых формулах при открытии в Excel 2021, поддерживающем динамические массивы, рабочей книги предыдущих версий (рис. В11). При этом наличие этого знака не повлияет на способ вычисления формул. Как правило, функции, которые возвращают диапазоны или массивы с несколькими ячейками, будут иметь префикс @, если они были созданы в более старой версии Excel. Важно отметить, что расчет формулы при этом не изменится — просто теперь возможно увидеть ранее невидимое и скрытое от глаз пользователя неявное пересечение. К распространенным функциям, которые могут возвращать диапазоны с несколькими ячейками, относятся функции ИНДЕКС, СМЕЩЕНИЕ и пользовательские функции
Введение 21 (так, на рис. В11 префикс добавлен к пользовательской функции). Распространенным исключением является случай, когда они заключены в функцию, которая принимает массив или диапазон (например, SUM() или AVERAGE()). Появление выражения @dMultiSum() в строке формул Excel означает, что неявное пересечение возможно, т. к. пользовательские функции могут возвращать массивы. В этом случае исходная формула вызвала бы неявное пересечение. Рис. В11. Оператор неявного пересечения автоматически добавлен в строку формул Excel 2021 при открытии рабочей книги, созданной в предыдущей версии Если удалить автоматически добавленный символ @, после чего открыть книгу в более старой версии Excel, формула будет отображаться как устаревшая формула массива (заключенная в фигурные скобки {}) — это делается для того, чтобы в старой версии не инициировать неявное пересечение. Зачем нужен VBA в Excel 2021? С помощью макросов VBA в программе Microsoft Excel можно автоматизировать ежедневную рутинную работу — ведь действия, доступные пользователю на ее рабочем листе, составляют 10% от всех возможностей приложения. Кроме того, VBA объединяет (интегрирует) приложения Microsoft Office, позволяет, не выходя из Excel, управлять работой других приложений и внедрять в Excel объекты из других программ пакета.
22 Введение Приведем основные возможности VBA в Excel 2021:  автоматизированный доступ к рабочему листу, диапазону данных, ячейке;  защита VBA-кода, защита информации на уровне: рабочей книги, рабочего листа, ячейки с данными. Возможность установки защиты с различными параметрами;  работа с циклами и управление потоками данных;  работа с формулами с помощью стиля ссылок R1C1;  работа с массивами данных, в том числе с динамическими;  переход от простых массивов чисел и диапазонов к динамическим массивам;  работа с функциями рабочего листа Excel, в том числе с функциями динамических массивов;  создание имен в VBA и управление ими;  доступ к встроенным функциям VBA и создание собственных функций;  обработка событий;  создание классов и коллекций;  автоматизация при помощи элементов управления формы и ActiveX;  создание пользовательских форм;  использование VBA для анализа данных и расширенной фильтрации;  работа со сводными таблицами;  создание графиков и диаграмм;  визуализация данных, дополнительное форматирование и создание собственных элементов инфографики;  работа со спарклайнами;  считывание информации из Интернета и выкладывание информации в Интернет;  обработка текстовых файлов;  интеграция с другими приложениями Microsoft Office;  запросы данных из популярных баз данных;  многопользовательский доступ к данным;  работа с интерфейсом Windows API;  обработка ошибок различного рода;  создание надстроек, собственных команд меню, настройка ленты. Объектно-ориентированное программирование Общие положения Объектно-ориентированное программирование (ООП) вобрало в себя все лучшие идеи структурного программирования, объединив их с рядом новых понятий. В са-
Введение 23 мом общем виде программа может быть организована одним из двух способов: вокруг кода (т. е. того, что фактически исполняется) или вокруг данных (т. е. того, что подвергается воздействию). Программы, созданные только методами структурного программирования, как правило, организованы вокруг кода. Такой подход можно рассматривать как «код, воздействующий на данные». Объектно-ориентированные программы организованы вокруг данных исходя из принципа: «данные управляют доступом к коду». В объектно-ориентированном языке программирования определяются данные и код, которому разрешается воздействовать на эти данные. Следовательно, тип данных точно определяет операции, которые могут быть выполнены над данными. Все объектно-ориентированные языки программирования обладают тремя общими свойствами: инкапсуляцией, полиморфизмом и наследованием:  инкапсуляция — это механизм программирования, объединяющий вместе код и данные, которыми он манипулирует, исключая как вмешательство извне, так и неправильное использование данных. В объектно-ориентированном языке данные и код могут быть объединены как бы в совершенно автономный «черный ящик». Внутри такого ящика находятся все необходимые данные и код. Когда код и данные связываются вместе подобным образом, создается объект. Иными словами, объект — это элемент, поддерживающий инкапсуляцию;  полиморфизм — это свойство, позволяющее одному интерфейсу получить доступ к общему классу действий. Полиморфизм помогает упростить программу, позволяя использовать один и тот же интерфейс для описания общего класса действий. Выбрать конкретное действие (т. е. метод) в каждом отдельном случае — это задача компилятора;  наследование представляет собой процесс, в ходе которого один объект приобретает свойства другого объекта. Это обеспечивает принцип иерархической классификации. Если пользоваться иерархиями, то для каждого объекта пришлось бы явно определять все его свойства. А если воспользоваться наследованием, то достаточно определить лишь те свойства объекта, которые делают его особенным в классе. Объект может также наследовать общие свойства своего родителя. Следовательно, благодаря механизму наследования, один объект становится отдельным экземпляром более общего класса. Таким образом, ООП — это совокупность принципов разработки программ, понятий и элементов языка, позволяющих успешно создавать программы большого объема. ООП базируется на связи в единое целое свойств и поведения предмета или процесса. Свойства объекта — это данные, которые его характеризуют. Поведение задается функциями. В программу Microsoft Excel 2021 встроены два языка программирования макросов: XLM и VBA. Изначально был создан язык XLM, но к настоящему моменту он устарел и полностью заменен на VBA. Тем не менее в Microsoft Excel 2021 можно запускать большинство XLM-макросов, а также создавать макросы этого типа. Но при этом невозможно записывать XLM-макросы. Поэтому для создания макросов следует использовать VBA.
24 Введение Редактор VBA представляет вам окно, в котором осуществляется работа с кодом VBA. Это окно организовано на традиционном интерфейсе, предусматривающем использование меню и панелей инструментов. Объект Объект — это парадигма, основное понятие объектно-ориентированного программирования, означающее инкапсуляцию данных вместе с кодом, предназначенным для их обработки, т. е. объединение данных и кода в нечто целое, именуемое объектом. Существует несколько определений объекта:  объект — это данные плюс функции;  объект — это инкапсулированная абстракция с четким протоколом доступа;  объект — это совокупность переменных состояния и связанных с ними методов;  объект — это сущность в адресном пространстве вычислительной системы, по- являющаяся при создании экземпляров класса;  объект — это характеристика, назначенная элементу класса. Объектная модель Microsoft Excel 2021 Объектная модель Microsoft Excel 2021 содержит свыше 280 объектов — полный их список приведен в PDF-файле Введение\Объектная модель Microsoft Excel 2021 сопровождающего книгу электронного архива. Э ЛЕКТРОННЫЙ АРХИВ Книгу сопровождает электронный архив, содержащий тексты всех сохраненных листингов, которые мы будем разрабатывать в процессе ее изучения, а также дополнительные вспомогательные материалы (см. приложение 3). Скачать электронный архив с сервера издательства «БХВ» можно по ссылке https:// zip.bhv.ru/9785977518925.zip, а также со страницы книги на сайте https://bhv.ru/. Объектная модель VBA Объектная модель Microsoft Excel представляет собой иерархию объектов, подчиненных одному объекту — Application (само приложение Excel). Объектов в VBA много (более 100), самые главные из них: Application, Workbook (Рабочая книга, т. е. ваш файл), Worksheet (Рабочий лист), WorksheetFunction (Функция рабочего листа). Есть и другие, например Range (Диапазон), Chart (Диаграмма), Cell (Ячейка), Row (Строка), Column (Столбец), Style (Стиль), Border (Границы), Interior (Цвет фона), Font (Шрифт), Shapes (Фигуры), а также Phonetic, Phonetics, TextEffectFormat,
Введение 25 TickLabels, AxisTitle, ChartTitle, DataLabel, DataLabels, DisplayUnitLabel, Style, TextFrame. Многие объекты собраны в библиотеку объектов Microsoft Excel, но некоторые — например, Assistant, входят в библиотеку Microsoft Office, общую для всех офисных приложений. На рис. В12 показаны основные компоненты объектной модели Microsoft Excel. Рис. В12. Иерархия основных объектов объектной модели Microsoft Excel Объект Application Объект Application — это главный (корневой) объект Microsoft Excel, представляющий само приложение Microsoft Excel. Объект Application имеет очень много свойств, и чтобы понять, сколько потребуется времени, если писать программы со всеми объектами, со всеми свойствами, методами, событиями, вы можете ознакомиться с полным их списком, содержащемся в PDF-файле Введение\Свойства объекта Application, сопровождающего книгу электронного архива (см. приложение 3). Точно так же с перечнем объектов объектной модели Microsoft Excel можно ознакомиться в PDF-файле Введение\Объектная модель Microsoft Excel 2021, со списком методов объекта Application — в PDF-файле Введение\Методы объекта Application, а со списком событий, управляющих объектом Application, — в PDF-файле Введение\ События объекта Application сопровождающего книгу электронного архива (см. приложение 3).
26 Введение Итак, приведем основные объекты VBA в порядке иерархии:  Application (само приложение Excel); • Workbook (Рабочая книга — ваш файл);  Worksheet (Рабочий лист);  Range (Диапазон);  Chart (Диаграмма);  Character (Символ);  Style (Стиль); • Border (Граница); • Interior (Цвет фона); • Font (Шрифт); • WorksheetFunction (Функция рабочего листа). Множество некоторых объектов составляют семейства: Workbooks, Worksheets, Charts. Классы Класс — это одно из важнейших понятий ООП. Класс представляет собой разновидность абстрактного типа данных в ООП, характеризующийся способом своего построения. Класс описывает свойства и методы, которые будут доступны объекту, построенному по описанию, заложенному в класс. Понятие «класс» подразумевает некоторое поведение и способ представления. Объект — это экземпляр класса. Класс обычно описывается как проект, на основе которого впоследствии создается конкретный объект. Класс определяет имя объекта, его свойства и действия, над ним выполняемые. В ООП классом называется определенный пользователем тип данных, который обладает внутренними данными и методами для работы с ними в форме процедур и функций. Свойства Объекты обладают свойствами (действиями над объектами). Свойства характеризуют отличительные черты объектов — они сформированы для объектов. Например, свойство «Форматирование ячейки» следует искать для объекта «Ячейка». Свойство (property) — это атрибут объекта, определяющий его характеристики, такие как надпись, размер, отступы, цвет заднего и переднего фона, положение на
Введение 27 экране, гарнитура шрифта надписей, доступность, видимость и многие другие. При изменении значений свойств меняются характеристики объекта. Синтаксис задания значений свойства: Объект.Свойство = Значение_свойства Приведем конкретный пример: Cells(3, 5).Value = 0 Здесь для объекта Cells(3, 5) (ячейка C5) устанавливается значение 0 при помощи свойства Value. Методы Объекты обладают методами (действиями самих объектов). Метод (method) — это действия, выполняемые над объектом, уведомления, получаемые или передаваемые объектом другим объектам или приложениям. Когда речь идет о методе, то решается вопрос о выборе объекта. Основные методы объекта Workbook (Рабочая книга) приведены в табл. В1, основные методы для листа книги — в табл. В2, а основные методы для работы с диапазоном ячеек — в табл. В3. Таблица В1. Методы для рабочей книги Excel (объект Workbook) Название метода Назначение метода Activate Активировать первое окно, ассоциируемое с рабочей книгой Close Закрыть книгу PrintOut Печатать книгу Save Сохранить изменения в текущем файле SaveAs Сохранить изменения книги в другом файле Таблица В2. Методы для листа рабочей книги Excel (объект Worksheet) Название метода Назначение метода Activate Сделать текущий лист книги активным листом Copy Копировать рабочий лист Delete Удалить рабочий лист Move Переместить рабочий лист PrintOut Напечатать рабочий лист Protect/Unprotect Защитить лист от изменений/снять защиту рабочего листа Select Выбрать рабочий лист
28 Введение Таблица В3. Методы для работы с диапазоном ячеек (объект Range) Название метода Назначение метода Activate Активировать одну ячейку в текущем выделении AddComment Добавить комментарий к диапазону (ячейке) ClearComments Удалить все комментарии к ячейкам заданного диапазона AutoFill Выполнить автозаливку ячеек заданного диапазона AutoFilter Отфильтровать список автофильтром BorderAround Задать обрамляющие границы диапазона Clear Удалить формулы и форматирование в ячейках ClearContents Очистить формулы, оставить форматирование ClearFormats Очистить форматирование Copy Копировать в заданный диапазон либо в буфер обмена CopyPicture Копировать объект в буфер обмена в виде рисунка Delete Удалить (можно со сдвигом) Find Найти указанную информацию FindNext Найти следующее FindPrevious Найти предыдущее FunctionWizard Запустить мастер функций для верхней левой ячейки Insert Вставить PasteSpecial Специальная вставка Replace Заменить Select Выбрать ячейку или диапазон ячеек Show Отобразить диапазон из одной ячейки События Событие (event) — это распознаваемое объектом действие, для которого можно запрограммировать отклик. События бывают разные: это и открытие, и сохранение, и закрытие проекта. Это и щелчок левой или правой кнопкой мыши, удержание нажатия кнопки и перетаскивание курсора и т. д. События могут быть инициированы как пользователями компьютера или его программой, так и операционной системой. Событие рассматривается с двух сторон: как действие и как отклик на это действие. В этом и состоит суть программирования на VBA. Например, при щелчке на кнопке выполняется код процедуры, созданной программистом. Если программа не написана или написана с ошибками, то не будет и отклика на событие. Специальный
Введение 29 вид процедур, генерирующих отклик на событие, называется процедурами обработки событий. Можно сказать, что программирование на 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;
32 Глава 1  специальные символы: + - * / \ ' " . , = > < [ ] ( ) : { } & @ % $ ! ;  разделители: пробел, символ продолжения строки (_), символ табуляции, сим- вол новой строки. Из символов алфавита конструируются все структуры языка, в том числе составные символы (<=, <>, >=), ключевые слова (Dim, As, Binary и т. п.), а также имена констант, переменных, процедур, функций и т. п. Заглавные и строчные буквы в записи имен VBA не различаются. Транслятор запоминает формат первой записи идентификатора в программе, и при повторном использовании идентификатора в тексте программы он автоматически преобразуется к первоначальному формату. Типы данных в VBA Тип данных программного элемента определяет данные, которые могут содержаться в нем, и способы их хранения. Типы данных применяются ко всем значениям, которые могут храниться в памяти компьютера или участвовать в вычислении выражения. Каждая переменная, литерал, константа, перечисление, свойство, параметр процедуры, аргумент процедуры и возвращаемое значение процедуры имеют тип данных. Переменные подразделяются на простые и индексированные (переменные с индексом). Индексированными переменными являются элементы массивов. Все подробности о массивах будут рассмотрены позднее. Все слова, задействованные в конструкциях языка, являются зарезервированными словами и не могут применяться для других целей. В языке программирования Visual Basic версии для Microsoft Excel 2021 определены различные типы данных (табл. 1.1), используемые как напрямую, так и в универсальных типах данных (например, Decimal в Variant): Boolean, Byte, Currency, Date, Double, Decimal, Integer, Long\LongLong, LongPtr, Object, Single, String, Variant, а также типы данных, определяемые пользователем так же, как некоторые типы объектов. Таблица 1.1. Типы данных, используемые в программах на Visual Basic для Excel 2021 Тип Занимаемый объем памяти Boolean 2 байта Логическая величина, имеющая значения True (Истина) или False (Ложь) Byte 1 байт Целое число без знака в диапазоне от 0 до 255 Currency (денежный) 8 байтов Число с фиксированной десятичной точкой от –922 337 203 685 477,5808 до 922 337 203 685 477,5807 Диапазон значений
Основные понятия VBA 33 Таблица 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 байта число Long) Целое число от –2 147 483 648 до 2 147 483 647 LongLong (целое число LongLong) 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 символов; на строки; б) фиксированной длины — до 64K (216) символов б) длина строки Variant а) строковое значение: 22 байта + длина строки; Тип данных, определяемый по умолчанию для переменных, не объявленных явно: б) числовое значение: 16 байтов б) диапазон как для типа String переменной длины Type В зависимости от числа элементов а) любое числовое значение до диапазона типа Double; Тип данных, определяемый пользователем. Диапазон каждого элемента совпадает с диапазоном его типа данных В экспоненциальном представлении символ E обозначает основание степени 10. Поэтому 3,56E+2 означает 3,56·102, или 356, а 3,56E–2 означает 3,56/102, или 0,0356.
34 Глава 1 Константы и переменные, переменные объектов В VBA для хранения значений предусмотрены просто переменные, переменные объектов и константы.  Константа — именованная область памяти, используемая для хранения фикси- рованного значения, не изменяемого при выполнении программы.  Переменная — именованная область памяти, используемая для хранения значе- ния, которое можно изменить при выполнении программы.  Переменная объектов — именованная область памяти, используемая для хране- ния любого объекта, используемого в Microsoft Excel (ячейка, диапазон ячеек, рабочий лист и т. д.), над которым выполняются действия при работе программы. Переменные объектов используются для ускорения работы программы и более наглядного кода. Область действия переменных и констант Область действия переменных и констант определяется с помощью ключевых слов Private, Public и Static.  Private — определяет область действия в пределах конкретного модуля про- граммы. После завершения выполнения модуля память, отведенная под эти переменные, освобождается. Переменные и константы, объявленные как Private, сохраняют свои значения только во время выполнения блока кода, в котором они определены.  Public — область действия в пределах приложения. Переменные и константы, объявленные как Public, сохраняют свои значения до конца выполнения программы.  Static — область действия в пределах конкретного модуля и внешних процедур, задействованных в этом модуле. После завершения выполнения модуля значения этих переменных сохраняются между вызовами процедур и могут быть использованы при повторном выполнении модуля. Переменные и константы, объявленные без ключевых слов Public, Private, Static, сохраняют свое значение согласно месту их объявления (описания). Переменные и константы в зависимости от области действия подразделяются на глобальные и локальные.  Если переменная или константа объявлена внутри процедуры, то она является локальной, т. е. она определена и доступна только в пределах этой процедуры.  Если переменная или константа объявлена вне процедуры, то она будет глобаль- ной. Такая переменная или константа может быть доступна в нескольких процедурах.
Основные понятия VBA 35 Объявление констант и переменных В 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 2021 — самую мощную электронную таблицу, разработанную для использования в среде Windows. Вид окна запуска представлен на рис. 1.1, а. Для того чтобы выполнить вход в свою учетную запись, требуется соединение с Интернетом. На рис. 1.1, б показан удобный ленточный
36 Глава 1 а б Рис. 1.1. Начало работы в Microsoft Excel 2021: а — запуск программы; б — расположение окон при запуске нескольких файлов Excel 2021 в неполноэкранном режиме
Основные понятия VBA 37 интерфейс расположения окон файлов, открытых в Microsoft Excel 2021. Окно верхнего уровня теперь привязано непосредственно к одной книге или представлению книги. Откройте знакомую вам книгу или создайте пустую книгу. Вы попадете в привычный мир столбцов, строк и ячеек (рис. 1.2, а). При наличии соединения с Интерне- а б Рис. 1.2. Интерфейс программы Microsoft Excel 2021
38 Глава 1 том открываются дополнительные возможности по работе с программой — так, при вводе запроса в строку поиска, расположенную в строке заголовка, в программе в окне справки сразу будут представлены результаты ссылок на справочную информацию, находящуюся на внешних источниках (рис. 1.2, б), — например, на сайте поддержки: https://support.microsoft.com. Если же вы всерьез решили заниматься программированием в среде VBA, то вызовите на ленту вкладку Разработчик. Обычно при начальном запуске программы Microsoft Excel 2021 этой вкладки на ленте нет, и ее включение в ленту необходимо организовать следующим образом: 1. Для вызова диалогового окна Параметры Excel нажмите правой кнопкой мыши в любой области ленты с командами и в появившемся контекстном меню выберите команду Настройка ленты... 2. В диалоговом окне Параметры Excel выберите раздел Настроить ленту и активизируйте вкладку Разработчик (рис. 1.3) — установите соответствующий флажок, а затем нажмите кнопку OK в правом нижнем углу окна. Теперь эта вкладка всегда будет на экране. Рис. 1.3. Диалоговое окно Параметры Excel: раздел Настроить ленту
Основные понятия VBA 39 Настройка безопасности Настройка безопасности при работе с VBA в программе Microsoft Excel 2021 весьма важна. 1. Активизируйте на ленте вкладку Разработчик (рис. 1.4). Безопасность макро2. В группе команд Код нажмите кнопку со значком сов — откроется диалоговое окно Центр управления безопасностью (рис. 1.5). Рис. 1.4. Лента Excel с активной вкладкой Разработчик Рис. 1.5. Диалоговое окно Центр управления безопасностью В этом диалоговом окне в разделе Параметры макросов указаны опции для макросов, находящихся в документе не из надежного расположения (4 уровня безопасности):  Отключить макросы VBA без уведомления;  Отключить все макросы VBA с уведомлением;  Отключить все макросы VBA, кроме макросов с цифровой подписью;  Включить все макросы VBA (не рекомендуется, возможен запуск опасной программы).
40 Глава 1 По умолчанию выбран первый вариант. Если файл сохранен с поддержкой макросов, выберите второй вариант. Если в файле содержатся только макросы и нет другого активного содержимого, то в этом случае на экране под лентой появится предупреждение системы безопасности (рис. 1.6, а), предлагающее включить отключенное содержимое, если в этом есть необходимость. Если же в файле имеется и другое содержимое (типа элементов ActiveX), то предупреждающее сообщение выглядит несколько иначе (рис. 1.6, б). а б Рис. 1.6. Предупреждения системы безопасности В диалоговом окне Центр управления безопасностью в разделе Параметры макросов есть еще раздел Параметры макросов для разработчика, в котором можно включить или отключить флажок Доверять доступ к объектной модели проектов VBA. Для того чтобы получить свою цифровую подпись (для приобретения коммерческого сертификата), необходимо обратиться к соответствующим коммерческим организациям. Раздел Центр управления безопасностью также, кроме прочих, имеется и в диалоговом окне Параметры Excel (рис. 1.7). С помощью опций этого раздела можно решить вопросы обеспечения безопасности документа, а также защиты и работоспособности компьютера. Рис. 1.7. Диалоговое окно Параметры Excel: раздел Центр управления безопасностью
Основные понятия VBA 41 Запись макроса Что же такое макрос? Самый простой ответ — это запись некоторых команд, т. е. небольшая программа, которая выполняется при ее вызове или нажатии соответствующего ей значка. Иными словами, макрос — программный алгоритм действий, записанный пользователем. Программа Microsoft Excel позволяет записывать макросы. В буквальном смысле слова, как при работе с магнитофоном: нажали кнопку Запись и говорите в микрофон, произносите речь — она записывается. Нажали кнопку Стоп — запись прекратилась. А теперь можете слушать свою запись сколько угодно раз. Аналогично в программе Microsoft Excel к записанному макросу можно обращаться неоднократно. Все ваши действия при записи макроса запишутся в виде последовательности команд, а по завершении записи ее можно будет просмотреть в модуле. Имя макроса Имя (идентификатор) константы или переменной — это произвольная последовательность символов, начинающаяся с буквы и удовлетворяющая следующим правилам:  в составе имени нельзя использовать символы: . (точка), !, @, &, $, # , пробел;  в качестве имен переменных и констант недопустимы ключевые (зарезервиро- ванные) слова, входящие в конструкции языка VBA;  длина имени не может быть более 255 символов;  имя нельзя повторно объявлять в пределах области его видимости (действия);  в имени может присутствовать символ подчеркивания;  в конце имени можно указать один из символов объявления типа (табл. 1.2). Включение такого символа в имя заменяет в тексте программы запись оператора объявления типа. Таблица 1.2. Символы, определяющие тип переменных Тип данных Символ объявления типа Integer % Long & Single ! Double # Currency @ String $
42 Глава 1 Разработка проекта Начнем знакомиться со средствами визуализации разработки проектов в VBA. 1. Запустите программу Microsoft Excel 2021. 2. Сохраните вновь созданную книгу с поддержкой макросов под именем Старт.xlsm. Для этого необходимо выполнить команду Файл | Сохранить как и в раскрывающемся списке Тип файла диалогового окна Сохранение документа выбрать вариант сохранения файла: Книга Excel с поддержкой макросов (рис. 1.8). 3. Перейдите в среду VBA, нажав в группе команд Код вкладки ленты Разработ— на экране откроется окно интегрированной сречик кнопку Visual Basic ды разработки приложений: Microsoft Visual Basic for Applications - Название книги - Активный компонент. Можно для этого воспользоваться и клавиатурным сокращением, нажав комбинацию клавиш <Alt>+<F11>. П РИМЕЧАНИЕ Самый быстрый переход в среду VBA — нажатие комбинации клавиш <Alt>+<F11>. Рис. 1.8. Выбор варианта сохранения книги
Основные понятия VBA 43 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: а — режим обозревателя объектов
44 Глава 1 б Рис. 1.9. (Часть 2 из 2) Редактор VBA: б — режим окна кода Кроме того, здесь можно увидеть иерархически построенную систему объектов. Эти объекты составляют как собственно Microsoft Excel, так и задают методы и свойства. Окно проекта Project - VBAProject показывает структуру проекта (файла). Это окно активизируется в редакторе VBA выбором команды View | Project Explorer, , или нажатием комбинации клавиш <Ctrl>+<R>. или кнопкой Project Explorer Окно кода предназначено для хранения кода, связанного с объектом. У каждого объекта есть свой код, расположенный в окне кода. Так, каждый рабочий лист Worksheet (Лист1) имеет свой код, и рабочая книга Workbook (ЭтаКнига) — свой код. Если что-то не ясно, всегда можно воспользоваться справкой в меню Help или как непосредственно в программе, так и в режиме онлайн. кнопкой Создание модуля Макросы или пользовательские функции создаются в виде модулей. Вообще, модуль — это часть программы, оформленная в виде, допускающем ее независимую трансляцию. Модуль добавляется к проекту (рис. 1.10) с помощью команды Insert | Module (Вставить | Модуль), и в окне проекта он отобразится на уровне вашего приложения.
Основные понятия VBA 45 Рис. 1.10. Выбор команды Insert | Module из меню Создание модуля с помощью контекстно-зависимого меню Создать модуль можно и с помощью команды Insert | Module (Вставить | Модуль), выбрав ее из контекстно-зависимого меню, появляющегося при щелчке правой кнопкой мыши на объекте ЭтаКнига в окне проекта Project - VBAProject (рис. 1.11). Рис. 1.11. Выбор команды Insert | Module из контекстно-зависимого меню Окно кода Как только модуль создан, открывается окно кода модуля (рис. 1.12). Для того чтобы посмотреть в этом окне свойства модуля или рабочего листа, следует нажать клавишу <F4>. На рис. 1.12, кроме того, можно увидеть иерархическое строение объектов в окне проекта Project - VBAProject и окно свойств объекта Properties - Module1.
46 Глава 1 Рис. 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 (Требовать объявление переменных).
Основные понятия VBA 47 Первая процедура Процедура — это минимальная семантически законченная программная конструкция, допускающая выполнение. Просто так операторы не выполняются и не пишутся, они находятся в описании процедур и функций. Функция отличается от процедуры тем, что, помимо выполнения операторов, она возвращает некоторое значение. 1. Запустите программу Microsoft Excel 2021. 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 байта памяти, что по-
48 Глава 1 зволяло работать в 65 536 строках. Начиная с версии Excel 2007, на нумерацию столбцов выделяется 2 байта памяти, а на нумерацию строк — 4 байта памяти. Однако в связи с трудностью отображения такого количества столбцов и строк номера ячеек меняются от А1 до XFD1048576, что существенно больше, чем прежде. По умолчанию стандартная таблица Excel 2021, как и версия Excel 2010, содержит 16 384 столбца, обозначенных сочетаниями букв латинского алфавита, начиная с A и заканчивая XFD, и 1 048 576 строк (более миллиона!), пронумерованных подряд. 6. В группе Type (Тип) выберите переключатель, определяющий тип создаваемой процедуры: • тип Sub (Подпрограмма) пригоден для создания процедур, выполняющих какие-либо действия и не передающих в основную программу числовые значения; • тип Function (Функция) служит для определения подпрограмм, результатом выполнения которых является одно числовое или логическое значение, возвращаемое в основную программу через имя функции. П РИМЕЧАНИЕ Сокращение Sub выбрано из названия Subroutine, что в переводе с английского означает «подпрограмма». В нашем примере мы выбираем переключатель типа Sub (Подпрограмма). 7. В поле Scope (Область видимости) выберите переключатель Public (Общедоступный), обеспечивая тем самым доступность функции пользователя из любых других книг Excel. Переключатель Private (Локальный) задает для процедуры ограниченную область видимости — только модуль, в котором она описана. В этом случае ее могут вызывать лишь процедуры того же модуля. Переключатель Public, наоборот, объявляет процедуру доступной для всех модулей проекта. По умолчанию процедура общедоступна, т. е. имеет статус Public. 8. После нажатия в диалоговом окне кнопки OK в поле редактора (после оператора Option Explicit) будут внесены две строки-заготовки процедуры, и она станет выглядеть так: Public Sub Первая_процедура() End Sub Объявление переменной в VBA Во многих языках программирования все используемые переменные должны быть объявлены. Для явного объявления переменной в VBA служит оператор Dim (от англ. Dimension — измерение, размеры, величина, объем). Назначение оператора Dim — объявить переменную, т. е. задать ее имя и ее тип. Синтаксис оператора Dim: Dim Имя1 [As типДанных] [,..., ИмяN [As типДанных]]
Основные понятия VBA 49 Здесь:  Dim, As — ключевые слова VBA;  Имя — имя объявляемой переменной;  типДанных — одно из ключевых слов (названий типов): Integer, Single и т. д. В этой записи прямоугольные скобки [] служат для обрамления конструкций, которые могут отсутствовать. Примеры:  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>. на выполнение можно также кнопкой  Если макрос запускается, когда курсор стоит в управляющей его процедуре, то он выполняется автоматически.
50 Глава 1  Если макрос запускается, когда курсор стоит не в его управляющей процедуре, а в другом месте, то после запуска макроса открывается окно Macros (Макрос), показанное на рис. 1.14, в котором можно выбрать макрос по его имени Macro Name (Имя макроса). Рис. 1.14. Диалоговое окно Macros Посмотреть результат выполнения оператора Debug.Print (печать результатов отладки) можно в окне немедленного исполнения команд Immediate (Окно отладки), вызываемом командой View | Immediate Window (Вид | Окно отладки). Это окно также можно вызвать, нажав комбинацию клавиш <Ctrl>+<G> (рис. 1.15). Закрыть это окно элементарно — следует просто щелкнуть на кнопке закрытия окна. Сохраните вновь созданную книгу с поддержкой макросов под именем Листинг_1.1_ Для этого выберите команду Файл | Сохранить как и в раскрывающемся списке Тип файла диалогового окна Сохранение документа укажите вариант сохранения файла: Книга Excel с поддержкой макросов. Для того чтобы открыть диалоговое окно Сохранение документа непосредственно в редакторе VBA, без переключения на рабочий лист, нажмите кнопку Save (Сохранить) . Первая_процедура.xlsm. Э ЛЕКТРОННЫЙ АРХИВ Практически все листинги, которые разрабатываются в процессе изучения материала книги, содержатся в сопровождающем книгу электронном архиве (см. приложение 3). Так, листинг 1.1 вы найдете в папке Глава_1_Основные_понятия_VBA этого архива. Напомним, что скачать электронный архив с сервера издательства можно по ссылке https://zip.bhv.ru/9785977518925.zip, а также со страницы книги на сайте https://bhv.ru/.
Основные понятия VBA 51 Рис. 1.15. Просмотр результатов в окне Immediate Автоматический ввод атрибутов команд Для корректного ввода атрибутов команд программа предлагает их всплывающий список, который появляется сразу после ввода точки (рис. 1.16, a). Для того чтобы а Рис. 1.16. (Часть 1 из 2) Список атрибутов команд во всплывающем списке: а — для Debug;
52 Глава 1 б Рис. 1.16. (Часть 2 из 2) Список атрибутов команд во всплывающем списке: б — для Application список появлялся, убедитесь, что в диалоговом окне Options (Параметры) вкладки Editor (Редактор), вызываемом в редакторе VBA по команде Tools | Options (Сервис | Параметры), установлен флажок Auto List Members (Автоматический список атрибутов). Посмотрите внимательно — каждая команда имеет свой список атрибутов. Например, если вы напишете команду Application (рис. 1.16, б), то всплывающий список атрибутов команды будет насчитывать более 100 наименований. Приведем некоторые из них: ActiveSheet, Build, Calculation, Cells, Columns, DisplayFullScreen, Interactive, Name, Windows и др. Структура кода процедуры Ранее уже был создан модуль, написана первая процедура, запущен макрос. Пришло время остановиться и сформулировать теоретические основы построения процедуры. В общем случае процедура имеет вид: Sub Имя_процедуры(Список_параметров) Инструкции End Sub  Список_параметров — это список параметров, от которых зависит процедура. Раз- делителем в списке параметров служит запятая. Список параметров может быть пуст.  Инструкции — это последовательность инструкций, составляющих тело процеду- ры, исполняемых при выполнении процедуры. Кроме обычных процедур, в VBA есть процедуры, обрабатывающие события, связанные с тем или иным объектом. В общем случае эти процедуры имеют вид: Sub Имя_объекта_имя_события(Список_параметров) Инструкции End Sub П РИМЕЧАНИЕ Не забудьте — имя процедуры не должно содержать пробелов.
Основные понятия VBA 53 Метод Worksheets.Activate 1. Создайте новый файл в программе Microsoft Excel 2021. По умолчанию он содержит только один лист — добавьте в книгу несколько листов. 2. Перейдите в среду VBA, выбрав на вкладке ленты Разработчик раздел Visual Basic. Откроется окно интегрированной среды разработки приложений 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 2021. 2. Перейдите в среду VBA, нажав комбинацию клавиш <Alt>+<F11>. 3. Добавьте к проекту модуль с помощью команды Insert | Module (Вставить | Модуль). Казалось бы, проще простого — в ячейке на рабочем листе написать: Hello, традиционно первое обращение программистов во всех программах. Но VBA предоставляет возможность сделать эту надпись, сначала выбрав активную ячейку ActiveCell и введя в нее запись ActiveCell.FormulaR1C1 = "Привет, мир!", а потом еще и в выбранной активной ячейке ActiveCell.Select задать начертание Selection.Font.Italic = True, цвет Selection.Font.Color = -869745 и World —
54 Глава 1 размер шрифта Selection.Font.Size = 80. Да еще предварить запись комментарием (листинг 1.3). П РИМЕЧАНИЕ Любой комментарий вводится после апострофа ('). Причем комментарий может быть как целой строкой, так и продолжением строки. Листинг 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. Пример введенного в ячейку отформатированного текста
Основные понятия VBA 55 Открытие книги с макросом Если книга Microsoft Excel 2021 сохранена с поддержкой макросов и ее необходимо открыть, то Microsoft Excel 2021 сразу под лентой выдаст полосу сообщения, в которой говорится о том, что запуск макросов отключен (см. рис. 1.6, а). Но там имеется кнопка Включить содержимое, посредством которой и включаются макросы. Если вы не воспользуетесь этой кнопкой, но все же запустите макрос, то появится сообщение о том, что макрос в вашем проекте выключен (рис. 1.18). Рис. 1.18. Пример сообщения об отключенном макросе Если в полосе предупредительного сообщения, показанной на рис. 1.6, а, нажать на предложении Запуск макросов отключен, то на вкладке Сведения (рис. 1.19, а) появится предупреждение системы безопасности. При выборе из списка предупреждающей кнопки Включить содержимое элемента Дополнительные параметры (рис. 1.19, б) откроется отдельное диалоговое окно с возможностью подключить макросы (рис. 1.19, в). а Рис. 1.19. (Часть 1 из 2) Сообщения системы безопасности: а — на вкладке Сведения
56 Глава 1 б в Рис. 1.19. (Часть 2 из 2) Сообщения системы безопасности: б — список предупреждающей кнопки Включить содержимое; в — оповещение системы безопасности Обратите внимание, что если вы в этот же день (не выключая компьютер) повторно откроете файл, в котором были включены макросы с предварительным отключением, то указанные вопросы задаваться не будут и макросы окажутся включены. Ввод данных Для автоматизированного ввода данных в ячейки создадим макрос, заполняющий одинаковыми значениями диапазон ячеек на рабочем листе (листинг 1.4). 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+ <F11>). Добавьте к проекту модуль: Insert | Module (Вставить | Модуль). Листинг 1.4. Пример создания макроса ввода данных Sub Ввод_данных() Range("A1:B5").Value = 200 End Sub
Основные понятия VBA 57 2. Для выполнения процедуры воспользуйтесь кнопкой — в десяти ячейках с А1 по В5 появится значение 200. 3. Так как в программе появилась поддержка динамических массивов, то заполнить аналогичный массив числом 200 можно при помощи функции ПОСЛЕД, задав в строке формул, например, ячейки D1 следующие параметры: =ПОСЛЕД(5;2;200;0). Что произойдет? Будет создан динамический массив размером 5 строк на 2 столбца (диапазон ячеек D1:E5), заполненный цифрами 200. При попытке вручную изменить значения массива может возникнуть ошибка #ПЕРЕНОС!. Это новая ситуация, появившаяся в Microsoft Excel 2021 и возникающая тогда, когда формула возвращает несколько результатов, а программа не может вернуть результаты в сетку. 4. Сохраните вновь созданную книгу с поддержкой макросов под именем Листинг_1.4_ Заполнение_ячеек.xlsm (Файл | Сохранить как). Оператор With 1. Продолжите работать с той же программой. 2. Добавьте к проекту модуль: Insert | Module (Вставить | Модуль). 3. Текст будет вводиться в ячейку C2, заданную в виде 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). 6. Сохраните измененную книгу с поддержкой макросов под именем Листинг_1.5_ Параметры_надписи.xlsm (Файл | Сохранить как).
58 Глава 1 Рис. 1.20. Пример введенного в область отформатированного текста Свойство Selection 1. Создайте новый файл Microsoft Excel 2021. На рабочем листе выделите диапазон смежных либо несмежных ячеек. 2. Перейдите в среду VBA (<Alt>+<F11>). Добавьте к проекту модуль: Insert | Module (Вставить | Модуль). — на рабочем листе 3. Создайте макрос (листинг 1.6) и запустите его кнопкой программы предварительно выделенная область и активная ячейка окрасятся заданным цветом: vbRed — красным, vbBlue — синим (рис. 1.21). Рис. 1.21. Действия с выделенной областью и выделенной ячейкой
Основные понятия VBA 59 Листинг 1.6. Пример изменения цвета выделенной области и выделенной ячейки Sub Цвет_выделенной_области() Selection.Interior.Color = vbRed ActiveCell.Interior.Color = vbBlue End Sub 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_1.6_Цвет_выделенной_области.xlsm. Свойство Orientation 1. Создайте новый файл Microsoft Excel 2021, добавьте к рабочему листу еще несколько. 2. Перейдите в среду VBA (<Alt>+<F11>). Добавьте к проекту модуль: Insert | Module (Вставить | Модуль). 3. В листинге 1.7 приведен код программы, содержащий операторы, выводящие текстовое значение в указанную ячейку. Для текста задан наклон при помощи свойства Orientation (рис. 1.22). Рис. 1.22. Печать текста под углом в 45 градусов Листинг 1.7. Пример создания вертикального текста Sub Наклон_текста() With ThisWorkbook.Worksheets(2).Range("A20") .Interior.Color = vbGreen .Value = "ВЕСНА" .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter
60 Глава 1 .Orientation = 45 .Font.Bold = True .Font.Italic = True .Font.Size = 16 .Font.Color = vbRed End With End Sub 4. Для выполнения процедуры воспользуйтесь кнопкой — надпись появится на рабочем листе Лист2 в ячейке A20. 5. Сохраните книгу с поддержкой макросов под именем Листинг_1.7_Наклон_ текста.xlsm. Объект Range 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+ <F11>). Добавьте к проекту модуль: Insert | Module (Вставить | Модуль). 2. Введите код из листинга 1.8. Это пример закрашивания сразу трех областей, задаваемых при помощи указания диапазона ячеек — для объектов Range указаны значения свойств Interior.Color (рис. 1.23). Рис. 1.23. Установка цветов для трех диапазонов ячеек 3. Выполните процедуру нажатием кнопки окрашены. — заданные диапазоны ячеек будут 4. Сохраните документ с поддержкой макросов под именем Листинг_1.8_ Закраска_ диапазона_ячеек.xlsm.
Основные понятия VBA 61 Листинг 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. На рабочем листе создайте командную кнопку (такая кнопка показана на рис. 1.23). Для этого в группе Элементы управления вкладки ленты Разработчик нажмите раскрывающуюся кнопку Вставить, в группе Элементы ActiveX (рис. 1.24) выберите инструмент управления Кнопка (элемент ActiveX), активизируйте его и в рабочем поле Microsoft Excel нарисуйте кнопку. Как только вы закончите рисование, в строке формул появится запись: =ВНЕДРИТЬ("Forms. CommandButton.1";""). П РИМЕЧАНИЕ Кнопка — элемент графики. Если при ее создании держать нажатой клавишу <Shift>, кнопка получится квадратной. Для привязки кнопки к сетке рабочего листа следует удерживать нажатой клавишу <Alt>. Посредством маркеров изменения можно задавать размеры кнопки, с помощью маркера перемещения — менять ее положение. 2. Щелкните на кнопке правой кнопкой мыши и в контекстно-зависимом меню найдите команду Просмотреть код (рис. 1.25). Выбор этой команды обеспечивает переход в окно редактора VBA и вывод в нем текста заготовки процедуры: Private Sub CommandButton1_Click() End Sub Рис. 1.24. Набор элементов управления Элементы ActiveX Рис. 1.25. Контекстно-зависимое меню внедренной кнопки
62 Глава 1 3. Между строками шаблона процедуры введите одну строку (листинг 1.9) — команду вызова Call и имя макроса, созданного в предыдущем примере (Закраска_ диапазона_ячеек). Листинг 1.9. Пример вызова макроса Private Sub CommandButton1_Click() Call Закраска_диапазона_ячеек End Sub 4. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение ВЫЗОВ МАКРОСА. 5. Выйдите из режима конструктора, нажав кнопку Режим конструктора , и щелкните на кнопке ВЫЗОВ МАКРОСА на рабочем листе — макрос выполнит одновременное закрашивание трех областей. Приятная неожиданность — вызвать макрос можно и без команды Call, просто написав: Private Sub CommandButton1_Click() Закраска_диапазона_ячеек End Sub 6. Сохраните книгу под тем же именем командой Файл | Сохранить. Свойство Offset 1. Создайте новый файл Microsoft Excel 2021. 2. Перейдите в среду VBA, нажав комбинацию клавиш <Alt>+<F11>. Добавьте к проекту модуль с помощью команды Insert | Module (Вставить | Модуль). Впишите в него процедуру (листинг 1.10). В этом листинге текст вводится в ячейки, полученные путем смещения относительно активной ячейки (она должна быть выделена). Если, например, активна ячейка A1, то слово Microsoft будет помещено в ячейку C1 после смещения относительно ячейки A1 на 0 строк вниз и на 2 столбца вправо, а Excel — в ячейку B4 после смещения на 3 строки вниз и на 1 столбец вправо. Затем сама активная ячейка меняет позицию и сдвигается до ячейки D4. 3. Для выполнения процедуры воспользуйтесь кнопкой . Листинг 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
Основные понятия VBA 63 4. Сохраните вновь созданный документ (Файл | Сохранить как) с поддержкой макросов под именем Листинг_1.10_Смещение.xlsm . Функция Environ Функция Environ используется для получения различной системной информации Windows в зависимости от введенного аргумента. В нашем случае конструкция Environ("username") возвращает строку, содержащую оперативную системную информацию об имени пользователя. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_1.11_Окно_сообщения.xlsm.
64 Глава 1 Функция MsgBox Уже в предыдущем макросе было создано диалоговое окно сообщения с помощью функции MsgBox. Внутри диалогового окна сообщения располагаются значок и кнопка, вид которых регулируется аргументом функции. 1. Создайте новый файл Microsoft Excel 2021 с несколькими рабочими листами, перейдите в среду 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 5. Сохраните документ под именем Листинг_1.12_Листинг_1.13_Процесс_опроса.xlsm.
Основные понятия VBA 65 Как можно видеть, функция 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. В функции MsgBox для аргумента Buttons имеется целый список констант для вывода знаков и кнопок в окне сообщения, некоторые из них приведены в табл. 1.3.
66 Глава 1 Таблица 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 2021, перейдите в среду VBA. 2. Добавьте к проекту модуль: Insert | Module (Вставить | Модуль). В листинге 1.14 приведен код программы, которая содержит длинное, затейливое сообщение MsgBox. Так как аргумент Promt состоит из нескольких строк, то для ввода специальных символов используется функция Chr с одной из констант — в нашем случае это знак табуляции Chr(9) и знак перевода строки Chr(10). В строке заголовка окна отображена надпись, задаваемая при помощи аргумента функции MsgBox, — Title (рис. 1.29). Обратите внимание, что в коде, приведенном далее, используется ввод знаков продолжения строки: здесь знаки вводятся после знака & — знака конкатенации строк. 3. Для выполнения процедуры воспользуйтесь кнопкой . 4. Сохраните документ под именем Листинг_1.14_Табулированное_сообщение.xlsm. Листинг 1.14. Пример использования отступов в сообщении с названием Sub Табулированное_сообщение() MsgBox "Дорогие читатели!" & Chr(10) & Chr(10) & _ "Это, пожалуй," & Chr(10) & _ "самое длинное сообщение " & Chr(10) & _ "в нашей книге." & Chr(10) & Chr(10) & _ "Желаем Вам успехов!" & Chr(10) & Chr(10) & _ Chr(9) & "Авторы, г. Санкт-Петербург", Title:="ВАЖНОЕ СООБЩЕНИЕ!" End Sub
Основные понятия VBA 67 Рис. 1.29. Пример сообщения с текстом из нескольких строк П РИМЕЧАНИЕ Текстовый амперсанд конкатенации (&) служит для объединения нескольких текстовых строк в одну строку, например: "Математическое "&"обеспечение". Диалоговое окно, создаваемое функцией InputBox Если в предыдущем примере появлялось окно сообщения, то здесь мы рассмотрим создание диалогового окна ввода информации при помощи функции VBA InputBox. 1. Создайте новый файл Microsoft Excel 2021, перейдите в среду VBA. 2. Добавьте к проекту модуль: Insert | Module (Вставить | Модуль). В коде для функции InputBox имеются обязательный аргумент Prompt — сообщение в диалоговом окне в виде строкового выражения и необязательный — 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 После запуска макроса открывается диалоговое окно InputBox. Если в него ввести дату рождения, то появится сообщение о том, сколько лет назад вы родились. 5. Сохраните документ под именем Листинг_1.15_Ввод_данных_в_диалоге.xlsm.
68 Глава 1 Переменная типа String Мы уже рассматривали ранее примеры с переменными типа Integer. А в листинге 1.15 впервые использовали переменную типа String. Рассмотрим еще один пример с переменной типа String. Более подробную информацию о типах данных см. в табл. 1.1. Переменная типа String (строка) — это структурированный тип данных, представляющих собой последовательность строковых символов. Последовательность символов, присваиваемых строковой переменной, следует взять в кавычки. Строковая переменная может быть объявлена строкой как переменной, так и постоянной длины. 1. Создайте новый файл в программе Microsoft Excel 2021, перейдите в среду 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 Window (Вид | Окно отладки). Это окно (см. рис. 1.7) также можно вызвать, нажав комбинацию клавиш <Ctrl>+<G>. 4. Сохраните документ под именем Листинг_1.16_ Строковая_переменная.xlsm. Переменная типа Long Продолжите работать с той же программой, создайте в ней новый модуль. В листинге 1.17 приведен пример программы, работающей с типом данных Long, служащим для хранения длинного целого числа. Переменная I задана при помощи оператора Dim. Листинг 1.17. Пример программы с переменной типа Long Public Sub Переменная_типа_Long() Dim I As Long I = I + 2147483647 MsgBox I End Sub
Основные понятия VBA 69 В результате работы программы появляется сообщение с максимальным значением числа для заданной переменной: 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, таким образом, что рабочий лист не может быть изменен. 1. Создайте новый файл Microsoft Excel 2021, перейдите в среду VBA. 2. Добавьте к проекту модуль: Insert | Module (Вставить | Модуль). Листинг 1.19. Защита рабочего листа от изменений методом Protect Sub Защитить_рабочий_лист() Dim ws As Worksheet
70 Глава 1 For Each ws In Worksheets ws.Protect Next ws End Sub 3. Для выполнения процедуры воспользуйтесь кнопкой . Если выполнить макрос, а потом в ячейках на листе рабочей книги попытаться начать вводить информацию, то сделать это будет нельзя — появится предупреждение (рис. 1.30, а). Для того чтобы снять эту защиту, необходимо нажать кнопку Снять защиту листа, расположенную на вкладке Рецензирование (рис. 1.30, б). 4. Сохраните документ под именем Листинг_1.19_Листинг_1.20_Защита_листа.xlsm. Метод Unprotect служит для удаления защиты с защищенного листа (листинг 1.20). а б Рис. 1.30. Работа с защищенными данными:а — предупреждение о защите листа; б — кнопка Снять защиту листа
Основные понятия VBA 71 Листинг 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 2021. 2. Введите в ячейку А1 текст: Запуск макроса: <Ctrl>+<Shift>+<A>. 3. Создайте макрос, отображающий окно сообщения с надписью "Привет, мир!", при этом запуск макроса на рабочем листе Microsoft Excel мы осуществим с помощью комбинации клавиш <Ctrl>+<Shift>+<A>. Для этого в группе Код вкладки Разработчик нажмите кнопку Макросы (рис. 1.31, а) — откроется диалоговое окно Макрос. 4. В диалоговом окне Макрос задайте имя макроса: МОЙ_МАКРОС, нажмите кнопку Создать. Произойдет автоматический переход в среду VBA, в окне кода курсор будет находиться уже в автоматически созданном коде: Sub МОЙ_МАКРОС() ... End Sub Обратите внимание, что макрос создан в отдельном модуле. Вам осталось только вписать между строк: MsgBox "Привет, мир!", что означает появление текстового сообщения в мини-окне (листинг 1.21). Листинг 1.21. Пример кода макроса, запуск которого будет осуществляться при помощи нажатия клавиш в Microsoft Excel Sub МОЙ_МАКРОС() MsgBox "Привет, мир!" End Sub
72 Глава 1 а б в г Рис. 1.31. Запуск макроса по нажатию клавиш: а — кнопка создания макроса; б — диалоговое окно Макрос; в — диалоговое окно Параметры макроса; г — результат нажатия клавиатурного сокращения в Microsoft Excel
Основные понятия VBA 73 5. Теперь настроим параметры макроса. Перейдите обратно на рабочий лист из реView Microsoft Excel (Alt + F11) (Перейти дактора VBA, нажмите кнопку в 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, а) выберите команду Remove (с названием модуля — в нашем случае Модуль_2). В открывшемся окне сообщения будет предложено экспортировать модуль в отдельный файл перед тем, как удалить модуль (рис. 1.32, б). Если вы не хотите это делать, нажмите кнопку Нет. а Рис. 1.32. (Часть 1 из 2) Удаление модуля: а — команда Remove
74 Глава 1 б Рис. 1.32. (Часть 2 из 2) Удаление модуля: б — запрос на экспорт перед удалением модуля
ГЛАВА 2 Основы программирования в VBA В предыдущей главе было рассказано об основных объектах Visual Basic for Applications, базовых конструкциях языка, допустимых именах, типах данных. Двигаемся дальше и начнем рассмотрение основополагающих правил программирования в ячейках. Ячейка и диапазон ячеек Работа с ячейкой и диапазоном ячеек через VBA осуществляется с применением объекта Range, который представляет ячейку, столбец, выделение ячеек, содержащих один или несколько смежных блоков, 3D-диапазон. 1. Создайте новый файл Microsoft Excel 2021. 2. Перейдите в среду VBA, нажав в группе команд Код вкладки ленты Разработчик кнопку Visual Basic — на экране откроется окно интегрированной среды разработки приложений: Microsoft Visual Basic for Applications - Книга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>. рос на выполнение также можно нажатием кнопки П РИМЕЧАНИЕ Не забудьте, что при запуске выполняется тот макрос, на котором стоит курсор.
76 Глава 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 77 Таблица 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.
78 Глава 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 79 Обрамление ячейки — метод 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
80 Глава 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 81 Воспользуйтесь для запуска макроса кнопкой — результат будет такой же, как в предыдущем примере. Сохраните изменения в файле. Вложенные операторы With Приведем пример программы создания синей вертикальной надписи в ячейке с желтой заливкой, в которой используются два вложенных друг в друга оператора With (листинг 2.6, рис. 2.2). В этом случае главным объектом является диапазон данных в виде одной ячейки A2 (Range(A2)), расположенной на первом рабочем листе (Worksheets(1)). Достаточно один раз записать объект через выражение, а затем выполнить для него ряд инструкций. Во вложенном операторе действия осуществляются над объектом Font. Заметьте, что обращение к свойствам указанного в начале кода объекта выполняется при помощи оператора «точка» (.). При использовании конструкции With...End With нет необходимости каждый раз писать полный путь к объекту и указывать свойство — например: ThisWorkbook.Worksheets(1).Range("A2").Interior.Color = vbYellow Достаточно обратиться к свойствам объекта через точку. 1. Создайте новый файл Microsoft Excel 2021. 2. Перейдите в среду VBA и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). 3. Напишите программу согласно листингу 2.6. Листинг 2.6. Вложенные операторы With Sub Вложенные_With() With ThisWorkbook.Worksheets(1).Range("A2") .Interior.Color = vbYellow ' Цвет фона .Value = "VBA Excel 2021" ' Текст надписи .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 вводится текст с соответствующим форматированием.
82 Глава 2 Рис. 2.2. Пример программы, содержащей два оператора With 4. Сохраните документ с поддержкой макросов под именем Листинг_2.6_Вложенные_ With.xlsm. Генерация случайных чисел СЛЧИС() Visual Basic позволяет использовать функции различных категорий, зарезервированные для использования в приложении Microsoft Excel 2021. Для корректного вызова функции СЛЧИС() категории Математические средствами VBA необходимо обозначить функцию как значение свойства Range.Formula соответствующего объекта Range. В следующем примере функция Excel СЛЧИС(), вызываемая в VBA как RAND() (которая генерирует случайное число), назначена для свойства Range.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") S.Formula = "=RAND()"
Основы программирования в VBA 83 S.Font.Bold = True End Sub 4. Сохраните документ с поддержкой макросов под именем Листинг_2.7_Случайное_ число.xlsm. а б Рис. 2.3. Диапазон ячеек, заполненный случайными числами (а), и динамический массив из случайных чисел (б) Генерация динамического массива случайных чисел RandArray А теперь рассмотрим пример вызова из Visual Basic функции Excel СЛМАССИВ([строки]; [столбцы]; [минимум]; [максимум]; [целое]), которая возвращает динамический массив случайных чисел. Для этой функции в объекте WorksheetFunction содержится функция рабочего листа RandArray. Для того чтобы вставить эту функцию рабочего листа в заданную ячейку (размер динамического массива можно задать
84 Глава 2 в аргументах функции RandArray), необходимо обозначить функцию как значение свойства Range.Formula2 соответствующего объекта Range. Формула, заданная при помощи свойства Range.Formula2, интерпретируется программой как массив, при этом формула может переноситься на соседние ячейки, если возвращается более чем один результат. Если задать формулу для диапазона с несколькими ячейками, все ячейки в диапазоне заполняются формулой. Применение динамических массивов требует перехода от использования свойства Range.Formula к свойству Range.Formula2. В следующем примере функция рабочего листа RandArray(5,5) (которая генерирует динамический массив размером 5×5 ячеек из случайных чисел) назначена для свойства Formula2 задающей ячейки A1 массива. 1. Продолжите работу с файлом Листинг_2.7_Случайное_число.xlsm. Вставьте в рабочую книгу новый рабочий лист и переименуйте его название в Динамический массив. 2. В проекте VBA в модуле Module1 напишите программу (листинг 2.7, б), в которой ячейки заполняются случайными числами (рис. 2.3, б). В области ячеек Range("A1") значения вычисляются по формуле или функции "=RANDARRAY(5,5)". Дополнительно шрифт задан полужирным. 3. Для запуска макроса нажмите клавишу <F5>. Будет создан динамический массив случайных чисел в указанном диапазоне ячеек. Листинг 2.7, б. Пример генерации динамического массива из случайных чисел Sub Массив_случайных_величин() Range("A1").Formula2 = "=Randarray(5,5)" Range("A1#").Font.Bold = True End Sub 4. Сохраните документ с поддержкой макросов под именем Листинг_2.7_Случайное_ число.xlsm. Перевод градусов по Фаренгейту в градусы по Цельсию Рассмотрим пример программы, использующей внешнюю функцию пересчета градусов по Фаренгейту в градусы по Цельсию. 1. Создайте новый файл Microsoft Excel. Перейдите в среду VBA (<Alt>+<F11>). Добавьте к проекту модуль: Insert | Module (Вставить | Модуль). 2. Напишите процедуру Расчет() (листинг 2.8), в которой числовое значение градусов по Фаренгейту вводится в диалоговом окне InputBox. Потом это значение подставляется в качестве параметра в функцию Градусы_по_Цельсию(f). В ней осуществляется пересчет в градусы по Цельсию по заданной формуле. Затем в окне сообщений MsgBox выводится соответствующее сообщение.
Основы программирования в VBA 85 Листинг 2.8. Пример пересчета градусов по Фаренгейту в градусы по Цельсию Sub Расчет() Dim t As Integer t = Application.InputBox(Prompt:= _ "Введите температуру в градусах по Фаренгейту", Type:=1) MsgBox "Температура равна " & Градусы_по_Цельсию (t) & _ " градусов C." End Sub 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
86 Глава 2 4. Те значения, перед которыми указан знак $, при дальнейшем «протаскивании» формулы маркером заполнения изменяться не будут. 5. Выполните автозаполнение: вначале вниз, затем вправо. Для этого подведите указатель мыши в правый нижний угол ячейки В2 (на маркер заполнения), превратите «белый» крест курсора в «черный», нажмите левую кнопку мыши и протащите курсор до ячейки В21. Отпустите мышь, не снимая выделения. 6. Подведите указатель мыши к правому нижнему углу ячейки В21 (на маркер заполнения), превратите «белый» крест курсора в «черный», нажмите левую кнопку мыши и протащите курсор до ячейки K21. Отпустите мышь, не снимая выделения. 7. По выделенной области В2:K21 постройте поверхность: в группе Диаграммы вкладки ленты Вставка раскройте список значка Вставить гистограмму или линейчатую диаграмму и выберите пункт Другие гистограммы. В открывшемся диалоговом окне перейдите на вкладку Поверхностная. Поверхность готова (рис. 2.5), отформатируйте ее по своему желанию. 8. В ячейках В2:K21 находятся формулы, замените их числами (листинг 2.9, а). 9. Теперь в редакторе Visual Basic вставьте рабочий модуль Module1. Рис. 2.5. Поверхность
Основы программирования в VBA 87 10. Создайте процедуру в соответствии с листингом 2.9, а, при выполнении которой формулы будут удалены, а на их месте окажутся просто значения, полученные при расчете ранее использованных формул. Формулы из ячеек удаляются в том случае, если вы получили расчетные значения и далее планируете использовать только числовые значения, поскольку при случайном изменении ячеек, на которые есть ссылки, происходит автоматический пересчет данных. В листинге задействовано свойство Selection, которое возвращает объект, представляющий собой текущее выделение активного рабочего листа — набор ячеек. Листинг 2.9, а. Замена формул числом в выделенной области для ячейки как объекта Public Sub Замена_формул_числом_1() Dim Cell As Object For Each Cell In Selection Cell.Formula = Cell.Value Next Cell End Sub 11. Для корректной работы процедуры необходимо предварительно выделить диапазон ячеек В2:K21 на рабочем листе. Будьте внимательны, после работы макроса вернуть формульные данные будет нельзя. Для запуска макроса в VBA нажмите клавишу <F5>. 12. Обратите внимание, что переменная Cell, задающая ячейку, описана как переменная объекта Object. В этом примере формула заменяется числовым значением каждой ячейки текущего выделения. 13. Сохраните рабочий документ с поддержкой макросов под именем Листинг_2.9_ Поверхность.xlsm. Добавьте к документу новый рабочий модуль Module2. 14. Есть и другой способ вставки в ячейку числового значения вместо формулы (листинг 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
88 Глава 2 Next C End Sub 15. А вот и еще один пример замены формул числом, который работает с формулами, а не с числами (листинг 2.9, в). Пропишем его в модуле Module2. Листинг 2.9, в. Поддержка формул Public Sub Поддержка_формул() Dim Cl As Range For Each Cl In ActiveSheet.UsedRange With Cl If .HasFormula = False Then .Clear End If End With Next Cl End Sub Если свойство ячейки HasFormula равно False, то после выполнения макроса ячейка очищается, а в тех ячейках, в которых были формулы, происходит пересчет значений. Если бы для формирования чисел и y мы воспользовались динамическими массивами, то созданные макросы возвращали бы значение только для задающих ячеек динамических массивов, игнорируя «фантомные» формулы в оставшейся части динамических массивов. 16. Сохраните документ под тем же именем Листинг_2.9_Поверхность.xlsm командой Файл | Сохранить. Работа с цветом В этом разделе мы рассмотрим различные примеры по цветовому оформлению ячеек рабочего листа с использованием VBA. Функция RGB Функция RGB возвращает целое число типа Long, представляющее значение в цветовой модели RGB. Синтаксис функции RGB: RGB(Red, Green, Blue) Аргументы Red, Green и Blue — числа, принимающие значения в диапазоне 0–255 и описывающие соответственно интенсивность красного, зеленого и синего компонентов цвета. Методы и свойства приложения VBA, содержащие цвет, используют его числовые значения.
Основы программирования в VBA 89 Кроме числовых значений, для задания цвета предусмотрены символьные цветовые константы — например: 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 Желтый 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
90 Глава 2 6. Выполните процедуру — цвет шрифта для данных, находящихся в ячейках B6:G9, будет заменен на красный. 7. Сохраните документ с поддержкой макросов под именем Листинг_2.10_Цветной_ столбик.xlsm. Свойство ColorIndex Индексы определяют большее количество цветов, чем цветовые константы. Свойство ColorIndex задает цвет по индексу из палитры (рис. 2.6). Рис. 2.6. Палитра цветов и соответствующие индексы Рис. 2.7. Задание цвета в RGB-модели цветов Эту палитру можно увидеть и с помощью примеров, программирующих раскрашивание ячеек в соответствии с цветовыми индексами. Цвета из палитры ColorIndex можно отобразить в ячейке на рабочем листе (листинг 2.10, б). Иногда удобно знать, какое значение RGB соответствует цвету из палитры (табл. 2.4). Для того чтобы задать в ячейке заливку цветом из палитры ColorIndex, в Microsoft Excel перейдите на вкладку ленты Главная, в группе Шрифт нажмите на значке заливки и выберите команду Другие цвета…. Откроется диалоговое окно Цвета (рис. 2.7). Перейдите на вкладку Спектр, здесь можно задать значения цвета для цветовой модели RGB, аналогичные значениям для RGB-функции в VBA. 1. Продолжите работу с предыдущим файлом. 2. Перейдите в среду VBA, в том же модуле напишите программу (листинг 2.10, б), в которой добавляется новый рабочий лист, и на нем нумеруются ячейки Cells от 1 до 56 в столбце A, а затем в столбце B ячейки последовательно раскрашиваются при помощи задания свойства ColorIndex. В нашем случае свойство при-
Основы программирования в VBA 91 Таблица 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) меняется для установки заливки ячейки через обращение к вложенному объекту 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
92 Глава 2 End With Next i End Sub 4. Действительно, получился цветной столбик (рис. 2.8). Сохраните документ с поддержкой макросов под тем же именем Листинг_2.10_Цветной_столбик.xlsm. Рис. 2.8. Пример создания палитры цветов Тем, кто любит раскрашивать, можно предложить поэкспериментировать и изменить немного программу и палитру цветов из раскрашенных столбцов (листинг 2.11). 1. Создайте новый файл Microsoft Excel 2021. 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
Основы программирования в VBA 93 Next j End With Next i End Sub 4. В результате выполнения программы столбцы будут последовательно окрашены указанными цветами (рис. 2.9). Обратите внимание, что закрашиваются первые 56 ячеек каждого столбца, — при работе с диапазонами данных всегда необходимо внимательно указывать конечные значения. 5. Сохраните документ с поддержкой макросов под именем Листинг_2.11_Закрашенные_ столбики.xlsm. Рис. 2.9. Пример раскрашивания столбцов Обратите внимание, что при каждом запуске макроса палитра цветов создается на новом листе, т. к. в программе присутствует команда добавления листа Sheets.Add. Палитра цветов Для того чтобы без прокрутки увидеть на экране все цвета, напишем программу, которая отобразит четыре столбца по 16 цветов. 1. Создайте новый файл Microsoft Excel 2021. 2. На рабочем листе создайте командную кнопку Создание_ПАЛИТРЫ_ЦВЕТОВ. Для этого на вкладке ленты Разработчик в группе Элементы управления откройте опцию Вставить, в элементах управления Элементы ActiveX (см. рис. 1.24–1.25) выберите инструмент управления Кнопка, активизируйте его и на листе рабочей книги нарисуйте эту кнопку. Как только вы закончите рисование, в строке формул появится запись (рис. 2.10): =ВНЕДРИТЬ("Forms.CommandButton.1";"")
94 Глава 2 Рис. 2.10. Кнопка создания и палитра цветов 3. Щелкните на кнопке правой кнопкой мыши и в контекстно-зависимом меню найдите команду Просмотреть код (см. рис. 1.25). Выбор этой команды обеспечивает переход в окно редактора VBA и вывод в нем текста заготовки процедуры: Private Sub CommandButton1_Click() End Sub 4. Между строками шаблона процедуры введите код программы создания палитры цветов в соответствии с листингом 2.12. Обратите внимание, что создание отдельного модуля не потребуется, код располагается в окне кода для рабочего листа Лист1. 5. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение Создание_ПАЛИТРЫ_ЦВЕТОВ. 6. Выйдите из режима конструктора, нажав кнопку Режим конструктора , и щелкните мышью на кнопке Создание_ПАЛИТРЫ_ЦВЕТОВ на рабочем листе — макрос создаст палитру цветов. Листинг 2.12. Пример создания палитры цветов Private Sub CommandButton1_Click() Dim i As Integer
Основы программирования в VBA 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 95 i и D i + 14 и F i + 28 и H i + 42 7. Сохраните документ с поддержкой макросов под именем Листинг_2.12_Палитра_ цветов.xlsm. Подсчет цветов в рисунке 1. Создайте новый файл Microsoft Excel 2021. 2. Уберите сетку с экрана, для чего в области Отображение вкладки ленты Вид снимите флажок Сетка. 3. Уменьшите ширину столбцов с A до M, задав ее равной, например, 2. 4. Нарисуйте на листе цветки, закрашивая ячейки разными цветами и изменяя цвет фона. Для первого цветка будет использоваться диапазон ячеек B2:L12, а для второго — B14:L24. Первый цветок может содержать любые цвета, и подсчет цветов будет осуществляться для всех значений, а для второго цветка задайте гамму цветов: желтый, зеленый, синий, красный. Для правильного подсчета цветов необходимо назначить фиксированные значения указанных цветов в соответствии с RGB-моделью (см. табл. 2.3). 5. Создайте, как показано в предыдущем примере, три кнопки (элементы управления ActiveX): CommandButton1, CommandButton2 и CommandButton3, управляющие подсчетом цветов (рис. 2.11). 6. В режиме конструктора последовательно щелкните правой кнопкой мыши на каждой из кнопок, из контекстно-зависимого меню выберите команду Просмотреть код, в появившейся заготовке напишите соответствующий код (листинг 2.13). Обратите внимание, что в коде для первой кнопки (Подсчет_всех_цветов) для каждой ячейки диапазона выполняется проверка на наличие цвета для фона ячейки. Interior — это вложенный объект диапазона Range, служащий для рабо-
96 Глава 2 Рис. 2.11. Окно программы подсчета цветов в рисунке ты с цветом. Если свойство цветового индекса для содержимого ячейки ColorIndex не равно константе -4142 перечисления XlColorIndex, т. е. «бесцветный», то счетчик увеличивается на единицу. В коде для второй кнопки (Подсчет_цветов) для подсчета цветов используется свойство Color, работающее с цветом при помощи аргументов либо цветовых констант функции RGB. Имейте в виду, что Excel работает с ограниченным количеством цветов, а именно 56 цветами палитры. Тогда цвет, заданный при помощи RGB-функции, будет округлен до ближайшего цвета из палитры. В коде для третьей кнопки поиск цвета осуществляется по индексу цвета из палитры цветов (см. рис. 2.6). П РИМЕЧАНИЕ В листинге 2.13 подсчет количества ячеек, окрашенных одинаковыми цветами, реализован с помощью операторов цикла. Более подробно операторы цикла описаны в главе 4. Листинг 2.13. Пример подсчета закрашенных ячеек Sub CommandButton1_Click() 'Подсчет всех цветов при помощи свойства ColorIndex Dim c As Range
Основы программирования в VBA 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 For Each c In Range("B14:L24") Select Case c.Interior.ColorIndex Case 6 Y = Y + 1 Case 3 R = R + 1 97
98 Глава 2 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 2021. 2. Заполните ячейки цифрами 500 и 1000 в диапазоне A1:D7, применяя заливку красным для ячеек, содержащих значение 1000. 3. Создайте кнопки (элементы управления ActiveX): CommandButton1 — для перекрашивания красных ячеек в желтый цвет при помощи свойства Interior.Color и CommandButton2 — для обратного перекрашивания. В режиме конструктора щелкните правой кнопкой мыши на создаваемой кнопке, из контекстнозависимого меню выберите команду Просмотреть код, в появившейся заготовке напишите соответствующий код для каждой из кнопок (листинг 2.14). В программе используются операторы цикла нахождения ячеек, окрашенных красным цветом, с заменой красного цвета на желтый. Код для второй кнопки восстанавливает исходные цвета. Листинг 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
Основы программирования в VBA 99 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. Смена заливки ячеек с красной на желтую Защита ячеек рабочего листа от форматирования 1. Создайте новый файл Microsoft Excel 2021. 2. Примените заливку разными цветами для некоторых ячеек из диапазона данных A1:D7 (рис. 2.13). Сделаем так, чтобы вносить любые изменения можно было только для тех ячеек, которые содержат заливку. 3. Для этого создадим две кнопки (элементы управления ActiveX): CommandButton1 — для выборочной защиты ячеек и CommandButton2 — для снятия защиты активного рабочего листа. В режиме конструктора последовательно щелкните правой кнопкой мыши на каждой из создаваемых кнопок, из контекстно-зависимого меню выберите команду Просмотреть код, в появившейся заготовке напишите соответствующий код (листинг 2.15).
100 Глава 2 а б Рис. 2.13. Пример программы блокировки ячеек с исключением: а — ввод данных разрешен только в ячейки с заливкой; б — с сообщением о защищенном листе Листинг 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
Основы программирования в VBA 101 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 2021. 2. Закрасьте некоторые смежные ячейки желтым цветом в диапазоне данных A1:С6. 3. На том же рабочем листе создайте командную кнопку CommandButton1 (элемент управления ActiveX) для выделения ячеек, окрашенных желтым цветом (рис. 2.14). 4. В свойствах командной кнопки установите свойство Caption в значение Выделить_ячейки. Выполните двойной щелчок левой кнопкой мыши на кнопке в режиме конструктора и введите соответствующий код из листинга 2.16. Рис. 2.14. Пример выделения желтых ячеек по нажатию кнопки
102 Глава 2 Листинг 2.16. Пример выделения желтых ячеек Private Sub CommandButton1_Click() 'Выделить ячейки по цветовому соответствию Dim c As Range 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 5. Сохраните документ с поддержкой макросов под именем Листинг_2.16_Выделение_ ячеек.xlsm. Заливка строк с заданным шагом 1. Создайте новый файл Microsoft Excel 2021. 2. Введите информацию в ячейки (рис. 2.15). Можно применить к ним произвольную заливку. Рис. 2.15. Пример программы выделения ячеек серым цветом 3. Создайте кнопку CommandButton1 (элемент управления ActiveX) для вызова макроса по закрашиванию строк с данными указанным цветом с шагом 2. Задайте для нее подходящее название при помощи свойства Caption. В режиме конструктора щелкните правой кнопкой мыши на кнопке, из контекстно-зависимого меню выберите команду Просмотреть код, в появившейся заготовке напишите соответствующий код (листинг 2.17). 4. Вначале при работе первого макроса свойство ColorIndex всех ячеек устанавливается равным константе xlNone. Таким образом удаляется начальная заливка ячеек. В коде используется свойство Count для определения количества строк
Основы программирования в VBA 103 используемого диапазона. Затем в цикле с шагом 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 6. Сохраните документ с поддержкой макросов под именем Листинг_2.17_Подсветка_ серым.xlsm. Выделение миганием 1. Создайте новый файл Microsoft Excel 2021. 2. Введите информацию в ячейки в диапазоне данных A1:C13 в соответствии с рис. 2.16. Рис. 2.16. Пример программы выделения миганием
104 Глава 2 3. Создайте две кнопки (элементы управления формы): Мигающая подсветка и Выключить мигание на листе рабочей книги. В редакторе Visual Basic вставьте модуль Module1 (командой меню Insert | Module). 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"), _ 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.
Основы программирования в VBA 105 Календарь 1. Создайте новый файл Microsoft Excel 2021. Мы будем вводить в ячейки A1 и A2 даты, поэтому установите следующий формат ячеек: (все форматы), Тип ДД.ММ.ГГГГ. 2. Введите в ячейку А1 строку Календарь 2024, в ячейку А2 — 01.01.2024, в ячейку B2 — 01.02.2024, выделите ячейки A2 и B2. 3. Позиционируйте курсор мыши на маленьком черном квадрате — «белый» крест курсора превратится в «черный». 4. Нажмите левую кнопку мыши и выполните автозаполнение строки. Благодаря автозаполнению появятся следующие значения: • в ячейке C2 — 01.03.2024; • в ячейке H2 — 01.08.2024; • в ячейке D2 — 01.04.2024; • в ячейке I2 — 01.09.2024; • в ячейке E2 — 01.05.2024; • в ячейке J2 — 01.10.2024; • в ячейке F2 — 01.06.2024; • в ячейке K2 — 01.11.2024; • в ячейке G2 — 01.07.2024; • в ячейке L2 — 01.12.2024. 5. Выполняя автозаполнение столбцов вниз из указанных ячеек, сформируйте календарь на 2024 год (листинг 2.19). Для отображения дат, так же как на рис. 2.17, необходимо установить следующий формат ячеек: (все форматы), Тип ДДД*.ДД.ММ. Рис. 2.17. Форматирование ячеек в заданном диапазоне
106 Глава 2 6. Закрасьте ячейки, содержащие выходные дни, синим цветом, шрифт сделайте белым и полужирным, для этого создайте кнопку CommandButton1 (элемент управления ActiveX) для вызова макроса и напишите соответствующий код. Вторая кнопка CommandButton2 (элемент управления ActiveX) предназначена для снятия подсветки. Для определения дня недели, соответствующего дате, используется метод WorksheetFunction.Weekday. По умолчанию день задается целым числом от 1 до 7. Если возвращаемое значение 7 — это суббота, 1 — воскресенье. 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 8. Сохраните документ с поддержкой макросов под именем Листинг_2.19_ КАЛЕНДАРЬ.xlsm. Заливка ячеек, содержащих формулы 1. Создайте новый файл Microsoft Excel 2021. 2. Введите в ячейку B2 значение 500, в B3 — 400, в B4 — 300, в С2 — 300, в С4 — 600, в D2 — 500, в D3 — 400, в D4 — 300 (рис. 2.18). 3. Введите в ячейки формулы: • в А1: =СУММ(B2:B4); • в А4: =СУММ(B4:E4); • в А2: =СУММ(B3:B3); • в А5: =СУММ(B5:E5); • в А3: =СУММ(B3:E3); • в В1: =СУММ(B2:B5);
Основы программирования в VBA 107 • в B5: =СУММ(B2:B4); • в E4: =СУММ(В4:D4); • в С1: =СУММ(С2:С5); • в E5: =СУММ(E2:E4); • в C5: =СУММ(C2:C4); • в C3: =СУММ(B2:B4); • в E1: =СУММ(E2:E5); • в D1: =СУММ(D2:D5); • в E2: =СУММ(В2:D2); • в D5: =СУММ(D2:D4). • в E3: =СУММ(В3:D3); Рис. 2.18. Подсветка формул 4. Применим к ячейкам, содержащим формулы, заливку красным и синим цветом. Для этого на рабочем листе создайте две кнопки для форматирования при вызове макроса: CommandButton1 и CommandButton2 и одну кнопку CommandButton3 — для удаления форматирования (элементы управления ActiveX). Переименуйте командные кнопки рабочего листа (см. рис. 2.18) и назначьте им соответствующие макросы. В листинге 2.20 приведен код для заливки ячеек, содержащих формулы, красным и синим цветами и для отмены форматирования: • в коде для первой кнопки формульные ячейки находятся при использовании метода SpecialCells с перечислением xlCellTypeFormulas; • во втором примере задействовано свойство HasFormula: если возвращаемое значение True, это означает, что ячейка из используемого диапазона UsedRange содержит формулу; • в третьем примере управление заливкой ячейки осуществляется через свойство Interior.ColorIndex, которое приравнивается значению –4142 (либо xlColorIndexNone), что означает отмену заливки. Листинг 2.20. Примеры заливки формульных ячеек Private Sub CommandButton1_Click() ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas).Interior.Color = vbRed End Sub
108 Глава 2 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 5. Сохраните документ с поддержкой макросов под именем Листинг_2.20_Выделение_ формул.xlsm. Подсветка минимального и максимального значений 1. Создайте новый файл Microsoft Excel 2021. 2. Введите в ячейки информацию в соответствии с рис. 2.19. В диапазоне ячеек B2:E5 содержатся числовые данные. Рис. 2.19. Подсветка минимаксных значений 3. Создайте командные кнопки на рабочем листе (категория Элементы управления ActiveX): кнопку CommandButton1 — для форматирования закраски ячеек и кнопку CommandButton2 — для удаления форматирования. Переименуйте кнопки в МинМакс и Удалить заливку ячеек. 4. В редакторе VBA создайте макрос (листинг 2.21), подсвечивающий ячейки с минимальными значениями красным цветом и ячейки с максимальными значениями — зеленым. Поиск минимумов и максимумов ведется по столбцам. Об-
Основы программирования в VBA 109 ратите внимание, что в листинге определена переменная, представляющая собой объект WorksheetFunction, содержащий все функции рабочего листа, которые можно вызвать в редакторе VBA. Поиск наименьшего и наибольшего значений ведется с использованием методов WorksheetFunction.Min и WorksheetFunction.Max соответственно. В обработчике события, выполняемого по нажатию второй кнопки, удаляется заливка ячеек заданного диапазона. Листинг 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 5. Сохраните документ с поддержкой макросов под именем Листинг_2.21_ МинМакс.xlsm. Цветовая шкала 1. Создайте новый файл Microsoft Excel 2021. 2. Перейдите в среду VBA (<Alt>+<F11>). 3. Добавьте к проекту модуль Module1: Insert | Module (Вставить | Модуль). 4. Создайте макрос, генерирующий цветовую шкалу (рис. 2.20), и запустите его (листинг 2.22). Не забудьте при этом поместить в начале окна кода оператор Option Explicit. Обратите внимание, что в листинге определена переменная, представляющая собой объект VBA ColorScale для работы с цветовой шкалой, заданной по определенным правилам условного форматирования. 5. Для выполнения процедуры нажмите клавишу <F5>.
110 Глава 2 Рис. 2.20. Цветовая шкала Листинг 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.
ГЛАВА 3 Логические операторы Оператор If...Then...Else Алгоритмом ветвящейся структуры, или логическим оператором, называется алгоритм, в котором выбирается один из нескольких возможных путей (вариантов) вычислительного процесса. Ветвью алгоритма называется каждый подобный путь. Признак разветвляющегося алгоритма — наличие операций условного перехода, когда проверяется истинность некоторого логического выражения (проверяемого условия) и в зависимости от его истинности или ложности для выполнения выбирается та или иная ветвь алгоритма. Алгоритм предполагает выполнение действия 1, если записанное условие истинно (выполняется), и выполнение действия 2, если условие ложно (не выполняется). В частном случае один из блоков (действие 1 или действие 2) может отсутствовать. На рис. 3.1 показан логический алгоритм, записанный с помощью псевдокода, а также графически — в виде блок-схемы. Пусть, например, В — проверяемое условие, а S1, S2 — некоторые выполняемые инструкции (действия). Тогда: Если условие В выполняется (истинно), то выбрать для исполнения S1, иначе выбрать для исполнения S2 Операторы сравнения Логические операторы могут содержать арифметические операторы сравнения (табл. 3.1). Наряду с арифметическими операторами сравнения в логических выражениях If...Then...Else используются словесные операторы алгебры логики (табл. 3.2).
112 Глава 3 Псевдокод Блок-схема 1. Начало 2. Ввод (...) 3. Если B то S1 иначе S2 4. Вывод (...) 5. Конец Рис. 3.1. Логический алгоритм, записанный на псевдокоде (слева) и графически в виде блок-схемы (справа) Таблица 3.1. Арифметические операторы сравнения Оператор сравнения Описание = Равно <> Не равно > Больше >= Больше либо равно < Меньше <= Меньше либо равно Таблица 3.2. Операторы алгебры логики Оператор сравнения Описание AND Логическое И EQV Логическая эквиваленция. Операция, выражаемая связками «тогда и только тогда», «необходимо и достаточно» или «... равносильно ...», называется эквиваленцией (двойной импликацией) и обозначается знаком ↔ или ~. Высказывание А↔В истинно тогда и только тогда, когда значения А и В совпадают
Логические операторы 113 Таблица 3.2 (окончание) Оператор сравнения Описание IMP Логическая импликация (от лат. implico — тесно связаны). Операция, выражаемая связками «если ..., то», «из ... следует» или «... влечет» и обозначаемая знаком →. Высказывание А→В ложно тогда и только тогда, когда А истинно, а В — ложно NOT Логическое НЕ OR Логическое ИЛИ XOR Логическое Исключающее ИЛИ Неполная форма оператора If...Then 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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_Условие сопровождающего книгу электронного архива.
114 Глава 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 "Четная сторона"
Логические операторы 115 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 2021. Перейдите в среду 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.
116 Глава 3 Примеры использования логических операторов Рассмотрим несколько примеров, содержащих не только уже известные логические операторы, но и другие команды. Свойство Name 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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 2021. Перейдите в среду VBA (<Alt>+ <F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). В листинге 3.6 приведен код программы, определяющей при помощи свойства Value, пуста активная ячейка или содержит значение в виде числа или текста с выдачей соответствующего сообщения. 2. Для запуска макроса нажмите кнопку . Листинг 3.6. Значение для активной ячейки Public Sub Значение_активной_ячейки() If ActiveCell.Value = "" Then MsgBox "Ячейка пустая", vbInformation
Логические операторы 117 Else MsgBox "Ячейка не пустая", vbInformation End If End Sub 3. Сохраните документ под именем Листинг_3.6_Свойство_Name.xlsm. Функции IsEmpty и IsNumeric 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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 2021. Перейдите в среду VBA (<Alt>+ <F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль).
118 Глава 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. Переход к ячейке A2021 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+ <F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль).
Логические операторы 119 2. Напишите программу, содержащую операторы, которые позволят осуществить переход к ячейке A2021 (листинг 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 2021 Cells(i, 1).Select Next i End If Exit Sub METKA: If Err = 18 Then MsgBox "Ошибка." End Sub Интересно, как долго будет работать программа, если вместо перехода к ячейке A2021 вы захотите перейти к ячейке А1048576? П РИМЕЧАНИЕ В этом примере использовалась инструкция On Error, которая обеспечивает выявление ошибок. Далее, в главе 15, будут рассматриваться вопросы перехвата ошибок и их обработки программой. 4. Сохраните документ под именем Листинг_3.9_Переход_по_метке.xlsm. Пример с оператором Case 1. Создайте новый файл Microsoft Excel 2021. Напишем программу, которая будет определять цвет активной ячейки и в соответствии с цветом осуществлять вывод сообщения. 2. На рабочем листе закрасьте три ячейки красным, желтым и зеленым цветом для имитации светофора (рис. 3.3). Также можно закрасить несколько смежных ячеек,
120 Глава 3 придав картинке форму. К выбору цвета и последующей работе с ним в VBA необходимо подходить аккуратно. Задайте цвета при помощи цветовых компонентов модели RGB (см. табл. 2.4) в диалоговом окне Цвета. Рис. 3.3. Работа программы Светофор 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 "Иди"
Логические операторы 121 Case Else MsgBox "Светофор не работает" End Select End Sub В результате выполнения процедуры в переменную типа Variant записывается значение цвета активной ячейки. В зависимости от него появляется то или иное сообщение. Если ячейка пустая, то появляется сообщение Светофор не работает. 5. Сохраните документ под именем Листинг_3.10_SelectCase.xlsm. Функция InputBox Функция InputBox инициирует появление диалогового окна InputBox, предназначенного для ввода информации. Это окно содержит сообщение и поле ввода, а также две кнопки: OK и Cancel. Возвращаемое значение — строка. Функция устанавливает режим ожидания ввода текста пользователем или нажатия им кнопки, а затем возвращает значение типа String, содержащее текст, введенный в поле. Синтаксис функции: InputBox(Prompt, [Title], [Default], [xpos], [ypos], [Helpfile, Context]) as String Аргументы:  Prompt — строковое выражение, отображаемое в качестве сообщения в диалого- вом окне, обязательный аргумент;  Title — строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот аргумент опущен, то в строку заголовка помещается имя приложения;  Default — строковое выражение, отображаемое в поле ввода по умолчанию, если пользователь не введет другую строку. Если этот аргумент опущен, поле ввода отображается пустым;  xpos — обозначает положение по x в пунктах для диалогового окна по отноше- нию к левому верхнему краю экрана. Если этот аргумент опущен, диалоговое окно выравнивается по центру экрана по горизонтали;  ypos — обозначает положение по y в пунктах для диалогового окна по отноше- нию к левому верхнему краю экрана;  Helpfile — строковое выражение, которое определяет имя файла справки, со- держащего справочные сведения о диалоговом окне. Если этот аргумент указан, то следует задать и аргумент Context;  Context — числовое выражение, определяющее номер соответствующего разде- ла справочной системы. Если этот аргумент указан, то следует задать и аргумент Helpfile.
122 Глава 3 Рассмотрим пример с функцией InputBox. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+ <F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). 2. Напишите программу (листинг 3.11), показывающую работу оператора Case, с помощью которого выбор определяется по значению, введенному в диалоговое окно InputBox (рис. 3.4). а б Рис. 3.4. Диалоговые окна: а — ввод данных в окне InputBox; б — вывод результата Листинг 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 3. Для запуска макроса нажмите кнопку . 4. Сохраните документ под именем Листинг_3.11_CASE_InputBox.xlsm. Оператор GoTo 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+ <F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль).
Логические операторы 123 В листинге 3.12 приведен код программы с оператором GoTo для перехода в указанную строку процедуры в случае возникновения ошибки On Error. 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 2021. Перейдите в среду 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
124 Глава 3 s1 = "C:\Листинг_3.14_CASE_Свойства_Excel.xlsm" s2 = "C:\Проверка.xlsm" If Dir(s2) = "" Then MsgBox "Файл " & (s2) & " не существует." Else _ Workbooks.Open s2 End Sub В результате выполнения процедуры из листинга 3.13 появляется сообщение Файл С:\Проверка.xlsm не существует. Если же искомый файл будет найден, то он откроется в программе Microsoft Excel. 3. Сохраните документ под именем Листинг_3.13_If_Then_Else_Книги_нет.xlsm.
ГЛАВА 4 Операторы цикла Алгоритм называется циклическим, если он содержит многократное выполнение одних и тех же ветвей при различных значениях промежуточных данных. Число повторений этих ветвей алгоритма может быть задано в явной или неявной форме. Циклические алгоритмы включают в себя циклы. Циклом называется многократное выполнение одних и тех же действий при различных значениях параметров. Последовательность операторов, выполняемых в цикле многократно, называется телом цикла. Каждое выполнение тела цикла называется шагом цикла. Существует несколько базовых структур цикла: цикл с параметром (цикл с заданным количеством повторений), цикл с предусловием (когда на каждом шаге сначала проверяется условие, а затем выполняется тело цикла), цикл с постусловием (когда на каждом шаге сначала выполняется тело цикла, а затем проверяется условие). В VBA существует несколько видов циклических инструкций (операторов цикла), с помощью которых можно организовать такие структуры. Рассмотрим эти операторы и примеры их использования. Цикл For...To...Step...Next Этот оператор реализует цикл с параметром. Он используется, как правило, когда заранее известно количество повторений тела цикла. Синтаксис оператора: For Счетчик = Начальное значение To Конечное значение [Step Шаг] Тело цикла Next Счетчик Здесь Счетчик — целочисленная переменная, называемая параметром цикла; Начальное значение и конечное значение — переменные или выражения, задающие значение параметра цикла на первом и последнем шагах; Шаг — целочисленное значение, определяющее шаг изменения параметра цикла. Шаг указывать не обязательно — если шаг не указан, он считается равным 1.
126 Глава 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_Цикл сопровождающего книгу электронного архива. Для того чтобы выделить ячейку А2021, необходимо немного изменить код: For i = 1 To 2021 Cells(i, 1).Select Next i Цикл For...To...Next В этом примере используются операторы цикла For...To...Next. Поскольку в программе не указан оператор Step, то считается, что шаг по умолчанию равен 1. 1. Создайте новый файл Microsoft Excel 2021, содержащий два рабочих листа: Лист1 и Лист2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). 2. Напишите программу с операторами цикла For...To...Next (листинг 4.2).
Операторы цикла 3. Для запуска макроса нажмите кнопку 127 . Листинг 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 2021, а в нем три рабочих листа. 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.
128 Глава 4 Заполнение столбца с большим шагом Рассмотрим пример аналогичной программы, только в ней после работы макроса заполняется столбец ячеек с B1 по B5 рядом целых чисел с большим шагом (листинг 4.4, рис. 4.1). При этом заполнение осуществляется на рабочем листе Лист1. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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 рядом целых чисел (лис-
Операторы цикла 129 тинг 4.5, рис. 4.2). При этом заполнение осуществляется на рабочем листе Лист1. Целая переменная i — переменная цикла. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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 2021. Перейдите в среду VBA (<Alt>+ <F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль).
130 Глава 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>. кнопка Было показано также создание для запуска макроса кнопки — элемента управления ActiveX. Теперь создадим для запуска макроса кнопку — элемент управления формы.
Операторы цикла 131 Вложенный цикл For...To...Next Покажем создание макроса, назначенного для расположенной на рабочем листе кнопки типа Элементы управления формы, на примере программы, содержащей вложенный цикл. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+ <F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). 2. На рабочем листе создайте командную кнопку ВЫПОЛНИТЬ. Для этого в группе Элементы управления вкладки ленты Разработчик откройте опцию Вставить и в элементах управления категории Элементы управления формы (см. рис. 1.24 или рис. 4.4, в) выберите инструмент управления Кнопка . П РИМЕЧАНИЕ Созданная кнопка на этом этапе имеет название Кнопка 1. Мы изменим ее название на ВЫПОЛНИТЬ чуть позже. 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
132 Глава 4 6. Как уже отмечалось ранее, созданная кнопка имеет название Кнопка 1. Для того чтобы ее переименовать в ВЫПОЛНИТЬ, щелкните на ней правой кнопкой мыши и в контекстно-зависимом меню найдите команду Изменить текст (рис. 4.4, б). а б в Рис. 4.4. Работа с вложенными циклами: а — диалоговое окно Назначить макрос объекту; б — контекстно-зависимое меню внедренной кнопки; в — пример программы, содержащей вложенный цикл (здесь же показана панель Элементы управления формы, содержащая вставляемую кнопку)
Операторы цикла 133 П РИМЕЧАНИЕ Обратите внимание, что диалоговое окно 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. Причем начинают печататься сначала абсолютные, а затем относительные адреса ячеек (рис. 4.5). 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). Рис. 4.5. Пример программы, содержащей цикл For...Each
134 Глава 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 условие
Операторы цикла 135 или Do Тело цикла Loop Until условие Здесь условие — логическое выражение, Loop (от англ. петля) — обязательное ключевое слово, означающее завершение цикла Do. Когда используется ключевое слово While, тело цикла выполняется, если условие истинно, а выход из цикла происходит, когда условие становится ложным. Когда используется ключевое слово Until, тело цикла выполняется, если условие ложно, а выход из цикла происходит, когда условие становится истинным. Рассмотрим пример программы с циклом Do...While...Loop (листинг 4.9, рис. 4.6). 1. Создайте новый файл Microsoft Excel 2021. Введите исходные данные в виде произвольной таблицы чисел. а б Рис. 4.6. Пример программы, содержащей цикл Do...While...Loop: а — исходные данные; б — сообщение после работы цикла
136 Глава 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 2021. Введите исходные данные в виде произвольной таблицы чисел. Рис. 4.7. Пример программы, содержащей цикл Do...Until...Loop: слева — исходные данные; справа — сообщение после работы цикла
Операторы цикла 137 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 Цикл While...Wend выполняет тело цикла до тех пор, пока заданное условие имеет значение True. Приведем пример программы, в которой используется этот цикл (листинг 4.11). 1. Создайте новый файл Microsoft Excel 2021. Введите исходные данные в виде произвольной таблицы чисел согласно рис. 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
138 Глава 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.9).
Операторы цикла 139 Рис. 4.9. Ошибка компиляции Для обеспечения совместимости библиотеки Lib "kernel32" с 64-разрядной версией программы Microsoft Excel 2021 предлагается использовать атрибут PtrSafe после слова Declare в виде: Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long Сначала мы рассмотрим пример процедуры без цикла (листинг 4.12, а). Посмотрите на длительность работы процедуры. Увидеть результат выполнения команды Debug.Print можно в окне просмотра, вызываемом командой View | Immediate Windows (Вид | Окно просмотра). Это окно также можно вызвать, нажав комбинацию клавиш <Ctrl>+<G>. 1. Создайте новый файл Microsoft Excel 2021. 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). Оцените длительность работы процедуры с циклом.
140 Глава 4 Рис. 4.10. Пример измерения времени работы процедуры без цикла в Module1 Рис. 4.11. Пример работы цикла с надписью: VBA - Visual Basic for Applications Листинг 4.12, б. Время работы процедуры цикла типа For...Each Private Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long Sub Test1() Dim lngStart As Long Dim c As Range lngStart = GetTickCount
Операторы цикла 141 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 Эта процедура с циклом тоже работает быстро, но уже в течение 203 миллисекунд (рис. 4.12). Рис. 4.12. Время работы цикла с надписью: VBA - Visual Basic for Applications с макросом из модуля 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
142 Глава 4 lngStart = GetTickCount 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 Работа процедуры занимает 187 миллисекунд. Это немного меньше, чем время работы предыдущего листинга, но человеку сложно уловить столь небольшое изменение долей секунд. Следует заметить, что доли секунды рассчитать трудно, поэтому при разных запусках макроса число миллисекунд будет варьироваться. На разных компьютерах эти макросы также будут работать разное время — ведь производительность компьютеров различна. 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 и составляет 4859 миллисекунд, т. е. примерно 5 секунд. При работе на 32-разрядной версии программы эта процедура с оператором в теле цикла работает гораздо медленнее — 22 682 миллисекунды или 22,682 секунды. 9. Сохраните этот документ, содержащий несколько модулей с поддержкой макросов, под именем Листинг_4.12_Время_работы_цикла.xlsm.
Операторы цикла Рис. 4.13. Пример определения времени работы цикла в Module4 143
144 Глава 4
ГЛАВА 5 Функции, определенные пользователем Весь мир — число. Пифагор В программе Microsoft Excel 2021 имеется достаточно много встроенных функций: математических, логических, финансовых, текстовых, надстроек и автоматизации, инженерных и других, классифицированных по категориям. Каждой категории даже присваивается свой индекс. Количество отображаемых категорий может варьироваться и задается настройками системы. Кроме того, редактор Visual Basic for Applications позволяет создавать собственные функции, которые автоматически попадают в категорию «Определенные пользователем». Эти функции создаются в специальном модуле сопровождения объекта WorksheetFunction. Модуль добавляется с помощью команды Insert | Module (Вставить | Модуль) — в окне проекта он отобразится на уровне вашего приложения. Построение функций Функция (отображение, оператор, преобразование) — это математическое понятие, отражающее связь между какими-либо значениями. Можно сказать, что функция — это «закон», по которому одна величина зависит от другой. Функции строятся по формулам. Формула — совокупность значений, ссылок на другие ячейки, именованных объектов, функций и операторов, позволяющая получить новое значение. Формулы представляют собой выражения, по которым выполняются вычисления на листе. Формула начинается со знака равенства (=) и может содержать такие элементы, как функции, ссылки, операторы и константы. Формулы отображаются в строке формул (см. далее рис. 5.1, а). График функции одной переменной Для примера рассмотрим построение графика функции одной переменной y ( x) при x ∈ [−2; 5,5] .
146 Глава 5 Функция задана формулой ( ) e −2 x x+2 . + 2 x2 + 1 Для построения графика сначала необходимо составить таблицу его значений при различных значениях аргумента, выбрав шаг аргумента (например, шаг = 0,5). y = cos 2 1. В программе Microsoft Excel 2021 на листе Лист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. Можно также нажать комбинацию клавиш <Alt>+<F11>. На экране откроется окно интегрированной среды разработки приложений Microsoft Visual Basic - Книга 1.
Функции, определенные пользователем 147 а б в г д Рис. 5.1. Построение графика функции пользовательской функцией VBA: а — интерфейс программы со строкой формул; диалоговые окна: б — Add Procedure; в — кнопка Вставить функцию; г — Вставка функции; д — Аргументы функции
148 Глава 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.5_Графики.xlsm, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_5_Функции, определенные_ пользователем сопровождающего книгу электронного архива.
Функции, определенные пользователем 149 Расчет функции одной переменной с использованием динамических массивов Продолжим работу с файлом Листинг_5.1-Листинг_5.5_Графики.xlsm и рассмотрим использование функции Microsoft Excel ПОСЛЕД — для формирования массива из последовательности чисел с заданным шагом. Составим такую же таблицу значений при различных значениях аргумента, выбрав шаг аргумента (например, шаг = 0,5). 1. На рабочем листе Лист1 в столбце D сформируем ряд значений переменной x. Установите курсор в ячейку D2 и в строке формул вызовите функцию ПОСЛЕД. В качестве аргументов функции введите в диалоговом окне, согласно рис. 5.2, обязательные параметры: Строки — 16, Столбцы — 1, Начало — -2, Шаг — 0,5. Нажмите кнопку OK или клавишу <Enter>. Массив будет сформирован автоматически, без протягивания курсора мыши вниз на необходимое количество ячеек. Рис. 5.2. Построение динамического массива значений переменной 2. В столбце E рассчитаем ряд значений функции y. Установите курсор в ячейку E2 и в строке формул введите формулу: =COS((D2#+2)/2)^2+EXP(-2*D2#)/(D2#^2+1)^(1/2) В ячейке E2 будет вычислено значение y(x1), а также в ячейках E3:E17 сформирована оставшаяся часть вычисленных значений функции одной переменной (рис. 5.3).
150 Глава 5 Рис. 5.3. Построение динамического массива значений переменной 3. В ячейке F2 вызовите функцию y, определенную пользователем, и рассчитайте ее значения. С помощью маркера заполнения протащите значение функции в ячейке F2 до ячейки F17. Сравните полученные значения столбцов A и D, B и E, C и F — для диапазонов строк 2:17, они должны совпадать. 4. Сохраните рабочую книгу с поддержкой макросов под именем Листинг_5.1Листинг_5.5_Графики.xlsm. График кусочно-непрерывной функции с двумя условиями Рассмотрим построение кусочно-непрерывной функции одной переменной y ( x) с двумя условиями при x ∈ [−2; 1,2] : ⎧ 5 1 + x4 , ⎪ y=⎨ 2 5 x2 + x sin (3 ) , ⎪ 1 + sin 2 ( x) ⎩ x ≤ 0; x > 0. Для построения графика сначала необходимо составить таблицу его значений при различных значениях аргумента, выбрав шаг аргумента (например, шаг = 0,2).
Функции, определенные пользователем 151 1. В программе Microsoft Excel 2021 на листе Лист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. Функция iif проверяет, выполняется ли условие, и возвращает одно значение, если оно выполняется, и другое значение в противном случае. Синтаксис функции iif: iif(Expression, TruePart, FalsePart) Аргументы: • Expression — аналог аргумента лог_выражение функции ЕСЛИ, любое значение или выражение, которое при вычислении дает значение True (ИСТИНА) или False (ЛОЖЬ); • TruePart — аналог аргумента Значение_если_истина функции ЕСЛИ, возвращаемое значение, если аргумент Expression принимает значение True. Допустимая глубина вложенности — семь.
152 Глава 5 • 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.4. Интерфейс программы со строкой формул и график функции с двумя условиями 7. В ячейке D25 вызовите функцию f, определенную пользователем, вставьте аргумент функции, щелкнув мышью на ячейке D25, и с помощью маркера заполнения протащите значение функции в ячейке D25 до ячейки D41. Рассчитанные значения должны совпасть со значениями из столбца C. 8. Выделите диапазон ячеек с A25 по B41 или диапазоны A25:A41 и С25:С41. Вызовите мастер диаграмм: в группе Диаграммы вкладки ленты Вставка выберите кнопку с раскрывающимся списком Вставить точечную (X, Y) или пузырьковую диаграмму и укажите тип графика Точечная с гладкими кривыми — график готов (рис. 5.4), отформатируйте его по своему желанию. 9. Сохраните рабочую книгу с поддержкой макросов под именем Листинг_5.1Листинг_5.5_Графики.xlsm.
Функции, определенные пользователем 153 Расчет кусочно-непрерывной функции с двумя условиями с использованием динамических массивов Продолжим работу с файлом Листинг_5.1-Листинг_5.5_Графики.xlsm. Составим такую же таблицу значений при различных значениях аргумента, выбрав шаг аргумента (например, шаг = 0,2) (см. рис. 5.4, столбцы A и B). 1. На рабочем листе Лист1 в столбце E (E25:E41) сформируем ряд значений переменной x. Ограничимся тем же диапазоном x ∈ [−2; 1,2] . Установите курсор в ячейку E25 и в строке формул вызовите функцию ПОСЛЕД. В качестве аргументов функции введите в диалоговом окне обязательные параметры: Строки — 17, Начало — -2, Шаг — 0,2. В строке формул должно получиться формульное выражение =ПОСЛЕД(17;;A25;0,2). Нажмите кнопку OK или клавишу <Enter>. Массив будет сформирован автоматически, без протягивания курсора мыши вниз на необходимое количество ячеек. 2. В столбце F рассчитаем ряд значений функции y. Установите курсор в ячейку F25 и в строке формул вставьте скопированную из ячейки A25 формулу: =ЕСЛИ($A25<=0;(1+$A25^4)^0,2;(SIN(3*$A25))^2+(5*$A25^2)/(1+(SIN($A25))^2)) после чего при помощи курсора мыши замените запись $A25 на E25# во всех случаях. Нажмите клавишу <Enter>. В ячейке F25 будет вычислено значение y(x1), а также в ячейках F26:F41 сформирована оставшаяся часть вычисленных значений кусочно-непрерывной функции с двумя условиями. Рис. 5.5. Запись формулы ЕСЛИ с двумя условиями с динамическим массивом
154 Глава 5 3. В ячейке G25 вызовите функцию yy, определенную пользователем, и рассчитайте ее значения. С помощью маркера заполнения протащите значение функции в ячейке G25 до ячейки G41. Сравните полученные значения столбцов A и E, B и F, C и G — для диапазонов строк 25:41, они должны совпадать (рис. 5.5). 4. Сохраните рабочую книгу с поддержкой макросов под именем Листинг_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 2021 на листе если файла Листинг_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. Согласитесь, эта запись с использованием вложенных функций ЕСЛИ не совсем удобна. Воспользуемся для расчета y(x) относительно новой функцией ЕСЛИМН. Она проверяет соответствие одному или нескольким условиям и возвращает значение для первого условия со значением ИСТИНА. Таким образом, важно указать эти условия в правильной последовательности. В нашем случае х принимает значения для трех диапазонов данных: меньше нуля, в пределах от нуля до еди-
Функции, определенные пользователем 155 ницы, больше единицы. Логичным будет прописать в первом условии для условия функции ЕСЛИ выражение 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 8. В ячейке E2 вызовите функцию iff, определенную пользователем, вставьте аргумент функции, щелкнув мышью на ячейке А2, и с помощью маркера заполнения протащите значение функции в ячейке E2 до ячейки E32. Если функция написана правильно, содержимое столбцов B и E должно совпасть.
156 Глава 5 9. Выделите диапазон ячеек с A2 по B32 или диапазоны A2:A32 и С2:С32. Вызовите мастер диаграмм: в группе Диаграммы вкладки ленты Вставка выберите кнопку с раскрывающимся списком Вставить точечную (X, Y) или пузырьковую диаграмму и укажите тип графика Точечная с гладкими кривыми — график готов (рис. 5.6), отформатируйте его по своему желанию. Рис. 5.6. Интерфейс программы со строкой формул и график функции с тремя условиями В НИМАНИЕ ! В предыдущей версии программы появилась возможность ввода рукописного текста прямо на рабочем листе поверх сетки, как показано на рис. 5.6. Настройте ленту, добавив вкладку Рисование, и для оформления воспользуйтесь перьями, расположенными в группе Перья. Предварительно в группе Инструменты нажмите кнопку Рисование. Рукописный текст можно вписать пальцем или стилусом на сенсорном экране либо посредством левой кнопки мыши. При этом графика рисуется поверх содержимого рабочего листа на новом слое. 10. Сохраните рабочую книгу с поддержкой макросов под именем Листинг_5.1Листинг_5.5_Графики.xlsm. Расчет кусочно-непрерывной функции с тремя условиями с использованием динамических массивов Продолжим работу с файлом Листинг_5.1-Листинг_5.5_Графики.xlsm и реализуем таблицу значений при различных значениях аргумента, выбрав шаг аргумента (например, шаг = 0,1), с использованием динамических массивов (см. рис. 5.6, столбцы A, B, C).
Функции, определенные пользователем 157 1. На рабочем листе ЕСЛИ в столбце F (F2:F32) сформируем ряд значений переменной x. Ограничимся тем же диапазоном x ∈ [–1,7; 1,3]. Установите курсор в ячейку F2 и в строке формул вызовите функцию ПОСЛЕД. В качестве аргументов функции введите в диалоговом окне обязательные параметры: Строки — 31, Столбцы — 31, Начало — значение из ячейки A2, Шаг — 0,1. В строке формул должно получиться формульное выражение =ПОСЛЕД(31;1;A2;0,1). Нажмите кнопку OK или клавишу <Enter>. Массив будет сформирован автоматически, без протягивания курсора мыши вниз на необходимое количество ячеек. 2. В столбце G рассчитаем ряд значений функции y с использованием функции ЕСЛИ. Установите курсор в ячейку G2 и в строке формул вставьте скопированную из ячейки B2 формулу, затем при помощи курсора мыши замените запись A2 на F2# во всех случаях — должна получиться запись: =ЕСЛИ(F2#<0;(1+F2#+F2#^2)/(1+F2#^2);ЕСЛИ(F2#<1;КОРЕНЬ(1+2*F2#/(F2#^2+1)); 2*ABS(0,5+SIN(F2#)))) 3. Нажмите клавишу <Enter>. В ячейке G2 будет вычислено значение y(x1), а также в ячейках G3:G32 сформирована оставшаяся часть вычисленных значений кусочно-непрерывной функции с тремя условиями. 4. В столбце H рассчитаем ряд значений функции y с использованием функции ЕСЛИМН. Установите курсор в ячейку H2 и в строке формул вставьте скопированную из ячейки 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))) 5. Затем преобразуйте эту формулу к записи: =ЕСЛИМН(F2#<0;(1+A2:A32+A2:A32^2)/(1+A2:A32^2);F2#<1; КОРЕНЬ(1+2*A2:A32/(A2:A32^2+1));F2#>=1;2*ABS(0,5+SIN(A2:A32))) и нажмите клавишу <Enter>. П ОЯСНЕНИЕ В формуле конструкция F2# вводится вручную, а диапазон ячеек A2:A32 может быть введен при помощи выделения диапазона левой кнопкой мыши. В нашем случае формула может быть сведена к использованию только одной конструкции на основе решетки либо ссылки на конкретный диапазон ячеек. 6. Сравните полученные значения столбцов A и F, B и G, C и H — для диапазоно в строк 2:32 они должны совпадать (рис. 5.7). Рассчитайте значения пользовательских функций yyy и ff в столбцах I и J со ссылкой на массив значений x, полученных в столбце F. 7. Сохраните рабочую книгу с поддержкой макросов под именем Листинг_5.1Листинг_5.5_Графики.xlsm.
158 Глава 5 Рис. 5.7. Запись формулы ЕСЛИ с тремя условиями с динамическим массивом Названия формул на английском языке При работе с русифицированной версией программы Microsoft Excel мы пользуемся функциями с русскими названиями, у которых есть аналоги на английском языке. То же самое наблюдается и для версий на других языках. Но иногда полезно знать оригинальное название функции. Можно определить название функции на английском языке, например при помощи записи макросов. Так, рассмотрим функцию ОКРУГЛ программы Microsoft Excel. Выполните следующие действия, чтобы узнать ее английское имя. 1. Создайте новый файл Microsoft Excel 2021. 2. Введите в ячейку A1 значение 900,758. Введите в ячейку B1 формулу =ОКРУГЛ(А1;2). Она округляет число до указанного количества десятичных разрядов. 3. Завершите ввод формулы нажатием клавиши <Enter>. 4. Активизируйте ячейку B1. 5. Включите запись макроса, для чего выполните команду Запись макроса из группы Код вкладки ленты Разработчик. 6. Нажмите клавишу <F2>, а затем клавишу <Enter>.
Функции, определенные пользователем 159 7. Остановите запись. Теперь в редакторе VBA можно посмотреть код макроса (листинг 5.6, а). 8. Перейдите в среду VBA, нажав комбинацию клавиш <Alt>+<F11>. Листинг 5.6, а. Макрос определения названия функции в VBA Sub Макрос1() 'Макрос1 Макрос ActiveCell.FormulaR1C1 = "=ROUND(RC[-1],2)" Range("B1").Select End Sub Из листинга 5.6, а видно, что функция с русским названием ОКРУГЛ имеет английское название ROUND. Кроме того, здесь использована альтернативная система адресации, называемая стилем R1C1. В этой системе и строки, и столбцы обозначаются цифрами. Адрес ячейки B3 в такой системе будет выглядеть так: R3C2 (R=row=строка, C=column=столбец) Запись RC[-1] в листинге означает, что функция применена к значению, которое находится в той же строке и в столбце, стоящем слева. А теперь выполним аналогичный пример по записи макроса, но уже для динамического массива, созданного при помощи функции ПОСЛЕД. 1. Введите в ячейку A3 формулу =ПОСЛЕД(15;10;1;100). Она создаст динамический массив в диапазоне ячеек A3:J17, состоящий из последовательности целых чисел, начиная с 1, с шагом 100. 2. Завершите ввод формулы нажатием клавиши <Enter>. Будет сформирован динамический массив. 3. В ячейке A20 сформируем динамический массив уникальных (неповторяющихся) значений динамического массива A3:J17, для чего введем для этой ячейки в строке формул формулу: =УНИК(A3#). 4. Завершите ввод формулы нажатием клавиши <Enter>. Будет сформирован аналогичный динамический массив чисел, т. к. все значения исходного динамического массива являются уникальными. 5. Выполните запись макроса по вычислению формулы динамического массива в ячейке A20 так же, как записано в листинге 5.6, а. Результат записи макроса с динамическими массивами приведен в листинге 5.6, б. Листинг 5.6, б. Макрос определения названия функции динамического массива в VBA Sub Макрос2() ActiveCell.Formula2R1C1 = "=UNIQUE(R[-17]C#)" Range("A20").Select End Sub
160 Глава 5 Из листинга 5.6, б видно, что функция с русским названием УНИК имеет английское название UNIQUE. В отличие от предыдущего листинга, для активной ячейки ActiveCell используется свойство Formula2R1C1. Это свойство является комбинацией свойств Range.Formula2 и Range.FormulaR1C1. Оно возвращает или устанавливает значение типа Variant, представляющее собой формулу объекта в стиле R1C1 нотаций массива. Адрес ячейки А3, содержащей формулу динамического массива, в такой системе будет выглядеть так: R3C1 (R=row=строка, C=column=столбец) Запись =UNIQUE(R[-17]C# в листинге означает, что функция UNIQUE применена к динамическому массиву, задающая ячейка которого является ячейкой A3. Сохраните рабочую книгу с поддержкой макросов под именем Листинг_5.6.xlsm. Пользовательская функция с тремя аргументами Создайте определенную пользователем функцию с тремя аргументами: Цена_со_скидкой(n As Long, P As Double, Discount As Double) типа Double для расчета стоимости партии изделий со скидкой. 1. Создайте новый файл Microsoft Excel 2021. 2. Введите в ячейки информацию в соответствии с диапазоном ячеек A1:B3 согласно рис. 5.8. Обратите внимание, что ячейка 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
Функции, определенные пользователем 161 Цена_со_скидкой = SS - SS * Discount End Function Обратите внимание на то, что в заголовке процедуры описаны как ее параметры, так и сама функция. 7. Пользовательская функция вызывается как обыкновенная функция, только она принадлежит категории Определенные пользователем (см. рис. 5.1, г). Так что в ячейке В4 вызовите функцию Цена_со_скидкой, определенную пользователем, и задайте необходимые параметры функции (ячейки B1, B2, B3) — появится результат (см. рис. 5.8). В НИМАНИЕ ! Обратите внимание, что на рис. 5.8 был открыт листинг, созданный в предыдущей версии программы Microsoft Excel, и программа в формуле пользовательской функции отобразила автоматически оператор неявного пересечения @. Вводить его самостоятельно в строку формул при вызове функции не нужно. При желании его можно удалить вручную, если вы уверены, что неявные пересечения отсутствуют и формула работает правильно. 8. Сохраните созданную книгу с поддержкой макросов под именем Листинг_5.7_ Функция_с_3_параметрами.xlsm. Рис. 5.8. Результат работы программы Создание собственной категории Редактор Visual Basic for Applications позволяет не только создавать собственные функции, которые автоматически попадают в категорию Определенные пользователем, но и перемещать функции в другие категории и даже создавать собственные категории. Рассмотрим вопрос создания своей категории на примере функции dRound. 1. Создайте новый файл Microsoft Excel 2021. В ячейку A1 введите число, содержащее знаки после запятой.
162 Глава 5 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1: Insert | Module (Вставить | Модуль). Создайте функцию Округлить, возвращающую значение типа Double (листинг 5.8). В коде используется функция рабочего листа ОКРУГЛ категории Математические, которая в коде VBA называется Round. Она предназначена для округления числа до заданного количества знаков после запятой. Обращение к функции в коде VBA осуществляется при помощи выражения Application.WorksheetFunction.Round. Листинг 5.8. Пользовательская функция для округления числа до ближайшего целого Function Округлить(S As Range) As Double Округлить = Application.WorksheetFunction.Round(S, 0) End Function 3. Обратитесь к функции Округлить, определенной пользователем, на листе рабочей книги. Эта функция автоматически попадает в категорию Определенные пользователем. При желании функцию, определенную пользователем, можно переместить в другую категорию — например, в категорию Финансовые, задав ей значение, равное 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.9). Листинг 5.10. Создание категории МОЯ_СОБСТВЕННАЯ_КАТЕГОРИЯ Sub МОЯ_СОБСТВЕННАЯ_КАТЕГОРИЯ() Application.MacroOptions _ Macro:="Округлить", _
Функции, определенные пользователем 163 Description:="Округление числа до ближайшего целого", _ Category:="МОЯ_СОБСТВЕННАЯ_КАТЕГОРИЯ" End Sub 5. Сохраните созданную книгу с поддержкой макросов под именем Листинг_5.8Листинг_5.10_Создание_собственной_категории.xlsm. Рис. 5.9. Диалоговое окно Вставка функции: вызов функции из пользовательской категории Функция без аргументов Рассмотрим пример создания пользовательской функции без аргументов, возвращающей строковое значение типа String с названием активного рабочего листа (листинг 5.11). 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+ <F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). Листинг 5.11. Функция без аргументов Function stroka() As String Stroka = ActiveSheet.Name End Function
164 2. Для запуска макроса нажмите кнопку Глава 5 . 3. При попытке вызвать эту функцию на рабочем листе для ячейки A1 появится сообщение о том, что она не имеет аргументов. Тем не менее она возвращает значение — имя текущего активного листа, в нашем случае это Лист1. 4. Сохраните книгу с поддержкой макросов под именем Листинг_5.11_Функция без аргументов.xlsm. Переименование рабочего листа Если вы не знаете, как написать код процедуры переименования листа, то включите запись макроса, переименуйте лист вручную и остановите запись. Макрорекордер сравнивают с магнитофоном, но магнитофон записывает звук во времени, а макрорекордер фиксирует только действия, но не контролирует время, так что при записи действий можно не торопиться. 1. Создайте новый документ с рабочим листом в Microsoft Excel 2021. Добавьте к документу еще один рабочий лист. 2. Переименуйте лист в РабочийЛист1 с использованием макрорекордера. 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
Функции, определенные пользователем 165 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 аргументами (числами (ячейками) или соразмерными диапазонами чисел (диапазонами ячеек), которые необходимо суммировать). 1. Создайте новый файл Microsoft Excel 2021. 2. Введите в ячейки A1:A4 различные числа, в том числе отрицательные. 3. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). В окне проекта он отобразится на уровне вашего приложения. 4. Для создания пользовательской функции выполните команду Insert | Procedure (Вставить | Процедура). В группе Type (Тип) диалогового окна Add Procedure (Добавить процедуру) выберите переключатель Function (Функция), определяющий создание функции, и назовите ее, например, Суммировать (листинг 5.14). Листинг 5.14. Функция с аргументом типа Range Function Суммировать(S As Range) As Double Суммировать = Application.WorksheetFunction.Sum(S) End Function 5. В ячейке С1 вызовите определенную пользователем функцию Суммировать. Задайте требуемый массив данных в виде диапазона A1:A4 (рис. 5.10). Для этого выделите массив при помощи «белого» крестика курсора — диапазон данных отобразится в диалоговом окне Аргументы функции в поле аргумента S. Функция выполнит вычисления и возвратит значение типа Double. 6. Сохраните книгу с поддержкой макросов под именем Листинг_5.14_Сумма.xlsm.
166 Глава 5 Рис. 5.10. Диалоговое окно Аргументы функции: указание диапазона значений Функция с массивом Создадим пользовательскую функцию, формирующую массив данных. В примере, приведенном далее, используется массив данных с названиями дней недели. В НИМАНИЕ ! Не забудьте, что при работе с массивами в версиях Excel, не поддерживающих работу с динамическими массивами, вместо клавиши <Enter> необходимо нажимать комбинацию клавиш <Ctrl>+<Shift>+<Enter>. При этом старые формулы массива, известные как устаревшие формулы массива, всегда возвращают результат фиксированного размера — он всегда переносится в одно и то же количество ячеек. Тем не менее этот инструмент может использоваться при работе с массивами. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). 2. Выполните команду Insert | Procedure (Вставить | Процедура). В группе Type (Тип) диалогового окна Add Procedure (Добавить процедуру) выберите переключатель Function (Функция), определяющий создание функции, и назовите ее, например: Массив_дней_недели. Эта функция (листинг 5.15) не имеет аргументов и возвращает значение типа Variant.
Функции, определенные пользователем 167 Листинг 5.15. Функция без параметров с массивом Function Массив_дней_недели() As Variant Массив_дней_недели = Array("Понедельник", "Вторник", "Среда", _ "Четверг", "Пятница", "Суббота", "Воскресенье") End Function 3. На рабочем листе в программе Microsoft Excel выделите семь смежных ячеек в строке и вызовите пользовательскую функцию Массив_дней_недели. 4. Закончите работу с массивами, нажав комбинацию клавиш <Ctrl>+<Shift>+ +<Enter>. Ячейки заполнятся названиями дней недели (рис. 5.11). Обратите внимание, что в строке формул формула с функцией Массив_дней_недели() заключена в фигурные скобки, свидетельствующие о применении устаревшего сочетания клавиш. Рис. 5.11. Работа с массивом: использование устаревших формул CSE (<Ctrl>+<Shift>+<Enter>) Этот строковый массив можно переписать в столбец, используя функцию =ТРАНСП(A1:G1). 5. Сохраните книгу с поддержкой макросов под именем Листинг_5.15_Массив.xlsm. Чем неудобно использование устаревших формул? При попытке удалить значение в ячейке массива фиксированного размера появится соответствующее сообщение (рис. 5.12). Чтобы удалить все данные массива, требуется выделить весь массив. Для преобразования устаревших формул массива в формулы динамического массива найдите первую ячейку в диапазоне массива, скопируйте текст формулы, удалите весь диапазон устаревшего массива, а затем повторно введите формулу в верхней левой ячейке. Перед обновлением устаревших формул массива до динамических формул массива следует помнить о некоторых счетных различиях между ними (см. далее).
168 Глава 5 Рис. 5.12. Ошибка, возникающая при удалении значения в ячейке массива данных Формулы динамического массива В функции, определенной пользователем, Массив_дней_недели() (см. листинг Листинг_5.15_Массив.xlsm) автоматически возвращается соответствующий массив дней недели длиной 7 ячеек без предварительного выделения диапазона данных для помещения в них возвращаемых значений. Теперь можно ввести формулу динамического массива или вызвать пользовательскую функцию в верхней левой Рис. 5.13. Работа с массивом: использование динамического массива
Функции, определенные пользователем 169 ячейке — в нашем случае это ячейка A1. При этом достаточно нажать кнопку OK или клавишу <Enter>. Формула автоматически распространится на оставшийся смежный диапазон данных B1:G1 (рис. 5.13). В этом случае Excel динамически определит размер диапазона вывода и поместит результаты в каждую ячейку в этом диапазоне. Удаление массива осуществляется через задающую ячейку — в нашем случае это A1. Удалить массив путем удаления значений в смежных ячейках с перенесенными формулами нельзя. После ввода формулы перенесенного массива при выделении любой ячейки в области переноса Excel выделит рамкой границу диапазона (рис. 5.14). Граница исчезнет при выборе ячейки за пределами области. При выборе ячейки F1 в области переноса формула будет видна в строке формул, но текст будет «фантомным» и недоступным для изменения. Рис. 5.14. Выделение границ динамического массива B1:H1 при указании ячейки F1 Функция с массивом в качестве аргумента В этом примере рассматривается динамический числовой массив, используемый в качестве аргумента пользовательской функции. При этом действия возможны с выборочными элементами массива, а не со всеми элементами. К примеру, можно сложить указанные элементы массива. Создадим пользовательские функции, работающие с массивами (листинги 5.16 и 5.17). 1. Создайте новый файл Microsoft Excel 2021, содержащий массив чисел. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). Выполните команду Insert | Procedure (Вставить | Процедура). В группе Type (Тип) диалогового окна Add Procedure (Добавить процедуру) выберите переключатель Function (Функция), определяющий создание функции, и назовите ее, например, dSum. Вторая пользовательская функция называется dMultiSum. В листинге 5.16 приведен их код. В первой функции (dSum) для использования массива список_аргументов() вводится ключевое слово ParamArray. Оно служит для задания функции с неопреде-
170 Глава 5 ленным количеством параметров — в нашем случае массива чисел. Выполним суммирование элементов массива с использованием оператора +. Листинг 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.15). При вызове функции аргументы (аргумент — элемент массива) из массива список_аргументов должны быть указаны при помощи ссылки на одну ячейку. При указании диапазона ячеек из массива возникнет ошибка. Рис. 5.15. Ввод аргументов функции dSum 4. Вторая функция (листинг 5.17) содержит два аргумента: диапазон ячеек DSum и массив L() с неопределенным количеством параметров. В программе также будет использована функция, аналогичная функции Microsoft Excel СУММ, вызываемая в VBA при помощи метода WorksheetFunction.Sum. Выполним суммирование элементов массива с использованием функции Microsoft Excel СУММ.
Функции, определенные пользователем 171 Листинг 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.16). Рис. 5.16. Ввод аргументов функции dMultiSum 6. Сохраните книгу с поддержкой макросов под именем Листинг_5.16_Листинг_5.17_ Аргумент_функции_массив.xlsm. Вызов функции из процедуры В этом примере демонстрируется вызов функции из процедуры, для чего мы создадим соответствующие макросы. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1: Insert | Module (Вставить | Модуль).
172 Глава 5 2. Для создания пользовательской функции выполните команду Insert | Procedure (Вставить | Процедура), в диалоговом окне Add Procedure (Добавить процедуру) выберите переключатель Function (Функция), определяющий создание функции, и назовите ее, например, rndrgb. Эта функция (листинг 5.18) возвращает целое случайное число от 0 до 255. Процедура colors закрашивает фон ячеек диапазона A1:J10 в случайный цвет с использованием функции RGB, при этом значения яркости красного, зеленого и синего определяются функцией rndrgb (рис. 5.17). Листинг 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) Next j Next i End Sub Public Function rndrgb() As Integer rndrgb = 255 * Rnd() End Function 3. Сохраните книгу с поддержкой макросов под именем Листинг_5.18_Закрашивание_ ячеек.xlsm. Рис. 5.17. Закрашивание ячеек в случайные цвета
Функции, определенные пользователем 173 Вызов процедуры, использующей функцию, из другой процедуры Рассмотрим вызов процедуры, использующей функцию, из другой процедуры, для чего создадим соответствующие макросы. 1. Создайте новый файл Microsoft Excel 2021. 2. На рабочем листе Microsoft Excel введите числовую информацию в несколько ячеек (рис. 5.18). 3. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). 4. Создайте пользовательскую функцию, назовите ее, например, dRound. Эта функция округляет значение, введенное в указанную ячейку, до целого, в противном случае ставит 0. Процедура Создание_клавиатурного_сокращения() управляет созданием клавиатурного сокращения <Ctrl>+<J>, вызывающего макрос Macro:= "CallFunction". В листинге 5.19 приведен соответствующий код. Рис. 5.18. Вызов процедуры, использующей функцию, из другой процедуры Листинг 5.19. Вызов процедуры, использующей функцию, из другой процедуры Sub Создание_клавиатурного_сокращения() Application.MacroOptions _ Macro:="CallFunction", _
174 Глава 5 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.18). Для проверки работы программы перейдите в ячейку с числовыми данными — например, в ячейку G6, и нажмите комбинацию клавиш <Ctrl>+<J>. Произойдет округление до целого. 6. Сохраните документ с поддержкой макросов под именем Листинг_5.19_Клавиатурное сокращение.xlsm. Запись названий формул Напишем несколько чисел и применим к ним ряд формул. Для этого создадим столбцы с названиями формул на русском и английском языках. 1. Создайте новый файл Microsoft Excel 2021. 2. На рабочем листе Microsoft Excel введите информацию в ячейки: в столбце A приведены числовые данные, а в столбце B — значения, рассчитанные по формулам с использованием данных столбца A (рис. 5.19). Рис. 5.19. Пример записи названий формул
Функции, определенные пользователем 175 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 выводятся локальные названия формул, а в столбец 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.
176 Глава 5 Вычисление определенного интеграла В этом примере мы напишем процедуры, вычисляющие интеграл. Геометрический смысл интеграла — расчет площади под кривой. Значение определенного интеграла мы вычислим тремя методами: прямоугольников, трапеций и Симпсона. Но сначала рассмотрим теорию этого вопроса. Методы численного интегрирования применяются тогда, когда невозможно или очень сложно найти первообразную для подынтегральной функции. Сущность численного интегрирования заключается в замене значения интеграла b ∫ f ( x)dx a величиной площади S криволинейной фигуры, ограниченной осью абсцисс Ox, кривой f ( x) , прямой x = a и прямой x = b . Для вычисления этой площади отрезок [a; b] необходимо разделить на n равных частей (рис. 5.20). Число n должно быть четным. Пронумеруйте точки деления от 0 до n так, чтобы первая точка x = a имела номер 0, а последняя точка x = b — номер n. Расстояние между соседними точками h = xi +1 − xi можно вычислить по формуле h = (b − a ) / n , а значение x — по формуле xi = a + ih . Рис. 5.20. Вычисление интеграла Тогда площадь криволинейной фигуры S можно представить как сумму площадей элементарных фигур Si : b ∫ f ( x)dx = S = ∑ S . a n i В свою очередь, площадь каждой элементарной криволинейной фигуры моделируется площадями фигур, которые легко вычислить: прямоугольником, трапецией и фигурой, ограниченной параболой.
Функции, определенные пользователем 177 Метод прямоугольников Одна сторона каждого прямоугольника равна h, а другая — f ( x) , тогда b n −1 n −1 ∫ f ( x)dx = ∑ f ( x ) ⋅ h = h ⋅ ∑ f (a + ih) . i i =0 a i =0 Обратите внимание на то, что суммируются n − 1 площадей прямоугольников. Метод трапеций Площадь элементарной фигуры заменяется площадью трапеции с высотой h и параллельными сторонами, равными соответственно f ( xi ) и f ( xi +1 ) . Тогда формула метода трапеции будет b n −1 ∫ f ( x)dx = ∑ S a i =0 i = 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 ∫ a f ( x)dx ≈ n −1 n−2 ⎞ h ⎛ ⋅ ⎜ f (a ) + f (b) + 4 ⋅ ∑ f ( xi ) + 2 ⋅ ∑ f ( xi ) ⎟ . 3 ⎝ i =1,3,5 i = 2,4,6 ⎠ Для этого метода принципиально важно, чтобы n было четным, иначе параболы построить будет невозможно. * * * Сравните результаты, полученные тремя методами, — число разбиений n должно быть одинаковым во всех трех формулах. Пусть необходимо вычислить интеграл 1,2 ∫ 0 3 xdx 1+ x 3 . Примите шаг вычислений: h = 0,1 . 1. Создайте новый файл Microsoft Excel 2021 и переименуйте лист Лист1, назвав его Интеграл.
178 Глава 5 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 (Функция), определяющий создание функции, и назовите ее, например, 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)
Функции, определенные пользователем 179 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) Next i СИМП = S * h / 3 End Function 7. В ячейку С3 введите формулу =d(B3), распространите ее до ячейки С15. В ячейку D3 введите формулу =C3*$H$1, распространите ее до ячейки D14. В ячейку E3 введите формулу =(C3+C4)*$H$1/2, распространите ее до ячейки Рис. 5.21. Пример вычисления интеграла
180 Глава 5 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.21. 10. Сохраните книгу с поддержкой макросов под именем Листинг_5.21_Интеграл.xlsm. Переключатели OptionButton Продолжите работу с предыдущим файлом. Создайте на рабочем листе три переключателя для изменения цвета ячеек, содержащих расчеты. 1. В группе Элементы управления вкладки ленты Разработчик откройте кнопку Вставить и в элементах управления Элементы ActiveX (см. рис. 1.24) выберите инструмент управления Переключатель , активизируйте его — курсор превратится в маленький черный крестик. С его помощью в рабочем поле Microsoft Excel нарисуйте переключатель. Как только вы закончите рисование, на листе появится кнопка OptionButton1, а в строке формул — запись: =ВНЕДРИТЬ("Forms. OptionButton.1";"") 2. Щелкните по созданной кнопке правой кнопкой мыши и в контекстнозависимом меню выберите команду Просмотреть код (рис. 5.22, а). Выбор этой команды обеспечивает переход в окно редактора 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
Функции, определенные пользователем 181 а б Рис. 5.22. Элемент ActiveX Переключатель: а — контекстно-зависимое меню внедренного переключателя; б — интерфейс программы с переключателями 4. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение СИНИЙ. 5. Создайте еще два переключателя: КРАСНЫЙ и ЗЕЛЕНЫЙ — и напишите для них макросы (листинги 5.22, б и в).
182 Глава 5 Листинг 5.22, б. Пример вызова переключателя КРАСНЫЙ Private Sub OptionButton2_Click() If OptionButton2 = True Then Worksheets("Интеграл").Range("C17:F19").Interior.Color = vbRed End If End Sub Листинг 5.22, в. Пример вызова переключателя ЗЕЛЕНЫЙ Private Sub OptionButton3_Click() If OptionButton3 = True Then Worksheets("Интеграл").Range("C17:F19").Interior.Color = vbGreen End If End Sub 6. Выйдите из режима конструктора, нажав кнопку Режим конструктора . Теперь выберите переключатель ЗЕЛЕНЫЙ на рабочем листе — макрос выполнит закрашивание (рис. 5.22, б). С ОВЕТ Помимо стандартных цветов языка Visual Basic: красного (vbRed), зеленого (vbGreen) и синего (vbBlue), в Visual Basic допускается задавать цвет через численные значения цветовой модели RGB — например: RGB(128, 0, 0), либо задействуя обширный список XlRgbColor Enumeration, использующий для обозначения цветов зарезервированные слова, — например: rgbAqua. 7. Сохраните книгу с поддержкой макросов под именем Листинг_5.21_Листинг_22_ Интеграл.xlsm.
ГЛАВА 6 Пользовательская форма VBA предоставляет разработчику не только возможность работы с ячейками, диапазонами ячеек, коррекцию рабочих листов и встроенных диалоговых окон, но и средства разработки собственных пользовательских форм. Пользовательская форма — это диалоговое окно, в котором можно разместить элементы управления, обеспечивающие программиста-пользователя средствами создания собственного интерфейса, наиболее приспособленного для решения конкретных задач. Создание форм средствами VBA Пользовательские формы UserForm в программе Microsoft Excel 2021 — это один из наиболее интересных инструментов языка VBA, используемых при разработке интерактивных приложений. С точки зрения VBA форма представляет собой объект UserForm, который, как и любой объект, имеет свои свойства, методы и события. В VBA пользовательская форма задает семейство (коллекцию) объектов, определяющее диалоговые окна. Формат этих окон использует стандартный интерфейс, поддерживаемый операционными системами типа Windows. В проекте может быть как одна, так и несколько форм. Форма UserForm Для того чтобы добавить форму в проект, выполните следующие шаги. 1. Запустите программу Microsoft Excel 2021 и откройте новую книгу. 2. Перейдите в среду VBA, выбрав на вкладке ленты Разработчик раздел Visual Basic. На экране откроется окно интегрированной среды разработки приложений Microsoft Visual Basic - Книга 1. Можно также нажать комбинацию клавиш <Alt>+<F11>.
184 Глава 6 Рис. 6.1. Пример новой пользовательской формы с отображением ее свойств 3. В меню Insert (Вставить) выполните команду UserForm — в проекте появится новая форма (рис. 6.1). Семейство форм Компоненты семейства UserForms представляют все загруженные формы приложения. Как и у всех семейств, у UserForms имеются свойства: Count (возвращает число компонентов в семействе) и Item (возвращает определенный компонент семейства), а также метод Add (добавляет к семейству новый компонент). Свойства формы Форма имеет много свойств, но наиболее важные базовые свойства — те, которые задают ее имя и текст, отображаемый в заголовке окна (табл. 6.1). При создании окна в заголовке записывается его стандартное название: UserFormN, где N — число, соответствующее порядковому номеру создаваемой формы. В поле окна проекта (на дереве структуры проекта) в папке Forms (Формы) при этом появится объект UserFormN.
Пользовательская форма 185 Кроме названия формы в строке заголовка имеется кнопка Закрыть, позволяющая закрыть форму 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 Отвечает за наличие вертикальных и/или горизонтальных полос прокрутки
186 Глава 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. Посмотрите и проанализируйте другие вкладки этого окна.
Пользовательская форма 187 Рис. 6.2. Диалоговое окно Options Методы формы Методы — это действия, которые могут быть выполнены над объектом VBA и, в частности, над объектом UserForm. Приведем наиболее известные методы формы (табл. 6.3). Таблица 6.3. Методы формы Метод Описание Show Отображает форму на экране Hide Скрывает форму Move Изменяет положение и размер формы PrintForm Печатает форму Load Загружает форму, генерирует событие инициализации формы Unload Генерирует появление событий QueryClose и Terminate Кроме того, для объектов наиболее часто используются методы Delete (Удалить), Clear (Очистить), Copy (Копировать), Save (Сохранить), Write (Запись). События формы События — это действия, распознаваемые объектом. Для события, распознанного объектом, можно запрограммировать отклик. События происходят в результате действия пользователя, выполнения какой-либо программной операции или какихто действий, выполняемых системой. Например, событием является щелчок левой кнопкой мыши на форме, кнопке или каком-либо ином объекте в окне формы.
188 Глава 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) и вывод в нем текста заготовки процедуры:
Пользовательская форма 189 Private Sub CommandButton1_Click() End Sub 3. Между строками шаблона процедуры введите только одну строку: UserForm1. Show — в соответствии с листингом 6.1. Не забудьте поместить в начале окна кода оператор Option Explicit. Листинг 6.1. Управление показом формы Private Sub CommandButton1_Click() UserForm1.Show End Sub Рис. 6.3. Заготовка процедуры для управления кнопкой 4. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение: ВЫЗОВ_ФОРМЫ. 5. Выйдите из режима конструктора, нажав кнопку Режим конструктора . Теперь щелкните на листе мышью на кнопке ВЫЗОВ_ФОРМЫ — пользовательская форма появилась (рис. 6.4). 6. Сохраните созданный документ с формой под именем Листинг_6.1_Кнопка_ вызова_формы.xlsm. Для этого необходимо выбрать команду Файл | Сохранить как и в раскрывающемся списке Тип файла диалогового окна Сохранение документа выбрать вариант сохранения файла: Книга Excel с поддержкой макросов.
190 Глава 6 Рис. 6.4. Кнопка для вызова формы Э ЛЕКТРОННЫЙ АРХИВ Листинг 6.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_6_Пользовательская_форма сопровождающего книгу электронного архива. Элементы управления В VBA имеется обширный набор встроенных элементов управления, являющихся объектами. Как и любые объекты, они обладают свойствами, методами и событиями. Элементы управления создаются при помощи панели элементов Toolbox, которая автоматически появляется при создании формы (рис. 6.5, а). П РИМЕЧАНИЕ Изначально на панели элементов Toolbox присутствуют не все элементы управления, можно добавить и другие. Для этого следует щелкнуть правой кнопкой мыши на панели элементов Toolbox и из появившегося контекстно-зависимого меню (рис. 6.5, б) выбрать команду Additional Controls (Дополнительные элементы управления). Появится диалоговое окно Additional Controls, из которого можно выбрать дополнительные элементы управления (рис. 6.5, в). Аналогично можно удалить элемент управления, выбрав из появившегося контекстнозависимого меню (см. рис. 6.5, б) команду Delete элемент_управления (Удалить элемент_управления). Можно также создать свой личный управляющий элемент со своим значком. Как только вы начнете изменять свойства формы, панель элементов Toolbox может исчезнуть. Для того чтобы возвратить панель на экран, следует вызвать ее команпадой View | Toolbox (Вид | Панель элементов) либо нажать кнопку Toolbox
Пользовательская форма 191 а б в Рис. 6.5. Этапы добавления элемента управления на панель:а, б — панель элементов Toolbox; в — диалоговое окно Additional Controls нели инструментов Standard (Стандартная). В табл. 6.5 приведены основные элементы управления, их англоязычные названия, используемые в VBA, и названия на русском языке, а также аналогичные элементы управления категории Элементы ActiveX, применяемые на рабочем листе Microsoft Excel, префиксы и соответствующие им кнопки панели элементов. У пользовательской формы нет специальной кнопки для создания элементов управления на панели инструментов Toolbox, но есть префикс. Обратите внимание, что названия кнопок элементов ActiveX представлены на русском языке, но сами элементы управления после создания имеют англоязычные названия. При этом панель элементов управления ActiveX и панель Toolbox совпадают не полностью. Таблица 6.5. Элементы управления панели элементов Toolbox и ActiveX Элемент управНазначение элеления ActiveX мента управления (название кнопки) на панели Toolbox Префикс Название элеменВид кнопки та управления на Toolbox на панели Toolbox — frm UserForm — Select Objects — Выбор объектов осуществляется Выбор объектов при помощи левой кнопки мыши —
192 Глава 6 Таблица 6.5 (окончание) Элемент управНазначение элеления ActiveX мента управления (название кнопки) на панели Toolbox Префикс Название элеменВид кнопки та управления на 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 — Команда Additional Controls
Пользовательская форма 193 Префиксы В табл. 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 2021 и создайте новую книгу. 2. На рабочем листе книги Microsoft Excel создайте командную кнопку Кнопка категории Элементы ActiveX (см. рис. 1.24) для вызова формы. 3. Щелкните на кнопке правой кнопкой мыши и в контекстно-зависимом меню выберите команду Просмотреть код (см. рис. 1.25). 4. Между строками шаблона процедуры введите строку: UserFormSqr.Show (здесь форма имеет новое имя): Private Sub CommandButton1_Click() UserFormSqr.Show End Sub 5. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение: Решение квадратного уравнения.
194 Глава 6 6. В меню Insert (Вставить) редактора Visual Basic for Applications выберите объект 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
Пользовательская форма 195 Таблица 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"
196 Глава 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).
Пользовательская форма 197 Таблица 6.7. Свойства элемента управления CommandButton Свойство Описание Name Обозначает имя кнопки, используемое в программе для обращения Caption Задает описывающий текст, появляющийся в центре кнопки для идентификации или описания BackColor Устанавливает цвет фона кнопки, выбирается из предложенной таблицы — например, &H00C0C000& Enabled Делает кнопку доступной или недоступной для нажатия Font Позволяет задать гарнитуру, начертание и размер шрифта MousePointer Позволяет задать вид курсора, принимающего вид при наведении на кнопку, выбирается из списка предложенных. Например, курсор в виде белого креста задается так: fmMousePointerSizeWE Picture Загружает рисунок для отображения на кнопке 1. Запустите Microsoft Excel 2021 и создайте новую книгу. 2. В меню Insert (Вставить) редактора Visual Basic for Applications выберите объект 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).
198 Глава 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
Пользовательская форма 199 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 2021 и создайте новую книгу. 2. В меню Insert (Вставить) редактора Visual Basic for Applications выберите объект 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 —
200 Глава 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. Назначьте этому прямоугольнику способность вызова формы ПЕРСОНАЛИЗАЦИЯ ДАННЫХ, установив курсор на прямоугольнике, нажав правую кнопку мыши и выбрав команду Назначить макрос. Сразу появится шаблон:
Пользовательская форма 201 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.
202 Глава 6 Рис. 6.9. Пример ввода данных при помощи формы Элементы управления OptionButton и Frame Следующие два элемента управления рассмотрим на примере пользовательской формы (рис. 6.10). Рис. 6.10. Пример формы с элементами управления OptionButton и Frame
Пользовательская форма 203 Элемент управления 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 для ввода данных. Как это сделать, было показано в разд. «Командная кнопка для вызова формы» ранее в этой главе.
204 Глава 6 4. Теперь, чтобы на листе рабочей книги Microsoft Excel появились данные, необходимо написать обработчики событий для управляющих кнопок пользовательской формы Заменить текст и Закрыть форму. Обработчик событий для первой кнопки приведен в листинге 6.6 (обратите внимание: здесь показана работа оператора With). Листинг 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
Пользовательская форма 205 End With End Sub На рабочем листе появились надписи, выполненные с помощью формы (рис. 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
206 Глава 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 необходимо создать кнопку категории Элементы ActiveX (свойство Name: CmdColor, свойство Caption: ЦВЕТОВАЯ МОДЕЛЬ RGB). Код этой кнопки:
Пользовательская форма 207 Private Sub CmdColor_Click() UserFormColor.Show End Sub 3. В проекте разместите на форме UserFormColor (см. рис. 6.12) элементы управления согласно табл. 6.11. Таблица 6.11. Элементы управления для формы UserFormColor Свойство Max Свойство BackColor — 255 Red &H000000FF& ScrollBarGreen — 255 Green&H0000FF00& ScrollBar ScrollBarBlue — 255 Blue&H00FF0000& TextBox TextRed — — — TextBox TextGreen — — — TextBox TextBlue — — — Label Label1 Red — — Label Label2 Green — — Label Label3 Blue — — Объект Свойство Name Свойство Caption UserForm UserFormColor Цвет ScrollBar ScrollBarRed ScrollBar 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) TextBlue = 255 Label3.BackColor = RGB(0, 0, 255) End Sub
208 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() 'Обработчик события, выполняемый при вводе значения в текстовое поле, 'отвечающего за зеленый цвет Dim green As Byte If Not IsNumeric(TextGreen) Then TextGreen = 0 green = TextGreen ScrollBarGreen.Value = green Глава 6
Пользовательская форма 209 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
210 Глава 6 Элемент управления ListBox Элемент управления ListBox (Список) позволяет организовать в поле ввода список и создается кнопкой (см. табл. 6.5). Приемы работы с элементом управления ListBox (Список) рассмотрим на следующем примере. 1. Запустите программу Microsoft Excel 2021 и создайте новую книгу с двумя рабочими листами. На них мы создадим пользовательскую форму, в которую будут помещаться данные из таблицы, расположенной на листе Лист2, а также кнопку вызова формы на рабочем листе Лист1. При запуске формы при возникновении события «выбор записи из списка» будет выполнена процедура — обработчик события lst_MultiCol_Change() (см. листинг 6.9). 2. На листе Лист2 в ячейки А1:С7 введите данные в соответствии с рис. 6.13 (или какие-либо другие аналогичные). Рис. 6.13. Пример данных 3. В меню Insert (Вставить) редактора Visual Basic for Applications выберите объект 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 Закрыть форму —
Пользовательская форма 211 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 9. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение: ВЫЗОВ ФОРМЫ.
212 Глава 6 Рис. 6.15. Данные из таблицы листа Лист2 помещены в форму и заносятся в строку 1 листа Лист1 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 Private Sub cmd_Cancel_Click() Unload Me End Sub
Пользовательская форма 213 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 1. На рабочем листе для вызова формы frm_Calculate создайте кнопку категории Элементы ActiveX (свойство Name: CommandButton1, свойство Caption: ВЫЗОВ КАЛЬКУЛЯТОРА). Код этой кнопки:
214 Глава 6 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
Пользовательская форма 215 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_
216 Глава 6 Элемент управления Image Элемент управления Image (Изображение) позволяет внедрять на форму изображение. Создается этот элемент кнопкой (см. табл. 6.5). Рассмотрим приемы работы с элементом управления Image (Изображение). 1. Запустите программу Microsoft Excel 2021 и создайте новую книгу. 2. В ячейки А1:С16 листа рабочей книги введите данные в соответствии с рис. 6.17 (или другие аналогичные). Рис. 6.17. Пример данных о платежах 3. В меню Insert (Вставить) редактора Visual Basic for Applications выберите объект UserForm — в проекте появится новая форма. 4. Разместите на форме UserForm1 (рис. 6.18, а) элементы управления, приведенные в табл. 6.14. Настройте свойства элементов управления Height, Width, Top, Left таким образом, чтобы с формой было удобно работать и элементы управления с надписями полностью помещались на форме. Для элемента управления Image (Изображение) (см. рис. 6.18, а) установите свойства в соответствии с рис. 6.18, б. По нажатии кнопки с символом многоточия свойства Picture открывается диалоговое окно (рис. 6.18, в) загрузки рисунка Load Picture. Рисунок необходимо подготовить заранее, продумать его размеры, а также размеры и формат файла его хранения. 5. На листе рабочей книги создайте командную кнопку категории Элементы ActiveX для вызова формы. 6. Щелкните на кнопке правой кнопкой мыши и в контекстно-зависимом меню выберите команду Просмотреть код (см. рис. 1.25). В появившейся заготовке редактора VBA между строками шаблона процедуры введите строку: UserForm1. Show.
Пользовательская форма 217 а Рис. 6.18. Использование элемента управления Image: а — рисунок в форме; б — его свойства; в — диалоговое окно Load Picture б в
218 Глава 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 Закрыть форму 7. Из того же контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение ВЫЗОВ ФОРМЫ. 8. Наберите для формы код из листинга 6.11. П РИМЕЧАНИЕ Код можно набирать в редакторе макросов непосредственно единым целым, либо последовательно выполнять двойной щелчок на управляющих элементах формы и вводить соответствующие обработчики события. С точки зрения программиста, лучше все делать последовательно, постепенно отлаживая код, настраивая свойства и проверяя работу программы. При «ручном» режиме увеличивается вероятность появления ошибок, связанных с неправильным вводом. Листинг 6.11. Пример формы с рисунком Private Sub UserForm_Initialize() 'Инициализация формы With cmb_Choose .AddItem ("Подоходный налог") .AddItem ("НДС") .AddItem ("Налог на прибыль") End With End Sub Private Sub cmd_Apply_Click() 'Обработчик события по нажатию кнопки Включить подсветку Dim r As Range Dim c As Control Dim str As String
Пользовательская форма 219 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 9. Попробуйте запустить форму. В процессе заполнения формы появится сообщение компилятора 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 Case Is = "opt_Blue" Цвет_подсветки = 34 End Select End Function Запустите форму из рабочего листа книги Microsoft Excel, нажав на кнопку ВЫЗОВ ФОРМЫ. Результат работы макросов показан на рис. 6.19. 10. Сохраните созданный документ с формой под именем Листинг_6.11_Image.xlsm.
220 Глава 6 а б Рис. 6.19. Форма с рисунком (а) и результат форматирования таблицы (б) Элемент управления SpinButton Элемент управления SpinButton (Счетчик) позволяет внедрять на форму счетчик и создается кнопкой (см. табл. 6.5). Счетчик, в отличие от полосы прокрутки, не имеет ползунка и служит для выбора нужного значения при нажатии кнопок уменьшения или увеличения текущего значения. Он часто используется в комбинации с элементом управления Textbox (Текстовое поле).
Пользовательская форма 221 Основные свойства элемента управления 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 2021 и создайте новую книгу. 2. На листе рабочей книги в ячейки А1:D8 введите данные в соответствии с рис. 6.20 (или другие аналогичные). Рис. 6.20. Пример текстовых данных для работы с формой
222 Глава 6 3. На листе рабочей книги создайте командную кнопку категории Элементы ActiveX для вызова формы. 4. Из контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение ВЫЗОВ ФОРМЫ, а для свойства Name: cmd_Show. 5. Щелкните на кнопке правой кнопкой мыши и в контекстно-зависимом меню выберите команду Просмотреть код (см. рис. 1.25). Между строками шаблона появившейся процедуры введите строку frm_Club.Show. Таким образом, при нажатии кнопки, расположенной на рабочем листе, будет вызываться пользовательская форма frm_Club, хранящаяся в редакторе VBA. 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 Убрать данные из формы CommandButton cmd_New Ввод новых данных CommandButton cmd_Save Сохранить данные CommandButton cmd_Delete Удалить активную запись CommandButton cmd_Quit Закрыть форму 8. Для формы в редакторе кода, вызываемом командой View | Code (Вид | Окно кода), напишите код в соответствии с листингом 6.12.
Пользовательская форма Рис. 6.21. Пример формы для работы с данными Листинг 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 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 223
224 Глава 6 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.21). 9. Сохраните созданный документ с формой под именем Листинг_6.12_SpinButton.xlsm. Элемент управления TabStrip Элемент управления TabStrip (Набор вкладок) позволяет работать с несколькими (см. табл. 6.5). Переход от вкладки к вкладке вкладками, создается он кнопкой осуществляется щелчком на соответствующем ярлычке. Создадим пользовательскую форму с интерфейсом для ввода новых данных о количестве и цене для разных рабочих листов, по которым будут рассчитаны итоговые значения (рис. 6.22).
Пользовательская форма 225 1. Запустите программу Microsoft Excel 2021 и создайте новую книгу. 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. В меню Insert (Вставить) редактора VBA выберите объект UserForm — в проекте появится новая форма. При использовании элемента управления TabStrip (Набор вкладок) первоначально по умолчанию создается набор, состоящий из двух вкладок (рис. 6.23, а). Новые вкладки добавляются с помощью команды New Page (Новая страница), выбираемой из контекстно-зависимого меню (рис. 6.23, б). Для того чтобы отобразить это меню, выделите ярлычок Tab1 либо Tab2 и нажмите на нем правой кнопкой мыши. 8. Выберите из контекстно-зависимого меню команду Rename (Переименовать) и переименуйте: Tab1 — в ПРЕДПРИЯТИЯ, Tab2 — в КЛИЕНТЫ, Tab3 — в ПОСТАВЩИКИ, Tab4 — в СМЕЖНИКИ. 9. Разместите на форме UserForm1 (рис. 6.24) элементы управления, настраивая их свойства согласно табл. 6.17. Задайте свойства Height, Width, Top, Left так, чтобы с формой было удобно работать и элементы управления с надписями полностью помещались на форме.
226 Глава 6 а б Рис. 6.23. Набор вкладок (а) и контекстно-зависимое меню (б) Таблица 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 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
Пользовательская форма 227 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. Рис. 6.24. Пример формы для расчета итоговой цены
228 Глава 6 Элементы управления CheckBox и MultiPage Элемент управления CheckBox (Флажок) позволяет выбрать несколько значений из (см. табл. 6.5). Элемент управления нескольких возможных и создается кнопкой MultiPage (Набор страниц) позволяет реализовать многостраничные диалоговые окна и создается кнопкой (см. табл. 6.5). Переход от страницы к странице осуществляется по щелчку мыши на соответствующем ярлычке. Создадим пользовательскую форму по управлению отображением данных с возможностью показа формул, сетки, ярлычков листов, масштаба и других свойств. 1. Запустите программу Microsoft Excel 2021 и создайте новую книгу. 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. В меню Insert (Вставить) редактора VBA выберите объект UserForm — в проекте появится новая форма UserForm1. 9. Разместите на форме UserForm1 (рис. 6.25, а) элемент управления MultiPage (Набор страниц) со страницами Page1 (Показ), Page2 (Комментарий), Page3 (Масштаб) и другие элементы управления, приведенные в табл. 6.18. Таблица 6.18. Элементы управления на форме с вкладками MultiPage Объект Свойство Name Свойство Caption UserForm UserForm1 ОТОБРАЖЕНИЕ ДАННЫХ MultiPage MultiPage — Для страницы Page1 (Caption — Показ) CheckBox CheckBox1 Формулы CheckBox CheckBox2 Сетка CheckBox CheckBox3 Ярлычки_листов
Пользовательская форма 229 Таблица 6.18 (окончание) Объект Свойство Name Свойство Caption Для страницы Page2 (Caption — Комментарий) OptionButton OptionButton1 Нет OptionButton OptionButton2 Индикатор OptionButton OptionButton3 Комментарий и индикатор Для страницы Page3 (Caption — Масштаб) ScrollBar ScrollBar1 — Label lbl_Zoom — а б Рис. 6.25. Пользовательская форма со страницами MultiPage в режиме конструктора (а); настройка шрифта для элемента управления OptionButton (б)
230 Глава 6 По умолчанию элементом управления MultiPage создаются две страницы. Новые страницы добавляются с помощью команды New Page (Новая страница), выбираемой из контекстно-зависимого меню, появляющегося при щелчке правой кнопкой мыши на ярлычках Page1 или Page2 элемента управления MultiPage (Набор страниц). 10. На странице Page1 (Показ) разместите три элемента управления категории CheckBox. 11. На странице Page2 (Комментарий) разместите три элемента управления: OptionButton1, OptionButton2, OptionButton3. Может получиться, что при вводе текстовых обозначений элементов управления OptionButton текст может иметь неудобный для просмотра размер шрифта. Для вызова диалогового окна Шрифт в окне свойств Properties элемента управления OptionButton1 щелкните левой кнопкой мыши на свойстве Font. Справа появится кнопка с многоточием (рис. 6.25, б). Нажав на эту кнопку, вы увидите диалоговое окно Шрифт, в котором сможете установить необходимые параметры шрифта. 12. На страницу Page3 (Масштаб) поместите элемент управления ScrollBar. Объект ScrollBar не имеет свойства Caption, и на нем нельзя сделать надпись. Не забудьте для этого элемента управления задать свойство Min — минимальное значение полосы прокрутки (50) и свойство Max — максимальное значение полосы прокрутки (например, 100, 200 или 500). Также укажите начальное значение свойства Value (в нашем случае 51). Создайте элемент управления Label (Подпись) для управления текстом подписи, отвечающей за масштаб. 13. Поместите на форму кнопку CommandButton1, в свойство Caption которой введите значение Закрыть_форму. 14. Для формы в редакторе кода, вызываемом командой View | Code (Вид | Окно кода), напишите код в соответствии с листингом 6.14. В коде приведены обработчики событий по установке флажков, выбору переключателей, а также обработчики событий по нажатию командных кнопок. Для управления способом отображения комментариев и индикаторов служит свойство Application.DisplayCommentIndicator (объекта Application), которое может принимать одну из констант перечисления XlCommentDisplayMode: xlCommentAndIndicator — отображать комментарий и значок комментария все время, xlCommentIndicatorOnly — отображать только значок комментария, комментарий виден при проведении указателем мыши через ячейку, xlNoIndicator — не отображать значок комментария и сам комментарий. При перемещении полосы прокрутки изменяется масштаб отображения документа, такая возможность появляется при использовании свойства 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 Private Sub OptionButton3_Click() Application.DisplayCommentIndicator = xlCommentAndIndicator End Sub Private Sub ScrollBar1_Change() ActiveWindow.Zoom = ScrollBar1.Value lbl_Zoom.Caption = ScrollBar1.Value & "% Масштаб" End Sub 231
232 Глава 6 15. Перейдите из редактора кода в приложение Microsoft Excel. Запустите форму на исполнение при помощи кнопки ВЫЗОВ ФОРМЫ, расположенной на листе Лист1. Результат работы программы приведен на рис. 6.26. 16. Сохраните созданный документ с формой под именем Листинг_6.14_MultiPage.xlsm. Рис. 6.26. Пример работы пользовательской формы по отображению данных Элемент управления RefEdit Элемент управления RefEdit (Ссылка) позволяет ссылаться из формы на любой (см. табл. 6.5). диапазон данных электронной таблицы и создается кнопкой Создадим пользовательскую форму по форматированию области ячеек, указываемых при помощи мыши непосредственно из пользовательской формы. 1. Запустите программу Microsoft Excel 2021 и создайте новую книгу. 2. На листе рабочей книги Microsoft Excel введите произвольные числа (рис. 6.28). 3. В меню Insert (Вставить) редактора VBA выберите объект UserForm — в проекте появится новая форма UserForm1. Ее назначение — преобразование выделенного диапазона ячеек в текстовые данные, целочисленные и числа с точностью двух цифр после запятой. 4. Разместите на форме UserForm1 элемент управления RefEdit (Ссылка) и другие элементы управления, приведенные в табл. 6.19. Внимательно настройте все необходимые свойства, в том числе для самой пользовательской формы.
Пользовательская форма 233 Таблица 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 используется свойство возвращающее значение, представляющее собой формат кода ячейки диапазона. Далее следуют процедуры обработчиков событий, выполняемых при выборе переключателей OptionButton. Для каждого из трех переключателей (текст, целое число, вещественное число с двумя знаками после запятой) приведена своя обработка события. NumberFormat, Рис. 6.27. Пользовательская форма в режиме конструктора (в центре); настройка свойства элемента управления RefEdit (справа)
234 Глава 6 Листинг 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. Для выбора диапазона ячеек на форме ФОРМАТИРОВАНИЕ ЯЧЕЕК в поле выбора диапазона данных нажмите кнопку , расположенную в правом углу поля (рис. 6.28, а). Пользовательская форма временно исчезнет, и появится поле ввода диапазона ячеек. Выделите при помощи нажатой правой кнопки мыши данные на рабочем листе, они будут автоматически отображаться в виде ссылки в поле элемента управления RefEdit (рис. 6.28, б). Закончив выделение, нажмите на кнопке возврата в пользовательскую форму. Результат работы программы приведен на рис. 6.28, в.
Пользовательская форма 235 а б в Рис. 6.28. Использование элемента RefEdit: а — кнопка перехода в режим выбора диапазона ячеек; б — выбранный диапазон; в — результат форматирования ячеек 10. Сохраните созданный файл с пользовательской формой под именем Листинг_6.15_ RefEdit.xlsm. Элемент управления ToggleButton Элемент управления Выключатель (ToggleButton — в VBA), создаваемый на рабочем листе, представляет собой кнопку с фиксацией и может находиться в двух состояниях: либо в нажатом, либо в отпущенном. Элемент управления Выключатель (ToggleButton) на пользовательской форме в VBA создается кнопкой (см. табл. 6.5), а на панели элементов ActiveX в Excel — кнопкой . Рассмотрим работу выключателя на простом примере. 1. Запустите программу Microsoft Excel 2021 и создайте новую книгу. 2. На листе рабочей книги создайте элемент управления Выключатель категории Элементы ActiveX. 3. Из контекстно-зависимого меню внедренной кнопки выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение име-
236 Глава 6 ни кнопки ВЫКЛЮЧАТЕЛЬ (рис. 6.29, а). Если на значке Выключатель прорисовываются две кнопки, то на рабочем листе видна только одна, которая может находиться либо в нажатом, либо в отжатом состоянии. 4. Щелкните на кнопке правой кнопкой мыши и в контекстно-зависимом меню выберите команду Просмотреть код (рис. 6.29, б). Используя заготовку, напишите код управления выключателем (листинг 6.16). Обратите внимание, что код записывается на листе Лист1, создание отдельного модуля не требуется. Не забудьте поместить в начале окна кода оператор Option Explicit. а б Рис. 6.29. Элемент управления ToggleButton1: а — окно свойств; б — контекстно-зависимое меню
Пользовательская форма 237 Листинг 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 2021 и откройте новую книгу. 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, а). а б Рис. 6.30. Элемент управления New Group: а — создание нового значка; б — его контекстно-зависимое меню
238 Глава 6 7. В диалоговом окне Customize Control (Настроить элемент управления) загрузите новый значок и с помощью команды Load Picture (Загрузить рисунок) назовите элемент управления, например, МОЯ НОВАЯ ГРУППА (рис. 6.31, б) — результат налицо (рис. 6.31, в). Обратите внимание, что ваш рисунок должен быть небольшого размера, иначе он не поместится на значке. Пример пользовательского элемента управления приведен в файле NewGroup_Глава 6.xlsm. а б в Рис. 6.31. Этапы создания новой группы: а — открытие диалогового окна Customize Control; б — задание имени рисунка; в — новый элемент управления на панели Toolbox Элементы управления формы Ранее уже были рассмотрены панели элементов управления и объекты — отдельные элементы управления. В этой главе мы также познакомились с работой элементов управления, размещаемых на пользовательской форме в VBA. На рис. 6.32, а показаны две панели элементов управления: Элементы ActiveX и Элементы управления формы, предназначенные для автоматизации рабочих листов Microsoft Excel. Рассмотрим теперь элементы управления на панели Элементы управления формы (табл. 6.20). а б Рис. 6.32. Вставка элемента управления формы в Microsoft Excel: а — панель инструментов Элементы управления формы; б — контекстно-зависимое меню полосы прокрутки
Пользовательская форма 239 Таблица 6.20. Элементы управления на панели Элементы управления формы Кнопка Название Кнопка Поле со списком Флажок Счетчик Список Переключатель Группа Подпись Полоса прокрутки Для элемента управления панели Элементы управления формы можно назначить макрос, выполняемый по нажатию на элементе, но написать обработчик события с применением VBA, как, например, для элемента категории ActiveX, нельзя. Также при помощи элементов управления формы можно ссылаться на данные ячеек без использования VBA (этот прием будет рассмотрен в следующем разделе). Редактировать элемент управления можно только в режиме конструктора , а управлять с его помощью — только выйдя из этого режима (см. рис. 6.32, а). Элемент управления Полоса прокрутки Работу элемента управления Полоса прокрутки продемонстрируем на примере построения таблицы умножения чисел от 1 до 10. Автоматизируйте процесс изменения числа десятков n от 0 до 9, чтобы иметь возможность просматривать произведения чисел от 10*n+1 до 10*(n+1). Создадим таблицу умножения двумя способами: на основе устаревших технологий вычисления значения по формуле в одной ячейке и растягивания ее на необходимый диапазон данных и с применением динамического заполнения таблицы вычисленными значениями с использованием динамического массива. 1. Создайте новый файл Microsoft Excel 2021. 2. Введите в ячейку А1 название: ТАБЛИЦА УМНОЖЕНИЯ. По умолчанию надпись набрана гарнитурой Calibri, кеглем 11. Измените шрифт на Arial и кегль на 14, используйте полужирное начертание.
240 Глава 6 3. Вторую строку оставьте свободной. 4. В ячейку L1 введите n, а в ячейку L2 — значение 0. Завершите ввод щелчком мыши на кнопке в строке формул. 5. В группе Элементы управления вкладки ленты Разработчик выберите значок . Вставить 6. На панели инструментов Элементы управления формы (см. рис. 6.32, а) выберите значок Полоса прокрутки и нарисуйте ее около ячейки M2, растягивая курсором по диагонали при нажатой левой кнопке мыши. 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. Завершите ввод щелчком мыши на кнопке в строке формул. а Рис. 6.33. (Часть 1 из 2) Работа с элементом управления: а — настройка его свойств
Пользовательская форма 241 б в Рис. 6.33. (Часть 2 из 2) Работа с элементом управления: б — использование элемента управления для прокрутки таблицы умножения на рабочем листе; в — таблица умножения создана с использованием динамического массива
242 Глава 6 12. В ячейку А5 введите формулу: =A4+1, и выполните автозаполнение формулы на ячейки A6:A13. 13. В ячейку В4 введите формулу: =B$3*$A4, и скопируйте ее на диапазон B4:K13. В результате получаем таблицу умножения. Проверьте работу полосы прокрутки, выйдя из режима конструктора (рис. 6.33, б). А теперь рассмотрим, как создать таблицу умножения при помощи динамического массива. 1. Создайте новый файл Microsoft Excel 2021 и выполните предыдущие шаги п. 2–12. 2. Установите курсор в ячейку В4. Эта ячейка будет задающей в создаваемом нами динамическом массиве. В строку формул введите знак = и выделите диапазон ячеек A4:A13, затем — знак умножить * и выделите второй массив: B3:K3. По завершении набора формулы нажмите клавишу <Enter>. Диапазон ячеек B4:K13 будет представлять собой динамический массив, который также станет обновляться при нажатии на стрелки полосы прокрутки (рис. 6.33, в). 3. Сохраните созданные документы с формой под именами Листинг_6.17_ Таблица_умножения.xlsm и Листинг_6.18_ТУ_динамический_массив.xlsm. Для этого необходимо выполнить команду Файл | Сохранить как и в раскрывающемся списке Тип файла диалогового окна Сохранение документа выбрать вариант сохранения файла: Книга Excel с поддержкой макросов.
ГЛАВА 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 и служат для обозначения автофигуры. У объекта Shape имеется интересная особенность: многие его свойства устанавливаются опосредованно — через свойства объектов нижнего уровня иерархии. Например, для задания цвета, типа и толщины линии границы объекта Shape следует
244 Глава 7 Таблица 7.1. Примеры констант объектов автофигур семейства Shapes Тип объекта Значение Описание msoShapeRectangle 1 Прямоугольник msoShape24pointStar 95 24-конечная звезда 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 Волна воспользоваться свойством Line, которое возвращает объект LineFormat. А свойство OnAction объекта Shape назначает фигуре макрос, выполняющийся по щелчку на фигуре. Среди методов объекта Shape можно отметить IncrementLeft, IncrementTop и IncrementRotation, сдвигающие фигуру на указанное количество пунктов по горизонтали, вертикали и поворачивающие объект. Тип объекта msoShapeRectangle (прямоугольник) с заливкой (Fill) Объект Shape, имеющий тип msoShapeRectangle (прямоугольник), строится из левого верхнего угла при заданных ширине и высоте. 1. Создайте новый файл Microsoft Excel 2021. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1: Insert | Module (Вставить | Модуль). Не забудьте поместить в начале окна кода оператор Option Explicit. В листинге 7.1 приведен код программы, которая на активном листе рисует прямоугольник и закрашивает его двухцветной градиентной заливкой методом
Программирование объектов Shape, инфографики и фракталов 245 от центра при помощи константы 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(255, 255, 0) .BackColor.RGB = RGB(5, 170, 15) .TwoColorGradient msoGradientFromCenter, 4 End With End Sub Рис. 7.1. Пример нарисованного прямоугольника 3. Для выполнения процедуры воспользуйтесь командой Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). Запустить макили нажатием клавиши <F5>. рос на выполнение можно также кнопкой Обратите внимание, что при выделении нарисованного объекта на ленте появляется вкладка Формат, содержащая средства рисования. 4. Сохраните созданный документ с фигурой под именем Листинг_7.1_Закрашенный_ прямоугольник.xlsm. Для этого выберите команду Файл | Сохранить как и в рас-
246 Глава 7 крывающемся списке Тип файла диалогового окна Сохранение документа укажите вариант сохранения файла: Книга Excel с поддержкой макросов. Э ЛЕКТРОННЫЙ АРХИВ Листинг 7.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_7_Графические_элементы сопровождающего книгу электронного архива. Тип объекта msoConnectorCurve (соединительная линия) Рассмотрим пример с использованием соединительной линии — объекта Shape, имеющего тип msoConnectorCurve в виде кривой. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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, инфографики и фракталов 247 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 2021. Перейдите в среду 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
248 Глава 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 2021. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1.
Программирование объектов Shape, инфографики и фракталов 249 В листинге 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(28, 157, 13) .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. Пример двух кубов, закрашенных заливкой по образцу
250 Глава 7 Рисование линии: метод AddLine Рассмотрим пример построения линии. Новая линия в семействе Shapes добавляется методом AddLine. Синтаксис метода AddLine: AddLine(BeginX, BeginY, EndX, EndY) где аргументами являются координаты точек, определяющих линию (отрезок). 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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, инфографики и фракталов 251 2. Убедитесь, что курсор находится на одной из строк введенного макроса. Для выполнения процедуры нажмите клавишу <F5>. 3. Сохраните созданный документ с фигурой под именем Листинг_7.5_Линия.xlsm. Тип объекта msoShapeSmileyFace Рассмотрим пример построения объекта Shape, имеющего тип msoShapeSmileyFace. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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. Пример рисования смайлика
252 Глава 7 Свойство Name Рассмотрим еще один пример создания автофигуры — типа «волна» (тип msoShapeWave) с заливкой голубым цветом и обводкой линией, состоящей из круглых точек (константа msoLineRoundDot). Автофигуре присваивается имя Name. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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 = "Голубая волна". Если выделить на рабочем листе созданную фигуру, то имя отобразится в поле имя. Можно изменить цвет заливки квадрата .Fill.ForeColor.RGB, задав его датчиком случайных чисел Rnd: .Fill.ForeColor.RGB = RGB(Rnd * 256, Rnd * 256, Rnd * 256)
Программирование объектов Shape, инфографики и фракталов 253 3. Сохраните созданный документ с автофигурой под именем Листинг_7.7_Свойство_ Name.xlsm. Стрелка К уже знакомым нам линии и соединительной линии добавим стрелку, у которой есть свойства длины, ширины, вида начала и конца. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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
254 Глава 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, инфографики и фракталов 255 Таблица 7.4 (окончание) Имя msoArrowheadLengthMixed Значение -2 Описание Только возвращает значение, указывает на комбинацию других состояний Метод FillFormat.OneColorGradient Рассмотрим пример преобразования заливки всех графических объектов, расположенных на рабочем листе, в одноцветную градиентную заливку при помощи метода OneColorGradient(Style, Variant, Degree) объекта FillFormat. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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 2021. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. В листинге 7.10 приведен код программы, рисующей текстовый фрейм с надписью с использованием объекта TextFrame. Тип фигуры задается при помощи константы msoShapeSun. Для настройки параметров текста, надписи, цвета шрифта и расположения в текстовом фрейме применяются различные свойства и методы. Свойства фрейма TextFrame.MarginBottom, TextFrame.MarginLeft, TextFrame.
256 Глава 7 и TextFrame.MarginTop задают соответственно нижнее, левое, правое и верхнее поля. Также для созданной фигуры (текстового фрейма) применена заливка при помощи настройки свойств объекта Fill. MarginRight Листинг 7.10. Пример использования объекта TextFrame Public Sub Текстовый_фрейм() Set myDocument = Worksheets(1) With myDocument.Shapes.AddShape(msoShapeSun, _ 150, 150, 150, 150).TextFrame 'Создание фигуры - солнца и настройка свойств текстового фрейма .Characters.Text = "Солнце" .Characters.Font.Color = rgbRed .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 Рис. 7.9. Пример фрейма в виде солнца с текстом
Программирование объектов Shape, инфографики и фракталов 257 2. Запустите макрос Текстовый_фрейм на исполнение. На листе Лист1 появится текстовый фрейм в виде солнца с надписью внутри (рис. 7.9). 3. Сохраните созданный документ с фигурой под именем Листинг_7.10_Текстовый_ фрейм.xlsm. Замените в коде фигуру в виде солнца msoShapeSun, 150, 150, 150, 150 на овал msoShapeOval, 180, 200, 280, 130, и вы получите надпись в овале. Тип фигуры msoShapeHeart (сердце) с заливкой (Fill) Рассмотрим пример построения сердца — объекта типа Shape, при помощи числового обозначения 21, означающего константу msoShapeHeart. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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) .BackColor.RGB = RGB(170, 170, 250) .TwoColorGradient msoGradientHorizontal, 1
258 Глава 7 End With End Sub 2. Убедитесь, что курсор находится на одной из строк введенного макроса. Для выполнения процедуры нажмите клавишу <F5>. 3. Сохраните созданный документ с фигурой под именем Листинг_7.11_Сердце.xlsm. Метод Group Рассмотрим пример с методом группировки объектов после их создания: облака, элемента блок-схемы и трапеции. Здесь, как и в предыдущем примере, константы обозначены числами: 179 означает константу msoShapeCloud, 14 — msoShapeCube, 3 — msoShapeTrapezoid. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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(14, 150, 10, 100, 100).Name = "Cube" .AddShape(3, 300, 10, 100, 100).Name = "Trap" With .Range(Array("Cloud", "Cube", "Trap")).Group .Fill.Patterned msoPattern90Percent
Программирование объектов Shape, инфографики и фракталов 259 'Заливка применена ко всем объектам группы .GroupItems(1).Fill.PresetTextured msoTextureBouquet .GroupItems(2).Fill.PresetTextured msoTexturePapyrus 'Применение текстуры к указанным объектам из группы End With End With End Sub 2. Убедитесь, что курсор находится на одной из строк введенного макроса. Для выполнения процедуры нажмите клавишу <F5>. 3. Сохраните созданный документ с фигурой под именем Листинг_7.12_Группировка_ объектов.xlsm. Создание выноски с текстовым фреймом Рассмотрим пример построения объекта в виде информационного значка (здесь задействована константа msoShapeActionButtonInformation) с выноской, содержащей текстовый фрейм. К фигурам будет применена градиентная заливка. Для текста в текстовом фрейме указан размер шрифта, а размер текстового фрейма подбирается автоматически с использованием свойства .TextFrame.AutoSize. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. В листинге 7.13 приведен код программы, рисующей знак информации (рис. 7.12). Далее создается выноска с текстовой надписью. При этом вертикальная линия, отделяющая текст от выноски, отсутствует (.Accent = msoFalse). Рис. 7.12. Пример значка информации с выноской
260 Глава 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 2021. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. В листинге 7.14 приведен код программы, рисующей три цилиндра при помощи выдавливания овалов (рис. 7.13). Сначала нарисованы овалы, затем к ним применено свойство ThreeD. Листинг 7.14. Пример использования свойства ThreeD Sub Рисуем_в_3D() Set myDocument = Worksheets(1) With myDocument.Shapes
Программирование объектов Shape, инфографики и фракталов 261 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.
262 Глава 7 Частичное и полное удаление фигур Рассмотрим способы частичного и полного удаления фигур, расположенных в рабочей книге. 1. Создайте новый файл Microsoft Excel 2021 с несколькими фигурами (рис. 7.14, а) либо воспользуйтесь файлом Листинг_7.15_Листинг_7.16_Фигуры.xlsm. Обратите внимание, что на рабочем листе находятся графические элементы разного типа: файлы векторной графики в формате CDR (msoPicture) и SVG (msoGraphic), графическая схема SmartArt (msoSmartArt), знак «умножить» (msoAutoShape), а также командная кнопка и текст в ячейке. На рис. 7.14, а, выделен рисунок в масштабируемом векторном формате SVG, поддержка этого формата появилась в версии Microsoft Excel 2021. Для того чтобы вставить рисунок 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, инфографики и фракталов 263 а б Рис. 7.14. Работа с графикой в Microsoft Excel 2021: а — различные типы графики на рабочем листе; б — вставка SVG-значка из библиотеки
264 Глава 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 2021. Перейдите в среду 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, инфографики и фракталов 265 Рис. 7.15. Пример овала, созданного по нажатию на кнопку 4. Запустите макрос на исполнение либо непосредственно в VBA, либо при помощи нажатия на созданную кнопку на рабочем листе. Овал будет нарисован с подгонкой размеров под заданный диапазон ячеек и окрашен цветом, используемым по умолчанию. 5. Сохраните созданный документ с фигурой под именем Листинг_7.17_Управление_ овалом.xlsm. Создание собственных элементов инфографики Средства VBA для работы с различного рода графикой позволяют создавать собственные инфографические элементы и тем самым облегчать понимание пользователем представляемой ему информации за счет цветового оформления фигур, добавления средств трансформации объектов в виде поворота и масштабирования. Программа Microsoft Excel мощно усилила способы работы с графикой, добавляя возможность обработки векторных форматов, преобразования фигуры в кривые, применения различных фильтров и эффектов. В последней версии программы стало возможным выполнять профессиональные операции обработки растровой и векторной графики, не прибегая к специализированным пакетам.
266 Глава 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
Программирование объектов Shape, инфографики и фракталов 267 tr(i).TextFrame.Characters.Text = st(i) tr(i).TextFrame.Orientation = 5 Next i End Sub 1. Запустите макрос на исполнение либо непосредственно в Visual Basic, либо при помощи нажатия на созданную кнопку на рабочем листе. Будет нарисован инфографический элемент со всеми цветами радуги (рис. 7.16). При желании можно изменить узлы выбранного треугольника, используя группу Вставка фигур вкладки Формат: нажать на кнопке с раскрывающимся списком Изменить фигуру и выбрать команду Начать изменение узлов. 2. Сохраните созданный документ с фигурой под именем Листинг_7.18_ Инфографика.xlsm. Рис. 7.16. Инфографический элемент в виде радуги Фракталы В конце XX века стали весьма популярными математические труды о фракталах. Поэтому, рассматривая рисование отрезков средствами VBA Microsoft Excel 2021, мы не смогли пройти мимо создания фракталов. Еще несколько лет назад вся графика разделялась на растровую и векторную, но в последнее время фрактальную графику стали рассматривать отдельно. Фрактальная графика — графика, описанная математическими формулами комплексных переменных. Ее главная особенность — самоподобие. На международных научных конгрессах часто продают открытки и показывают видеофильмы, содержащие фрактальные изображения гор, воды, различных компьютерных узоров.
268 Глава 7 Что же такое фракталы? Термин «фрактал» введен Бенуа Мандельбротом в 1977 году в его фундаментальной работе «Фракталы: форма, случайность и размерность». Согласно Мандельброту, слово «фрактал» происходит от лат. fractus — дробный и frangere — ломать, что отражает суть фрактала как «изломанного», нерегулярного множества. Мандельброт дал строгое математическое определение фрактала как хаусдорфова множества, размерность которого строго больше топологической размерности. Он, однако, так и не был удовлетворен этим определением, поскольку оно не включает в себя некоторые множества, рассматриваемые многими математиками как фракталы. Фрактал — математическое множество, обладающее свойством самоподобия, т. е. однородности в различных шкалах измерения (любая часть фрактала подобна всему множеству целиком). В математике под фракталами понимают множества точек в евклидовом пространстве, имеющие дробную метрическую размерность (в смысле Минковского или Хаусдорфа), либо метрическую размерность, отличную от топологической, поэтому их следует отличать от прочих геометрических фигур, ограниченных конечным числом звеньев. Так, линия имеет размерность 1, круг — 2, а размерность фрактала находится между 1 и 2. Классический пример фрактала — множество Мандельброта, описываемое формулой Z n +1 = KZ n2 + 1, где K = const. Существует большое число математических объектов, называемых фракталами (например, треугольник Серпинского, снежинка Коха, кривая Пеано, множество Мандельброта и лоренцевы аттракторы). Фракталы с большой точностью описывают многие физические явления и образования реального мира: горы, облака, турбулентные (вихревые) течения, корни, ветви и листья деревьев, кровеносные сосуды, далеко не соответствующие простым геометрическим фигурам. Самоподобные и самоаффинные фракталы строят простым и быстрым алгоритмом итераций отображений подобия. Среди изображений, построенных компьютером, встречаются естественно выглядящие картины растений и деревьев. Тип данных, определенный пользователем В примере, который описывает построение фракталов, мы используем тип данных, определенный пользователем. Сначала кратко рассмотрим теоретические основы. Тип данных, определенный пользователем, — это способ создания структурного типа (иногда программисты называют такой тип записью). Запись — это совокупность нескольких элементов, каждый из которых может иметь свой тип. Элемент записи называется полем. Запись является частным случаем класса, в котором не определены свойства и методы. Синтаксис типа данных, определенных пользователем: [Private | Public]Type ИмяПеременной ИмяЭлемента [(Индексы)] As Тип [ИмяЭлемента [(Индексы)] As Тип] ... End Type
Программирование объектов Shape, инфографики и фракталов 269 Здесь:  Public — служит для описания определяемых пользователем типов данных, которые доступны для всех процедур во всех модулях всех проектов;  Private — служит для описания определяемых пользователем типов данных, которые доступны только в модуле, в котором выполняется описание;  ИмяПеременной — имя типа данных, определяемого пользователем;  ИмяЭлемента — имя элемента, определяемого пользователем;  Индексы — размерности элемента, являющегося массивом. Для задания массива, размеры которого могут изменяться, указываются только скобки. Этот аргумент имеет следующий синтаксис: [Нижний То] Верхний [ , [Нижний То] Верхний]  Тип — тип данных элемента. Поддерживаются типы: Byte, Boolean, Integer, Decimal, Long, LongLong, LongPtr, Currency, Single, Double, Date, String (для строк переменной длины), String*длина (для строк фиксированной длины), Object, Variant, а также другой, определяемый пользователем тип или объектный тип. Фракталы из треугольников В приведенном далее примере фракталы построены с помощью рекурсивных (вызывающих сами себя) процедур, которые можно создать в VBA: Function и Sub. 1. Создайте новый файл Microsoft Excel 2021. Добавьте к рабочей книге пустой рабочий лист, на котором будет отрисована фрактальная графика. Перейдите в среду 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 Точка
270 Глава 7 а б Рис. 7.17. (Часть 1 из 2) Фракталы из треугольников: а — один; б — один и один из вершины
Программирование объектов Shape, инфографики и фракталов 271 в г Рис. 7.17. (Часть 2 из 2) Фракталы из треугольников: в — один и три из вершины; г — вариант Size = 1000
272 Глава 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, инфографики и фракталов 273 Фракталы из многоугольников 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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 из 2) Фракталы из многоугольников: а — одна звезда; б — одна звезда и одна из вершины
274 Глава 7 в г Рис. 7.18. (Часть 1 из 2) Фракталы из многоугольников: в — много звезд; г — шестиугольники
Программирование объектов Shape, инфографики и фракталов 275 д Рис. 7.18. (Часть 1 из 2) Фракталы из многоугольников: д — девятиугольники Фракталы из четырехугольников У четырехугольника концы отрезков соединяются, вместо квадратов появляются простые линии, и поэтому для создания таких фракталов предлагается другая программа. 1. Создайте новый файл Microsoft Excel 2021. Добавьте к рабочей книге пустой рабочий лист, на котором будет отрисована фрактальная графика. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1: Insert | Module (Вставить | Модуль). Не забудьте поместить в начале окна кода оператор Option Explicit. В листинге 7.20 приведен код программы, выполняющей построение вложенных четырехугольников, а на рис. 7.19, а показан фрактал из разных четырехугольников.
276 Глава 7 а б Рис. 7.19. Фракталы из четырехугольников: а — вложенные четырехугольники; б — структура из четырехугольников
Программирование объектов Shape, инфографики и фракталов 277 Листинг 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
278 Глава 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 — вычисления выполняются при запросе пользователя;
280 Глава 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 — преобразует измерения из сантиметров в пункты;
Работа с ячейками и областями 281  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 — другой стиль ссылок).  Абсолютный адрес ячейки — это просто ссылка на ячейку, которая не изменяется при копировании содержащей ее формулы. Чтобы сделать адрес (ссылку) ячейки абсолютным, следует ввести знак доллара ($) перед его компонентами: буквой столбца и номером строки.
282 Глава 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, столбец (столбцы) и строку (строки), которые содержатся в обозначенном диапазоне;
Работа с ячейками и областями 283  Columns, Rows — возвращают объекты типа Range, представляющие собой столб- цы и строки, из которых состоит диапазон;  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, представляющее собой адрес диа- пазона;  Formula — возвращает или устанавливает значение типа Variant, представляю- щее собой неявно пересекающуюся формулу объекта в нотации ячейки A1. Это свойство заменяется на свойство Formula2 для динамических массивов, но поддерживается новой версией Microsoft Excel в целях обратной совместимости;  Formula2 — возвращает или устанавливает значение типа Variant, представляю- щее собой формулу объекта в нотации массива A1;  FormulaArray — возвращает или устанавливает формулу массива диапазона. Возвращает (или может быть задано) одну формулу или массив Visual Basic. Изменить часть созданного массива нельзя.
284 Глава 8 Методы объекта Range Приведем основные методы объекта Range:  AutoFit — автоматически подбирает ширину столбца или высоту строки так, чтобы в ячейке помещались введенные данные;  Clear — очищает диапазон ячеек от значений, формул и форматирования;  ClearComments, ClearContents, ClearFormats и ClearNotes — очищают во всех ячейках обозначенного диапазона комментарии, формулы, форматирование и заметки, в том числе звуковые;  Copy — копирует диапазон в другой диапазон или в буфер обмена;  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 2021. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль).
Работа с ячейками и областями 285 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") 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 с поддержкой макросов.
286 Глава 8 Э ЛЕКТРОННЫЙ АРХИВ Листинг 8.1, а также все последующие сохраненные листинги этой главы, вы найдете в папке Глава_8_Работа_с ячейками_и_областями сопровождающего книгу электронного архива. Выделение последней ячейки в диапазоне Рассмотрим пример с использованием свойства Range.Address объекта Range. Его синтаксис: Range.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo) Здесь:  RowAbsolute — необязательный логический параметр. Если значение параметра равно True или он опущен, то возвращается абсолютная ссылка на строку;  ColumnAbsolute — необязательный логический параметр. Если значение пара- метра равно True или он опущен, то возвращается абсолютная ссылка на столбец;  ReferenceStyle — необязательный параметр, задающий стиль ссылок. Допусти- мы два значения: xlA1 и xlR1C1. Если значение равно xlА1 или опущено, то возвращается ссылка в формате А1;  External — необязательный логический параметр, задающий тип ссылки;  RelativeTo — необязательный параметр. Если RowAbsolute и ColumnAbsolute рав- ны False, а ReferenceStyle — xlR1C1, необходимо установить начальную точку для относительной ссылки. Этот аргумент определяет начальную ячейку диапазона, относительно которой производится адресация. Выполните следующие действия. 1. Создайте новый файл Microsoft Excel 2021. На рабочем листе создайте диапазон данных, содержащий, например, текст, число, дату, время. Мы будем использовать диапазон данных 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
Работа с ячейками и областями 287 End With MsgBox "Последняя ячейка диапазона данных " & _ ActiveCell.Address, vbInformation End Sub 4. Убедитесь, что курсор находится на одной из строк введенного кода. Для запуска макроса нажмите кнопку . После запуска макроса, действительно, оказалась выделенной последняя ячейка в диапазоне, даже если она не содержит никакого значения (рис. 8.2), при этом диапазон определен как прямоугольная табличная форма. Рис. 8.2. Пример выделения последней ячейки диапазона данных 5. Сохраните документ с поддержкой макросов под именем Листинг_8.2_Последняя_ ячейка_диапазона_данных.xlsm. Свойство Range.End Рассмотрим пример с использованием свойства Range.End для нахождения ячейки, означающей конец области данных, содержащий диапазон-источник. 1. Создайте новый файл Microsoft Excel 2021. Нам понадобится таблица с заполненными числовыми данными — к примеру, для первых пяти строк столбцов A:I. Также отступите на строку вниз и в строке 7 введите другие числовые данные. Таким образом, у нас будут два рабочих диапазона: A1:I5 и A7:I7. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль).
288 Глава 8 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 4. Убедитесь, что курсор находится на одной из строк введенного кода. Для запуска макроса нажмите клавишу <F5>. Последняя ячейка диапазона данных, содержащего ячейку B1 по направлению сверху вниз, — $B$5 (рис. 8.3). 5. Сохраните документ с поддержкой макросов под именем Листинг_8.3_Последняя_ ячейка_в_определяемом_диапазоне.xlsm. Рис. 8.3. Пример выделения последней ячейки в столбце B для диапазона данных, содержащего B1 Выделение ячеек с формулами Рассмотрим выделение всех ячеек, содержащих формулы на указанном рабочем листе Лист1, и применим к выделению полужирное начертание шрифта.
Работа с ячейками и областями 289 1. Создайте новый файл Microsoft Excel 2021 и введите данные в соответствии с рис. 8.4, а. Данные для значений Остаток рассчитываются как Доход – Расход. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). а б Рис. 8.4. Поиск ячеек с формулами: а — исходные данные; б — результат работы программы 3. Напишите программу, в которой выделяются полужирным значения для найденных ячеек, содержащих формулы (листинг 8.4, а). Для определения таких ячеек используется константа xlCellTypeFormulas метода SpecialCells. В методе возвращается объект типа Range, представляющий собой все формульные ячейки. Листинг 8.4, а. Пример выделения ячеек с формулами Sub Найти_ячейки_с_формулами() On Error GoTo M
290 Глава 8 With Лист1 .Activate .Cells.SpecialCells(xlCellTypeFormulas).Select Selection.Font.Bold = True End With Exit Sub M: MsgBox Err End Sub 4. Воспользуйтесь для запуска макроса кнопкой . После запуска макроса, действительно, оказались выделенными ячейки с формулами (рис. 8.4). 5. Сохраните документ с поддержкой макросов под именем Листинг_8.4_Выделение_ ячеек_с_формулами.xlsm. Выделение используемого диапазона данных Создайте в предыдущей рабочей книге еще один модуль — Module2. Добавьте еще одну возможность и выделите рабочий диапазон для всего рабочего листа при помощи свойства Worksheet.UsedRange (листинг 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. В гла-
Работа с ячейками и областями 291 ве 2 уже было подробно описано это свойство. Если значение свойства равно xlColorIndexNone, то ячейка не окрашивается. 1. Создайте новый файл Microsoft Excel 2021 и введите данные в соответствии с рис. 8.5: в ячейки с А1 по L1 введите названия месяцев с января по декабрь, а ниже — соответствующие кварталы. Рис. 8.5. Пример выделения объединенных ячеек 2. Объедините ячейки А1:С1, D1:F1, G1:I1, J1:L1. Для этого выделите их, нажмите на выделении правой кнопкой мыши и выберите команду Формат ячеек. В открывшемся диалоговом окне перейдите на вкладку Выравнивание и в области Отображение установите флажок объединение ячеек. 3. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). 4. Напишите программу, в которой выделяются зеленым цветом объединенные ячейки (листинг 8.5). Используемый диапазон рабочего листа проверяется на наличие объединенных ячеек при помощи свойства 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. Убедитесь, что курсор находится на одной из строк введенного кода. Восполь. зуйтесь для запуска макроса кнопкой
292 Глава 8 6. После запуска макроса, действительно, оказались выделенными объединенные ячейки (см. рис. 8.5). 7. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_8.5_Цвет_фона_для_ячеек.xlsm. Выделение по условию Часто требуется из множества чисел выбрать значения по условию — например, большие либо равные 100. Рассмотрим пример на выбор значений. 1. Создайте новый файл Microsoft Excel 2021 и введите числовые данные в соответствии с рис. 8.6. Рис. 8.6. Пример выделения по условию 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). 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
Работа с ячейками и областями 293 4. Для выполнения процедуры воспользуйтесь командой Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). После запуска макроса, действительно, оказались выделенными ячейки, значения в которых больше либо равны 100 (см. рис. 8.6). 5. Сохраните документ с поддержкой макросов под именем Листинг_8.6_ По_условию.xlsm. Удаление символов из ячеек Пусть в рабочей книге имеются ячейки с данными, содержащими черточки, точки и нули (- . 0). Требуется из множества таких данных убрать эти лишние символы. 1. Создайте новый файл Microsoft Excel 2021 и введите данные в соответствии с рис. 8.7, а. Обратите внимание, что все данные — цифровые. а б Рис. 8.7. Удаление заданных символов: а — исходные данные; б — результат выполнения макроса 2. Перейдите в среду VBA (нажав клавиши <Alt>+<F11>) и добавьте к проекту модуль с помощью команды Insert | Module (Вставить | Модуль). 3. Напишите программу, в которой из множества данных убираются черточки, точки и нули (листинг 8.7). В этой программе используется функция Mid, которая считывает из строки заданное количество символов, начиная с заданной позиции, и возвращает строку, состоящую из считанных символов. В нашем случае из строки каждый раз считывается один символ, т. е. фактически осуществляется посимвольный просмотр строки.
294 Глава 8 Листинг 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 S.Value = Stroka Stroka = "" Next S End Sub 4. Убедитесь, что курсор находится на одной из строк введенного кода. Для запуска макроса нажмите клавишу <F5> — не забудьте предварительно выделить ячейки, поскольку макрос воздействует именно на выделенные ячейки. После запуска макроса указанные символы были удалены из ячеек (рис. 8.7, б). 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_8.7_Убрать символ_из_ячейки.xlsm. Убираем текст Немного изменим предыдущий пример — пусть в рабочей книге имеются данные, содержащие цифры и текст, и нам требуется убрать текст, оставив цифры. 1. Создайте новый файл Microsoft Excel 2021 и введите данные в соответствии с рис. 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)
Работа с ячейками и областями 295 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. Для запуска макроса нажмите кнопку — не забудьте предварительно выделить ячейки, поскольку макрос воздействует именно на выделенные ячейки. а б Рис. 8.8. Удаление текстовых символов из ячеек: а — исходные данные; б — результат удаления После запуска макроса в соседнем столбце записывается результат, где текстовые данные удалены (рис. 8.8, б). 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_8.8_Лишний_текст.xlsm. Имена и фамилии Вот еще один пример на разделение информации в ячейке. Здесь используется свойство Range.Offset, которое возвращает объект типа Range — диапазон ячеек, смещенный относительно заданного на величины, обозначенные в аргументах. Его синтаксис: Range.Offset(RowOffset, ColumnOffset) Здесь:  RowOffset — целое число, указывающее сдвиг по строкам;  ColumnOffset — целое число, указывающее сдвиг по столбцам.
296 Глава 8 Пусть в рабочей книге в столбце зафиксированы фамилии и имена — разделите фамилии и имена, поместив их в отдельные столбцы. 1. Создайте новый файл Microsoft Excel 2021 и введите данные (фамилии и имена) в соответствии с рис. 8.9. Рис. 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 4. Убедитесь, что курсор находится на одной из строк введенного кода. Для выполнения процедуры нажмите клавишу <F5> — не забудьте предварительно выделить ячейки, поскольку макрос воздействует именно на выделенные ячейки. После запуска макроса все фамилии и имена были разделены (рис. 8.9). А теперь рассмотрим, как, наоборот, сцепить текстовые данные в столбцах B и C, применив для этого современную функцию МАССИВВТЕКСТ(массив; [формат]), возвращающей текстовое представление массива. 1. В уже созданной рабочей книге добавьте новый рабочий лист Лист2 и перенесите на него содержимое столбцов B и C.
Работа с ячейками и областями 297 2. Перейдите в среду VBA (<Alt>+<F11>) и в уже созданном модуле Module1 напишите макрос, использующий функцию рабочего листа ARRAYTOTEXT для соединения фамилий и имен (листинг 8.9, б). Листинг 8.9, б. Пример соединения фамилий и имен функцией Sub Макрос1() ActiveCell.FormulaR1C1 = "=ARRAYTOTEXT(RC[-2]&"" ""&RC[-1])" End Sub 3. Перейдите на ячейку C1. Запустите макрос в VBA на исполнение. Функция передаст текстовые значения ячеек A1 и B1 без изменений и запишет их в ячейку C1. В строке формул будет отображено выражение =МАССИВВТЕКСТ(A1&" "&B1). Для раздельного представления имени и фамилии добавлен пробел. 4. Ячейка C1 будет выделена зеленой рамкой, подведите курсор этому выделению и нажмите на нем левой кнопкой мыши. Оставшиеся данные в ячейках C2:C6 будут заполнены автоматически (рис. 8.10). Рис. 8.10. Пример соединения фамилий и имен 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_8.9_Фамилия_имя.xlsm. Метод Delete В ячейки можно не только вводить текст, но и удалять его из них (метод Delete), да еще и не просто в ячейках, а в ячейках со сдвигом вправо, влево, вниз и вверх. 1. Создайте новый файл Microsoft Excel 2021. Заполните рабочий лист информацией, а потом начните ее стирать в конкретных ячейках.
298 Глава 8 2. Перейдите в среду VBA (<Alt>+<F11>), создайте модуль и напишите макрос (листинг 8.10). Листинг 8.10. Пример удаления информации со сдвигом Sub Удалить_ячейки() Range("A3").Delete xlShiftUp Range("A4").Delete xlShiftToLeft End Sub 3. Воспользуйтесь для запуска макроса кнопкой . Происходит не просто удаление информации в ячейках — при помощи констант xlShiftUp и xlShiftToLeft заданы сдвиги, чтобы поставить на место удаленных ячеек указанные ячейки. Так, содержимое ячейки А3 удалено и на ее место сдвигается содержимое ячейки A4. Затем в ячейку А4 переносится значение ячейки B4. 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_8.10_Удаление_ячеек.xlsm. Метод Clear Стирать информацию можно с помощью не только метода Delete, но и Clear. 1. Создайте новый файл Microsoft Excel 2021. Заполните рабочий лист информацией, а потом начните ее очищать в конкретных ячейках. 2. Перейдите в среду VBA (<Alt>+<F11>), создайте модуль и напишите макрос (листинг 8.11). Листинг 8.11. Пример стирания информации Sub Очистить_форматирование_и_значение() Range("B9").Clear End Sub 3. Воспользуйтесь для запуска макроса кнопкой . Так как при ссылке на диапазон ячеек используется простая запись Range(...) без указания рабочего листа, то для корректной работы макроса активным должен быть рабочий лист с имеющимися данными в требуемом диапазоне. 4. Сохраните документ с поддержкой макросов под именем Листинг_8.11_Очистка_ ячеек.xlsm. Данная запись справедлива и для динамического массива, при этом для удаления массива должна быть указана задающая ячейка.
Работа с ячейками и областями 299 Метод 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 2021. Заполните таблицу данными либо воспользуйтесь готовой таблицей из файла Microsoft Excel PersonalMonthlyBudget1.xlsx, который можно выбрать из имеющихся в программе файлов по нажатии кнопки Файл | Создать | Личный бюджет на месяц. 2. Так как этот файл сохранен в формате XLS, пересохраните его как файл с поддержкой макросов. Перейдите в среду VBA (<Alt>+<F11>), создайте модуль и напишите макрос в соответствии с листингом 8.13. Листинг 8.13. Скрытие столбца таблицы Sub Скрыть_столбец() Worksheets("Личный бюджет на месяц").Columns("C").Hidden = True End Sub 3. Для запуска макроса нажмите кнопку . В результате работы макроса заданный столбец таблицы окажется скрытым. 4. Сохраните документ с поддержкой макросов под именем Листинг_8.13_Скрыть_ ячейки. Копирование и специальная вставка Теперь осуществим привычные действия пользователя — копирование и специальную вставку для ячеек указанного диапазона, используя методы VBA Range.Copy и Range.PasteSpecial.
300 Глава 8 1. Создайте новый файл Microsoft Excel 2021. Заполните таблицу числовыми данными. Здесь мы осуществим копирование таблицы и специальную вставку значений ячеек в новое место, указываемое пользователем. 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. Для запуска макроса нажмите кнопку . В результате работы макроса заданный диапазон таблицы (A1:B2) будет скопирован в другое место (A3:B4). 4. Сохраните документ с поддержкой макросов под именем Листинг_8.14_ Копирование_диапазона.xlsm. Поиск минимума и максимума в диапазоне 1. Создайте новый файл Microsoft Excel 2021. Заполните таблицу числовыми данными. Здесь мы выполним поиск минимума и максимума в заданном диапазоне. 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 Next r
Работа с ячейками и областями 301 Cells(5, 1).Value = min Cells(5, 2).Value = max End Sub 3. Для запуска макроса нажмите кнопку . В результате работы макроса будет осуществлен поиск минимума и максимума. Эти значения будут помещены в ячейки A5 и B5 соответственно (рис. 8.11). 4. Сохраните документ с поддержкой макросов под именем Листинг_8.15_Поиск_ минимума_и_максимума.xlsm. Рис. 8.11. Поиск минимаксных значений Поиск минимума и максимума в динамическом массиве Продолжим работу с файлом Листинг_8.15_Поиск_минимума_и_максимума.xlsm. Скопируем диапазон чисел, набранный вручную, на новый рабочий лист, преобразуя его в динамический массив. Применим к нему встроенные функции Microsoft Excel для поиска максимума и минимума: НАИБОЛЬШИЙ и НАИМЕНЬШИЙ, а также напишем аналогичные функции в редакторе VBA для проверки расчетов. 1. Откройте созданный файл Листинг_8.15_Поиск_минимума_и_максимума.xlsm. Вставьте новый рабочий лист и переименуйте его в Динамический массив. Установите курсор левой кнопки мыши в ячейку A1 созданного листа. В строке формул напишите знак = и скопируйте при помощи левой кнопки мыши диапазон значений A1:C3 листа Лист1. В строке формул должна получиться запись =Лист1!A1:C3. Нажмите клавишу <Enter> или кнопку Ввод в строке формул. Будет создан динамический массив копированием диапазона значений (рис. 8.12). 2. Рассчитаем максимальное значение динамического массива при помощи функции НАИБОЛЬШИЙ, которая возвращает k-е наибольшее значение в множестве дан-
302 Глава 8 ных (например пятое наибольшее). Для этого установите курсор мыши в ячейке A5 и вызовите диалоговое окно функции НАИБОЛЬШИЙ, находящейся в категории Статистические (рис. 8.13, а). Задайте аргументы функции согласно рисунку, обратите внимание, что здесь не указан массив как диапазон ячеек, а используется выражение A1#. Результат поиска максимума показан на рис. 8.13, б. Рис. 8.12. Динамический массив создан копированием а б Рис. 8.13. Поиск максимума в динамическом массиве: а — диалоговое окно функции НАИБОЛЬШИЙ; б — результат расчета
Работа с ячейками и областями 303 3. Аналогично рассчитаем в ячейке A8 минимальное значение из динамического массива A1:C3. Для этого установите курсор мыши в ячейке A8 и вызовите диалоговое окно функции НАИМЕНЬШИЙ, находящейся в категории Статистические. Задайте аргументы функции таким образом, чтобы формульное выражение в строке формул имело запись =НАИМЕНЬШИЙ(A1#;1). 4. А теперь проверим расчет максимума и минимума при помощи пользовательской функции Max(r As Range, k As Integer) и процедуры Min(), созданных в VBA. Перейдите в среду VBA (<Alt>+<F11>), создайте второй модуль Module2 и напишите макросы (листинг 8.16). Листинг 8.16. Поиск максимума и минимума в динамическом массиве Function Max(r As Range, k As Integer) Max = Application.WorksheetFunction.Large(r, k) End Function Public Sub Min() Cells(8, 4).Value = Application.WorksheetFunction.Small(Range("A1#"), 1) End Sub 5. В ячейке D5 вызовите функцию Max, определенную пользователем, и рассчитайте ее значение. Задайте аргумент функции R в виде уже знакомого выражения A1#, а аргумент K равным 1. 6. Сравните полученные значения ячеек A5 и D5 — они должны совпадать (рис. 8.14). 7. Для расчета минимального значения динамического массива в редакторе VBA запустите процедуру Min(). Результат будет автоматически записан в ячейку D8. Он должен совпасть с результатом расчета из ячейки A8. Рис. 8.14. Вычисление максимума при помощи пользовательской функции со ссылкой на динамический массив
304 Глава 8 8. Сохраните документ с поддержкой макросов под именем Листинг_8.14_Копирование_ диапазона.xlsm. Первая функция Max возвращает k-е наибольшее значение в множестве данных и имеет два аргумента: диапазон рабочего листа Range и целое число Integer, позиция (начиная с наибольшей) в массиве или диапазоне. Для поиска максимума используется функция рабочего листа Microsoft Excel НАИБОЛЬШИЙ, которая в VBA имеет название Large. Для ее корректного вызова в VBA в окне кода используется выражение Application.WorksheetFunction, затем ставится точка и из списка выбирается нужная функция рабочего листа Microsoft Excel, которая не должна иметь функции-аналога в VBA (рис. 8.15). Если аналог есть, то используется функция VBA. Рис. 8.15. Выбор функции рабочего листа Excel в VBE Во втором коде процедура также использует функцию рабочего листа Microsoft Excel НАИМЕНЬШИЙ, которая в VBA имеет название Small. Параметры функции Application.WorksheetFunction.Small задаются непосредственно в коде процедуры Min().
ГЛАВА 9 Работа с данными Эта глава посвящена вопросам работы с данными. Мы рассмотрим примеры работы с массивами, сортировкой данных, с именованными диапазонами. Массив из трех элементов Напишем в Microsoft Excel программу, сравнивающую данные массива из таблицы с числовыми значениями в диапазоне C1:G10 с заданными значениями массива из трех элементов, расположенного в вектор-столбце A. При совпадении значений элемента первого массива с элементами второго в зависимости от того, с каким элементом из массива A1:A3 совпадает элемент массива C1:G10, происходит заливка цветом фона. 1. Создайте новый файл Microsoft Excel 2021. В диапазон ячеек A1:A3 введите числа, с которыми будут сравниваться элементы таблицы C1:G10. В нашем случае в А1 введите 2, в А2 — 5, а в А3 — 7 (рис. 9.1). 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
306 Глава 9 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 Рис. 9.1. Сравнение значений в таблице со значениями в столбце и заливка цветом ячеек таблицы
Работа с данными 307 5. Для выполнения процедуры воспользуйтесь командой Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). Запустить макили нажатием клавиши <F5>. рос на выполнение можно также кнопкой В этом примере мы работали с массивом из трех элементов arrNumbers(3). Чтобы первый индекс массива был равен единице, в модуле определена инструкция Option Base 1. 6. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_9.1_Сравнение_данных.xlsm. Для этого выберите команду Файл | Сохранить как и в раскрывающемся списке Тип файла диалогового окна Сохранение документа укажите вариант сохранения файла: Книга Excel с поддержкой макросов. Э ЛЕКТРОННЫЙ АРХИВ Листинг 9.1, а также все последующие сохраненные листинги этой главы, вы найдете в папке Глава_9_Работа_с_данными сопровождающего книгу электронного архива. А теперь рассмотрим, как создать массив в диапазоне данных C1:G10 из случайных целых чисел, но так, чтобы среди них обязательно были значения 2, 5 и 7. Проверим работу листинга для динамического массива. 1. Вставьте новый рабочий лист в проекте Листинг_9.1_Сравнение_данных.xlsm и переименуйте его в Динамический массив. Для сравнения чисел массива с заданными числами столбца A в А1 введите 2, в А2 — 5, а в А3 — 7. 2. Применим функцию Microsoft Excel СЛМАССИВ, предназначенную для формирования динамического массива случайных чисел. Выделите ячейку C1, введите в строке формул выражение: =СЛМАССИВ(10;5;1;10;ИСТИНА) и нажмите клавишу <Enter>. В качестве аргументов функции используются следующие параметры: Строки — 10, Столбцы — 5, Минимум — 1, Максимум — 10, Целое — Истина. В результате будет сформирован динамический массив случайных целых чисел от 1 до 10, в котором будут присутствовать значения из заданного диапазона данных. Все аргументы функции СЛМАССИВ являются необязательными. 3. Проверьте работоспособность процедуры Сравнение_данных() — все должно корректно работать (рис. 9.2). Сохраните документ с поддержкой макросов под именем Листинг_9.1_Сравнение_данных.xlsm. Особенность значений нашего линамического массива состоит в том, что они получены при помощи формулы, введенной в ячейку C1. А она будет автоматически пересчитываться при различных событиях, что повлечет за собой неправильную интерпретацию работы макроса, поскольку макрос мы выполнили для первого массива, а для обновленного — не выполняли. Поэтому для отключения автоматического пересчета и выполнения пересчета открытых книг только при явном требовании (с помощью клавиши <F9>) необходимо установить в области Параметры вычислений вкладки Формулы диалогового окна Параметры Excel переключатель Вручную. Снимите также флажок Пересчитывать книгу перед сохранением.
308 Глава 9 Рис. 9.2. Проверка работы процедуры для динамического массива из случайных чисел Динамический массив данных Напишем программу, в которой данные в таблице сравниваются с заданными значениями, расположенными в первой вектор-строке (это динамический массив arrNumber() с числом элементов, задаваемым переменной intCounter). 1. Создайте новый файл Microsoft Excel 2021. 2. На листе рабочей книги введите в ячейки информацию согласно рис. 9.3, но не заливайте ячейки цветом. 3. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). 4. Создайте в модуле процедуру Сравнение_значений(). В процедуре описан динамический массив arrNumbers(). Для строки 1 используется метод End(xlToRight), определяющий, в каком столбце по направлению вправо находятся последние данные (так устанавливается размерность массива). Затем элементы массива сравниваются со значениями в таблице A3:E10, и если значение ячейки из диапазона таблицы совпадает с одним из значений динамического массива, заданного в виде вектор-строки, то ячейка окрашивается в заданный цвет (листинг 9.2).
Работа с данными 309 Рис. 9.3. Сравнение значений в строке со значениями в таблице и закрашивание ячеек П РИМЕЧАНИЕ Тип данных 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
310 Глава 9 Next c Next i End Sub 5. Для запуска макроса нажмите кнопку . Ячейки, значения которых совпали со значениями вектор-строки, оказались закрашенными указанным цветом (рис. 9.3). 6. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_9.2_Расписание_уроков.xlsm. Сравнение областей на одном листе Если в двух предыдущих программах данные в таблице сравнивались с заданными значениями, расположенными в первом столбце или первой строке, то теперь напишем программу, проверяющую идентичность двух таблиц. Предположим, что одна таблица составлена верно, а другая — с орфографическими ошибками. Необходимо найти ячейки, содержащие ошибочные значения, и выделить их цветом. 1. Создайте новый файл Microsoft Excel 2021 и введите в ячейки информацию для первой и второй таблиц (рис. 9.4). Рис. 9.4. Сравнение таблицы 2 c таблицей 1 и закрашивание различающихся ячеек цветом 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль). Создайте в модуле процедуру Сравнение_областей() (листинг 9.3). 3. Для сравнения таблиц определим в коде VBA первую таблицу как образец для сравнения при помощи динамического массива arr().Число элементов массива задается значением intRange и определяется числом ячеек диапазона A2:D9. Доступ ко второй таблице осуществляется при помощи конструкции Range("F2:I9"). 4. Если значения ячеек из второго диапазона не совпадают ни с каким из значений массива, то к таким ячейкам применяется серая заливка цвета фона.
Работа с данными 311 Листинг 9.3. Пример сравнения областей значений в двух таблицах и заливка отличающихся ячеек второй таблицы Option Base 1 Sub Сравнение_областей() Dim arr() As Variant Dim intRange As Integer 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 2021. 2. В ячейки листа Лист1 рабочей книги введите данные для первой таблицы (рис. 9.5, а). Ввести данные для второй таблицы в ячейки листа Лист2 вам поможет вид рис. 9.5, в.
312 Глава 9 а б Рис. 9.5. (Часть 1 из 2) Сравнение значений в двух таблицах на разных листах: а — табличные данные листа 1; б — запуск процедуры
Работа с данными 313 в Рис. 9.5. (Часть 2 из 2) Сравнение значений в двух таблицах на разных листах: в — помеченные для исправления данные на листе 2 3. В среде VBA в отдельном модуле создайте процедуру Сравнение_на_двух_ листах(). Переменным lngMaxR и intMaxC присваиваются наибольшие значения соответственно чисел строк и столбцов таблиц на двух листах. Затем в двойном цикле (по строкам от 1 до lngMaxR и по столбцам от 1 до intMaxC) значения в каждой ячейке второй таблицы сравниваются со значениями в каждой ячейке первой (листинг 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
314 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 .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 Глава 9
Работа с данными 315 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 4. Для выполнения процедуры нажмите клавишу <F5>. При этом в редакторе Visual Basic откроется диалоговое окно Macros (Макрос). Так как в нашем проекте содержится не одна процедура, а три, укажите для выполнения ключевой макрос Сравнение_на_двух_листах (рис. 9.5, б). В этом примере ячейки на листе Лист2 со значениями, отличными от значений на листе Лист1, помечаются красной обводкой (рис. 9.5, в), к тому же в правом верхнем углу такой ячейки приводится комментарий. Посмотрев комментарий, вы поймете, что он содержит значения аналогичной ячейки, находящейся на листе Лист1. Для удаления всех обводок и комментариев на листе Лист2 вызовите в диалоговом окне Macros (Макрос) макрос Удалить_комментарии_и_обводку. И наконец, макрос Исправить_и_выделить служит для замены неправильных значений ячеек листа 2 на правильные значения аналогичных ячеек таблицы листа 1. При этом исправленные значения также помечаются красной обводкой. 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_9.4_Расписание_уроков_сравнение_на_листах.xlsm.
316 Глава 9 Сортировка Сортировка данных — любимейшая операция и пример почти во всех средах программирования. Не исключение и VBA. Сортировка средствами VBA возможна при наличии данных для сортировки на рабочем листе Microsoft Excel и использовании метода Range.Sort, предназначенного для сортировки диапазона значений. Его синтаксис: expression.Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, _ Header, OrderCustom, MatchCase, Orientation, SortMethod, _ DataOption1, DataOption2, DataOption3) Все параметры метода 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 умолчанию);  DataOption1 — устанавливает при помощи константы из перечисления XlSortDataOption, как происходит сортировка текста в диапазоне ячеек, определенных в Key1. Не применим для сортировки сводных таблиц;
Работа с данными 317  DataOption2 — устанавливает при помощи константы из перечисления ячеек, опреде-  DataOption3 — устанавливает при помощи константы из перечисления ячеек, опреде- XlSortDataOption, как происходит сортировка текста в диапазоне ленных в Key2. Не применим для сортировки сводных таблиц; XlSortDataOption, как происходит сортировка текста в диапазоне ленных в Key3. Не применим для сортировки сводных таблиц. На ленте Microsoft Excel работе с данными отведена вкладка Данные, в том числе и группа Сортировка и фильтр. В примерах, приведенных далее, рассматривается применение сортировки данных средствами VBA. Сортировка диапазона данных Данные на рабочем листе можно сортировать разными способами. Рассмотрим способы вертикальной сортировки в столбце и горизонтальной сортировки в строке с использованием метода Range.Sort. Обратите внимание, что сортировка будет осуществляться для диапазона данных. 1. Создайте новый файл Microsoft Excel 2021. 2. На листе рабочей книги введите в ячейки информацию о фамилиях и о возрасте (рис. 9.6) и нарисуйте кнопку категории ActiveX с названием Сортировка от А до Я столбца Фамилия. Рис. 9.6. Исходные данные для сортировки 3. Щелкните правой кнопкой мыши на кнопке сортировки фамилий и выберите команду Просмотреть код. Произойдет переход в редактор VBA к заготовке управления этой кнопкой. Напишите код в соответствии с листингом 9.5.
318 Глава 9 В этой программе сортируются значения из диапазона 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 управляет сортировкой первого столбца. Аргумент 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 для этого нет специальной функции сортировки.
Работа с данными 319 Простая сортировка блоков Рассмотрим пример, в котором имеются пять блоков, состоящих каждый из трех столбцов (рис. 9.7). Число строк может варьироваться. Каждый блок содержит числа от 0 до 9, от 10 до 19, от 20 до 29 и т. д. Блоки должны быть отсортированы. За начало сортировки выбирается первый номер в блоке. 1. Создайте новый файл Microsoft Excel 2021. 2. На листе Лист1 введите в ячейки информацию согласно рис. 9.7, вставьте кнопку из категории Элементы управления формы. Переименуйте ее в СОРТИРОВКА_ ОБЛАСТИ. Рис. 9.7. Пример для сортировки блоков 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 'Число строк в данной области
320 Глава 9 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 'Значения второго блока присваиваются значениям первого 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.8. 6. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_9.7-9.8_Пример_сортировки_области.xlsm. Рис. 9.8. Пример выполнения сортировки области Сортировка блоков с изменением ее условий Код сортировки блоков немного изменится, если поменяется условие сортировки. Продолжите рассмотрение примера, в котором есть пять блоков, состоящих из трех столбцов каждый. Измените условие сортировки — например, пусть сортировка
Работа с данными 321 будет начинаться не с первой ячейки блока, а с ячейки второго столбца четвертой строки каждого блока (рис. 9.9). 1. На листе Лист2 введите в ячейки информацию согласно рис. 9.9 и вставьте кнопку из категории Элементы управления формы. Переименуйте ее в СОРТИРОВКА_ОБЛАСТИ 2. Рис. 9.9. Сортировка начинается с ячейки второго столбца четвертой строки каждого блока 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
322 Глава 9 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 Next i End Sub В этой программе блоки сортируются по значениям в выделенных ячейках — результат сортировки показан на рис. 9.10. 5. Сохраните рабочую книгу под тем же именем: Листинг_9.7-9.8_Пример_сортировки_ области.xlsm. Рис. 9.10. Результат сортировки блоков Сортировка по цвету Рассмотрим пример, в котором в столбце А несколько ячеек закрашено разными цветами, причем названия цветов подписаны (рис. 9.11). Отсортируем ячейки так, чтобы ячейки одного цвета разместились рядом и составили блоки ячеек красного, зеленого, синего и желтого цветов. 1. Создайте новый файл Microsoft Excel 2021. 2. На рабочем листе введите в ячейки информацию согласно рис. 9.11 и вставьте кнопку из категории Элементы управления формы. Переименуйте ее в СОРТИРОВКА_ПО_ЦВЕТУ. 3. Для этой кнопки в заготовке, открывшейся по команде Просмотреть код, напишите код в соответствии с листингом 9.9. В процедуре этой программы применен метод Range.Sort, использующий ключ Сортировка при этом осуществляется на основании индекса цвета. Результат сортировки показан на рис. 9.12. Key1.
Работа с данными 323 Рис. 9.11. Закрашенные ячейки, предназначенные для сортировки Рис. 9.12. Результат сортировки по индексу цвета Листинг 9.9. Пример сортировки по цвету Private Sub CommandButton1_Click() Dim i As Integer Columns(1).Insert For i = 1 To 12 Cells(i, 1) = Cells(i, 2).Interior.ColorIndex 'Определен цветовой _ индекс для ячейки (число)
324 Глава 9 Next i Range("A1:B" & i).Sort Key1:=Range("A1"), Order1:=xlAscending 'Сортировка чисел по возрастанию Columns(1).Delete End Sub 4. Для тех же исходных данных (см. рис. 9.11) можно предложить иной принцип сортировки — по индексу имени цвета. Для этого нарисуйте на рабочем листе еще одну кнопку категории Элементы управления формы с надписью СПЕЦИАЛЬНАЯ_СОРТИРОВКА. 5. Для созданной кнопки в заготовке, открывшейся по команде Просмотреть код, напишите код в соответствии с листингом 9.10. В листинге 9.10 также применен метод Range.Sort с ключом Key1. Сортировка при этом выполняется на основании индекса цвета ColorIndex (назначается в соответствии со специальной цветовой палитрой), используемого в качестве заливки Interior выбранной ячейки. Результат сортировки показан на рис. 9.13 — объединенные блоки желтого, зеленого, красного и синего цветов. Рис. 9.13. Результат сортировки по индексу имени цвета Листинг 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
Работа с данными 325 Case 6 Cells(i, 1) = 1 Case 4 Cells(i, 1) = Case 3 Cells(i, 1) = Case 5 Cells(i, 1) = End Select Next i Range("A1:B" & i).Sort Columns(1).Delete End Sub 'Приоритет для сортировки ячеек 'с цветом 6 (желтый) 2 3 4 Key1:=Range("A1"), Order1:=xlAscending 6. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_9.9-9.10_Пример_сортировки _по_цвету.xlsm. Контроль автофильтра посредством VBA Автофильтры служат для выборки конкретных данных из их общего количества по условию и устанавливаются вручную. Управление автофильтрами может быть возложено на средства VBA. П РИМЕЧАНИЕ Если данные были отфильтрованы и часть из них перестала отображаться, то это не означает, что данные удалены, — они просто скрыты и могут быть показаны в любое время. Для того чтобы снова отобразить все записи, необходимо нажать на стрелочку фильтра и установить флажок Выбрать все. Иногда важен, например, расчет суммы не всех имеющихся данных, а только отфильтрованных. Тогда функцию =СУММ() нужно заменить на =ПРОМЕЖУТОЧНЫЕ.ИТОГИ(). П РИМЕЧАНИЕ Если отфильтрованные данные были скопированы из одного места в буфер обмена комбинацией клавиш <Ctrl>+<C> и затем вставлены в другое место комбинацией клавиш <Ctrl>+<V>, то эти операции будут проведены не над всеми данными, а только над отфильтрованными. Команда Итоги Подвести итоги (общие и промежуточные) можно в сводных таблицах либо при помощи команды Данные | Структура | Промежуточный итог, которая позволяет из множества данных выделить промежуточную или итоговую информацию. Рассмотрим такой пример — пусть на листе рабочей книги отображена деятельность нескольких фирм (рис. 9.14).
326 Глава 9 Рис. 9.14. Данные о работе фирм 1. Создайте новый файл Microsoft Excel 2021. 2. На рабочем листе введите в ячейки информацию согласно рис. 9.14. Доход рассчитывается как произведение рисков на объем и на стоимость. 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.15, а (с промежуточными итогами) и на рис. 9.15, б (с общими итогами). Обратите внимание, что линейка итогов расположена наверху рабочего листа, а при обращении к команде Данные | Структура | Промежуточный итог она находится слева. 6. Если необходимо убрать представление данных в виде итогов, то к объекту Range следует применить метод ClearOutline (листинг 9.12).
Работа с данными 327 а б Рис. 9.15. Итоги работы фирм: а — промежуточные; б — общие Листинг 9.12. Пример использования метода ClearOutline Public Sub Убрать_итоги() With Лист1 .UsedRange.ClearOutline End With End Sub
328 7. Для запуска макроса нажмите кнопку Глава 9 . 8. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_9.11-9.12_Упорядочивание.xlsm. Сортировка данных при помощи среза Если в предыдущем разделе мы с вами сортировали одноколончатые или однострочные данные, не связанные друг с другом, то сейчас рассмотрим способ фильтрации при помощи среза. Срезы представляют данные в табличном виде, где строки с данными еще имеют функцию кнопок, с помощью которых можно фильтровать данные таблиц Excel или сводных таблиц, сводных диаграмм или функций куба. Помимо поддержки быстрой фильтрации, срезы также указывают текущее состояние фильтрации, что позволяет легко понять данные в отфильтрованной сводной таблице. Для того чтобы вставить срез при помощи Microsoft Excel, нажмите одноименную кнопку Срез в группе Фильтры вкладки ленты Вставка, предварительно выделив таблицу Excel либо сводную таблицу. Если использовать для этого данные, не представляющие собой таблицу Excel либо сводную таблицу, а просто диапазон данных — например, как показано на рис. 9.6, то вставить срез не удастся. Для управления и анализа группы взаимосвязанных данных можно преобразовать диапазон ячейки в таблицу Excel (ранее известную как список Excel). Рассмотрим такой пример — пусть на листе рабочей книги приведен одноколонный список фамилий со строкой заголовка, и этот список необходимо отсортировать при помощи преобразования диапазона данных в таблицу Excel и вставить срез. 1. Создайте новый файл Microsoft Excel 2021. 2. На рабочем листе введите в ячейки A1:A8 информацию о фамилиях согласно рис. 9.16 (при этом в ячейке A1 должна присутствовать заголовочная информация Фамилия И.О.) и нарисуйте кнопку категории ActiveX с названием Преобразовать диапазон в таблицу. 3. Щелкните правой кнопкой мыши на кнопке сортировки фамилий и выберите команду Просмотреть код. Произойдет переход в редактор VBA к заготовке управления этой кнопкой. Напишите код в соответствии с листингом 9.13. Листинг 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
Работа с данными 329 Рис. 9.16. Исходные данные для создания таблицы Excel 4. Выйдите из режима конструктора и запустите макрос на исполнение по нажатию созданной кнопки. Диапазон данных преобразовался в таблицу с именем Таблица1. При выделении любой строки таблицы Таблица1 на ленте появляется вкладка Конструктор таблиц (рис. 9.17). Сама таблица имеет чередующиеся по цвету строки, а строка заголовка содержит значок фильтрации , что позволяет быстро фильтровать или сортировать данные (рис. 9.18). Рис. 9.17. Таблица Excel и вкладка Конструктор таблиц
330 Глава 9 В коде задействовано свойство Application.CutCopyMode, устанавливающее в нашем случае отключение режима «вырезать/копировать». Объект ListObject представляет объект списка в коллекции ListObjects. Вставка таблицы осуществляется при помощи метода ListObjects.Add, служащего для создания нового объекта в виде списка. Его синтаксис выглядит следующим образом: expression.Add(SourceType, Source, LinkSource, XlListObjectHasHeaders, _ Destination, TableStyleName) Все параметры метода необязательные:  SourceType — указывает тип источника для запроса. Задается при помощи одной из констант перечисления XlListObjectSourceType (табл. 9.1); Таблица 9.1. Константы перечисления XlListObjectSourceType Название Значение Описание xlSrcExternal 0 Внешний источник данных. xlSrcModel 4 Модель PowerPivot xlSrcQuery 3 Query xlSrcRange 1 Диапазон Range xlSrcXml 2 XML Рис. 9.18. Строка заголовка со значком фильтрации  Source — дополнительный параметр типа Variant, служит для обозначения типа источника данных. Если параметр SourceType = xlSrcRange, то источником данных является объект Range. Если параметр опущен, то для Source будет задан диапазон по умолчанию, возвращенный кодом обнаружения диапазона списков. Если параметр SourceType = xlSrcExternal, то источником данных является массив строковых значений, указывающий подключение к источнику, содержащий следующие элементы: 0 — ссылка URL или сайт SharePoint, 1 — значение ListName, 2 — ViewGUID;  LinkSource — логический параметр типа Boolean. Указывает, следует ли связать внешний источник данных с объектом типа ListObject. Если параметр SourceType принимает значение xlSrcExternal, то значение по умолчанию True
Работа с данными 331 (Истина). Не работает при значении параметр 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 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.
332 Глава 9 3. Выйдите из режима конструктора и запустите макрос на исполнение по нажатию созданной кнопки. Результат создания среза показан на рис. 9.19. 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_9.13-9.14_Срез_в_таблице_Excel.xlsm. Рис. 9.19. Срез данных Сводные таблицы PivotTable Сводные таблицы Excel служат для анализа данных, помещенных в таблицы или списки. Сводные таблицы позволяют группировать данные и производить их анализ. При создании сводной таблицы пользователь может оперировать именами полей, которые размещаются в ее строках и столбцах. Для работы со сводными таблицами используются объекты PivotCaches, PivotCache, PivotTables, PivotTable. Объект PivotCaches — это коллекция кешей памяти из отчетов сводной таблицы в книге. Каждый кеш памяти представлен объектом PivotCache. Объект PivotCaches имеет следующие свойства и методы:  методы: • Create — создает новый объект PivotCache; • Item — возвращает один объект из коллекции;
Работа с данными 333  свойства: • Application — возвращает объект Application, который представляет приложение Microsoft Excel. Только для чтения; • Count — возвращает значение типа Long, представляющее число объектов в коллекции; • Creator — возвращает 32-битное целое число, указывающее на приложение, в котором объект был создан. Только для чтения, Long; • Parent — возвращает родительский объект для указанного объекта. Только для чтения. Объект PivotTable представляет отчет сводной таблицы на листе. Он является членом коллекции сводных таблиц PivotTables. Коллекция сводных таблиц содержит все объекты сводной таблицы на отдельном листе. Метод Add объекта PivotTables добавляет новый отчет сводной таблицы. Метод Item и свойства Application, Count, Creator и Parent возвращают те же объекты и значения, что и для объекта PivotCaches, описанного ранее. Рассмотрим следующий пример: таблица содержит список занятий в учебном заведении. В каждой строке указана фамилия преподавателя, вид занятия, день недели и количество часов. Требуется проанализировать учебную нагрузку каждого преподавателя по видам занятий и по дням недели. 1. Создайте новый файл Microsoft Excel 2021. 2. На рабочем листе введите в ячейки информацию согласно рис. 9.20. Перейдите в среду VBA и добавьте к проекту новый модуль. Рис. 9.20. Исходная таблица
334 Глава 9 3. Создайте в модуле процедуру pivot() в соответствии с листингом 9.15. 4. Запустите процедуру на выполнение. В результате в книге появится новый лист, на котором будет создана сводная таблица (рис. 9.21). Листинг 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 задает тип источника данных. Пара- Рис. 9.21. Сводная таблица
Работа с данными 335 метр xlDataBase означает, что источником данных является диапазон таблицы Excel. Параметр SourceData задает расположение диапазона. Затем в коллекцию PivotTables добавляется новый объект PivotTable при помощи метода PivotTables.Add. Параметр PivotCache задает источник данных, которым в нашем случае является созданный объект PivotCache. Параметр TableDestination определяет расположение сводной таблицы на листе. Свойство PivotFields представляет коллекцию полей сводной таблицы. При помощи его свойства Orientation задается расположение полей сводной таблицы. Свойство Orientation может принимать следующие значения: xlRowField, если поле располагается в строках таблицы, xlColumnField, если поле располагается в столбцах таблицы, xlDataField, если поле располагается в области данных и xlPageField, если поле является полем фильтра. 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_9.15_Сводные_таблицы.xlsm.
336 Глава 9
ГЛАВА 10 Автоматизация диаграмм Мороз не велик, да стоять не велит. Построенные в программе Microsoft Excel 2021 диаграммы, наглядно отображающие изменение данных, очень популярны. По ним можно визуально сравнивать и анализировать числовые характеристики, подводить итоги и т. п. Для построения и форматирования диаграмм, а также для управления ими в Excel 2021 можно применять язык Visual Basic for Applications. Объектная модель диаграмм Семейство Sheets листов рабочей книги включает в себя два семейства: Worksheets (рабочих листов) и Charts (листов диаграмм). Объектами семейства Charts являются диаграммы, непосредственно внедренные в рабочие листы. Эти диаграммы принадлежат семейству ChartObjects. Его элементы — объекты класса ChartObject, представляющие собой контейнеры, содержащие объект Chart. Объект ChartObject встроен в объект Worksheet, а объект Chart — в объект Workbook. У объектов Workbook и Application имеется общее свойство ActiveChart, которое возвращает активную диаграмму рабочей книги независимо от того, какому семейству она принадлежит. Объектная модель диаграмм показана на рис. 10.1. Как мы уже не раз отмечали, самый главный объект программы Microsoft Excel 2021 — объект Application (сама программа Microsoft Excel). Следующую ступень в иерархии объектов занимает Workbook (рабочая книга — ваш файл). Далее следует объект Worksheet (рабочий лист). Каждая диаграмма определяется характеристиками: ChartTitle (Заголовок диаграммы), ChartType (Тип диаграммы), Legend (Легенда), PlotArea (Область графика диаграммы), Trendlines (Линии тренда), SeriesCollection (Ряды данных), состоящий из Points (Точки), Marker (Маркер). Кроме того, для 3D-диаграмм присутствуют характеристики Floor (Основание) и Walls (Стенки).
338 Глава 10 Рис. 10.1. Иерархия объектов в диаграммах Каждой диаграмме присуща также характеристика Axis (Ось), для которой заданы параметры AxisTitle (Название оси), DisplayUnitLabel (Режим отображения осевых значений) и TickLabels (Подписи к осевым значениям). Диаграммы табличных данных (DataTable) характеризуются обрамлением их ячеек: Border (Граница) и Font (Шрифт). Семейства ChartObjects и Chart, как и любые другие, обладают методами Add (создает новый элемент семейства) и Delete (удаляет элемент семейства), а также свойством Count (возвращает число элементов семейства).
Автоматизация диаграмм 339 Метод 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
340 Глава 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 xlBubble3DEffect Комбинированная xlColumnClustered и xlLine — гистограмма с группировкой и график. xlAreaStacked и xlColumnClustered — с областями с накоплением и гистограмма с группировкой Кольцевая xlDoughnut xlDoughnutExploded Биржевая xlStockHLC xlStockOHLC xlStockVHLC xlStockVOHLC
Автоматизация диаграмм 341 Таблица 10.1 (окончание) Тип диаграммы Тип диаграммы Подтип Подтип Поверхностная xlSurface xlSurfaceWireframe xlSurfaceTopView xlSurfaceTopViewWireframe Коническая гистограмма xlConeColClustered xlConeColStacked xlConeColStacked100 xlConeBarClustered xlConeBarStacked xlConeBarStacked100 xlConeCol Пирамидальная гистограмма xlPyramidColClustered xlPyramidColStacked xlPyramidColStacked100 xlPyramidBarClustered xlPyramidBarStacked xlPyramidBarStacked100 xlPyramidCol Цилиндрическая гистограмма xlCylinderColClustered xlCylinderColStacked xlCylinderColStacked100 xlCylinderBarClustered xlCylinderBarStacked xlCylinderBarStacked100 xlCylinderCol Еще в версии программы Microsoft Excel 2016 появились новые типы диаграмм — такие как Каскадная, Дерево, Солнечные лучи, Парето, Ящик с усами, Частотная гистограмма, а в версии Microsoft Excel 2019 перечень диаграмм пополнился типами Воронка и Карта (для визуализации геолокационных данных). Если в названии константы присутствует запись 3D, это свидетельствует о ее объемности. В раскрывающемся списке свойства ChartType представлены константы диаграмм (рис. 10.2). В НЕДРЕННАЯ ДИАГРАММА Внедренная диаграмма помещается на обычный лист, а не на отдельный лист диаграммы. Для того чтобы быстро создать внедренную диаграмму на основе типа диаграммы по умолчанию, выберите данные, которые следует использовать для ее построения, и нажмите комбинацию клавиш <Alt>+<F1>. Рис. 10.2. Пример списка констант диаграмм
342 Глава 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)
Автоматизация диаграмм 343 где: • Source — диапазон, содержащий источник данных; • PlotBy — обозначает способ построения данных на графике. Допустимые значения: xlColumns (по столбцам) и xlRows (по строкам). Первая диаграмма Начнем изучение использования VBA для построения диаграмм с создания вручную самой простой диаграммы. 1. Запустите программу Microsoft Excel 2021 и создайте новую книгу. 2. На рабочем листе в ячейки А1:В5 введите данные в соответствии с рис. 10.3 (или другие аналогичные). Рис. 10.3. Пример данных для построения диаграмм 3. На основании этих данных постройте диаграмму. Для этого в группе Диаграммы вкладки ленты Вставка выберите тип диаграммы — например, Гистограмма. Отформатируйте область построения, оси, надписи и другие параметры диаграммы по своему усмотрению (см. рис. 10.3). 4. На этом же листе рабочей книги создайте три командные кнопки для управления диаграммой. • Для создания первой кнопки в группе Элементы управления вкладки ленты Разработчик откройте меню кнопки Вставить и в элементах управления Выключатель Элементы ActiveX выберите инструмент управления
344 Глава 10 (в VBA — ToggleButton), активизируйте его (рис. 10.4, а) и в рабочем поле Microsoft Excel нарисуйте кнопку ToggleButton1. • Щелкните на кнопке правой кнопкой мыши, в открывшемся контекстнозависимом меню выберите команду Свойства и в появившемся докере свойств для свойства Caption введите значение Управление диаграммой. а б Рис. 10.4. Добавление кнопок: а — вставка выключателя из категории Элементы ActiveX; б — диалоговое окно Назначить макрос объекту, появляющееся при вставке кнопки категории Элементы управления формы • В том же контекстно-зависимом меню измените свойство Name, задав ему значение tglChart. • В том же контекстно-зависимом меню выполните команду Просмотреть код. Выбор этой команды обеспечивает переход в окно редактора VBA и вывод в нем текста заготовки процедуры: Private Sub tglChart_Click() End Sub • Между строками шаблона процедуры введите код программы управления диаграммой в соответствии с листингом 10.1, а. Здесь свойство Visible устанавливает видимость/невидимость диаграммы, при этом изменяется свойство Caption управляющей кнопки. Не забудьте поместить в начале окна кода оператор Option Explicit. Листинг 10.1, а. Управление диаграммой Private Sub tglChart_Click() With ActiveSheet.ChartObjects(1)
Автоматизация диаграмм 345 If .Visible Then .Visible = False tglChart.Caption = "Показать диаграмму" Else .Visible = True tglChart.Caption = "Спрятать диаграмму" End If End With End Sub 5. Аналогично нарисуйте еще одну кнопку выключателя — ToggleButton2 и для нее свойству Caption задайте значение Управление осями. В контекстно-зависимом меню кнопки измените свойство Name, задав ему значение tglAxis. • В том же контекстно-зависимом меню выполните команду Просмотреть код. Выбор этой команды обеспечивает переход в окно редактора VBA и вывод в нем текста заготовки процедуры: Private Sub tglAxis_Click() End Sub • Между строками шаблона процедуры введите код программы управления диаграммой в соответствии с листингом 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 6. Перейдите из редактора VBA в приложение Microsoft Excel, щелкнув на кнопке панели инструментов View Microsoft Excel (Переход в Microsoft Excel) Standard (Стандартная) либо нажав комбинацию клавиш <Alt>+<F11>. На листе рабочей книги создайте третью кнопку — командную кнопку Кнопка категории Элементы управления формы для управления легендой диаграммы.
346 Глава 10 • Как только вы закончите рисование, откроется диалоговое окно Назначить макрос объекту (рис. 10.4, б). В нем следует щелкнуть мышью на кнопке Создать. Выбор этой кнопки обеспечивает переход в окно редактора VBA и появление шаблона процедуры: Private Sub Кнопка1_Click() End Sub • Между строками шаблона процедуры введите код программы управления легендой в соответствии с листингом 10.1, в. Листинг 10.1, в. Перемещение легенды Private Sub Кнопка1_Click() With ActiveSheet.ChartObjects(1).Chart .HasLegend = True 'Проверка того, что легенда отображается .Legend.Position = xlBottom 'Разместить легенду внизу End With End Sub • Щелкните на созданной кнопке левой кнопкой мыши — это событие перемещает легенду вниз. 7. Если необходимо отредактировать надпись на кнопке или исправить код программы, следует перейти в режим конструктора, активизировав требуемую кнопку (см. рис. 10.4, а). 8. Диаграмме можно задать новое имя — например: МОЯ_ДИАГРАММА, добавив в код программы строку: ActiveSheet.ChartObjects(1).Name = "МОЯ_ДИАГРАММА" П РИМЕЧАНИЕ Обратите внимание, что элементы управления (кнопки, счетчики, переключатели и т. д.) создаются при помощи двух разных палитр: Элементы управления формы и Элементы ActiveX. Переход в среду VBA обеспечивает в первом случае команда Назначить макрос, а во втором — команда Просмотреть код (из контекстно-зависимого меню элемента управления). 9. Сохраните созданный документ с поддержкой макросов под именем Листинг_10.1_ Диаграмма.xlsm. Э ЛЕКТРОННЫЙ АРХИВ Листинг 10.1, а также все последующие сохраненные листинги этой главы, вы найдете в папке Глава_10_Диаграмма сопровождающего книгу электронного архива. Создание диаграммы с помощью VBA Для знакомства с объектами, методами и свойствами VBA, используемыми при создании диаграмм, создайте макрос VBA и постройте простую диаграмму.
Автоматизация диаграмм 347 1. Запустите Microsoft Excel 2021 и начните работать в новой книге. 2. На рабочем листе в ячейки А1:В5 введите данные в соответствии с рис. 10.5, а (или другие аналогичные). 3. В среде VBA добавьте к проекту модуль и создайте в нем процедуру Диаграмма1. а б Рис. 10.5. (Часть 1 из 2) Диаграмма в Excel и VBA: а — диаграмма встроена в рабочий лист Лист1; б — диаграмма находится на отдельном листе диаграммы
348 Глава 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() и для запуска макроса нажмите кнопку панели инстру-
Автоматизация диаграмм 349 ментов Standard редактора VBA — как только макрос выполнится, на листе 1 рабочей книги появится диаграмма (см. рис. 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
350 Глава 10 8. Для выполнения процедуры нажмите клавишу <F5>. Теперь мы знаем, как построить диаграмму на рабочем листе, где находятся исходные данные. Расположив диаграмму на отдельном листе, можно написать процедуру перехода на лист, содержащий диаграмму (листинг 10.2, д). Листинг 10.2, д. Переход на лист с диаграммой Sub Активизация_листа() Sheets("Диаграмма1").Activate End Sub 9. Для выполнения процедуры нажмите клавишу <F5>. 10. Сохраните созданный документ с поддержкой макросов под именем Листинг_10.2_ Диаграмма_созданная_VBA.xlsm. Коническая гистограмма Построим еще одну диаграмму (на этот раз коническую) с помощью VBA, используя диапазон данных. 1. Запустите Microsoft Excel 2021 и создайте новую книгу. 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
Автоматизация диаграмм 351 а б Рис. 10.6. Данные для построения диаграммы с помощью VBA (а) и построенная коническая диаграмма (б) 6. Для выполнения процедуры выберите команду Run | Run Sub/UserForm (Выполнить | Выполнить процедуру/пользовательскую форму). Диаграмма будет создана и помещена на отдельный лист Диаграмма1. В НИМАНИЕ ! Обратите внимание, что в окне свойств Properties, отображаемом для выделенного в окне проекта Project - VBA Project, диаграмма будет являтьзначка диаграммы ся объектом типа Chart со свойством Name, равным Диаграмма1, а не Worksheet.
352 Глава 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_Диаграмма_ Кроме диаграммы на отдельном листе, нам потребуется внедренная диаграмма. Добавьте ее в ручном режиме по данным листа 1. по_области.xlsm. Здесь мы рассмотрим способы печати диаграмм, внедренных в рабочий лист либо содержащихся на отдельных листах с диаграммами. И в том и в другом случае для печати мы воспользуемся методом PrintOut. Так как мы не указали аргументы метода, то печать будет выполнена автоматически с настройками по умолчанию. Для изменения, например, типа принтера обратитесь к разделу Печать (рис. 10.7). 1. Перейдите в среду VBA (<Alt>+<F11>), добавьте новый модуль Module2 и напишите процедуру печати всех внедренных диаграмм (листинг 10.4, а). Убедитесь, что Лист1 активный, т. к. внедренные объекты типа Диаграмма станут печататься с активного рабочего листа, и в нашем случае будет напечатана одна диаграмма. Листинг 10.4, а. Процедура печати внедренных диаграмм активного рабочего листа Sub Печать_внедренных_диаграмм() Dim chtObj As ChartObject
Автоматизация диаграмм 353 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. Интерфейс печати
354 Глава 10 Запустите макрос на исполнение. Если диаграммы, размещенные на отдельных листах, отсутствуют, то после выполнения этой процедуры появится сообщение об ошибке. П РИМЕЧАНИЕ Если выполнить макрос печати при отключенном принтере, то появится соответствующее сообщение системы печати компьютера. Из самой книги Microsoft Excel 2021 диаграмму можно напечатать, вызвав команду Файл | Печать, при этом откроется уже знакомое окно Печать (см. рис. 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
Автоматизация диаграмм 355 Процедура удаления всех объектов диаграмм на активном листе представлена в листинге 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 2021. 2. На листе рабочей книги введите данные в соответствии с рис. 10.8. Рис. 10.8. Пример форматирования диаграмм
356 Глава 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
Автоматизация диаграмм 357 .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 2021. 2. Введите: в ячейку B1 — значение 0, в C1 — 100, в D1 — 150. По двум выделенным ячейкам C1 и D1 выполните автозаполнение строки до значения 600 в ячейке M1.
358 Глава 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
Автоматизация диаграмм 359 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 (Степенная);
360 Глава 10  Order –– назначает порядок линии тренда. Допустимые значения: целые числа из интервала от 2 до 6. Используется, если аргумент Type принимает значение xlPolinomial;  Period — устанавливает период линии тренда. Допустимые значения: целое чис- ло больше 1 и меньше числа точек данных в ряде, по которым строится тренд. Используется, если аргумент Type принимает значение xlMovingAvg;  Forward — число периодов вперед (в будущее) для предсказания значений в со- ответствии с трендом;  Backward — число периодов назад (в прошлое) для предсказания значений в со- ответствии с трендом;  Intercept — находит отрезок, отсекаемый на оси линией линейной регрессии. Если этот аргумент опущен, то параметр автоматически устанавливается регрессией;  DisplayEquation — параметр, принимающий логические значения, показываю- щие необходимость отображения на диаграмме уравнения линии тренда;  DisplayRSquared — параметр, принимающий логические значения, показываю- щие необходимость помещения на диаграмме величины достоверности аппроксимации (R^2);  Name — строка, задающая название аппроксимирующей (сглаженной) кривой. Отметим, что все параметры являются необязательными. Рассмотрим пример добавления линии тренда. 1. Создайте новый файл Microsoft Excel 2021. 2. Введите исходные данные в соответствии с рис. 10.10, a. По введенным в ячейки А1:D5 данным постройте диаграмму с помощью команды Вставка | Диаграммы | Гистограмма. Щелкните правой кнопкой мыши на гистограмме и из контекстно-зависимого меню выберите команду Добавить линию тренда (рис. 10.10, б). Добавьте логарифмическую линию тренда. 3. На рабочем листе в режиме Элементы управления формы нарисуйте две кнопки с названиями: Добавить линии тренда и Удалить линии тренда (рис. 10.10, в), щелкните последовательно на каждой правой кнопкой мыши, вызовите команду Назначить макрос и напишите код добавления и удаления линии тренда (листинг 10.8). 4. В кодах введена переменная chtSC типа SeriesCollection, отвечающая за коллекцию из всех объектов типа Series для доступа к параметрам рядов созданных диаграмм. Для подсчета количества рядов данных служит свойство Count. Добавление линии тренда осуществляется при помощи метода Add, а удаление — методом Delete.
Автоматизация диаграмм 361 а Рис. 10.10. (Часть 1 из 2) Добавление линии тренда: а — контекстно-зависимое меню; б — формат линии тренда б
362 Глава 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
Автоматизация диаграмм 363 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 2021. Так как построение карт возможно только при соединении с Интернетом, убедитесь, что доступ к нему у вас есть. Также необходимо использовать данные, подходящие для построения карт. Приложение Microsoft Excel автоматически работает с поисковой системой Bing фирмы Microsoft. Географические данные требуется вводить в виде названий стран, городов, индексов. Лучше всего осуществляется работа на уровне визуализации стран на карте мира. С визуализацией городов по индексам дела обстоят сложнее, поскольку индексы в этой, к примеру, поисковой системе могут быть не идентифицированы или найдены с ошибкой. 1. Создайте новый файл в приложении. 2. Введите исходные данные в соответствии с рис. 10.11, а. 3. На рабочем листе книги создайте командную кнопку Создать диаграмму категории Элементы ActiveX для построения диаграммы и ее форматирования. 4. Выполните двойной щелчок левой кнопкой мыши на кнопке Создать диаграмму и в окне кода открывшегося редактора VBA введите в обработчике события по нажатии этой кнопки код в соответствии с листингом 10.9. Листинг 10.9. Построение карты с размещением на новом листе Private Sub CommandButton1_Click() Application.ScreenUpdating = False Range("B1:C11").Select
364 Глава 10 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 5. Обратите внимание, что в коде обновление экрана управляется при помощи свойства Application.ScreenUpdating. Диаграмма в виде карты доступна для создания через объект Shapes и метод Shapes.AddChart2. Для сокращения длинных записей используется оператор With. Перейдите из редактора VBA в приложение Microsoft Excel, нажав кнопку View Microsoft Excel (Переход в Microsoft Excel) либо комбинацию клавиш <Alt>+<F11>. На рабочем листе с исходными данными нажмите на кнопке Создать диаграмму. Результат работы макроса показан на рис. 10.11, б. 6. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_10.9_Геолокация.xlsm. а Рис. 10.11. (Часть 1 из 2) Построение географической карты: а — исходные данные
Автоматизация диаграмм 365 б Рис. 10.11. (Часть 2 из 2) Построение географической карты: б — созданная диаграмма с заданным форматированием Красивые узоры В заключение этой главы рассмотрим формирование разноцветных узоров. 1. Создайте новый файл Microsoft Excel 2021. 2. Введите числа в соответствии с рис. 10.12, а (или аналогичные по усмотрению). 3. Постройте на листе Лист1 по этим исходным данным диаграмму с помощью команды Вставка | Диаграммы | С областями | Нормированная с областями и накоплением. 4. На листе рабочей книги создайте командную кнопку Кнопка категории Элементы управления формы для построения диаграммы при помощи макроса VBA. 5. Измените надпись на кнопке с Кнопка1 на Создать диаграмму с использованием контекстного меню. 6. Сначала мы напишем процедуру создания диаграммы Создание_узоров() в соответствии с листингом 10.10 в отдельном модуле Module1, а затем назначим этот макрос в качестве вызываемого по нажатию кнопки Создать диаграмму. Не забудьте поместить в начале окна кода оператор Option Explicit. Листинг 10.10. Генерирование диаграммы Sub Создание_узоров() On Error Resume Next
366 Глава 10 а б Рис. 10.12. Исходные данные (а) и пример диаграммы с областями (б)
Автоматизация диаграмм 367 ActiveSheet.ChartObjects.Delete With Charts.Add .ChartStyle = 281 .ChartType = xlAreaStacked100 .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.12, б)! Разместите диаграмму на отдельном листе. Для этого выделите ее, перейдите на вкладку Конструктор диаграмм и в области Расположение нажмите на кнопку Переместить диаграмму. 9. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_10.10_Создание_узоров.xlsm.
368 Глава 10
ГЛАВА 11 Программирование объектов и событий VBA является языком программирования объектов и обработки событий. Объектов много, и событий много: открыть или закрыть книгу, нажать или отпустить кнопку мыши, создать или удалить файл и т. д. Объекты могут реагировать на события — на действия пользователя или другие внешние действия, например на щелчок мыши на кнопке. Программист в программном коде должен указать, что произойдет при возникновении этого события, т. е. написать код, который будет выполняться в ответ на событие, — процедуру обработки события. Основные действия пользователя, генерирующие вызов событий в программе:  запуск программы;  нажатие клавиши;  щелчок кнопкой мыши;  выход из программы. Для многих элементов управления общими являются следующие события:  Click — щелчок кнопкой мыши на объекте;  DblClick — двойной щелчок кнопкой мыши на объекте;  KeyPress — нажатие клавиши при условии, что объект находится в фокусе;  MouseDown — нажатие кнопки мыши при условии, что указатель мыши находится на объекте;  MouseMove — указатель мыши движется поверх объекта;  MouseUp — отпускается кнопка мыши при условии, что указатель мыши находит- ся на объекте.
370 Глава 11 Где и как создаются процедуры обработки событий? Важный момент для самого события — правильное размещение процедуры его обработки. Иначе событие может и не подчиниться обработке, если неизвестно, где находится процедура его обработки. Для каждой новой рабочей книги программы Microsoft Excel создается свой проект Project - VBAProject, в котором могут находиться пользовательские формы, модули и классы модулей (рис. 11.1, а). а б Рис. 11.1. (Часть 1 из 2) Окно VBAProject с пользовательскими формами, модулями и классами модулей (а); список доступных событий для объекта Workbook (б)
Программирование объектов и событий 371 в Рис. 11.1. (Часть 2 из 2) Список доступных событий для объекта Worksheet (в) Для того чтобы выбрать список доступных событий для объекта Microsoft Excel ЭтаКнига, в редакторе VBA выполните двойной щелчок левой кнопкой мыши на значке с этим именем в окне, показанном на рис. 11.1, а, и в открывшемся окне кода в левом раскрывающемся списке Object укажите Workbook, а в списке Procedure — нужное событие. Тогда в окне кода будет автоматически помещена заготовка процедуры-обработчика события с доступными параметрами (рис. 11.1, б). Аналогично, чтобы выбрать список доступных событий для объекта Microsoft Excel Лист1, в редакторе VBA выполните двойной щелчок левой кнопкой мыши на значке с этим именем в окне, показанном на рис. 11.1, а, и в открывшемся окне кода в левом раскрывающемся списке Object укажите Worksheet, а в списке Procedure — нужное событие. Тогда в окне кода будет автоматически помещена заготовка процедуры-обработчика события с доступными параметрами (рис. 11.1, в). Процедура для объекта ЭтаКнига Напишем программу, которая в окне сообщения выводит определяемое свойством Name имя книги, открытой в Microsoft Excel (см. рис. 11.1). 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA, выбрав на вкладке ленты Разработчик раздел Visual Basic. Можно также нажать комбинацию клавиш <Alt>+<F11>. На экране откроется окно интегрированной среды разработки приложений Microsoft Visual Basic - Книга 1. 2. Активизируйте в проекте Project - VBAProject объект ЭтаКнига, выполнив на нем двойной щелчок мышью, и напишите код из листинга 11.1. Не забудьте поместить в начале окна кода оператор Option Explicit. Убедитесь, что курсор мыши находится на одной из строк процедуры. Запустите процедуру на исполнение нажатием клавиши <F5>. Действительно, при запуске программы появляется сообщение об имени открытой книги (рис. 11.2).
372 Глава 11 Рис. 11.2. Сообщение об имени открытой книги Листинг 11.1. Процедура, созданная для объекта ЭтаКнига Private Sub Открытая_книга() MsgBox "В программе Microsoft Excel открыт файл ThisWorkbook.Name & """." End Sub """ & _ 3. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.1_Открытая_книга.xlsm. Для этого необходимо выполнить команду Файл | Сохранить как и в раскрывающемся списке Тип файла диалогового окна Сохранение документа выбрать вариант сохранения файла: Книга Excel с поддержкой макросов. Э ЛЕКТРОННЫЙ АРХИВ Листинг 11.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_11_Программирование_объектов_и_событий сопровождающего книгу электронного архива. События, связанные с нажатием кнопок мыши Процедура в модуле Напишем процедуру, выполняющую закрашивание областей. 1. Создайте новый файл Microsoft Excel 2021. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль: Insert | Module (Вставить | Модуль).
Программирование объектов и событий 373 3. Создайте процедуру Заливка_цветом(), в которой используется пересечение цветовых диапазонов. Ее код приведен в листинге 11.2. Листинг 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 2021. Перейдите в среду VBA (<Alt>+<F11>). 2. Активизируйте в проекте Project - VBAProject объект Лист1 (см. рис. 11.1, а), выполнив на нем двойной щелчок мышью, и напишите код из листинга 11.3, применив при этом способ автоматического создания заготовки процедуры, показанный на рис. 11.1, в. В этом коде задействуется обработчик события
374 Глава 11 Worksheet.SelectionChange, происходящего при изменении выделения ячеек для рабочего листа. В результате работы процедуры при щелчках левой кнопкой мыши либо при выделении всего диапазона ячеек 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 2021. Перейдите в среду 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). Появится информационное сообщение.
Программирование объектов и событий 375 Рис. 11.4. Пример появления сообщения при щелчке правой кнопкой мыши на любой ячейке на листе 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.4_Щелчок_правой_кнопкой_мыши.xlsm. Очистка ячейки 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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
376 Глава 11 3. Поэкспериментируйте с ячейкой А1 — вводите любое значение, как не равное 10, так и равное 10. 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.5_Событие_Worksheet.Change.xlsm. Свойства ScrollRow и ScrollColumn Свойства ScrollRow и ScrollColumn возвращают или устанавливают номер строки и столбца левого верхнего угла рабочего окна. С помощью этих свойств мы поместим выделенный диапазон данных в левый верхний угол. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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, представляющий собой активное окно.
Программирование объектов и событий 377 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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 новую рабочую книгу. По умолчанию в ней один лист. Добавьте еще шесть листов и переименуйте их в соответствии с названиями дней недели.
378 Глава 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), сообщающее число обращений к макросу в соответствии с новым значением ячейки. Листинг 11.10. Пример подсчета обращений к макросу Private Sub Подсчет_обращений_к_макросу() Range("A1").Value = Range("A1").Value + 1
Программирование объектов и событий 379 MsgBox "К макросу обращались " & _ Range("A1").Value & " раз!" End Sub Рис. 11.6. Пример подсчета числа обращений к макросу 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. Для запуска макроса нажмите кнопку . 3. Сохраните этот документ с поддержкой макросов под тем же именем Листинг_11.10_ Листинг_11.11_ Подсчет_обращений_к_макросу.xlsm. События Activate и Deactivate рабочего листа 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+<F11>). 2. Создайте в книге еще несколько листов, чтобы было из чего выбирать.
380 Глава 11 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, при помощи которого надпись смещается на строку ниже. События активации и деактивации листа контролируются ключевым словом Me, которое реагирует на событие щелчка мышью на ярлычке листа. 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.12_Листинг_11.13_Активация_листа.xlsm. Рис. 11.7. Пример активации и деактивации листа Двойной щелчок левой кнопкой мыши 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+<F11>). 2. Двойным щелчком мыши активизируйте в своем проекте Project - VBAProject объект Лист1 (см. рис. 11.1) и напишите для него обработчик события Worksheet.BeforeDoubleClick на основе встроенной процедуры: Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Программирование объектов и событий 381 Событие Worksheet.BeforeDoubleClick относится к событиям рабочего листа Worksheet и происходит до действия, принятого по умолчанию при двойном щелчке левой кнопкой мыши на ячейках (листинг 11.14). Для создания процедуры используйте способ автоматического создания ее заготовки (см. рис. 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 3. Перед запуском макроса введите на Лист1 информацию — например, слово ТЕСТ. Если выполнить двойной щелчок левой кнопкой мыши на любой ячейке, расположенной на рабочем листе Лист1, то произойдет переход на первую пустую ячейку столбца, следующую за последней заполненной в столбце (рис. 11.8). 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.14_ Двойной_щелчок_мыши.xlsm. Рис. 11.8. Пример перехода на ячейку F5 при двойном щелчке на ячейке F2 Щелчок правой кнопкой мыши 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+<F11>). 2. Активизируйте в своем проекте Project - VBAProject объект Лист1 (см. рис. 11.1, а), выполнив на нем двойной щелчок мышью, и напишите для него процедуру:
382 Глава 11 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 2021 с двумя рабочими листами: Лист1 и Лист2. Перейдите в среду VBA (<Alt>+<F11>). 2. Двойным щелчком активизируйте в своем проекте Project - VBAProject объект Лист1 (см. рис. 11.1, а) и напишите для него процедуру Лист_с_паролем(), которая скрывает на листе столбцы от A до D при запуске процедуры (листинг 11.16). Также столбцы могут быть автоматически скрыты при переходе пользователем на другой рабочий лист, т. е. при возникновении события деактивации рабочего листа. Отобразить заново столбцы можно при выполнении процедуры Лист_с_паролем(), введя правильный пароль: VBA (рис. 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
Программирование объектов и событий 383 Else Worksheets(1).Activate End If End Sub Private Sub Worksheet_Deactivate() Columns("A:D").Hidden = True End Sub Рис. 11.9. Пример ввода пароля 4. Перейдите с одного листа на другой и посмотрите, скрыты ли на листе Лист1 столбцы с A по D. 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_11.16_Пароль.xlsm. Событие закрытия книги 1. Откройте любую книгу — например Листинг_11.2_Пересечение_цветных_областей.xlsm. 2. Перейдите в среду VBA (<Alt>+<F11>). 3. Двойным щелчком мыши активизируйте в проекте Project - VBAProject объект ЭтаКнига (см. рис. 11.1, а) и напишите код встроенной процедуры Workbook_ BeforeClose(Cancel As Boolean) из листинга 11.17, в ходе выполнения которой перед закрытием файла (при наступлении события Workbook.BeforeClose) он будет автоматически сохраняться без генерации диалогового окна сохранения файла. Используйте при этом способ автоматического создания заготовки процедуры (см. рис. 11.1, в). При закрытии книги сообщение о сохранении изменений не появляется, и книга сохраняется автоматически.
384 Глава 11 Листинг 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. Листинг 11.18. Процедура записи времени последнего сохранения книги Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Worksheets(2).Range("A1") = "Последнее сохранение книги: " & Now End Sub 4. Сохраните этот документ с поддержкой макросов в том же файле. Рис. 11.10. Пример сообщения о последнем сохранении книги
ГЛАВА 12 Операторы даты и времени В этой главе мы научимся работать с датами, временем и календарем. Существует несколько форматов вывода дат. VBA, конечно же, поддерживает американский стандарт времени, в котором в дате сначала указывается месяц, потом день, а затем год. Русский и немецкий стандарты формата времени сначала указывают день, потом месяц, а затем год. Различаются также форматы вывода дополуденного и послеполуденного времени. Вывод даты и времени в окно Immediate оператором Debug.Print 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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/9/2023# Debug.Print #8:15:00 AM# Debug.Print #8:15:00 PM# End Sub
386 Глава 12 4. Для запуска макроса нажмите кнопку — в окне Immediate (Окно отладки) появится ряд чисел, соответствующих текущему формату даты/времени: 09.03.2023 8:15:00 20:15:00 В НИМАНИЕ ! Обратите внимание, что в программе дата и время окружены знаками решетки (#). Так называемый литерал даты вида #3/9/2023# интерпретируется 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.2023") Debug.Print CDate("20:15") End Sub После запуска макроса в окне Immediate (Окно отладки) появятся дата и время: 31.12.2023 20:15:00 Сохраните этот документ под тем же именем: Листинг_12.1-Листинг_12.10_Дата_ этого выберите команду Файл | Сохранить. и_время.xlsm. Для
Операторы даты и времени 387 Функции DateSerial и TimeSerial Продолжите работу с файлом из предыдущего примера. Заранее заданные дату и время можно вывести с помощью функций DateSerial и TimeSerial (листинг 12.3), указывая конкретные значения: Day (день), Month (месяц), Year (год), Second (секунда), Minute (минута) и Hour (час). Листинг 12.3. Команды DateSerial и TimeSerial Sub Дата_и_время_заданные() Debug.Print DateSerial(2023, 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.2023 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 (Окно отладки) появится ряд значений, отражающих системные дату и время, например: 02.07.2023 18:01:04 Сохраните этот документ под тем же именем: Листинг_12.1-Листинг_12.10_Дата_ и_время_Пример.xlsm.
388 Глава 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 (Окно отладки) появится ряд значений, отражающих настоящее время, например: 2 7 2023 18 1 50 Сохраните этот документ под тем же именем: Листинг_12.1-Листинг_12.10_Дата_ и_время.xlsm. Функция Weekday — день недели Продолжите работу с тем же файлом. День недели заданной даты можно узнать с помощью функции рабочего листа WorksheetFunction.Weekday. Функция имеет следующий синтаксис: Weekday(Date, [FirstDayOfWeek]) где аргумент Date — обязательный параметр (дата, день недели которой необходимо определить), аргумент FirstDayOfWeek — необязательный параметр, указывающий первый день недели при помощи одной из констант VbDayOfWeek. Напомним, что по умолчанию используется константа vbSunday, т. е. первый день недели — воскресенье. Адаптируем функцию под начало недели — понедельник. Для этого напишем процедуру День_недели() (листинг 12.6). Обратите внимание, что дата задана в формате месяц/день/год и заключена в символы #.
Операторы даты и времени 389 Листинг 12.6. Применение функции рабочего листа WorksheetFunction.Weekday Sub День_недели() Dim bytWeekday As Byte bytWeekday = Weekday(#5/4/2023#, 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 мая 2023 это: Четверг. Функция 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/2023#, "mmmm") & " " & _ Format(#6/4/2023#, "dddd") End Sub
390 Глава 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.2024) dddddd Полностью записанная дата словами (5 Август 2024 г.) 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.
Операторы даты и времени 391 Функция DateDiff Продолжите работу с тем же файлом. С помощью функции DateDiff можно определить разность двух дат (листинг 12.8). Аргументы функции записываются в круглых скобках через запятые с использованием кавычек и знака решетки. Листинг 12.8. Функция DateDiff Sub Отсчет_времени() Debug.Print DateDiff("yyyy", Date, #12/31/2023#) & " лет" Debug.Print DateDiff("m", Date, #12/31/2023#) & " месяцев" Debug.Print DateDiff("ww", Date, #12/31/2023#) & " недель" Debug.Print DateDiff("d", Date, #12/31/2023#) & " дней" End Sub После запуска макроса в окне Immediate (Окно отладки) появятся данные, показывающие количество лет, месяцев, недель, дней, которые отделяют текущую системную дату от заданной (рис. 12.1). Сохраните этот документ под тем же именем: Листинг_12.1-Листинг_12.10_Дата_и_ время.xlsm. Для этого необходимо выполнить команду Файл | Сохранить. Рис. 12.1. Время, отделяющее текущую дату от заданной Функция DatePart 1. Продолжите работу с тем же файлом. 2. Добавьте к проекту модуль Module1 с помощью команды Insert | Module (Вставить | Модуль).
392 Глава 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 "День недели 02.07.2023 End Sub " & День_недели("02.07.2023") Public Function День_недели(n) День_недели = WeekdayName(Weekday(n, vbUseSystemDayOfWeek), False) 'False - полное название дня недели, True - сокращенное End Function 3. Для запуска макроса нажмите кнопку . После выполнения макроса будет определено, что 02.07.2023 — воскресенье.
Операторы даты и времени 393 4. Сохраните этот документ под тем же именем: Листинг_12.1-Листинг_12.10_Дата_ и_время.xlsm. Вывод сообщения на 3 секунды Интересно сгенерировать сообщение, которое будет существовать заданное время и затем автоматически исчезать. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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 Set objMSR = CreateObject("WScript.Shell") intPopUp = objMSR.Popup("Три секунды", 3) End Sub
394 Глава 12 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 2021. Перейдите в среду 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 Sub Процедура_вызова() Application.OnTime Now + TimeValue("00:00:05"), "Моя_процедура" ' Запуск процедуры Моя_процедура() через 5 секунд End Sub
Операторы даты и времени 395 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) где:  Destination — обязательный параметр типа данных Range (ячейки, которые должны быть заполнены). Параметр должен включать диапазон источника;
396 Глава 12  Type — необязательный параметр, задает тип заполнения при помощи одной из констант перечисления XlAutoFillType, обозначая, как будет заполнен целевой диапазон, основываясь на содержании исходного диапазона. Рассмотрим пример. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+<F11>). В окне свойств проекта выполните двойной щелчок левой кнопкой мыши на значке ЭтаКнига. 2. Напишите программу (листинг 12.13), в которой рассматривается способ автоматического заполнения столбца датами (рис. 12.4). В ячейку А1 листа 1 введено значение текущей даты (функция Date) минус 5, в ячейку А2 — значение, соответствующее текущей дате минус 4. Потом на основе этих двух ячеек методом AutoFill столбец автоматически заполняется датами до ячейки А99999. Рис. 12.4. Поиск сегодняшней даты Листинг 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 3. Для запуска макроса нажмите клавишу <F5>. С помощью команды Insert | Module (Вставить | Модуль) добавьте к проекту модуль Module1. Напишите в нем процедуру, которая в указанном диапазоне данных находит сегодняшнюю дату (листинг 12.14, рис. 12.4). Эту процедуру
Операторы даты и времени 397 можно вызвать с помощью кнопки Текущая дата категории Элементы управления формы, которая запускает соответствующий макрос. Листинг 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 2021. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. 3. Напишите программу (листинг 12.15, а), в которой рассматривается способ автоматического заполнения столбца датами. В ячейку А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 4. Напишите также процедуру, которая в указанном диапазоне ячеек находит ячейки с текущей датой и применяет к ним заливку желтым цветом (листинг 12.15, б, рис. 12.5). Эту процедуру можно вызвать с помощью кнопки Найти ячейки
398 Глава 12 с текущей датой категории Элементы управления формы, которая запускает соответствующий макрос. Листинг 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 = vbYellow End If Next c End Sub Рис. 12.5. Поиск ячеек с текущей датой и их выделение 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_12.15_Выделить_ячейки.xlsm. Поиск даты Рассмотрим еще один пример работы с ячейками и датами. 1. Создайте новый файл Microsoft Excel 2021. 2. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1.
Операторы даты и времени 399 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 End If Next c End Sub 4. Для запуска макроса нажмите клавишу <F5>. Если значение ячейки из диапазона столбца A совпадет со значением ячейки C4, то для найденной ячейки задается цвет фона (в нашем случае — фиолетовый). 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_12.16_Поиск_даты.xlsm.
400 Глава 12 Календарь Несмотря на наличие в новой версии Microsoft Excel 2021 шаблонов календарей, мы рассмотрим способ создания календаря с использованием VBA. Исходные данные для формирования календаря разместим на рабочем листе Лист1 (рис. 12.7). Очень удобно, что можно сформировать календарь для любого календарного года, указав его цифрами в ячейке B2. Рис. 12.7. Исходные данные для формирования календаря Мы формируем григорианский календарь, который учитывает так называемые високосные годы, февраль которых длится 29 дней, в отличие от обычного февраля длительностью 28 дней. Такие «длинные» феврали григорианский календарь предусматривает в каждом четвертом году — из ближайших это 2024, 2028. П РИМЕЧАНИЕ Год считается високосным в двух случаях: либо он кратен 4, но при этом не кратен 100, либо кратен 400. Год не високосный, если он не кратен 4, либо он кратен 100, но при этом не кратен 400. Предыдущим високосным годом был 2020-й, следующим будет 2024-й. 1. Создайте новый файл Microsoft Excel 2021. 2. Подготовьте для формирования календаря соответствующий лист (см. рис. 12.7), где в ячейку B2 будет вводиться год (в программе это переменная varYear), для которого рассчитывается календарь. 3. Создайте кнопку Создать календарь, по нажатии на которую должен выполняться макрос Календарь (листинг 12.17). Обратите внимание, что эта кнопка относится к элементам управления формы, а не к элементам ActiveX. 4. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1.
Операторы даты и времени 401 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 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 = "Вт"
402 Глава 12 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. Календарь по месяцам В этом примере рассматривается способ расчета календаря по месяцам. Трудность создания такого календаря состоит в том, чтобы обеспечить правильное соответствие первого дня месяца названию дня недели, а потом правильно подключить следующий день и начать новую неделю с новой строки. 1. Создайте новый файл Microsoft Excel 2021. 2. Подготовьте для задания настроек календаря соответствующий лист (рис. 12.9).
Операторы даты и времени 403 Рис. 12.8. Календарь на 2024 год Рис. 12.9. Подготовка формирования календаря по месяцам
404 Глава 12 3. В ячейку А10 введите текст: Введите желаемый год. В ячейку А11 предусмотрен ввод номера года (переменная intYear в листинге 12.18), для которого будет формироваться календарь. 4. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. 5. Создайте на рабочем листе кнопку Формирование календаря по месяцам категории Элементы управления формы для запуска макроса Календарь_по_ месяцам. 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 .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
Операторы даты и времени 405 .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) и автоматически создается заголовок из названий семи дней недели. Затем определяется, каким днем недели является первое число рассчитываемого месяца. Начиная с этого дня, все числа месяца записываются в ячейки, при этом, если день является понедельником, происходит переход на следующую строку. 7. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_12.18_Календарь_по_месяцам.xlsm. Календарь по неделям В этом примере рассматривается способ расчета календаря по неделям. 1. Создайте новый файл Microsoft Excel 2021. 2. Подготовьте для формирования календаря соответствующий лист (рис. 12.11). На нем же будет размещена первая неделя календаря.
406 Глава 12 Рис. 12.10. Пример календаря по месяцу на листе Рис. 12.11. Подготовка формирования календаря по неделям
Операторы даты и времени 407 3. В ячейку А28 введите текст: Введите желаемый год. В ячейку А29 предусмотрен ввод номера года (это переменная intYear в листинге 12.19), для которого будет формироваться календарь. 4. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. 5. На рабочем листе создайте кнопку Формирование календаря по неделям из категории Элементы управления формы для запуска макроса Календарь_по_ неделям. 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) 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
408 Глава 12 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 Next bytWS Application.Goto Worksheets(1).Range("A1") Application.ScreenUpdating = True End Sub Для каждой недели формируется лист с соответствующим названием, на каждом листе для дней недели отводится по одному столбцу (рис. 12.12). Каждая строка фиксирует один час от 0:00 до 23:00. В исходной книге был один лист, а теперь, после запуска макроса, в ней содержится 53 листа. 8. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_12.19_Календарь_по_неделям.xlsm.
Операторы даты и времени 409 Рис. 12.12. Пример календаря по неделям на листе Определение возраста В этом примере рассматривается способ расчета возраста по введенной дате рождения. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1. 2. В листинге 12.20 приведен код программы расчета возраста по введенной дате рождения. Не забудьте поместить в начале окна кода оператор Option Explicit. Листинг 12.20. Расчет возраста по введенной дате рождения Public Sub Возраст() Dim Str1 As String Str1 = InputBox("Введите дату Вашего рождения!", _ " Определение возраста")
410 Глава 12 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 — логическое свойство, устанавливающее, защищена ли книга для сохранения изменений.
412 Глава 13 а б Рис. 13.1. Перечень свойств объекта Workbook: а — начало; б — окончание Методы объекта Workbook Приведем некоторые основные методы объекта Workbook и семейства Workbooks:  Activate — активизирует рабочую книгу, делая активным первый рабочий лист;  Add — создает новую рабочую книгу в семействе Workbooks, которая становится активной;
Действия с рабочей книгой 413  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 означают соответственно: «Только для чтения», «Фор-
414 Глава 13 мат», «Пароль», «Пароль для записи в защищенный файл», «Игнорирование рекомендации “Только для чтения”». Рассмотрим принципы работы с рабочей книгой на примерах. Открытие рабочей книги методом Workbooks.Open 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA, выбрав на вкладке ленты Разработчик раздел Visual Basic. Можно также нажать комбинацию клавиш <Alt>+<F11>. На экране откроется окно интегрированной среды разработки приложений Microsoft Visual Basic - Книга 1. 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
Действия с рабочей книгой 415 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. Вызов диалогового окна Открытие документа
416 Глава 13 3. Сохраните книгу под тем же именем: Листинг_13.1-Листинг_13.3_Метод_Workbooks. Open.xlsm. Открытие рабочей книги в диалоговом окне 1. Создайте новый файл Microsoft Excel 2021. 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)
Действия с рабочей книгой 417 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
418 Глава 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 2021. Перейдите в среду 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
Действия с рабочей книгой 419 Значение 4 второго аргумента функции Shell открывает приложение в окне обычного размера, но не передает ему фокус. 3. Для запуска макроса нажмите кнопку . 4. Сохраните вновь созданную книгу с поддержкой макросов под именем Листинг_13.7_Запуск_Блокнота.xlsm. Свойство Workbook.Name 1. Откройте несколько файлов Microsoft Excel 2021. В среде 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>. Здесь свойство Application.Workbooks возвращает семейство Workbooks, представляющее собой все открытые рабочие книги Excel. Названия открытых книг возвращаются с помощью свойства Workbook.Name. В открывшемся сообщении (рис. 13.5) отображена информация об открытых в текущий момент файлах приложения Microsoft Excel. 4. Сохраните созданный документ с поддержкой макросов под именем Листинг_13.8_ Список_открытых_рабочих_книг.xlsm. Рис. 13.5. Диалоговое окно сообщения об открытии файлов
420 Глава 13 Создание рабочей книги 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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 2021. Перейдите в среду 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. В нашем случае это фраза «Не
Действия с рабочей книгой 421 потопаешь, не полопаешь!». Правда, при сохранении этой книги ее предлагается сохранить под именем Книга1 без добавленного текста. Используйте значение Empty, чтобы вернуть первоначальные установки. 4. Можно также вывести в окне сообщения имя вашего приложения (листинг 13.11). Обращение происходит к объекту — активной рабочей книге ActiveWorkbook. Напишите этот код в том же модуле того же файла. Листинг 13.11. Пример вывода окна сообщения с именем Name активной книги Sub Имя_рабочей_книги() MsgBox ActiveWorkbook.Name End Sub 5. Для запуска макроса нажмите кнопку . При этом возвращается имя файла без указания полного адреса. Для отображения имени файла с указанием диска, т. е. с полностью прописанным путем, необходимо использовать свойство рабочей книги Application.FullName (листинг 13.12, рис. 13.6). Напишите этот код в том же модуле того же файла. Листинг 13.12. Пример вывода окна сообщения с полным именем активной книги Sub Полное_имя_приложения() MsgBox Application.ActiveWorkbook.FullName End Sub Рис. 13.6. Пример сообщения с именем вашего приложения 6. Раз уж мы изучаем вывод имени приложения, то можно рассмотреть еще один пример вывода имени открытого файла (листинг 13.13). Напишите этот код в том же модуле (Module1) того же файла. Результат выполнения процедуры совпадет с результатом из листинга 13.11. Листинг 13.13. Еще один пример вывода окна сообщения с именем активной книги Sub Имя_открытой_книги() Dim str As String Dim wb As Workbook
422 Глава 13 For Each wb In Workbooks str = str & wb.Name & Chr(10) Next wb MsgBox str End Sub 7. Для запуска макроса нажмите кнопку . 8. Сохраните этот документ с поддержкой макросов под именем Листинг_13.10Листинг_13.13_Название_рабочей_книги.xlsm. Сохранение рабочей книги Рассмотрим несколько способов сохранения рабочей книги. Метод Workbook.Save 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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)
Действия с рабочей книгой 423 Параметры метода:  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, он сохраняет эти форматы в логической структуре;
424 Глава 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). Рис. 13.7. Ввод пароля для открытия файла
Действия с рабочей книгой 425 3. В случае неправильного ввода пароля файл не будет открыт (рис. 13.8). В НИМАНИЕ ! Используйте сильный пароль с комбинацией прописных и строчных букв, чисел и символов. Слабый пароль не содержит таких смешанных по типу элементов. Например, сильный пароль — Y6dh!et5. Слабый пароль — House27. Придумывайте сильный пароль, который вы можете запомнить, чтобы избегать его хранения где-либо. Рис. 13.8. Реакция программы на ввод неверного пароля при открытии файла 4. Попробуем модифицировать макрос с возможностью сохранения рабочей книги в режиме «Только для чтения». Для этого в коде замените слово Password на слово WriteResPassword. 5. Вновь запустите макрос на исполнение. Также будет создан новый файл Пример1.xlsm. При попытке его открыть появится диалоговое окно ввода пароля для открытия файла с возможностью сохранения в нем изменений. В случае неправильного ввода пароля файл будет открыт в режиме «Только для чтения». 6. Сохраните этот документ под тем же именем Листинг_13.14-Листинг_13.16_ Сохранение_всех_книг.xlsm. Метод Workbook.SaveCopyAs А теперь создадим копию рабочей книги, при этом изменений в открытой рабочей книге не будет. Для этого предназначен метод Workbook.SaveCopyAs. В отличие от предыдущего метода, у него только один необязательный параметр Filename, обозначающий имя файла, созданного копированием. 1. Запустите Microsoft Excel 2021. Откройте книгу Листинг_13.14-Листинг_13.16_ Сохранение_всех_книг.xlsm. Перейдите в среду VBA. 2. Командой Add Procedure (Добавить процедуру) добавьте в модуле к проекту процедуру с названием Сохранение_копированием согласно листингу 13.16. Листинг 13.16. Пример сохранения книги ее копированием Sub Сохранение_копированием() Dim str As String str = " C:\Users\HOME\Documents\Пример2.xlsm" If Dir(str) = "" Then ThisWorkbook.SaveCopyAs (str) ' Сохранить файл как копию
426 Глава 13 Else MsgBox "Файл с таким именем уже существует!" End If End Sub 3. Для выполнения процедуры нажмите кнопку . И, пожалуйста, проверьте — на диске C: в указанной папке действительно ли появился файл-копия Пример2.xlsm? 4. Сохраните этот документ под тем же именем: Листинг_13.14-Листинг_13.16_ Сохранение_всех_книг.xlsm. Сохранение всех книг и выход из программы 1. Запустите Microsoft Excel 2021, откройте как можно больше рабочих книг и создайте еще одну новую книгу. 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. Сохранение всех книг и выход по запросу 1. Запустите Microsoft Excel 2021, откройте как можно больше книг и книгу Листинг_13.17_Листинг_13.18_Сохранить_и_выйти_из_программы.xlsm. 2. Перейдите в среду VBA. 3. Командой Insert | Procedure (Вставить | Процедура) добавьте в модуле Module1 к проекту процедуру с названием Сохранение_и_выход_по_требованию.
Действия с рабочей книгой 427 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 (Истина);  Windows — для установки защиты окон рабочей книги устанавливается значение True (Истина). Отметим, что все параметры являются необязательными. Объект Worksheet В иерархии Microsoft Excel объект Worksheet идет сразу после объекта Workbook и представляет собой лист рабочей книги. Объекты Worksheet составляют семейство Worksheets.
428 Глава 13 Свойства объекта 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 — копирует рабочий лист в другое место в рабочей книге. Защита рабочего листа методом 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)
Действия с рабочей книгой 429 Параметры метода:  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 (Ложь);  AllowSorting — значение True (Истина) разрешает сортировку. Все ячейки сор- тируемого диапазона должны быть со снятой защитой или разблокированы. Значение по умолчанию: False (Ложь);  AllowFiltering — значение True (Истина) разрешает установку фильтров. Поль- зователи могут изменять критерии фильтров, но не могут включать или отключать автофильтр. Значение по умолчанию: False (Ложь);  AllowUsingPivotTables — значение True (Истина) разрешает использование сводных таблиц. Значение по умолчанию: False (Ложь).
430 Глава 13 Рассмотрим теперь примеры применения методов защиты листа рабочей книги. 1. Запустите Microsoft Excel 2021 и создайте новую рабочую книгу. 2. На рабочем листе Лист1 нарисуйте четыре кнопки из категории Элементы управления формы и задайте им названия Установить защиту, Снять защиту, Разрешить форматирование ячеек, Запретить форматирование ячеек (рис. 13.9). Рис. 13.9. Кнопки для управления защитой листа 3. Перейдите в среду VBA. 4. Командой Insert | Procedure (Вставить | Процедура) добавьте в модуле Module1 к проекту процедуры с названиями Защитить_лист() и Снять_защиту_листа() (листинг 13.19). В листинге 13.19 приведен код программы, при выполнении которой в случае положительного ответа на соответствующий запрос сохраняются все открытые книги и происходит выход из приложения Microsoft Excel. Листинг 13.19. Процедуры установки защиты листа и снятия защиты листа Public Sub Защитить_лист() Worksheets(1).protect End Sub Public Sub Снять_защиту_листа() Worksheets(1).unprotect End Sub 5. Перейдите из редактора VBA в приложение Microsoft Excel, нажав кнопку View Microsoft Excel (Переход в Microsoft Excel) либо комбинацию клавиш
Действия с рабочей книгой 431 <Alt>+<F11>, и назначьте командной кнопке Установить защиту макрос Защитить_лист в диалоговом окне Назначить макрос объекту (рис. 13.10). Аналогично назначьте макрос Снять_защиту_листа кнопке Снять защиту. Рис. 13.10. Назначение макросов командным кнопкам 6. Проверьте работоспособность командных кнопок. При установке защиты рабочий лист становится полностью защищенным от ввода данных в ячейки и от их форматирования. 7. Вернитесь обратно в редактор VBA. В том же модуле создадим процедуры Разрешить_форматирование_ячеек() и Запретить_форматирование_ячеек() для разрешения и запрета возможности форматировать ячейки защищенного рабочего листа (листинг 13.20). В коде используется свойство Protection.AllowFormattingCells, которое возвращает значение True (Истина), если форматирование ячеек разрешено на защищенном рабочем листе. Листинг 13.20. Процедуры установки разрешения и запрета форматирования ячеек рабочего листа при примененном ранее методе Worksheet.Protect Public Sub Разрешить_форматирование_ячеек() If Worksheets(1).Protection.AllowFormattingCells = False Then Worksheets(1).protect AllowFormattingCells:=True End If End Sub
432 Глава 13 Public Sub Запретить_форматирование_ячеек() If Worksheets(1).Protection.AllowFormattingCells = True Then Worksheets(1).protect AllowFormattingCells:=False End If End Sub 8. Перейдите из редактора VBA в приложение Microsoft Excel, нажав кнопку View Microsoft Excel (Переход в Microsoft Excel) либо комбинацию клавиш <Alt>+<F11>, и назначьте командной кнопке Разрешить форматирование ячеек макрос Разрешить_форматирование_ячеек в диалоговом окне Назначить макрос объекту (см. рис. 13.10). Аналогично назначьте кнопке Запретить форматирование ячеек макрос Запретить_форматирование_ячеек. 9. Проверьте работоспособность командных кнопок. Предварительно нажмите кнопку Установить защиту. Затем нажмите кнопку Разрешить форматирование ячеек — тогда команды для форматирования ячеек, расположенные на вкладке ленты Главная, будут доступны (рис. 13.11, а). При нажатии кнопки Запретить форматирование ячеек форматирование на вкладке ленты Главная будет недоступно (рис. 13.11, б). Снимите защиту рабочего листа. а б Рис. 13.11. Форматирование ячеек в режиме защищенного листа: а — форматирование разрешено; б — форматирование запрещено 10. Сохраните рабочую книгу под именем Листинг_13.19_Листинг_13.20_Защита_рабочей_ книги.xlsm. Деление рабочего листа на страницы для печати 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1.
Действия с рабочей книгой Рис. 13.12. Пример напечатанной первой страницы листа Лист1 433
434 Глава 13 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.
ГЛАВА 14 Файловые операции При решении многочисленных задач обработки больших объемов информации, бухгалтерского учета, ведения различных картотек, справочников и баз данных используются файлы, которые позволяют запоминать, изменять, хранить и читать различную информацию на внешних носителях. В этой главе рассмотрены файловые операции. Конечно, мы все помним традиционное определение файла как поименованной области на диске компьютера. Соответственно файл имеет имя. Полное имя файла состоит из пути к файлу, собственно имени и расширения. Расширение файла может содержать от одного до пяти символов. Уточняя определение файла, можно отметить, что файл представляет собой структурированный набор данных, содержащий последовательность компонентов (чаще всего — записей) одного типа и одной длины. Образно файл можно представить в виде участка магнитной ленты, у которого есть начало, а конец не фиксирован. Число элементов в файле (длина файла) не ограничено. Это является основным отличием файла от массива. Файл, не содержащий ни одного элемента, называется пустым, — его длина равна нулю. Форматы файлов Microsoft Excel Обратите внимание, что в современных версиях программы Microsoft Excel файлы имеют новые расширения (табл. 14.1). Таблица 14.1. Расширения файлов Описание формата Новый Старый Excel — рабочая книга xlsx xls Excel — рабочая книга с поддержкой макросов xlsm xls Двоичная книга Excel xlsb xls Рабочая книга с поддержкой Add-In xlam xla
436 Глава 14 Таблица 14.1 (окончание) Описание формата Новый Старый Шаблон Excel xltx xlt Шаблон Excel с поддержкой макросов xltm xlt Далее мы рассмотрим приемы работы с файлами, начав с самого простого файла — текстового. Метод CreateTextFile для объекта FileSystemObject В этом примере показано использование методов объекта FileSystemObject, предоставляющего доступ к файловой системе компьютера. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA (<Alt>+<F11>) и добавьте к проекту модуль Module1 с помощью команды Insert | Module (Вставить | Модуль). 2. В диалоговом окне Add Procedure (Добавить процедуру) добавьте процедуру с названием Создание_текстового_файла() и напишите программу, позволяющую создать текстовый файл с расширением txt (листинг 14.1, рис. 14.1). Не забудьте поместить в начале окна кода оператор Option Explicit. Рис. 14.1. Пример создания текстового файла В коде сначала переменной 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
Файловые операции 437 Set fs = CreateObject("Scripting.FileSystemObject") Set a = fs.CreateTextFile("C:\Users\HOME\Documents\test.txt", True) a.WriteLine("Это текстовый файл с заданным названием, в него помещаются эти записи.") a.Close End Sub 3. Для запуска макроса нажмите клавишу <F5>. 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.1_Создание_текстового_файла.xlsm. Для этого необходимо выполнить команду Файл | Сохранить как и в раскрывающемся списке Тип файла диалогового окна Сохранение документа выбрать вариант сохранения файла: Книга Excel с поддержкой макросов. Э ЛЕКТРОННЫЙ АРХИВ Листинг 14.1, а также все последующие сохраненные листинги этой главы, вы найдете в папке Глава_14_Файлы сопровождающего книгу электронного архива. Список файлов указанной папки 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. Создайте процедуру с названием Наличие_файлов() и напишите программу, выводящую на рабочий лист названия Excel-файлов, имеющихся в заданной папке (листинг 14.2, рис. 14.2). В коде сначала переменной fs присваивается объект FileSystemObject, содержащийся в библиотеке типов Scripting, который создается методом CreateObject. Затем для доступа к папке вызывается метод GetFolder. Рис. 14.2. Пример определения наличия файлов
438 Глава 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 2021. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. В диалоговом окне Add Procedure (Добавить процедуру) добавьте процедуру типа Function (Функция): Открыть_только_для_чтения(strFileIn As String) As Long и введите код из листинга 14.3.
Файловые операции 439 Текстовый файл открывается при помощи метода 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
440 Глава 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 (рис. 14.4), вызываемого по команде Файл | Параметры. Файлы EUROTOOL.XLAM, ANALYS32.XLL, ATPVBAEN.XLAM, SOLVER.XLAM являются файлами надстроек Microsoft Excel и представляют собой пакеты для конвертации и форматирования евровалюты, анализа, анализа VBA и поиска решений соответственно. Подключить указанные надстройки, относящиеся к типу Надстройки Excel, можно в диалоговом окне Надстройки. Для его вызова перейдите, нажав кнопку , из редактора VBA в Microsoft Excel, нажмите кнопку Надстройки Excel на вкладке ленты Разработчик и подключите, например, настройку Поиск решения (рис. 14.5). Теперь напишем макрос, в котором проверим наличие надстроек, подключенных в рабочей книге. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. В диалоговом окне Add Procedure (Добавить процедуру) добавьте процедуру с названием Показать_надстройки() (листинг 14.4) и напишите программу,
Файловые операции 441 Рис. 14.4. Диалоговое окно Параметры Excel: раздел Надстройки Рис. 14.5. Диалоговое окно Надстройки
442 Глава 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 2021. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. С использованием диалогового окна Add Procedure (Добавить процедуру) добавьте процедуру Файловый_диалог() и напишите программу, позволяющую выводить на экран окно Обзор (листинг 14.5).
Файловые операции 443 Листинг 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). — откроется диалоговое окно Тип диалогового окна задается при помощи константы msoFileDialogFilePicker свойства Application.FileDialog. Когда пользователь выбирает файл в диалоговом окне и нажимает кнопку Да, выводится текстовое сообщение с указанием полного пути файла. 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.5_Файловый_диалог.xlsm. Рис. 14.7. Диалоговое окно Обзор, вызванное в программе
444 Глава 14 Функция GetAttr Рассмотрим пример с использованием функции GetAttr, которая возвращает значение типа Integer, определяющее атрибуты файла и каталога (папки). Значение, возвращаемое функцией GetAttr, является суммой значений перечисления: vbNormal — обычный, vbReadOnly — только для чтения, vbHidden — скрытый, vbSystem — системный, vbDirectory — каталог или папка, vbArchive — файл, измененный после создания последней резервной копии, vbAlias — файл, у которого есть другое имя. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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("D:\КнигаVBA2021\Глава_14_Файлы\Листинг_14.8_Наличие_файла.xlsm") If b = False Then MsgBox "Файл не найден!" Else MsgBox "Файл был найден по указанному адресу!" End If End Sub 5. Нажмите кнопку рис. 14.8. . Возможные результаты поиска файлов показаны на 6. Сохраните созданный документ с поддержкой макросов под именем Листинг_14.6_ Поиск_файла.xlsm.
Файловые операции 445 а б Рис. 14.8. Сообщения о файлах: а — отсутствие; б — наличие Документирование информации о файле Выполним документирование информации о файле активной рабочей книги, создав функцию, определенную пользователем. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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
446 Глава 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: а — ее вызов из категории Определенные пользователем; б — ввод аргумента
Файловые операции 447 в Рис. 14.9. (Часть 2 из 2) Работа с функцией Doc: в — результат выполнения функции 5. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.7_Документирование.xlsm. Проверка существования файла Ранее уже была показана процедура, выполняющая поиск файла (см. листинг 14.6). Программа обращалась к логической функции Db_Ver. Теперь напишем небольшую процедуру, использующую функцию Dir, относящуюся к категории функций VBA для управления файлами. Функция Dir — давно, еще со времен DOS, известная команда, которая тем не менее применяется до сих пор. Она возвращает файл или папку (каталог), соответствующие образцу, указанному в аргументе PathName. Если образцу соответствует несколько файлов, то возвращается первый из них. Таким образом, команда Dir позволяет проверить существование файлов на диске. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. С использованием диалогового окна Add Procedure (Добавить процедуру) добавьте процедуру Наличие_файла() и напишите программу, определяющую наличие файла (листинг 14.8). Листинг 14.8. Пример программы, определяющей наличие файла Sub Наличие_файла() Const str1 As String = "C:\test\Наличие.xlsm"
448 Глава 14 If Dir (str1) <> "" Then MsgBox "Файл """ & str1 & """ в наличии." Else MsgBox " Файл """ & str1 & """ не найден." End If End Sub 3. Для выполнения процедуры нажмите кнопку . 4. Сохраните вновь созданный документ с поддержкой макросов под именем Листинг_14.8_Наличие_файла.xlsm. Оператор Kill для удаления файла Напишем процедуры удаления заданного файла с помощью VBA-команды Kill. Не пугайтесь, что будут удалены все файлы из компьютера, — действие функции распространяется только на конкретный файл с указанным адресом. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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.
Файловые операции 449 Оператор FileCopy для копирования файла Напишем процедуру копирования файлов с помощью VBA-оператора FileCopy. Учтите, что файл в компьютере должен иметься, — действие функции распространяется только на прописанный в заданной папке файл. Синтаксис оператора FileCopy: FileCopy source, destination где используются следующие именованные аргументы:  source — обязательный аргумент в виде строки, задающей имя копируемого файла;  destination — обязательный аргумент в виде строки, задающей имя целевого файла. Для нашего примера заранее созданы две папки: Папка1 и Папка2 — для старого и нового файлов соответственно и сам файл TEST1.xlsm. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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.
450 Глава 14 Переименование файла Напишем процедуру переименования одного файла. Учтите, что этот файл в компьютере должен иметься, — действие процедуры распространяется только на прописанный в заданной папке файл. Для нашего примера заранее создана папка Папка1 и сам файл TEST2.xlsm. Переименование осуществляется при помощи VBAоператора Name. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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 2021. Перейдите в среду VBA и добавьте к проекту модуль Module1.
Файловые операции 451 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.
452 Глава 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, г — ошибка автоматизации), а также ошибки
454 Глава 15 а б в г д е Рис. 15.1. Диалоговые окна: а–г — ошибки выполнения; д, е — ошибки компиляции компиляции (рис. 15.1, д — тип, определенный пользователем, не определен, рис. 15.1, е — переменная не определена). Выявление и исправление ошибок 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA, выбрав на вкладке ленты Разработчик раздел Visual Basic или нажав комбинацию клавиш <Alt>+<F11>. На экране откроется окно интегрированной среды разработки приложений Microsoft Visual Basic - Книга 1. 2. Добавьте к проекту модуль Module1 с помощью команды Insert | Module (Вставить | Модуль). 3. Напишите программу, в которой переменная i описана как Byte — значения таких переменных определены в диапазоне от 0 до 255. В нашем случае пере-
Отладка программ и сообщения об ошибках 455 менная 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 (б)
456 Глава 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 2021. Перейдите в среду VBA и добавьте к проекту модуль Module1.
Отладка программ и сообщения об ошибках 457 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.
458 Глава 15 Окно Locals Второе окно для просмотра ошибок — это окно Locals (Локальные переменные), вызываемое командой View | Locals (Вид | Локальные переменные). Используйте это окно! В нем можно просмотреть содержимое переменных и типов. Окно состоит из трех разделов: Expression (Выражение), Value (Значение) и Type (Тип). Первоначально окно Locals (Локальные переменные) пустое. 1. Создайте новый файл Microsoft Excel 2021 и перейдите в среду 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 (Отладка | Точка останова). П РИМЕЧАНИЕ Точка прерывания — одно из ключевых понятий при нахождении ошибки. Вы должны вовремя остановиться и выяснить, нет ли в этом месте ошибки.
Отладка программ и сообщения об ошибках 459 а б в Рис. 15.5. Работа с окном Locals: а — установка точки прерывания в окне кода; б — отображение информации в окне Locals; в — подсветка строки с точкой прерывания желтым цветом Окно наблюдения Watches Третье окно для просмотра ошибок — это окно Watches (Окно наблюдения), вызываемое командой View | Watch Window (Вид | Окно наблюдения). Используйте и это окно! В нем можно просмотреть информацию о значениях переменных и их
460 Глава 15 типе. Окно Watches (Окно наблюдения) состоит из четырех разделов: Expression (Выражение), Value (Значение), Type (Тип) и Context (Область применения). Первоначально это окно пустое (рис. 15.6, а). Вообще-то, окно Watches (Окно наблюдения) очень похоже на окно Locals, описанное в предыдущем разделе, но в нем появился новый столбец Context (Область применения). Надо отметить, что с этим окном работать несколько сложнее, чем с предыдущим. а б в г г Рис. 15.6. Работа с окном Watches: а — исходный режим окна; б — его контекстно-зависимое меню; в — диалоговое окно Add Watch; г — список наблюдаемых переменных в окне Watches 1. Обратитесь к файлу Листинг_15.3_Проверка.xlsm и вызовите окно Watches (Окно наблюдения). 2. Щелкните правой кнопкой мыши на этом окне — появится контекстно-зависимое меню (рис. 15.6, б). 3. Выберите команду Add Watch (Добавить окно наблюдения) — откроется одноименное диалоговое окно (рис. 15.6, в). 4. Задайте в нем наблюдаемую переменную и область применения (в нашем случае это процедура Проверка3()).
Отладка программ и сообщения об ошибках 461 5. Укажите способ наблюдения переменной в области Watch Type (Вид наблюдения), выбрав один из трех переключателей: • Watch Expression (Наблюдать переменную) — при этом вычисленное значение будет отражено в столбце Values; • Break When Value Is True — остановиться и перейти в режим Break Mode (Режим останова), если значение наблюдаемой переменной True (Истина); • Break When Value Is Changes — остановиться и перейти в режим Break Mode (Режим останова), если значение наблюдаемой переменной изменится. 6. После установки необходимых параметров щелкните в диалоговом окне 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 Указанный файл устарел. Эта программа требует более новой версии
462 Глава 15 Таблица 15.1 (окончание) Код Сообщение Описание 424 Object required Необходим объект 429 ActiveX component can’t create object or return reference to this object Компонент ActiveX не может создать объект или возвратить ссылку на этот объект Объект 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 перехватывает ошибку и задает действия программы при появлении ошибки.
Отладка программ и сообщения об ошибках 463 Процедура обработки ошибки определяет тип возникшей ошибки и устанавливает образ действий программы в зависимости от типа ошибки. Синтаксис процедуры: On Error GoTo Строка Здесь оператор On Error активизирует процедуру обработки ошибки, начало которой определяется обязательным параметром Строка. Его значением может быть либо метка, либо номер строки. Оператор On Error Resume Next указывает, что при возникновении ошибки во время выполнения управление передается оператору, следующему непосредственно за тем, в котором возникла ошибка, и выполнение продолжается с этой точки. Оператор On Error GoTo 0 отключает включенный обработчик ошибок в текущей процедуре и сбрасывает его в Nothing. Оператор On Error Resume Next 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. Напишите программу, в которой есть обращение к несуществующему листу (листинг 15.4, а). Листинг 15.4, а. Обращение к несуществующему листу Sub Имя_листа() Worksheets(5).Name = "Новое_имя" End Sub 3. Для запуска макроса нажмите кнопку (рис. 15.7). — появится сообщение об ошибке 9 4. Добавьте в программу оператор перехвата и обработки ошибки On Error Resume Next (листинг 15.4, б), и при повторном запуске макроса подобное сообщение не появится. Листинг 15.4, б. Добавление оператора On Error Resume Next Sub Имя_листа() On Error Resume Next Worksheets(5).Name = "Новое_имя" End Sub 5. Сохраните созданный документ с поддержкой макросов под именем Листинг_15.4_ Переход_по_Resume.xlsm.
464 Глава 15 Рис. 15.7. Сообщение об ошибке 9 Оператор On Error GoTo: вариант 1 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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
Отладка программ и сообщения об ошибках 465 3. Для запуска макроса нажмите кнопку . Если возникнет ошибка, связанная с отсутствием файла, то появится сообщение, что указанный файл с именем Листинг_15.4_Переход_по_Resume.xlsm не найден, в противном случае файл будет открыт и произойдет выход из процедуры, заданный при помощи конструкции Exit Sub. 4. Сохраните созданный документ с поддержкой макросов под именем Листинг_15.5_ Оператор_On_Error_GoTo.xlsm. Оператор On Error GoTo: вариант 2 Рассмотрим пример действия оператора On Error GoTo с использованием свойства Application.EnableCancelKey, когда оно принимает значение xlErrorHandler. Свойство Application.EnableCancelKey управляет тем, как приложение Microsoft Excel реагирует на прерывание выполняемой процедуры пользователем, который нажимает комбинацию клавиш <Ctrl>+<Break> или клавишу <Esc>. 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду 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
466 Глава 15 Для запуска макроса нажмите кнопку . Если в полученном запросе нажать кнопку OK, то после выполнения процедуры ячейка А20000 станет активной. Но если при выполнении процедуры нажать клавишу <Esc>, то процедура отреагирует на прерывание как на ошибку — с переходом по метке и выдачей указанного сообщения в информационном окне (рис. 15.8). 3. Сохраните созданный документ с поддержкой макросов под именем Листинг_15.6_ Переход_по_метке_и_ошибка.xlsm. Рис. 15.8. Результат прерывания процедуры при нажатии клавиши <Esc> Константы xlDisabled и xlInterrupt свойства Application.EnableCancelKey 1. Создайте новый файл Microsoft Excel 2021. Перейдите в среду VBA и добавьте к проекту модуль Module1. 2. Напишите программу (листинг 15.7), в которой прописан переход к ячейке А20000. В этом примере свойство Application.EnableCancelKey определяет действие компьютера при нажатии комбинации клавиш, используемой для прерывания выполнения процедуры. Причем в нашем случае это свойство сначала принимает значение xlDisabled (перехват нажатия клавиши отмены полностью отключен), а затем значение xlInterrupt (текущая процедура прерывается, и пользователь может выполнить отладку или завершить процедуру). Листинг 15.7. Пример использования свойства EnableCancelKey Sub Разрешение_запрет_прерывания() Dim i As Integer
Отладка программ и сообщения об ошибках 467 ' В этом блоке процедуры она не будет прервана 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 3. Для запуска макроса нажмите кнопку — после выполнения процедуры ячейка А20000 стала активной. 4. Сохраните созданный документ с поддержкой макросов под именем Листинг_15.7_ Свойство_EnableCancelKey.xlsm. Массив листов Рассмотрим еще один пример с использованием оператора On Error GoTo и напишем программу (листинг 15.8), в которой выделяются листы заданного массива, а остальные листы не выделяются. 1. Создайте новый файл Microsoft Excel 2021, добавьте еще три листа: Лист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
468 Глава 15 5. Сохраните созданный документ с поддержкой макросов под именем Листинг_15.8_ Массив_листов.xlsm. Команда меню Debug В среде VBA есть специальная команда меню Debug (Отладка), открывающая вложенный список команд меню, содержащий сами команды и соответствующие комбинации клавиш, позволяющие проводить отладку пошагово (рис. 15.9, а). В переводе с английского debug — отладка. а б Рис. 15.9. Команды меню Debug (a) и ошибка, обнаруженная во время отладки (б) Для выполнения программы в пошаговом режиме предусмотрены четыре команды: 1. Команда Debug | Step Into (Отладка | Шаг с заходом) позволяет последовательно шаг за шагом отлаживать всю программу, включая процедуры, выполняемые в ней.
Отладка программ и сообщения об ошибках 469 2. Команда Debug | Step Over (Отладка | Шаг с обходом) позволяет последовательно шаг за шагом отлаживать всю программу, но если встретится процедура, то она выполнится полностью, а не пошагово, как это делает предыдущая команда. завершает выполнение 3. Команда Debug | Step Out (Отладка | Шаг с выходом) процедуры и останавливается на следующей инструкции программы, откуда процедура была вызвана. 4. Команда Debug | Run To Cursor (Отладка | Выполнение до курсора) няет программу до инструкции, помеченной курсором. выпол- Можно вызывать команды из меню или пользоваться соответствующими клавиатурными сокращениями. Ошибки компиляции появляются в диалоговом окне, которое имеет типичную структуру (рис. 15.9, б).
470 Глава 15
ГЛАВА 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 2021 и добавьте в книгу два листа. 2. Если нажать в группе Ссылки вкладки ленты Вставка кнопку Ссылка (рис. 16.1, а), откроется диалоговое окно Вставка гиперссылки (рис. 16.1, б), в левой панели которого представлены варианты выбора типа связи. Таким способом можно создать гиперссылку с помощью ленты. В зависимости от выбора опции меняется центральная часть этого окна. Просмотрите все возможные команды, доступные в нем. 3. Перейдите в среду VBA (нажав комбинацию клавиш <Alt>+<F11>) и добавьте к проекту модуль Module1 с помощью команды Insert | Module (Вставить | Модуль). 4. Напишите программу создания внутренней гиперссылки посредством VBA (листинг 16.1, а). Объект Hyperlinks здесь добавляется методом Add. Ячейка А1 является местом создания ссылки Anchor, о чем говорит текст, отражаемый на экране благодаря свойству TextToDisplay. Не забудьте поместить в начале окна кода оператор Option Explicit.
472 Глава 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. 6. Аналогично можно написать программу создания внешней гиперссылки (листинг 16.1, б). Здесь задается якорь ссылки Anchor, т. е. место, с которого осуществляется переход по гиперссылке, и ее адрес Address. Листинг 16.1, б. Пример создания внешней гиперссылки Sub Внешняя_гиперссылка() ActiveSheet.Hyperlinks.Add _ Anchor:=Range("A2"), _
Программирование связей 473 Address:="http://spbu.ru/", _ ScreenTip:="Санкт-Петербургский государственный университет", _ TextToDisplay:="СПбГУ" End Sub По внешней гиперссылке происходит переход на сайт http://spbu.ru/. П РИМЕЧАНИЕ Для перехода на сайт по гиперссылке необходимо подключение компьютера к Интернету. 7. Сохраните книгу под именем Листинг_16.1_Гиперссылка.xlsm. Э ЛЕКТРОННЫЙ АРХИВ Листинг 16.1, а также все последующие сохраненные листинги этой главы вы найдете в папке Глава_16_Программирование_связей сопровождающего книгу электронного архива. Рис. 16.2. Пример внутренней гиперссылки Кнопка гиперссылки Напишем программу, в которой выход в Интернет осуществляется по щелчку на созданной кнопке (рис. 16.3). 1. Создайте новый файл Microsoft Excel 2021. 2. На листе рабочей книги создайте командную кнопку для управления выходом в Интернет. Для этого в группе Элементы управления вкладки ленты Разработчик откройте кнопку Вставить, в элементах управления Элементы ActiveX , активизируйте его и в рабочем выберите инструмент управления Кнопка поле Microsoft Excel нарисуйте кнопку. Как только вы закончите рисование, в строке формул появится запись: =ВНЕДРИТЬ("Forms.CommandButton.1";"")
474 Глава 16 Рис. 16.3. Кнопка для выхода в Интернет 3. Щелкните на созданной кнопке правой кнопкой мыши и в контекстнозависимом меню выберите команду Просмотреть код (см. рис. 1.25). В результате произойдет переход в окно редактора VBA и появится шаблон процедуры: Private Sub CommandButton1_Click() End Sub 4. Между строками шаблона процедуры введите текст программы в соответствии с листингом 16.2. Для свойства Caption управляющей кнопки, расположенной на рабочем листе, задайте: https://bhv.ru. Листинг 16.2. Выход в Интернет Private Sub CommandButton1_Click() ActiveWorkbook.FollowHyperlink _ Address:="https://bhv.ru", _ NewWindow:=True End Sub 5. В коде используется метод ActiveWorkbook.FollowHyperlink для загрузки документа с указанным адресом из Интернета в новом окне браузера. При щелчке на созданной кнопке происходит переход на сайт издательства «БХВ» по адресу в Интернете: https://bhv.ru. 6. Сохраните книгу как Листинг_16.2_Выход_в_Интернет.xlsm.
Программирование связей 475 Передача данных из Excel в Word Напишем программу, в которой данные из Excel передаются в Word. 1. Создайте новый файл Microsoft Excel 2021. Введите в ячейки A1:B15 рабочего листа произвольные данные. Они будут скопированы методом Copy и добавлены из Excel в Word методом Paste. 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 2021. Перейдите в среду VBA и добавьте к проекту модуль Module1.
476 Глава 16 2. Напишите программу передачи данных из Word в Excel посредством VBA (листинг 16.4). Здесь в строковой переменной strFile типа String указано имя файла: Пример1.docx. Этот файл открывается при помощи метода Documents.Open, его данные копируются методом Copy, затем в Excel методом Add добавляется новая рабочая книга и данные вставляются на активный рабочий лист методом Paste. Рис. 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")
Программирование связей 477 With WordApp .ChangeFileOpenDirectory str1 .Documents.Open strFile With .Selection .WholeStory .Copy 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 2021. В ячейки рабочего листа введите произвольные данные и постройте диаграмму (рис. 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 'Ширина диаграммы
478 Глава 16 а б Рис. 16.5. Диаграмма: а — в Excel; б — в PowerPoint
Программирование связей .Top = 50 .Left = 160 End With .SlideShowSettings.Run End With End With End Sub 479 'Отступ сверху 'Запуск презентации 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 2021. Перейдите в среду 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 'Число листов в рабочей книге соответствует числу слайдов _ в презентации
480 Глава 16 Workbooks.Add Application.SheetsInNewWorkbook = bytTemp For i = 1 To .Slides.Count .Slides(i).Copy Worksheets(i).Paste Next i End With 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 элемента управления. Однако элемент управления не хранит данные; он только отображает информацию, хранящуюся в источнике данных. Источник перетаскивания — выбранный текст или объект, который перемещается в ходе операции перетаскивания.
482 Приложение 1  Клиентская область — часть окна, в которой приложение отображает выход- ные данные, — например, текст или графику.  Код состояния OLE — часть структуры данных, содержащая номер ошибки и возвращающая сведения о ее условиях. Структура данных определяется связыванием и встраиванием объектов.  Контейнер OLE — элемент управления Visual Basic, используемый для связи и встраивания объектов из других приложений в приложениях Visual Basic.  Контекстный идентификатор — уникальное число или строка, соответствую- щие определенному объекту в приложении. Контекстные идентификаторы используются для создания связей между приложением и соответствующими разделами справки.  Курсор — часть программы, возвращающая строки данных приложению. Указа- тель обозначает текущую позицию в наборе результатов.  Несвязанный — описывает элемент управления, не привязанный к ячейке на листе. Напротив, связанный элемент управления является источником данных для ячейки листа, предоставляющей доступ к отображению и редактированию значения элемента.  Основной элемент управления — ориентир для команд Align (Выровнять) и Make Same Size (Сделать одного размера) в меню Format (Формат). При выравнивании элементов управления выбранные элементы выравниваются относительно основного. При изменении размеров элементов управления выбранным элементам присваиваются размеры основного. Основной элемент управления обозначается белыми маркерами. Остальные элементы обозначаются черными маркерами.  Очистить — для изменения установки на off (выкл.) или удаления значения.  Перечисляемая константа — дополнительные сведения о перечисляемых эле- ментах данных можно найти в описании свойства, метода или события, использующего перечисление.  Повторно — перемещение по группе объектов в определенном порядке.  Подсказка элемента — краткая фраза, описывающая элемент управления, стра- ницу или вкладку. Всплывающая подсказка отображается, когда пользователь ненадолго удерживает указатель мыши на элементе управления без нажатия кнопки мыши. Подсказки элементов управления схожи с подсказками для инструментов. Приложение Microsoft Forms предоставляет объекты ToolTip разработчикам во время создания приложения, а разработчики предоставляют подсказки элементов управления конечным пользователям во время работы приложения.  Прозрачный — указывает на то, что фон объекта невидимый. Вместо фона ото- бражается то, что находится за объектом, — например, изображение, используемое как фон приложения. Для установки прозрачности фона служит свойство BackStyle.
Глоссарий терминов Visual Basic for Applications 483  Редактор метода ввода (IME) — приложение, которое переводит введенные данные в символы языка DBCS, например японского или китайского. Как и пользовательские типы, IME отображает возможные эквиваленты. Пользователь выбирает наиболее подходящий вариант.  Связанный — описывает элемент управления, содержимое которого связано с определенным источником данных, — например, ячейкой или диапазоном ячеек на листе.  Системные цвета — цвета, определенные операционной системой для конкрет- ного типа монитора и видеоадаптера. В операционной системе Windows каждый цвет ассоциируется с определенной частью пользовательского интерфейса, — например, заголовком окна или меню.  Состояние клавиатуры — возвращаемое значение, обозначающее нажатые кла- виши и состояние модификаторов <Shift>, <Ctrl> и <Alt>.  Страница свойств — сгруппированный список свойств, представленный в виде страницы с вкладками на листе свойств.  Унаследованное свойство — свойство, получившее характеристики другого класса.  Формат данных — структура или внешний вид модуля данных, — например, файла, базы данных и ее записей, ячейки на листе или текста в документе.  Цвет переднего плана — цвет, выбранный для рисования и отображения текста на экране. На монохромных экранах цветом переднего плана является цвет точечного рисунка или другого изображения.  Цвет фона — цвет клиентской области пустого окна или экрана, на которой вы- полняется рисование и отображение цветов.  Цель — объект, на который перетаскивается другой объект.
484 Приложение 1
ПРИЛОЖЕНИЕ 2 Глоссарий терминов Visual Basic Editor Далее приведен список основных терминов редактора Visual Basic, необходимых для усвоения языка программирования VBA и его применения в Microsoft Excel 2021.  Z-порядок — визуальное наслоение элементов управления в форме вдоль оси z        для формы (глубина). Z-порядок определяет, какие элементы управления будут находиться впереди остальных элементов управления. Автоматическое форматирование — компонент, обеспечивающий автоматическое форматирование кода по мере ввода. При этом автоматически заменяются на прописные первые буквы ключевых слов, задаются стандартные интервалы, добавляются знаки препинания, а также устанавливаются основной и фоновый цвета. Аргумент (параметр) — константа, переменная или выражение, передаваемые в процедуру. Базовый класс — исходный класс, от которого наследуются производные классы. Библиотека динамической компоновки (DLL) — библиотека процедур, которая загружается в приложения и привязывается к ним во время выполнения. Для разработки библиотек DLL используются другие языки программирования — например, C, MASM или FORTRAN. Библиотека объектов — файл с расширением olb, в котором хранятся сведения о доступных объектах, предоставляемые автоматическим контроллером, таким как Visual Basic. Можно использовать обозреватель объектов Object Browser, чтобы изучить контент библиотеки объектов для получения сведений об объектах. Библиотека типов — файл или компонент внутри файла, который содержит стандартные описания открытых объектов, свойств и методов, доступных для автоматизации. Файлы библиотеки объектов с расширением olb содержат библиотеки типов. Ведущее приложение — любое приложение, поддерживающее работу с Visual Basic для приложений, — например, Microsoft Excel, Microsoft Project и т. д.
486 Приложение 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 487  Выражение объекта — выражение, которое задает конкретный объект и может включать любой из контейнеров объекта. Например, в приложении может присутствовать объект 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
488 Приложение 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 489  Константа условной компиляции — идентификатор Visual Basic, который опре- деляется с помощью директивы компилятора #Const или в ведущем приложении и используется другими директивами компилятора для определения порядка и необходимости компиляции отдельных блоков кода Visual Basic.  Конструктор — окно среды разработки Visual Basic, предназначенное для визу- альной разработки. В этом окне представлены визуальные функции создания новых классов.  Контейнер — объект, который может содержать другие объекты.  Литерал даты — любая последовательность знаков допустимого формата, за- ключенная в знаки решетки «#». Допустимые форматы включают формат даты, заданный региональными параметрами кода, или универсальный формат даты. Например, если для приложения установлены региональные параметры «Английский (США)», #12/31/92# — это литерал даты, который представляет 31 декабря 1992 года. Применение литералов обеспечивает эффективные возможности переноса между различными языковыми средами.  Логическая ошибка — ошибка программирования, в результате которой код пе- рестает выполняться или возвращает неверные результаты. Например, причиной логической ошибки может быть неверное имя или тип переменной, бесконечный цикл, ошибки сравнения или неверное определение массива.  Логическое выражение — выражение, при вычислении которого получается значение True (истина) или False (ложь).  Массив — набор последовательно индексируемых элементов, имеющих одина- ковый внутренний тип данных. Каждый элемент массива имеет уникальный индекс, идентифицирующий его в последовательности. Изменения одного элемента массива не влияют на остальные его элементы.  Массив элементов управления — группа элементов управления с общими име- нем, типом и процедурами событий. Каждому элементу в массиве присваивается уникальный индекс, который позволяет определить элемент, распознающий событие.  Метафайл — файл, в котором хранятся изображения в виде графических объек- тов, — например, линий, кругов и многоугольников, а не в виде наборов пикселов. Существуют два типа метафайлов: стандартные и расширенные. Стандартные метафайлы обычно имеют расширение wmf. Расширенные метафайлы обычно имеют расширение emf. Метафайлы при изменении размера изображения сохраняют изображение более точно, чем пикселы.  Метка строки — используется для обозначения одной строки кода. Метка строки может содержать любое сочетание знаков, но должна начинаться с буквы и заканчиваться двоеточием «:». Метки строк задаются без учета регистра и должны начинаться в первом столбце.  Метод — процедура, выполняющая действия в отношении объекта.  Модуль — набор объявлений, за которым следуют процедуры.
490 Приложение 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 491  Область — определяет видимость переменной, процедуры или объекта. Напри-             мер, переменная, объявленная как Public, доступна для всех процедур, описанных во всех модулях в проекте с прямой исходящей ссылкой, если только не действует опция Option Private Module. Когда опция Option Private Module активирована, модуль сам является частным, поэтому он недоступен для ссылающихся проектов. Переменные, объявленные в процедуре, доступны только внутри процедуры и теряют свое значение в интервалах между вызовами, если только они не объявлены как Static. Область кода — область окна кода, в которой вы можете вводить и редактировать код. Окно кода может содержать несколько областей кода. Обозреватель объектов — диалоговое окно, в котором можно просмотреть содержимое библиотеки объектов и сведения о выбранных объектах. Oбщая процедура — процедура, которая должна явно вызываться из другой процедуры. В отличие от нее, процедура события вызывается автоматически в ответ на действие пользователя или системы. Объект — сочетание кода и данных, обрабатываемое как единое целое, — например, элемент управления, форма или компонент приложения. Каждый объект определяется соответствующим классом. Объект ActiveX — объект, взаимодействующий с другими приложениями или инструментами программирования через интерфейсы автоматизации. Объект автоматизации — объект, который доступен для других приложений и программных инструментов через интерфейсы автоматизации. Объект источника событий — объект, являющийся источником событий, возникающих в ответ на какое-либо действие. Объект источника событий возвращается свойством. Например, свойство CommandBarEvents возвращает объект CommandBarEvents. Объявление — неисполняемый код, который объявляет имя константы, переменной или процедуры, а также их характеристики, — например, тип данных. В процедурах DLL с помощью объявлений задаются имена, библиотеки и аргументы. Окно объектов — список в правом верхнем углу окна кода, в котором представлены форма и ее элементы управления, к которым присоединен код. Также список в верхней части окна Properties, в котором представлены форма и ее элементы управления. Окно проекта — окно, которое отображает список формы, класса и стандартных модулей, файл ресурсов и ссылки в проекте. Файлы с расширениями ocx и vbx не отображаются в окне Project. Окно свойств — окно, используемое для отображения или изменения свойств выбранной формы или элемента управления во время разработки. Некоторые настраиваемые элементы управления имеют настраиваемые окна Properties. Оператор — синтаксически завершенная единица, которая отражает один тип действия, объявления или определение. Оператор обычно занимает отдельную
492        Приложение 2 строку, хотя можно использовать двоеточие «:» для включения двух или нескольких операторов в одной строке. Можно использовать символ продолжения строки «" _"», чтобы продолжить отдельную логическую строку на вторую физическую строку. Оператор сравнения — символ, символы или слово, обозначающие отношение между двумя или более значениями или выражениями. К ним относятся следующие: меньше «<», меньше или равно «<=», больше «>», больше или равно «>=», не равно «<>» и равно «=». Дополнительными операторами сравнения являются Is и Like. Обратите внимание, что операторы Is и Like нельзя использовать в качестве операторов сравнения в выражениях Select Case. Ошибка времени выполнения — ошибка, возникающая при запуске кода. Ошибка времени выполнения возникает, когда оператор пытается выполнить недопустимое действие. Параметр — имя переменной, по которому аргумент, передаваемый в процедуру, известен в этой процедуре. Эта переменная получает аргумент, переданный в процедуру. Ее область действия заканчивается в конце процедуры. Переменная — место именованного хранения, содержащее данные, которые могут быть изменены во время выполнения программы. У каждой переменной есть имя, которое однозначно определяет ее. Тип данных для переменной может не указываться. Имена переменных должны начинаться с буквенного символа, быть уникальными в пределах одной области, не должны быть длиннее 255 знаков и не могут содержать точку или символ определения типа. Переменная Empty — определяет переменную Variant без начального значения. Числовая переменная Empty определяется значением 0, а строковая — строкой нулевой длины «""». Переменная модуля — переменная, объявленная за пределами кода процедуры Function, Sub или Property. Модульные переменные необходимо объявлять за пределами любых процедур в модуле. Они существуют, пока модуль загружен, и видны во всех процедурах в модуле. Переменная объекта — переменная, которая содержит ссылку на объект.  Переменные Public — общедоступные переменные, объявленные с помощью атрибута Public, доступны для всех процедур во всех модулях во всех приложениях, если только не активировано свойство Option Private Module. В этом случае переменные являются общедоступными только внутри проекта, в котором они находятся.  По значению — способ передачи значения аргумента в процедуру вместо его адреса. Обеспечивает доступ из процедуры к копии переменной. В результате процедура не может изменять переданное в нее фактическое значение переменной.  По ссылке — способ передачи адреса аргумента в процедуру вместо значения. Обеспечивает доступ из процедуры к фактическому значению. В результате
Глоссарий терминов Visual Basic Editor 493 процедура может изменять переданное в нее фактическое значение переменной. Если иное не задано явно, аргументы передаются по ссылке.  Побитовое сравнение — побитовое сравнение расположенных в одинаковых позициях битов для двух числовых выражений.  Порядок сортировки — принцип очередности, используемый для упорядочива- ния данных, например по алфавиту, значению, возрастанию, убыванию и т. д.  Последовательность табуляции — порядок, в котором фокус перемещается с одного поля на другое при нажатии клавиши табуляции <Tab> или комбинации клавиш <Shit>+<Tab>.  Приложение — набор кода и визуальных элементов, которые работают вместе как одна программа. Для создания и выполнения приложений разработчики могут использовать среду разработки, в то время как пользователи чаще всего запускают приложения в виде исполняемых файлов вне среды разработки.  Проверка синтаксиса — функция, которая проверяет код на правильность син- таксиса. Если функция проверки синтаксиса включена, при вводе кода, который содержит синтаксическую ошибку, станет выводиться сообщение, а элемент кода будет выделен.  Проект — набор модулей.  Проект с исходящей ссылкой — текущий проект. Создание ссылки на проект зависит от хост-приложения. Например, чтобы прямо сослаться на проект в Microsoft Excel, надо выбрать проект в меню Tools (Инструменты) диалогового окна References (Ссылки). Общедоступные переменные в проекте с прямой ссылкой будут видны для проекта с прямой исходящей ссылкой, но общедоступные переменные в проекте с прямой исходящей ссылкой не будут видны в проекте, на который указывает ссылка.  Проект, на который указывает ссылка — проект, для которого создается ссыл- ка из текущего проекта. Проект, на который ссылается один из текущих проектов с прямой ссылкой, называется проектом с косвенной ссылкой. Его переменные, объявленные с атрибутом Public, недоступны в текущем проекте, за исключением случаев, когда выполняется обращение через имя проекта. Любое сочетание прямых и косвенных ссылок между проектами допустимо, если они не образуют цикл.  Процедура — именованная последовательность операторов, выполняемая как единое целое. Например, Function, Property и Sub являются типами процедуры. Имя процедуры всегда определено на уровне модуля. Весь исполняемый код должен находиться в процедуре. Процедуры не могут быть вложены в другие процедуры.  Процедура Sub — процедура, которая выполняет конкретную задачу в рамках программы, но не возвращает явное значение. Процедура Sub начинается с оператора Sub и заканчивается оператором End Sub соответственно.
494 Приложение 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 495 ются данные из полей текущей записи. При изменении данных в связанном элементе управления и переходе к другой записи изменения автоматически сохраняются в базе данных.  Символ объявления типа — символ, прикрепляемый к имени переменной и обо- значающий тип данных переменной. По умолчанию переменные имеют тип Variant, если только соответствующий оператор Deftype не присутствует в модуле.  Синтаксическая ошибка — ошибка, которая возникает при вводе строки кода, которую не распознает редактор VBE. Обратите внимание, что правила синтаксиса для отдельных ключевых слов представлены в специальном разделе справки, посвященном синтаксису. Для того чтобы получить справку по ключевому слову в среде разработки, выберите ключевое слово и нажмите клавишу <F1>.  Список процедур — список в правом верхнем углу окон кода и окне Debug, в котором отображаются процедуры, распознанные для объекта в окне Object.  Сравнение строк — сравнение двух последовательностей символов. Используй- те опцию сравнения Option Compare, чтобы задать сравнение двоичных данных или текста. Для английского языка (США) при двоичном сравнении учитывается регистр, а при сравнении текстовых значений регистр не учитывается.  Среда разработки — компонент приложения, в котором пишется код, создаются элементы управления, настраиваются свойства и элементы управления форм и т. д. Противопоставляется выполнению приложения.  Стандартный модуль — модуль, содержащий только процедуру, тип и объяв- ления и определения данных. Объявления и определения на уровне модуля в стандартном модуле являются общедоступными (Public) по умолчанию.  Стек — фиксированный объем памяти, применяемой для сохранения локальных переменных и аргументов во время вызовов процедур.  Строковая константа — любая константа (определенная с помощью ключево- го слова Const), состоящая из последовательности смежных знаков, которые интерпретируются как символы, а не как числовые значения.  Строковое выражение — любое выражение, результатом вычисления которого является последовательность смежных знаков. Элементы строкового выражения могут включать функцию, которая возвращает строку, строковый литерал, строковую константу, строковую переменную, строку Variant или функцию, которая возвращает значение типа Variant.  Строковый литерал — любое выражение, состоящее из последовательности смежных символов, заключенной в кавычки, которое интерпретируется как символы в кавычках.  Строковый тип данных — тип данных, состоящий из последовательности смежных символов, которые представляют сами символы, а не их числовые значения. Строка String может включать буквы, числа, пробелы и знаки препина-
496 Приложение 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. Переменные типа Byte хранятся в памяти как отдельные, беззнаковые 8-битовые (однобайтовые) числа.  Тип данных Date — используется для хранения вещественного числа, представ- ляющего дату и время. Переменные этого типа хранятся в виде 64-разрядных (8-битных) чисел. Значение слева от десятичного разделителя представляет дату, а справа — время.  Тип данных Decimal — тип данных, содержащий десятичные числа, кратные сте- пени 10. Поддерживаемый диапазон чисел без десятичных разрядов составляет ±79 228 162 514 264 337 593 543 950 335. Для чисел с 28 десятичными разрядами поддерживается диапазон ±7,9228162514264337593543950335. Наименьшее отличное от нуля число, которое может быть представлено с помощью типа Decimal, равно 10–28. Обратите внимание, что в настоящее время тип данных 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 497  Тип данных 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-mm-dd hh:mm:ss#. Тем не менее как компонент даты (#yyyy-mm-dd#), так и компонент времени (#hh:mm:ss#) могут быть представлены отдельно.  Уровень модуля — описывает код в разделе объявлений модуля. Уровню модуля принадлежит любой код, находящийся вне процедуры. В первую очередь указываются объявления, после которых определяются процедуры.
498 Приложение 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 499 жения. Элементы ActiveX поддерживают события и могут встраиваться в другие элементы управления.  Юникод — стандарт символа Международной организации по стандартизации (ISO). Юникод использует 16-разрядную (2-байтовую) схему кодирования, позволяющую кодировать 65 536 отдельных знаков. Юникод включает в себя представления для знаков препинания, математических символов и графических методов и имеет значительный объем свободного места для будущего расширения.  Языковые стандарты — набор данных, определяющих параметры для заданных языка, региона или страны. Языковой стандарт кода определяет язык терминов (например, ключевых слов) и специальные параметры, в том числе десятичные разделители и разделители списков, форматы данных и порядок сортировки знаков. Системный языковой стандарт определяет поведение поддерживающих соответствующие возможности функций, например функций отображения чисел или преобразования строк в даты. Для настройки системного языкового стандарта используются утилиты Панели управления операционной системы.
500 Приложение 2
ПРИЛОЖЕНИЕ 3 Описание электронного архива Электронный архив к книге выложен на сервер издательства «БХВ» по адресу: https://zip.bhv.ru/9785977518925.zip. Ссылка доступна и со страницы книги на сайте https://bhv.ru/. В НИМАНИЕ ! Пароль для распаковки электронного архива: VBAMicrosoftExcel2021 Электронный архив состоит из разделов, соответствующих главам печатной книги.  Папка Введение содержит следующие материалы: • Объектная модель Microsoft Excel 2021.pdf; • Свойства объекта Application.pdf; • Методы объекта Application.pdf;         • События объекта Application.pdf. Папка Глава_1_Основные_понятия_VBA содержит листинги, приведенные в главе 1. Папка Глава_2_Программирование_в_ячейках содержит листинги, приведенные в главе 2. Папка Глава_3_Условие содержит листинги, приведенные в главе 3. Папка Глава_4_Цикл содержит листинги, приведенные в главе 4. Папка Глава_5_Функции, определенные_пользователем содержит листинги, приведенные в главе 5. Папка Глава_6_Пользовательская_форма содержит листинги, приведенные в главе 6. Кроме того, в этой папке находятся рисунки, которые можно внедрить в форму. Папка Глава_7_Графические_элементы содержит листинги, приведенные в главе 7. Папка Глава_8_Работа_с ячейками_и_областями содержит листинги, приведенные в главе 8.
502 Приложение 3  Папка Глава_9_Работа_с_данными содержит листинги, приведенные в главе 9.  Папка Глава_10_Диаграмма содержит листинги, приведенные в главе 10.  Папка Глава_11_Программирование_объектов_и_событий содержит листинги, при- веденные в главе 11.  Папка Глава_12_Даты содержит листинги, приведенные в главе 12.  Папка Глава_13_Работа с рабочей книгой содержит листинги, приведенные в гла- ве 13.  Папка Глава_14_Файлы содержит листинги, приведенные в главе 14.  Папка Глава_15_Ошибки содержит листинги, приведенные в главе 15.  Папка Глава_16_Программирование_связей содержит листинги, приведенные в гла- ве 16. Кроме того, в этой папке есть текстовый файл Пример1.doc и презентация 16.06.pptx.
Предметный указатель A Activate 188, 412, 428 ActiveCell 53, 59 ActiveChart 411 ActiveChart.Location 348 ActiveSheet.Shapes 264 ActiveWorksheet 411 ActiveX 191, 192 Add 412, 428 Add Procedure 47 AddCallout 260 AddConnector 247 Additional Controls 190 AddLine 250 Address 283, 286 AddShape 243 Anchor 471, 472 Application 24, 279, 394 ◊ DisplayCommentIndicator 230 ◊ методы 280 ◊ свойства 279 Application.ActiveWindow 376 Application.AddIns 440, 442 Application.Caption 420 Application.Dialogs 415 Application.EnableCancelKey 465 Application.FileDialog 443 Application.FullName 421 Application.GetOpenFilename 416 Application.Goto 299 Application.OnTime 394 Application.Quit 426 Application.WorksheetFunction 304 Application.WorksheetFunction.Large 304 Application.WorksheetFunction.Small 304 ARRAYTOTEXT 297 AutoOutline 326 Axes 342 B BackColor 245 Blue 88 Boolean 32 Border 24 BorderAround 79 Break Mode 461 Byte 32, 69 ByVal 374 C Calculate 280 Caption 185, 193, 203 CDate 386 Cell 24, 87, 284 Cell (Ячейка) 281 Cells 428 Chart 24, 337, 342 ChartObject 337 ChartObjects.Add 339 Charts 337, 411 Charts.Add 339 ChartTitle 337, 342 ChartType 337, 342 CheckBox (Флажок) 228 Clear 298 ClearOutline 326 Click 61, 188 Close 413 Color 89 ColorIndex 90 ColorScale 109 Column 24 Columns 428 ComboBox (Поле со списком) 213, 214 CommandButton 95, 193 CommandButton (Кнопка) 196
504 CommandButton1 133 Comments 428 Context 460 Copy 187, 428, 475, 477 Count 353 CreateObject 475 CreateTextFile 436 Currency 32 Cвойство: Application.EnableCancelKey 465 D DashStyle 250 Date 33, 387 DateDiff 391 DatePart 391 DateSerial 387 Day 388 DblClick 215 Deactivate 188 Debug 468 Debug.Print 49, 385 Decimal 33 Delete 187, 297, 428 Dim 48 Dir 447 DisplayDrawingObjects 411 Do…Loop 134 Do…While…Loop 135 Documents.Open 476 Double 33, 178, 269 E ElseIf 114 End(xlToRight) 308 Environ 63 Err 462 Expression 460 F FileCopy 449 FileDialog 442 FileName 413 Fill 257 Font 24 For...Each 133 For...To...Next 126 For...To...Step...Next 125 ForeColor 245 Format 389 Formula2R1C1 160 FormulaLocal 175 Предметный указатель Frame (Рамка) 203 FullName 411 Function (Функция) 48 G GetAttr 444 GetFile 445 GetFolder 437 GetTickCount Lib "kernel32" 138 Goto 281 GoTo 122 Green 88 Group 258 H HasAxes 342 HasFormula 117 HasLegend 342 HasPassword 411 HasTitle 342 Height 186 Help 281 Hide 187 Hour 388 Hyperlinks 471 I If...Then...Else 114 If…Then 113 If…Then…Else 111, 114 Iif 151 Image (Рисунок) 216 Immediate 456 Immediate Window 50 Initilize 188 Input 438 InputBox 67, 121, 410 Integer 33 Interior 24 Interior.Color 99 Intersect 373 IsEmpty 117 IsNumeric 117 K Kill 448 L Label 194 Label (Подпись) 193
Предметный указатель LBound 309 Legend 337 LegendEntries 359 LegendKey 359 ListBox (Список) 210 ListObjects.Add 330 Load 187 Long 33, 68, 269 M Macros (Макрос) 50 Macros Name (Имя макроса) 50 MarginBottom 255 MarginLeft 255 MarginRight 256 MarginTop 256 Me 205, 380 Microsoft Excel, форматы файлов 435 Mid 293 Minute 388 Month 388 MsgBox 64, 410 MsoArrowheadLength 254 MsoArrowheadStyle 254 MsoAutoShapeType 243 msoConnectorCurve 246 msoPatternDiagonalBrick 249 msoShapeRectangle 244 MultiPage (Набор страниц) 228 N Name 116, 185, 193, 252, 344, 411, 428, 450 New Group (Новая группа) 237 NumberFormat 233 O Object 33, 438 Offset 62 On Error 119, 462 On Error GoTo 464 On Error GoTo 0 463 On Error Resume Next 463 OnAction 244 OnTime 281 OpenTextFile 438 Option Explicit 46, 453 OptionButton 180 OptionButton (Переключатель) 203 Orientation 59, 318 Output 438 Overflow 455 505 P PageSetup 434 ParamArray 169 Password 423, 425 Paste 477 Path 411 PathName 447 Patterned 248 PivotTable 332 Power Pivot 15 Power Query 13 PowerMap 16 PowerPoint.Application 477 Presentations.Open 479 PrintOut 352 Private 34, 48, 269 Private Type 269 Procedure 371 Protect 69, 413, 428 Protection.AllowFormattingCells 431 Public 34, 48, 269 Q Quit 281 R Raise 462 RAND 82 RandArray 84 Range (Диапазон) 24, 56, 60, 75, 82, 84, 281 ◊ методы 284 ◊ свойства 282 Range.AutoFill 395 Range.Copy 299 Range.CurrentRegion 290 Range.End 287 Range.Formula 82 Range.Formula2 84 Range.Hidden 299 Range.Interior 290 Range.Offset 295 Range.PasteSpecial 299 Range.Select 284 Range.SpecialCells 286 Red 88 ReDim 309 RefEdit (Ссылка) 232 RGB 88, 206 ROUND 159 Row 24
506 Rows 428 Run | Run Sub/UserForm 75 S Save 187, 413 SaveAs 413 Saved 411 Scripting.FileSystemObject 439 ScrollBar 207 ScrollBar (Полоса прокрутки) 206 Second 388 Select 159, 428 Selection 58, 284 SeriesCollection 357 Set 264 SetSourceData 342 Shapes 24, 243, 428 Shapes.AddChart2 364 Sheets 337, 411 Shell 418 Show 187, 188, 201 Single 33 Slicers.Add 331 SpecialCells 107 SpinButton (Счетчик) 220 Standard 184 StandardHeight 428 StandardWidth 428 Static 34 String 33, 68 Style 24 Sub 48 Sub (Подпрограмма) 48 T TabStrip (Набор вкладок) 224 TextBox (Поле) 199 TextFrame 255 ThreeD 260 Time 387 TimeSerial 387 ToggleButton (Выключатель) 235 Toolbox 190, 191 Tools | Options 52, 65 Trendline 359 Trendlines 337, 359 Trendlines.Add 359 TwoColorGradient 245, 257 Type 33, 460 Предметный указатель U UBound 309 Union 285 UNIQUE 160 Unload 187 Unload Me 205 Unprotect 70, 413 UnProtect 428 UpdateLinks 413 UsedRange 428 UserForm 183 V Value 56, 57, 79, 116, 460 Variant 33 VBA 11 vbCritical 66 vbExclamation 66 vbHide 418 vbInformation 66 vbMaximizeFocus 418 vbMinimizeFocus 418 vbMinimizeNoFocus 418 vbNormalFocus 418 vbNormalNoFocus 418 vbQuestion 66 View | Immediate Windows (Вид | Окно Просмотра) 139 View Microsoft Excel 73 Visible 344, 428 Visual Basic for Applications 11 Volatile 281 W Wait 281 Weekday 106, 388 WeekdayName 392 While...Wend 137 Width 186 With 57, 80 Workbook 24, 337, 411 ◊ свойства 411 Workbook.BeforeClose 383 Workbook.BeforeSave 384 Workbook.FollowHyperlink 453, 474 Workbook.LinkSources 417 Workbook.Name 419 Workbook.Protect 427 Workbook.Save 422 Workbook.SaveAs 422
Предметный указатель Workbook.SaveCopyAs 425 Workbooks.Add 420 Workbooks.Open 413 Worksheet 24, 428 ◊ методы 428 ◊ свойства 428 Worksheet.Activate 376 Worksheet.BeforeDoubleClick 380 Worksheet.BeforeRightClick 374, 382 Worksheet.Change 375 Worksheet.Deactivate 376, 382 Worksheet.Protect 428 Worksheet.SelectionChange 374, 376 Worksheet.UsedRange 290 WorksheetFunction 109 А Автоматический ввод атрибутов команд 51 Автофильтр 325 Активная ячейка (ActiveCell) 53 Аргумент ◊ Orientation 318 ◊ RGB 88 Арифметическое выражение 76 Б Безопасность макросов 39 Быстрые клавиши 71 В Венгерская нотация 193 Вкладка ◊ Данные 317 ◊ Разработчик 38 ◊ Рисование 156 Внедренная диаграмма 341 Всплывающая подсказка 65 Вычисление интеграла ◊ метод прямоугольников 177 ◊ метод Симпсона 177 ◊ метод трапеций 177 Г Геолокация 363 Гистограмма коническая 350 Границы 24 507 Worksheets 411 Worksheets.Activate 53 WriteReserved 411 X XlChartType 339 xlErrorHandler 465 XlListObjectSourceType 330 XLM 23 Y Year 388 График функции ◊ построение 145, 149 ◊ с двумя условиями 150, 153 ◊ с тремя условиями 154 Графика ◊ векторная 262 ◊ фрактальная 267 Д Дата 385 ◊ поиск 398 Диаграмма 24 ◊ в виде карты 364 ◊ печать 352 ◊ свойства 342 ◊ создание узоров 365 ◊ тип 339 ◊ удаление 354 ◊ форматирование параметров 355 Диалоговое окно ◊ Add Procedure XE "Add Procedure" (Добавить процедуру) 47 ◊ Add-in Manager 440 ◊ Additional Controls 190 ◊ Customize Control (Настроить элемент управления) 238 ◊ InputBox 67 ◊ Options 187 ◊ References - VBAProject 439 ◊ Вставка гиперссылки 471 ◊ Вставка значков 262
508 Диалоговое окно (прод.) ◊ Вставка функции 148 ◊ Надстройки 441 ◊ Назначить макрос объекту 131 ◊ Обзор 443 ◊ Открытие документа 415 ◊ Параметры Excel 40, 441 ◊ Формат элемента управления 240 ◊ Центр управления безопасности 39 Диапазон 24, 281 ◊ объединение 285 ◊ поиск максимума 300, 301 ◊ поиск минимума 300, 301 Динамический массив 17, 168 ◊ случайных чисел 83 З Запись макроса 164 Защита ◊ на уровне листа 69 ◊ рабочего листа 428 ◊ рабочей книги 427 ◊ снятие 70 ◊ ячеек рабочего листа 99 Значок фильтрации 329 И Измерение времени работы процедур 138 Имя 41 Инкапсуляция 23 Инструкция Option Explicit 46, 48 Инфографика 265 Итоги 325 К Календарь 400 ◊ по месяцам 402 ◊ по неделям 405 Карта 364 Категория, создание 161 Клавиатурное сокращение 173 Клавиши <Ctrl> и <G> 456 Класс 26 Ключевое слово ◊ ByVal 374 ◊ Me 380 ◊ ParamArray 169 Книга Excel с поддержкой макросов 42 Предметный указатель Кнопка 61, 93, 473 ◊ CommandButton 193 ◊ View Microsoft Excel 73 ◊ Включить содержимое 55 ◊ Вставить функцию 148 ◊ вызова Toolbox 190 ◊ Режим конструктора 98 ◊ Создать примечание 228 ◊ (Элемент управления формы) 131 Коллекция SeriesCollection 357 Команда ◊ Add-Ins 440 ◊ Debug 468 ◊ Debug | Run To Cursor 469 ◊ Debug | Step Into 468 ◊ Debug | Step Out 469 ◊ Debug | Step Over 469 ◊ Debug | Toggle Breakpoint 458 ◊ Insert | Module (Вставить | Модуль) 44 ◊ Run | Run Sub (Выполнить | Выполнить процедуру) 49, 53, 75, 89, 113, 120, 123, 126, 245, 293, 307, 351, 455 ◊ Tools References (Средства | Ссылки) 439, 471 ◊ Tools | Options 52, 65, 186 ◊ View | Immediate Windows (Вид | Окно Просмотра) 50, 385, 456 ◊ View | Locals 458 ◊ View | Project Explorer 44 ◊ View | Watches 459 ◊ Вставка | Гистограмма 343 ◊ Вставка | Значки 262 ◊ Данные | Структура | Промежуточный итог 325 ◊ Исходный текст 95, 344 ◊ Назначить макрос 200 ◊ Начать изменение узлов 267 ◊ объединение ячеек 291 ◊ Файл | Сохранить 78 ◊ Файл | Сохранить как 42, 50, 63, 76, 113, 126, 148, 189, 242, 245, 285, 307, 372, 386, 414, 437, 456 Комментарий 54 Константы 34 ◊ перечисления XlChartType 339 ◊ перечисления XlListObjectSourceType 330 ◊ табуляции 66 ◊ функции MsgBox 65 ◊ цвета 89
Предметный указатель Л Линия ◊ соединительная 246 ◊ тренда 359 Лист диаграммы 342 Литерал даты 386 Логический оператор 111 ◊ If…Then 113 ◊ If…Then…Else 114 ◊ вложенный 115 М Макрорекордер 164 Макрос 41 ◊ число обращений 378 Массив 166 ◊ динамический 308 ◊ с параметром 169 МАССИВВТЕКСТ 297 Метод 187 ◊ ActiveChart.Location 348 ◊ AddCallout 260 ◊ AddConnector 247 ◊ AddLine 250 ◊ AddShape 243 ◊ Application.GetOpenFilename 416 ◊ Application.Goto 299 ◊ Application.OnTime 394 ◊ Application.Quit 426 ◊ AutoOutline 326 ◊ Axes 342 ◊ BorderAround 79 ◊ ChartObjects.Add 339 ◊ Charts.Add 339 ◊ Clear 298 ◊ ClearOutline 326 ◊ CreateObject 475 ◊ CreateTextFile 436 ◊ Debug.Print 49 ◊ Delete 297 ◊ Documents.Open 476 ◊ End(xlToRight) 308 ◊ GetFile 445 ◊ GetFolder 437 ◊ Group 258 ◊ Intersect 373 ◊ ListObjects.Add 330 ◊ OneColorGradient 255 ◊ OpenTextFile 438 509 ◊ Patterned 248 ◊ Presentations.Open 479 ◊ PrintOut 352 ◊ Protect. 69 ◊ Raise 462 ◊ Range.AutoFill 395 ◊ Range.Copy 299 ◊ Range.PasteSpecial 299 ◊ Range.Select 284 ◊ Range.SpecialCells 286 ◊ SetSourceData 342 ◊ Shapes.AddChart2 364 ◊ Slicers.Add 331 ◊ SpecialCells 107 ◊ Trendlines.Add 359 ◊ Unprotect 70 ◊ Workbook.FollowHyperlink 453, 474 ◊ Workbook.LinkSources 417 ◊ Workbook.Protect 427 ◊ Workbook.Save 422 ◊ Workbook.SaveAs 422 ◊ Workbook.SaveCopyAs 425 ◊ Workbooks.Add 420 ◊ Workbooks.Open 413 ◊ WorksheetFunction.Weekday 106 ◊ Worksheets.Activate 53 Модуль 44 ◊ удаление 73 Н Надстройка 441 ◊ Power Pivot 15 ◊ Power Query 13 ◊ PowerMap 16 НАИБОЛЬШИЙ 301 НАИМЕНЬШИЙ 303 Наследование 23 О Область действия ◊ Private 34 ◊ Public 34 ◊ Static 34 Обработчик события 369 Объект 11, 24 ◊ Application 25, 279 ◊ Cell 284 ◊ Chart 342 ◊ ColorScale 109
510 Объект (прод.) ◊ Err 462 ◊ FileDialog 442 ◊ FileSystemObject 436 ◊ FillFormat 255 ◊ Hyperlinks 471 ◊ LegendEntries 359 ◊ LegendKey 359 ◊ Range 60 ◊ Range 75 ◊ Selection 284 ◊ Workbook 411 ◊ Worksheet 428 ◊ WorksheetFunction 109 Объектно-ориентированное программирование 22 Окно ◊ Immediate 456 ◊ Locals 458 ◊ Watches 459 ◊ проекта Project - VBA Project 44, 46 Операнды 76 Оператор ◊ Case 120 ◊ Dim 48 ◊ ElseIf 114 ◊ FileCopy 449 ◊ GoTo 122, 123 ◊ If...Then 113 ◊ If...Then...Else 111 ◊ Kill 448 ◊ Name 450 ◊ On Error 462 ◊ On Error GoTo 464 ◊ On Error GoTo 0 463 ◊ On Error Resume Next 463 ◊ Set 264 ◊ Static 49 ◊ With 57, 80, 81 ◊ вложенный With 81 ◊ неявного пересечения 20 ◊ сравнения 111 ◊ цикла 125 Оператор цикла ◊ Do…Loop 134 ◊ Do…While…Loop 135 ◊ For...Each 133 ◊ For...To...Next 126 ◊ For...To...Step...Next 125 ◊ While...Wend 137 Предметный указатель Оповещение системы безопасности 55, 56 Отладка программы 453 Ошибка ◊ выполнения 453 ◊ коды ошибок 461 ◊ компиляции 453 ◊ логики 453 ◊ синтаксическая 453 П Параметр ◊ FileName 413 ◊ UpdateLinks 413 Параметры страницы 434 Пароль 425 Переключатель 180 Переменная 34 ◊ Byte 69 ◊ Long 68 ◊ String 68 ◊ объектов 34 Перенос 19 Переполнение 455 Перечисление ◊ MsoArrowheadLength 254 ◊ MsoArrowheadStyle 254 ◊ MsoArrowheadWidth 254 ◊ MsoAutoShapeType 243 Перья 156 Поверхность 85 ПОИСКПОЗX 19 Полиморфизм 23 Полоса прокрутки, свойства 206 Пользовательская форма 183 ◊ UserForm 183 ◊ закрытие 205 ◊ Калькулятор 214 ◊ Квартплата 210 ◊ методы 187 ◊ Отображение данных 228 ◊ Персонализация данных 199, 200 ◊ Платежи 218 ◊ Победители олимпиад 223 ◊ показ формы 190 ◊ Работа с кнопками 197 ◊ Решение квадратного уравнения 194, 195 ◊ свойства 185, 186 ◊ события 188 ◊ Учет и контроль 226 ◊ Форматирование 204
Предметный указатель ◊ Форматирование ячеек 233 ◊ Цветовая модель RGB 207 ПОСЛЕД 19, 149 Построение поверхности 85 Приложение 24 ПРОСМОТРX 19 Процедура 47 ◊ вызов процедуры 173 ◊ обработки события 369 ◊ рекурсивная 269 Прямоугольник 200 Р Рабочая книга 24 Рабочий лист 24 Разработка проекта 42 Режим ◊ доступа 438 ◊ конструктора 62 ◊ останова 461 С Сводные таблицы (PivotTable) 332 Свойство 26 ◊ Address 286 ◊ Application.ActiveWindow 376 ◊ Application.Caption 420 ◊ Application.Dialogs 415 ◊ Application.DisplayCommentIndicator 230 ◊ Application.FileDialog 443 ◊ Application.FullName 421 ◊ Color 89 ◊ ColorIndex 90 ◊ DashStyle 250 ◊ Formula2 84 ◊ Name 116 ◊ NumberFormat 233 ◊ Offset 62 ◊ Orientation 59 ◊ Protection.AllowFormattingCells 431 ◊ Range.CurrentRegion 290 ◊ Range.End 287 ◊ Range.HasFormula 118 ◊ Range.Hidden 299 ◊ Range.Interior 290 ◊ Range.Offset 295 ◊ Selection 58 ◊ ThreeD 260 511 ◊ Value 116 ◊ Visible 344 ◊ Workbook.Name 419 ◊ Worksheet.UsedRange 290 Символ конкатенации 67 СЛМАССИВ 19, 83, 307 Событие 28, 187, 369 ◊ Workbook.BeforeClose 383 ◊ Workbook.BeforeSave 384 ◊ Worksheet.BeforeDoubleClick 380 ◊ Worksheet.BeforeRightClick 374, 382 ◊ Worksheet.Change 375 ◊ Worksheet.Deactivate 382 ◊ Worksheet.SelectionChange 374, 376 Создание ◊ календаря 105 ◊ категории 162 СОРТ 19 Сортировка 316 ◊ блоков 319 ◊ по цвету 322 ◊ при помощи Среза 328 СОРТПО 19 Сочетание клавиш 71, 173 ◊ <Ctrl>+<Shift>+<F9> 458 Список Procedure 371 Срез 328 Ссылка 471 Стиль 24 Столбец 24 Стрелка 253 Строка 24 Структура кода процедуры 52 Т Таблица Excel, создание 328 Тело цикла 125 Тип данных 32 ◊ PowerPoint.Application 477 ◊ определенный пользователем 268 Тип линии DashStyle 250 Тип процедуры ◊ Function 48 ◊ Sub 48 Точка прерывания 458 У УНИК 19
512 Ф Файл 435 ◊ атрибуты 444 ◊ документирование 445 ◊ копирование 449 ◊ переименование 450 ◊ перемещение 450 ◊ создание 436 ◊ список файлов 437 ◊ существование 447 ◊ удаление 448 Фигура 24 ◊ AddShape 243 ◊ заливка 257 ◊ имя 252 ◊ придание объемности 260 ◊ текстовая рамка 255 ◊ удаление 262 ФИЛЬТР 19 Формат SVG 262 Формула динамического массива 17 Фрактал 268 ◊ из многоугольников 273 Функция 145 ◊ API 138 ◊ CDate 386 ◊ Date 387 ◊ DateDiff 391 ◊ DatePart 391 ◊ DateSerial 387 ◊ Day 388 ◊ Dir 447 ◊ Environ 63 ◊ Format 389 ◊ GetAttr 444 ◊ Hour 388 ◊ Iif 151 ◊ InputBox 67, 121 ◊ IsEmpty 117 ◊ IsNumeric 117, 195 ◊ LBound 309 ◊ Mid 293 ◊ MsgBox 64, 65 ◊ RAND 82 ◊ RandArray 84 ◊ RGB 88 ◊ ROUND 159 Предметный указатель ◊ ◊ ◊ ◊ ◊ ◊ ◊ ◊ Shell 418 Time 387 TimeSerial 387 UBound 309 Weekday 388 WeekdayName 392 вызов из процедуры 171 определенная пользователем 146, 148, 446  с тремя аргументами 160  без параметров 163  с аргументом Range 165  с аргументом массив 169 ◊ ПОСЛЕД 149 ◊ рабочего листа 24 ◊ СЛМАССИВ 307 Э Элемент управления 190 ◊ ActiveX 191, 192 ◊ CheckBox 228 ◊ ComboBox 213 ◊ CommandButton 196 ◊ Frame 203 ◊ Image 216 ◊ Label 193 ◊ ListBox 210 ◊ MultiPage 228 ◊ OptionButton 203 ◊ RefEdit 232 ◊ ScrollBar 206 ◊ SpinButton 220 ◊ TabStrip 224 ◊ TextBox 199 ◊ Выключатель 235, 343 ◊ панели Toolbox 191 ◊ полоса прокрутки 239 ◊ собственный 237 ◊ формы 130, 238, 239, 243 Элементы ActiveX 61 ◊ переключатель 180, 181 Я Ячейка 24, 281 ◊ абсолютная адресация 281 ◊ адресация 281 ◊ относительная адресация 282 ◊ смешанная адресация 282