Книга
Книга
Глава 1 ・ Краткое руководство по VBA 17
Глава 2, Рабочая область Microsoft Excel80
Глава 3. Создание трюков с помощью макросов 168
Глава 4. Трюки и эффекты с помощником 281
Глава 5・ Эксперименты с диаграммами289
Глава 6. Создание полезных программ 306
Глава 7. Полезные советы 339
Приложение. Основные объекты Excel 351
Алфавитный указатель....... 367
111213131616^ ^^^^^^^^^^^^^^^^^^^^^^^^^^111213131616^ ^^^^^^^^^^^^^^^^^^^^^^^^^^
111213131616^ ^^^^^^^^^^^^^^^^^^^^^^^^^^
111213131616^ ^^^^^^^^^^^^^^^^^^^^^^^^^^
Оглавление
Структура книги
Общие положения
Назначение и функциональные возможности Microsoft Excel Используемая терминология Тексты программ на сайте издательства От издательства
Глава 1. Краткое руководство по VBA
Знакомство с VBA
Возможности VBA
Структура проекта VBA
Структура модуля VBA
Соглашения, применяемые при описании синтаксиса VBA
Комментарии в программе
Идентификаторы
Переменные
Встроенные типы данных
Ссылки. Тип данных Object
Объявление переменных Инициализация переменных Явное и неявное объявление переменных
Константы
Операторы
Операторы для работы с численными значениями
Операторы сравнения
Логические операторы
Массивы
Объявление массива..
Задание нижней границы по умолчанию Изменение размера массива Определение границ массива
Доступ к элементам массива Использование переменной Variant при работе с массивами Использование функции Array для заполнения массива
Коллекции36
Добавление элементов37
Количество элементов в коллекции 37
Удаление элементов из коллекции38
Доступ к элементам коллекций38
Определяемые пользователем типы данных38
Структуры 38
Перечисления 41
Управление выполнением программы 42
Циклы43
Инструкции выбора46
Инструкции безусловного перехода49
Процедуры и функции51
Объявление процедур 51
Вызов процедур 53
Объявление функций. Возврат значения54
Вызов функций55
Особенности передачи параметров56
Определение и преобразование типов переменных58
Определение типов переменных58
Преобразование типов60
Файловый ввод/вывод61
Открытие файлов 61
Дескрипторы файлов. Функция FreeFile62
Закрытие файлов63
Чтение из файлов и запись в файлы63
Определение конца файла 66
Определение текущей позиции файла66
Стандартные окна сообщени访67
Обработка ошибок времени выполнения68
Перехват ошибок69
Обработка перехваченных ошибок69
Классы в VBA 71
Создание класса на VBA71
Свойства класса 72
Методы класса * 73
Использование класса в программе 73
Использование API-функций 8 VBA 74
Объявление API-функций 75
Вызов API-функций 76
Использование объектов Excel76
Объектная модель Excel77
Доступ к объектам Excel из программы78
Глава 2. Рабочая область Microsoft Excel80
Рабочая книга * 81
Автозапуск любимого файла при загрузке Excel81
Эксперимент с кнопкой Закрыть на панели инструментов81
Общий макрос для всех книг Excel82
Восстановление важной информации из испорченного файла83
Быстрое размножение рабочей книги83
Сохранение рабочей книги с именем, представляющим собой текущую дату 84
Создание книги с одним листом 85
Установка и снятие защиты рабочей книги85
Закрытие рабочей книги только при выполнении условия86
Быстрое удаление из рабочей книги ненужных имен87
Сортировка листов в текущей рабочей книге88
Импорт данных, для которых нужно более 256 столбцов92
Рабочий лист 95
Листы-синонимы 95
Автоматическая вставка URL-адреса95
Быстрый переход по рабочему листу96
Разные листы с общими данными97
Рисование «правильных» фигур97
Скрытие данных от посторонних 97
Новый лист — через макрос 98
Блокировка использования контекстного меню98
Вставка колонтитула с именем книги, листа и текущей датой99
Проверка существования листа99
Проверка, защищен ли рабочий лист 100
Сколько страниц на всех листах? 101
Автоматический пересчет данных таблицы при изменении ее значений 101
Ячейка и диапазон 103
Быстрое заполнение ячеек 103
Автоматизация ввода данных в ячейки 103
Ввод дробных чисел 104
Сбор данных из разных ячеек 105
Выделение диапазона над текущей ячейкой 105
Поиск ближайшей пустой ячейки столбца 106
Поиск максимального значения в диапазоне 106
Автоматическая замена значений диапазона 107
Засекречивание содержимого ячейки 107
Всем ячейкам диапазона — одно значение 109
«Фотографирование» ячеек 109
Добавление в ячейку раскрывающегося списка 110
Быстрое заполнение диапазона 110
Гиперссылки ——в виде обычного текста 114
Помещение в ячейку электронных часов 115
«Будильник» 115
Поиск данных в диапазоне* 116
Создание цветной границы диапазона 118
Автоматическое определение адреса ячейки 118
Автоматизация добавления примечаний в указанном диапазоне 119
Заливка диапазона 120
Ввод строго ограниченных значений в указанный диапазон 120
Последовательный ввод данных 123
Быстрое выделение ячеек с отрицательными значениями 124
Получение информации о выделенном диапазоне125
Панель инструментов изменения числового формата ячейки127
Тестирование скорости чтения и записи диапазонов 129
Работа с формулами 131
Складывание и вычитание даты и времени 131
Складывание диапазонов разных листов 131
Накопление итога в ячейке 131
Быстрое размножение формул 132
Маскировка формул от других пользователей 132
Быстрое суммирование всех ячеек столбца или строки 133
Вместо формулы — текущее значение 133
Повышение точности вычисления формул 134
Быстрая проверка правильности формул 134
Скрытие сообщений об ошибках при вычислениях. 136
Разработка и применение полезных п о л ьзо вател ьских функций 136
Объединение данных диапазона 137
Объединение данных с учетом форматов 138
Эксперименты с датой 139
Выбор из текста всех чисел 139
Прописная буква только в начале текста 140
Перевод uncen в «деньги» 140
Подсчет количества повторов искомого текста 142
Суммирование данных только видимых ячеек 143
При суммировании — курсор внутри диапазона 143
Вывод суммы прописью 144
Начисление процентов в зависимости от суммы * 144
Еще о расчете процентов 146
Сводный пример расчета комиссионного вознаграждения 147
Подсчет количества ячеек, содержащих указанные значения 150
Подсчет количества видимых ячеек в диапазоне 151
Поиск ближайшего понедельника * 152
Подсчет количества полных лет... 153
Проверка, была ли сохранена рабочая книга 153
Расчет средневзвешенного значения 154
Преобразование номера месяца в его название 155
Расчет суммы первых значений диапазона 155
Поиск последней непустой ячейки диапазона 156
Поиск последней непустой ячейки столбца 156
Поиск последней непустой ячейки строки 157
Подсчет количества ячеек в диапазоне, содержащих указанные значения 157
Англоязычный текст — заглавными буквами 158
Отображение текста «задом наперед» 159
Поиск максимального значения на всех листах книги 160
Использование относительных ссылок 161
Определение типа данных ячейки 162
Выделение из текста произвольного элемента 163
Генератор случайных чисел 165
Случайные числа ——на основании диапазона 166
Глава 3. Создание трюков с помощью макросов 168
Подсчет количества открытий файла■ 169
Получение «закрытой» информации 170
Произвольный текст в строке состояния 170
Быстрое изменение заголовка окна 171
Ввод данных с помощью диалогового окна 173
Применение функции без ввода ее в ячейку 174
Скрытие строк и столбцов от посторонних 174
Быстрое выделение ячеек, расположенных через интервал 177
Определение количества ячеек в диапазоне и суммы их значений 178
Подсчет именованных объектов 180
Быстрый поиск курсора 181
Поиск начала и окончания диапазона, содержащего данные 181
Трюки с примечаниями 182
Подсчет примечаний 182
Вывод на экран всех примечаний рабочего листа 183
Создание списка примечаний рабочего листа 184
Несколько трюков в одном примере 186
Дополнение панели инструментов% 188
Примеры создания панелей инструментов 189
Формирование пользовательского меню 192
Проверка наличия файла по указанному пути 194
Автоматизация удаления файлов 197
Перечень имен листов в виде гиперссылок 198
Удаление пустых строк на рабочем листе 199
Запись текущих данных в текстовый файл200
Экспорт и импорт данных201
Одновременное умножение всех данных диапазона203
Преобразование таблицы Excel в HTML-формат205
Поиск данных нештатными средствами 210
Включение автофильтра с помощью макроса 211
Трюки с форматированием 212
Изменение формата представления чисел нештатными средствами ... 212
Помещение последнего символа ячейки над строкой 213
Создание нестандартной рамки 213
Быстрая вставка фамилий должностных лиц в документ214
Вызов окна настройки шрифта 215
Вывод информации о текущем документе 216
Вывод результата расчетов в отдельном окне 216
Вывод разрешения монитора 217
Что открыто в данный момент? 218
Создание бегущей строки 219
Создание бегущей картинки 219
Мигающая ячейка 221
Вращающиеся автофигуры* 222
Вызов таблицы цветов 225
Создание калькулятора 226
Еще о создании пользовательских меню228
Меню с пользовательскими командами 228
Замена стандартного меню пользовательским 233
Склонение фамилии, имени и отчества 234
Получение информации об используемом принтере 239
Вывод текущей даты и времени 241
Автоматическое создание документов Word на основе табличных данных Excel 242
Создание списка панелей инструментов и контекстных меню 245
Создание списка пунктов главного меню Excel 246
Создание списка пунктов контекстных меню * 247
Отображение панели инструментов при определенном условии 248
Скрытие и отображение панелей инструментов 251
Создание меню на основе данных рабочего листа 252
Создание контекстного меню 256
Просмотр содержимого папки 260
Получение информации о состоянии дисков 265
Расчет средне「о арифметического 267
Вывод списка доступных шрифтов 268
Обработка сразу нескольких внешних файлов 269
Запуск таблицы символов из Excel 271
Создание раскрывающегося списка 274
Добавление команды в меню276
Добавление команды в меню Сервис276
Добавление команды в меню Вид 277
Глава 4. Трюки и эффекты с помощником281
Мультфильм с помощником в「павно济 роли 282
Дополнение помощника текстом, заголовком, кнопкой и значком283
Новые параметры помощника285
Использование помощника для выбора цвета заливки286
Глава 5. Эксперименты с диаграммами289
Построение диаграммы с помощью макроса290
Сохранение диаграммы в отдельном файле 293
Построение и удаление диаграммы нажатием одной кнопки294
Вывод списка диаграмм в отдельном окне296
Применение случайной цветовой палитры 297
Эффект прозрачности диаграммы 298
Построение диаграммы на основе данных нескольких рабочих листов... 300
Создание подписей к данным диаграммы 303
Глава 6. Создание полезных программ 306
Программа для составления кроссвордов307
Написание макросов307
Создание пользовательских форм311
Порядок использования программы313
Игра «Минное поле»315
Игра «Угадай животное»318
Расчет на основании ячеек определенного цвета323
Создание программы 323
Работа с программой 337
Глава 7. Полезные советы339
Приложение, Основные объекты Excel351
Объект Application 351
Объект Chart 355
Объект Range 357
Объект Workbook362
Объект Worksheet 364
/Алфавитный указатель367
Введение
В настоящее время табличный редактор Excel, который является разработкой корпорации Microsoft и входит в состав пакета Microsoft Office, является одним из самых популярных программных продуктов. Во многом это обусловлено возможностью применения Excel в самых разных отраслях: данную программу используют математикиг IT-разработчики, инженеры, экономисты, бухгалтеры, аналитики, менеджеры и т. д. Такое распространение Excel объясняется широкими функциональными возможностями программы и вместе с этим простотой в использовании (удобным и понятным пользовательским интерфейсом, возможностью быстрого ввода н обработки данных, наглядностью представления информации и др.).
Порядок использования программы подробно описывается в справочной подсистеме (вызов справки осуществляется нажатием клавиши F1 или с помощью команды главного меню Справка ► Справка: Microsoft Excel), Однако в процессе эксплуатации программы можно также использовать приемы и методы, которые в стандартной документащш не рассматриваются либо рассматриваются поверхностно — как правило» потому, что они становятся известны только в результате активной эксплуатации Excel (то есть открываются опытным путем). Иногда они являются сюрпризом даже для самих разработчиков и открывают новые, порой самые неожиданные возможности программы. Описанию подобных трюков и посвящена эта книга.
Большинство описываемых в книге трюков и эффектов выполняется средствами языка VBA (переход к редактору VBA осуществляется с помощью команды глав* ного меню Сервис ► Макрос ► Редактор Visual Basic или комбинации оавиш Alt+Fll). Наряду с этим книга содержит описание приемов, BbinoJiHHCNfbix «подручнылш> средствами, без программирования.
Структура книги
В главе 1 рассказывается об основах программирования на встроенном в пакет Microsoft Office языке Visual Basic for Applications (VBA). Главный упор сделан на описание синтаксиса и особенностей использования основных конструкций VBA.
В главе 2 рассматриваются нестандартные, но вместе с этим полезные и практичные решения, которые можно реализовать в рабочей области профам мы; здесь же рассказывается о приемах работы с файлами Excel (то есть с рабочей книгой). Приводится описание нестандартного использования формул Excel, а также порядок формирования и применения большого количества пользовательских функций. В отдельный раздел вынесено описание трюков и эффектов^ которые применяются к ячейкам и диапазонам рабочего листа.
Глава 3 является самой объемной. В ней описывается большое количество самых разнообразных трюков и эффектов, относящихся к различным сферам использования
профаммы. В частности, здесь рассказывается о созданп и пользовательских меню (как обьшных, так и контекстных) н панелей инструментов,。нестандартных приемах форматирования, о работе с примечаниями и др. Большинство приведенных в данной главе трюков имеют практический характер, но есть и такие, реализация которых служит лишь развлекательным либо эстетическим целям.
Пользователи программы наверняка знают, что пр» работе со справочной информацией можно использовать системного помощиикат в качестве которого выступает забавный анимированный персонаж. В главе 4 рассматривается несколько трюков, которые можно применить к встроенному системному помощнику. Особо следует отметить сугубо развлекательный, но весьма интересirwii трюк с «танцующим» по- мощннкоМт описание которого приводится в разделе «Мультфильм с помощником в главной роли» (этот трюк можно применить к любому из имеющихся в системе анимированных персонажей).
У тех пользователей, которые часто работают с диаграммами, наверняка вызовет интерес глава 5. В ней рассказывается, как бьгетро создать диаграмму с помощью макроса, создать диаграмму на основашш данных нескольких рабочих листов, быстро изменять тип диаграммы с помощью специально созданного контекстного меню II др.
В главе 6 приведено несколько примеров создания небольших программ — как раа- влекательных, так и применяемых в работе, а также показаны приемы использования созданных лршрамм.
В главе 7 содержится перечень полезных советов, которые могут пригодиться как начинающим» так и опытным пользователям программы. Для удобства восприятия материал представлен в режиме «вопрос — ответ».
В приложении описаны наиболее часто используемые в приведенных в книге примерах стандартные объекты Excel: Application, chart, Range, workbook и Worksheet.
Общие положения
При написании книги использовалась версия Excel 2002. Тем не менее большинство приведенлых в книге трюков работает и в других версиях программы.
Перед тем как вплотную приступать к изучению нестандартных приемов работы с Excel, кратко вспомним, для решения каких задач предназначена данная программа и каковы ее функциональные возможности, а также определимся с основными терминами и понятиями, которыми мы в дальнейшем будем оперировать.
Подразумевается, что данную книгу будут m^iaTii пользователи, имеющие как мн- нимум начальное представление об Excel. Тем не менее не будет лишним вспомнить, какие задачи решаются с помощью этой программы, а также ознакомиться с используемой в книге терминологией.
тз
Назначение и функциональные возможности Microsoft Excel
Табличный редактор Microsoft Excel предназначен для решения следующих задан*
Ввод и обработка табличных данных с использованием встроенных механизмов формул, функций, макросов к др.
Анализ и управление данными (автоматический расчет итоговых н промежуточных данных, структуризация н консолидация данных, использование сводных таблиц и отчетов и др.).
Импорт необходимых данных из различных источников (включая базы данных OLAP) и последующая их обработка. Поддержка XML-формата.
Работа с графическими объектами и диаграммами.
Взаимодействие н обмен данными с программой Lotus Notes, а также интегра* ция с другими программными продуктами («Галаю'шса»,《1С® и др.).
Работа в Интернете (изменение данных на веб-странице, размещение данных Microsoft Excei в Интернете, поддержка веб-файлои н гиперссылок и др.).
Доступ к данным совместно с другамл программами (Word, PowerPoint, Access и др-)-
Формирование самых рагшообразпьгх отчетов: аналитических» сводных, графи^ ческих, в виде диафамм и др.
Выполнение стандартных функций Microsoft Office: печать документа, поиск данных рг их замена, проверка наличия ошибок, защита данных ” др,
Создание приложений с применением языка программирования VBA.
С помощью Excel можно решать и другие задачи, возникновение которых обусловлено потребностями конкретного пользователя.
Используемая терминология
В данной книге используются следующие основные термины и понятия.
Автофигура — готовая к использованию фигура заданной()юрмы, которую можно добавлять на рабочий лист или в диаграмму. В Excel имеется встроенный набор автсфшур.
Диаграмма — визуальный способ представления числовых значений. Программа Excel поддерживает работу с различными видами диаграмм: гистограммами, круговыми» пузырьковыми, графиками и др,
Имя — идентификатор, который предоставляет возможность ссылаться на какой-либо объект (ячейку, диапазон, формулу и т, д.)-
口 Комментарий — текст, который следует в программном коде сразу после символа 41» вплоть до окончания данной строки и игнорируется при выполнении программы. Комментарий обычно включает в себя произвольную информацию
вспомогательного характера, предназначенную для описания н пояснения определенных фрагментов кода либо всего кода.
Контекстное меню — меню, содержащее список команд, которые предназначены для работы с конкретным объектом. Для вызова контекстного меню нужно щелкнуть на объекте правой кнопкой мыши 1ши нажать комбинацню клавиш Shift+FID.
Макрос — программа, которая написана на встроенном в Excel языке протрам- мнровання Visual Basic for Application (VBA). Переход в режим работы с макросами осуществляется с помощью команд подменю Сервис ► Макрос.
Массив — определенное количество ячеек либо значений, с которым работают как с единым целым. Иначе говоря, массив — это группа элементов одного типа, которые имеют общее имя.
Модуль — совокупность описаний, инструкций и процедур, сохраненная под общим именем в редакторе VBA.
口 Надстройка — программа, внедренная в Excel с целью расширения функциональных возможностей. Для подключения надстроек следует воспользоваться командой главного меню Сервис ► Надстройки.
口 Настройка — изменение ныне действующих параметров работы Microsoft Excel стандартными средствами, доступ к которым осуществл я ется из рабочего интерфейса Excel. Параметры работы программы можно разделить на два основных вида,
Общие параметры — редактирование этих параметров приведет к соответ
ствующим изменениям во всех рабочих книгах, в том числе и во вновь создаваемых.
ПРИМЕЧАНИЕПРИМЕЧАНИЕЛокальные параметры — редактирование этих параметров вызовет соответствующие изменения только в текущей книге.
ПРИМЕЧАНИЕ
ПРИМЕЧАНИЕ
Некоторые параметры работы Microsoft Excel можно изменить без использования стандартных средств.
Область задач — элемент программы, предназначенный для быстрого выбора одной из нескольких связанных задач.
Панель инструментов — панель, включающая в себя кнопки и иные элементы управления, которые используются для выполнения различных команд. Управление отображением панелей инструментов осуществляется с помощью команд подменю Вид ► Панели инструментов. Для перехода в режим настройки панелей следует выполнить команду Вид ► Панели инструментов ► Настройка.
Печать — вывод содержимого рабочей книга (полностью либо частично) на бумажный носитель с помощью принтера. На печать можно выводить следующие объекты: рабочую книгу, несколько рабочих книг, рабочий лист, несколько рабочих листов, диапазон ячеек на рабочем листе, диапазон ячеек на нескольких рабочих листахг графические объекты, диаграммы. При этом существует возможность вывода на печать нескольких копий объекта за один сеанс.
Пользовательский интерфейс — средство взаимодействия пользователя с программой. В состав пользовательского интерфейса входят меню, панели инструментов, диалоговые окна и др. В Excel применяется стандартный цользователь- ский интерфейс Windows.
Примечание — вспомогательная информация произвольного характера, относящаяся к определенной ячейке и хранящаяся независимо от содержимого этой ячейки. Чтобы добавить примечание к какой-либо ячейке, нужно выделить ее курсором и выбрать в контекстном меню пункт Добавить примечание, после чего с клавиатуры ввести требуемый текст.
Рабочая книга — файл, который создается, редактируется и сохраняется средствами Microsoft Excel. В большинстве случаев рабочая книга имеет расширение XLS. Основной структурной единицей рабочей книги является рабочий лист (см. ниже),
Рабочий лист — основной элемент рабочей книги, предназначенный для ввода, редактирования и хранения данных, а также для выполнения вычислений. По умолчанию в состав рабочей книги включены три рабочих листа. Основной структурной единицей рабочего листа является ячейка (см. ниже). В состав каждого рабочего листа входит 16 777 216 ячеек, которые образуют сетку из 65 536 строк и 256 столбцов.
口 Редактор VBA — интегрированная среда разработки, в которой осуществляется написание кодов (программирование) на языке VBA. Переход в данный режим выполняется с помощью команды главного меню Сервис ► Макрос ► Редактор Visual Basic.
Строка заголовка — стандартный элемент интерфейса многих приложений, расположенный в его верхней части. В данной строке отображается имя программы.
Строка формул — предназначена для ввода формул и редактирования содержимого ячеек.
Форматирование — изменение отображения ячейки (ее «внешнего вида^) либо представления данных, содержащихся в ячейке. Параметры форматирования ячейки не зависят от ее содержимого, и наоборот. Не стоит забывать, что после применения форматирования отображенное в ячейке значение может не совпадать с ее фактическим значением (наиболее характерный пример —округление: в ячейке хранится значение о, 24, но в соответствии с параметрами форматирования иа экране может отображаться значение 0,2).
СОВЕТ
Точное фактическое значение, хранящееся в ячейке, при необходимости можно увидеть в строке формул, где оно отображается независимо от параметров форматирования.
□ Формула — специальный инструмент Excel, предназначенный для расчетов, вычислений и анализа данных. Формула может включать в себя константу, оператор, ссылку, имя ячейки (диапазона) и функцию (см* ниже). Операторы бывают трех видов.
Арифметический оператор — предназначен для выполнения арифметических действий и выдающий в качестве результата числовое значение.
Оператор сравнения - используется для сравнения данных и выдает в качестве результата логическое значение истина или ложь.
Текстовый оператор — применяется для объединения данных.
Функция — готовая формула Microsoft Excel для расчетов, вычислений н анализа данных. Каждая функция может включать н себя константу, оператор, ссьип^, имя ячейки (диалсшона) и формулу. Пользовательская функция — это функция, написанная пользователем на языке VBA.
Электронная таблица — интерактивная программа, состоящая из набора строк и столбцов, которые выводятся на экран в отдельном окне.
Ячейка — наименьшая (элементарная) часть электронной таблицы, предназначенная для ввода и хранения информации. Каждая ячейка мажет содержать текст, число или формулу. Кроме того, при работе с ячейками используются следующие элементы.
■ Адрес — это месторасположение (координаты) ячейки. Адрес состоит из буквы (номера) столбца н номера строки, на пересечении которых расположена данная ячейка.
• Ссылка — указание на адрес ячейки. Ссылки могут быть абсолютными (то есть нс изменяющимися при перемещении и когшрованнн ячейки), относительны ми (эти ссылки изменяются при перемещении и копировании ячейки) н смешанными. Внешняя ссылка — это ссылка на ячейку, расположенную в другой рабочей книге.
После того как мы вспомнили основные термины м понятия, испол1)зуемыс в Excel, можно приступать к изучению нестандартных приемов н методов работы сданной программой. И в первую очередь мы рассмотрим трюк л, выполняемые в рабочей области.
Тексты программ на сайте издательства
Все приведенные в книге коды протрамм (листинги) можно загрузить с сайта издательства ^Пнтер» по адресу http://www,piterxom/download/9785469O1223/.
От издательства
Ваши замечания, предложения и вопросы отправляйте по адресу электронной почты gurski@minsk.piterxom (издательство «Питера, компьютерная редакция).
Мы будем рады узнать ваше мнение!
На сайте издательства http://www.piter.com вы найдете подробную информацию о наших книгах.
Краткое руководство по VBA
Цель данной главы — ознакомить читателя с основами программировал ия на встроенном в пакет Microsoft Office языке Visual Basic for Applications (VBA).
Эта глава рассчитана на пользователей, имеющих некоторый опыт создания программ на других объектно-ориентированных языках программирования, то есть представляющих, что такое переменная, константа, оператор, цикл, масснв, класс, объект и т. д. Главный упор в данной главе сделан на описание синтаксиса и особенностей использования основных конструкций VBA*
Знакомство с VBA
VBA — это язык программирования, поддерживаемый большинством приложений пакета Microsoft Office. Для запуска среды программирования VBA можно использовать команду меню Серэис ► Макрос > Редактор Visual Basic или сочетание клавиш ALt+Fll.
Возможности VBA
Благодаря высокой степени интефаци» в приложения, язык VBA обеспечивает программисту возможность легко использовать существующие возможности Microsoft Office для решения специфических задач. Не менее легко VBA позволяет добавлять в приложения этого пакета новые возможности, увеличивая их функциональность и удобство работы с шши.
Применительно к Excel программист HaVBA может реализовывать следующие возможности (естественно, это далеко не полный список):
добавление функций, выполняющих специфические расчеты;
ускорение ввода данных в таблицу;
автоматизацию типичных, часто выполняемых пользователем действий;
создание новых команд меню, панелей инструментов как на основе уже имеющихся, так и выполняющих совершенно новые действия;
повышение наглядности данных (например, с помощью различной окраски ячеек);
автоматизацию обработки больших объемов данных;
口 автоматизацию создания разнообразных отчетов, бланков и прочих действий, связанных с выбором заданной информации из большого объема исходных данных.
Реализация всех этих возможност成 при использовании VBA очень часто достигается написанием небольшого количества достаточно простого программного кода.
Структура проекта VBA
Внешний вид редактора VBA с открытым проектом представлен на рис. 1,1.
Знакомство с VBA
Рис. 1.1. Проект VBA
В редакторе открыты три окна: слева вверху — окно структуры проекта (Project), слева внизу — окно свойств (Properties) и справа — окно с текстом программы модуля. С помощью окна Project (Проект) можно просматривать структуру проекта, добавлять и удалять элементы проекта, открывать для редактирования содержимое модуля (двойным щелчком на значке соответствующего модуля). Окно Properties (Свойства) используется для задания свойств выделенных элементов проекта.
В общем VBA-npocKT в Microsoft Excel может содержать следующие элементы:
модули (стандартные модули VBA);
口 модули класса;
модули рабочей книги;
модули рабочих листов;
модули диаграмм;
формы.
Стандартный модуль VBA
Стандартный модуль VBA — это элемент проекта, который содержит программный код, непосредственно используемый остальными элементами проекта (глобальные функции, переменные, константы и т. д.). В окне структуры проекта стандартные модули группируются в папку Modules.
Обычно в стандартном модуле записываются программы, которые не привязаны к конкретным объектам^ таким как рабочий лист н рабочая книга. Именно в этом модуле записывается большинство примеров (трюков), рассматриваемых в после- дующ!1Х главах книги.
Модуль класса
Модуль класса — это модуль, в котором записывается профаммпый код, реализую' щлй работу пользовательских (созданных программистом) классов. В окне структуры проекта такие модули группируются в папку Class Modules.
Модуль рабочей книги
Модуль рабочей книги (Эта книга в папке Microsoft Excel Objects) — это модуль масса, в котором реализуются дополнительные возможности по мая и пулировапшо рабочей книгой. Программы, записанные в этом модуле, могут напрямую обращаться к свойствам и методам объекта рабочей книги (см. описание модулей класса в конце главы). Отличием модуля рабочей книп! от обычного модуля класса является т(х что из программы на VBA нельзя создать экземпляр объекта рабочей книги — он создается автоматически.
Модуль рабочего листа
Модуль рабочего листа (папка Microsoft Excel Objects) — это модуль класса» в котором реализуются дополнительные возможности по манипулирован ию определенными рабочими листами книги. Программы, записанные в этом модуле, могут напрямую обращаться к свойствам и методам объекта рабочего листа. Из программы на VBA также нельзя создать экземпляр объекта конкретного рабочего листа — можно создать только новый рабочей лист с пустым модулем.
Модуль диаграммы
Модуль диаграммы (папка Microsoft Excel Objects) — это модуль класса, в котором реализуются дополнительные возможности по манипулированию диаграммами, вынесенными на отдельные листы рабочей книги. Особенности модуля диаграммы аналогичны особенностям модуля рабочего листа.
Форма
Форма (папка Forms) — это элемент проекта VBA, с помощью которого можно создавать диалоговые окна для взаимодействия с пользователем. Форма состоит из двух частей: модуль формы и собственно форма (диалоговое окно).
Модуль формы — это модуль класса, в котором реализуется поведение формы. Использование этого модуля аналогично использованию обычного модуля класса. Для открытия модуля формы используется пункт View Code (Просмотр кода) контекстного меню окна Project (Проект). ,
Для задания внешнего вида диалогового окна используется редактор форм, который открывается с помощью пункта View Object (Просмотр объекта) контекстного меню. Форма, открытая для редактирования внешнего вида, показана на рис. 12
CocnaujeHna, применяемые nps списании смнтакс/са VBACocnaujeHna, применяемые nps списании смнтакс/са VBAРис. 1.2. Редактирование формыРис. 1.2. Редактирование формы
CocnaujeHna, применяемые nps списании смнтакс/са VBA
CocnaujeHna, применяемые nps списании смнтакс/са VBA
Рис. 1.2. Редактирование формы
Рис. 1.2. Редактирование формы
Для изменения свойств открытой формы используется окно Properties (Свойства). В окне Toolbox (Панель инструментов) можно выбирать элементы управления, добавляемые в форму. После добавления любого элемента управления двойным щелчком на нем можно перейти к редактированию соответствующего кода в модуле формы.
Структура модуля VBA
При разработке любой программы на VBA программный код записывается в одном или нескольких модулях, типы которых были рассмотрены ранее. Код, запн- санный в любом модуле VBA, имеет следующую структуру,
1* Объявления переменных, директивы (с использованием к-точевого слова Option), объявлешы API-функций.
2. Объявления и реализация процедур и функций.
Соглашения, применяемые при описании синтаксиса VBA
В данном разделе приводится описание элементов, которые используются для фор- мальнош задания синтаксиса конструкций языка VBA. Сведешь об зтюс элементах приведены в табл, 1.1.
Таблица 1.1. Элементы описания синтаксических конструкций VBA
Элемент
Описание
Значение
Текст, написанный курсивом, обозначает произвольное значение (константное, такое как строка "D:\asd.txt”, или значение переменной)
Инструкции
Это слово используется для обозначения произвольной последовательности инструкций программы. Может употребляться с номером, например «Инструкции!». Также может употребляться в составе словосочетания в его начале, например «Инструкции подпрограммы»
Open
Текст, записанный без использования курсива (кроме слова «Инструкции»)» является ключевым словом или идентификатором VBA (названием инструкции» оператора, функций и т. д,)
[Необязательный_Эдемент\
Используется для указания необязательных элементов конструкции
Элемент! j Элемент}
Применяется для указания возможности выбора употребляемого элемента конструкции (то есть использовать или элемент!, или злемент2)
Используется для указания возможности повторения последнего элемента консарукции бесконечное количество раз
ПРИМЕЧАНИЕ
Кроме описанных в таблице элементов, при задании формата синтаксических конструкций и в текстах программ используется символ подчеркивания «_». Он является стандартным символом VBA. Текст, который заканчивается символом подчеркивания, представляет собой одно целое с текстом на следующей строке.
Чтобы сказанное выше стало более понятно, ниже приведен пример формального задания синтаксической конструкции языка VBA. В качестве примера взят формат упрощенного объявления локальной переменной (смысл всех элементов данной конструкции будет полностью раскрыт в последующих разделах главы):
Dim I Static Имя_переменноИ [As Имя^типа] [, Имя_переменной [As Имя_типа]]...
Приведенная запись означает, что строка объявления локальной переменной должна начинаться инструкцией Dim или static. После инструкции должен следовать идентификатор переменной. Необязате^1Ыiым элементом конструкции является указание типа переменной. Но если тип указывается, то значение в квадратных скобках (первых) должно быть использовано полностью, то есть ключевое слово As не должно использоваться без указания имени типа. Объявления переменных можно продолжить в этой же строке без повторного использования инструкции Dim, но разделяя их запятой (см. вторые скобки). Подобные объявления можно продолжать в строке до бесконечности (об этом говорит использование многоточия после вторых скобок).
2323Идентификаторы
23
23
Примеры объявлений переменных, удовлетворяющие указанному формату, приведены ниже:
Dim intPos As Integer
Dim varValue, intValue As Integer
Static sttText As String
Static varl As Variant, var2 As Variant, var3 As Variant
Комментарии в программе
В VBA предусмотрены два способа введения комментариев в програмхгы. Первый — это использование ключевого слова Rem для обозначения начала комментария. Второй —использование вместо Rem апострофа (')・ Главным различием этих двух способов является то, что ключевое слово Rem должно находиться в начале строки программы. При этом вся строка является комментарием. Например:
Rem Объявление переменной
Dim intRes as Integer
Rem Присвоение значения переменной
intRes = 123
Комментарий же, вводимый с помощью апострофа, может быть расположен как в отдельной строке, так и на одной строке с друпши пнструкцпяшг (в конце этой строки):
I Объявление переменной
Dim intRes As Integer
intRes = 123 * Присвоение значения переменной
Все комментарии в VBA являются однострочьгышг, но при необходимости их текст может быть перенесен на следующую строку с использованием символа подчеркивания:
'Длинный комментарий, текст которого не помещается _ в одной строке
ИЛИ
Rem Длинный комментарий, текст которого не помещается _ в одной строке
Идентификаторы
Идентификаторам и в VBA являются названия переменных, констант, функций, процедур, классов, типов данных и прочих элементов, не являющихся зарезервированными словами языка (названиями инструкций, операторов, встроенных функций ит. д»).
Среда разработки VBA поддерживает кодировку символов Unicode. Поддержка данной кодировки разработки означает, что программист может использовать в составе идентификаторов символы любого поддерживаемого алфавита (например, кириллвды).
При формировании идентификаторов необходимо учитывать следующее.
Идентафикатор должен состоять только из букв (любого алфавита), цифр и символа подчеркивания.
Первым символом идентификатора должна быть буква.
■ ВНИМАНИЕ
[ VBA не различает регистр символов в идентификаторах. Это значит, что
•идентификаторы strmylext и st「MyText будут представлять одну и ту же пе
ременную. Это же справедливо и для идентификаторов процедур, функций, классов и т. 口,
Рассмотрим примеры корректных идентификаторов VBA:
strText
CUSTOM__Data2
Функция_Суммы
РасчетПрибыли
Переменные
Данный раздел предназначен для того, чтобы ознакомить читателя с основными особенностями использования переменных при напнеаннн программ на языке VBA.
Встроенные типы данных
VBA располагает множеством встроенных типов данных. Условно эти типы можно разделить на численные, строки, ссылки и типы для хранения даты п времени.
Численные типы данных
Основные характеристики численных типов VBA приведены в табл. 12
Таблица 1.2. Численные типы данных VBA
Тип
Объем памяти (байт)
Диапазон значений
Byte (байт)
1
От 0 до 255
Integer (целое)
2
От-32 768 до 32 767
Тип
Объем памяти (байт)
Диапазон значений
Long (длинное целое)
4
От-2 147 483 648 до 2 147 483 647
Single
(с плавающей точкой)
4
От -3 402 823Е3 8 до 一】.401 298Е-45, от 1,401 298Е-45 до 3.402 823Е38
Double
(с плавающей точкой двойной точности)
8
От -1.797 693 134 862 3 2Е308 до -4.940 656 458 412 47Е-324, от 4.940 656 45 8 412 47Е-324 до 1.797 693 134 862 32Е308
Currency
(масштабируемое целое)
8
От -922 3 37 203 685 477.5808 до 922 3 37 203 685 477.5807
Decimal (фиксированной ДЛИНЫ, повышенной точности)
14
Без дробной части:
+/-79 22 8 162 514 264 337 593 543 950 335;
с максимальной точностью:
+/-7.922 816 251 426 433 759 3 54 395 033 5 (до 2 8 знаков после запятой)
1 Variant
(для числовых значений)
16
Любое значение из указанных для остальных типов диапазонов
ПРИМЕЧАНИЕ
Численный тип Decimal как самостоятельный тип на сегодняшний день не поддерживается. Однако его можно использовать в пределах типа Variant (о типе Variant будет рассказано далее).
Строки
Для хранения символьных данных в VBA реализована поддержка типа данных string (строка). В переменных этого типа могут храниться как отдельные символы, так и большие фрагменты текста. Строки в VBA бывают двух видов: фиксированной длины и переменной длины. Разница между этими двумя типами строк понятна из*их названий.
Строки фиксированной длины применяются тогда, когда длина текста, хранимого н них» постоянна или не может превышать известный предел (например, для хранения отдельных символов). Строки фиксированной длины в ряде случаев обрабатываются быстрее строк переменной длины. Максимальная длина строки фиксированной длины — около 65 400 символов,
Строкн переменной длины являются более гибким инструментом обработки текста в программах на VBA. Длина этих строк может динамически изменяться в зависимости от длины хранимого в них текста. Максимальная длина таких строк — около 2 млн символов.
Дата и время
Для удобства работы со значениями даты и времени в VBA введен тип данных Date. Он позволяет задавать значения времени и даты в формате, удобном для воспрня・ тия, а также упрощает вычисления с временными интервоами. Этот тип данных, естественно, используется н в таблицах Excel.
Для строгости нужно заметить, что тип Date не является внутренним типом, исполь^ эуемым VBA для хранения даты н времени. Вместо него применяется тип Single (чиспо с плавающей точкой). Целая часть этого числа — количество суток прошедших с 30 декабря 1899 года, дробная — прошедшая часть текущих суток.
Тип данных Variant
В VBA предусмотрен один универсальный тип данных — variant. Переменная этого типа может хранить значение любого поддерживаемого VBA типа (в том числе и ссылки на объекты, о которых будет рассказано ниже).
Однако при обработке переменных типа Variant тратится дополнительное время на определение и преобразование типа данных в этих переменггых — самый уш<вер- сальиый тип данных VBA оказывается и самым медленным. Поэтому следует избегать слишком частого и неоправданного использования переменных этого типа (например, в качестве целочисленных итераторов» счетчиков н т. д.).
Когда переменная типа variant пуста (ей не присвоено никакого значения), она заполняется специальным значением Empty*
Ссылки. Тип данных Object
Важно понимать, что в VBA переменные, предоставляющие доступ к объектам, являются только ссыжсами на эти объекты. В данном языке программирования невозможно получить сам объект (его двогглтый код). Все операции ио созданию, мажшулиро* ванию и удалению объектов осуществляются только с использованием ссылок.
Обьекты,доступные из VBA, существуют, пока на лих установлена хотя бы одна ссылка. Первая ссылка на объект устанавливается при его создании. В процессе работы можно как устанавливать новые ссылки на объект, так и удалять их (с использованием специальной пнструкщш Set). Пусть objRef — ссылка на некого- pwii объект. Тогда операция установления новой ссылки будет иметь такой вид:
Set objNewRef = objRef
Теперь objNewRef ссылается на тот же объект, что и objRef. Операция же удаления ссылок будет вьи.1ядеть следующтш образом:
Set objNewRef - Nothing
Set objNewRef = Nothing
Если на объект не было других ссылок кроме этих, то он будет удален.
Для доступа к объектам в VBA предусмотрен тип данных object. Он является универсальным, так как может быть ссылкой на объект любого типа.
Объявление переменных
Для объявления переменных элементарных типов (не массивов) в блоке объявлений модуля используется следующая инструкция:
Public I Private [WithEvents] Имя^переменной [As [New] Имя^тштз] _ [,Имя_переменной [As [New] Имя^типа]]….
Ключевые слова, записанные до первых квадратных скобок, задают область видимости переменных:
Public — позволяет объявлять глобальные переменные и общие переменные- члены класса (о классах будет рассказано позже);
Private — позволяет объявлять переменные, доступные только в одном модуле, и частные переменные-члены класса.
Для объявления переменных элементарных типов (не массивов) в процедурах или функциях используется такая инструкция (локальных переменных):
Dim I Static [WithEvents] Ж<я_переменной [As [New] Имя_типа] _ [, Имя^переменной [As [New] Имя_тица]]...
Ключевые слова, записанные до первых квадратных скобок, задают время жизни переменных:
口 Dim — используется для объявления локальных переменных, которые уничтожаются после выхода из процедуры;
static — используется для объявления локальных переменных, значения которых сохраняются между вызовами процедуры или функции.
Ключевое слово WithEvents используется для указания того, что переменная может обрабатывать события объектов ActiveX.
Имя_переменной — это идентификатор объявляемой переменной.
Имя_типа — название тапа данных объявляемой переменной.
Если конструкция [As [New] Имя_типа] не используется, то типом объявляемой переменной автоматически становится тип Variant.
Если используется ключевое слово New, то создается новый объект. New нельзя использовать совместно с Wi thEvents, а также при объявлении переменной типа obj ect и если тип Имя_типа не является объектным.
Ниже приведены примеры объявления переменных на VBA:
Public intData As Integer
Private intCount As Integer, varData
Dim strText As String
Static a, b, c
Dim objRef As Object
Dim objCtrl As New Control
ВНИМАНИЕ
При объявлении 8 одной строке нескольких переменных слово As относит.ся только к переменной, непосредственно после идентификатора которой
оно следует Например, при объявлении Dim a, b, с As Integer переменные а и b будут иметь тип Variant, а переменная с — тип Integer.
Инициализация переменных
После того как переменная объявлена, VBA производит ее мнициализацию указанным ниже образом.
Переменным численных типов автомат! 1ческ11 npiicваивается пулевое значение.
口 Строки переменной длины после объявления являются пустыми (имеют нулевую длину). Строки фиксированно!! длины заполняются нулевыми символами.
Данные типа Date инициал из ируются значением 00:00:00 10.12.18 9 9 (это равняется нулю при представлении даты в чпслениом формате, о котором было рассказано выше).
Все переменные типа object и подобные (то есть ссылки на объекты определенного типа) принимают значение Nothing, если при их объявлении не создан новый объект (не использовоось New).
Явное и неявное объявление переменных
Рассмотренное выше объявление переменных называется явным.
VBA также поддерживает неявное объявление переменных. Под неявным объявлением подразумевается возможность использования переменной без ее объявления посредством инструкции Dim, static, Private или Public. При первом обращении такой переменной для нее автоматически выделяется память и происходит ее инициализация. Следует отметить, что все неявно объявленные переменные имеют тип Variant.
Использование неявного объявления переменных может как упростить написание программ, так м значительно усложнить процесс их отладки. Например, можно долго разбираться, почему после вычисления выражения dblSalaryAccount = dblSalaryAcount * 10.5 значение переменной dblSararyAccount стало равным нулю, если до этого оно было равно 5.375. Все дело в небольшой ошибке в названии идентификатора переменной, в результате которой создается новая переменная dblSalaryAcount, которая иннцнализируется нулевым значением. При ис- пользовашш явного объявления переменных подобных ошибок в программе быть не может, потому что каждый раз при нахождении необъявленного идентификатора VBA выдает ошибку.
Для включения требования обязательного объяшюгшл переменных используется директива Option Explicit. Чтобы данная директива добавлялась в каждый новый
модуль автоматически, нужно с помощью меню Tools ► Options (Сервис ► Параметры) редактора VBA открыть диалоговое окно Options (Параметры) и на вкладке Editor (Редактор) установить флажок Require Variable Declaration (Явное описание переменных).
Константы
Как и в любом другом языке программирования, в VBA можно сопоставлять с идентификаторами константные значения.
Объявление констант в языке VBA во многом сходно с объявлением переменных. Синтаксис инструкции объявления константы следующий:
[Public I Private] Const Имя_ коне таять/ [As Жя_типа] = Значение Два ключевых слова в первых скобках задают область видимости константы:
Public — используется для объявления глобальных констант;
Private — используется для объявления констант, доступных только в том модуле, где онк объявлены.
По умолчанию, то есть когда не употреблены указанные ключевые слова, константа является Private.
Имя_константпы — задает идентификатор константы.
Значение — константное значение (например, пСтрока_1м, 1.245 H т. д.) либо выражение, в число аргументов которого не входят переменные и функции.
Если тип константы не задан, то он автоматически выбирается VBA исходя из ее значения. Ниже приводятся примеры объявления констант:
Const PI As Double = 3.14159265359
Public Const MyConstString = "MyConst"
Private Const НазваниеТаблицы As String = •'Отчеты*1
Операторы
Язык VBA содержит большое количество встроенных операторовт которые позволяют выполнять разнообразные действия над всеми встроенными в VBA типами. Операторы и их операнды по определегшым правилам составляются в выражения. Данный раздел посвящен описанию операторов» предоставляемых VBA-программисту.
Операторы для работы с численными значениями
Информация обо всех операторах для работы с численными значениями приведена в табл. 1.3.
Таблица 1.3. Операторы для работы с численными значениями
Формат оператора
Описание
Результат = Выражение
Оператор присвоения правой части выражения левой
Результат = Выражение! + Выражение!
Оператор суммы
Результат = Выражение! - Выражение2
Оператор разности
Результат = Выражение! * Выражение!
Оператор произведения
Результат = Выражение! / Выражение?
Оператор деления
Результат = Выражение! \ Выражение2
Оператор целочисленного деления (возвращает целую часть от результата деления)
Результат = Выражение! Mod Выражение2
Оператор, возвращающий остаток от деления
Результат = Выражение! Л Выражение2
Оператор возведения в степень. Основание степени — Выражение 1ч показатель степени — Выражение}
ПРИМЕЧАНИЕ
Оператор «+» может использоваться и для соединения строк. Однако в VBA существует специальный оператор «&», выполняющий эту функцию. Рекомендуется использовать для соединения строк именно оператор «&», так как это способствует легкому визуальному отделению операций над строками от операций над другими типами данных, что, в сзою очередь, улучшает читаемость кода.
Операторы сравнения
Результатом выполнения всех операторов сравнения является значение типа Boolean. Если операнды какого-либо оператора удовлетворяют его условию, то возвращается значение True, иначе возвращается значение False. Все операторы сравнения, поддерживаемые VBA, приведены в табл. 1.4.
Таблица 1 ・4. Операторы сравнения
Формат оператора
Описание
Результат = Выражение! = Выражение^
Оператор равенства. Возвращает True, если значения выражений равны
Результат = Выражение! > Выражение2
Оператор «больше». Возвращает True, если значение Выражение! больше значения Выражение!
Результат = Выражение 1 < Выражение2
Оператор «меньше». Возвращает True, если значение Выражение! меньше значения Выражение!
Результат = Выражение 1 >= Выражение!
Оператор «больше либо равно». Возвращает True, если значение Выражение! больше или равно значению Выражение2
Формат оператора
Описание
Результат = Выражение! <= Выражение}
Оператор «меньше либо равно». Возвращает True, если значение Выражение! меньше или равно значению Выражение?
Результат = Выражение! о Выражение2
Оператор неравенства. Возвращает True, если значения выражений не равны
Описанные операторы сравнения могут принимать в качестве операндов значения выражений любого типа, то есть фактически оперируют с типом данных Variant. Если один из операндов равен Empty, то результатом выполнения операторов будет специальное значение null. Если операнды несравнимы, то при выполнении описанных выше операторов генерируется ошибка: «Несоответствие типао.
Режим сравнения строковых значений можно задать с помощью директивы option Compare. Для Excel работают два варианта данной директгаы: Option Compare Text (текст сравнивается без учета регистра символов) и Option Compare Binary (сравниваются бинарные коды символов, при этом автоматически учитывается их ре- шстр). По умолчанию сравнение строк происходит согласно директиве Option Compare Binary.
В VBA реализованы два специфических оператора, которые тоже относятся к операторам сравнения, — это операторы Like и is. Эти операторы также возвращают значение типа Boolean как результат сравнения.
Оператор is используется для определения, являются ли две ссылки ссылками на один и тот же объект- Этот оператор допускает использование в качестве операндов только ссылки на объекты. Формат данного оператора такой:
Результат = Ссылка工 Is Ссылка2
Оператор Like используется для проверки, удовлетворяет ли текст в строке заданному шаблону. Формат этого оператора следующий:
Результат - Строка Like Шаблон
Перечень символов» которые могут употребляться в строке шаблона, приведен в табл. 1.5.
Таблица 1.5. Перечень возможных символов в строке шаблона
Символы в шаблоне
Соответствующие символы в строке
*
Любое количество любых символов
?
Любой одиночный символ
#
Любая одиночная цифра
[Сп исок_сим волов]
Любой одиночный символ из заданного списка
[! Сп исок_с1Шво^ов]
Любой одиночный символ, не входящий в заданный список
В качестве примера определим, является ли строка ”15 26 оа1' номером автомобиля серии ОЛ или ОО. Значение строкгьшаблонэ будет равно ”*# ## о [АО] ^, а результатом при менен ня оператора "15 26 оа” Like " # # # # о [АО] п будет значение True,
Для задания непрерывного диапазона символов в квадратных скобках можно воспользоваться знаком «минус» (-). При этом символы необходимо указывать в возрастающем порядке (по номеру в алфавите): [A-Z] а не [z-А].
勿 ПРИМЕЧАНИЕ
Если необходимо, чтобы в шаблоне присутствовали специальные симво- 犷 лы, приведенные в табл. 1.5, то необходимо заключить соответствующие знаки в скобки: ([), (]), (#), (?), (*).
Логические операторы
В VBA введен ряд операторов, которые используются в составе логических выражений (например, условие в инструкции lf*Then-Else> которая будет рассмотрена позже). Формат логических операторов VBA (кроме имплшсации) н их описание приведены в табл. 1.6 (все выражен ля, используемые в операторах, — логические, принимающие значение True или False).
Таблица 1.6. Логические операторы VBA
Формат оператора
Описание
Результат = Выражение! Eqv Выражение!
Эквивалентность. Возвращает True, еелн значения выражений равны
Результат = Выражение! And Выражение!
Логическое И, Возвращает True, если оба выражения имеют значение True
Результат = Выражение! Ог Выражение}
Логическое ИЛИ. Возвращает True, если как минимум одно из выражений имеет значение True
Результат = Выражение/ Хог Выражеиие2
Исключающее ИЛИ. Возвращает True, если выражения имеют противополож11ые значения
Результат = Not Выражение
Логическое НЕ. Возвращает значение, противоположное значению выражения Выражение
Массивы
При создании программ часто приходится оперировать большими количествами данных одного типа и имеющих одинаковый смысл. Для хранения таких данных используются массивы. Массив — это совокупность значений одного типа, объединенных в одной переменной.
Язык VBA предоставляет широкие возможности для использования массивов. В данном языке программирования работа с массивами значительно упрощена. Например,
при выполнении программы автоматически контролируется выход за пределы массива. Также VBA-программисту при работе с массивами не нужно заботиться о выделении и освобождении памяти.
Объявление массива
Для объявления массивов в VBA используются инструкции, формат которых приведен ниже:
Public I Private Имя_массива ([Размерность]) [As Имя_типа] [, Имя_массива ([Размерность]) [As Имя_типа] J . *.
ИЛИ
Dim I Static Имя_массива ([Размерность])[As Имя^типа] _ [, Имя_массива ([Размерность]) [As Имя^типа] ] * ..
Первая инструкция используется для объявления массивов на уровне модуля, вторая —для объявления массива в процедуре или функции (все аналогично объявлению переменных).
Объявление массива отличается от объявления любой другой переменной тем, что при объявлении массива после идентификатора переменной указывается размерность. Если размерность не указана, то создается длналшческпй массив, размер которого можно изменять во время выполнения программы. Для динамического массива инструкция объявления является формальной: чтобы этот массив можно было использовать, к нему необходимо применить инструкцию ReDim (об этой мнструк- пнн будет рассказано далее).
При указании размерности массива необходимо учитывать, что элемент Размерность имеет следующим формат:
Нижняя_граница То Верхняя^граница I Количество_элементов 一 [,Нижняя_граница То Верхияя_граница I Количество_элементов]...
В VBA разрешено создавать многомерные массивы с количеством измерений не более 60. Размерности измерений массива разделяются запятой.
При задании размерности в виде Нижняя_граница То Верхняя драница нужно явно указывать нижнюю и верхнюю границы измерения массива (например, 50 То 100). При заданин размерности можно также просто указывать требуемое количество элементов в данном измерении массива. При таком задании в качестве нижней границы измерешы используется значение по умолчанию (об изменении этого значения будет рассказано далее).
Ниже приведены примеры объявлений массивов (переменного размера, двух одномерных и двух многомерных):
Dim avarValues()
Dim astrValues(1 To 10) As String, astrValues2(10> As String
Dim aintValues(1 To 10, 1 To 3) As Integer, aintValues(10, 3) As Integer
Задание нижней границы по умолчанию
Как было сказано ранее, при указании размерности измерения массива может использоваться значение нижней границы по умолчанию.
Для задания нижней границы, используемой по умолчанию, предназначена директива Option Base.
Существуют только два варианта данной директивы:
Option Base О
И
Option Base 1
Первый вариант устанавливает нижнюю границу равной нулю (используется по умолчанию), а второй — единице.
Изменение размера массива
Язык VBA позволяет изменять размер динамического массива во время выполнения программы. Кроме того, VBA дает возможность изменять количество измерений такого массива. Для этого используется инструкция ReDim, формат которой следующий:
ReDim [Preserve] Имя^массива ([Размерность]) [As к(мя_типа] [,Имя_массива ([Размерность]) [As Имя^типа]]...
Назначение элементов данной инструкции полностью аналогично назначению одноименных элементов инструкции Dim (при использовании ее для объявления массивов). Тип элементов массива можно указывать только в том случае, если Имя_массива — это идентификатор переменной типа Variant.
При выполнении инструкции ReDim без использования 1слючевого слова Preserve значения всех элементов, которые ранее были в массиве, теряются. Ниже приведены примеры таких инструкций:
ReDim astrValues(1 То 10), aintValues(10z 20)
ReDim varArray(2 To 4) As Boolean
Использование Preserve позволяет изменять размер массива, не теряя значений его элементов. Однако использование данного ключевого слова налагает ряд ограничений на возможности манипулирования массивами:
口 нельзя изменять количество измерений массива;
нельзя изменять размерности измерений массива, кроме размерности последнего измерения;
можно изменять только верхнюю границу последнего измерения массива.
Рассмотрим пример использования инструкции ReDim с ключевым словом Preserve:
Первая инструкция ReDim для динамического массива
ReDim astrValues(1 То 5, 1 То 10)
'Увеличение размера массива
ReDim Preserve astrValues(1 То 5, 1 То 25)
'Уменьшение размера массива
ReDim Preserve astrValues(1 То 5, 1 То 15)
Определение границ массива
Так как VBA позволяет задавать произвольную нижнюю границу массива, при написании программ крайне удобно наличие возможности узнать граиицы массива во время выполнения программы. Для этой цели в VBA введены две функции, формат которых следующий:
LBound (Имл_массива [, Номер_измерения])
RBcund (Имя^массива [, Номер__измерения])
Функщ1я LBound позволяет получить нижнюю границу массива, a RBound — верхнюю. Обе функции принимают в качестве аргументов идентификатор массива и номер измерения, границу которого нужно получить. Нумерация измерений начинается с единицы. Если параметр Номер ^измерения опущен, то его значение принимается равным единице. Обе функции возвращают значение типа Long.
Ниже приведен пример получения нижней и верхней границ первого измерения массива avarValues (значения сохраняются в переменных типа Long):
IngLBound = LBound(avarValues)
IngRBound = RBound(avarValues)
Доступ к элементам массива
Для доступа к элементам массива в VBA указывается номер этого элемента в круглых скобках после идентификатора переменной массива. Номера измерений массива разделяются запятыми. Например (для одномерного и трехмерного массивов):
intNum = aintValues(16)
intNum = aintValues(12, 32, 3)
Использование переменной Variant при работе с массивами
Язык VBA поддерживает универсальный тип данных Variant, которому находится применение и при работе с массивами. Переменной этого типа можно присваивать массив. В результате этой операции в переменной Variant формируется копия
массива. Далее с такой перемеиной можно работать либо как с обычной переменной, либо как с массивом (использовать доступ к элементам), например:
Dim aintValues(1 То 3) As Integer Dim varArray
'Присвоение массива переменной типа Variant varArray = aintValues
* Доступ к элементам массива
varArray(1) = 1
varArray(2) = 2
varArray(3) = 3
Возможность присвоения массива переменной типа Variant на самом деле широко используется в VBA при передаче массивов в функции и процед>?ры, а также при возврате функциями массивов.
Для определения того, содержит ли переменная типа Variant массив, можно нс- пользовать функцию XsArray, имеющую следующий формат:
IsArray (Переменная)
Данная функция возвращает значение типа Boolean: True — если в переменной с именем Переменная содержится массив, и False — в противном случае.
Использование функции Array для заполнения массива
В VBA имеется возможность быстрого заполнения массива значениями. Эта возможность реализована в функции Array. Ее формат такой:
Array (Список^элементов)
В качестве аргументов функция принимает список значений, разделенных запятой. Возвращает она заполненный заданными значениями массив, сохраненный в переменной типа variant. Ниже приведен пример использования функции Array:
Dim varArray
' Заполнение массива значениями varArray = Array(1, 2, 3, 4, 5)
Коллекции
Коллекции (они же семейства н множества) — это объекты, которые позволяют хранить произвольное количество элементов любого типа. Элементы в коллекции идентиф!щируются уникальным ключом, которым может быть не только номер эле*
Коллекции
мента в коллекции, но и значение строкового шш другого типа. При программировании на VBA различные коллекции используются очень часто. Например^ к коллекции Workbooks нужно обращаться для получения ссылки на объект workbook нужной рабочей книги, к коллекции worksheets — для получения ссылки на объект Worksheet нужного рабочего листа и т. д.
В VBA коллекции реализованы во встроенном классе collection. Создание объекта Collection ничем не отличается от создания объекта другого типа:
Dim col As New Collection
ИЛИ
Dim col As Collection
Set col = New Collection
Добавление элементов
Для добавления элементов в коллекции реализован метод Add, имеющий следующий формат:
Ссылка. Add Элемент [, Ключ] [, Добавить_перед] [, Добавить_после]
Единственным обязательным параметром метода Add является значение добавляемого элемента. Элемент может быть константой или переменной любого типа, кроме типа, определенного пользователем. При добавлении элемента можно указать ключ, который будет однозначно идентифицировать элемент в Есоллекции. Ключ — это любое значение типа variant.
По умолчанию новые элементы добавляются в конец коллекции. Для изменения порядка добавления элементов используются параметры Добавить _перед и Доба- вить_после, с помощью которых указывается номер или ключ того элемента, перед которым или после которого нужно вставить новый элемент. Нумерация элементов в коллекции начинается с единицы.
Ниже приведены примеры инструкций, добавляющих новые элементы в коллекцию:
col.Add "Valuel”, nKeyln
col.Add "Va工U®2'1 "Key2"
col.Add "Value。”,「Keyl”
Количество элементов в коллекции
Для определения количества элементов в коллекции используется свойство только для чтения Count. При его получении возвращается значение типа Long. Пример получения количества элементов коллекции приведен ниже:
IngCount = col.Count
Удаление элементов из коллекции
Для удаления элементов из коллекции используется метод Remove:
Ссылка.Remove Номер
Единственным параметром метода Remove является номер элемента в коллекции или его ключ. Например, для удаления значения nValue2 ", добавленного в коллекцию при рассмотрении метода Add, можно использовать инструкцию
col.Remove 3
или
col *Remove "Кеу2”
Доступ к элементам коллекций
Для получения значений элементов коллекции используется метод item, который возвращает значение соответствующего элементу типа:
Ссылка. Item (Номер)
Единственным параметром метода Item является Номер — это ключ элемента илн его порядковый номер в коллекции. Напрнмер, для получения значения элемента с ключом f,Keyl" (или номером 2) можно использовать следующие инструкции:
val = col*Item("Keyln)
val = col.Item(2)
Следует отметить, что item является для объекта Collection методом по умолчанию, позтому значения элемента с ключом "Кеу1" можно получать и таким образом:
val = col (1,KeylIT)
val = col (2)
Определяемые пользователем типы данных
Язык VBA предоставляет программисту достаточно большие возможности для создания и использования специфических типов данных: структур и перечислений.
Структуры
Структура — это сложный тип данных, представляющий собой совокупность переменных, хранящихся и обрабатываемых совместно. Переменные, входящие в состав структуры, называются полями (членами) структуры. В состав структуры могут входить переменные как стандартных, так н определенных пользователем типов данных.
Использование структур в программах зачастую позволяет уменьшить объем и сложность алгоритмов работы с данными. Напрнмер, для хранения большого количества записей с именами, адресами и телефонами потребовались бы три массива. При использовании же структуры с полями для имени» адреса и телефона для хранения всей информации потребуется всего один массив (VBA позволяет создавать массивы структур).
Описание структур
Для описания структура в программе на VBA в блок деклараций модуля необходимо поместить следующую конструкцию:
[Public I Private] Туре Имя_структуры
Поле!
Поле2
ПолеЫ
End Туре
Ключевые слова Public и Private задают область видимости структуры (по умолчанию используется Public):
Public — применяется для описания структуры, которую можно использовать (объявлять переменные этого типа) во всех модулях проекта; недопустимо в модулях класса;
Private — применяется для описания структуры, которую можно использовать только в том модуле, где эта структура описана.
После ключевого слова Туре следует имя описываемой структуры. Внутри блока Type-End Туре помещаются объявления переменных-членов структуры. Эти объявления аналогачны объявлениям обычных переменных н отличаются только отсутствием в начале ключевых слов Dim, Static, Private или Public и тем, что в одной строке можно объявлять только одну переменную.
Пусть некоторой компании необходимо хранить данные об имени, фамилии, адресе, телефоне и дате рождения своих сотрудников. Совместно с этими данными нужно хранить информацию о проекте, в котором принимает участие каждый сотрудник. Ниже представлено описание структур, с помощью которых можно реализовать хранение требуемых данных.
Туре ПроектИнформация
Название As String
Срок_аавершения As Date
End Type
Type Сотрудник
Имя As String
Фамилия As String
Адрес As String
Телефон As String
Датзарождения As Date
Проект As ПроектИнформация
End Type
Далее на этом примере рассмотрим особенности работы со структурами в программах на V В А.
Объявление переменных, содержащих структуры
Объявления переменных, содержащих структуры, выглядят точно так же, как объявления переменных другого тапа. Ниже приведен пример объявления одной переменной, содержащей структуру Сотрудник:
Dim worker As Сотрудник
VBA позволяет создавать массивы любых типов данных, в том числе н структур:
Dim workers(15) As Сотрудник
В данном случае будет создан массив из 15 струюгур типа Сотрудник.
勿 ПРИМЕЧАНИЕ
При объявлении переменных* содержащих структуры, происходит автома- 旷 тическая инициализация всех полей созданных структур.
Доступ к полям структур
Для доступа к содержимому полей структуры необходимо использовать символ 4. а (точка). Ниже приведен пример получения значения полей с именем и телефоном сотрудника:
strFirstName = worker.Имя
strPhone = worker.Телефон
При доступе к массиву структур получение значения полей будет выглядеть следующим образом:
strFirstName = workers(15).Имя
strPhone = workers (15).Телефон
Получить значения полей вложенной структуры можно следующим образом (проект — вложенная структура):
strName = worker.Проект.Название
datDate ^ worker♦Проект.Срок_завершения
При работе со структурами необходимо помнить, что каждое поле структуры — это переменная, которой можно присваивать значение. Ниже приведен пример заполнения структуры с информацией о сотруднике:
worker.Имя = "Иван"
worker. Фамилия = н Иванов*1
worker.Адрес = "ул. Первомайская, 口. 10。, кв. 5"
worker * Телефон = "(0 95) 200 00 0 0"
worker.Дата_рождения ="工2.03.1978"
worker.Проект.Название = "План здания1'
worker.Проект.Срок^завершения = "15.09.2005"
Содержимое полей структур можно использовать в любых корректных выражениях, например:
strFullName = "Имя: 11 & worker .Имя & ”, фамилия: " & worker * Фамилия
При использовании заполненной чуть выше структуры (с информацией о сотруднике Иванове) строка strFullName в результате обработки выражения получит значение нИмя : Иван, фамилия: Иванов*1.
Перечисления
VBA позволяет определять целочисленные типы данных с ограниченным количеством значений — перечисления. Каждому значению перечисления соответствует идентификатор.
Использование перечислений, во-первых, позволяет оградить программиста от ошибок (не нужно знать значения элементов перечислений), а во-вторых» может повысить читаемость программного кода, так как вместо малоипформатив- ных значений типа 167353 в программе используются идентификаторы типа Actionsave. Использование перечислений также избавляет от необходимости создания глобальных целочисленных констант, которые используются только как значения параметров функций и процедур.
Описание перечислений
Для описания перечисления в блок деклараций модуля необходимо поместить следующую конструкцию:
[Public I Private] Егшт Имя_перечисления
Идентификатор I [= Знаиение1]
Идентификатор2 [= Зиачение2]
ИдентификаropN [= Значение^
End Enum
Ключевые слова Public и Private задают область видимости перечисления точно так же, как для структуры (см. выше).
После ключевого слова Enum следует имя описываемого перечисления. Внутри блока Enum-End Enum задаются идентификаторы значений перечисления и, если нужно, сами значения, которые сопоставляются с идентификаторами.
Если значение элемента перечисления явно не указывается, то оно автоматически формируется следующим образом:
если элемент перечисления первый, то ему присваивается нулевое значение;
если элемент не первый, то его значение равняется значению предыдущего элемента, увеличеннол!у на единицу.
Ниже приведен пример описания перечисления:
Enum MyEnum
valuel
valua2 ^ 100
value3
End Enum
В приведенном примере создается перечисление, содержащее три идентификатора и значения. При этом с идентификаторами значения сопоставлены следующим образом: valuel имеет значение 0, value2 — значение 100, a value3 — 101.
Использование перечислений
Объявление переменных для перечислений ничем не отличается от объявления переменных других типов. Ниже приведены примеры объявления переменной и массива переменных для перечисления MyEnum:
D±m EnumValue As МуЕnum
Dim EnumValues(255) As MyEnum
Таким переменным можно присваивать любые численные значения^ но можно (и даже нужно) использовать идентификаторы этих значений. Например:
EnumValue = valuel
EnumValues(100) = value3
Идентификаторы значений элементов перечисления мо來но использовать во всех выражениях, в которых употребляются переменные с типом соответствующего перечисления. Например;
If EnumValue = value2 Then ...
Здесь значением выражения EnumValue = value2 является True, если EnumValue имеет значение value2 (или 100), и False — в противном случае.
Управление выполнением программы
Язык VBA поддерживает ряд способов управления порядком выполнения инструкций программы в пределах функции или процедуры: инструкции безусловного и условного перехода, циклы. Большое количество этих инструкций и наличие различных вариантов обеспечивают максимально эффективное и удобное их использование при написании программ.
Циклы
В VBA реализовано несколько способов организации циклов. Их разнообразие и гибкость играют существенную роль в упрощении программ па языке VB А, а также во многом способствуют повышению наглядности программного кода.
VBA поддерживает четыре вида ЦНКЛОН: обычный ЦИКЛ For-Next, ЦИКЛ For Each-Next для просмотра элементов массивов н коллекций, циклы While-Wend и Do-Loop- Циклы различных видов могут быть вложены друг в друга. Рассмотрим каждый из них.
Цикл For-Next
Цикл For-Next в VBA является салгым простым и очень часто используемым. Формат данного цикла следующий:
For Счетчик = Начальное_значение То Конечное^значение [Step Шаг]
[Инструкции]
[Exit For]
[Инструкции]
Next [Счетчик]
Здесь Счетчик — это переменная-итератор любого численного типа. Начадъное_зна- чение, Конечное значение, Шаг — численные значения или идентификаторы переменных численного типа. После ключевого слова Next можно (но не обязательно) указывать идентификатор итератора цикла, конец тела которого обозначает даиное ключевое слово. Указывать идентификатор переменной-итератора после Next особенно удобно при организации сложных вложенных циклов.
В начале выполнения цикла итератору присваивается значение элемента Начали- ное^значение. Инструкции, записанные в теле цикла, выполняются до тех пор, пока значение итератора не превзойдет значение элемента Конечное_3iume^ue (станет больше или меньше его в зависимости от направления изменения итератора). Шаг и направление изменения итератора (увелниенне или уменьшение) задаются элементом Шаг. Если шаг изменения итератора равен еданице, то данный элемент можно опустить.
Для преждевременного выхода из цикла предусмотрена инструкция Exit For, При ее встрече в теле цикла выполнение программы переходит на следующую инструкцию после ключевого слова Next.
Ниже приведен пример трех вложенных циклов Fer-Next, итераторами которых являются целочисленные переменные i, j и к:
For i ® 10 То 1 Step -1
For j = 1 Т。 2口
For к = 10 To -10 Step -2
'Выполнение каких-то действий
Next к
Next j
Next i
Цикл For Each-Next
Цикл For Each-Next используется для просмотра всех элементов массива или коллекции. Формат данного цикла следующий:
For Each Элемент In Контейнер
[Инструкции]
[Exit For]
[Инс трукции ]
Next [Элемент]
Здесь Элемент — это идентлфлкатор переменной-итератора, а Контейнер — идентификатор массива или коллекции. Для цикла For Each-Next допустимый тип итератора зависит от того, просматривается массив пли коллекция. При просмотре массива итератор должен иметь тип variant. При просмотре коллекции итератор может иметь тип Variant или быть ссылкой на объект.
После к刀юиевого слова Next можно (но не обязательно) указывать идентификатор итератора цикла, конец тела которого обозначает данное ключевое слово.
Для преждевременного выхода из цикла используется такая же инструкция Exit For, каки для цикла For-Next.
Ниже приведен пример использования цикла For Each-Next для просмотра массива astrStrings:
For Each varltem In astrStrings
Выполнение каких-то действий над элементом varltem
Next
Цикл While-Wend
While-Wend является самым простым циклом, с помощью которого можно осуществлять определенные действия до тех пор, пока выполняется заданное условие.•
Формат данного цикла следующий:
While Условие
[Инструкции]
Wend
Инструкции в теле цикла While-Wend выполняются до тех пор, пока логическое выражение Условие имеет значение True (значение этого выражения вычисляется при каждой итерации).
Ниже приведен пример организации цикла While-Wend:
While i < 100
,Действия в цикле
i = i + 3
Wend
Следует отметить, что цикл While-Wend является значительно упрощенным и ограниченным с точки зрения разнообразности способов его использования.
Цикл Do-Loop
Цикл Do-Loop предоставляет гораздо больше возможностей при организации циклических действий с проверкой логического условия, чем цикл while-wend. Проверка логического условия окончания цикла может происходить в начале каждой итерации цикла, при этом формат цикла следующий:
Do [While I Until Условие]
[Инструкции]
[Exit Do]
[Инструкции]
Loop
Проверка условия может также происходить в конце каждой итерации цикла (тогда выполняется как минимум одна итерация цикла):
Do
[Инструкции]
(Exit Do]
[Инструкции]
Loop [While I Until Условие]
В приведенных форматах Условие — любое логическое выражение. При использовании ключевого слова while цикл выполняется до тех нор, пока Условие имеет значение True, а при использовании ключевого слова Until — пока Условие имеет значение False. Для выхода из цикла предусмотрена инструкция Exit Do.
Ниже приведен пример использования цикла Do-Loop:
Do While i < 100
i « i + 1
Do
j = j + 5
Действия
Loop Until j > 200
Loop
Инструкции выбора
Язык VBA поддерживает инструкции, позволяющие осуществлять различные действия в зависимости от выполнения или невыполнения заданных услов1гй, — инструкции выбора If-Then-Else и Select,
Инструкция If-Then-Else
Инструкция VBA if-Then-Else предоставляет возможность выбора одного из действий в зависимости от значений заданных логических выражений. Формат данной инструкции следующий:
If Выражение! Then
[Инструкции!]
[Elself Выражение2 Then
[Инструкции?}]
[Elself Bhipa^eHneN Then
[Ия струкцииМ]]
[Else
[Инструкции]]
End If
Здесь Выражение 1 - Выражение^ — логические выражения. Если какое-либо из этих выражений истинно, то выполняются инструкции, находящиеся после соответствующего ключевого слова if или Elself. Если ни одно из выражений не является истргнным, то выполняются инструкции, записанные после ключевого слова Else (если, конечно, это ключевое слово используется).
Рассмотрим пример использования инструкции if-Then-Else:
If intAction - 1 Then
Выполнение сложения
res = a + b
Elself intAction = 2 Then
* Выполнение вычитания
res = a - b
Elself intAction = 3 Then
'Выполнение умножения
res = a * b
Else
' Заданное действие не поддерживается
• • *
End If
В приведенном примере с помощью инструкции if-Then-Else выбирается одно из трех поддерживаемых действий для переменных а и Ь: сложенне, вычитание
или умножение. То, какое действие выполнять, определяется по содержимому переменной intAction. Если она имеет значение, отличное от 1т 2 и 3, то выполняются инструкции, следующие после ключевого слова Else.
Язык программирования VBA также поддерживает упрощенный вариант инструкции If-Then-Else:
If Выражение Then [Инструкции! ] [Else Инструкции2]
Здесь Выражение — это логическое выражение, при истинном значении которого выполняются инструкции после ключевого слова Then. Если Выражение не истинно, то выполняются инструкции после ключевого слова Else (если это ключевое слово используется). При использовании этой формы инструкции if- Then-Else следует учитывать» что она записывается в одну строку (или в несколько строк; но с использованием символа подчеркивания). Также необходимо учитывать, что Инструкций н Инструкции? представляют собой либо одну инструкцию VBA, либо несколько инструкций, разделенных двоеточием. Если ключевое слово Else используется, то элемент Инструкции 1 может отсутствовать.
Ниже приведены несколько примеров использования сокращенного варианта инструкции If-Then-Else:
If а = 1 Then а = 2 Else а = 1
If а = 1 Then а = 2 Else a=l:b=b+l
If а = 1 And b = 0 Then Else a = 1 : b = b + 1
Инструкция Select Case
select Case позволяет, подобно инструкции If-Then-Else, делать выбор выполняемых программой действий в зависимости от значения заданного аргумента. При большом колтестве альтернатив данная инструкция работает быстрее инструкции I f-Then-Else, так как значение проверяемого выражения вычисляется только один раз. Формат инструкции Select Case приведен ниже:
Select Case Проверяемое^выражение
[Case С пи с о ^выражений[Инструкции]].*.
[Case Else,
[Инструкции]]
End Select
Здесь Проверяемое ^выражение — это любое численное или строковое выражение. Список выражений содержит неограниченное количество выражений, диапазонов значений и условий. Для более детального пояснения ниже приведен формат элемента Список_выражений:
Выражение | Мин^значение То Макс^значение | Is Оператор Выражение — [,Выражение [ Жн_значение То Макс_значение I Is 。口оратор Выражение]・..
Значения элементов приведенной конструкции следующие.
口 Выражение — любое численное или строковое выражение (тип элемента Выражение должен соответствовать типу элемента Проверяемое_выражение}.
М пн значение То Макс_значеиие — используется для задания диапазона значении, Элементы Мнн_значенне и Макс^значеш^е задают минимальное * максимальное значения диапазона соответственно.
is Оператор Выражение — используется для задания условий. Позволяет использовать в инструкции Select case операторы сравнения. Элемент Оператор —это любой оператор сравнения VBA, кроме is и Lika Элемент Выражение —это любое вь1ра*енне, тип которого соответствует типу элемента Проверяемое ^выражение.
При соответствии значения элемента Проверяемоевыражение одному из заданных выражений, при попадании значения этого элемента в один из диапазонов или при выполнении одного из заданных условий происходит выполнение инструкций, записанных после соответствующего оючевого слова Case. Если нм одна Case-конструкция не сработала, то выполняются инструктш после сочетания ключевых слов Case Else.
Допустим, что в программе необходимо проверять значение численной переменной intTestValue и выполнять одни действия, когда эта переменпая имеет значение 1, 2, 3 или 5, н другие действия — в противном случае. Приведенный ниже фрагмент программы позволяет решить поставленную задачу:
Select Case intTestValue
Case 1 To 3, 5
'Действия при значении переменной intTestValue,_ равном 1, 2, 3 или 5
Case Is < 1, Is > 3
* Действия при значении переменной intTestValue _ меньше 1 или больше 3
End Select
В данном примере необходимо обратить внимание на то, что значение 5 удовлетворяет обеим Case-конструкциям. При обработке инструкции Select Case VBA просматривает конструкции с мючевым словом Case в том порядке, в котором они следуют в программе. Поэтому в приведенном примере при значении переменной intTestValue, равном 5, выполняются инструкции после первого ключевого слова Case.
Не менее просто с помощью инструкции Select Case можно обрабатывать и строковые значения. Ниже приведен пример, в котором выполняются различные действия при значениях строковой переменной strTestValue, начинающихся со строчной и прописной букв латинского алфавита:
Select Case strTestValue
Case "a” To "z”
Действия, если строка strTestValue начинается — со строчной буквы латинского алфавита
Case "А" То "Z”
'Действия, если строка strTestValue начинается _ с прописной буквы латинского алфавита
Case Else
Действия, если строка не начинается с символа латинсткого алфавита
End Select
Инструкции безусловного перехода
С помощью инструкций безусловного перехода можно переходить к вьшолнению части заданной программа без проверки каких-либо условий. К таким инструкциям относятся goto и пара GoSub^Return. Однако перед рассмотрением данных инструкций необходимо ознакомиться еще с одним элементом языка VBA, без которого данные инструкции использоваться не могут, — метками.
Метки
Метка — это идентификатор VBA или целое число, которое располагается в начале строки и заканчивается двоеточием. Метки используются для указания строк, на которые можно переходить с помощью инструкций GoTo н GoSub. Примеры меток приведены ниже:
100:
DoSomeAction:
Перерасчет:
После перехода на метку выполняются все инструкции, расположенные после нее до конца процедуры, функции, следующих инструкций GcTq, GoSub или до инструкции Return (см. далее).
Инструкция GoTb
Инструкция GoTo используется для простого перехода к выполнению программы после нужной метки. Формат инструкции следующий:
GoTo Имя_метки
Инструкции, расположенные после goto, выполняются только в том случае, если в программе существуют соответствующие инструкции GoTo или GoSub. Рассмотрим пример использования GoTo:
а = 15 + Ь
If а < 0 Then GoTo 10
Выполнение действий для значения переменной а больше нуля
10:
'Выполнение действий для значения переменной а меньше нуля
Следует отметить, что частое использование инструкции goto в программе не рекомендуется, так как может сделать алгоритм слишком запутанным, goto часто можно заменить инструкциями выбора либо вызовом процедуры или 力унк- ции.
Пара инструкций GoSub-Return
Во времена старого доброго языка Basic инструкции GoSub и Return были незаменимы для программиста. Это было связано с тем, что Basic не был даже процедурным языком программирования: в нем не было процедур и функций, все инструкции записывались в виде единой программы. Чтобы нс реализовывать несколько раз одинаковые действия, в этой большой программе выделялись отрезки кода, выполняющие типичные действия, — подпрограммы. Подпрограмма начиналась некоторой меткой и оканчивалась инструкцией Return.
При достижении инструкции GoSub осуществлялся переход на указанную метку (аналогично инструкции Goto) — начинала выполняться подпрограмма. При достижении инструкции Return происходил возврат из подпрограммы — выполнение программы продолжалось после последней инструкции GoSub.
Пара инструкций GoSub-Return в языке VBA работает точно таким же образом, но переходы осуществляются только в пределах процедуры или функции. Формат инструкций GoSub-Return такой:
GoSub Имя_метки»
[Инструкции]
Имя^метки:
[Инструкции подпрограммы]
Return
Ниже приведен пример использования инструкций GoSub-Return (в подпрограмме вьишсляется квадрат длины шпотенузы прямоугольного треугольника):
а = 5
Ь = 4
GoSub Calculate
'Другие действия
Calculate:
* Подпрограмма
с2 = а А 2 + b Л 2
Return
Следует отметить, что при процедурном, а тем более объектно-ориентированном программировании необходимость использования подпрограмм полностью отпала. Роль подпрограмм выполняют функции н процедуры.
5T
Процедуры и функции
В языке VBA программист должен записывать все инструкции своей программы внутри специальных блоков: функций и процедур. Код внутри процедуры или функции представляет собой подпрограмму, выполняющую требуемые действия. Перед рассмотрением способов создания процедур и функций необходимо узнать, чем же различаются эти два вида подпрограмм в VBA.
Процедура — это подпрограмма, которая выполняет действия, не возвращая никакого значения в качестве результата либо возвращая некоторые значения путем изменения переданных ей параметров. Функция в дополнение к возможностям процедуры может возвращать некоторое результирующее значение.
Далее в этом разделе будут рассмотрены особенности создания и использования процедур и функций в программах на VBA.
Объявление процедур
Для объявления процедуры в VBA используется следующая конструкция:
[Private | Public] [Static] Sub Имя_процедуры [ (Списо^аргументов)]
[Инструкции]
[Exit Sub]
[Инструкции]
End Sub
Ключевые слова Private и Public данной конструкции задают область видимости процедуры.
Public — применяется по умолчанию, позволяет создать процедуру, которую можно вызывать из любого места проекта VBA* При использовании в модуле класса дает возможность создавать общую процедуру (метод) этого класса.
Private — позволяет создать процедуру, которую можно вызывать только в том модуле VBA, где данная процедура объявлена. При использовании в модуле класса дает возможность создавать личную процедуру (метод) этого класса.
Если в объявлении процедуры используется ключевое слово static, то значения всех локальных переменных данной процедуры сохраняются между ее вызовами. Это эквивалентно использованию инструкции static вместо Dim при объявлении каждой локальной переменной внутри процедуры.
Имя_процедуры — любой корректный идентификатор VBA, который будет употребляться в программе при необходимости вызова данной процедуры.
Список аргументов — содержит описания аргументов, принимаемых процедурой. Описания аргументов разделяются запятой и имеют следующий формат:
[Optional] [ByVai | ByRef] [ParamArray] Имя_аргумента [ ( ) ] [As Имя_типа]— [= Зяа чение_по_умолча нию]
Пояснения элементов, которые используются в данной конструкции, приведены в табл. 1.7.
Таблица 1.7. Элементы описания аргумента процедуры
Элемент
Пояснение
Optional
Указывает, что аргумент необязательный. Если Optional используется, то все аргументы, записанные после, тоже должны быть необязательными. Данное ключевое слово не может использоваться совместно с ключевым словом РагашАггау
ByVai
Указывает, что аргумент передается в процедуру по значению
ByRef
Указывает, что аргумент передается н процедуру по ссылке. Используется по умолчанию
ParamArray
Используется только при описании последнего аргумента процедуры и указывает, что этот аргумент является массивом кз произвольного количества значений типа Variant. ParamArray нельзя использовать совместно с ключевыми словами ByVai, ByRef н Optional
Имя аргумента
Идентификатор локальной переменной процедуры, в которой хранится значение соответствующего аргумента
О
Указывает, что описываемый аргумент представляет собой массив
As Имя jnuпа
Используется для явного указания типа аргумента. Если этот элемент не используется, то типом аргумента считается Variant
=Зна чение_/ю_умолчанию
Используется только совместно с ключевым словом Optional для присвоения необязательному аргументу значения по умолчанию. Значение_по_умолчанию — любое константное значение соответствующего типа. Для аргумента типа Object единственным допустимым значением является Nothing.
Если данный элемент конструкции не используется, то происходит стандартная инициализация аргумента
Для выхода из процедуры предусмотрена инструкция Exit Sub. При ее достижении выполнение программы немедленно переходит к инструкции, следующей за вызвавшей процедуру инструкцией.
Ниже приведен пример процедуры, имеющей два аргумента, при этом второй аргумент необязательный и передается по ссылке:
Sub ProcedureExample(ByVai intNumber As Integer, Optional fFlag = True)
Инструкции процедуры
Проведенную процедуру можно модифицировать так, чтобы вместо необязательного второго параметра процедура принимала произвольное количество аргументов, из которых формируется массив:
Sub Ргосе<1игеЕхагф1е (ByVal intNumber As Integer, ParamArray varArray ())
Инструкции процедуры
End Sub
■ ВНИМАНИЕ
Два приведенных примера процедур в программе на VBA одновременно •присутствовать не могут Это обусловлено тем, что язык VBA не поддержи
вает перегрузку процедур и функций (создание процедур и функций с одинаковыми именами, но с разными параметрами).
Вызов процедур
Для вызова процедуры в программе на VBA предусмотрена инструкция Call, формат которой приведен ниже:
[Call] Имя_процедуры [Стсок^аргументов]
Здесь элемент Имя процедуры представляет собой идентификатор вызываемой процедуры. Если процедура принимает аргументы, то они должны быть указаны на месте элемента Список^аргумеитов через запятую.
В качестве аргументов в вызывающей процедуре или функции используются константные значения или идентификаторы переменных соответствующих типов.
Эта инструкция позволяет также вызывать и функции» но при этом возвращаемое ими значение получить невозможно.
勿 ПРИМЕЧАНИЕ
Интересной особенностью инструкции Call является то, что само ключевое слово Call можно опускать. Если ключевое слово Call используется, то список аргументов процедуры необходимо заключать в скобки. В противном случае скобок быть не должно.
Пусть имеется процедура:
Sub ProcedureExample(ByVal intNumber As Integer, ParamArray varArray 0}
' Инструкции процедуры
Пусть также имеется процедура TestExample» в которой необходимо вызывать процедуру ProcedureExample. Процедуру TestExample можно реализовать следующим образом:
Sub TestExample()
'Инструкции процедуры
1 Вызов ProcedureExample
Call ProcedureExample(123, "Значение!иf иЗначение2м, Н3начение3н)
* Инструкции процедуры
End Sub
Если в TestExample не использовать ключевое слово Call, то вызов процедуры будет выглядеть так:
'Вызов ProcedureExample
ProcedureExample 123, п3начение1", м3начение2м, мЗначение3W
Далее, перед тем как рассматривать особенности передачи значений в процедуры, целесообразно рассмотреть создание и вызов функций. Это связано с тем, что передача параметров в процедуры и функции происходит одинаково.
Объявление функций. Возврат значения
Для объявления функций в VBA используется следующая конструкция:
[Private | Public] [Static] Function Иия_функции [(Список_аргументов) ]_
[As Имя_типа]
[Инструкции]
[Имя_ функции = Значение]
[Exit Functon]
[Инструкции]
[Имя_функции = Значение]
End Function
Приведенный формат объявления функции отличается от объявления процедуры использованием ключевого слова Function вместо Sub, возможностью указания типа возвращаемого функцией значения (после списка аргументов) и возможностью в теле функции присвоить значение переменной с идентификатором, соответствующим идентификатору этой функщш (/£w兄—刃〃邦«〃〃 = Значение), При объявлении функций можно использовать все возможности, доступные при объявлении процедур.
Если тип возвращаемого функцией значения не указан, то подразумевается возвращение значения типа Variant.
Для возврата значения функцией необходимо в нужном ее месте присвоить соответствующее значение переменной с таким же идентификатором, как и идентификатор функции. Часто в функции может быть несколько точек, в которых возвращается значение. Если после получения результата нужно немедленно выходить из функции, то после присвоения Кма^функщш = Значение используется инструкция Exit Function. Если на протяжении выполнения функции не было использовано присвоение Имя_функции = Значение, то возвращается значение по умолчанию для соответствующего типа данных (см. подраздел об инициализации переменных).
Ниже приведен пример функции, которая вычисляет квадратный корень из переданного ей аргумента (если аргумент меньше нуля, то возвращается значение -1, сигнализирующее об ошибке):
Function dhSQR(dblValue As Double) As Double
If dblValue < 0 Then
' Недопустимый аргумент функции
dhSQR = -1
Else
'Вычисление квадратного корня
dhSQR 匸 Sqr(dblValue)
End If
End Function
Вызов функций
Для вызова функций можно также использовать инструкцию Call, например:
Call dhSQR(16.324)
ИЛИ
dhSQR 16.324
Однако при этом теряется возвращаемое функцией значение. Для использования возвращаемого значения идеи ти фи к атор ы функций необходимо включать в выражения справа от знака равенства или другого оператора. Тогда в момент вычисления значения выражения, в состав которого входит идентификатор функции, происходит вызов данной функции, а возвращенное ей значение подставляется в исходное выражение вместо идентификатора функции. Напрнмер, в результате обработки каждого из следующих выражений в переменную dblRes будет записано значение 5:
dblRes = dhSQR(25)
dblRes = 1 + dhSQR(16)
Точно таким же образом вызываются все встроенные функции VBA, например IsArray, SQR И Array,
Особенности передачи параметров
При создании и использовании процедур и функций необходимо учитывать некоторые особенности передачи параметров в них. Они общие для процедур и функций. Рассмотрим данные особенности.
Позиционная передача параметров
Этот способ передачи параметров наиболее распространен и применяется практически во всех языках программнрования. Во всех предыдущих примерах использовался именно позиционный способ передачи параметров в функции и процедуры. Суть данного способа в том, что при вызове процедуры или функции аргументы записываются в том порядке, в котором они указаны при ее объявлении. Пусть, например, необходимо использовать такую процедуру:
Sub Procedure(Optional intA As Integer = 25, Optional intB As Integer)
'Инструкции процедуры
End Sub
Вызов данной процедуры с использованием позиционной передачи параметров выглядит следующим образом:
Procedure 12, 56
ИЛИ
Call Procedure (12, 56)
Отдельного внимания заслуживает передача необязательных параметров. Необязательные параметры можно пропустить, тогда им будет присвоено значение по умолчанию (см. подраздел об объявлении процедур). Ниже приведены примеры вызова процедуры Procedure с пропуском некоторых параметров по умолчанию:
Procedure 121 Пропущен второй параметр
Procedure , 12' Пропущен первый параметр
Procedure1 Пропущены оба параметра
Использование именованных параметров
Язык VBA поддерживает также передачу аргументов процедурам н функциям с использованием именованных параметров. Суть данного способа заключается в том, что при вызове функции или процедуры явно указываются нмена параметров, которым присваиваются соответствующие значения. При этом порядок передачи не важен.
Для использованной выше процедуры Procedure вызов с использованием именованных параметров выглядит следующим образом:
Procedure intA:=12, intB:=56
ИЛИ
Procedure intB;=56, intAi=12
При использовании именованных параметров значительно упрощается передача необязательных параметров. Чтобы пропустить задание такого параметра, ему просто не нужно ничего присваивать при вызове функции или процедуры, например:
Procedure intB:=56
В данном примере не сильно заметны преимущества использования именованных параметров. А вот если необходимо использовать следующую функцию, задав значения только параметров агдЗ и arg8:
Function dhManyArg (Optional argl, Optional arg2. Optional arg3,—
Optional arg4. Optional arg5, Optional arg6. Optional arg7,— Optional arg8)
* Инструкции функции
End Function
Очевидно, что инструкция
varRes 二 dhManyArg{,f"textн,,,,,142.23)
куда менее наглядна и понятна, чем инструкция
varRes = dhManyArg(агдЗ:=“text",arg8:=142.23)
Передача аргументов по значению или ссылке
Рассмотрим, какмм образом в вызываемой процедуре или функции может осуществляться доступ к передаваемым данным. В языке VBA существуют две возможности передачи аргументов: по значению и по ссылке,
При передаче аргумента по значению в вызываемой процедуре или функции создается локальная переменная, в которую копируется все переданное содержимое аргумента. Изменение значения этой локальной переменной никак не отражается на значении переменной, соответствующей аргументу в вызывающей процедуре или функции.
Ниже приведен прнмер процедуры, принимающей аргумент по значению:
Sub TestByVal(ByVai intArg As Integer)
' Какие-то действия, во время которых значение переменной _ intArg изменяется
End Sub
Пусть теперь в некоторой процедуре присутствует инструкция TestByVal intValue. После выполнения этой инструкции значение переменной intvalue в вызывающей процедуре останется таким же, каким оно было до вызова процедуры TestByVal.
При передаче аргумента по ссылке дело обстоит иначе: при изменении значения переменной-аргумента в вызываемой процедуре или функции изменяется значение соответствующей переменной в вызывающей процедуре или функции.
Ниже приведен пример процедуры, принимающей аргумент по ссылке:
Sub TestByRef(ByRef intArg As Integer)
'Какие-то действия, во время которых значение переменной _ intArg изменяется
End Sub
Пусть теперь в другой процедуре присутствует инструкция TestByRef intValue. После выполнения данной инструкции в вызывающей процедуре значение переменной intValue будет отличаться от первоначхпьного.
Передача аргументов по значению позволяет защитить данные вызывающей процедуры или функции от незапланированного изменения. В то же время передача аргументов по ссылке может использоваться для возврата значений процедурами^ а также для возврата функциями более одного значения. Важным моментом является то, что передача больших объемов данных (например, длинных строк) по ссылке происходит значительно быстрее, чем по значению.
Определение и преобразование типов переменных
Данный раздел посвящен рассмотрению возможностей VBA для определения и изменения типа значений в переменных во время выполнения программы.
Определение типов переменных
В VBA предусмотрены возможности получения информации о типе любой переменной во время выполнения программы. Узнать тип переменной (или тип значения, содержащегося в переменной типа Variant) можно несколькими способами.
Для идентификации встроенного в VBA типа можно использовать функцию VarType. В качестве аргумента она принимает идентификатор переменной или константное значение некоторого типа. Возвращаемые этой функцией значения и их расшифровка приведены в табл* 18
Таблица 1.8. Значения, возвращаемые функцией VarType
Значение
Константа VBA
Тип переменной нпн пояснение
0
vbEmpty
Неинициализированная переменная типа Variant
I
vbNull
В переменной типа Variant содержится значение Null
2
vblnteger
Integer
Значение
Константа VBA
Тип переменной или пояснение
3
vbLong
Long
4
vbSingle
Single
5
vbDouble
Double
6
vbCurrency
Currency
7
vbDate
Date
8
vbString
String
9
vbObject
Object или ссылка на объект определенного типа (например, Application)
】0
vbError
Код ошибки
1】
vbBoolean
Boolean
12
vbVariant
Variant (возвращается только для массивов с элементами типа Variant)
13
vbDataObject
Объект для доступа к данным
14
vbDecimal
Decimal
17
vbByte
Byte
36
vbUserDefinedType
Тип данных, определенный польюватслем
8192
vbArray
Массив
ПРИМЕЧАНИЕ
Функция Varlype возвращает значение vbArray только в сумме со значением, идентифицирующим тип элементов массива. Например, для массива строк функция возвратит значение 8192 + 8- 8200. Значение же vbVariant возвращается только в сумме со значением vbArray и только для массивов с элементами типа Variant.
Для определения типа переменной можно использовать встроенную функцию TypeName. В качестве аргумента она принимает идентификатор переменной или константное значение некоторого типа. Возвращает данная функция строку (тип String) с именем типа аргумента» например ^Integer*', ^String'S ^Workbook"» "Object”. Данная функция может вернуть также ряд специфических значений. Описание этих значений приведено в табл. 1.9.
Таблица 1.9. Специфические значения, возвращаемые функцией TypeName
Значение
Пояснение
Error
Аргумент функции содержит код ошибки
Empty
Аргумент функции является пустой переменной типа Variant
Null
Аргумент функции содержит значение Null
Unknown
Не удалось определить имя типа для аргумента
Nothing
Аргумент функции ——ссылка, которая не указывает ни на какой объект (имеет значение Nothing)
ПРИМЕЧАНИЕПРИМЕЧАНИЕДля определения типа объекта, на который указывает ссылка, может использоваться инструкция TypeOf, имеющая следующий формат: TypeOf Ссылка is Идентификаторjmuna. Данная инструкция возвращает значение True, если ссылка с именем Ссылка указывает на объект, имя типа которого соответствует параметру Идентификатор^niuna. В противном случае возвращается значение False. Налример, если obj — ссылка на объект Worksheet» то результатом выполнения инструкции TypeOf obj Is Worksheet будет значение True.
ПРИМЕЧАНИЕ
ПРИМЕЧАНИЕ
Инструкция TypeOf работает только для ссылок, имеющих значение, отличное от Nothing. Если в качестве параметра Идентификаторj-ипа используется Object, то результатом выполнения инструкции будет значение True не
зависимо от типа объекта, на который указывает ссылка.
Преобразование типов
Для обеспечения возможности преобразования типов во время выполнения программы в VBA предусмотрен ряд специальных функций — функций преобразования типов данных. Все эти функции принимают в качестве аргумента значение типа Variant и возвращают значение соответствующего типа. Ниже приведен формат функций преобразования типов данных:
CBool(Выражение) CByte(Выражение) CCur(Выражение) CDate(Выражение) CDbl{Выражение) СDec(Выражение) CInt(Выражение)
CLng(Выражение) CSng(Выражение) CStr(Выражение) CVar(Выражение)
Далее приведены примеры использования этих фушсцнй (переменная varRes имеет тип Variant, а переменная strRes — ТИП String):
varRes = CDec(12.4635246) / CDec(3.14169265359) strRes = CStr(12.3535)
В результате выполнения приведенных инстру!сций переменная varRes будет содержать значение типа Decimal (использование функции CDec — это единственный способ оперировать с типом данных Decimal), а в переменную strRes будет записа
но значение "12.3535”.
ПРИМЕЧАНИЕ
При использовании функции CBool необходимо помнить, что к значению True преобразуется любое значение аргумента, не равное нулю. Передавать в функцию CBool разрешается только численные значения. Интересным образом также ведут себя инструкции преобразования к целочисленным типам Clnt. CLng и CByte при наличии дробной части в аргументе. Эти функции округляют дробное число до ближайшего целого четного числа.
Файловый ввод/вывод
Язык VBA поддерживает ряд возможностей для организации файлового ввода/ вывода, рассмотрению которых посвящается данный раздел,-
Открытие файлов
Для открытия файла в VBA существует специальная инструкция Open, формат которой тгрнведен ниже:
Open Имя_ файла For Тип^доступа [Access Режим_ до ступа ] [Блокировка] _ Аз [#]Дескриптор [Lеп-Длина^записи]
В табл. 1.10 приведены описания элементов, используемых в приведенной конструкции.
Таблица 1 ■ 10. Элементы инструкции Open
Элемент
Описание
Имя^файла
Строка, содержащая полный или относительный путь к открываемому файлу
Tunjdocmy па
Задает режим, в котором VBA работает с открываемым файлом. Может принимать следующие значения: Append (добавление данных в конец файла). Binary (доступ к файлу в бинарном режиме), Input (последовательное чтение из файла в текстовом режиме), Output (поеледовател ыгая запись в файл в текстовом режиме) и Random (произвольный доступ к файлу)
Реж uAtjdocmyna
Задает операции, которые можно выполнять при работе с файлом. Может принимать значение Read (только чтение), Write (только запись) или Read Write (чтение и запись). Read нельзя использовать совместно с типом доступа Output, Write нельзя использовать совместно с Input, a Read Write — ни с Input, ни с Output
Блокировка
Позволяет запретить другим приложениям определенный вид доступа к открываемому файлу. Может принимать следующие значения: Lock Read (запрещает чтение, но разрешает запись в файл). Lock Write (запрещает запись в файл, но разрешает чтение). Lock Read Write (запрещает чтение и запись) н Shared (по умолчанию, разрешает чтение м запись)
Таблица 1.10. Элементы инструкции Open (продолжение)
Элемент
Описание
Дескриптор
Целочисленное значение от 1 до 511, которое будет однозначно идентифицировать открытый файл
Длина^записи
Задает размер записи в байтах при использовании типа доступа Random. Для типов доступа Output, Input и Append задает количество байт, хранимых в буфере
Ниже приведены примеры инструкций открытая файла D: \MyTextFile. txt для произвольного доступа, для последовательного чтения и записи:
Open "D:\MyTextFile.txt" For Random Access Read Write As 1 Len 二 100
Open nD: \MyTextFile.txt11 For Input As 2
Open nD: \MyTextFile. txt,T For Output As 3
Дескрипторы файлов. Функция FreeFile
В среде программирования VBA открытые файлы идентифицируются номерами — дескрипторами. Дескриптор каждого открытого файла должен быть уникальным. Как можно было увидеть из примеров открытия файла, программист может сам назначать дескрипторы открываемым файлам (при этом необходимо учитывать, что допустимый диапазон значений дескриптора — 1-511),
Для небольших и простых программ возможность назначать дес1фипторы вручную очень удобна. Однако в больших проектах, в которых ведется работа со многими файлами, бывает достаточно сложно следить за правильностью назначения дескрипторов вручную. Для избавления программиста от необходимости контролировать правильность дескрипторов в VBA введена специальная функция FreeFile, имеющая следующий формат:
FreeFile ([Диапазон])
Данная функция возвращает значение типа Long, которое можно использовать в инструкции Open в качестве дескриптора открывае\(ого файла. Единствен)гым параметром данной функции является необязательный параметр Диапазон, который может иметь значение 1 или 0. Если значение параметра равно 0 (по умолчанию), то функция возвращает дескриптор файла из диапазона 1-255. Если же оно равно 1 — значение из диапазона 256-511. Если свободных дескрипторов в диапазоне нет, то функция возвращает нулевое значение.
Ниже приведен пример использования функции FreeFile:
Dim hFile As Long
hFile = FreeFile * Получение дескриптора для файла
Открытие файла
Open "D:\MyTextFile.txt" For Output As hFile
Закрытие файлов
После того как с открытым с помощью инструкции Open файлом выполнены все необходимые действия, его необходимо закрыть. Вообще операция закрытия (или освобождения) является обязательной для всех объектов операционной системыt а не только для файлов. При закрытии файла освобождается его дескриптор, а другие приложения получают возможность работать с этим файлом, если он был заблокирован при открытии.
В VBA для закрытия файлов предусмотрены две инструкции: Reset и Close. Формат этих инструкций следующий:
Reset
Close [ [ # ] Десктиптор [, [ # ] Дескриптор]...]
Инструкция Reset закрывает все файлы, открытые ранее с помощью инструкции Open. Инструкция close закрывает только файлы с указанными дескрипторами, например:
Close 1г #3, hFile
Если при использовании инструкции close дескрипторы закрываемых файлов не указаны, то она закрывает все открытые ранее файлы.
Чтение из файлов и запись в файлы
В VBA программисту предоставляется множество инструкций для чтения и записи данных при работе с файлами- Эти инструкции разделяются на три группы в соответствии с тем, при каком типе доступа к файлу они используются: последовательном, произвольном или бинарном.
Инструкции последовательного доступа
Описание инструкций последовательного доступа» используемых для работы с файлами, приведено в табл. Li 1.
Таблица 1.11. Инструкции поел ед о вате л ьн о го доступа к файлу
И метрукцня
Тип допупа
Описание
Write ^Дескриптор, _ [Значения]
Output* Append
Записывает в файл, заданный параметром Дескрипторi значения переменных или выражений, заданных параметром Значения (переменные и выражения разделяются запятой). Если Значения содерж1<т несколько переменных или выражений, то при записи в файл их значения разделяются запятой. При этом строковые значения заключаются в кавычки. После записи всех значений в файл в него дописывается символ перехода на следующую строку
Таблица 1.11. Инструкции поел едовател ьн о го доступа к файлу (продолжение)
Инструкция
Тип доступа
Описание
Print ^Дескриптор,— [Значения]
Output, Append
Записывает в файл, заданный параметром Дескриптор^ значения переменных или выражений, заданных параметром Значения. Значения переменных или выражений записываются в одной строке файла и разделяются символом табуляции. После записи всех значений а файл в него дописывается символ перехода на следующую строку
Input 朴Дескриптор, _ Переменные
Input
Используется для чтения из файла данных, записанных инструкцией Write. Количество значений, считываемых из файла, определяется количеством переменных в списке Переменные
Line Input ^Дескриптор, _ Переменная
Input
Считывает строку из файла. Часто используется для чтения из файла данных, записанных инструкцией Print
Ниже приведен пример процедуры, записывающей данные в файл с использованием инструкций последовательной записи:
Sub WriteToFile()
Open MD: \MyTextFile. txt11 For Output As 1
'Запись данных в файл
Write #1, п3начение'\ "Value”, 154.32
Print #1, "Слово— "Слово2", 14.28464
Close 1
End Sub
Далее целесообразно привести пример процедуры^ в которой осуществляется чтение записанных данных из файла:
Sub ReadFromFile()
Dim strVall/ strVal2, dblNumber
Dim strString
Open "D:\MyTextFile.txt" For Input As 1
'Чтение данных из файла Input #1, strVall, strVal2, dblNumber Line Input *1, strString
Close 1
End Sub
Кроме приведенных в табл. 1.11 инструкций, в VBA имеется встроенная функция input, позволяющая считывать из 4>айла заданное количество символов:
Input (Количество_симвслов, [ # ] Дескриптор)
Ниже приведен пример использования данной функции для считывания из файла первых 10 символов:
Sub Testinput()
Dim strText As String
Open "D:\MyTextFile.txt" For Input As 1
Чтение из файла первых 10 символов
strText = input(10, 1)
Close 1
End Sub
Инструкции произвольного доступа
При произвольном (Random) доступе файл представляется как совокупность записей, имеюпхих постоянную длину» Именно запись при данном типе доступа является элементарной единицей ннформащт, которую можно считывать из файла или записывать в файл. Каждая запись имеет свой иомер (нумерация начинается с единицы). Для работы с фaйлa^f и при использовании произвольного доступа в VBA реализованы инструкции Put и Get для записи и чтения информации:
Put [# ] Дескриптор, [Номер_записи], Переменная
Get [#] Дескриптор, [Номер_записи], Переменная
При выполнении инструкции Put значение переменной Переменная помещается в файл на место записи с номером Номер ^записи. Если номер записи не указывается, то данные помещаются в текущую запись файла.
Инструкция Get позволяет считать значение записи с номером Номер записи в переменную Переменная. Если номер записи не указан, то считывается текущая запись файла.
Рассмотрим пример, в котором две структуры сначала записываются в <|>айл с помощью инструкции Put, а потом сншываютсл из того же фа!1ла, но в обратном порядке:
Type Record
intVal As Integer
strName As String * 100
End Type
Sub TestRandomAccess()
Dim reel As Record, rec2 As Record
'Заполнение reel и rec2 значениями ..*
Open nD:\MyRandOTnAccessFile,txtn For Random Access Read Write —
As 1 Len = Len {reel)
Запись данных в файл
Put 1, , reel Put 1Г / rec2
Теперь считывание данных из файла
Get 1/ 2t rec2
Get 1, 1/ reel
Close 1
End Sub
Инструкции бинарного доступа
Бинарный (Binary) доступ к файлу по своей сути идентичен произвольному доступу с тем лишь различием, что запись в файле имеет длину 1 байт. При бинарном доступе к файлу используются те же инструкции Put и Get, что н при произвольном доступе. Также при бинарном доступе для чтения определенного количества байт может быть использована функция inputs。которой было рассказано выше.
Определение конца файла
На практике часто приходится сталкиваться с необходимостью чтения данных из файла, размер которого заведомо не известен. Если достигается конец файла, а после это* го производится попытка прочитать нз него данные, то генерируется ошиб1са. Для предотвращения подобных ситуаций можно использовать функции EOF И LOF:
EOF {Дескриптор)
LOF(Дескриптор}
Функция EOF возвращает значение True, если достигнут конец файла, заданного параметром Дескриптор, и False — в противном случае. Если функция EOF воз* вратила значение False, то читать из файла больше нельзя. Для файлов, открытых в режиме Output, функция EOF всегда возвращает значение True.
Функция LOF позволяет узнать длину файла, заданного параметром Дескриптор. Эта функция возвращает значение тапа Long, отражающее длину открытого файла в байтах.
Определение текущей позиции файла
Для определения текущей позиции файла в VBA предусмотрены функции Lee н Seek, имеющие следующий формат:
Loc (Дескриптор)
Seek (Дескриптор)
Обе функции возвращают значение текущей позиции файла, заданного параметром Дескриптор. Однако каждая из этих функций имеет свои особенности.
Стандартные окна сообщений
Функция Loc для файлов, открытых в режиме Random, возвращает номер последней считанной или записанной записи. Для файлов, открытых в режиме Binary, — номер последнего считанного или записанного байта. Для файлов, открытых в режиме последовательного доступа, — текущую позитгю в байтах, деленную на 128.
Функция Seek для файлов, открытых в режиме Random, возвращает номер записи, которая будет считана из файла или записана в файл при следующей операции чтения/записи. Для остальных файлов эта функция возвращает номер байта, с которого будет начинаться следующая операция чтения или записи.
Стандартные окна сообщений
Для вывода информации пользователю в арсенале VBA есть очень удобная функция MsgBox. Она позволяет отображать стандартное окно с сообщением (например, об ошибке). Функция MsgBox имеет следующий формат:
MsgBox (Текст_сообпцения[, Стиль] [, Заголовок] [ г Файл^справки, Индекс^темы])
Здесь Текст^сообщения задает строку с текстом сообщения, Заголовок — строку с текстом, который отображается в строке заголовка окна, Файл_справки — имя справочного файла. Если задан аргумент Файлуправки, то должен быть задан аргумент Индекс_темы, который идентифицирует тему из заданного файла справки, посвященную выводимому диалоговому окну.
Особого рассмотрения заслуживает аргумент Стиль — он задает значок окна сообщения, отображаемые в этом окне кнопки и другие полезные параметры стиля окна. В табл. 1.12 приведено описание значений, которые объединяются при задании аргумента Стиль с помощью оператора Or.
Таблица 1.12. Значения, используемые для формирования стиля окна
Константа VBA
Значение
Пояснение
vbOKOnly
0
Отображение только кнопки ОК
vbOKCancel
1
Отображение кнопок ОК и Cancel (Отмена)
vbAbortRetry Ignore
2
Отображение кнопок Abort (Стоп), Retry (Повтор) и Ignore (Пропустить)
vbYesNoCancel
3
Отображение кнопок Yes (Да), No (Нет) н Cancel (Отмена)
vbYesNo
4
Отображение кнопок Yes (Да) и No (Нет)
vbRetryCancel
5
Отображение кнопок Retry (Повтор) н Cancel (Отмена)
vbCritical
16
Отображение значка критической ошибки
vbQuestion
32
Отображение значка вопроса
vbExclamation
48
Отображение значка восклицания
vblnfbrmation
64
Отображения значка информации
Таблица 1.12. Значения, используемые для формирования стиля окна (продолжение)
Константа VBA
Значение
Пояснение
vbDefaultButtonl
0
Выделяется первая кнопка (слева направо)
vbDefaultButton2
256
Выделяется вторая кнопка
vbDefau]tButton3
512
Выделяется третья кнопка
vbDefauitButton4
768
Выделяется четвертая кнопка
vbApplicationModal
0
До закрытия окна пользователь не может работать с приложением
vbSystemModal
4096
До закрытия окна пользователь не может работать со всеми приложениями
vbMsgB oxHe IpB u tton
16384
Отображение кнопки Help (Справка)
vbMsgBoxSetForeground
65536
Не отображать окно сообщения поверх всех других
vbMsgBoxRight
524288
Выравнивать текст по правому краю
vbMsgBoxRtl Reading
1048576
Включ»ггъ режим вывода текста справа налево
После того как пользователь закроет окно, функция возвратит значение, соответствующее нажатой в нем кнопке. Возможные значения, возвращаемые функцией MsgBoKi и их объяснения приведены в табл. t.13.
Таблица 1.13. Значения, возвращаемые функцией MsgBox
Константа VBA
Значение
Нажатая кнопка
vbOK
OK
vbCancel
2
Cancel (Отмена)
vbAbort
3
Abort (Стоп)
vbRetry
4
Rehy (Повтор)
vb Ignore
5
Ignore (Пропустить)
vbYes
6
Yes (Да)
vbNo
7
No (Нет)
Обработка ошибок времени выполнения
Иногда в процессе работы программы возникают ситуации, когда та или иная инструкция не может быть выполнена, например при попытке расчета значения вы- ра*ення, в котором происходит деление на ноль, или при обращении к приводу компакт-дисков» когда диска в нем нет. В таких случаях генерируется ошибка времени выполнения. Если в программе не предусмотрен перехват ошибок, то будет выдано соответствующее сообщение об ошибке, а выполнение программы прекратится. Согласитесь, такое поведение программы является отнюдь не самым лучшим и дружественным по отношению к пользователю.
Обработка ошибок времени выполнения
В VBA имеются возможности, позволяющие программе отслеживать возникновение ошибочных ситуаций и адекватно, с точки зрения профаммиста, на них реагировать.
Перехват ошибок
Для перехвата ошибок времени выполнения в VBA используется специальная ин* струкшы On Error, которая вставляется перед тем местом гцюграммы* в котором возможно возникновение ошибки. В распоряжение программиста предоставляются три разновидности этой инструкции:
On Error GoTo Метка
On Error Resume Next
On Error GoTo 0
Первый вариант инструкции On Error активирует обработчик ошибок (см. подраздел об обработке перехваченных ошибок). При возникновении ошибки после этой инструкции выполнение профаммы продолжается с метки Метка.
Использование второго варианта позволяет игнорировать все ошибки: при возникновении любой ошибки инструкция, вызвавшая ошибку, пропускается, а выполнение программы продолжается со следующей инструкции.
Третий вариант инструкции On Error отключает перехват ошибок обработчиком, находящимся в выполняемой процедуре или функции.
Обработка перехваченных ошибок
Как уже было сказано, если в программе используется инструкция следующего вида: On Error GoTo Метка, то после возникновения ошибки после этой инструкции выполнение программы продолжается с метки Метка, Пробам мный код, который начинается с данной метки и заканчивается (обычно, но не всегда н не обязательно) инструкцией Resume, называется обработчиком ошибок. В обработчике оишбок про* граммист помещает действия, которые либо исправляют ошибку, либо ннформнруют о ней пользователя. В конец обработчика ошибок обычно помещается один из вариантов инструкции Resume:
Resume [0]
Resume Next
Resume Метка
При использовании Resume (0 ] выполнение программы продолжается с той инструкции, в которой произошла ошибка. Если использовать вариант Resume Next, то выполнение программы продолжается со следующей инструкции после той, в которой произошла ошибка. Использование же варианта Resume Метка позволяет продолжить выполнение программы с yicaaaiiiioji после Resume метки.
При обработке ошибок важно знать, что в распоряжении программиста всегда имеется глобальная ссылка с именем Err на объект ErrObject. Этот объект хранит
подробную информацию о возникшей ошибке (номер ошибки, текст сообщения об ошибке н т. д.). В обработчике эту ссылку можно использовать для уточнения типа, источника ошибки, а также для получения других сведений.
Ниже приведен пример функции с обработчиком ошибок (она пытается записать текст в файл на шбком диске А:):
Function dhWriteToFloppy(strText As String) As Boolean 'Включение обработчика ошибок On Error GoTo ErrHandler * Выполнение операций с дискетой Open ИА:\Text.txt" For Output As 1 Write #1, strText Close 1 'Действия выполнены успешно dhWriteToFloppy = True ExitFunc:
* Выход из функции до обработчика ошибок Exit Function
ErrHandler:
Закрытие файлаt если его все-таки удалось открыть Close 1
Dim strErrMessage As String 'Идентификация ошибки и формирование текста сообщения Select Case Err.Number
Case 71 strErrMessage = "Нет диска в дисководе” Case 70 strErrMessage = "Диск защищен от записи11 Case 61 strErrMessage = "Нет места на диске" Case Else strErrMessage = Err.Description End Select 'Отображение сообщения об ошибке MsgBox strErrMessage, vbExclamation, "Ошибка" 'Продолжение выполнения программы dhWriteToFloppy = False Resume ExitFunc
End Function
Если запись удается, то функция возвращает значение True. Если возникает ошибка, то выдается соответствующее сообщение, после чего функция возвращает значение False. На примере функции dhWriteToFloppy следует заметить, что при нормальном выполнении программы (без возникновения ошибок) обработчик ошибок выполняться не должен, что достигается выходом из функции до обработчика с помощью инструкции Exit Function.
Классы в VBA
Язык программирования VBA является объектно-ориентированным, хотя н не поддерживает наследование и полиморфизм. VBA-программист может работать с。встроенными классами, а также создавать и использовать свои собственные классы.
Создание класса на VBA
Создание класса на VBA отличается от других языков программирования (таких как C++), в которых описание классов во многом аналогично описанию струк〜 тур.
В VBA для каждого класса в проект должен быть добавлен отдельный модуль, в который помещается код, реализующий работу класса, — модуль класса. Добавление нового модуля класса осуществляется с помощью команды меню Insert ► Class Module (Вставить > Модуль класса) редактора Visual Basic. Имя модулю класса присваивается с помощью окна Properties (Свойства), которое показано на рис. 1.3.
Рис. 1.3. Назначение имени классу
Имя, которое будет присвоено добавленному модулю, и будет являться именем нового класса. В данном случае имя созданного класса — Classi. В качестве примера с помощью этого класса будет реализовано хранение ссылки на объект, а также хранение некоторой информации об объекте.
Свойства класса
Свойства для классов в VBA могут быть реализованы двумя способами. Первый способ — это использование в модуле класса общих переменных'членов (объявленных с атрибутом Public). Добавим таким способом свойство в созданный ранее класс Classi, в котором будет храниться строка с описанием данных, хранящихся в объекте-экземпляре этого класса:
Public strTag As String
Такой способ реализации свойств является самым простым, однако у него не предусмотрено возможности контролировать правильность задания параметра н осуществлять какие-либо действия при изменении его значения. Для решения этой проблемы можно использовать второй способ — создание процедур и функций, которые выполняются при установке и получении значений свойств соответственно* Для этих целей в модуле класса применяются обычные объявления процедур и функций, в которых используется ключевое слово Property.
Для получения значения свойства предназначена функция, объявленная с использованием Property Get:
[Public I Private] [Static] Property Get Имя_свойства ([Аргументы]) [As Имя_типа]
[Инструкции]
[Имя_ св ойства = Выражение]
[Exit Property]
[Инструкции]
[Имя_свойства = Выражение ]
End Property
Для присвоения значения свойству, не являющемуся ссылкой на объект, предназначена процедура, объявленная с использованием Property Let:
[Public I Private] [Static] Property Let Имя_свойства ([Аргументы, ] Значение)
[Инструкции]
[Exit Property]
[Инструкции]
End Property
Для присвоения значения свойству, являющемуся ссылкой на объект, предназначена процедура, объявленная с использованием Property Set:
[Public I Private] [Static] Property Set Имя_свойства ([Аргументы, ] Значение) fИнструкции]
[Exit Property]
[Инструкции]
End Property
Использование процедур и функций с ключевым словом Property очень удобно для создания свойств только для чтения (для этого свойства не реализуют-
ся Property Let и Property Set) и свойств только для записи (не реализуется Property Get).
Рассмотрим реализацию свойств ObjectRef и Obj ectType для рассматриваемого класса Classi (частная переменная-член obj Ref используется для хранения установленной ссылки на объект):
Private objRef As Object
Property Set ObjectRef(objNewRef As Object)
* Задание ссылки хранимого объекта
Set objRef = objNewRef
End Property
Property Get ObjectRef() As Object
'Возврат ссылки на хранимый объект
Set ObjectRef = objRef,
End Property
Property Get ObjectType() As String
'Возврат имени типа хранимого объекта
ObjectType = TypeName(objRef)
End Property
Методы класса
Любая {функция или процедура, описанная в модуле класса, является методом этого класса. Методы делятся на общие (описаны с использованием Public) и частные (описаны с использованием Private),
Ниже приведена реализация метода для созданного нами класса Classi, при обращении к которому на экран выводится сообщение со значениями атрибутов класса:
Sub Showinfo()
Отображение окна со значением свойства strTag и именем типа _ объекта, на который хранится ссылка
MsgBox "strTag = ” & strTag & vbCrLf & _
Object type = ” & ObjectType
End Sub
Использование класса в программе
Как было сказано в начале главы, операции со всеми объектами VBA осуществляет только с использованием ссылок. Объявление ссылок на объекты было рассмотрено в разделе, посвященном переменным в VBA. Здесь будет рассмотрено лишь использование объекта созданного ранее класса Classi. Для создания ссылки на объект можно использовать следующее объявление:
После создания ссылки сам объект создается с помощью инструкции Set:
Set obj = New Classi
Объявление переменной ссылки и создание объекта можно также совместить:
Dim obj As New Classi
Для доступа к свойствам и методам объекта используется точка, например:
obj . strTag = мНекоторый текст** Set obj.ObjectRef = Nothing MsgBcx obj.ObjectType obj.Showinfo
Ниже приведен пример процедуры, которая использует реализованный класс Classi:
Sub Testclass()
* Создание объекта
Dim obj As New Classi
'Установка свойств
Set obj.ObjectRef = New Collection
obj , strTag = "В этом объекте хранится ссылка на объект Collection11 ° Вызов метода obj.Showinfo End Sub
В результате работы данной процедуры на экран будет выведено окно сообщения, показанное нарнс. 1.4.
Рис. 1.4. Окно с информацией о свойствах объекта
Как можно заметить, в процедуре Testclass не происходит явного уничтожения ссылки на объект класса Classi. Дело в том, что ссылка obj — локальная переменная процедуры. А при выходе из процедуры данные всех локальных (не статических) переменных уничтожаются, в том числе удаляются и локальные ссылки на объекты.
Использование API-функций в VBA
Иногда даже при программировании на таком языке, как VBA, возникает необходимость использовать API-функции Windows. Эти стандартные функции действитель-
но предоставляют программисту поистине огромные возможности 一 от управления отображением окон и кнопок до организации сетевого взаимодействия. Всего Windows API (Application Programming Interface) насчитывает около 1000 различных функций.
Объявление АРЬфункций
Чтобы API-функцию можно было вызывать из программы на VBA, ее нужно объявить с использованием инструкции Declare:
[Public I Private] Declare Function 旅冗 Lib "Библиотека" _ [Alias мПсевдоним^] [ ([Аргументы]) ] [As Имя_типа]
или, если API-функция ие возвращает значения:
[Public I Private] Declare Sub Имя Lib nБиблиотека" [Alias nПсевдоним^ ] 一 [((Аргументы])]
Эта инструкция помещается в блоке объявлений модуля. Ключевые слова Public и Private задают область видимости объявляемой API-функции аналогично обычной процедуре или функции. Единственной особенностью является то, что при объявлении API-функции в модуле класса нужно использовать Private. Назначение остальных элементов инструкции Declare поясняется в табл. 1.14.
Таблица 1.14. Элементы инструкции Declare
Элемент
Пояснение
Имя
Идентификатор, по которому в программе будет происходить обращение к API-функции аналогично обращению к обычной процедуре или функции. Если в инструкции Declare ключевое слово Alias не используется, то элемент Имя должен полностью совпадать с названном API-функции (с учетом регистра символов). Если Alias используется, то элемент Имя может быть любым корректным идеитификаторомt не исполыуемым для другой процедуры или функции
Библиотека
Имя файла библиотеки (DLL), в которой находится объявляемая функция, например ^User11 или "User.dH'*
Псевдоним
Если в инструкции Declare используется ключевое слово Alias, то Псевдоним должен полностью соответствовать нменн API-функции в DLL. Использование Alias ^ПсевдонилС позволяет применять API-巾ункиню в программе на VBA под именем, отличающемся от настоящего
Аргументы
Описание списка аргументов, принимаемых функцией. Аналогично описанию аргументов процедур и функций VBA. Дополнительно при описании аргументов API-функции можно использовать тип данных Any для разрешения передачи в функцию значения любого типа
Имя jnuna
Используется для задания типа возвращаемого API-функцией значения
Ниже приведен пример объявления API-функции получения имени текущего пользователя без использования псевдонима:
Declare Function GetUserNameA Lib "advapi32.dll" _
(ByVai IpBuffer As String, nSize As Long) As Long
а также с использованием псевдонима:
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA"— (ByVai IpBuffer As String, nSize As Long) As Long
При использовании первой из приведенных инструкций для вызова функции нужно использовать имя GetUserNameA. Прм использовании второй — имя GetDserMame,
Вызов API-функций
Вызов API-функций, объявленных с помощью инструкции Declare Function, ничем не отличается от вызова других функций: программист волен использовать инструкцию Call или употреблять функцию в выражениях. Если API-функция объявлена с использованием Declare Sub, то для вызова может использоваться только инструкция Call (аналогично процедуре).
Для закрепления всего, что было изложено выше, рассмотрим пример использования API-функции GetUserName для получения имени текущего пользователя компьютера:
* Объявление API-функции с использованием псевдонима
Declare Function GetUserName Lib Hadvapi32 . dll" Alias nGetUserNameA,* — (ByVai IpBuffer As String, nSize As Long) As Long
Sub UserName()
Dim strBuffer As String
'Создание строкового буфера для возврата значения функцией
strBuffer - Space(100)
* Получение имени пользователя (ВЫЗОВ API-ФУНКЦИИ). _
Функция возвращает ненулевое значение, если имя пользователя _ записано в strBuffer
If GetUserName(strBuffer, 100) Then
'Вывод имени пользователя
MsgBox RTrim(strBuffer)
Else
MsgBox "Re удалось получить имя пользователян
End If
End Sub
Использование объектов Excel
Программирование на VBA в Microsoft Office чаще всего представляет собой управление объектами соответствующего приложения. Не является исключением и программирование в Excel* Данный раздел предназначен для того, чтобы ознакомить читателя с основными объемами, встроенными Excel Эти объекты используются в подавляющем большинстве примеров (трюков), приведенных в дальне^пшх главах книги.
Объектная модель Excel
На рис. 1.5 представлена значительно упрощенная структура объектов, доступ к которым имеет программист на VBA.
I Application I
—I Assjs[am ]
卜 厂 Range
—SoEmandBaE
■—I Charts I
~I一 二「Chart I
—I Dialogs ]
][ Dialog |
~I g^lection I
-1 Sheets I
~^hartI
1 Worksheet ]
~[ Rangg
1 Chartobjects J
I「ChartObj/F]
1 Comments |
—[Windows ]I『Comment |
J 」Window I
—I Wo「kpooks ]
~IWo 妙 oo 门
1 Sheets I
11 Chart ]
1 Workshe&t I
1 Wwksheets |
1—(Charts I
—I Worksheets |
Рис, 1.5. Структура объектов Microsoft Excel
Как видно из приведенного рисунка, корневым (главным) объектом, доступным в VBA, является Application. Используя ссылку на этот объект, можно манипулировать как самим запущенным приложением Excel, так и такими объектами. как рабочие книги, листы, диаграммы, окна, меню, панели инструментов,— Application предоставляет доступ ко всем объектам Excel.
Объект Application содержит большое количество вложенных объектов. Они могут быть как объектами, с которыми можно взаимодействовать непосредственно (как Assistant — объект для работы с помощником), так и представлять собой коллекции, содержащие другие объекты. Ниже приведено описание некоторых особенно часто используемых коллекций:
口 Cells -* коллекция, содержащая все ячейки рабочего листа;
commandBars — коллекция, содержащая все меню и панелн ннструь^ентов;
Comments — коллекция, содержащая все примечания рабочего листа;
Chartobjects — коллекция, содержащая все объектььконтейнеры,внедренных в рабочий лист диаграмм (по одному объекту на каждую внедренную диаграмму);
charts — коллекция, содержащая все листы диаграмм рабочей книги;
Dialogs — коллекция стандартных диалоговых окон Excel;
sheets — коллекция, содержащая все листы книги;
Windows — коллекция всех отображаемых в Excel окон;
口 workbooks — коллекция, содержащая все открытые в Excel рабочие книги;
Worksheets — коллекция, содержащая все рабочие листы книги.
Объект Selection (а вернее, свойство объекта Application) предоставляет доступ к данным, выделенным на активном листе рабочей книга. В Selection могут содержаться ссылки на объекты различного типа. Тип зависит оттого, что именно выделено на листе (например, если выделены ячейки, то тип объекта selection — Range).
Особого рассмотрения заслуживает объект Range. Он может содержать одну ячейку! диапазон ячеек или несколько диапазонов ячеек. Этот объект используется прн необходимости получения или изменения значений в ячейках таблицы.
Подробная информация о наиболее часто используемых в книге объектах Excel приведена в приложении.
Доступ к объектам Excel из программы
Для доступа к объектам Excel в программах на VBA можно использовать глобальную ссылку на объект Application, которая имеет такой же идентификатор — Application. Например, получение ссылки на выделенные данные может выглядеть следующим образом:
Set obj Sel = Application.Selection
Необходимо отметить, что использование ссылки с именем Application во многих случаях подразумевается по умолчанию, поэтому предыдущий пример можно записать так:
Аналогичным образом осуществляется доступ к остальным объектам. При этом с коллекциями Excel, такими как workbooks» Worksheets и прочими, работают как с обычными коллекциями VBA, содержащими ссылки на объекты:
Worksheets (1) .Name = 11 Sheet 1"
Объектом Application предоставляются также ссылки на активную рабочую книгу, активный рабочий лист этой книги, активную ячейку листа, активную диаграмму и т. д. (подобные ссылки объекта Application, а также других объектов, рассмотрены в приложении). Эти ссылки нужны для обеспечения возможности быстрого использования информации активного объекта, например:
ActiveCell.Value - 15
ИЛИ
ActiveSheet. Name = "This sheet is now activated1*
Рабочая область Microsoft Excel
В данной главе мы рассмотрим порядок работы с основными элементами рабочей области Microsoft Excel — рабочей книгой, рабочим листом и ячейкой (диапазоном). Кроме того, здесь же рассказывается о работе с формулами и пользовательскими функциями.
Рабочая книга
Как отмечалось выше, рабочая книга представляет собой файл Microsoft Excel (обычно — с расширением XLS), в котором хранится и обрабатывается необходимая информация. Используя некоторые несложные приемы, можно расширить возможности рабочей книги. Об этом будет рассказано в текущем разделе.
Автозапуск любимого файла при загрузке Excel
Возможности программы предусматривают автоматический запуск требуемого файла одновременно с открытием Excel. Иначе говоря, при открытии Excel на экране отобразится не пустая рабочая книга (как обычно), а содержимое конкретного файла. Для достижения такого эффекта необходимо поместить требуемый файл в каталог автоматической загрузки — XLStart Этот каталог расположен в папке с файлами Microsoft Office (например, по адресу C:\Program Files\Microsoft Of fice\officelO\XLStart). Прн необходимости можно поместить в указанный каталог несколько файлов — в результате при запуске Excel они автоматически будут открыты в разных окнах. Однако для настройки автоматического запуска нескольких файлов удобнее выполнить следующие действия.
L Отгсрыть все файлы, которые должны автоматически открываться вместе с запуском Excel.
2. В меню Файл выбрать команду Сохранить рабочую область и в открывшемся окне по обьигным правилам Windows указать путь к каталогу автоматической загрузки (в нашем примере — C:\Program Files\Microsoft Office\Of ficelO\ XLStart), после чего нажать кнопку OK.
В результате в каталог автозагрузки будет помещен файл с расширением XLW (это расширение файла рабочей области). Теперь при запуске Excel будут автоматически запускаться файлы, включенные в эту рабочую область.
Эксперимент с кнопкой Закрыть на панели инструментов
Рассмотрим, каким образом можно поместить на панель инструментов кнопку Закрыть. В принципе, сама процедура размещения данной кнопки на панели проста, известна большинству пользователей и выполняется штатными средствами программы. Хитрость же заключается в том, что можно назначить этой кнопке соответствующий значок, хотя по умолчанию на ней отображается текст Закрыть.
Для перехода в режим настройки панели инструментов следует щелкнуть на ней правой кнопкой мыши н выбрать в контекстном меню пункт Настройка, в результате
чего откроется одноименное диалоговое окно. В данном окне нужно перейти на вкладку Команды, в категории Файл выбрать команду Закрыть и перетащить ее мышью на панель инструментов (поместив, например, рядом с кнопкой Открыть). Результат выполненных действий показан на рис, 2.1.
'⑥ файл Оравка Rua Вставка
Рис. 2.1. Вставка кнопки Закрыть
Необходимый значок для данной кнопки можно взять из другого приложе1шя (например, из Word). Для этого аналошчньш образом помесл^м на панель инструментов Word кнопку Закрыть, после чего (не закрывая окно Настройка) щелкнем на ней правой кнопкой мыпш и выберем в контекстном меню пункт Копировать значок на кнопке.
•ВНИМАНИЕ
Контекстное меню кнопки Закрыть доступно только при открытом окне ре.дактирования панели инструментов.
Теперь необходимо перейти в Excel, войти в режим редактирования панели инструментов (то есть открыть окно Настройка), установить курсор на кнопку Закрыть и выбрать в контекстном меню пункт Вставить значок для кнопки. В результате кнопка Закрыть примет вид, изображенный на рис. 2.2.
Файл Правка Вид Вставка
Рис. 22 Надпись и значок на кнопке Закрыть
После этого в окне редактирования панели инструментов нужно нажать кнопку Изменить выделенный объект и в открывшемся меню выбрать пункт Основной стиль — результат показан на рис. 23
■回 файл 口равка ^ид Вставка
ю百回0届& :昌®弋
Рис. 2.3. Кнопка Закрыть на панели инструментов
Для завершения операции в окне настройки панелн инструментов следует нажать кнопку Закрыть.
Общий макрос для всех книг Excel
Как известно, макрос, созданный в текущей книге, будет доступен в ней, но недоступен в других книгах. Однако возможности программы предусматривают создание макроса, который будет доступен во всех рабочих книгах.
Такой макрос должен храниться в специальной рабочей книге (она называется «личная книга макросов») — personal. xls. Для ее создания необходимо выполнить следующие действия.
Ввести макрос в пустую рабочую книгу.
Выполнить команду главного меню Файл ► Сохранить как.
В открывшемся окне указать путь для сохранения в каталог автоматической загрузки —XLStart(например,С:\Program Files\Microsoft Office\OfficelO\ XLStart), при этом присвоить книге имя personal.xls.
Выполнить команду главного меню Окно > Скрыть.
Выйти из программы с помощью команды Файл > Выход. При этом необходимо положительно ответить на запрос о сохранении выполненных изменений.
После выполнения указанных действий созданный макрос станет доступным во всех рабочих книгах н будет автоматически запускаться при загрузке Excel, 丫11卩鼻8刀©1111已 отображением данного макроса осуществляется с помощью команд главного меню Окно ► Скрыть/Отобразить.
Восстановление важной информации из испорченного файла
Использование трюка, описание которого приводится в данном подразделе, позволяет извлечь данные из испорченного файла с помощью встроенного в Excel механизма специальной вставки. Для этого необходимо выполнить следующие действия.
Создать две новые пустые книги.
В первой книге выделить диапазон ячеек н скопировать его в буфер с помощью команды главного меню Правка ► Копироеать.
С помощью команды Окно ► Книга2 перейти ко второй книге*
Выделить ячейку А1, выполнить команду главного меню Правка ► Специальная вставка и в открывшемся окне Специальная вставка нажать кнопку Вставить связь.
Выполнить команду главного меню Правка ► Связи и в открывшемся окне нажать кнопку Изменить.
В открывшемся окне по обычным правилам Windows указать путь к испорченному файлу.
В большинстве случаев данный способ позволяет извлечь данные из испорченного файла.
Быстрое размножение рабочей книги
Используя средства VBA, можно сохранить текущую рабочую книгу сразу в нескольких разных папках. Для этого следует написать и выполнить макрос, код которого приведен в листинге 2.1.
勿 ПРИМЕЧАНИЕ
I侈 Все приведенные в книге листинги можно загрузить с сайта издательства 犷«Питер» по адресу http://www.pitercom/download/978546901223/.
Листинг 2.1. Размножение рабочей книга
Sub DuplicateBook()
Dim avarFileNames As Variant
* Формирование массива из путей для копий книги
avarFileNames = Array(ИС:\П & —
ActiveWorkbook.Name, "D:\" & ActiveWorkbook * Name)
Сохранение книги
ActiveWorkbook.SaveAs avarFileNames
End Sub
В приведенной выше программе используется возможность передавать методу SaveAs объекта Workbook массив строк. В результате выполнения данного макроса текущая рабочая книга будет сохранена одновременно на двух дисках — С: и D:.
Следует отметить, что после выполнения приведенного макроса текущей папкой для книги станет последний элемент массива avarFileNames. То есть при последующем выполнении команды Файл > Сохранить в данном случае книга будет сохранена на диске D:.
Сохранение рабочей книги с именем, представляющим собой текущую дату
Копию текущей рабочей книги можно сохранить по указанному пути с именем, представляющим собой текущую дату, то есть в формате ддммгг.х1з. Для этого нужно написать и запустить следующий макрос (листинг 2.2).
Листинг 2.2・ Сохранение книш с именем, представляющим собой текущую дату
Sub SaveAsDate()
Dim strDate As String
'Получение текущей даты и представление ее в формате "ддммгг"
strDate = Format {Now () f "ddrornyy11)
' Сохранение книги в текущую папку под новым именем
ActiveWorkbook.SaveAs ActiveWorkbook.Path & "\" & strDate
End Sub
В результате применения данного макроса текущая книга будет сохранена в прежнем каталоге» но под именем, соответствующим дате на момент сохранения (например, 140705.xls).
Создание книги с одним листом
В процессе работы иногда возникает необходимость создания рабочей книги, состоящей только нз одного листа. Можно, конечно, создать обычную новую книгу и вручную удалмть ненужные листы (напомню, что для удаления необходимо щелкнуть г граной кнопкой мыши на ярлычке с именем листа и выбрать в контекстном меню пункт Удалить). Однако для решения данной задачи все же целесообразнее вос- полковаться языком VBA н написать макрос, код которого приведен в листинге 2.3.
Листинг 2.3. Книга с одним листом
Sub NewOneSheetBook()
Workbooks»Add xlWBATWorksheet
End Sub
В результате выполнения данного макроса будет создана новая рабочая книга» в состав которой войдет только один рабочий лист. Эта книга будет открыта в отдельном окне.
Установка и снятие защиты рабочей книги
Как нзвестно, защитить рабочую книгу от внесения в нее изменений и снять эту защиту можно с помощью соответствующих команд подменю Сервис ► Защита. Однако для этого можно также воспользоваться макросом, в котором содержатся следующие параметры: Password — для задания пароля, Structure — для защиты структуры книги (взаимного расположения рабочих листов) и Windows — для защиты окон книги (например, при использовании данного параметра будет невозможно свернуть илн закрыть окно защищенной книги). Следует отметить, что все параметры являются неибязательнымн*
Пример такого макроса приведен в листинге 2.4 (данный код должен быть помещен в модуль рабочего листа).
Листинг 2.4. Защита рабочей книги
Sub Worksheet_BeforeRightClick(ByVai Target As Range, _ Cancel As Boolean)
If Target.Address = "$D$2" Then
'Установка защиты рабочей книги (с паролем ”123",— включенной защитой структуры книги и защитой расположения _ окон)
ThisWorkbook . Protect "123'*, True, True
Указание не обрабатывать нажатие кнопки мыши _ в этой ячейке
Cancel = True
Elself Target.Address = "SE§5" Then
' Снятие зашиты с книги (необходимо указать ранее установленный _ пароль)
ThisWorkbook.Unprotect "工23"
Cancel = True
End If
End Sub
В данном примере включение защиты будет выполняться щелчком правой кнопкой мьппи в ячейке D2, а снятие защиты — щелчком правой кнопкой в ячейке Е5.
При необходимости можно запретить вывод текущей рабочей книги на печать (при этом все остальные действия с рабочей книгой остаются доступными). Для этого достаточно записать и выполнить небольшой макрос» код которого выглядит следующим образом (листинг 2.5; данный код следует поместить в модуль ЭтаКнига).
Листинг 2.5. Запрет печати книги
Sub Workbook_BeforePrint(Cancel As Boolean)
* Установка флага в True заставляет Excel игнорировать команду _ отправки книги на печать
Cancel = True
End Sub
После выполнения данного макроса перестанет выполняться команда главного меню Файл ► Печать. Нажатие соответствующей кнопки на панели инструментов или сочетания клавиш Ctrl+P также не позволит вывести текущую рабочую книгу на печать.
Закрытие рабочей книги только при выполнении условия
С помощью несложного трюка можно запретить закрытие текущей рабочей книги. Для этого можно воспользоваться кодом, приведенным в листинге 2.6 (этот код должен быть помещен в модуль ЭтаКнига).
Листинг 2.6. Условное закрытие книги
Sub Workbook_BeforeClose(Cancel As Boolean)
If Range(nAl").Value о "Можно закрывать" Then
'Условие закрытия не выполнено * Укажем Excel игнорировать _ команду
Cancel = True
End If
End Sub
При использовании данного кода закрытие текущей рабочей книги будет возможно лишь после того, как в ячейку А1 будет введен текст можно закрывать.
Быстрое удаление из рабочей книги ненужных имен
В процессе использования программы в рабочих книгах может накапливаться большое количество имен ячеек, диапазонов и т, п” часть из которых с течением времени становится ненужной. Вручную избавляться от ненужных имен слишком долго и не- рациогтально, поэтому данный процесс целесообразно автоматизировать. Для решения данной задачи можно использовать следующий макрос (листанг 2.7).
Листинг 27 Удаление ненужных имен
Sub EraseNames()
Dim nmName As Name
Dim strMessage As String
* Проверка наличия в книге определенных имен
If ThisWorkbook»Names.Count = 0 Then
'В книге нет определенных имен
MsgBox нИмена не определены11
Exit Sub
End If
' Просмотр всей коллекции определенных имен и удаление тех, _ которые пользователю не нужны
For Each nmName In ThisWorkbook< Names
With nmName
Спрашиваем пользователя о необходимости удалить _ найденное имя
stiMessage = "Упалмть имя ” & .Name & " ? " & vbCr & — мотносящееся к " & .RefersTo
If MsgBox(strMessage, vbYesNo + vbQuestion) = vbYes Then
Имя можно удалить
.Delete
End If
End With
Next
End Sub
После выполнения макроса на экране появится окно, в котором отобразится первое из имен с предложением его удалить. При утвердительном ответе на данный запрос имя будет сразу же удалено, а в окне отобразится следующее имя и аналогичный запрос (переход к следующему имени осуществляется независимо от ответа на запрос относительно предыдущего имени) и т. д. Подобным образом можно быстро просмотреть все хранящиеся в рабочей книге имена и удалить ненужные.
При выполнении данной операции следует соблюдать осторожность, поскольку при утвердительном ответе на запрос об удалении имени это имя удаляется из рабочей книги окончательно, без возможности восстановления.
Сортировка листов в текущей рабочей книге
При работе с файлами, содержащими большое количество рабочих листов, иногда возникает необходимость систематизировать их расположение путем сортировки в порядке возрастания (по номерам или по алфавиту). Решить эту задачу поможет макрос, код которого приведен в листинге 2.8.
Листинг 2.8. Сортировка листов
Sub Sortsheets()
Dim astrSheetNames () As String ' Массив для хранения имен листов
Dim intSheetCount As Integer
Dim i As Integer
Dim objActiveSheet As Object
'Если нет активной рабочей книги - закрыть процедуру
If ActiveWorkbook Is Nothing Then Exit Sub
Проверка защищенности структуры рабочей книги
If ActiveWorkbook.Protectstructure Then
'Сортировка листов защищенной рабочей книги невозможна
MsgBox "Структура книги ” & ActiveWorkbook.Name & _ ” защищена. Сортировка листов невозможна * **, vbCritical
Exit Sub
End If
* Сохраняем ссылку на активный лист книги
Set objActiveSheet = ActiveSheet
Отключение сочетания клавиш Ctrl+Pause Break
Application.EnableCancelKey = xlDisabled
Отключение обновления экрана
Application * Screenupdating = False
intSheetCount = ActiveWorkbook- Sheets * Count
'Заполнение массива astrSheetNames именами листов книги
ReDim astrSheetNames(1 To intSheetCount)
For i = 1 To intSheetCount
astrSheetNames(i) = ActiveWorkbook.Sheets(i).Name
Next i
Сортировка массива имен в порядке возрастания
Call Sort(astrSheetNames)
'Перемещение листов книги
For 1 = 1 То intSheetCount
ActiveWorkbook.Sheets(astrSheetNames(i)).Move — ActiveWorkbook.Sheets(i)
Next i
'Переход на исходный рабочий лист
objActiveSheet.Activate
'Включение оОновления экрана
Application•Screenupdating = True
'Включение сочетания клавиш Ctrl+Pause Break
Application.EnableCancelKey = xllnterrupt
End Sub
Sub Sort(astrNames() As String)
* Сортировка массива строк по алфавиту (в порядке возрастания)
Dim i As Integer# j As Integer
Dim strBuffer As String
Dim fBuffer As Boolean
For i = LBound(astrNames) To UBound(astrNames) - 1
For j = i + 1 To UBound(astrNames)
If astrNames(i) > astrNames(j) Then
I Меняем i-й 姉 j-й элементы массива местами
strBuffer = astrNames(i)
astrNames(i) ^ astrNames(j)
astrNames(j) = strBuffer
End If
Next j
Next i
End Sub'
В данной программе присутствует ряд особенностей, которые необходимо отметить. Первая особенность — отключение обновления экрана на время перемещения страниц книги. Это сделано для того, чтобы исключить мерцание изображения во время перемещения листов. Вторая особенность — блокировка сочетания клавиш Ctrl+Pause Break. Дело в том, что если остановить выполнение программы после того, как она отключила обновление изображения, то изображение в рабо* чей области книги не будет обновляться, то есть продолжать работать с книгой будет весьма проблематично.
Для сортировки листов формируется массив строк, элементами которого являются имена листов книги. Для сортировки массива с именами листов книги (процедура Sort) используется простая сортировка выбором. После того как массив отсортирован, листы книги расставляются в нужном порядке (последний цикл программы).
После запуска данного макроса (для удобства работы можно назначить ему кнопку и поместить ее на панель инструментов) рабочие листы текущей книга будут отсортированы либо по номерам, либо по алфавиту. Следует учитывать, что при вк.пюченной защите рабочей книги (Сервис ► Защита ► Защитить книгу) выполнение данной операции невозможно.
Ниже приведен код макроса (листинг 2.9), при выполнении которого список отсортированных листов будет выведен на отдельном рабочем листе Сортировка.
Листинг 2.9. Список отсортированных листов
Sub SortSheets2()
Dim astrSheetNames () As String ' Массив для хранения имен листов
Dim intSheetCount As Integer
Dim i As Integer
Dim objActiveSheet As Object
' Если нет активной рабочей книги - закрыть процедуру
If ActiveWorkbook Is Nothing Then Exit Sub
'Проверка защищенности структуры рабочей книги
If ActiveWorkbook.Protectstructure Then
' Сортировка листов защищенной рабочей книги невозможна
MsgBox "Структура книги ” & ActiveWorkbook.Name & _
” защищена. Сортировка листов невозможна* *\ 一 vbCritical
Exit Sub
End If
I Сохраняем ссылку на активный лист книги
Set objActiveSheet = ActiveSheet
* Отключение сочетания клавиш Ctrl+Pause Break
Application <EnableCancelKey = xlDisabled
'Функция обновления экрана отключается
Application.Screenupdating = False
With ActiveWorkbook
Создаем новый лист "Сортировка1' (если он еще не создан)
On Error Resume Next
If ,Sheets("Сортировка") Is Nothing Then
.Sheets * Add. Name = "Сортировка*'
End If
On Error GoTo 0
'Размещение данных на листе "Сортировка" (в столбец "А”) IntSheetCount = * Sheets.Count
For i = 1 To intSheetCount
,Sheets (**Сортировкап) .Cells (i, 1) = . Sheets (i) .Name
Next i
'Сортировка данных в ячейках листа "Сортировкаи по содержимому — столбца А
.Sheets ("Сортировка^1) .Range (f1AlH) .Sort _ Keyl: = *Sheets("Сортировкаи).Range("А1и), Orderl:=xlAscending
г Заполнение массива имен отсортированными строками
ReDim. astrSheetNames(1 То intSheetCount)
For i « 1 To IntSheetCount
astrSheetNames (i)二.Sheets ("Сортировка1') .Cells (if 1)
Next i
'Перемещение листов
For i = 1 To intSheetCount
* Sheets(astrSheetNames(i)).Move * Sheets(i)
Next i
End With
г Переход на исходный рабочий лист
obj ActiveSheet * Activate
'Включаем обновление экрана
Application.Screenupdating = True
'Включение сочетания клавиш Ctrl+Pause Break
Application.EnableCancelKey = xllnterrupt
End Sub
Отличительной особенностью приведенной программы, помимо отображения списка листов книги на отдельном листе, является использование возможностей Excel для сортировки данных.
В данном случае также необходимо помнить, что при включенной защите рабочей книги операция невыполнима.
Импорт данных, для которых нужно более 256 столбцов
Как известно, Excel не работает с данными, для которых требуется более 256 столбцов. Однако, хоть и пе часто, такая необходимость может появляться, особенно при работе с большими объемами информации. При возникновении таких cinyamiii целесообразно воспользоваться макросом, код которого приведен в листинге 2.10 (этот код нужно написать в стандартном модуле редактора VBA)* Возможность импорта таких данных достигается разбиением одной широкой таблицы (более 256 столбцов) на меньшие (листы по 256 столбцов). После импорта столбцы с 1-го по 256-й находятся на первом листе, с 257-го по 512-й — на втором и т. д. В данном примере в качестве источника данных выступает текстовый файл. Каждая его строка рассматривается как строка таблицы, а запятая считается разделителем столбцов.
Листинг 2Л0. Импорт большого количества данных
Sub ImportWideSheet()
* Хранит заполняемую ячейку'Хранит номер текущей строки'Хранит номер текущего столбца1 Обрабатываемая _ строка (из файла)* В этой строке формируется — значение _заполняемой ячейки таблицы'Лист, на котором находится — заполняемая ячейка* Хранит заполняемую ячейку'Хранит номер текущей строки'Хранит номер текущего столбца1 Обрабатываемая _ строка (из файла)* В этой строке формируется — значение _заполняемой ячейки таблицы'Лист, на котором находится — заполняемая ячейкаDim rgRange As Range
* Хранит заполняемую ячейку
'Хранит номер текущей строки
'Хранит номер текущего столбца
1 Обрабатываемая _ строка (из файла)
* В этой строке формируется — значение _
заполняемой ячейки таблицы
'Лист, на котором находится — заполняемая ячейка
* Хранит заполняемую ячейку
'Хранит номер текущей строки
'Хранит номер текущего столбца
1 Обрабатываемая _ строка (из файла)
* В этой строке формируется — значение _
заполняемой ячейки таблицы
'Лист, на котором находится — заполняемая ячейка
Dim IngRow As Long
Dim intCol As Integer
Dim i As Integer
Dim strLine As String
Dim strCurChar As String * 1
Dim strCellValue As String
Dim wshtCurrentsheet As Worksheet
'Отключение обновления изображения Application.Screenupdating = False
'Создание книги с одним листом Workbooks.Add xlWorksheet
Set rgRange = ActiveWorkbook.Sheets(1).Range(MA1H)
'Чтение первой строки из файла (по этой строке определяется ширина таблицы)
Open ThisWorkbook.Path & u\Primer * txt" For Input As #1
Line Input #1, strLine
'Обработка первой строки с добавлением новых листов по мере необходимости
For i = 1 То Len(strLine)
strCurChar = Mid(strLine, i, 1)
* Проверка - закончились столбцы или нет If intCol о 0 And intCol Mod 256 = 0 Then
Столбцы текущего листа закончились - добавим новый лист _ и перейдем к его первому столбцу
Set ^shtCurrentsheet = ActiveWorkbook* Sheets.Add(, ActiveWorkbook.Sheets(Activeworkbook.Sheets.Count))
Set rgRange ^ wshtCurrentSheet. Range (ИА111) intCol = 0
End If
'Проверка - закончилось поле млн нет If strCurChar = ”「Then
' Запишем данные в таблицу
rgRange.Offset(IngRow, intCol) = strCellValue intCol - intCol + 1 strCellValue 工"”
Else
■ Добавляем очередной символ в строку со значением текущей — ячейки
strCellValue = strCellValue & Mid(strLine, i, 1)
'Проверка - конец строки или нет If 1 = Len(strLine) Then
' Дошли до конца строки - запишем значение последней ячейки rgRangeФOffset(IngRow, intCol) = strCellValue intCol = 0 strCellValue ="”
End If
End If Next i
'Чтение остальных строк файла Do Until EOF(l)
Set rgRange = ActiveWorkbook.Sheets (1) .Range ("Alf,)
IngRow = IngRow + 1
intCol м 0
Line Input #1, strLine
'Обработка считанной строки For i ^ 1 To Len (strLine)
strCurChar = Mid(strLine, i, 1)
Проверка - закончились столбцы или нет
If intCol с 0 And intCol Mod 256 = 0 Then
Столбцы текущего листа закончились - добавим новый лист _ и перейдем к его первому столбцу
Set wshtCurrentSheet = ActiveWorkbook. Sheets. Add (,— ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count))
Set rgRange = wshtCurrentSheet. Range (HAlIr) intCol = 0 End If
'Проверка - закончилось поле или нет If strCurChar = ”「Then
'Запишем данные в таблицу
rgRange.Offset(IngRow, intCol) = strCellValue
intCol = intCol + 1
strCellValue ="” Else
'Добавляем очередной символ в строку со значением текущей _ ячейки
strCellValue = strCellValue & Mid(strLine, i, 1)
'Проверка - конец строки или нет If i = Len(strLine) Then
'Дошли до конца строки - запишем значение последней _ ячейки
rgRange.Offset(IngRow, intCol) = strCellValue strCellValue = "n End If End If
Next i
Loop
'He забываем закрыть входной файл
Close #1
* и разрешить обновление изображения Application.Screenupdating = True End Sub
После написания приведенного выше кода в окне выбора макросов появится макрос importWideSheet. В результате его выполнения будет импортирован файл Primer. txt, который расположен в том же каталоге, что и текущая книга. Для импортированных данных будет открыта новая книга Excel, При этом все данные» выходящие за пределы 256 столбца» будут расположены на следующих ли-
стах созданной книги (будет добавлено столько листов, сколько необходимо для импорта).
Приведенный пример подразумевает, что первая строка данных имеет тот же формат, что и остальная часть данных. При этом в первой строке содержится максимальное количество столбцов.
Очевидно, что после внесения соответствующих изменений в код макроса можно применять его для импорта сал1ых разных данных, которые могут располагаться в различных местах.
Рабочий лист
Рабочий лист является основным составным элементом рабочей книги. По умолчанию в состав новой книги включены три листа. Чтобы увеличить или уменьшить количество листов в новой книге, необходимо выполнить команду главного меню Сервис ► Параметры и в открывшемся окне на вкладке Общие в поле Листов в новой книге указать требуемое значение. Следует отметить, что максимально возможное количество листов в книге — 255,
Листы-синонимы
В программе Microsoft Excel запрещено создание разных рабочих листов с одинаковыми именами. Однако с помощью небольшой хитрости можно обойти этот запрет. Для этого нужно использовать разный регистр символов и выбирать те символы» которые в русском и английском языках одинаковые (например, буквы С, А, Р и т. дj. В частности, можно создать два 刀нста с именем Таблица» но в имени одного из них будет использована английская буква А.
Автоматическая вставка URL-адреса
Наиболее распространенный способ вставки в документ URL-адреса — это копирование его в буфер обмена и последующая вставка в требуемое место. Чтобы произвести данную операцию, можно воспользоваться и другим способом. Для этого необходимо выполнить следующие действия.
Открыть требуемую страницу в Internet Explorer.
Перейти в Excel, выделить ячейку, в которую необходимо вставить адрес, и нажать сочетание клавиш Ctrl+K. В результате откроется oimo Добавление гиперссылки.
Нажать Alt+Tab для перехода в Internet Explorer.
Нажать ALt+Tab для возврата обратно в Excel,
В окне Добавление гиперссылки нажать кнопку ОК.
В результате выполнения указанных действий адрес веб*страницы отобразится в выделенной ячейке рабочего листа.
Быстрый переход по рабочему листу
Если рабочий лист Excel содержит большой объем информации, то целесообразно присвоить имена его произвольным областям для быстрого перехода по этим областям. Данный процесс называется созданием закладок.
Чтобы создать закладку, нужно выделить произвольный диапазон (несколько ячеек) и выполнить команду главного меню Вставка ► Имя ► Присвоить. В результате откроется окно, изображенное на рис, 24
Рис. 2.4. Окно Присвоение имени
В данном окне в поле Имя с клавиатуры следует ввести имя создаваемой закладкм и нажать кнопку ОК.
При создании закладки необходимо соблюдать следующие правила*
В имени закладки должно содержаться не более 255 символов.
口 Первый символ в имени закладки должен быть либо буквой, либо символом подчеркивания. После первого символа можно использовать буквы, цифры или символы подчеркивания.
Если имя закладки состоит из нескольких слов, то они должны разделяться символом подчеркивания (не пробелом).
Чтобы проверить работоспособность созданной закладки, нужно установтггь курсор в любое место рабочего листа и нажать сочетание клавиш CtrL+G. При этом откроется окно, показанное на рис. 25
В данном окне нужно установить курсор на имя требуемой закладки (в нашем примере —Область!) и нажать кнопку ОК.
В результате Excel перейдет к соответствую щей области рабочего листа.
Рис. 2.5. Окно Переход
Разные листы с общими данными
Достаточно распространенной является ситуация, когда необходимо связать между собой данные, хранящиеся на разных листах рабочей книги. При этом порядок действий будет примерно таким (все данные — условны).
Открыть рабочую книгу.
Перейти на Лист2 и в ячейке С5 ввести значение 100.
3* Перейти на Лист1 н в ячейке А2 ввести формулу ^Лист2 !С5.
4. Нажать Enter.
После выполнения указанных действий в ячейке А2, которая расположена на листе Лист1, отобразится значение 100 (то есть то же значение, что и в ячейке С5 на листе Лист2).
Рисование «правильных» фигур
При рисовании автофигур иногда возникает необходимость их привязки к сетке Excel, Чтобы использовать данный прием, нужно включить отображение панели рисования (Вид ► Панели инструментов ► Рисование), щелкнуть мышью на какой* нибудь фигуре (например, на прямоугольнике) и рисовать фигуру при нажатой клавише Alt. Все стороны фигуры будут выравниваться только по границам ячеек.
Скрытие данных от посторонних
В Excel реализована возможность защиты данных от несанкционтфованного просмотра н редактирования. Для этого можно скрыть строки и столбцы, в которых хранится конфиде! I циальная информация. Поскольку строки и столбцы скрываются аналоппным образом, мы рассмотрим данный прием на примере скрытия строк.
На рабочем листе нужно найти последнюю строку, содержащую общедоступные данные, и выделить полностью строку, расположенную сразу под ней (для этого нужно щелкнуть мышью на кнопке с номером строки). После этого, нажав сочетание клавиш Ctrt+Shift+Ф, выделить все остальные строки рабочего листа. Теперь после выполнения команды главного меню Формат ► Строка > Скрыть выделенный диапазон будет скрыт из рабочего листа (на месте скрытых строк будет отображаться серый фон). При этом все лкгеющлеся в этом диапазоне данные сохраняются —чтобы они вновь отобразились, нужно выделить весь рабочий лист и выполнить команду главного меню Формат ► Строка ► Отобразить.
Новый лист — через макрос
Чтобы создать новый рабочий лист, можно воспользоваться макросом, код которого приведен в листинге 2.11.
Листинг 2.11. Создание нового листа
Sub NewSheet ()
Worksheets.Add
End Sub
Удобно назначить данному макросу кнопку и поместить ее на панель инструментов для ускорения процесса создания листа.
Блокировка использования контекстного меню
При необходимости можно запретить использование контекстного меню текущего рабочего листа. Для этого можно воспользоваться следующим макросом (листинг 2.12).
Листинг 2.12. Блокировка контекстного меню
Sub Worksheet_BeforeRightClick (ByVai Target As Range, Cancel As Boolean) Static intCount As Integer ' Счетчик нажатий кнопки мыши Dim х As Integer^ у As Integer
'Блокировать обработку щелчка правой кнопкой мыши
Cancel ^ True
'Отображение текстового поля с количеством щелчков правой _ кнопкой мыши
х = Target,Left
у = Target * Тор
intCount = intCount + 1
ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, x, y, 35, 20}.TextFrame.Characters.Text = intCount
End Sub
Следует учитывать, что приведенный код должен быть помещен в модуль соответствующего рабочего листа.
Теперь при щелчке правой кнопкой мыши в любом месте текущего рабочего листа контекстное меню будет недоступно. Вместо него на экране будет появляться порядковый номер щелчка правой кнопкой мыши (например, при первой попытке вызова контекстного меню вместо него отобразится 1, при второй попытке — 2 и т. д.).
Однако при этом остается возможность вызова контекстного меню с помощью соответствующей клавиши.
Вставка колонтитула с именем книги, листа и текущей датой
Обычно колонтитулы вставляются с помощью команды Вид ► Колонтитулы. Однако для этой цели можно также воспользоваться макросом, код которого приведен в листинге 2.13.
Листинг 2.13. Вставка колонтитула
Sub AddPageHeader()
Dim i As Integer
With ThisWorkbook
' Вставка колонтитулов на все листы рабочей книги
For i = 1 То .Worksheets.Count - 1
.Worksheets(i).PageSetup.LeftHeader = .FullName
.Worksheets(i).PageSetup.CenterHeader = Worksheets(i).Name
.Worksheets(i).PageSetup.RightHeadez 工 Now()
Next
End With
End Sub
Следует учитывать, что приведенный код должен быть помещен в модуль ЭтаКнига.
В результате выполнения данного макроса в колонтитул документа слева будет выведено имя рабочей книги (с указанием полного пути к файлу), ло центру — имя текущего рабочего листа, а справа — текущая дата. Увидеть сформированный колонтитул можно в режиме предварительного просмотра.
Проверка существования листа
При большом количестве листов в рабочей книге иноттха бывает необходимо быстро узнать, есть ли в книге тот или иной лист. Для этого целесообразно применить пользовательскую функцию dhSheetExist, код которой приводится в листинге 2.14. В ica- честве аргумента данная функция принимает строку с именем искомою листа и возвращает значение истина, если лист есть в книге, или ложь, если листа в книге нет.
Листинг 2.14. Проверка существования листа
Function dhSheetExist(strSheetName As String) As Boolean
Dim objSheet As Object
On Error GoTo HandleError 1 При ошибке перейти на HandleError
'Пытаемся получить ссылку на заданный лист
objSheet = ActiveWorkbook.Sheets(strSheetName)
* Ошибки не возникло - лист существует
dhSheetExist = True
Exit Function
HandleError:
* При попытке получить доступ к листу с заданным именем _ возникла ошибка, значит, такого листа не существует
dhSheetExist = False
End Function
Работа приведенной фунтсции основана на том, что если листа в книге нет, то при попытке обращения к нему (инструкция ActiveWorkbook. Sheets (strSheetName)) будет сгенерирована ошибка времени исполнения, которую перехватит обработчик ошибок, идущий в тексте программы после метки HandleError. Таким образом, при возникновении ошибки функция возвращает ложь. Если ошибка отсутствует, то при обращении к листу инструкции функции исполняются до конца (до оператора End Function) н функция возвращает значение ИСТИНА.
После написания данной функции она появится в окне Мастер функций (Вставка > Функция) в категории Определенные пользователем* После выбора функции нужно будет указать имя листа (это единственный аргумент данной функции), наличие которого в текущей книге нужно проверить. Результат выполнения функции отобразит^ ся в ячейке, в которой находится курсор: если указанный лист присутствует в теку* щей книге, то будет выведено значение истина, при отсутствии листа — значение ложь.
Проверка, защищен ли рабочий лист
Перед началом работы с листом Excel иногда бывает полезно узнать, защищен он или нет (вспомним, что защита рабочего листа включается с помощью команды главного меню Сервис ► Защита ► Защитить лист). Быстро получить ответ на этот вопрос можно с помощью макроса, код которого приведен в листинге 2*15.
Листинг 2.15. Проверка наличия защиты рабочего листа
Sub isSheetProtected()
'Проверка, установлена ли защита на содержимое листа
If Worksheets(1).ProtectContents Then
MsgBox ° Защита листа включена1'
Else
MsgBox ** Защита листа не включена11
End If
End Sub
Если текущий рабочий лист защищен, то после выполнения данного макроса появится окно с сообщением Защита листа включена. При отсутствии защиты в этом окне отобразится сообщение Защита листа не включена.
Сколько страниц на всех листах?
Нередко перед тем как вывести данные на печать, пользователь задумывается: а сколько страниц займет печатная форма документа? Для получения ответа на этот вопрос следует написать и применить макрос, код которого приведен в листинге 2.16 (данный код нужно набрать в стандартном модуле редактора VBA),
Листинг 2.16. Подсчет страниц
Sub GetPrintPagesCdunt()
Dim wshtSheet As Worksheet
Dim intPagesCount As Integer
' Суммирование количества страниц, необходимых для печати всех _ листов книги
For Each wshtSheet In Worksheets
intPagesCount = intPagesCount + (wshtSheet * HPageBreaks,Count + 1) * _ (wshtSheet«VPageBreaks.Count + 1)
Next
MsgBox nBcero страниц: ” & intPagesCount
End Sub
Программа вычисляет количество необходимых для печати страниц на основе данных о горизонтальных и вертикальных разрывах страницы на листе (использование свойств HPageBreakers .Count и VPageBreakers .Count дает информацию о количестве горизонтальных и вертикальных разрывов страниц листа соответственно). Когда мы узнали, сколько разрывов страниц на листе, вычислить количество самих страниц не представляет большого труда (о чем свидетельствует простота используемого для этого расчета выражения: (wshtSheet. HPageBreaks . Count + 1) * (wshtSheet.VPageBreaks.Count + I)).
После запуска макроса на экране отобразится окно, в котором будет указано количество печатных страниц всех листов текущей рабочей книпг
Автоматический пересчет данных таблицы при изменении ее значений
Часто в процессе работы возникает необходимость пересортировки данных таблицы в зависимости от того, как они изменяются. Этот процесс целесообразно автоматизировать (особенно при работе с большими объемами информации). Рассмотрим решение этой проблемы на конкретном примере.
Предположим» что в таблице в ячейках с Al по АН содержится перечень торговых точек (магазинов), а в ячейках с Bl по ВИ — дневная выручка каждой торговой точки. Нам нужно выделить красным жирным шрифтом максимальное значение, а синим —минимальное. Остальные данные отображаются шрифтом, используемым по умолчанию. Также нам нужно пометить желтым цветом ячейки, содержащие выручку выше средней по всем торговым точкам. При этом необходимо сделать так, чтобы таблица соответствующим образом автоматически переформировывалась при внесении в нее изменений. Решить эту задачу поможет код, приведенный в листинге 2.17 (этот код должен быть помещен в модуль рабочего листа).
Листинг 2.17. Переформирование таблицы
Sub Worksheet_Change{ByVai Target As Range)
Dim rgData As Range
Dim cell As Range
Dim dblMax As Double, dblMin As Double, dblAverage As Double
* Получение контролируемого диапазона ячеек
Set rgData = Range("B2:B11")
'Проверка, не входит ли измененная ячейка в контролируемый _ диапазон
If Not (Application.Intersect(Target, rgData) Is Nothing) Then
If Application.WorksheetFunction.CountA(rgData) > 0 Then
'Изменена ячейка из контролируемого диапазона
Заново рассчитываем минимальмоег максимальное и среднее 一 значения в контролируемом диапазоне ячеек
dblMin = Application.WorksheetFunction.Min(rgData) dblMax = Application.WorksheetFunction.Max(rgData) dblAverage = Application.WorksheetFunction.Average(rgData)
'Проверяем каждую ячейку из контролируемого диапазона _ и изменяем цвет шрифта ячеек с минимальным и максимальным _ значениями, а также помечаем желтым цветом ячейки _ со значениями больше среднего
For Each cell In rgData
If cell.Value = dblMax Then
'Ячейку с максимальным значением выделим красным цветом
cell.Font.Bold = True
cell,Font.Color = RGB(255, 0, 0)
Elself cell.Value = dblMin Then
'Ячейку с минимальным значением выделим синим цветом cell.Font.Bold = False
cell.Font.Color = RGB(0, 0, 255)
Else
cell.Font.Bold = False
cell * font.Color = RGB(0, 0, 0)
End If
If cell.Value > dblAverage Then
Значение в ячейке больше среднего - выделим ее _ желтым цветом
cell.Interior * Color - RGB(255, 255, 0)
Else
cell.Interior * Colorindex = xlNone
End If
Next
Else
rgData.Interior.Colorindex = xlNone
End If
End If
End Sub
Теперь все данные таблицы будут оформлены в соответствии с нашими требованиями, При внесении в таблицу изменений она будет автоматически переформирована.
Ячейка и диапазон
Даниый раздел посвящен описанию трюков, которые можно выполнять при работе с ячейкой либо с диапазоном выделенных ячеек.
Быстрое заполнение ячеек
Чтобы быстро заполнить ячейку содержимым ячейки, расположенной выше, следует нажать сочетание клавиш CtrL+D. Если же копируемая ячейка включает в себя формулу, то она будет скопирована с соблюдением относительных адресов. Рассмотрим это на конкретном примере.
Введем в ячейки с А1 по АЗ значения 5, 10 и 15 соответственно, а в ячейки Bl, В2 и ВЗ — значения 30, 50 и 70. После этого в ячейку С1 введем формулу =сумм (Al : В1) н нажмем Enter — в данной ячейке в соответствии с формулой отобразится значение 35. Если же теперь мы установим курсор в ячейку С2 и нажмем Ctrl+D, то в ней отобразится значение 60 (то есть сумма ячеек А2 н В2), а формула скопируется в следующем виде: =сумм (А2 :В2). При нажатии сочетания Ctrl+D в ячейке СЗ формуласкопируется следующим образом: =сумм (АЗ :вз), и результат будет равен 85.
Автоматизация ввода данных в ячейки
В Microsoft Excel с помощью несложного трюка можно вводить данные только в заранее определенные ячейки. Рассмотрим это на конкретном примере.
Допустим, нам необходимо ввести данные только в ячейки СЗ:С5 и А1:А4. Для этого следует выделить мышью диапазон СЗ:С5, а затем, нажав клавишу Ctrl, — диапазон А1:А4 Теперь, не снимая выделения, в ячейках с Al no А4 последовательно вводим необходимые значения. После того как заполнена ячейка А4 и нажата клавиша Enter, курсор автоматически перейдет в ячейку СЗ. После заполнения ячеек СЗ:С5 и пажа- тая Enter курсор опять перейдет в ячейку AL После ввода всех необходимых данных можно снять выделение.
Для ввода данных в определенные ячейки можно использовать различные макросы. Пример одного из таких макросов приведен в лнстннге 2.18.
Листинг 2.18. Ввод данных в ячейки
Sub SetCellData()
Заполнение значениями ячеек АЗ и В4
Range ("АЗ”) = 11 Данные для ячейки АЗ"
Rang巳("Е4”)^ 11 Данные для ячейки В4"
End Sub
В результате выполнения данного макроса в ячейку АЗ будет введено значение данные для ячейки АЗ, а В ячейку В4 ^ Данные для ячейки В4・
С помощью похожего макроса (листинг 2.19) можно выполнять вычисления с использованием формул.
Листинг 2.19. Ввод даж-гых с использованием формул
Sub SetCellFormula()
'Запись в ячейку Аб формулы "=А5+В5"
Range「Аб")=『А5+В5"
End Sub
В результате выполнения данного макроса в ячейке Аб отобразится сумма ячеек А5 и В5. Если же в приведенном макросе вместо строкн Range (МА6 ") ^』А5+В5 " ввести. например, Range ("А2: А5") = 2, то все ячейки диапазона А2:А5 будут заполнены значением 2.
Ввод дробных чисел
При вводе в ячейку дробных значений Excel может интерпретировать их в дату. Это обусловлено тем, что в некоторых случаях Excel не знает, что нужно ввести пользователю: дату или дробное значение. Например, при поп ытке ввести в ячей* ку дробь 2/5 после нажатия Enter в данной ячейке отобразится 02 .май, а при вводе дроби 7/92 появится значение июл • 92. Чтобы обойти эту особенность, достаточно при вводе дроби набрать перед ней символ о, например о 2/5. Теперь Excel поймет пользователя правильно, и в ячейке после нажатия клавиши Enter отобразится значение 2/5.
Сбор данных из разных ячеек
В процессе эксплуатации программы иногда возникает необходимость объединить содержимое разных ячеек рабочего листа. Для выполнения объединения необходимо воспользоваться оператором &. Чтобы лучше понять суть данной операции, рассмотрим ее на конкретном примере.
Допустим, имеются два списка: в одном содержатся должности сотрудников, в другом -их фамилии. Нам нужно объединить эти списки. В первом списке в ячейке А1 содержится должность Бухгалтера во втором списке в ячейке В1 — фамилия Рублев, Объединим эти значения в ячейке С1 (все данные в примере условны).
Для этого в ячейке С1 необходимо ввести следующую формулу: =А1&" "&BL После нажатия Enter в ней отобразится значение Бухгалтер Рублев.
При объединении ячеек можно ввести дополнительную информацию - соответствующий текст набирается в формуле между кавычками. Например, если в нашем примере для ячейю! С1 создать следующую формулу: =А1 & " по зарплате "&В1, то после ее ввода в ячейке отобразится значение Бухгалтер по зарплате Рублев.
勿 ПРИМЕЧАНИЕ
Если между кавычками дополнительный текст не вводится, то они обяза- 货тельно должны быть разделены пробелом.
Если в ячейках А2 и В2 содержатся значения соответственно Экономист и Сидоров, то для объединения их в ячейке С2 можно нажать сочетание клавиш Ctrl+D. При этом созданная в ячейке С1 формула скопируется с учетом относительных адресов, и в ячейке С2 отобразится значение Экономист по зарплате Сидоров.
Выделение диапазона над текущей ячейкой
Предположим, нам необходимо выделить диапазон с данными, расположенный непосредственно над текущей ячейкой. Можно, конечно, выполнить это стандартным способом (наприкгер, с помощью мыши). Но в некоторых случаях для этого целесообразнее использовать макрос, код которого приведен в лиспгнге 2.20.
Листинг 2.20. Выделение диапазона над текущей ячейкой
Sub SelectCellRange()
Dim strSelTop As String, strSelBottom As String
Получение адресов нижней и верхней ячеек диапазона для выделения strSelBottom = Act iveC ell.Addre s s
strSelTop 二 Cells (1, ActiveCell.Column) .Address
'Выделяем все ячейки выше текущей (вместе с текущей ячейкой)
Range(strSelTop & ":" & strSelBottom).Select
End Sub
После выполнения макроса будет выделен диапазон, расположенный над текущей ячейкой (при условии, что этот диапазон содержит данные).
Поиск ближайшей пустой ячейки столбца
Если таблица заполнена большим количеством данных, то иногда бывает необходимо быстро найти ближайшую ячейку столбца, не содержащую никаких данных. Поскольку выполнение данной операции вручную — процесс слишком трудоем' кий, целесообразно воспользоваться макросом, код которого приведен в листинге 2.2L
Листинг 2.21. Поиск ближайшей пустой ячейки столбца
Sub FindEmptyCellО
‘ Поиск ближайшей пустой ячейки в текущем столбце
Do While Not IsEmpty(ActiveCell.Value)
ActiveCell.Offset(lf 0).Select
Loop
End Sub
После выполнения данного макроса курсор быстро «пробежите по всем ячейкам текущего столбца, остановившись на ближайшей пустой ячейке. При этом необходимо учитывать, что направление поиска — сверху вниз, то есть ячейки, расположенные над начальным положением курсора, обнаружены не будут, поэтому перед запуском макроса следует установить курсор в верхнюю ячейку столбца.
Поиск максимального значения в диапазоне
В процессе работы с большими объемами данных часто возникает необходимость быстрого поиска максимального значения определенного диапазона (либо всего рабочего листа). Например, если в таблице хранится информация о торговой выручке за каждый день в течение года, то, чтобы найти максимальную дневную выручку вручную, потребуется слишком много времени и усилий. Для автоматизации данного процесса можно приментггь макрос, код которого приведен в листинге 2.22.
Листинг 2.22. Поиск максимального значения
Sub FindMaxValue{}
On Error Goto NoCell
If Selection.Count > 1 Then
‘ Поиск максимального значения в выделенных ячейках
Selection,Find(Application.Max(Selection)).Select
Else
Поиск максимального значения во всех ячейках листа
ActiveSheet.Cells.Find(Application.Мах<ActiveSheet.Cells)).Select
End If
Exit Sub
NoCeli:
MsgBox мМаксимальное значение не найдено"
End Sub
После запуска данного макроса будет выделена ячейка, содержащая максим<ьпьное значение. При наличии выделенного диапазона поиск осуществляется только в нем; если же диапазон не выделен, то поиск ведется по всему рабочему листу. Если максимальное значение не обнаружено, то по окончании поиска на зкране отобразится окно с сообщением Максимальное значение не найдено (текст этого сообщения можно корректировать по своему усмотрению путем внесения соответствующих изменений в код макроса).
Автоматическая замена значений диапазона
Рассмотрим трюк, с помощью которого можно автоматически заменять значения ячеек диапазона на какие-либо фиксированные значения. В листинге 2.23 показан код одного из макросов, которые позволяют решить данную задачу.
Листинг 2.23. Автоматическая замена значений
Sub ReplaceValues()
Dim cell As Range
'Проверка каждой ячейки диапазона на возможность замены _ значения в ней (отрицательные значения заменятся на -1, положитель ные - на 1)
For Each cell In Range("Cl:СЗ").Cells
If cell.Value < 0 Then
cell.Value = -1
Elself cell.Value > 0 Then
cell.Value = 1
End If
Next
End Sub
В данном примере обрабатывается диапазон С1:СЗ. После применения приведенного выше макроса все положительные значения данного диапазона будут заменены на 1, а отрицательные — на -1.
Очевнпно, что с помощью подобных макросов можно заменять значения в любых диапазонах.
Засекречивание содержимого ячейки
При необходимости можно скрыть от несанкционированного просмотра либо редактирования содержимое той или иной ячейки. Рассмотрим применение данной операции на конкретном примере.
Допустим, в ячейке А1 содержится значение 25, в ячейке А2 — значение 4 3, а в ячей ке В1 рассчитана сумма двух этих ячеек по формуле =СУММ (А1: А2) (рис. 2,6).
В1 ▼ А 二 С VMM (АМ А2)
Рис. 2.6. Фрагмент рабочего листа
Скроем содержимое ячейки А1. Для этого выделим ее курсором, выполним команду главного меню Формат ► Ячейки и в открывшемся окне на вкладке Число в списке Числовые форматы выберем позицию (все форматы), которая расположена в кон* це данного списка. После этого в открывшемся справа поле Тип введем подряд три точки с запятой — ; ; ; (рис. 2.7).
Рис. 2.7. Окно Формат ячеек
После нажатия в данном окне кнопки ОК содержимое ячейки А1 будет скрыто (рис. 2.8).
В1 ▼ А =СУММ(А1:А2)
Рис. 2.8. Скрытие содержимого ячейки
На данном рисунке видно, что, несмотря на то что в ячейке А1 ничего не отображается, значение в ней все равно сохраняется и участвует в расчетах (см. строку формул и значение в ячейке В1). Если установить курсор в ячейку А1, то ее значение отобразится в строке формул.
Всем ячейкам диапазона — одно значение
В процессе эксплуатации программы иногда возникает необходимость быстрого заполнения нескольких ячеек одинаковым содержимым. Наиболее распространенный способ — копирование нужного значения в буфер, затем выделение диапазона яче^ ек, в которые необходимо ввести это значение, и нажатие Enter. Однако подобный эффект достигается н другим способом. Для этого необходимо выполнить следующие действия.
L Выделить соответствующий диапазон ячеек (допускается выделение несмежных диапазонов).
Ввести требуемое значение.
Нажать сочетание клавиш Ctrl+Enten
В результате введенное значение отобразится во всех ячейках выделенного диапазона.
«Фотографирование» ячеек
В Excel реализована удобная возможность, позволяющая создавать С1фгшшоты выделенных ячеек н вставлять их в виде рисунка. Для этого нужно выделить диапазон ячеек, которые необходимо скопировать, а затем, нажав и удерживая клавишу Shift, выполнить команду главного меню Правка ► Копировать рисунок. В результате откроется окно Копировать рисунок (рис. 2.9).
Если в данном окне установить переключатель Вид в положение как на экране, то содержимое выделенного диапазона будет скопировано в том виде, в каком оно представлено на экране. При выбранном значении как на печати содержимое выделенного диапазона будет скопировано в том виде, в каком оно будет выведено
на печать на текущем установленном принтере (например, если принтер черно-белый, то и изображение будет скопировано в черно-белом формате).
Переключатель Формат доступен только в том случае, когда переключатель Вид установлен в положение как на экране. При установленном значении векторный изображение будет скопировано как метафайл Windows, а при значении растровый — как точечный рисунок (в данном случае рисунок будет выглядеть корректно только при таком же разрешении монитора).
После нажатия в окне Копировать рисунок кнопки ОК будет создан скриншот выде^ ленного диапазона ячеек.
Затем следует выбрать место для вставки рисунка и при нажатой клавише Shift выполнить команду главного меню Правка ► Вставить рисунок. В результате содержимое выделенного диапазона будет вставлено в указанное место в виде рисунка.
При выполнении данной операции следует учитывать» что сетка Excel, которая не выводится на печать, также входит в состав созданного рисунка.
Добавление в ячейку раскрывающегося списка
Одним из удобных способов заполнения ячейки является применение раскрывающегося списка, который включает в себя перечень возможных значений. Чтобы создать в ячейке раскрывающийся список, нужно выполнить следующие действия.
Ввести список допустимых значений в один столбец (при необходимости этот столбец можно скрыть).
Установить курсор в ячейку, в которую необходимо поместить раскрывающийся список.
Выполнть команду главного меню Данные > Проверка,
В открывшемся окне перейти на вкладку Параметры
В поле Тип данных из раскрывающегося списка выбрать значение Список.
В открывшемся поле Источник указать диапазон с элементами списка (то есть столбец, в который были введены допустимые значения, см. n. 1).
Проверить, чтобы был установлен флажок Список допустимых значений (обычно этот флажок установлен по умолчанию).
Нажать кнопку ОК.
Данная технология создания в ячейке раскрывающегося списка отличается удобством и быстротой, а также тем, что для ее реализангт не требуете貝 написание макросов.
Быстрое заполнение диапазона
Рассмотрим несколько несложных трюков, с помощью которых можно быстро заполнить любой диапазон необходимыми данными.
Первый способ
Предположим, что нам необходимо заполнить какой-нибудь диапазон последовательностью чисел от 1 до 100. Для решения этой задачи удобно воспользоваться макросом, код которого приведен в листинге 2.24 (этот код следует набрать в стандартном модуле редактора VBA),
Листинг 2.24. Быстрое заполнение диапазона
Sub FillCells()Dim intStartVal As IntegerDim intStep As IntegerDim intEndVal As IntegerDim intVal As IntegerDim intCellOffset As IntegerSub FillCells()Dim intStartVal As IntegerDim intStep As IntegerDim intEndVal As IntegerDim intVal As IntegerDim intCellOffset As IntegerНачальное значениеШаг при изменении значенияКонечное значениеТекущее значениеСмещение от началь ной ячейкиНачальное значениеШаг при изменении значенияКонечное значениеТекущее значениеСмещение от началь ной ячейки
Sub FillCells()
Dim intStartVal As Integer
Dim intStep As Integer
Dim intEndVal As Integer
Dim intVal As Integer
Dim intCellOffset As Integer
Sub FillCells()
Dim intStartVal As Integer
Dim intStep As Integer
Dim intEndVal As Integer
Dim intVal As Integer
Dim intCellOffset As Integer
Начальное значение
Шаг при изменении значения
Конечное значение
Текущее значение
Смещение от началь ной ячейки
Начальное значение
Шаг при изменении значения
Конечное значение
Текущее значение
Смещение от началь ной ячейки
Установка параметров заполнения intStartVal = 1 intStep = 1 intEndVal = 100
1 Заполнение ячеек текущего столбца значениями от 1 до 100
For intVal = intStartVal То intEndVal Step intStep ActiveCell.Offset(intCellOffset, 0).Value = intVal intCellOffset = intCellOffset + 1
* Next intVal
End Sub
Сразу после выполнения макроса диапазон, расположенный ниже текущей ячей* ки (в том же столбце), будет заполнен числами от 1 до 100 (заполнение начнется с активной ячейки).
Приведенный выше код можно изменять по своему усмотрению и таким образом корректнровать длину последовательностн, шаг и иные параметры. Например, можно применить такой код (листинг 2.25).
Листинг 2.25. Заполнение через интервал
Sub FillCells ()Dim intStartVal As IntegerDim intStep As IntegerDim intEndVal As IntegerDim intVal As IntegerDim intCellOffset As IntegerDim intCellStep As IntegerSub FillCells ()Dim intStartVal As IntegerDim intStep As IntegerDim intEndVal As IntegerDim intVal As IntegerDim intCellOffset As IntegerDim intCellStep As Integer'Начальное значение1 Шаг при изменении значения'Конечное значение1 Текущее значение1 Смещение от начальной ячейки 'Шаг при перемещении между — заполняемыми ячейками'Начальное значение1 Шаг при изменении значения'Конечное значение1 Текущее значение1 Смещение от начальной ячейки 'Шаг при перемещении между — заполняемыми ячейками
Sub FillCells ()
Dim intStartVal As Integer
Dim intStep As Integer
Dim intEndVal As Integer
Dim intVal As Integer
Dim intCellOffset As Integer
Dim intCellStep As Integer
Sub FillCells ()
Dim intStartVal As Integer
Dim intStep As Integer
Dim intEndVal As Integer
Dim intVal As Integer
Dim intCellOffset As Integer
Dim intCellStep As Integer
'Начальное значение
1 Шаг при изменении значения
'Конечное значение
1 Текущее значение
1 Смещение от начальной ячейки 'Шаг при перемещении между — заполняемыми ячейками
'Начальное значение
1 Шаг при изменении значения
'Конечное значение
1 Текущее значение
1 Смещение от начальной ячейки 'Шаг при перемещении между — заполняемыми ячейками
Установка параметров заполнения intStartVal = 3 intStep ^ 3 intEndVal = 30 intCellStep = 3
,Заполнение ячеек текущего столбца значениями от 3 до 30 For intVal = IntStartVal То intEndVal Step intStep
ActiveCell.Offset(intCellOffset, 0).Value = intVal intCellOffset = intCellOffset + intCellStep Next intVal End Sub
После выполнения данного макроса последовательность будет заполнена числами от 3 до 30, причем числа будут расположены в каждой третъе41 ячейке следующим образом: 3 (активная ячейка), 6,9,12,…,27,30,
Второй способ
Допустнм, что нам нужно быстро заполнить диапазон, состоящий из 10 ячеек в высоту и 5 ячеек в ширину, последовательностью чисел, расположенных по порядку от 1 до 50. Для решения данной задачи напишем в стандартном модуле редактора VBA представленный ниже код (листинг 2.26).
Листинг 2.26. Заполнение указанного диапазона
Sub FillCellRectо
Dim IngRows As Long, intCols As Integer 1 Количество ячеек по _ горизонтали и вертикали
Dim IngRow As Long, intCol As Integer * Координаты текущей ячейки Dim IngStep As Long, IngVal As Long
' Установка начального значения и шага заполнения IngVal 匚 1 IngStep = 1
' Ввод количества ячеек по горизонтали и вертикали, которое _ необходимо заполнить
IngRows = Vai(InputBox("Количество ячеек в высоту")) intCols = Vai(InputBox(нКоличество ячеек в ширину0))
'Отключение обновления экрана Application.Screenupdating - False
'Заполнение ячеек значениями For IngRow = 1 То IngRows
For intCol ^ 1 То intCols
ActiveCell.Offset(IngRow, intCol).Value = LngVal
IngVal = LngVal + IngStep
Next intCol
Next IngRow
Включение обновления экрана
Application.Screenupdating = True
End Sub
В результате написания кода будет создан макрос FillCellRect. После его запуска откроется окно, в котором с клавиатуры нужно указать количество ячеек в высоту (в нашем примере нужно ввести значение 10). После нажатия в данном окне кнопки ОК откроется аналогичное окно, в котором точно так же нужно ввести количество ячеек в ширину (в нашем примере нужно ввести 5)и нажать ОК. После этою в соответствии с выполненными настройками будет автоматически заполнен диапазон, начиная с ячейки, на которой установлен курсор (эта ячейка будет являться левой верхней в заполненном диапазоне). Изменив соответствующим образом код макроса, можно корректировать шаг последовательности, ее первое число (в строке ingVal = 1, которая входит в состав приведенного выше кода, указано, что первое число последовательности —1) н другие параметры.
Третий способ
Данный способ заполнения диапазона также предусматривает написание макроса. Его преимущество состоит в том, что он быстрее способа, о котором рассказано в предыдущем примере. Код макроса (он должен быть написан в стандартном модуле редактора VBA) выглядит следующим образом (листинг 2.27).
Листинг 2.27. Заполнение диапазона
Sub FillCellRectl()
Dim IngRows As Long, intCols As Integer
Dim IngRow As Long, intCol As Integer
Dim IngStep As Long, IngVal As Long
Dim alngValnes() As Long
Dim rgRange As Range
* Установка начального значения и шага заполнения
IngVal = 1
IngStep = 1
ReDim alngValues(1 To IngRows, 1 T。 intCcls) Set rgRange = ActiveCell.Range(Cells(1, 1),— Cells(IngRows, intCols))
• Заполнение массива alngValues значениями For IngRow = 1 To IngRows For intCol = 1 To intCols alngValues tlngRow, intCol) = IngVal IngVal = IngVal + IngStep Next intCol Next IngRow
* Перенос значений из массива в таблицу rgRange-Value = alngValues End Sub
Порядок заполнения диапазона такой же, как н в предыдущем примере, — после запуска макроса нужно последовательно указать количество ячеек в высоту и ширину. Результатом работы макроса будет заполненный диапазон (начиная с активной ячейки). Так же, как и в предыдущем примере, для изменения параметров заполнения диапазона (начальное число последовательности, шаг н др.) можно внести со* ответствующие изменения в код макроса.
Более высокая скорость работы данного алгоритма достигается благодаря тому, что сначала формируется двумерный массив со значениями. Этот массив целиком передается объекту Range. Тем самым мы избегаем множества обращений к таблице, заменяя их одним, но эффективным.
Гиперссылки — в виде обычного текста
В Microsoft Excel, начиная с версии 2000, осуществляется автоматическая замена текста гиперссылками, если он содержит следующие наборы символов: □ http:// □ WWW. 口 ftp:〃 口 mailto: □ file:// □ news: □ mail@pochta
Однако такая автозамена не всегда удобна. Чтобы ее отменить, достаточно в качестве первого символа, вводимого в ячейку, использовать апостроф ("> После нажатия Enter этот символ исчезнет н останется только введенный текст, причем он не будет преобразован в пшерссылку. На печать апостроф также не выводится.
Помещение в ячейку электронных часов
В любую ячейку рабочего листа при необходимости можно поместить электронные часы* В листинге 2.28 приведен код макроса, который позволяет решить эту задачу.
Листинг 2.28. Размещение в этейке электронных часов
Sub UpdateTime()
Dim varNextCall As Variant
' Записываем в ячейку текущее время
Cells(1, 1).Value = Now
'Записываем в varNextCall время, когда вызвать этот макрос _ в следующий раз (через 1 секунду)
varNextCall = TimeSerial(flour(Now), Minute(Now), Second(Now) + 1)
* Уведомляем Excel e необходимости вызова макроса
Application.OnTime varNextCall, "UpdateTime"
End Sub
После выполнения данного макроса электронные часы будут помещены в ячейку А1. Если в эту ячейку поместить курсор, то часы отобразятся также и в строке формул.
«Будильник»
Помимо электронных часов, можно настроить «будильник». Смысл данного трюка заключается в том, что в определенное время на экране отобразится окно с указанным ранее информационным сообщением (а при наличии колонок и иных сопутствующих устройств — вместе со звуковым сигналом). В листинге 2.29 приведен код макроса, который позволяет решить эту задачу.
Листинг 2.29. «Будильник»
Sub Clock()
'Уведомляем Excel, что процедуру Alarm нужно вызвать в 20:55
Application.OnTime TimeValue ("20 :55 :00"}, "Alarm11
End Sub
Sub Alarrnt)
MsgBox 11 Пора ужинать ! ! ! ”
End Sub
После выполнения макроса Clock на экране в назначенное время (20 часов 55 минут) появится окно с сообщением Пора ужинать!!!. Следует учитывать, что для каждого последующего появления в назначенное время такого окна необходимо отдельно запускать макрос.
Поиск данных в диапазоне
Используя средства языка VBA, можно по-разному искать требуемые данные в указанном диапазоне. Рассмотрим несколько популярных способов поиска данных*
Поиск в диапазоне значения по шаблону
Предположим, возникла необходимость просмотреть большой отчет и заменить во всех его местах слово Доход словом Выручка, выделив при этом цветом ячейки, в которых выполнялась такая замена. Решить эту задачу нам поможет следующий макрос (листинг 2.30).
Листинг 2.30. Поиск и замена по шаблону
Sub ReplaceCellsData()
Dim cell As Range
'Просмотр всех ячеек диапазона Gl:K20 и замена искомого текста For Each cell In [G1:K20]
If cell .Value Like u*Доход*11 Then
cell.Value = "Выручка"
cell.Interior.Color = RGB(255, 255, 0)
Else
cell * InteriorXolor ^ RGB(255, 255, 255)
End If
Next
End Sub
После выполнения данного макроса слово Доход, встречающееся в диапазоне GLK20, будет заменено словом Выручка, а соответствующие ячейки будут вы* делены желтым цветом. Вся остальная часть диапазона будет залита белым цветом (при этом содержимое всех ячеек по-прежнему будет отображаться, а сетка исчезнет).
Поиск значения с выводом результата
Можно настроить параметры поиска требуемого значения таким образом, что его результат будет выведен в отдельном информационном окне. Вот пример макроса (листинг 2.31)» который позволяет решить эту задачу.
Листинг 2.31. Поиск значения с отображением результата в отдельном окне
Sub Search()
Dim rgResult As Range
'Поиск заданного значения в диапазоне Bl:В20 и вывод результата Set rgResult = Range("Bl:B2Q”).Find(9999, , xlValues)
If rgResult Is Nothing Then
MsgBox *'Поиск не дал результатовr,
Else
MsgBox rgResult.Address End If End Sub
С помощью данного макроса обрабатывается диапазон Bl:820, в котором ведется поиск значения 9999. При обнаружении данного значения появляется окно с указанием адреса соответствующей ячейки. Если же указанное значение не обнаружено, то в данном окне отображается сообщение Поиск не дал результатов.
Поиск с выделением найденных данных
Достаточно удобен поиск, в котором используется выделение найденных ячеек. Применение этого способа целесообразно при работе с большими объемами данных. Для настройки поиска можно использовать^ например, такой макрос (листинг 2.32).
Листинг 2.32. Выделение найденньгх данных
Sub FindAndSelect()
Dim strStartAddr As String ' Хранит координаты первого найденного — значения
Dim rgResult As Range
Поиск первого входжения искомого слова
Set rgResult = Range ("Bl :B10M) . Find (11 Прибыль11, , xlValues) If Not rgResult Is Nothing Then
'Сохраним адрес найденной ячейки (чтобы контролировать _ зацикливание поиска}
strStartAddr = rgResult.Address End If Do While Not rgResult Is Nothing 'Обработка результата поиска rgResult >Interior.Color = RGB(255, 255, 0)
'Новый поиск
Set rgResult = Range(HB1:B10M),FindNext(rgResult) If rgResult.Address = strStartAddr Then 'Поиск завершен Exit Do
End If
Loop End Sub
Этот макрос обрабатывает диапазон В1:В10и ищет в нем значение прибыль. Все ячейки, в которых обнаружено данное значение, будут выделены желтым цветом (строка rgResult - Interior, Color = RGB (255, 255, 0) ). С помощью подобных макрсюов можно обрабатывать любые диапазоны и находить в них любые значения.
Создание цветной границы диапазона
Для каждого диапазона рабочего листа можно создать индивидуа,чьную границу: например, верхняя часть границы выделяется одним цветом, а нижняя — другим* В приведенном в листинге 2.33 макросе верхняя граница диапазона будет начертана толстой синей линией, а нижняя — розовой пунктирной обычной толщины.
Листинг 2.33. Оформление верхней и нижней границ диапазона
Sub RangeBorder()
Dim rgRange As Range
Set rgRange = Range(nB2:D5n)
'Оформление верхней границы диапазона
With rgRange.Borders(xlEdgeTop)
.Weight = xlThick
,LineStyle = xlContinuous
.Color = RGB(0, 0, 255)
End With
1 Оформление нижней границы диапазона
With rgRange.Borders(xlEdgeBottom)
.Weight = xlMedium
.LineStyle = xlDash
.Color = RGB(255, 0, 255)
End With
End Sub
Очевидно, что цвета и толщину линии можно изменять по своему усмотрению.
Автоматическое определение адреса ячейки
Можно настроить программу таким образом, что при щелчке мышью в любом месте рабочего листа на экране будет появляться окно с информацией об адресе текущей ячейки, причем в разных форматах. Код макроса, который позволяет решить эту задачу, приведен в листанге 2.34 (следует учитывать, что данный код должен быть помещен в модуль рабочего листа).
Листинг 2*34. Информация об адресе активной ячейки
Sub Worksheet_SelectionChange(ByVal Target As Range)
* Вывод адреса ячейки в различных форматах
MsgBox Target.Address() & vbCr & _
Target.Address(RowAbsolute:=False) & vbCr & _
Target.Address(Referencestyle:^xlRlCl) & vbCr & 一
Target.Address(Referencestyle:=x1R1C1z 亠
RowAbsolute:=False, ColumnAbsolute:=False, _
RelativeTo:-Worksheets(1).Cells(2, 2))
End Sub
Теперь при щелчке мышью на ячейке, например Е9, на экране отобразится окно со следующим сообщением:
$Е$9
$Е9
R9C5
R[小⑶
Адрес ячейки представлен в нескольких форматах, в том числе н относительно другой ячейки. В качестве ячейки, относительно которой определяется адресация, в данном случае используется ячейка В2 (см. в коде значение параметра RelativeTo).
Автоматизация добавления примечаний в указанном диапазоне
Трюк, который мы сейчас рассмотрим, дает возможность быстро вставить примечание в ячейки определенного диапазона, соответствующие указанным требованиям.
Для достижения такого эффекта можно воспользоваться макросом, код которого приведен в листинге 2.35.
Листинг 2.35* Добавление примечаний в диапазон
Sub CreateComments()
Dim cell As Range
* Производим поиск по всем ячейкам диапазона и добавляем примечания ко всем ячейкам, содержащим слово "Выручка"
For Each cell In Range(ИВ1:B100H)
If cell .Value Like n* Выручка*'1 Then
cell.ClearComments
cell .AddCoirunent "Неучтенная наличка
End If
Next
End Sub
С помощью данного макроса обрабатывается диапазон В1:В1ОО. После применения макроса ко всем ячейкам, содержащим текст выручка, будет добавлено примечание Неучтенная наличка. При этом в примечании будет отсутствовать имя пользователя, его создавшего. Если в указанных ячейках содержалось другое примечание, то оно будет удалено и заменено тем, которое указано в макросе.
Очевидно, что с помощью подобных макросов можно создавать произвольные примечания к любым ячейкам указанного диапазона.
Заливка диапазона
Выполнив несложный трюк, можно быстро залить любой диапазон ячеек требуемым цветом (или комбинацией разных цветов). Для этого можно использовать, например, такой макрос (листинг 2.36).
Листинг 2.36. Создание заливки диапазона
Sub FillRange()
'Заливка диапазона
With Range(ИВ1:Е1ОМ)
Задаем узор - сетчатый
Interior.Pattern = xlPatternchecker
Цвет узора - синий
.Interior.Patterncolor = RGB(0, 0, 255)
Цвет ячейки - красный
.Interior.Color = RGB(255, 0, 0)
End With
End Sub
В результате применения данного макроса диапазон В1:Е10 будет залит красным цветом с синим сетчатым узором.
Ввод строго ограниченных значений в указанный диапазон
В процессе эксплуатации программы иногда возникает необходимость сделать так, чтобы вводимые пользователем данные не выходили за рамки определенного интервала. В данном подразделе мы рассмотрим два трюка, которые позволяют решить эту задачу: с использованием диалогового окна и путем непосредственного ввода данных в диапазон. Применение подобных трюков позволяет контролировать корректность вводимых пользователями данных.
Ввод данных с помощью диалогового окна
Можно настроить программу таким образом, что ввод строго ограниченных данных в указанный диапазон будет осуществляться только с помощью диалогового окна. Для этого нужно воспользоваться макросом, код которого приведен в листинге 237.
Листинг 2.37. Настройка ввода данных в диалоговом окне
Sub DialoglnputData()
Dim intMin As Integer, intMax As Integer 1 Диапазон значений
Dim strinput As String' Введенная пользователем строка
Dim strMessage Аз String
Dim intValue As Integer
intMin = 1' Минимальное значение
intMax = 501 Максимальное значение
strMessage - пВведите значение от " & intMin & ” до ” & intMax
'Ввод значения (цикл завершается, когда пользователь вводит ― значение из заданного диапазона или отменяет ввод)
Do
strinput = InputBox(strMessage)
If strinput = "” Then Exit Sub 1 Отмена ввода
'Проверка, содержит ли введенная пользователем строка число
If IsNumeric(strinput) Then
intValue = CInt(strinput)
'Проверка, удовлетворяет ли значение диапазону
If intValue >= intMin And intValue <- intMax Then
* Все условия выполнены Exit Dq
End If
End If
'Формирование сообщения с текстом ошибки
strMessage = "Вы ввели некорректное значение.ri & vbNewLine & _ ^Введите число от ” & intMin & “ до ” & intMax
Loop
' Внесение данных в ячейку
ActiveSheet.Range(НА1").Value = strinput
End Sub
После написания данного кода в окне выбора макросов станет доступен макрос DialoginputData. Для его вызова лучше создать слецнальную кнопку. После нажатия данной кнопки откроется диалоговое окно с предложением ввести значение от 1 до 50 (интервал значешН; можно изменять по своему усмотрению — для этого достаточно внестн соответствующие изменения в код макроса). При попытке ввода значения, которое выходит за рамки указанного интервала, появится окно с соответствующим предупреждением и повторным предложением ввести корректное значение. Введенное значение будет помещено в ячейку А1 — это указано в строке кода ActiveSheet,Range ("Al") .Value = strinput. Если в данной строке вместо А1 указать, например, В1 :Е5,то введенное значение будет помещено во все ячейки указанного интервала.
Непосредственный ввод данных
Если ввод данных с использованием диалогового окна по каким-либо причинам нецелесообразен, то можно вводить их непосредственно в диапазон. При этом программа будет контролировать вводимые данные (чтобы они не выходили за рамки указанного интервала).
Выделим на рабочем листе какой-либо диапазон (например, А1:Е10) н назовем его inputRange. Теперь в редакторе VBA в модуле рабочего листа напишем кодт представленный в листинге 2.38+
Листинг 2.38. Ограничение возможных значений диапазона
Sub Worksheet_Change(ByVai Target As Excel.Range)
Dim rglnputRange As Range
Dim cell As Range
Dim strMessage As String Dim varResult As Variant
' Диапазон, в котором контролируется ввод Set rglnputRange = Range (11 Al: Е10и)
'Просмотр всех измененных ячеек и контроль ввода в тех, которые _ принадлежат заданному диапазону
For Each cell In Target
* Проверка принадлежности диапазону , If Union(cell, rglnputRange).Address ^ rglnputRange.Address Then 'Контроль правильности ввода varResult 二 IsCellDataValid(cell) If varResult = True Then
* Введено корректное значение Exit Sub
Else
'Формирование и вывод сообщения об ошибке
strMessage = "Ячейка “ & cell .Address (False, False) & 11:" _ & vbCrLf & vbCrLf & varResult
MsgBox strMessage, vbCritical, пНеправильное значение" 'Очистка ввода
Application.EnableEvents = False cell・ ClearContents cell.Activate Application*EnableEvents = True End Xf End If Next cell End Sub
Function IsCellDataValid(cell As Range) As Variant
'Возвращает True, если в ячейку вводится целое число _ в диапазоне от 1 до 12 * В противном случае выдается _ соответствующее сообщение
'Проверка, является ли содержимое ячейки числом If Not WorksheetFunction.IsNumber(cell.Value) Then
Is Cell Dat a Vai id = ° Нечисловое значение*' Exit Function
'Проверка, является ли введенное число целым
If Int(cell.Value) <> cell.Value Then
IsCellDataValid = "Евелнта целое числоf,
Exit Function
End If
* Проверка соответствия числа диапазону
If cell.Value < 1 Or cell *Value > 12 Then
IsCellDataValid = "Значение должно быть от 1 до 12"
Exit Function
End If
'В ячейку введено допустимое значение
IsCellDataValid = True
End Function
После написания данного кода в диапазон А1:Е1О можно будет вводить только целые числовые значения, попадающие в интервал от 1 до 12, При попытке ввода нечислового значения (напрнмер, текста) программа не позволит этого сделать — на экране отобразится окно с сообщением Нечисловое значение). Ввод дробного числа также будет невозможен — появится сообщение Введите целое число. Если же попытаться ввести значение, выходящее за рамкп интервала от 1 до 12, то это также окажется невозможным, и будет выдано сообщение Значение должно быть от 1 до 12.
Последовательный ввод данных
Многие пользователи наверняка сталкивались с ситуацией» когда необходимо быстро ввести данные, и при этом каждый раз приходится вручную устанавливать курсор в нужное место. При вводе большого кол!!чества данных это и утомляет, и раздражает. Поэтому трюк который мы сейчас рассмотрим, в подобных случаях наверняка найдет свое применение.
Смысл операции заключается в том, что необходимые данные будут вводиться в диалоговом окне и лишь после нажатия ОК они займут свое место в таблице. Сразу после этого в диалоговом окне можно будет вводить уже следующие данные н т. д. И все это — независимо от расположена курсора* Реализацию данной возможности рассмотрим на конкретном примере.
Предположим, что в ячейки столбца А необходимо последовательно ввести перечень дат, а в ячейки столбца В — торговую выручку, соответствующую каждой дате столбца А. Решить эту задачу можно с помощью макроса, код которого (он должен быть помещен в стандартный модуль) приведен в листинге 2.39.
Листинг 2.39. Последовательный ввод данных
Sub Streaminput()
Dim strDate As String
Dim strSum As String Dim IngRow As Long 'Ввод данных в цикле (повторяется до тех пор, пока пользователь — не введет пустую строку или не нажмет "Обмена” в окне ввода)
Do
IngRow = Range(HA65536").End(xlUp).Row + 1 'Ввод даты strDate = InputBox("Вводим дату") If strDate = "” Then Exit Sub 1 Ввод БЬфуЧКИ strSum = InputBox ("Вводим выручкуf*) If strSum = "” Then Exit Sub * Запись данных в ячейки Cells(IngRow, 1) = strDate Cells(IngRow/ 2) = strSum Loop End Sub
После написания кода макрос Streaminput будет доступен в окне выбора макросов. Для удобства поместите в любое удобное место интерфейса кнопку, привяжите к ней данный макрос — и можно приступать к последовательному вводу данных*
Введем в ячейки А1 и В1 названия соответствующих столбцов таблицы (например, Дата и Выручка) и нажмем кнопку вызова макроса, В результате откроется диалоговое окно, в котором с клавиатуры сначала вводится дата (в поле Вводим дату), а после нажатия кнопки ОК — сумма выручки (в открывшемся поле Вводим выручку). После еще одного нажатия кнопки ОК введенные данные отобразятся в ячейках A2HB 2 соответствен но, а в диалоговом окне можно вводить следующие данные (которые в свою очередь будут помещены в ячейки АЗ н ВЗ) и т. д. Для выхода из цикла следует нажать в диалоговом окне кнопку Cancel.
Быстрое выделение ячеек с отрицательными значениями
Рассматриваемый в данном подразделе прием позволяет быстро выделить красным цветом ячейки, содержащие отрицательные значения. Особую значимость данный трюк приобретает при работе с большими объемами Ш1формашп1.
Напишем в стандартном модуле редактора VBA код, который выглядит следующим образом (листинг 2.40).
Листинг 2*40. Выделение отрицательных значений
Sub NegSelect()
Dim cell As Range
* Просмотр всех ячеек выделенного диапазона и пометка тех. которые содержат отрицательные значения
For Each cell In Selection
If cell-Value < 0 Then
cell.Interior.Color = RGB(255, 0, 0)
Else
cell/interior.Colorindex = xlNone
End If
Next cell
End Sub
После написания кода в окне выбора макросов станет доступен макрос NegSelect. В результате его выполнения все ячейки выделенного диапазона, содержащие отрицательные значения, будут залиты красным цветом.
Очевидно, что путем внесения соответствующих изменений в код макроса можно изменить как условие, так и цвет выделения.
Получение информации о выделенном диапазоне
При нeoбxoди^focти можно быстро получить подробную информацию о выделенном в данный момент диапазоне — в частности, тип выделения, количество выделенных ячеек и областей и т. д. Для этого в стандартном модуле редактора VBA напишем код, который приведен в листинге 2*4 L
Листинг 2.41. Получение информации о выделенном диапазоне
Sub TypeOfSelection()Dim rgSelUnion As RangeDim strTitle As StringDim strMessage As String Dim strSelType As StringDim intBlockCount As Integer Dim intCellCount As Long Dim intColCount As Integer Dim intRowCount As LongDim intAreasCount As Integer Dim strCurSelType As String Dim rgArea As RangeSub TypeOfSelection()Dim rgSelUnion As RangeDim strTitle As StringDim strMessage As String Dim strSelType As StringDim intBlockCount As Integer Dim intCellCount As Long Dim intColCount As Integer Dim intRowCount As LongDim intAreasCount As Integer Dim strCurSelType As String Dim rgArea As RangeОбъединение выделенных областейЗаголовок сообщения1 Текст сообщения1 Тип выделения (простой или _ множественный)'Количество блоков в выделенииI Общее количество выделенных ячеек'Количество выделенных столбцов'Количество вьщеленных строк' Количество выделенных областейОбъединение выделенных областейЗаголовок сообщения1 Текст сообщения1 Тип выделения (простой или _ множественный)'Количество блоков в выделенииI Общее количество выделенных ячеек'Количество выделенных столбцов'Количество вьщеленных строк' Количество выделенных областей
Sub TypeOfSelection()
Dim rgSelUnion As Range
Dim strTitle As String
Dim strMessage As String Dim strSelType As String
Dim intBlockCount As Integer Dim intCellCount As Long Dim intColCount As Integer Dim intRowCount As Long
Dim intAreasCount As Integer Dim strCurSelType As String Dim rgArea As Range
Sub TypeOfSelection()
Dim rgSelUnion As Range
Dim strTitle As String
Dim strMessage As String Dim strSelType As String
Dim intBlockCount As Integer Dim intCellCount As Long Dim intColCount As Integer Dim intRowCount As Long
Dim intAreasCount As Integer Dim strCurSelType As String Dim rgArea As Range
Объединение выделенных областей
Заголовок сообщения
1 Текст сообщения
1 Тип выделения (простой или _ множественный)
'Количество блоков в выделении
I Общее количество выделенных ячеек
'Количество выделенных столбцов
'Количество вьщеленных строк
' Количество выделенных областей
Объединение выделенных областей
Заголовок сообщения
1 Текст сообщения
1 Тип выделения (простой или _ множественный)
'Количество блоков в выделении
I Общее количество выделенных ячеек
'Количество выделенных столбцов
'Количество вьщеленных строк
' Количество выделенных областей
'Подсчет количества выделенных областей и определение типа выделения: простое (одна область) или сложное (несколько областей)
intAreasCount = Selection,Areas.Count
If intAreasCount - 1 Then
strTitle = *гПростое выделениеn
Else
strTitle = nМножественное выделение1*
'Определение типа выделения первой области strSelType - dhGetAreaType(Selection.Areas(1))
'Создание объединения во избежание повторного учета _ пересекающихся участков выделенных диапазонов
Set rgSelUnion = Selection.Areas(1)
For Each rgArea In Selection.Areas strCurSelType = dhGetAreaType(rgArea) 『Изменение надписи о типе всего выделения, если — есть выделения различного типа
If strCurSelType <> strSelType Then strSelType = иМножественныйн
End If
■ Определение количества блоков перед их добавлением в объединение If strCurSelType = •'Block" Then
intBlockCount ■ intBlockCount + 1
End If
'Добавление в объединение
Set rgSelUnion = Union(rgSelUnion, rgArea) Next rgArea
'Просматриваются элементы созданного объединения For Each rgArea In rgSelUnion*Areas Select Case dhGetAreaType(rgArea) Case "Строка"
intRowCount = intRowCount + rgArea.Rows.Count Case ^Столбец"
intColCount = intColCount + rgArea.Columns.Count Case "Лист11
intColCount = intColCount + rgArea.Columns.Count intRowCount = intRowCount + rgArea.Rows.Count End Select Next rgArea
Определение количества неперекрываюшихся ячеек intCellCount = rgSelUnion.Count,
'Формирование % вывод итогового сообщения strMessage = "Тип выделения:"&vbTab&strSelType & vbCrLf & 一
''Количество областей:"&vbTab&intAreasCount& vbCrLf& 一
пПолных столбцов:"&vbTab&IntColCount &vbCrLf &_
пПолных строк:”&vbTab&intRowCount &vbCrLf &
"Блоков ячеек:" & vbTab & intBlockCount & vbCrLf & —
г,Всего ячеек:” & vbTab & Format (intCellCount, f,#, ###v)
MsgBox strMessage, vblnformation, strTitle
End Sub
Function dhGetAreaType(rgRangeArea As Range) As String
'Определение типа диапазона
If rgRangeArea.Count = Cells-Count Then
'Все ячейки рабочего листа
dhGe tAre aType = '"Лист11
Elself rgRangeArea.Cells.Count = 1 Then
'Одна ячейка
dhGetAreaType = "Ячейка"
Elself rgRangeArea.Rows.Count = Cells.Rows.Count Then
'Весь столбец
dhGetAreaType = ''Столбец"
Elself rgRangeArea * Columns.Count = Cells,Columns »Count Then
'Вся строка
dhGetAreaType = “Строка"
Else
Блок ячеек
dhGetAreaType = "Елок"
End If
End Function
После написания данного кода в окне выбора макросов будет доступен макрос TypeOfSelection. Выделив произвольный диапазон (или несколько диапазонов), следует запустить этот макрос на выполнение. В результате откроется окно с указанием типа выделения, количества выделенных областей» полных столбцов и строк, блоков ячеек и общего количества ячеек.
Панель инструментов изменения числового формата ячейки
Как известно, для перехода в режим изменения формата ячейки необходимо выполнить команду главного меню Формат ► Ячейки или нажать сочетание клавиш Ctrl+1. Однако для изменения числового формата ячейки можно также воспользоваться специально созданной пользовательской панелью инструментов. Рассмотрим этот процесс подробнее.
Для реализации примера нам потребуется написать в редакторе VBA два кода: а модуле рабочего листа и в стандартном модуле. Код, помещаемый в модуль рабочего листа, выглядит следующим образом (листинг 2,42).
Листинг 2.42. Код в модуле рабочего листа
Sub Worksheet_Change(ByVai Target As Excel.Range) Call UpdateToolbar
End Sub
Sub Worksheet_SelectionChange(ByVai Target As Excel.Range) Call UpdateToolbar
End Sub
В стандартном модуле VBA необходимо написать следующий код (листинг 2,43).
Листинг 2.43. Код в стандартном модуле
Sub FastChangeNumberFormat()
Dim bar As CommandBar
Dim button As CommandBarButton
'Удаление существующей панели инструментов (если она есть)
On Error Resume Next-
CommandBars(^Числовой формат").Delete On Error GoTo 0
'Формирование новой панели Set bar к CommandBars.Add With bar
*Name = "Числовой формат" .Visible = True
End With
'Создание кнопки
Set button = CommandBars("Числовой формат").Controls.Add 一 (Type:-msoControlButton)
With button
•Caption ="" .OnAction = "ChangeNumFormatM
.TooltipText = "Щелкните для изменения числового формата** .Style = msoButtonCaption
End With
'Обновление созданной панели инструментов Call UpdateToolbar End Sub
Sub UpdateToolbar(I ' Обновление панели инструментов (если она создана) On Error Resume Next
1 Изменение заголовка кнопки (на название формата, выделенной ячейки)
CommandBars ("Числовой форматГ|) .Controls (1) .Caption = 一
ActiveCell.NumberFormat
End Sub
Sub ChangeNumFormat()
'Отображение диалогового окна изменения формата ячейки
Application.Dialogs(xlDialogFormatNumber).Show
Call UpdateToolbar
End Sub
Теперь нужно запустить на выполнение макрос FastChangeNumberFormat (после написания кода он появится в окне выбора макросов) — в результате на экране появится панель инструментов Числовой формат, состоящая из одной кнопки. Название данной кнопки зависит от числового формата активной ячейки. При подведении к кнопке указателя мыши отобразится всплывающая подсказка Щелкните для изменения числового формата. При нажатил данной кнопки откроется вкладка Число окна Формат ячеек (обычно это окно вызывается с помощью команды главного меню Формат > Ячейки). Формат активной ячейки изменяется в данном режиме по 06bllI- ным правилам.
Следует отметить, что перейти в режим редактировал ия числового формата ячейки можно, запустнв на выполнение макрос ChangeNumFormat — после написания приведенного выше кода он также будет доступен в окне выбора макросов.
Тестирование скорости чтения и записи диапазонов
В процессе работы с электронными табл и шш и часто приходится переносить значения из массива в диапазон или из диапазона в массив. При этом скорость получения данных из диапазона обычно выше скорости записи. С помощью трюка, который мы сейчас рассмотрим, можно тестировать скорость записи данных массива в диапазон и переноса этих данных обратно в массив.
В стандартном модуле редактора VBA нужно написать код, содержимое которого представлено в листинге 2.44.
Листинг 2.44. Тестирование скорости чтения и записи диапазонов
Sub TableSpefsdTest ()
Dim alngData() As Long* Массив с числами
Dim IngCount As Long' Количество элементов в массиве
Dim dtStart As Date' Хранит время (и даже дату) начала _
тестирования
Dim strArrayToTable As String ' Время записи в таблицу
Dim strTableToArray As String ' Время чтения из таблицы
Dim strMessage As String
Dim i As Long
* Подготовка диапазона ячеек
Range("A:A”)・ ClearContents
* Ввод размера массива, формирование массива заданного размера IngCount = InputBox(пВведите количество элементов")
ReDim alngData(1 То IngCount)
* Заполнение массива данными
For i = 1 То IngCount
alngData(i) = i
Next i
'Перенос массива в таблицу
Application.Screenupdating = False
dtStart = Timer
For i = 1 To IngCount
Cells(ir 1)=1
Next i
strArrayToTable = Format(Timer - dtStart, "00:00")
'Чтение данных из таблицы обратно в массив
dtStart = Timer
For i s 1 То IngCount
alngData (i) = Cells(i, 1)
Next i
strTableToArray = Format(Timer - dtStart, "00:00")
Application.ScreenUpdating 工 True
* Вывод на экран результатов тестирования
strMessage = пЗапись: ” & strArrayToTable & vbCrLf & _
**Чтение: " & strTableToArray
MsgBox strMessage, , IngCount & ” элементов"
End Sub
В результате написания данного кода в окне выбора макросов (Сервис ► Макрос ► Макросы) появится макрос TableSpeedTest. После его запуска откроется окно, в котором в поле Введите количество элементов следует с клавиатуры ввести количество элементов и нажать кнопку 0К. По окончании работы макроса на экране отобразится окно, в котором будет показано время (в секундах), необходимое для записи данных массива в диапазон и для считывания их обратно в массив. Напрнмер, у одного из авторов этой книги на запись массива из 30 000 элементов было затрачено 7 секунд,
а на считывание данных из диапазона обратно в массив — только 1 секунда; массив из 65 000 элементов записывался за 14 секунд, а перенос этих данных обратно в массив занял лишь 2 секунды.
Работа с формулами
Механизм формул является одним из основных инструментов, используемых в программе Microsoft Excel. В данном разделе мы рассмотрим несколько трюков, которые можно выполнять с использованием формул.
Складывание и вычитание даты и времени
В Excel реализована возможность выполнения арифметических действий с датами. Для этого следует использовать функцию дата. Например^ при использовании формулы =ДАТА(2004; 4; 11) -дата(2004;3;6) в соответствующей ячейке будет получен результат 36.
Складывание диапазонов разных листов
В процессе работы часто возникают ситуации, когда необходамо суммировать значения ячеек, которые хранятся на разных листах. Для этого в формулу требуется включить названия соответствующих листов. Например, при использовании формулы =сумм(лист2 : листЗ !С1:С7) будет рассчитана сумма значений, которые хранятся на листах Лист2 и ЛистЗ в диапазоне С1:С7.
Накопление итога в ячейке
При проведении различных расчетов часто бывает необходимо сохранять нарастающий итог в той либо иной ячейке. Для достижения такого эффекта необходимо выполнить следующие действия (подразумеваете% что нарастающий итог будет накапливаться в ячейке А1, а в ячейку С1 вводятся исходные данные).
В ячейку А1 ввести формулу =A1+CL
После того как отобразится окно с сообщением об ошибке» нажать в данном окне кнопку ОК
Выполнить команду главного меню Сервис ► Параметры.
Перейти в открывшемся окне на вкладку Вычисления.
На данной вкладке установить флажок итерации, а в поле Предельное число итераций ввести значение 1,
Нажать кнопку ОК.
При выполнении данной операции необходимо учитывать следующее: после ус* тановки итераций автоматически отключается сообщение об ошибках во всех файлах Excel. Если же итерации убрать, то нарастающий итог в ячейке накапливаться не будет.
Быстрое размножение формул
Для копирования формул, помимо имеющихся в Excel стандартных средств, можно использовать VBA. Например, чтобы скопировать формулу из ячейки А1 в ячейку В2, можно использовать код следующего содержания:
Range (1*В2м) .Formula = Range ("Al"). Formula■
Также для этого можно использовать код
Range("В2").Value = Range(НА1п).Formula
ИЛИ
Range (11В211)二 Range (HAl") . Formula
Для удобства использования рекомендуется назнаинть макросу какое-нибудь сочетание клавиш или кнопку (н поместить ее на панель ннструментов) с целью быстрого вызова.
Маскировка формул от других пользователей
При необходимости можно замаскировать формулы таким образом, что сторонш拼 пользователь не сможет узнать, какие ячейки участвуют в формуле. Для этого в строке Имя (слева от строки формул) нужно присвоить имена этим ячейкам, после чего заменить в формуле координаты (адреса) этих ячеек присвоенными именами. Поскольку каждой ячейке может быть присвоено несколько имен (а в строке Имя показывается только одно из них\ то можно сослаться на любое из них, чем еще больше запутать посторонних пользователей. Недостатком данного способа является то, что в раскрывающемся списке строк» Имя хранится перечень всех имен текущей ячейки, поэтому таким образом можно замаскировать формулу только от начинающих пользователей.
Однако с помощью VBA можно присвоить ячейке имя таким образом, что оно не будет отображаться в списке имен. Для достижения такого эффекта можно использовать следующий код:
Names.Add Name:=пСекрет", RefersTo:="=Лист1!$A$5Hr Visible:^False
При использовании данного кода ячейке А5, которая расположена на листе Лист1, будет присвоено имя Секрет. Это имя не будет отображаться в списке имен, но его можно использовать в формулах вместо адреса яче^кн* Например, сумму ячеек А1 и А5 можно задать так: =А1+А5, а можно — с использованием скрытого имени: =А1+Секрет,
СОВЕТ
厶 При создании макроса рекомендуется задать сочетание клавиш (например, CtrHShift+A) для его быстрого вызова.
К аналогичному результату приводит использовадше следующего кода:
Range("А7").Name = "Защита”
Range (пЗащита**) .Name.Visible = False
В данном случае ячейке A7t которая расположена на текущем листе, присвоено скрытое имя Защита.
Быстрое суммирование всех ячеек столбца или строки
Для быстрого суммирования значений всех ячеек какого-либо столбца или строки предназначены специальные формулы. Например, чтобы получить сумму всех ячеек столбца А, нужно воспользоваться формулой =сумм (А: А), а для суммирования всех ячеек строки 1 — формулой =сумм(1:1). Если же необходимо получить сумму всех ячеек столбцов А, В и С, то формула будет выглядеть следующим образом: =СУММ (А:с). Для суммирования всех ячеек, которые расположены в строках 1, 2 и 3, применяется следующая формула: =сумм <1 : 3).
При суммировании не стоит забывать, что курсор должен быть установлен за пределами суммируемого диапазона — в противном случае Excel выдаст сообщение об ошибке.
Вместо формулы — текущее значение
С помощью несложных приемов можно быстро заменить формулу в ячейке ее текущим значением. Рассмотрим два наиболее популярных способа.
При первом способе необходимо выделить соответствующую ячейку, выполнить команду главного меню Правка > Копировать, а затем — команду Правка ► Специальная вставка. В результате откроется окно, представленное на рис. 2Л0.
ГП^1ГП^1ветавить 一T一……h好:噂.「формулыГ :I干冲И吧М3 :」ветавить 一T一……h好:噂.「формулыГ :I干冲И吧М3 :」L условия на 5иаченияГ 6e>PW :;广 у^рины столбцов「формулы и фбрмты чисел「^начвнид и фораты чиселL условия на 5иаченияГ 6e>PW :;广 у^рины столбцов「формулы и фбрмты чисел「^начвнид и фораты чисел!Специальная вставка
ГП^1
ГП^1
ветавить 一T一……h
好:噂
.「формулы
Г :
I干冲И吧М3 :」
ветавить 一T一……h
好:噂
.「формулы
Г :
I干冲И吧М3 :」
L условия на 5иачения
Г 6e>PW :;
广 у^рины столбцов
「формулы и фбрмты чисел
「^начвнид и фораты чисел
L условия на 5иачения
Г 6e>PW :;
广 у^рины столбцов
「формулы и фбрмты чисел
「^начвнид и фораты чисел
G步工「继跳июъ г сложить : 「йаздвлмть 广 ЙЬМОСТЪ
二厂 фопускать пустые ячейки ::; 厂 транспониро&ать .
Вставить связьВставить связь二,一 二Отмена二,一 二Отмена
Вставить связь
Вставить связь
二,一 二
Отмена
二,一 二
Отмена
Рис. 2.10. Окно Специальная вставка
В данном окне следует установить переключатель Вставить в положение значения и нажать кнопку ОК, В результате формула в выбранной ячейке будет заменена текущим значением.
Второй способ заключается в следующем: необходимо выделить соответствующую ячейку, перейти в режим ее редактирования (не используя при этом строку формул) II последовательно нажать клавиши F9 и Enter. После выполнения указанных действий формула в ячейке будет заменена ее текущим значением.
Повышение точности вычисления формул
В процессе работы с формулами иногда можно заметить неточности в расчетах. Их наличие обусловлено тем, что по умолчанию Excel отображает цифры в ячейках с точностью меньшей, чем при их хранении (например, число 15,434 может отображаться как 15,43). Если в ячейках А1 н А2 хранится одинаковое значение — 15,434, а отображается 15,43» то результат формулы =А1+А2 будет отображен как 30,86, хотя на самом деле он равен 30,868. Иначе говоря, визуально наблюдается неточность в расчетах» хотя на самом деле это связано лишь с округлением чисел при их отображении с меньшей точностью.
Решить эту проблему можно двумя способами. Первый из них заключается в том, что в формате ячейки нужно повысить точность отображения чисел. В результате процесс округления будет очевидным для пользователя.
Во втором случае необходимо выполнить команду главного меню Сервис » Параметры и в открывшемся окне на вкладке Вычисления установить флажок точность как на экране, после чего нажать кнопку ОК. В результате Excel будет хранить данные в ячейках с такой же точностью, с которой они отображаются на экране. Иначе говоря, после выполнения данной операции в нашем примере число 15,434 будет преобразовано в 15,43 окончательно.
Первый из предложенных способов более правильный с математической точки зре・ ния, однако второй способ проще и надежнее.
Быстрая проверка правильности формул
В большинстве случаев пользователи при контроле ошибок в формулах просматривают все ячейки таблицы. Однако при большом количестве данных этот способ неудобный и слишком трудоемкий. Поэтому в Excel реализована возможность автоматической проверки правильности составления формул.
Известно, что Excel автоматически проверяет правильность составления формул в соответствии с определенными правилами. Если в результате такой проверки обнаружены ошибки, то в соответствующих ячейках отображаются хорошо знакомые пользователям сообщения об ошибках: #даш/о!, #н/д, #имя?, #пусто ! и т. д. Это позволяет оперативно выявить формулы, содержащие синтаксические ошибки.
Если же формула содержит не синтаксические, а иные ошибки, то проверить ее правильность несколько сложнее. При обнаружении в результате автоматической
проверки таких ошибок в левом верхнем углу соответствующих ячеек отобра^ка- ется треугольник зеленого цвета. Однако просмотр всех таких ячеек в больших таблицах — процесс слишком утомительный, поэтому в данном случае следует воспользоваться командой главного меню Сервис ► Проверка наличия ошибок. С помощью этого режима Excel будет последовательно проверять все ячейки, содержащие формулы, н при обнаружении ошибок в каждом конкретном случае выводить на экран информационное окно (рис. 2.11).
Рис. 2.11. Проверка наличия ошибокРис. 2.11. Проверка наличия ошибок
Рис. 2.11. Проверка наличия ошибок
Рис. 2.11. Проверка наличия ошибок
В данном окне указывается адрес ячейки, содержащей ошибочную формулу, краткое описание ошибки и варианты решения проблемы: выявить источник ошибки, пропустить ошибку, исправить ее в строке формул и др.
Однако при работе с большими объемами информации данный способ также является трудоемким. Поэтому в подобных случаях целесообразно использовать панель инструментов Окно контрольного значения, с помощью которой внимание акцентируется только на ячейках с формулами и контролируется одновременно адрес ячейки, содержащаяся в ней формула и полученный результат. Предварительно необходимо выделить ячейки с формулами — для этого нужно выполнить команду главного меню Правка ► Перейти, в открывшемся окне нажать кнопку Выделить, а затем в окне Выделение группы ячеек установить переключатель в положение формулы и нажать кнопку ОК.
Теперь необходимо выполнить команду Сервис ► Зависимости формул ► Показать окно контрольного значения и в открывшемся окне нажать кнопку Добавить контрольное значение. В результате в данном окне отобразится перечень выделенных ячеек, содержащих формулы (рис. 2.12).
imxaa#o”pgbHM”Hd唾斗终 二;=.二].” x
Прмр* 淵, Примерок Пример,хк Пример .хк Пример.х1$Прмр* 淵, Примерок Пример,хк Пример .хк Пример.х1$5 5 о ^7- 7 0 7 3ззсз0%5 5 о ^7- 7 0 7 3ззсз0%① Добавить контрольное значение... К Удалить контрольное значениеКнига Лист I Имя Ячейка Зна^нивФормула
Прмр* 淵, Примерок Пример,хк Пример .хк Пример.х1$
Прмр* 淵, Примерок Пример,хк Пример .хк Пример.х1$
5 5 о ^7- 7 0 7 3ззсз0%
5 5 о ^7- 7 0 7 3ззсз0%
УММ《М頂1) -СУММ(А1:В1) -H6+I6 «Al+Секрет -СУММ(С:С)
Рис. 2.12. Окно контрольного значения
В соответствующих столбцах для каждой позиции списка отображается название рабочей книги, название рабочего листа, имя ячейки (при наличии), адрес ячейки, хранящееся в ней значение и формула. Для перехода к требуемой ячейке достаточно дважды щелкнуть мышью на соответствующей позиции в данном списке» Чтобы удалить позицию из списка, необходимо выделить ее курсором и нажать кнопку Удалить контрольное значение.
Скрытие сообщений об ошибках при вычислениях
В некоторых случаях сообщение об ошибках может оказаться нежелательным — например, если такое сообщение на самом деле свидетельствует не об ошибке в самих расчетах, а о том, что в ячейку, участвующую в расчетах, просто не были введены необходимые данные. В большинстве подобных ситуаций пользователи вручную удаляют формулы из ячеек. Однако это не совсем удобно — например, после ввода данных в соответствующие ячейки формулы все равно придется восстанавливать. Поэтому для решения таких проблем целесообразнее использовать способ, описание которого приводится ниже.
Для скрытия сообщений об ошибках можио использовать режим условного форматирования. Для этого нужно выделить те ячейки с формулами, результать】 вычисле* ним которых не должны отображаться в случае возникновения ошибок» затем выполнить команду главного меню Формат ► У слоеное форматирование и в открывшемся окне определить формулу вида =ЕОШИБКА (ссылка_на_ячейку), где ссылка_на_ячейку — это ссылка на активную ячейку выделенного диапазона После этого необходимо нажать кнопку Формат и в открывшемся окне в поле Цвет выбрать значение Белый, после чего дважды нажать ОК.
После выполненных действий результаты вычислений с ошибками будут выводиться белым цветом и гюзтому не будут видны на экране.
Разработка и применение полезных пользовательских функций
Наряду с формулами функции также являются одним из основных инструментов Microsoft Excel. Функции могут быть как системными, так н пользовательскими (пользовательская функция — это функция, созданная пользователем с применением языка VBA).
Пользовательские функции могут применяться как в составе надстройки XLA, так и по отдельности. В первом случае при включении надстройки они будут доступны во всех книгах Excel. Во втором случае, чтобы функция была доступна во всех книгах Excel, необходимо сохранить ее в личной книге макросов — по умолчанию это файл Personal.xls. После создания пользовательской функции она будет по умолчанию помещена в категорию Определенные пользователем в окне Мастер функций (данное окно открывается при выполнении команды Вставка 卜 Функция).
В данном разделе мы рассмотрим функции, которые входят в состав надстройки PublicFunction. xla (эту надстройку можно скачать из Интернета по адресу
http://www.msoffice.nm.ru/downloads/PublicFunction.xla), Если же возникнет необходимость воспользоваться какой-либо из этих функций отдельно, без надстройки, то можно использовать код, который приводится при описании каждой функции. Кроме того, мы рассмотрим ряд иных пользовательских функций, применяемых без надстроек.
Чтобы функции надстройки PublicFunction. xla стшш доступными, необходимо поместить файл PublicFunction. xla в папку Library, которая расположена в каталог Office. После этого следует открыть Excel, выполнить команду главного меню Сервис ► Надстройки» в открывшемся окне установить флажок Пользовательские функции и нажать кнопку ОК. Теперь, выполнив команду Вставка > Функция и выбрав в открывшемся окне категорию Определенные пользователем, можно увидеть перечень функций, включенных в состав данной надстройки (рис. 2.13).
Рис. 2.13. Функции надстройки PublicFunction.xIa
Далее мы подробно рассмотрим функции, которые находятся в этом списке. При описании функций подразумевается, что они выбираются в окне Мастер функций, однако их можно вводить и в строку формул по обычным правилам Excel.
Объединение данных диапазона
Функция Couple (в составе надстройки она называется Сцепитьданные) предназначена для объединения всех данных, которые расположены в указанном диапазоне, с добавлением пробелов между ниш1. Код данной функции выглядит следующим образом (листинг 2.45).
Листинг 2.45. Функция Couple
Function Couple(Diapazon)
'Объединение данных, содержащихся в ячейках диапазона 一 Diapazon (разделитель между значениями - пробел)
* iCell - текущая ячейка For Each iCell In Diapazon 'Сцепляются данные только заполненных ячеек If IsEmpty(iCell) <> True Then
'Добавление значения ячейки в выходную строку
If Couple = "” Then Couple = ICell Else
Couple = Couple & " " & iCell End If End If Next
End Function
Как обычно, на первом этапе в окне Мастер функций нужно выделить курсором данную функцию и нажать кнопку ОК. На втором этапе следует указать диапазон ячеек, содержимое которых необходимо объединить, н вновь нажать ОК — результат отобразится в ячейке, в которой установлен курсор.
Функция СцепитьДанные выгодно отличается от стандартной функции сцепить тем, что легко можно указать произвольный диапазон, а также тем, что объединенные данные разделяются пробелом.
Объединение данных с учетом форматов
Функция CoupleFormat (в составе надстройки она называется СцепитьДФормат) работает аналогично функции СцепитьДанные с той разшщей, что она объединяет данные указанного диапазона с соблюдением^ форматов. Код функции представлен в листинге 2.46.
Листинг 2.46. Функция CoupleFormat
Function CoupleFormat(Diapazon)
'Объединение текстовых данных, содержащихся в ячейках _ диапазона Diapazon (разделитель между значениями 宀 пробел)
ICell - текущая ячейка For Each iCell In Diapazon 'Сцепляются данные только заполненных ячеек If IsEmpty(ICellJ <> True Then
'Добавление текста ячейки в выходную строку
If CoupleFormat = "” Then
CoupleFormat = iCell.Text Else
CoupleFormat = CoupleFormat & " " & iCell.Text End If
End If
Next
End Function
После выбора функции следует указать требуемый диапазон данных н нажать кнопку ОК— результат отобразится в ячейке, в которой установлен курсор.
Эксперименты с датой
В процессе работы с программой иногда возникает необходимость изменить представление даты. Оперативно решить эту задачу поможет функция Дата- Полная. Например, если дата отображается в виде 04.08.2005, то данная функция преобразует ее в вид 04 Августа 2005. Код функции приведен в листинге 2.47.
Листинг 2.47. Функция ДатаПолная
Function ДатаПолная(Ячейка)
'Получение данных в заданной ячейке в формате _ “dd mmmm уууу"
Дата = Format (Ячейка, "dd mminm уууу”)
If IsDate(Ячейка) = True Or IsDate(Дата) = True Then
' Возврат строки с полной датой
ДатаПолная = StrConv(Дата, vbProperCase)
Else
'Данные в ячейке не являются датой
ДатаПолная = **<>**
End If
End Function
После выбора функции следует указать ячейку с датой, которую необходимо преобразовать.
Несомненным достоинством данной функции является то, что она может преобразовать представление даты даже в тех ячейках, в которых установлен формат, отличный от Дата (Чистювой» Текстовый и др.). Например» если в ячейке с форматом Общий содержится число 37808, то в результате применения функции ДатаПолная оно будет преобразовано в дату 06 Июля 2003.
Выбор из текста всех чисел
Достаточно интересное решение реализовано в функции ExtractNumeric (в составе надстройки она называется извлечьЧисло). С ее помощью из любого текста можно извлечь все числовые значения. Например» если ячейка содержит текст 25 сентября 2004 года» то результат применения данной функции будет выглядеть так: 252004. Код функции выглядит следующим образом (листинг 2.48).
Листинг 2.48. Функция ExtraatNumeric
Function ExtractNumeric(iCell)
Анализируется каждый символ входной строки iCell
For iCount = 1 То Len(iCell)
'Проверка, является ли анализируемый символ числом
If IsNumeric(Mid(iCellf iCount, 1)) = True Then
' Число добавляется в выходную строку
ExtractNumeric = ExtractNumeric & Mid(iCell, iCount, 1)
End If
Next
End Function
После выбора функции извлечьЧисло следует указать ячейку, из которой необходимо извлечь числовые значения. Результат отобразится в аюивной ячейке. Очевидно, что применение данной функции имеет смысл только в том случае, когда текст включает в себя и чисповые, и иные символы.
Прописная буква только в начале текста
Как известно, в Excel есть штатная функция ПРОПНАЧ, которая преобразует все первые буквы слов в тексте в прописные. Однако иногда возникает необходимость сделать так, чтобы в тексте была только одна прописная буква 一 в начале его первого слова. Решить зту задачу поможет пользовательская функция ПрописнНан, также входящая в состав надстройки PublicFunction. xla. Код функции выглядит следующим образом (листинг 2.49).
Листинг 2.49. Функция прописнНач
Function ПрописнНач(Текст)
'Пустой текст функция не обрабатывает
If Текст = "” Then ПрописнНач = "<>": Exit Function
1 Выделение первого символа и перевод его в верхний регистр
ПервыйСимвол = UCase(Left(Текст, 1))
'Выделение остальной части строки и перевод 一 ее в нижний регистр
Обрубок = LCase(Mid(Текст, 2))
'Соединение частей строки и возврат значения
ПрописнНач = ПервыйСимвол & Обрубок
End Function
После выбора функции следует указать ячейку, текст которой нужно преобразовать, Результат преобразования отобразится в активной ячейке.
Перевод чисел в «деньги»
Функцию» о которой рассказывается в данном подразделе, наверняка оценят экономисты, а также работники бухгалтерских н финансовых служб предприятай (орга-
низаций). С ее помощью можно преобразовать хранящееся в ячейке число в денеяс- ное представление: например, число 53 будет отображаться как 53 руб. 00 коп.» а инсло 27,43 — как 27 руб. 43 коп. Данная функция называется RubKop (в составе надстройки — РубКоп), ее код приведен в листинге 2.50.
Листинг 2.50. Функция RubKop
Function RubKop(Число)
'Пустые ячейки и ячейки, содержащие текст, функция _ не обрабатывает
If IsNumeric(Число) = False Or Число = "” Then RubKop = 一 “о” : Exit Function
'Из числа целой части - рубли
ДлинаЧисла = Len(Число)
ЦелаяЧасть = Fix(Число)
ДлинаЦелой ^ Len(ЦелаяЧасть)
'Вычисление длины дробной части
ДлинаДроби = ДлинаЧисла - ДлинаЦелой
If ДлинаДроби <> 0 Then
ДлинаДроби = ДлинаЧисла - ДлинаЦелой - 1
End If
'Формирование количества копеек в зависимости от длины 一 дробной части
If ДлинаДроби = 0 Then
'Ноль копеек
Копейки = "0。"
Elself ДлинаДроби = 1 Then
' Дробная часть состоит из одного числа — это _ десятки копеек
Копейки = Right(Число, ДлинаДроби) & "口"
Elself ДлинаДроби = 2 Then
Дробная часть полностью соответствует количеству копеек Копейки = Right(Число, ДлинаДроби)
Else
' Длина дробной части больше двух 一 округлим _ дробную часть
Копейки = Right(Числог ДлинаДроби)
If Mid(Копейки, 3, 1) > 4 Then
Копейки н Left(Копейки, 2)+1
Else
Копейки = Left(Копейки, 2)
End If
End If
• Составление полной надписи из количества рублей и копеек Рубли = ЦелаяЧасть
RubKop = Рубли & " " & "руб." & " " & Копейки & " " & "kqh.” End Function
После выбора функции следует указать ячейку, содержимое которой нужно преобразовать. Результат преобразования будет показан в активной ячейке.
Подсчет количества повторов искомого текста
Функция CoincideCount (в составе надстройки — КоличествоСовпадений) позволяет быстро посчитать количество повторов текстового фрагмента в тексте ячеек заданного диапазона. Код функции приведен в листинге 2*51.
Листинг 2.51. Функция CoincideCount
Function CoincideCount(Text, Search)
I Проверка правильности входных данных 一 (аргумента Search)
If IsArray(Search) = True Then Exit Function
If IsError(Search) = True Then Exit Function
If IsEmpty (Search) = True Then Exit Function
'Просмотр заданного в параметре Text диапазона For Each iCell In Text
' Ан али зируют с я только ячейки, содержащие _ корректные значения
If Not IsError(iCell) Then
iText - строка для просмотра (в нижнем регистре) iText = LCase(iCell)
iSearch - искомое значение (в нижнем регистре) ISearch = LCase(Search)
■ Длина искомой строки iLen = Len(Search)
* Первый поиск строки iSearch в строке iText _ (этот и последующий поиски производятся без _ учета регистра символов)
iNumber = XnStr(iText, iSearch) While iNumber > 0
* Поиск следующего вхождения строки iNumber 二 InStr(iNumber + iLen, iText, iSearch) 'Подсчет количества вхождений CoincideCount = CoincideCount + vbNull Wend
End If
Next
End Function
В отличие от функций, описание которых приведено выше, функция количест- воСовпадений имеет два аргумента. На втором шаге в окне Мастер функций необходимо задать область поиска (это может быть как одна ячейка, так it диапазон) н указать расположение искомого текста. Результат отображается в ячейке, в которой был установлен курсор до вызова данной функция. Важно отметить, что при поиске не учитывается регистр символов, то есть для этой функции строки слово и Слово одтааковы.
Суммирование данных только видимых ячеек
Функция СуммаВидэ о которой рассказывается в данном подразделе, отличается от стандартной функции Excel сумм тем, что позволяет суммировать данные только видимого диапазона. Иначе говоря, при расчете суммы данная функция игнорирует значения, расположенные в скрытых ячейках, В листинге 2.52 приведен код этой функции.
Листинг 2.52. Функция СуммаВид
Function СуммаВид(Диапазон) Ав Double
'Просмотр всех ячеек заданного диапазона
For Each Ячейка In Диапазон
т Анализ только видимых ячеек
If Not Ячейка.EntireRow.Hidden And Not —
Ячейка.EntireColumn.Hidden Then
* При расчете учитываются только ячейки 一 с численными значениями
If IsNumeric(Ячейка) = True Then
СуммаВид = СуммаВид + Ячейка
End If
End If
Next
End Function
После выбора функции нужно задать единственное условие — диапазон ячеек, данные которых необходимо сложить. Результат отображается в ячейке, в которой был установлен курсор до вызова данной функции.
При суммировании — курсор внутри диапазона
Удобный способ суммирования диапазона ячеек реализован в функции Сумма. Она отличается от стандартной функции Excel сумм тем, что при суммировании курсор может находиться внутри этого же диапазона» но при этом циническая ошибка не возникнет и, соответственно, сообщение о ней выводиться не будет.
Следует учитывать, что ячейка с функцией в расчетах не участвует. Код функции Сумма выглядит следующим образом (листинг 2.53).
Листинг 2.53. функция Сумма
Function Сумма(Диапазон, АдресЯчейки) As Double
* Просмотр всех ячеек диапазона
For Each Ячейка In Диапазон
Проверка, чтобы в суммировании не участвовала ячейка с формулой
If АдресЯчейки.Address о Ячейка.Address Then т В суммировании участвуют только ячейки _ с численными значениями
If IsNumetie(Ячейка) = True Then
Сумма = Сумма + Ячейка
End If
End If
Next
End Function
После выбора функции необходимо задать два обязательных условия: диапазон суммируемых ячеек и адрес ячейки, в которой будет располагаться функция (и отображаться результат расчета).
Вывод суммы прописью
Функция СуммаПрописью (она тоже входит в состав надстройки PublicFunction.xla), также как и рубкоп, будет особенно интересна в первую очередь специалистам экономического профиля. Она позволяет вывести числовое значение в текстовом выражении (после применения данной функции число 70 отобразится как Семьдесят рублей 00 коп ・,а число 42,15 — как Сорок два рубля 15 коп.). Напрнмер, если какой-либо столбец таблицы содержит перечень денежных сумм (предположим, ежедневной выручки в течение месяца), то в соседнем столбце можно для каждой числовой суммы вывести сумму прописью.
После выбора функции следует указать ячейку, содержимое которой нужно преобразовать. Результат отображается в ячейке, в которой был установлен курсор до вызова функции.
В следующих подразделах рассматриваются функции, не входящие в состав надстройки PublicFunction.xla.
Начисление процентов в зависимости от суммы
Процесс начисления комиссионных процентов — один из наиболее популярных процессов в экономтеской н финансовой деятельности, поэтому любой экономист, менеджер и финансовый работник должен уметь быстро выполнять эту one-
рацию. Функция, которая рассматривается в данном подразделе, поможет решить эту задачу.
Допустим, что организация принимает вклады на следующих условиях: на вклада размером до 4999 руб, начисляется 9 %, на вклады размером от 5000 до 9999 руб.— 11 %t а на вклады размером свыше 10 000 руб. — 15 % (все данные — условны). Чтобы быстро рассчитать проценты по вкладам в данном случае, можно воспользоваться функцией dhCalculatePercent, код которой приведен в листинге 2.54.
Листинг 2.54. Функция dhCalculatePercent (вариант 1)
Function dhCalculatePercent(IngSum As Long) As Double ' Процентные ставки (декларация констант) Const ciblRatel As Double = 0・09 Const dblRate2 As Double = 0.11 Const dblRate3 As Double = 0*15
т Граничные суммы вкладов (декларация констант)
Const intSuml As Long = 5000
Const intSum2 As Long = 10000
' Возвращаем сумму, умноженную на соответствующую ставку If IngSum < intSuml Then
dhCalculatePercent = IngSum * dblRatel
Elself IngSum < intSum2 Then
dhCalculatePercent = IngSum * dblRate2 Else
dhCalculatePercent = IngSum * dblRate3 End If End Function
Эту же функцию можно записать и в таком виде (листинг 2.55).
Листинг2.55. Функция dhCalculatePercent (вариант 2)
Function dhCalculatePercent(IngSum As Long) As Double
* Процентные ставки (декларация констант)
Const dblRatel As Double = 0.09
Const dblRate2 As Double = 0.11
Const dblRate3 As Double = 0.15
Граничные суммы вкладов (декларация констант) Const intSuml As Long = 5000 Const intSum2 As Long = 10000
' Возвращаем сумму, умноженную на соответствующую ставку Select Case IngSum
Case Is < intSuml
dhCalculatePercent = IngSum * dblRatel
Case Is < intSum2
dhCalculatePercent = IngSum * dblRateZ
Case Else
dhCalculatePercent = IngSum * dblRate3
End Select
End Function
После выбора функщш (в окне Мастер функций данная функция по умоячашпо будет помещена в категорию Определенные пользователем, как и другие пользовательские функции) необходимо указать ячейку, на основании которой следует рассчитать сумму процентов. Результат отобразится в ячейке, в которой был установлен курсор.
С помощью данной функшш можно начислять не только проценты по вкладам, но и рассчитывать, например, заработок торговых агентов (если он рассчитывается в процентах от поступления денежных средств), а также выполнять иные подобные расчеты.
Еще о расчете процентов
Выше мы рассмотрели один из наиболее простых способов расчета процентов в зависимости от суммы вклада (выручки и т. п.). Рассмотрим другой вариант. Предположим» что штатным сотрудникам организации, принимающей вклады, проценты по вкладам начисляются по приведенному в предыдущем подразделе алгоритму. Сторонним же вкладчикам выплачивается ПО % от начисленной суммы. Для решения дайной задачи функцию dhCalculatePercent следует написать в таком виде (листинг 2.56).
Листинг 2.56. Функция dhCalculatePercent (вариант 3)
Function dhCalculatePercent (Sales As Long, Is Temporal As Boolean) As Double
'Процентные ставки (декларация констант)
Const dblRatel As Double = 0.09
Const dblRate2 As Double = 0.11
Const dblRate? As Double = 0.15
Const dblAdd. As Double - 1*1
' Граничные суммы
Const IngSuml As Long = 5000
Const lngSum2 As Long = 10000
1 Расчет суммы для выплаты (как обычно)
If Sales < IngSuml Then
dhCalculatePercent = Sales * dblRatel
Elself Sales < lngSum2 Then dhCalculatePercent = Sales * dblRate2
Else dhCalculatePercent ^ Sales * dblRate3
End If
If IsTemporal Then
'Для сторонних вкладчиков - надбавка dhCalculatePercent = dblAdd * dhCalculatePercent
End If
End Function
Теперь функция dhCalculatePercent будет иметь два аргумента. После выбора в окне Мастер функций данной функции откроется окно, показанное на рис. 2.14.
Рис. 2.14. Аргументы функции dhCalculatePercent
В данном окне в поле Sales указывается адрес ячейки, на основании которой требуется рассчитать сумму процентов, а в поле IsTemporal определяется, штатному сотруднику или нет начисляются проценты. Если проценты начисляются штатному сотруднику, то в данном поле следует ввести значение False, а если стороннему вкладчику — следует ввести True (в данном случае проценты будут начислены в размере ПО % от причитающейся суммы).
Сводный пример расчета комиссионного вознаграждения
Рассмотрим трюк, который включает в себя простой расчет комиссионного вознаграждения внештатным сотрудникам, расчет вознаграждения штатным сотрудникам с учетом выслуги лет, а также возможность быстро рассчитывать комиссионное вознаграждение в диалоговом режиме.
Предположим, что внештатные сотрудники получают комиссионное вознаграждение в зависимости от объема продаж по следующей шкале:
до 4999 руб. — 9 %;
от 5000 до 9999 руб. — И %;
свыше 10 000 руб. — 15 %.
При расчете сумм комиссионного вознаграждения штатным сотрудникам учитьь вается стаж их работы в компании: за каждый отработанный год к сумме причитающегося вознаграждения добавляется 1 %,
Для решения поставленной задачи напишем код^ представленый в листинге 2.57 (этот код следует поместить в стандартный модуль редактора VBA).
Листинг 2.57. Расчет комиссионного вознаграждения
Function dhCalculateCom(dblSales As Double) As Double
Const dblRatel = 0.09
Const dblRate2 = 0,11
Const dblRate3 工 6.15
Расчет комиссионных с продаж (без выслуги) в зависимости _ от суммы
Select Case dblSales
Case 0 To 4999.99: dhCalculateCom 工 dblSales * dblRatel
Case 5 000 To 9 999.9 9: dhCalculateCom = dblSales * dblRat.e2
Case Is >= 10000: dhCalculateCom = dblSales * dblRate3
End Select
End Function
Function dhCalculateCom2(dblSales As Double, intYears As Double) As Double
Const dblRatel = 0.09
Const dblRate2 = 0.11
Const dblRate3 = 0.15
' Расчет комиссионных с продаж (без учета выслуги лет) в зависимости от суммы Select Case dblSales
Case 0 Tq 4999.99: dhCalculateCom2 - dblSales * dblRatel
Case 5000 To 9999.99: dhCalculateCom2 = dblSales * dblRate2
Case Is >= 10000: dhCalculateCom? ^ dblSales * dblRate3 End Select 'Надбавка за выслугу лет dhCalculateComS = dhCalculateCom^ + (dhCalculateCom2 * intYears / 100)
End Function
Sub ComCalculator()
Dim strMessage As String
Dim dblSales As Double
Dim ан As Integer.
Calc:
* Отображение окна для ввода данных
dblSales 工 Vai(InputBox("Сумма реализации:",
"Расчет комиссионного вознаграждения11))
' Формирование сообщения (с одновременным расчетом — вознаграждения)
strMessage = TtОбъем продаж: " & vbTab & Format (dblSales, "$#,餐餐О”) & -
vbCrLf & "Сумма вознаграждения:n & vbTab & 一
Format(dhCalculateCom(dblSales) , ”S#,毋#0”) £_
vbCrLf & vbCrLf & ''Считаем дальше?"
' Вывод окна с сообщением (о рассчитанной сумме и вопросом — о продолжении расчетов)
If MsgBox(strMessage, vbYesNo,
Расчет комиссионного вознаграждения") = vbYes Then
'Продолжение расчетов
GoTo Calc
End If
End Sub
В результате написания данного кода будут сформированы две пользовательские функции ——dhCalculateCom и dhCalculateCom2 (они будут помещены в категорию Определенные пользователем в окне Мастер функций, которое открывается при выпол* нении команды Вставка ► Функция), а также макрос comCalculator, доступный в окне выбора макросов (Сервис ► Макрос ► Макросы). Рассмотрим порядок применения указанных функций и макроса.
Функция dhCalculateCom имеет один аргумент — объем реализации. При выборе функции необходимо указать адрес ячейки, в которой содержится объем реализации по требуемому сотруднику — результат расчета (сумма вознаграждения) отобразится в ячейке, в которой установлен курсор.
Функция dhCalculateCom2 имеет два аргумента: объем реализации и количество отработанных сотрудником лет. При выборе функции указывается адрес ячейки с объемом реализации по требуемому сотруднику и адрес ячейки, в KOTOpoii отображается количество отработанных лет. Результат расчета будет помещен в ячейку, в которой установлен icypcop.
Для удобства работы рекомендуется привязать макрос ComCalculator к кнопке н поместить ее на какую-нибудь панель инструментов либо в другое место интерфейса.
После вызова макроса откроется диалоговое окно Расчет комиссионного вознаграждения (название окна и его элементов можно корректировать путем внесения соответствующих изменений в код макроса), в котором в поле Сумма реализации следует с клавиатуры ввести сумму, от которой требуется рассчитать объем комиссионного вознаграждения, и нажать кнопку ОК либо клавишу Enter* Результат расчета отобразится в открывшемся информационном окне — в нем будет показана сумма реализации (введенная пользователем) и сумма пржитающегося комиссионного вознаграждения. В этом же окне будет сфорлшрован запрос на продолжение расчета либо на выход из данного режима. При положительном ответе вновь отобразится окно Расчет комиссионного вознаграждения, в котором нужно будет ввести сумму реализаини, и т. д.
В данном примере макрос ComCalculator рассчитывает комиссионное вознаграждение без учета выслуги лет сотрудников компаннн. Для учета выслуги лет следует внести соответствующие изменения в код макроса.
Подсчет количества ячеек, содержащих указанные значения
В процессе работы иногда возникает необходимость быстро узнать, какое количество ячеек с указанным значением содержится в том или шюм диапазоне. Это бъгвает нужно, например, чтобы узнать, сколько раз торговая выручка превышала определенную сумму либо находилась в пределах некоторого интервала сумм. Решить эту задачу поможет функция, код которой приведен в Ш1ст1шге 2,58.
Листинг 2.58. Количество ячеек с определенным значением
Function dhCount(rgn As Range, LowBound As Double, _ UpperBound As Double) As Long
Dim cell As Range
Dim IngCount As Long
'Проходим по всем ячейкам диапазона rgn и подсчитываем значения, _ попадающие в интервал от LowBound до UpperBound
For Each cell In rgn
If cell.Value >= LowBound And cell.Value <= UpperBound Then
Значение попадает в заданный интервал
IngCount - IngCount + 1
End If
Next
dhCount = IngCount
End Function
Данная функция содержит три аргумента. Если выбрать ее в окне Мастер функций, то откроется окно, показанное на рис. 2.15.
В данном окне в поле Rgn указывается диапазон, содержимое которого нужно проанализировать, а в полях LowBound и UpperBound — границы значений искомых ячеек диапазона. Например, на рис. 2Л5 указано, что необходимо найти
общее количество ячеек диапазона B5:F12, значения которых находятся в пределах от 900 до 7000. Результат будет выведен в ячейке, в которой расположен курсор. Если вводить функцию с клавиатуры в строку формул либо в ячейку, то она будет выглядеть следующим образом: =Count(В5 : F12; 900; 7000).
Рис. 2.15. Аргументы функции dhCount
Подсчет количества видимых ячеек в диапазоне
Как известно, в Excel предусмотрена возможность скрытия строк и столбцов (для этого предназначены команды главного меню Формат ► Строка ► Скрыть и Формат ► Столбец ► Скрыть). Поэтому иногда в процессе работы может возникать вопрос: а есть ли в том или ином диапазоне скрытые ячейки? В данном подразделе мы рассмотрим прием, который позволяет быстро посчитать количество видимых ячеек в указанном диапазоне (сравнив его с общим количеством ячеек этого же диапазона легко определить, есть ли в нем скрытые ячейки).
Для подсчета видимых непустых ячеек диапазона удобно применять пользовательскую функцию dhCountVisibleCells. Для создания данной функции нужно в стандартном модуле редактора VBA написать код, который представлен в листинге 2.59.
Листинг 2.59. Подсчет количества видимых ячеек
Function dhCountVisibleCells(rgRange As Range)
Dim IngCount As Long
Dim cell As Range
'Проходим по всему диапазону и подсчитываем непустые _ видимые ячейки
For Each cell In rgRange
'Проверка, есть ли данные в ячейке
If Not IsEmpty(cell) Then
'Проверка, видима ли ячейка
If Not cell.EntireBow.Hidden And Not _ cell,EntireColumn Ф Hidden Then
* Еще одна видимая ячейка IngCount = IngCount + 1 End If1
End If Next cell dhCountVisibleCells = IngCount End Function
Данная функция имеет один аргумент — диапазон, в котором нужно посчитать видимые ячейки. Результат расчета будет помещен в ячейку, в которой установлен курсор. Функцию можно использовать с помощью формулы, которая записывается в строке формул. Пример такой формулы (в ней может изменяться только анализируемый диапазон) следующий: ^dhCountVisibleCells(Al:Е7)
В данном случае будет подсчитано и помещено в активную ячейку количество видимых ячеек, которые находятся в диапазоне А1:Е7.
Поиск ближайшего понедельника
С помощью несложного трюка можно быстро вычислить требуемый день недели по отношению к заданной дате (например, когда будет первый понедельник после 27,07.2005). В этом нам поможет функция dhGetN&xtMonday, код которой приведен в листинге 2.60.
Листинг 2.60. Ближайший день недели по отношению к дате
Function dhGetNextMonday(datDate 'Определение даты следующего возвращает номер дня недели, в качестве второго аргумента If Weekday(datDate, vbMonday)Function dhGetNextMonday(datDate 'Определение даты следующего возвращает номер дня недели, в качестве второго аргумента If Weekday(datDate, vbMonday)As Date) As Date понедельника (функция Weekday _ считая от понедельника, если — задавать vbMonday) =1 ThenAs Date) As Date понедельника (функция Weekday _ считая от понедельника, если — задавать vbMonday) =1 Then
Function dhGetNextMonday(datDate 'Определение даты следующего возвращает номер дня недели, в качестве второго аргумента If Weekday(datDate, vbMonday)
Function dhGetNextMonday(datDate 'Определение даты следующего возвращает номер дня недели, в качестве второго аргумента If Weekday(datDate, vbMonday)
As Date) As Date понедельника (функция Weekday _ считая от понедельника, если — задавать vbMonday) =1 Then
As Date) As Date понедельника (функция Weekday _ считая от понедельника, если — задавать vbMonday) =1 Then
1 Заданная дата и есть понедельник dhGetNextMonday = datDate
Else
1 Расчет даты следующего понедельника
dhGetNextMonday ^ datDate + 8 - Weekday(datDate, vbMonday) End If
End Function
Чтобы получить дату ближайшего понедельника, наиример после 27.07.2005, необходимо в окне мастера функций выбрать функцию dhGetNextMonday и в качестве значения аргумента ввести 27.07.2005. После нажатия Enter в активной ячейке отоб-
разится дата 01.08.2005, то есть ближайший понедельник после 27 июля 2005 года приходи7 ся на 1 августа 2005 года. Если воспользоваться строкой форму几 то формула будет выглядеть так:
=dhGetNextMonday("27.07.2005")
Аналогичным образом можно вычислить даты остальных дней недели.
Если после применения формулы дата не отображается надлежащим образом (например, 38545 вместо 12.07.2005), то необходимо установить формат ячейки Дата.
Подсчет количества полных лет
Трюк, который мы сейчас рассмотрим, позволяет быстро посчитать количество целых лет между заданной датой и текущей. В частности, с помощью данного трюка можно определить возраст человека (с округлением до целых лет), зная дату его рождения. В этом нам поможет пользовательская функция dhCalculateAge, код которой приведен в листинге 2.61.
Листинг 2.61. Функция dhCalculateAge
Function dhCalculateAge(datDate As Date) As Long
Dim IngAge As Long
‘ Находим разность между текущей датой и указанной (лет)
IngAge = Dat eDiff (^уууу11, datDate, Date)
If DateSerial(Year(datDate) + IngAge, Month(datDate), _ Day(datDate)) > Date Then
‘ В этом году лень рождения еще не наступил
IngAge = IngAge - 1
End If
dhCalculateAge = IngAge
End Function
Если, например, в качестве заданной даты взять 18.08.1972, а сегодняшний день — 30.07.2005, то результатом выполнения данной функции будет число 32. При использовании строки формул в данном случае формула будет выглядеть следующим образом:
=dhCalculateAge("18.08.1972")
Проверка, была ли сохранена рабочая книга
В процессе работы с новой книгой может возшпсать вопрос: а была ли уже сохранена текущая книга? Для ответа на него существует ряд штатных методов (самый простой —воспользоваться командой Файл > Сохранить). Однако можно применить н нестандартный прием; для этого нужно создать пользовательскую функцию, код которой приведен в листинге 2.62.
Листинг 2.62. Функция dhBooklsSaved
Function dhBooklsSaved() As Boolean
'Если путь файла рабочей книги не задан, то она _ не сохранена (ThisWorkbook.path равняется "")
dhBooklsSaved = ThisWorkbook.path о "”
End Function
Данная функция не имеет аргументов. Если после ее запуска в активной ячейке появится значение истина, то текущая рабочая книга была ранее сохранена, а если ложь — то книга не сохранялась.
Расчет средневзвешенного значения
Для быстрого расчета средневзвешенного значения можно применить пользовательскую функцию, код которой приведен в листинге 2.63.
Листинг 2.63, Расчет средневзвешенного значения
Function dhAverageWithWeight(rgWeights As Range, rgValues As Range) _ As Double
If (rgWeights.Count <> rgValues * Count) Then
'Количество весов не соответствует количеству аргументов dhAverageWithWeight = О
Exit Function
End 工 f
Dim i As Integer
Dim dblSum As Double' Сумма значений
Dim dblSumWeight As Double ' Взвешенная сумма значений
' Вычисление.・.
For i = 1 То rgWeights.Count
'Взвешенной суммы значений
dblSumWeight = dblSumWeight + rgWeights(i) * rgValues(i)
'Суммы значений
dblSum н dblSum + rgWeights(i)
Next
'Возвращение средневзвешенного значения
dhAverageWithWeight = dblSumWeight / dblSum
End Function
После выбора данной функции откроется окно, в котором следует заполнить поля RgWeights и RgValues, после чего нажать кнопку ОК. Результат отобразится в ячейке, в которой установлен курсор.
Преобразование номера месяца в его название
С помощью небольшой пользовательской функции можно быстро получить название месяца на основании его номера. Данную возможность целесообразно использовать при работе с большими объемами информации, когда нужно быстро преобразовать числовьге обозначения месяцев в обычные названия. Код функцнм выглядит следующим образом (листинг 2.64).
Листинг 2.64. Название месяца
Function dhMonthName(intMonth As Integer) As String
* Возвращение имени месяца по его номеру (intMonth _ является номером элемента 耳 массиве с названиями месяцев)
dhMonthName = Choose(intMonthf ^Январь"r "Февральк, "Март", "Апрель", "Mai%", “Мюнь", "Июль", "Август", ^Сентябрь11, _ "Октябрь", т|Ноябрьи, "Декабрь11)
End Function
После выбора данной функции необходимо указать номер месяца. В результате соответствующее ему название отобразится в активной ячейке.
Расчет суммы первых значений диапазона
Предположим1 что в указанном диапазоне нам нужно сложить не все значения, а только несколько первых (иначе говоря, например, в диапазон входят 10 ячеек, а нам нужно посчитать сумму только первых пяти из них). Для решения этой задачи можно использовать функцию, код которой приведен в листинге 2.65.
Листинг 2.65. Функция dhNSum
Function dhNSum(EyVal intCount As Integer,— rgValues As Range) As Double
Dim i As Integer
Dim dblSum As Double
If intCount > rgValues.Count Then
'Задано количество элементов большее, чем есть _ в переданном диапазоне
intCount н rgValues.Count
End If
,Расчет суммы первых intCount элементов
For i = 1 То intCount
dblSum = dblSum + rgValues(i)
Next i
Возврат результата
dhNSum = dblSum
End Function
После выбора данной функции следует указать количество первых значений диапазона, а также сам диапазон (причем можно указать несколько диапазонов — в результате будет рассчитана сумма указанного колггчества первых значений всех перечисленных диапазонов). Результат вычисления будет показан в активной отейке.
Поиск последней непустой ячейки диапазона
При работе с большими объемами данных иногда бывает необходимо быстро найти последнюю непустую ячейку какого-либо диапазона (то есть последнюю ячейку, содержащую данные). В этом нам поможет пользовательская функция, для создания которой нужно написать следующий код (листинг 2.66).
Листинг 2е66. функция dhLastUsedCell
Function dhLastUsedCell(rgRange As Range) As Long
Dim IngCell As Long
'Пойдем по диапазону с конца (тогда первая попавшаяся 一 заполненная ячейка и будет искомой)
For IngCell = rgRange.Count To 1 Step -1
If Not IsEmpty(rgRange(IngCell)) Then
' Нашли непустую ячейку
dhLastUsedCell = IngCell
Exit Function
End If
Next IngCell
' Непустую ячейку не нашли
dhLastUsedCell = О
End Function
После выбора данной функции необходимо указать диапазон, который следует проверить. В результате порядковый номер последней ячейки этого диапазона, которая содержит данные, будет показан в активной этейке. Следует подчеркнуть, что функция возвращает порядковый номер ячейки дпапагюна. Если фуш<ция не находит заполненную ячейку, то она возвращает 0.
Поиск последней непустой ячейки столбца
Для быстрого поиска последней непустой ячейки столбца удобно применять пользовательскую функцию dhLastColUsedCell. Для ее создания нужно в стандартном модуле редактора VBA написать следующий код (листинг 2.67).
Листинг 2.67. Функция dhLastColDsedCell
Function dhLastColUsedCell(rgColumn As Range} As Variant
' Вывод значения последней непустой ячейки столбца
dhLastColUsedCell = rgColumn.Parent.Cells(Rows.Count, rgColumn.Column) >End(xlUp)*Value
End Function
Данная функция имеет один аргумент. В качестве аргумента указывается столбец, в котором необходимо найти последнюю непустую ячейку. При этом можно просто указать любую ячейку данного столбца. Содержимое (то есть значение) найденной ячейки будет помещено в ячейку» в которой установлен курсор.
Можно использовать функцию с помощью строки формул. Формула при этом может выглядеть так:
-dhLastColUsedCell(ВЗ)
В данном случае будет найдено и помещено в активную ячейку значение последней непустой ячейки столбца В.
Поиск последней непустой ячейки строки
Чтобы быстро найти последнюю непустую ячейку строки, можно применить пользовательскую функцию dhLastRowUsedCell. Она во многом напоминает рассмотренную выше функцию dhLastColUsedCell. Для создания функции нужно в стандартном модуле редактора VBA написать такой код (листинг 2.68).
Листинг 2.68. Функция dhLastRowUsedCell
Function dhLastRowUsedCell(rgRow As Range) As Variant
г Вывод значения последней непустой ячейки строки
dhLastRowUsedCell ~ rgRow.Parent.Cells(rgRow.Row, 256). _ End(xlToLeft).Address
End Function
Данная функция использует один аргумент. В качестве аргумента указывается строка, в которой необходимо найти последнюю непустую ячейку. При этом можно просто указать любую ячейку данной строки. Содержимое (то есть значение) найденной ячейки будет помещено в ячейку, в которой установлен курсор. Поря* док использования данной функции такой же, как н рассмотренной выше функции dhLastColUsedCell.
Подсчет количества ячеек в диапазоне, содержащих указанные значения
Трюк, который мы рассмотрим в данном подразделе, позволяет быстро посчитать количество ячеек в указанном диапазона, которые расположены в области между заданными значениями. Для решения данной задачи целесообразно использовать функцию dhCountSomeCells» код которой выглядит следующим образом (листинг 2.69).
Листинг 2.69. Функция dhCountSomeCells
Function dhCountSomeCells(rgRange As Range, dblMin As Double, dblMax As Double) As Long
* Расчет количества ячеек со значениями от dblMin до dblMax _ с использованием стандартной функции Countlf
With Application.WorksheetFunction
dhCountSomeCells = .Countlf(rgRange, ">=” & dblMin) - _
*Countlf(rgRange, ”〉" & dblMax)
End With
End Function
Данная функция имеет три аргумента: в качестве первого указывается обрабатываемый диапазон, а в качестве второго н третьего — соответственно минимальное и максимальное значения этого диапазона, которые задают область поиска. Количество ячеек, значения которых попадают в указанный интервал, будет отображено в активной ячейке.
Для использования функции можно применять формулу, пример которой выглядит следующим образом:
^dhCountSomeCells(Al:G15;10;15)
В данном случае будет определено количество ячеек, находящихся в диапазоне A1:G15 и значения которых располагаются в интервале от 10 до 15 (включительно).
Англоязычный текст — заглавными буквами
С помощью несложного трюка можно быстро преобразовать весь англоязычный текст выделенной ячейки в верхний регистр (написать его заглавными буквами)* Решить эту задачу поможет пользовательская функция, код которой приведен в листинге 2.70.
Листинг 2.70. Английский текст — в верхнем регастре
Function dhFormatEnglish(strText As String) As String
Dim i As Integer
Dim strCurChar As String ★ 1
' Анализируется каждый символ строки strText. Каждый символ _ латинского алфавита преобразуется в верхний регистр
For i = 1 То Len(strTextI
strCurChar = Mid(strText, i, 1)
' Код латинских строчных символов лежит в пределах _ от 97 до 122
If Asc(strCurChar) >= 97 And Asc(strCurChar) <= 122 Then
'Переводим символ в верхний регистр
dhFormatEnglish = dhFormatEnglish & UCase(strCurChar)
Else
' Просто добавляем символ в выходную строку dhFormatEnglish = dhFormatEnglish & strCurChar End If
Next i
End Function
После выбора функции следует указать ячейку, текст которой должел быть написан заглавными буквами. Результат отобразится в активной ячейке. Еслн преобразуемый текст является «смешанным», то есть содержит н русские, н английские слова, то преобразованы будут только английские слова, а русские останутся без изменений.
Отображение текста «задом наперед»
Трюк, который мы рассмотрим в данном подразделе, вряд ли будет иметь широкое практическое применение, поскольку он носит скорее развлекательный характер. Однако от этого он не становится меиее интересным.
Смысл его заключается в том, чтобы быстро «перевернуть» текст выделенной этей- ки (например, вместо Мама мыла раму получится умар алым амаМ). Чтобы получить подобный результат, можно применить пользовательскую функцию или еле- инально созданный макрос. Соответствующий код приведен в листинге 2.71 (этот код следует поместить в стандартный модуль редактора VBA),
Листинг 2.71. Преобразование текста в обратном порядке
Function dhReverseText(strText As String) As String
Dim i As Integer
'Переписываем символы из входной строки в выходную _ в обратном порядке
For i = Len(strText) To 1 Step —I dhReverseText = dhReverseText & Mid(strText^ i, I)
Next i
End Function
Sub ReverseText()
Dim strText As String
* Ввод строки посредством стандартного окна ввода
strText = InputBox (мВведите текст: •')
'Реверсия строки и вывод результата
MsgBox dhReverseText(strText), , strText
End Sub
После написания кода будет создана пользовательская функция dhReverseText (она будет помещена в категорию Определенные пользователем) и макрос ReverseText (он будет доступен в окне выбора макросов).
После выбора функции следует указать ячейку» текст которой необходтгмо преобразовать —результат отобразится в активной ячейке. При выполнении данной операции не стоит забывать, что если ячейка содержит не текст либо пуста, то результатом работы функции будет сообщение об ошибке.
Можно запустить данную функцию, введя ее предварительно в строку формул. В общем случае формула выглядит следующим образом:
^dhReverseText(А4)
Здесь А4 — это адрес ячейки, текст которой требуется преобразовать. После нажатия Enter результат отобразится в активной ячейке*
После запуска макроса ReverseText (его следует выбрать в окне Макрос, открывав емом с помощью команды Сервис ► Макрос ► Макросы) откроется дишюговое^окно, в котором с клавиатуры нужно ввести требуемый текст и нажать кнопку ОК или клавишу Enter. Результат преобразования текста отобразится в открывшемся информационном окне. Для удобства можно поместить на панель инструментов либо в другое место интерфейса кнопку, к которой привязать AiaKpoc ReverseText.
Поиск максимального значения на всех листах книги
В данном подразделе мы рассмотрим, каким образом можно быстро найти максимальное значение указанной ячейки среди всех листов текущей рабочей книги.
Следует отметить» что для решения данной задачи можно воспользоваться штатными средствами программы, а именно функцией макс. Например, с помощью формулы =макс (Лист2:Лист7!АЗ) осуществляется поиск максимального значения ^емки АЗ среди рабочих листов с Лист2 по Лист? включительно. Однако данный способ имеет следующий недостаток: при добавлении в книгу новых листов (после Лист7) формулу придется соответствующим образом корректировать.
Поэтому для решения подобных задач целесообразно создать и применять пользовательскую функцию, код которой приведен в листинге 2.72.
Листинг 2.72. Поиск максимального значения
Function dhMaxInBook(cell As Range) As Double
Dim sheet As Worksheet
Dim dblMax As Double
Dim dblResult As Double
Dim fFirst As Boolean
fFirst = True
* Расчет максимальных значений на всех листах рабочей книги 一 и выбор наибольшего из них
For Each sheet In cell * Parent.Parent.Worksheets
'Расчет максимального значения на листе
dblResult = Application.WorksheetFunction.Max(sheet.UsedRange)
If fFirst Then
Найдено первое значение 一 его не с чем сравнивать
dblMax = dblResult
fFirst ^ False
End If
' Выбираем большее из dblMax и dbmResult
If dblResult > dblMax Then
dblMax ^ dblResult
End If
Next sheet
'Возврат результата
dhMaxInBook = dblMax
End Function
Данная функция имеет один аргумент — адрес ячейки, максимальное значение которой следует выбрать из всех рабочих листов текущей книги. При добавлении (удалении) рабочих листов никаких icoppeicnipoBOK кода либо формулы выполнять истребуется —в любом случае обрабатываются все доступные рабочие листы текущей книги.
Использование относительных ссылок
Как известно, в Excel ограничена поддержка «трехмерных рабочих книго. Например, если при написании формулы необходимо сослаться на другой рабочий лист в книге, то в формулу необходимо включить имя соответствующего рабочего листа. Однако при попытке копирования этой формулы с одного листа на другой ссылка на лист не изменяется» как это происходит в реальцой трехмерной рабочей книге. Для решения этой проблемы можно применить пользовательскую функцию dhSheetOffseti код которой выглядит следующим образом (листинг 2.73).
Листинг 2*73. функция dhSheetOffset
Function dhSheetOffset(offset As Integer, cell As Range) As Variant
'Возврат корректного значения ячейки cell листа, смещение _ которого относительно текущего задано переменной offset
dhSheetOffset = Sheets(Application*Caller.Parent.Index 一
+ offset).Range(cell.Address)
End Function
Данная функция нмеет два аргумента. Первый аргумент — это ссылка на лист; он может быть положительным, нулевым или отрицательным (например, для ссылки на предыдущий лист нужно указать -1). Второй аргумент — это ссылка на кон* кретную ячейку. Для использования функции можно применять формулу:
=dhSheetOffset(-1;А9)
В данном случае в активной ячейке будет получено значение ячейки А9, располо* женной на предыдущем рабочем листе (то есть если текущий лист 一 Лист2, то будет получено значение ячейки А9 листа Лист1).
При использовании данной функции необходимо учитывать следующее: если рабочий лист содержит листы диаграмм, то при ссылке на ячейку на листе диаграммы будет получена ошибка.
При необходимости можно усовершенствовать данную функцию. Ниже приведен код функции dhSheetoffset2, игнорирующей все листы рабочей книга, которые не являются рабочими (листинг 2.74).
Листинг 2.74. Функция dhSheetOffset2
Function dhSheetOffset2(offset As Integer, cell As Range) As Variant
* Корректировка смещения (чтобы ссылка была на рабочий лист)
Do While TypeName(Sheets(cell.Parent.Index + offset))
<> "Worksheet"
If offset > 0 Then
* Пропускаем лист и проходим вперед по книге
offset = offset + 1
Else
'Пропускаем лист и проходим назад по книге
offset = offset - 1
End If
Loop
'Возврат корректного значения ячейки cell листа, смещение _ которого относительно текущего задано переменной offset _ с пропуском листов с диаграммами
dhSheetOffset2 ^ Sheets(cell.Parent.Index _
+ offset).Range(cell.Address)
End Function
У данной функции аргументы и порядок использования такие же» как и у рассмотренной выше функции dhSheetOffset.
Определение типа данных ячейки
С помощью небольшой пользовательской функции dhCellType можно быстро получить тип данных какой-либо ячейют либо левой верхней ячейки указанного диапазона. Код функции, который набирается в стандартном модуле редактора VBA, представлен в листинге 2,75.
Листинг 2.75. Тип данных, хранящихся в ячейке
Function dhCellType(rgRange As Range) As String
Переходим к левой верхней ячейке, если rgRange - диапазон, а не одна ячейка
Set rgRange = rgRange . Range ("Al11)
Определение типа значения в ячейке
Select Case True
Case IsEmpty(rgRange)
'Ячейка пуста dhCellType = "Пусто" Case Application.IsText(rgRange) 'В ячейке текст dhCellType = "Текст"
Case Application.IsLogical(rgRange)
В ячейке логическое значение (True или False) dhCellType = "Булево выражением Case Application.IsErr(rgRange)
'При вычислении значения в ячейке произошла ошибка dhCellType = пОшибкан Case IsDate(rgRange)
'В ячейке дата dhCellType = "Датап Case InStr(1, rgRange.Text, ":°) <> О
'В ячейке время dhCellType = "ВремН Case IsNumeric(rgRange)
'В ячейке числовое значение . dhCellType = "Число11 End Select
End Function
Данная функция имеет один аргумент — в его качестве указывается адрес конкретной ячейки либо диапазон (в последнем случае будет определен тип данных левой верхней ячейки этого диапазона). Результат работы функции отображается в активной ячейке. Например, если диапазон или указанная ячейка не содержит данных, то в активной ячейке отобразится значение Пусто; если содержится текстовое выражение, то в акгивной ячейке отобразится значение Текст, и т. д* в соответствии с кодом функции*
Выделение из текста произвольного элемента
Рассмотрим трюк, с помощью которого можно быстро выделить из текстового содержимого ячейки определенный элемент (текстовый фрагмент, число и т. п.) и поместить его в активную ячейку.
Для реализации данной задачи нам потребуется создать пользовательскую функцию» код которой показан в листинге 2.76 (этот код записывается в стандартном модуле редактора VB А).
Листинг 2.76. Выделение элемента текста
Function dhGetTextltem(ByVai strTextln As String, intltem As Integer, strSeparator As String) As String
Dim intStart As Integer ' Позиция начала текущего элемента
Dim intEnd As Integer 1 Позиция конца текущего элемента
Dim i As Integer1 Номер текущего элемента
'Проверка корректности номера элемента
If intltem < 1 Then Exit Function
'Убираются лишние пробелы, если разделитель - пробел
If strSeparator = " " Then strTextln = Application .Trim (strTextln)
* Разделитель добавляется в конец строки
If Right(strTextln, Len (strTextln)) <> strSeparator Then _ strTextln = strTextln & strSeparator
'Поиск всех элементов в строке до нужного
For i = 1 То intltem
Начало элемента (перемещение вперед п。 строке)
intStart = intEnd + 1
'Конец элемента
intEnd = InStr(intStart, strTextln, strSeparator)
If (intEnd = 0) Then
' Дошли до конца строки, но элемент не нашли
Exit Function
End If
Next i
'Выделение текста из входной строки
dhGetTextItem = Mid(strTextln, intStart, intEnd - intStart)
End Function
Данная функция имеет три аргумента: strTextln^ intltem н strSeparator. Аргумент strTextln — это адрес ячейки, нз содержимого которой нужно извлечь элемент; intltem — порядковый номер извлекаемого элемента; a strSeparator — символ разделителя между элементами. Соответствующие значения можно ввести как в окне настройки параметров функции, которое отбывается после ее выбора в окне Мастер функций, так и использовать для этой цели строку формул. Синтаксис функции выглядит следующим образом (пример):
=dhGetTextItem(А9;3;"-")
В данном случае dhGetText Item — название функции, АЗ — адрес ячейки с текстом, 3 — порядковый номер извлекаемого элемента, дефис (-) — символ разделителя.
Предположим, что из текста Ночь, улица, фонарь, аптека, который расположен в ячейке В2, нам нужно извлечь слово фонарь. Если воспользоваться строкой формул, то нужно ввести в нее следующую формулу:
-dhGetTextItern(В2;3;",")
В результате слово фонарь отобразится в ячейке, в которой установлен курсор.
Генератор случайных чисел
В данном подразделе мы научимся быстро заполнять диапазон случайными целыми числами. Данная возможность может быть использована в самых различных сферах деятельности — в частности, ее иногда применяют при разработке развлекательных и игровых программ.
Для выполнения данной операции нам потребуется создать пользовательскую функ・ цию. Ее код представлен в листинге 2,77.
Листинг 2.77. Функция dhGetRandoniValues
Function dhGetRandomValues() As Variant
Dim intRow As Integer' Номер текущей строки
Dim intCol As Integer1 Номер текущего столбца
Dim aintOut() As Integer 1 Выходной массив (двумерный)
Dim aintValues() As Integer ' Массив с возможные значениями
Dim intMax As Integer' Последний доступный элемент массива
aintValues
Dim i As Integer
ReDim aintOut(1 To Application * Caller.Rows.Count, 1 To _ Application.Caller.Columns.Count)
Всего нужно чисел..*
intMax = Application. Caller . Rows .Count * __ Application.Caller.Columns * Count
ReDim aintValues(1 To intMax)
'Заполнение массива aintValues значениями от 1 до intMax
For i = 1 To intMax
aintValues(i) = i
Next i
'Занесение значений в выходной массив aintOut, в произвольном порядке выбирая их из aintValues
Randomize
For intRow = 1 To Application * Caller.Rows.Count
For int-Col = 1 To Application. Caller. Columns . Count
'Определение номера элемента из aintValues
i = Rnd * intMax
If i = 0 Then i ^ 1
Занесение этого элемента в выходной массив
aintOut(intRow, intCol) = aintValues(i)
Уменьшение массива aintValues (то есть еще один его _ элемент выбран) - замена выбранного элемента последним в массиве
aintValues(i) = aintValues(intMax)
intMax = intMax - 1
Next intCol
Next intRow
Возвращение массива значений
dhGetRandomValues = aintOut
End Function
Характерной особенностью данной функции является то, что она не имеет аргументов. Пример результата выполнения функции представлен на рмс. 2Л 6.
A
.в
с
D
1
5
10
23
29
20
3
4
30
32
38
14
17
21
в
7
5
10
36
27
25
19
37
- —
35
39
26
12
4
9
28
13
.34
16
1
40
33
里
15
Рис. 2.16. Случайные числа в диапазоне
Синтаксис созданной функции выглядит так:
=dhGetRandomValues()
Данную формулу нужно применить сразу ко всему предварительно выделенному диапазону- Для этого после ввода ее в строку формул слезет нажать комбинацию клавиш Ctrl+Shift+Enter. На рис. 2*16 в произвольном порядке разбросано 40 разных чисел, так как в диапазоне 40 ячеек (10 по высоте и 4 по ширине).
Случайные числа — на основании диапазона
Трюк, который мы рассмотрим в данном подразделе, по своей функциональности несколько напоминает предыдущий. Различие заключается в том, что здесь в случайном порядке генерируются числа, содержащиеся в определешюм диапазоне (этот диапазон является единственным аргументом рассматриваемой функции). Коп функции (он сопровожден небольшими комментариями) выглядит следующим образом (лис* тинг 2.78).
Листинг 2.78. функция dhGetRandomValuesl
Function dhGetRandomValues1(rgSource As Range) As Variant
Dim intRow
As Integer
'Номер
текущей строки
Dim intCol
As Integer
* Номер
текущего столбца
Dim avarOut() As Variant
* Выходной массив (двумерный)
Dim avarValues () As Variant 1 Массив с возможными значениями
Dim intValCount As Integer 1 Количество возможных значений
Dim cell As Range
Dim i As Integer
ReDim avarOut(1 To Application * Caller.Rows.Count, 1 To _ Application.Caller.Columns.Count)
'Всего нужно чисел
intValCount = rgSource.Rows <Count * rgSource.Columns,Count
ReDim avarValues(1 To intValCount)
* Заполнение массива avarValues значениями из указанного _ диапазона
For Each cell In rgSource
i = i -h 1
avarValues(i) = cell *Value
Next cell
'Занесение значений б выходной массив avarOut, в произвольном _ порядке выбирая их из avarValues
Randomize
For intRow = 1 To Application.Caller.Rows.Count
For intCol « 1 To Application.Caller * Columns *Count
Определение номера элемента из avarValues
i = Rnd * intValCount
If 1 = 0 Then 1=1
Занесение этого элемента в выходной массив
avarOut(intRow, intCol) = avarValues(i)
Next intCol
Next intRow
'Возвращение массива значений
dhGe tRandomValues1 = avarOut
End Function
Для применения данной функции необходимо иметь диапазон с исходными данными. Синтаксис функции выглядит следующим образом (пример):
=dhGetRandomValues1(Al:С5)
Здесь Al : С5 — диапазон с исходными данными. Как и в предыдущем примере, данная функция применяется ко всему предварительно выделенному диапазону — с помощью сочетания клавиш Ctrl+Shift+Enter. После применения функции данные исходного диапазона будут в произвольном порядке разбросаны в новом диапазоне.
Создание трюков с помощью макросов
Как отмечалось выше, макрос — это программа, которая написана на встроенном в Excel языке программирования Visual Basic for Application (VBA). Язык VBA используется для встраивания программ в дoкy^feнтьт Microsoft Office.
С помощью макросов можно выполнять как хорошо знакомые пользователям Excel действия (выделение ячейки, вставку функции или формулы в ячейку и т. д) так и профаммировать более сложные операции (вплоть до построения информационных систем разной сложности).
Для работы с макросами предназначены команды, расположенные в подменю Сервис ► Макрос.
Подсчет количества открытий файла
С помощью несложного приема можно вести автомаптческий учет количества открытий текущего файла. Для этого достаточно написать любой из трех приведен* ных ниже макросов (листинги 3.1-33) н поместить его в VBA-модуль.
Листинг 3.1. Количество открытий файла (вариант 1)
Sub Auto_Open()
Worksheets(1).Cells(1) = Worksheets(1).Cells(1) + 1
End Sub
Листинг 3.2. Количество открытий файла (вариант 2)
Sub Auto_Open()
Worksheets (1).Cells(1, 1) = Worksheets(1).Cells(1, 1)+1
End Sub
Листинг 3.3. Количество открытий файла (вариант 3)
Sub AutQ_Open()
Worksheets(1).Range(nAl"l = Worksheets(1),Range(nAlH) + 1
End Sub
Все эти макросы имеют имя, определенное разработчиками Microsoft Office,— Auto_Open. Если макрос с таким именем реализован, то он автоматически вызывается средой Microsoft Office при каждом открытии книги.
При использовании любого из перечисленных выше вариантов коллчество открытий текущего файла отобразится в ячейке А1. Если результат впоследствии корректировался вручную, то в дальнейшем это значение при каждом открытии будет увеличиваться на 1 (напрнмер, при обнулении результата подсчет начнется заново, а если в ячейку А1 введено значение 52, то при следующем открытии файла оно будет равным 53). Если же в ячейку А1 введено не числовое значение, то при следующем открытии файла на экране отобразится сообщение об ошибке.
Получение «закрытой» информации
Возможности программа предусматривают извлечение данных из закрытого файла. Для этого нужно записать и выполнить следующий макрос (листинг 3.4).
Листинг 3.4・ Извлечение данных из закрытого файла
Sub GetDataFromFile()
Range£"Aln).Formula = "=* C:\[Example,xls]Лист1f!A1H End Sub
В данном случае подразумевается, что необходимый нам файл находится по адресу С : \Example. xls, а из хранящейся в нем книги нам нужно содержимое ячейки А1.
Формулу! которую мы задавали с помощью макроса, можно вводить в таблицу вручную, если возникнет необходимость заносить в ячейки таблицы данные из другого файла. При этом следует учитывать^ что полный путь нужно задавать только в том случае, если необходимый файл расположен в другой папке. Имя файла в квадратных скобках указывать обязательно. Также следует указывать имя листа, на котором находится нужная нам ячейка. Необходимо строго соблюдать синтаксис, который используется в листинге 3.4.
Для подкрепления сказанного рассмотрим пример формулы для получения значения ячейки А1 листа Лист2 книги, расположенной в файле F. xls (в той же папке, что и текущая книга):
*[Г.х1з]Лист2,!А1
Произвольный текст в строке состояния
С помощью небольшого макроса можно включить отображение в строке состояния произвольного текста. Код макроса выглядит следующим образом (листинг 3.5).
Листинг 3.5. Произвольный текст в строке состояния
Sub ChangeStatusBarText()
Application»StatusBar = "Как надоело работать! ! ! '*
End Sub
2222Результат применения данного макроса представлен на рис. 3.1.
22
22
> MknxcTi 痴石27齐 Дейсхвия - 依 i Автофисуры, Какнадаеяо рабстатЫП
尊①"J ®@jn任八
Рис. 3.1 * Изменение текста в строке состояния
Вьстрое изменение заголовка окна
Для возврата к первоначальному состоянию можно использовать следующий ма・ крое (листинг 3.6).
Листинг 3.6・ Восстановление строки состояния
Sub ReturnStatusBarText()
Application.StatusBar = False
End Sub
После запуска данного макроса строка состояния примет прежний вид.
Текст, изображенный в строке состояния на рис, 3.1, можно заставить двигаться, то есть создать эффект бегущей строки. В этом нам поможет макрос, код которого приведен в листинге 37
Листинг 3*7. Бегущая строка в строке состояния
Sub MovingTextlnStatusBar()
Dim intSpaces As Integer
'Изменение количества пробелов в начале строки (от 20 до 0) - _ строка бежит (скорее, ползет) влево
For intSpaces = 20 То 0 Step 7
* Запись текста в строку состояния
Application. StatusBar 工 Space (intSpaces) & нКак надоело работать ! ! !"
* Выдерживаем паузу
Application.Wait Now + TimeValue (rt00 :00:01м)
' Дадим Excel обработать пользовательский ввод
DoEvents
Next
Application.StatusBar = False
End Sub
После запуска макроса текст в строке состояния (он может быть произвольным) начнет двигаться справа налево*
Быстрое изменение заголовка окна
Аналогичным образом при необходимости можно изменить текст в заголовке окна программы. Для этого можно использовать, например, следующий макрос (листинг 3.8).
Листинг 3,8. Изменение заголовка окна
Sub NawTitle()
Application.Caption = "Кака月 хорошая погола"
End Sub
Результат выполнения макроса показан на рис. 3.2,
段 Какая хороша口 погода - Пример
圓 Файл Правка 毋旗 Вставка Форц^ 讎闫吧庵也如/嘔电
]Arial Cyr,10 * Ж A 4
Рис. 3.2. Изменение заголовка окна
Однако на рис. 3.2 видно, что после нового заголовка через дефис показано название текущего файла. Чтобы убрать это название, необходимо внестн в макрос некоторые изменения (листинг 3.9).
Листинг 3.9. Изменение заголовка окна (со скрытием названия файла)
Sub NewTitle()
Application * Caption = f,Какая хорошая погода"
ActiveWindow * Caption ="”
End Sub
После запуска данного макроса заголовок примет следующий вид (рис. 3.3),
尽 Какая хорошая погода
® файл Оравка 且на Вставка Фориат
口苗Q也鑽®学! х嚙應一
;AfialCyr▼ 10 ^ Ж /С 4 I 1
Рис. 3.3. Заголовок без названия файла
Можно сделать так, что после заголовка будет отображаться произвольный текст.
Соответствующий макрос выглядит примерно так (листинг 3.10).
Листинг 3/10. Еще один вариант изменения заголовка
Sub NewTitle ()
Application. Caption = "Какая хорошая погода*1
ActiveWindow.Caption = "А завтра будет дождь"
End Sub
Результат выполнения этого макроса показан на рис. 3.4.
良 Какая хорошая погода - А завтра будет дождь
(圖 Файл 虫зека 胃w Вставка Форцат Сервис
з 口 е з «а й е方:上电鳄- 0尸*
Arial Cyr- 10 ▼ Ж К & 售 Ж 毒
Рис. 3.4. Измененный заголовок с дополнительным текстом
Ввод данных с помощью диалогового окна
Чтобы заголовок окна программы принял свой первоначальный вид, необходимо 'запустить следующий макрос (листинг 3.11).
Листинг 3.11. Возврат к первоначальному заголовку
Sub ReturnTitle()
‘ Возвращение заголовка приложения (то есть Excel)
Application.Caption = Empty
* Указание правильного названия открытого файла (книги)*
ActiveWindow.Caption = ThisWorkbook.Name
End Sub
Этот макрос отменяет и изменения в заголовке, и ввод дополнительного текста после заголовка.
Ввод данных с помощью диалогового окна
В процессе работы могут возникать ситуации, когда для ввода данных целесообразно использовать вызываемое отдельно диалоговое окно. Решить эту задачу поможет следующий макрос (листинг 3.12).
Листш1г 3.12. Диалоговое окно ввода данных
Sub InputDialog()
Dim strinput As String
1 Вызов стандартного диалогового окна ввода данных
strinput - InputBox ("Введите данные", "Ввод данных)
End Sub
При запуске этого макроса на экране отобразится диалоговое окно, изображенное на рис. 35
Рис. 3.5. Диалоговое окно ввода данных
При необходимости можно задать текст, которьп! будет отображаться в поле ввода диалогового окна по умолчанию (с помощью аргумента Default), а также определить параметры расположения окна на экране (аргументы xpqs и ypos). Пример соответствующего макроса приведен в листинге 3.13.
Листинг 3.13. Значения по умолчаншо
Sub NewInputDialog()
Dim strinput As String
'Вызов стандартного диалогового окна ввода со значением — по умолчанию
strinput = InputBox("Введите данные", "Ввод данных", п3начение по умолчанию'*, 200, 200)
End Sub
Окно, выводимое на экран при выполнении данного макроса, представлено на рис. 36
Рис. 3.6. Текст по умолчанию в окне ввода данных
Работа в данном окне ведется по обычным правилам Windows.
Применение функции без ввода ее в ячейку
При необходимости можно воспользоваться стандартной функцией Excel таким образом, что вводить ее в ячейку не обязательно. Для этого достаточно запустить следующий макрос (листинг 3.14).
Листинг 3,14. Применение функции без ввода в ячейку
Sub Func()
[Al] = Application.Sum([В5:В10])
End Sub
Результатом работы данного макроса будет сумма диапазона ячеек В5:В10, отображаемая в ячейке А1.
Скрытие строк и столбцов от посторонних
Существует несколько небольших макросов, с помощью которых можно скрывать строки и столбцы. С некоторыми из таких макросов мы познакомимся в данном разделе.
Чтобы скрыть строку под определенным номером, можно применить следующий макрос (листинг 3.15).
Листинг 3.15. Скрытие строки
Sub Hidestring()
Rows(2).Hidden = True
End Sub
В результате применения этого макроса будет скрыта строка 2.
Можно использовать также такой макрос (листинг 3.16).
Листинг ЗЛ6. Скрытие нескольких строк
Sub Hidestrings()
Rows("3:5м).Hidden = True
End Sub
После его выполнения будут скрыты строки 3,4 н 5.
Чтобы вновь отобразить скрытую строку (или строки), необходима в соответствующих макросах изменить значение True на False, после чего запустить их на выполнение.
Похожие макросы используются для управления отображением столбцов. Например, в результате выполнения макроса, код которого приведен в листинге 3.17, будет скрыт столбец В.
Листинг ЗЛ7. Скрытие столбца
Sub HideCollumn()
Columns(2),Hidden = True
End Sub
Если в данном макросе заменить 2, например, на с, то будет скрыт столбец С (то есть в коде макроса можно указывать как порядковый номер столбца, так н соответствующую ему букву).
Для скрытия нескольких столбцов можно применить, например, такой макрос (листинг 3.18).
Листинг 3.18. Скрытие нескольких столбцов
Sub HideCollumns()
Columns t1^:?1') »Hidden = True
End Sub
В результате выполнения данного макроса будут скрыты столбцы Е н F.
Чтобы включить отображение скрытых столбцов, необходимо в соответствующих макросах заменить значение True на False и запустить их на выполнение.
Можно также скрывать строки и столбцы, ориентируясь на адрес или имя ячейки. Например, можно исполъзова'гъ такой макрос (листинг 3.19).
Листинг 3.19. Скрытие строки по имени ячейки
Sub HideCell{)
Range("Секретм)*EntireRow.Hidden ^ True
End Sub
После его применения будет скрыта строка, в которой находится ячейка с именем Секрет. Этот трюк удобно использовать, например, когда нужно срочно скрыть какие- либо данные, но адрес ячейки вспомнить не удается, а известно только ее имя. Однако при необходимости вместо имени можно указывать конкретный адрес ячейки (например, если в приведенном макросе заменить секрет на А2, то будет скрыта строка 2)*
Можно также указывать диапазон ячеек, строки с которыми нужно скрыть. Пример такого макроса приведен в листинге 3.20.
Листттг 3.20. Скрытие нескольких строк по адресам ячеек
Sub Hidecell О
R.ange ("ВЗ: D4 '*) . EntireRow. Hidden = True
End Sub
После применения данного макроса будут скрыты строки 3 и 4.
Чтобы вновь отобразить скрытую строку (или строки), необходимо в соответствующих макросах изменить значение True на False, после чего запустить нх на выполнение.
Управлять отображением столбцов также можно, исходя из адреса или имени яче甘一 км. Вот пример такого макроса (листинг 3.21).
Листинг 3.21. Скрытие столбца по имени ячейки
Sub HideCell()
Range(пСекретп).EntireColumn.Hidden 工 True
End Sub
В данном случае будет удален столбец, содержащий ячейку Секрет. Здесь также можно указывать как имя, так и адрес ячейки (например, если в приведенном макросе заменить Секрет на СЗ, то будет скрыт столбец С).
Можно использовать такой макрос (листанг 3.22),
Листинг 3.22. Скрытие нескольких столбцов по адресам ячеек
Sub HideCell()
Range(ПС2:D5 и).EntireColumn.Hidden = True
End Sub
После применения данного макроса будут скрыты столбцы С н D.
Чтобы вновь включить отображение скрытых столбцов, нужно в соответствующих макросах заменить значение True на False.
Быстрое выделение ячеек, расположенных через интервал
С помощью трюка, который рассматривается в данном разделе, можно быстро выделить любое количество ячеек, расположенных через определенный интервал. Пример макроса, который позволяет решить эту задачу, приведен в листинге 3.23,
Листинг 3.23. Выделение ячеек через интервал (вариант 1)
Sub IntervalCellSelect()
Dim intFirstRow As Integer ' Первая строка для выделения
Dim intLastRow As Integer ' Последняя строка для выделения
Dim rgCells As Range' Объединение выделяемых ячеек
Dim intRow As Integer
intFirstRow = 3
intLastRow = 300
■ Формирование объединения ячеек в столбце "В” от строки _ IntFirstRow до строки intLastRow с шагом 3
For intRow = intFirstRow То intLastRow Step 3
If rgCells Is Nothing Then
Первая ячейка в объединении
Set rgCells = Cells(intRow, 1}
Else
'Добавление очередной ячейки в объединение
Set rgCells = Union(rgCells, Cells(intRow, 1))
End If
Next
Выделение всех ячеек в объединении
rgCells.Select
End Sub
В результате выполненпя данного макроса будет выделена каждая третья ячейка, начиная с 3 и заканчивая 300, в столбце А.
Точно такой же результат (быстрое выделение ячеек с 3 по 300 в столбце А) можно получить, применив такой макрос (листонг 3.24).
Листинг 3*24. Выделение ячеек через интервал (вариант 2)
Sub IntervalCellSelect()
Dim intFirstRow As Integer ' Первая строка для выделения
Dim intLastRow As Integer' Последняя строка для выделения
Dim rgCells As Range1 Объединение выделяемых ячеек
Dim cell As Range' Текущая ячейка
Dim intRow As Integer
intFirstRow = 3
intLastRow - 300
'Формирование объединения ячеек в столбце ”В" от строки 一 intFirstRow до строки intLastRow с шагом 3
For intRow = intFirstRow То intLastRow Step 3
Set cell = Cells(intRow, 1)
Set rgCells - Union(cell, _
Ilf(intRow = intFirstRow, cell, rgCells))
Next
'Выделение всех ячеек в объединении
rgCells.Select
End Sub
Например, если есть таблица, в которой отражается выручка за каждый рабочий день недели (с понеделъншса по пятницу)» а в каждой [иестой ячейке — итоговая выручка за неделю, то с помощью этого трюка можно быстро выделить и вывести на печать итоговые данные о выручке за каждую неделю.
Для выделения различных диапазонов и ячеек можно применить следующий макрос (листинг 3.25).
Листинг 3.25. Выделение нескольких диапазонов
Sub SelectRange()
Range ("03 : D10, АЗ : Al0 , F3,T) . Select
End Sub
В результате выполнения данного макроса будут выделены диапазоны D3:D10, АЗ:А10 и ячейка F3.
Определение количества ячеек в диапазоне и суммы их значений
Применив несложный трюк, можно быстро сложить данные из указаяного диапазона ячеек. В листинге 3.26 приведен пример макроса, выполнение которого позволяет решить данную задачу.
Листинг 3.26. Сумма данных диапазона
Sub CalculateSum()
Dim i As Integer
Dim intSum As Integer
'Расчет суммы ячеек столбца "А" (с первой по пятую)
For i « 1 То 5
179179Определение коли闇ества ячеек в диапазоне и суммм мх знамени祝
179
179
intSum = intSum + Cells(i, 1)
Next
MsgBox "Сумма ячеек: ” & intSum
End Sub
В данном случае будет рассчитана сумма диапазона ячеек с 1 по 5, расположенных в столбце А.
Результат работы данного макроса представлен на рис. 3.7.
Рис. 3.7. Рассчитанная сумма диапазона ячеекРис. 3.7. Рассчитанная сумма диапазона ячеек
Рис. 3.7. Рассчитанная сумма диапазона ячеек
Рис. 3.7. Рассчитанная сумма диапазона ячеек
При выполнении данной операции следует учитывать, что если в какой-либо ячейке указанного диапазона будут не числовые данные, то на экране отобразится сообщение об ошибке. В данном случае целесообразно применить следующий макрос (листинг 3.27).
Лнстииг 3,27・ Сумма ячеек с числовыми значениями
Sub CalcuIateSum()
Dim i As Integer
Dim intSum As Integer
Расчет суммы ячеек столбца "А" (с первой по пятую)
For i = 1 То 5
If IsNumeric(Cells(i, 1)) Then
intSum ^ intSum + Cells(i, 1)
End If
Next
MsgBox "Сумма ячеек: ” & intSum
End Sub
После запуска данного макроса будет рассчитана сумма диапазона ячеек с 1 по 5, расположенных в столбце А, при этом ячейки с нечисловыми значениями будут проигнорированы.
При необходимости можно подсчитать количество ячеек, которые находятся в раз* ных выделенных диапазонах. В листинге 3.28 показан пример макроса, который позволяет это сделать.
Листинг 3.28. Подсчет количества ячеек
Sub CountOfCells()
MsgBox (Range{ИА1:A20, DI:D20n).Count)
End Sub
После выполнения данного макроса на экране отобразится окно, в котором будет указано общее количество ячеек в диапазонах А1:А20 и D1:D2O.
Подсчет именованных объектов
С помощью небольшого макроса можно быстро подсчитать количество именованных ячеек, диапазонов и формул в текущей рабочей книге. Код данного макроса выглядит следующим образом (листинг 3.29),
Листинг 3.29. Количество именованных объектов
Sub CountNames()
Dim intNamesCount As Integer
'Получаем и отображаем количество имен в активной _ рабочей книге
intNamesCount = ActiveWorkbook < Names,Count
If intNamesCount = 0 Then
MsgBox "Имен нет”
Else
MsgBox °Имен: ” & intNamesCount & ” шт."
End If
End Sub
Результат выполнения этого макроса выводится в информационном окне, которое показано на рис. 3.8.
Рис. 3.8. Подсчет количества имен
При необходимости можно подсчитать количество имен рабочей книги. Соответствующий макрос выглядит так (листинг 3.30),
Листинг 3.30. Количество имен рабочей книги
Sub CountNames()
Dim intNamesCount As Integer
'Получаем и отображаем количество имен на активном _ листе рабочей книги
intNamesCount = Names.Count
If intNamesCount = 0 Then
MsgBox мИмен нет"
Поиск начала и окончания Аиапазона^ содержащего даннь1е
Else MsgBox "Имен: ” & intNamesCount & “ шт." End If End Sub
Быстрый поиск курсора
Для быстрого поиска активной ячейки можно воспользоваться таким макросом (листинг 331).
Листинг 3,31. Поиск активной ячейки
Sub FindActiveCell()
'Выводим адрес активной ячейки
MsgBox ActiveCell.Address End Sub
Результат поиска выводится в информационном окне, пример которого представлен на рис. 3.9.
Рис. 3.9. Адрес активной ячейкиРис. 3.9. Адрес активной ячейки
Рис. 3.9. Адрес активной ячейки
Рис. 3.9. Адрес активной ячейки
Чтобы убрать значение абсолютной ссылки на строку и столбец, можно использовать следующий код:
MsgBox ActiveCell.Address(RowAbsolute:=Falsef ColumnAbsolute:=False)
Поиск начала и окончания диапазона, содержащего данные
Аналогичным образом можно быстро определить диапазон листа, в котором содержатся какие-либо данные. Данный трюк удобно применять, напримерt когда данные разбросаны по всему листу и точно неизвестно, где они начинаются и где за- 1санчиваются (а вручную просматривать весь лист долго н неудобно). Для решения этой задачи можно применить следующий макрос (листинг 3.32).
Листинг 3*32. Поиск данных
Sub FindSheetData()
'Выводим диапазон используемых ячеек листа
MsgBox ActiveSheet.UsedRange.Address
End Sub
В результате выполнения макроса на экране появится окно, аналогичное изображенному на рис, 39 в котором будет указан соответствующий диапазон рабочего листа.
Если же необходимо определить не весь диапазон с данными, а найти лишь его начало, то можно воспользоваться макросом, код которого приведен в листинге 3.33.
Листинг 3.33. Поиск начала данных
Sub FindStartOfData()
With ActiveSheet
'Заносим текст в ячейку, являющуюся левой верхней _ ячейкой используемого диапазона
.Cells(.UsedRange.Row, .UsedRange«Column).Value = _ "Начало данных11
End With
End Sub
После выполнения данного макроса в левой верхней ячейке диапазона, содержащего данные, отобразится текст Начало данных (этот текст можно изменять по своему усмотрению). Этот трюк удобно применять при работе с большими обад- макш данных, когда они разбросаны по всему рабочему листу и трудно определить точное место нх начала (особенно если первые данные диапазона находятся, например, в ячейке Т350).
Трюки с примечаниями
В данном разделе мы рассмотрим, каким образом можно быстро определить налн- чие на рабочем листе примечаний и посчитать нх, а также вывести нх в виде текста в ячейку справа либо в отдельный список.
Подсчет примечаний
По умолчанию ячейки, содержащие примечания, помечаются соответствующим индикатором, который расположен в правом верхнем углу ячейки (обычно это красный треугольник). Однако если в окне настройки параметров работы программы (данное окно вызывается командой Сервис ► Параметры) на вкладке Вид установить переключатель Примечания в положение не отображать, то ячейки с примечаниями ничем не будут отличаться от остальных ячеек рабочего листа. В данном случае, чтобы определить, имеются ли на текущем рабочем листе пртшечания и посчитать их количество, можно написать и выполнить следующий макрос (листинг 3.34).
Листинг 3.34. Подсчет примечаний
Sub CountOfComment()
Dim intCommentCount As Integer
Получение и отображение количества примечаний _ на текущем листе
intConunentCount = ActiveSheet.Comments.Count
If intCommentCount 二 0 Then
MsgBox •'Примечаний нет1*
Else
MsgBox "Примечаний: ” & intCommentCount & ” шт. End If End Sub
В результате применения макроса на экране отобразится окно, аналогичное изображенному на рис. 3.9, в котором будет показано количество содержащихся на текущем листе примечаний.
Вывод на экран всех примечаний рабочего листа
Применив несложный трюк, можно вывести все примечания, содержащиеся на рабочем листе или в выделенном его диапазоне, в ячейки, расположенные справа от соот- ветствуютопс применашгй. Решить эту задачу поможет такой макрос (листинг 3.35).
Листииг 3.35. Список примечаний
Sub ShowCoinments ()
Dim cell As Range
Dim rgCells As Range
Получение всех ячеек с приме ч а ни ями
Set rgCells = Selection.SpecialCells(xlComments)
If rgCells Is Nothing Then
* Примечаний нет Exit Sub
End If
* Проходим по всем ячейкам диапазона
For Each cell In rgCells
'Вывод примечаний в соседнюю ячейку
cell.Next.Value ^ cel1,Comment.Text
Next
End Sub
Данный макрос можно применять как к предварительно выделенному диапазону, так и к рабочему листу целиком.
勿 ПРИМЕЧАНИЕ
j陽 Если рабочий лист защищен, то данный макрос работать не будет
Для защищенных (а также остальных) рабочих листов можно применить такой макрос (листанг 3.36).
Листинг 3・36. Список примечаний защищенных листов
Sub ShowCommentsl()
Dim cell As Range
Dim strFirstAddress As String
Dim strComments As String
* Получаем все ячейки выделения, в которых есть комментарий Set cell = Selection.Find("*", Lookin:=xlComments) If Not cell Is Nothing Then
* Сохранение адреса первой найденной ячейки _ (для предотвращения зацикливания поиска)
strFirstAddress = cell.Address
Do
Добавление текста примечания в выходную строку strComments = strComments & "Комментарий: "&_ cell.Comment.Text & Chr(13)
* Продолжение поиска
Set cell = Selection.FindNext(cell)
Loop While Not cell Is Nothing And — cell.Address <> strFirstAddress
End If
If strComments <> "” Then
'Отображение окна с текстом примечаний
MsgBox strComments
Else
MsgBox r,B выделенной ячейке/ячейках комментариев нет'1 End If
End Sub
Данный макрос работает только с предварительно выделенным диапазоном рабочего листа.
Создание списка примечаний рабочего листа
Все имеющиеся на рабочем листе примечания можно вывести в виде отдельного списка, например в столбце С. Соответствующий макрос выглядит следующим образом (листинг 3.37).
Листинг 3.37. Перечень примечаний в отдельном списке (вариант 1)
Sub ListOfComments()
Dim cell As Range
Dim rgCells As Range
Dim intRow As Integer
'Получение всех ячеек с примечаниями
On Error Resume Next
Set rgCells = Selection.Specialcells(xlCoinments) If rgCells Is Nothing Then 'Примечаний нет Exit Sub
End If
' Проходим по всем ячейкам диапазона For Each cell In rgCells
'Вывод примечаний в ячейку столбца "С" intRow = intRow + 1
Cells (intRovj, 3) = cel 1 * Comment. Text
Next
End Sub
К аналогичному результату (вывод примечаний в виде списка в столбце С) приведет написание и использование такого макроса (листинг 3.38).
Листинг 3.3氏 Перечень примечаний в отдельном списке (вариант 2)
Sub ListOfCommentsl ()
Dim cell As Range
Dim strFirstAddress As String
Dim intRow As Integer
'Получение всех ячеек выделения, в которых есть примечания Set cell = Cells * Find (^*11, Lookin: ==xlComments) If Not cell Is Nothing Then
* Сохранение адреса первой найденной ячейки _ (для предотвращения зацикливания поиска)
strFirstAddress = cell *Address Do
'Вывод текста в столбец “С" intRow == intRow + 1
Cells(intRow, 3) = cell.Comment.Text 1 Продолжение поиска Set cell = Cells.FindNext(cell) Loop While Not cell Is Nothing And _ cell.Address <> strFirstAddress
End If
End Sub
Следует отметить, что столбец С взят только для примера.
Несколько трюков в одном примере
В данном подразделе мы объединим рассмотренные выше трюки в один пример, а также несколько расширим его дополнительной возможностью. Иначе говоря, реализовав данный пример, можно будет быстро получить следующие результаты: посчитать количество примечаний в текущей рабочей книге, выделить ячейки с примечаниями, отобразить сразу все примечания, вывести список примечаний текущей рабочей книги в отдельную книгу Excel и выбрать цветовую палитру для примечаний.
В первую очередь необходимо написать код, который приведен в листинге 3.39, и поместить его в редакторе VBA в стандартный модуль.
Листинг 3.39. Операции с примечаниями
Sub CountOfComments()
Dim intCommentCount As Integer
• Получение и отображение количества примечаний
intCommentCount = ActiveSheet,Comments.Count
If IntCommentCount = 0 Then
MsgBox "Текущая рабочая книга не содержит примечаний. **, vblnformation
Else
MsgBox "В текущей рабочей книге содержится ” & intCommentCount _ & ” комментариев.11, vblnformation
End If
End Sub
Sub SelectComments()
'Выделение всех ячеек с примечаниями
Cells.Specialcells(xlCellTypeComments)* Select
End Sub
Sub ShowComments()
'Отображение всех примечаний
If Application.DisplayCommentlndicator ^ xlCommentAndlndicator Then
Application.DisplaycommentIndicator = x1CommentIndiestorOnlу
Else
Application.DisplayCommentlndicator = xlCommentAndlndicator
End If
End Sub
Sub ListOfCommentsToFile()
Dim rgCells As Range' Ячейки с примечаниями
Dim intDefListCount As Integer ' Используется для временного _ хранения количества листов а книге по умолчанию
Dim strSheet As String' Имя анализируемого листа
Dim strWorkBook As String' Имя книги с анализируемым листом
Dim intRow As Integer
Dim cell As Range
* Получение ячеек с примечаниями On Error Resume Next
Set rgCells = ActiveSheet * Cells.Specialcells(xlComments)
On Error GoTo 0
'Если примечаний нет, то можно не продолжать
If rgCells Is Nothing Then
MsgBox иТекущая рабочая книга не содержит примечаний.", vblnformation
Exit Sub
End If
'Сохранение имен анализируемого листа и книги strSheet = ActiveSheet.Name strWorkBook = ActiveWorkbook.Name
'Создание отдельной книги с одним листом _ для отображения результатов
intDefListCount = Application.SheetsInNewWorkbook
Application.SheetsInNewWorkbook = 1
Workbooks *Add
Application.SheetsInNewWorkbook = intDefListCount
ActiveWorkbook.Windows(1).Caption = "Comments for ” & strSheet & ” in " & strWorkBook
'Создание списка примечаний
Cells (1, 1) = "Адрес"
Cells (1, 2) = "Содержимое11
Cells (1, 3) = "Комментарийи
Range(Cells(1, 1), Cells(lz 3)).Font.Bold = True intRow = 2' Данные начинаются co второй строки
For Each cell In rgCells
Cells(intRow, 1) ^ cell.Address(rowabsolute:=False/ _ columnabsolute:=False)
Cells(intRow, 2) = ” ” & cell.Formula
Cells(intRow, 3) = cell.comment.Text
intRow = intRow + 1
Next
End Sub
Sub ChangeCominentColor ()
'Автоматическое изменение цвета комментариев
Dim comment As comment
For Each comment In ActiveSheet.Comments
Задаем случайные цвета заливки и шрифта комментариев
comment.Shape.Fill.ForeColor.SchemeColor = Int ( (80) * Rnd 十 1)
comment♦Shape,TextFrame.Characters * Font.Colorindex = Int((56 — )* Rnd + 1)
Next
End Sub
В результате написания данного кода в окне выбора макросов (Сервис > Макрос ► Макросы) будут доступны следующие макросы:
changeCommentColor — с помощью этого макроса назначается произвольная цветовая палитра, используемая для оформления примечаний;
口 Countofcomments ——подсчитывает количество npiiMeHaiiuii;
ListOfCommentsToFile — выводит список примечаний в отдельный фам (при этом для каждой позиции списка в соответствующих столбцах отображается адрес ячейки» ее содержимое и текст примечания);
Selectcomments — выделяет ячейки с примечаниями;
showConunents — предназначен для быстрого отображения/скрытия одновременно всех примечаний.
В принципе» после написания кода можно сохрашпь текуиптй документ - он готов для дальнейшего использования. Однако для удобства работы лучше поместить в любое удобное место интерфейса кнопки (например, с помощью панели инструментов Формы, вызываемой при выполнении команды Вид ► Панели инструментов ► Формы) и назначить каждой кнопке свой макрос из перечисленных выше. После этого для получения результата достаточно будет нажать соответствующую кнопку.
Дополнение панели инструментов
При необходимости в состав стандартной панели инструментов можно добавлять по льзовательс к и е элементы управления (в частности, кнопки). Для этого можно использовать, например, такой макрос (листинг 3.40).
Листинг 3.40. Дополнение панели инструментов
Sub AddCustomCommandBa r()
'Добавление кнопки на панель инструментов
With Application.CommandBars(3> .Controls*Add(Type:=msoControlButton)
.Faceld ^ 42.Faceld ^ 42Значок WordЗначок Word
.Faceld ^ 42
.Faceld ^ 42
Значок Word
Значок Word
Примеры создания панелей инструментов
* Caption = т, Кнопка1*
.OnAction = "Макрос"
End With
End Sub
Результат выполнения данного макроса показан на рис. 3.10,
СправкаВайдите somx
^ 21 Й® «оз% •回也 Х§.
泳刈 聿津._ ♦ & • А • Автофовмат...
Рис. 3.10. Добавление кнопки на стандартную панель инструментов
Для добавления кнопки можно также использовать следующий макрос (листинг 3.41).
Листинг 3.41. Добавление кнопки на панель инструментов
Sub AddCustomButton О
' Добавление кнопки на панель инструментов
With Application.Toolbars(1).ToolbarButtons.Add(button:=222) .Name = "Кнопка" .OnAction = "Макрос"
End With
End Sub
Кнопка, добавленная на стандартную панель инструментов в результате применения этого макроса, показана на рис. 3.11.
5p^一門不注
剤Мйй國^ ,②曰MS,
:曲尊;聿津—• <5* * A * Автофоцмат.
Рис. 3.11. Добавление пользовательской кнопки
Добавленные элементы управления можно в дальнейшем настраивать (присваивать имя, назначать макрос и т. д.) по обычным правилам в режиме настройки панели инструментов.
Примеры создания панелей инструментов
В данном разделе мы рассмотрим несколько трюков, с помощью которых можно создавать пользовательские панели инструментов.
Чтобы быстро создать пользовательскую панель инструментов с одной кнопкой, можно воспользоваться следующим макросом (листинг 3.42).
Листинг 3.42・ Панель с одной кнопкой
Sub CreateCustomControlBar()
'Создание панели инструментов
With Application. CommandBars * Add (Name : =*'Панель ”, Temporary: =True) 'Создание и настройка кнопки With .Controls.Add(Type:=msoControlButton)
.Style = msoButtonlconAndCaption .Faceld = 66
.Caption = мПросто кнопка" End With * Покажем панель .Visible = True End With End Sub
Результат выполнения данного макроса представлен на рис. 3.12.
ХП^иеяь 1y х]
I 協 晩5。кнопка]
Рис. 3.12. Пользовательская панель инструментов
Обратите внимание, что в данном случае кнопка отображается со значком и подписью одновременно.
Теперь познакомимся с макросом, использование которого позволяет создать пользовательскую панель инструментов с двумя кнопками и расположить ее в левой части окна программы. Код данного макроса выглядит следующим образом (листинг 3.43).
Листинг 3.43. Панель с двумя кнопками
Sub CreateCustomControlBar()
'Создание панели инструментов
With Application.CommandBars.Add(Name: =г|Панель", Temporary: =Trtie, Position:«msoBarLeft)
' Создание и настройка первой кнопки
With .Controls.Add(Type:=msoControlButton)
.Style = msoButtonWrapCaption
.Caption = "Просто кнопка"
End With
'Создание и настройка второй кнопки
With .Controls.Add(Type:=msoControlButton)
Примеры созданин панелей инструментов
* Style = msoButtonlconAndWrapCaption .Caption 口 "Кнопка" ,Faceld = 225 End With 'Покажем панель .Visible = True End With End Sub
После запуска макроса в левой части окна программы появится пользовательская панель (рис. 3.13).
Подобным образом можно поместить пользовательскую панель в правую часть интерфейса. Для этотх) можно использовать макрос, показанный в листинге 3.44 (в данном случае создается панель с одной кнопкой).
Листинг 3,44. Создание панели справа
Sub CreateCustomControlBar()
'Создание панели инструментов
With Application.CommandBars.Add (Name: =нПравая панель**r — Temporary:=True)
Создание и настройка кнопка
With .Controls *Add(Typei=msoControlButton)
* Style = msoButtonWrapCaption
.Caption = nКнопка"
End With
'Задание позиции - справа
.Position = msoBarRight
* Покажем панель
.Visible = True
End With
Результат выполнения макроса представлен на рис. 3.14,
нI ;—•
|「「; - — 宀…二]
Добавить или удалить кнопки 「
—巒受
Рис. 3.14. Панель в правой части интерфейса
Созданные таким образом пользовательские панели инструментов автоматически добавляются в меню Вид ► Панели инструментов. Их можно настраивать (добавлять и удалять элементы управления и пр.) по обычным правилам настройки панелей инструментов.
При необходимости созданные панели можно перетаскивать мышью в любое место интерфейса.
Формирование п о л ьзовател ьс ко го меню
Возможности программы предусматривают создание и дальнейшее применение пользовательских меню, которые могут, например, входить в состав главного меню Excel. Вот пример подобного макроса (листинг 3.45).
Листинг 3.45. Создание пользовательского меню (вариант 1)
Sub AddCustomMenu()
'Добавление меню
With Appl icat ion. CommandBars (1) * Controls .Add (Type:=msoControlPopup,— Temporary:=True)
•Caption = "Архив"
With .Controls
' Добавление и настройка первого пункта
With .Add(Type:3msoControlButton)
.Faceld = 280
.Caption = "Про смотрT,
.OnAction = пМакрос1n
End With
' Добавление вложенного меню
With .Add(Type:=msoControlPopup)
•Caption = "База данных"
With .Controls
'Добавление и настройка первого пункта 一 вложенного меню
With .Add(Type:=msoControlButton)
•Faceld e 1643
.Caption = "Поставщики1*
.OnAction = " Макрос 2rt
End With
Т9МТ9М① орммрование гюльзоватепьскопэ 吋 еню
Т9М
Т9М
* Добавление и настройка второго пункта _ вложенного меню
With .Add(Type:=msoControlButton)
,Faceld = 1000
.Caption = "Покупатели11
.OnAction = нМакросЗ"
End With
End With
End With
End With
End With
End Sub
Очевидно, что данный макрос используется в комплексе с друпши макросами (Ма- крос1т Макрос2 и МакросЗ), которые разрабатываются отдельно.
В результате выполнения данного макроса в составе главного меню Excel появится меню, изображенное на рнс. 3.15.
Если макросы макрос,Макрос? и МакросЗ отсутствуют, то при выборе пунктов Просмотр, Поставщики и Покупатели, которые входят в состав пользовательского меню Архив, отобразится окно с сообщением, что требуемый макрос не обнаружен.
Такое же меню (см. рис. 3.15) появится в главном меню Excel после применения макроса, код которого приведен в листинге 3.46.
Листинг 3.46. Создание пользовательского меню (вариант 2)
Sub AddCustomMenul()
' Добавление меню с названием мАрхив1* в часть меню, _ относящуюся к рабочей книге
With MenuBars ("Worksheet") .Menus. Add (Caption: =*'Архив")
'Добавление кнопки
.MenuIterns.Add Caption:=мПросмотрм, OnAction^"Макрос1H
'Добавление подменю
With .Menuitems * AddMenu (Caption:^иБаза данных**)
'Добавление пунктов подменю
*Menultems.Add Caption:="Поставщики", OnAction:="Макрос2"
,MenuItems.Add Caption:=мПокупателин, OnAction:=лМакросЗ" End With
End With End Sub
К аналогичному результату приведет использование также такого макроса (листинг 3.47).
Листинг 3.47. Создание пользовательского меню (вариант 3)
Sub AddCustomMenu2()
Добавление меню с названием "Архивм в часть меню, относящуюся к рабочей книге
With MenuBars (nWorksheetM) .Menus .Add(Caption: ="Архив'•) 'Добавление кнопки
.Menuitems.Add Caption:="Просмотр", OnAction:=нМакрос1" 'Добавление подменю With .Menuitems.AddMenu(Caption:^"База данных"}
'Добавление первого пункта подменю With * Menuitems > Add (Caption: = "Поставщики11) 'Настройка кнопки .OnAction = "Макрос2” End With
” Добавление второго пункта подменю With .Menuitems.Add(Caption:="Покупателип) 'Настройка кнопки.
.OnAction = "МакросЗ" End With
End With
End With End Sub
Как и в первом случае, два последних макроса предусматривают использование дополнительных макросов Макрос1, Макрос2 и МакросЗ.
Проверка наличия файла по указанному пути
При необходимости можно быстро проверить, существует ли файл по указанному адресу. Чаще всего для этого используется макрос, приведенный в листинге 3.48 (путь и название файла — условные, взяты только для примера).
Листинг 3.48. Проверка наличия файла (вариант 1)
Sub VerifyFileLocation()
Dim strFileName As String
195195Проверка налиння 4>aiVia по указанному пути
195
195
Dim strFileTitle As String
'Имя и путь искомого файла strFileTitle = "prim巳r.xls" strFileName = "С:\Документы\рг1тег.xlsM 'Проверка наличия файла (функция Dir возвращает пустую _ строку, если по указанному пути файл обнаружить не удалось)
If Dir(strFileName) О "” Then
MsgBox пФайл ” & strFileTitle & “ найден" Else
MsgBox "Файл ” & strFileTitle & ” не найденn End If
End Sub
Результатом выполнения данного макроса является выводимое на экран окно, в котором сообщается, существует данный файл по указанному адресу или нет (рис. 3.16).
Рис< 3.16. Результат поиска файлаРис< 3.16. Результат поиска файлаMicrosoft ExcelMicrosoft ExcelФайл pr^ABT.xls He найден :'Файл pr^ABT.xls He найден :'
Рис< 3.16. Результат поиска файла
Рис< 3.16. Результат поиска файла
Microsoft Excel
Microsoft Excel
Файл pr^ABT.xls He найден :'
Файл pr^ABT.xls He найден :'
Для такой же проверки можно применить макрос, код которого приведен в листинге 3.49 (путь и название файла условны).
Листинг 3.49* Проверка наличия файла (вариант 2)
Sub VerifyFileLocationl() Dim strFileName As String 'Имя искомого файла strFileName = MC:\Документы\рг1тег.xlsM
Проверка наличия файла (функция Dir возвращает пустую 一 строку, если по указанному пути файл обнаружить не удалось J
If Dir(strFileName) О "” Then
MsgBox "Файл ” & strFileName & " найден1' Else
MsgBox "Зайл ” & strFileName & ” не найден'1 End If End Sub
После применения макроса на экране также появится окно, аналогичное изображенному на рис. 3*16, с информационным сообщением о результатах проверки.
В приведенных выше макросах мы напрямую указывали имя искомого файла. Однако такой подход не всегда приемлем, поэтому иногда целесообразнее использовать макрос, код которого приведен в листинге 3.50.
Листинг 3.50. Поиск нужного файла
Sub FileSearch()
Dim strFileName As String
Dim strFolder As String
Dim strFullPath As String
1 Задание имени папки для поиска
strFolder = InputBox(''Определите папку:")
If strFolder = "'• Then Exit Sub
' Задание имени файла для поиска
strFileName = Application.InputBox(нВведите имя файла:п)
If strFileName = "" Then Exit Sub
'При необходимости дополняем имя папки "\"
If Right(strFolder, 1) о "\" Then strFolder = strFolder & "\"
'Полный путь файла
strFullPath = strFolder & strFileName
'Вывод окна с отчетом о поиске средствами VBA
MsgBox ^Использование команды VBA..." & vbCrLf & vbCrLf & _ dhSearchVBA(strFullPath), vblnformation, strFull?ath
'Вывод окна с отчетом о поиске средствами объекта FileSearch
MsgBox мИспользование объекта FileSearch...° & vbCrLf & _ vbCrLf & dhSearchFileSearch (strFolder, strFileName) , vblnformation, _ strFullPath
'Вывод окна с отчетом о поиске средствами объекта — FileSystemObject
MsgBox "Использование объекта FileSystemObject..." & vbCrLf & _ vbCrLf & dhSearchFileSystemObject(strFullPath), vblnformation, strFullPath
End Sub
Function dhSearchVBA(varFullPath As Variant) As Boolean
* Использование команды VBA
dhSearchVBA = Dir(varFullPath) <> "”
End Function
Function dhSearchFileSearch(varFolder As Variant, varFileName _
As Variant) As Boolean
Автоматизация удаления файлов
'Исполь зование объекта FileSearch
With Application.FileSearch
'Создание нового поиска
・ NewSearch
' Имя для поиска
,FileName = varFileName
'Папка поиска
* Lookin = varFolder
'Собственно поиск
.Execute
dhSearchFileSearch = .FoundFiles.Count о О
End With
End Function
Function dhSearchFileSystemObject(varFullPath As Variant) As Boolean
Dim obj FSObject As Obj ect
Использование объекта FileSystemObject
Set objFSObject = CreateObject (**Scripting.FileSystemObject^) dhSearchFileSystemObject ^ objFSObject.FileExists(varFullPath)
End Function
В результате запуска макроса открывается окно, в котором указывается папка для поиска, а затем (после нажатия кнопки ОК) — имя искомого файла, В данном примере для поиска файла используются три разных метода. После ввода имени папки и файла они будут применены поочередно, и в каждом случае будет показан отдельный результат: если файл обнаружен по указанному пути, то отобразится значение True, в противном случае — False.
В результате написания приведенного выше кода, помимо макроса FileSearch, будут созданы три пользовательские функции (для доступа к ним нужно выполнить команду главного меню Вставка ► Функция п в открывшемся окне перейти в категорию Определенные пользователем). С помощью этих функций можно отдельно использовать каждый из методов, которые автоматически применяются при выполнении макроса. В данном случае в качестве аргументов функций указываются ячейки, содержащие путь к искомому файлу (при этом для функции dhSearchFileSearch путь к файлу и имя файла должны содержаться в отдельных ячейках — эта функция имеет два аргумента). Если файл обнаружен по указанному пути, то в активно访 ячейке отобразится значение истина, в противном случае — ложь.
Автоматизация удаления файлов
Используя средства VBA, можно удалять как отдельные файлы, так и группы файлов в соответствии с заданными параметрами.
Чтобы удалить отдельный файл, можно воспользоваться следующим макросом (листинг 3.51).
Листинг 3.51 ・ Удаление файла
Sub DeleteFile()
Kill МС:\Документы\рг1тег.xlsн
End Sub
В результате выполнения данного макроса будет удален файл primer. “Is, расположенный по адресу С: \Документы.
Для удаления группы файлов с определенным расширением можно использовать следующий макрос (листинг 3.52).
Листинг 3・52. Удаление группы файлов
Sub DeleteFiles()
* Удаление всех файлов с расширением XLS из заданной папки
Kill "С:'Документы” & "*.xls”
End Sub
После выполнения этого макроса из папки Документы на диске С: будут удалены все файлы, имеющие расширение XLS.
При удалении файлов с помощью приведенных макросов следует учитывать, что они не помещаются в Корзину, а окончательно удаляются с жесткого диска.
Перечень имен листов в виде гиперссылок
При необходимости можно вывести в виде списка перечень имен листов текущей рабочей книги, причем каждое имя в списке будет представлять собой гиперссылку, с помощью которой можно быстро перейти к соответствующему листу. Для этого можно воспользоваться таким макросом (листинг 3.53).
Листинг 3.53. Перечень имен рабочих листов
Sub SheetNamesAsHyperLinks()
Dim sheet As Worksheet
Dim cell As Range
With ActiveWorkbook
'Просмотр всех листов книги и создание гиперссылок на них _ на первом листе
For Each sheet In ActiveWorkbook.Worksheets
Set cell = Worksheets(1).Cells(sheet•Index, 1)
.Worksheets (1) . Hyperlinks .Add Anchor: =cell. Address :^=n'', SubAddress: = ,f'11 & sheet.Name & "'” & "!A1"
cell.Formula = sheet.Name
Next
End With
End Sub
Результат выполнения макроса показан на рис. 3.17 — имена рабочих листов выведены в виде списка, каждый элемент которого представляет собой гиперссылку.
Рис. 3.17. Список имен рабочих листов
Удаление пустых строк на рабочем листе
В процессе работы иногда возникает необходимость избавиться от пустых строк на рабочем листе. В большинстве случаев для решения данной задачи используются штатные средства программы. Однако при большом количестве пустых строк целесообразно воспользоваться макросом, код которого приведен в листинге 3.54.
Листинг 3.54. Удаление пустых строк (вариант 1)
Sub DeleteEmptyStrings()
Dim intLastRow As Integer ' Номер последней используемой строки
Dim intRow As Integer ' Номер проверяемой строки
Получение номера последней используемой строки
intLastRow = Worksheets(ActiveSheet * Index).UsedRange.Row + — Worksheets(ActiveSheet.Index).UsedRange.Rows.Count - 1
* Счетчик устанавливается на используемую первую строку
intRow = Worksheets(ActiveSheet.Index).UsedRange.Row
'Удаление пустых строк
Do While intRow <= intLastRow
If ActiveSheet.Rows (intRow) .Text = "11 Then
Удаление строки
ActiveSheet.Rows(intRow).Delete
т Данные сдвинулись вверх, поэтому номер последней _ строки уменьшился, а текущей — не изменился
intLastRow = intLastRow - 1
Else
'Текущая строка заполнена - переходам к следующей
intRow = intRow + 1
End If
Loop
End Sub
При выполнении данной операции следует учитывать, что будут удалены только пустые строки, представляющие собой «пробелы». Например, если данные хранятся в строках с 1 по 10, но при этом строки 5 H 7 пустые, то после применения макроса строки 5 и 7 будут удалены и заменены следующими за ними строками с данными, а строки 11,12,13,14, 65 536 останутся на месте.
К аналогичному результату приведет также использование следующего макроса (листинг 3*55). В данном случае удаленке пустых строк происходит снизу вверх. Это позволяет упростить ал горите, так как не нужно учитывать сдвиг данных вверх при удалении строк.
Листинг 3.55. Удаление пустых строк (вариант 2)
Sub DeleteEmptyStringsl()
Dim intRow As Integer
Dim intLastRow As Integer
* Получение номера последней используемой строки
intLastRow = ActiveSheet.UsedRange.Row + _
ActiveSheet.UsedRange * Rows.Count - 1
Удаление пустых строк
For intRow = intLastRow To 1 Step -1
If ActiveSheet.Rows(intRow).Text = "” Then ActiveSheet.Rows(intRow).Delete
End If
Next intRow
End Sub
Для удобства работы можно создать кнопку и привязать к ней какой-либо из приведенных макросов — тогда удаление пустых строк будет производиться при нажатии этой кнопки.
Запись текущих данных в текстовый файл
С помощью несложного трюка можно быстро записать все данные, хранящиеся на текущем рабочем листе, в текстовый файл. В листинге 3.56 приведен код макроса, который позволяет решить эту задачу.
Листинг 3.56. Запись в текстовый файл
Sub SaveAsText ()
Dim cell As Range
'Открытие файла для сохранения (имя файла соответствует имени _ рабочей книги, но отличается расширением - TXT)
Экспорт и импорт данных
Open ThisWorkbook. Path & "\" & ThisWorkbook.Name & r,. txtM _
For Output As #1
'Запись содержимого заполненных ячеек таблицы в файл
For Each cell In ActiveSheet.UsedRange
If Not IsEmpty(cell) Then
Print #1, cell.Address, cell.Formula
End If
Next
He забываем закрывать файл
Close #1
End Sub
К аналогичному результату приведет использование такого макроса (он отлича* ется тем, что учитывает национальные настройки) (листинг 3.57).
Листинг 3.57. Экспорт в текстовый файл
Sub SaveAsTextl()
Dim cell As Range
,Открытие файла для сохранения (имя файла соответствует имени _ рабочей книги, но отличается расширением - TXT)
Open ThisWorkbook.Path & "\" & ThisWorkbook>Name & "・txt" _
For Output As #1
' Запись содержимого заполненных ячеек таблицы в файл
For Each cell In ActiveSheet.DsedRange
If Not IsEmpty(cell) Then
Print #1, cell.Address, cell.FormulaLocal
End If
Next
'He забываем закрывать файл
Close #1
End Sub
В результате выполнения любого из указанных макросов будет создан текстовый файл, помещенный в тот же каталог, е котором находится текущая рабочая книга. Имя файла формируется следующим образом: если текущий файл называется Primer. xls, то имя созданного на его основе текстового файла будет Prime r.xls, txt. В этом файле, помимо хранящихся на рабочем листе данных, содержатся координаты ячеек, в которых расположены эти данные.
Экспорт и импорт данных
В данном разделе мы рассмотрим еще один способ экспортирования данных в текстовый файл, а также импорт данных из текстового файла.
Для решения поставленных задач нам потребуется наличие двух макросов: один — для экспорта данных, другой — для их импорта. С целью создания этих макросов напишем в стандартном модуле редактора VBA код, который представлен в листинге 3.58.
Листинг 3.58. Экспорт н импорт данных
Sub ExportAsText()
Dim IngRow As Long
Dim intCol As Integer
'Открытие файла для сохранения
Open "С: \primer. txt,T For Output As #1
'Запись выделенной части таблицы в файл (построчно) For IngRow = 1 То Selection.Rows.Count
Запись содержимого всех столбцов строки IngRow For intCol ^ 1 То Selection.Columns.Count
Write #1, Selection.Cells(IngRow, intCol).Value;
Next intCol
Начнем новую строку в файле
Print #1,"”
Next IngRow
'He забываем закрыть файл
Close #1
End Sub
Sub ImportText()
Одна строка файлаАнализируемый символ строки файла Значение для записи в ячейку Номер текущей строки Номер текущего столбцаОдна строка файлаАнализируемый символ строки файла Значение для записи в ячейку Номер текущей строки Номер текущего столбцаDim strLine As String
Одна строка файла
Анализируемый символ строки файла Значение для записи в ячейку Номер текущей строки Номер текущего столбца
Одна строка файла
Анализируемый символ строки файла Значение для записи в ячейку Номер текущей строки Номер текущего столбца
Dim strCurChar As String Dim strValue As String Dini IngRow As Long Dim intCol As Integer Dim i As Integer
'Открытие импортируемого файла
Open ИС:\primer.txtn For Input As #1
* Считываем все строки файла и записываем данные, разделенные запятой, в ячейки таблицы (начиная с текущей ячейки)
Do Until EOF(l)
'Считываем строку из файла
Line Input #1, strLine
Разбираем считанную строку
For i = 1 То Len(strLine)
strCurChar = Mid(strLine, i, 1)
If strCurChar = "「Then
* Найден разделитель столбцов - запятая. Запишем _ сформированное значение в ячейку
ActiveCell.Offset <lngRow, intCol) - strValue
intCol = intCol + 1
strValue = 1111
Elself i = Len(strLine) Then
■ Конец строки - запишем в таблицу последнее _ значение в строке (перед этим дополним его последним 一 символом строки, кроме кавычки)
If strCurChar о Chr(34} Then
strValue = strValue & strCurChar
End If
'Запись в таблицу
ActiveCell.Offset(IngRow, intCol) = strValue strValue ="”
Elself strCurChar <> Chr(34) Then
'Добавление символа в формируемое значение ячейки _ (кавычки игнорируются)
strValue = strValue & strCurChar
End If
Next i
'Переход к новой строке таблицы
intCol = О
IngRow = IngRow + 1
Loop
Закрываем файл
Close #1
End Sub
После написания приведенного кода в окне выбора макросов появятся макросы ExportAsText и importText. В соответствии в кодом макроса экспорт данных будет осуществляться в файл primer. txt, который будет создан в папке С:\Документы. Из этого же файла будут импортированы данные при выполнении макроса importText. Перед запуском макроса ExportAsText необходимо выделить диапазон, данные которого следует экспортировать в текстовый файл» Импортируемые данные будут по* мещены в то место рабочего листа, в котором установлен курсор (при этом ячейка с курсором будет являться левой верхней ячейкой импортированного диапазона).
В текстовом файле столбцы обозначаются символом 备渺(запятая).
Одновременное умножение всех данных диапазона
В данном разделе мы рассмотрим трюк, с помощью которого можно быстро умножить все числа, находящиеся в какой-либо выделенной области, на указанный
коэффициент. Для этого нам понадобится макрос, код которого приведен в листинге 3.59.
Листинг 3*59. Умножение данных
Sub MultAllCells()
Dim dblMult As Double
Dim cell As Range
* Ввод коэффициента для умножения
dblMult = InputBox ("Введите коэффициент, на который следует умножать** >
'Умножение содержимого на введенный коэффициент
For Each cell In Selection
If IsNumeric(cell.Value) And cell.Value <> "” Then
'Умножаются только ячейки, содержащие числовые данные
cell.Value = cell.Value * dblMult
Else
MsgBox nB ячейке ” & cell .Address & ” нечисловое значение1*
End If
Next
End Sub
Рассмотрим применение данного макроса на конкретном примере.
Допустим, что в ячейках Al, В2 и СЗ хранятся числовые значения ю, 15 и 20 соответственно. Выделим диапазон, охватывающий 9TH ячейки, и запустим приведенный выше макрос на выполнение. В результате откроется окно, изображенное на рис. 3.18.
Рис. 3.18. Окно ввода коэффициента
В данном окне с клавиатуры следует ввести коэффициент^ на который необходимо умножить все значения выделенной области. Еслн ввести коэффициент 2, то в ячейках Ai, В2 и СЗ значения изменятся соответственно на 20, 30 и 40.
При выполнении данного трюка не стоит забывать, что еслн в какой-либо ячейке выделенного диапазона хранится нечисловое значение, то будет выдано сообще* ние об ошибке.
Преобразование таблицы Excel в HTML-формат
В процессе работы иногда возникает необходимость в быстром преобразовании табличных данных Excel в HTML-код (например, для оперативного размещения на сайте самой свежей информации). Рассмотрим на конкретном примере, каким образом можно решить эту задачу.
Предположим, что нам необходимо преобразовать в HTML-код следующую таблицу (рис. 349).
Рис* 3.19. Таблица Excel
В данном случае следует воспользоваться макросом, код которого приведен в листинге 3.60.
Листинг 3.60. Преобразование таблицы в HTML-формат
Sub ExportAsHtml()
Dim strStyle As String Dim s七匸Align As String
'Параметры стиля отображения ячейки
' Параметры выравнивания ячейки
Dim strOut As String
1 Выходная строка с HTML-кодом
Dim cell As Object
'Обрабатываемая ячейка
Dim strCellText As String
1 Текст обрабатываемой ячейки
Dim IngRow As Long
1 Номер строки обрабатываемой ячейки
Dim IngLastRow As Long Dim strTemp As String Dim objWordApp As Object Dim i As Long
• Номер строки предыдущей ячейки
IngLastRow = Selection.Row
• Просмотр всех выделенных ячеек
For Each cell In Selection
' Значение строки для рассматриваемой ячейки IngRow = cell.Row
'Если перешли на другую строку, то вставляем <tr> If IngRow о IngLastRow Then
strOut = strOut & vbTab & u</tr>n & vbCrLf & vbTab & ,f<tr>f, & vbCrLf
Переход на следующую строку IngLastRow = IngRow End If
'Задание шрифта ячейки
If Not IsNull(cell.Font.Size) Then
strStyle = “ style=" & "font-size: ” & Int(100 * _ cell.Font.Size / 19) & ”皂;” End If
Для полужирного шрифта вставляем <Ь> If cell*Font,Bold Then strCellText = ”<b>" & strCellText & "</b>n End If
'Задание выравнивания
If cell*HorizontalAlignment = xlRight Then
По правому краю
strAlign = H align=" & "right”
Elself cell.HorizontalAlignment 工 xlCenter Then 'По центру strAlign = ” align^M & мселtern Else
По левому краю (по умолчанию) strAlign ^ ”" End If
'Чтение текста в ячейке strCellText ^ cell.Text * Если нужно, то вертикальный вывод текста (в строку strTemp с последующим перенесением обратно в strCellText) If cell.Orientation <> xlHorizontal Then
strTemp ・"”
'Печать после каждого символа специального _ разделителя - <br>
For i и 1 То Len(strCellText)
strTemp 匸 strTemp & Mid$(strCellText, i, 1) & "<br>” Next i strCellText = strTemp strStyle 二”” End If
strOut = strOut & vbT&b & vbTab & "<td" & strStyle & strAlign & ”>” & strCellText & ”v/td>” & vbCrLf
Next
'Вставка <tr> для первой строки и </tr> - для последней
strOut = vbTab & "<tr>** & vbCrLf & strOut & nbTab & "</tr>" & vbCrLf 'Вставка дескриптора <table>
strOut н ”〈table border=l cellpaddin^B cellspacing=l>,f & vbCrLf & — strOut & VbCrLf & ,,</table>,'
1 Запускаем Word и показываем в нем сформированный HTML-код Set objWordApp = CreateObject f*Word.Application") objWordApp.documents.Add objWordApp.Selection = strOut objWordApp.Selection.Copy objWordApp.Visible = True Set objWordApp = Nothing End Sub
При выполнении данного трюка не стоит забывать, что перед запуском макроса следует выделить диапазон ячеек» который предстоит конвертировать в HTML-код.
В результате применения макроса табличные данные, показанные на рис. 3.19, будут преобразованы в следующий HTML-код:
<table border=l cellpadding=3 cellspacing=l>
<tr>
<td style=font-size: 52%;>77</td>
<td style^font-size: 52%;>345</td>
</tr>
<tr>
<td style»font-size: 52%; align=right>25</td>
<td style=font-size: 52%;>851</td>
</tr>
<tr>
<td style=font-size: 52%;>44</td>
<td style=font-size: 52%;>415</td>
</tr>
<tr>
<td style-font-size: 52%;>17</td>
<td style=font-size: 52%;>25</td>
</tr>
</table>
Читатель, хотя бы немного знакомый с веб-разработками, без труда узнает знакомый стиль HTML-файла. Этот код будет открыт в отдельном окне Microsoft Word, а также скопирован в буфер обмена.
Преобразовать выделенный диапазон в HTML-формат можно и другим способом. Его отличие от приведенного выше заключается в том, что результатом преобразования будет готовый НТМ-файл, сохраненный по указанному пути. Для реализации данного примера нужно воспользоваться макросом, код которого представлен в листинге 3.6 L
Листинг 3.61. Экспорт данных в НТМ*файл
Sub ExportAsHtmlFile()Dim strStyle As String Dim strAlign As String Dim strOut As String Dim cell As ObjectDim strCellText As String Dim IngRow As LongDim IngLastRow As Long Dim strTemp As String Dim strFileName As String Dim i As LongSub ExportAsHtmlFile()Dim strStyle As String Dim strAlign As String Dim strOut As String Dim cell As ObjectDim strCellText As String Dim IngRow As LongDim IngLastRow As Long Dim strTemp As String Dim strFileName As String Dim i As LongПараметры стиля отображения ячейки Параметры выравнивания ячейки Выхолная строка с HTML-кодомПараметры стиля отображения ячейки Параметры выравнивания ячейки Выхолная строка с HTML-кодомОбрабатываемая ячейкаОбрабатываемая ячейкаТекст обрабатываемой ячейкиНомер строки обрабатываемой ячейкиНомер строки предыдущей ячейкиИмя файла для сохранения HTML-кодаТекст обрабатываемой ячейкиНомер строки обрабатываемой ячейкиНомер строки предыдущей ячейкиИмя файла для сохранения HTML-кода
Sub ExportAsHtmlFile()
Dim strStyle As String Dim strAlign As String Dim strOut As String Dim cell As Object
Dim strCellText As String Dim IngRow As Long
Dim IngLastRow As Long Dim strTemp As String Dim strFileName As String Dim i As Long
Sub ExportAsHtmlFile()
Dim strStyle As String Dim strAlign As String Dim strOut As String Dim cell As Object
Dim strCellText As String Dim IngRow As Long
Dim IngLastRow As Long Dim strTemp As String Dim strFileName As String Dim i As Long
Параметры стиля отображения ячейки Параметры выравнивания ячейки Выхолная строка с HTML-кодом
Параметры стиля отображения ячейки Параметры выравнивания ячейки Выхолная строка с HTML-кодом
Обрабатываемая ячейка
Обрабатываемая ячейка
Текст обрабатываемой ячейки
Номер строки обрабатываемой ячейки
Номер строки предыдущей ячейки
Имя файла для сохранения HTML-кода
Текст обрабатываемой ячейки
Номер строки обрабатываемой ячейки
Номер строки предыдущей ячейки
Имя файла для сохранения HTML-кода
г Запрос у пользователя имени файла для сохранения
strFileName = Application,GetSaveAsFilename(— InitialFileName:^MPrimer,htm", fileFilter:₽"HTML Files(*.htm)★・htm")
,Проверка, задал ли пользователь имя файла (если нет, то можно выходить)
If strFileName = "” Then Exit Sub
IngLastRow = Selection.Row
'Просмотр всех выделенных ячеек
For Each cell In Selection
' Значение строки для рассматриваемой ячейки
IngRow = cell,Row
* Если перешли на другую строку, то вставляем <tr>
If IngRow <> IngLastRow Then
strOut = strOut & vbTab & "</tc“ & vbCrLf & vbTab & ”<tr>" & vbCrLf
* Переход на следующую сроку
IngLastRow ^ IngRow
End If
Задание шрифта ячейки
If Not IsNull(cell.Font.Size) Then
strStyle = ” style=" & "font-size: ” & Int(100 * _ cell.Font.Size / 19) & "〜 End If г Для полужирного шрифта вставляем <b> If cell.Font.Bold Then
strCellText = УЬ>” & strCellText & "</b>" End If
' Задание выравнивания
If cell.HorizontalAlignment = xlRight Then
По правому краю
strAlign = ” align=" & иright"
Elself cell.HorizontalAlignment = xlCenter Then
По центру
strAlign = " align=" & "center11 Else
,По левому краю (по умолчанию) strAlign ="” End If 'Чтение текста в ячейке strCellText = cell.Text
' Если нужно, то вертикальный вывод текста (в строку strTemp 一 с последующим перенесением обратно в strCellText)
If cell.Orientation <> xlHorizontal Then strTemp ="”
Печать после каждого символа специального _ разделителя - <Ьг>
For i - 1 То Len(strCellText)
strTemp = strTemp & Mid$(strCellText, i, 1) & "<br>” Next i strCellText = strTemp strStyle ="” End If
strOut = strOut & vbTab & vbTab & "〈td" & strStyle & — strAlign & ">" & strCellText & "</td>” & vbCrLf
Next
'Вставка <tr> для первой строки и </tr> - для последней
strOut 二 vbTab & "<tr>” & vbCrLf & strOut & vbTab & ”</tr>" & vbCrLf 'Вставка дескриптора <table>
strOut = n<table border=l cellpadding=3 cellspacing=l>n _
& vbCrLf & strOut & vbCrLf & "</table>,'
Сохранение HTML-кода в файл
Open strFileName For Output As 1
Print #1, strOut
Close 1
* Вывод окна с информационным сообщением о результатах работы
MsgBox Selection .Count & ячеек экспортировано в файл " & _ strFileName
End Sub
После написания кода будет создан макрос ExportAsHtmlFile, результатом работы которого будет сформированный файл Primer.htm (не стоит забывать, что перед выполнением макроса необходимо выделить диапазон, данные которого должны быть преобразованы в HTML-формат). Путь для сохранения по обычным правилам Windows указывается в окне, которое открывается на экране сразу после запуска макроса (в этом же окне можно изменить имя создаваемого файлат которое предла* гается по умолчанию). По окончании преобразования на экране отобразится окно, в котором пользователю сообщается количество преобразованных ячеек и путь к созданному НТА4-файлу.
Поиск данных нештатными средствами
Как известно. Excel включает в себя штатные средства поиска требуемых данных. Однако в некоторых случаях для этого целесообразнее использовать макрос, код которого приведен в листинге 3.62.
Листинг 3.62. Поиск данных с помощью макроса
Sub Customsearch()
Dim strFindData As String
Dim rgFound As Range
Dim i As Integer
End If End With Next 'Поиск завершен. Ячейка не найдена MsgBox ("Поиск не дал результатов**) End Sub
При выполнении данного макроса открывается окно, изображенное на рис. 3.20.
Рис. 3.20. Ввод данных для поиска
В данном окне с клавиатуры следует ввести текст (число, дату и т. п.), который требуется найти, и нажать кнопку ОК. Результатом поиска будет позиционирование курсора в ячейке с искомым текстом. Если же поиск не дал результатов, то на экран будет выведено окно, изображенное на рнс. 3.21.
Рис. 3.21. Информационное сообщение
Следует отметить, что поиск данных ведется не только на текущем рабочем листе, но и на всех остальных листах открытой рабочей книги.
Включение автофильтра с помощью макроса
Как известно, включение автофильтра для выделенного диапазона осуществляется с помощью команды главного меню Данные ► Фильтр > Автофильтр. Для этого можно также воспользоваться следующим макросом (листинг 3.63).
Листинг 3・63・ Включение автофильтра
Sub EnableAutoFilter()
On Error Resume Next
Selection.AutoFilter
End Sub
Для данного макроса можно создать значок и поместить его на панель инструментов. Это позволит включать автофильтр быстрее, чем с помощью команды Данные > Фильтр > Автофильтр.
Трюки с форматированием
В данном разделе мы рассмотрим несколько трюков, с помощью которых можно быстро выполнить нестандартное форматирование выделенного диапазона.
Изменение формата представления чисел нештатными средствами
С помощью небольшого макроса можно быстро установить выделенному диапазону ячеек формат «два знака после запятой». Данный макрос выглядит следующим образом (листинг 3.64).
Листинг 3.64. Формат «два знака после запятой»
Sub ChangeNumberFormat()
Selection.NumberFormat = "0.00”
End Sub
После выполнения макроса числа в выделенном диапазоне будут отображены с двумя знаками после запятой (например, число 54 будет показано как 54,00).
Для форматирования ячеек с использованием разделителя по разрядам можно применить такой макрос (листинг 3.65),
Листинг 3.65・ Использование разделителя по разрядам
Sub ThreeNullSepatator()
Selection. NumberFormat = "#,##''
End Sub
В результате выполнения данного макроса число, например, 123 4 567 будет представлено в виде 1 234 567. Не стоит забывать, что перед запуском макроса необ- холимо выделить диапазон^ который должен быть отформатирован.
Чтобы отформатировать какой-либо диапазон с использованием разделителя по разрядам и отображением двух знаков после запятой, можно воспользоваться следующим макросом (листинг 3.66).
Листинг 3.66. Изменение формата
Sub ChangeNumerFormatEx()
Selection.NumberFormat = "#,##0.00"
End Sub
В данном случае перед запуском макроса также необходимо выделить требуемый диапазон.
Помещение последнего символа ячейки над строкой
Рассматриваемый в данном подразделе трюк позволяет преобразовать последний символ ячейки в верхний индекс. Для этого следует применить макрос, приведен* ный в листинге 3.67.
Листинг 3.67. Помещение последнего символа над строкой
Sub LastCharUp О
'Изменение расположения последнего символа ячейки
With ActiveCell.Characters(Start:=Len(Selection), Length:=l).Font
Superscript = True
End With
End Sub
В результате выполнения макроса можно в ячейке вместо значения, например, м3 получить значение м3. При этом следует учитывать, что данный макрос не преобразует числовые значения (например, представление числа 72 не изменится).
Создание нестандартной рамки
Возможности программы позволяют быстро заключить в рамку выделенный диапазон, изменив при этом вид сепсн. Для достижения такого эффекта достаточно применить следующий макрос (листинг 3.68).
Листинг 3.68. Нестандартная рамка
Sub ChangeSelGrid()
' Оформление границ выделения
'Левая граница
With Selection.Borders(xlEdgeLeft)
.LineStyle 卓 xlContinuous
.Weight = xlThin
Colorindex = xLAutomatic
End With
'Правая граница
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
,Weight = xlThin
.Colorindex = xlAutomatic
End With
'Верхняя граница
With Selection,Borders(xlEdgeTop)
.LineStyle 二 xlContinuous
.Weight = xlThin
.Colorindex = xlAutomatic
End With
'Нижняя граница
With Selection * Borders(xlEdgeBottom) .LineStyle 工 xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic
End With
'Изменение сетки внутри выделения
Вертикальные линии сетки
With Selection.Borders(xllnsideVertical) .LineStyle = xlContinuous .Weight = xlHairline .Colorindex = xlAutomatic
End With
'Горизонтальные линии сетки
With Selection.Borders(xlInsideHorizontal) * LineStyle = xlContinuous•
.Weight = xlHairline .Colorindex = xlAutomatic
End With
End Sub
Результат применения макроса показан на рис. 3.22,
Рис. 3.22. Рамка и сетка
На рисунке видно, что диапазон ячеек ограничен рамкой, а сетка внутри него представлена в виде пунктирных линий.
Быстрая вставка фамилий должностных лиц в документ
Трюк, который мы рассмотрим в данном разделе, позволяет быстро вставить в любое место документа определенный заранее текст. Эту возможность удобно использовать, например, для вставки в документ должностей м фамилий директора и главного бухгалтера предприятия (либо иных сотрудников). Данная задача реализуется с помощью макроса, код которого приведен в листинге 3.69.
Листинг 3*69* Вставка текста в документ
Sub InsertiCustomText《)
Заполнение текущей ячейки ActiveCell = 11 Генеральный директор*1 Selection.Font.Bold = True
'Фамилия на три столбца правее должности
Cells(ActiveCell.Row, ActiveCell.Column + 3).Select
ActiveCell. FormulaRlCl = "А. В. Рублев*1 Selection * Font•Bold = True
'Ячейка с nГлавный бухгалтер'1 н占 три столбца левее — и на три строки ниже ячейки с фамилией директора
Cells(ActiveCell.Row + 3, ActiveCell4 Column - 3)* Select ActiveCell 二 °Главный бухгалтер" Selection.Font•Bold = True 'Фамилия на три столбца правее должности Cells(ActiveCell.Row^ ActiveCell.Column + 3).Select ActiveCell = ”T. С. Копейкин*1 Selection.Font.Bold = True End Sub
После выполнения данного макроса соответствующий текст будет вставлен в том месте документа, где расположен курсор (рис. 3.23).
^Генеральный директорА. В. Рублев
Главный бухгалтер*t. С. Копейкин
Рис. 3.23. Вставка текста в документ
Очевидно» что с помощью приведенного выше макроса можно вставлять в теку* щий документ любой произвольный текст.
Вызов окна настройки шрифта
С помощью небольшого макроса можно вызывать окно настройки параметров шрифта. Код этого макроса выглядит так (листинг 3.70).
Листинг 3.70. Окно настройки шрифта
Sub ShowFontDialog()
'Вызов стандартного окна настройки шрифта текущей ячейки
Application.Dialogs(xlDialogActiveCellFont).Show
End Sub
После его выполнения откроется окно Формат ячеек, в котором выполняются необходимые действия. Заданные в данном окне настройки применяются к ячейке, в которой установлен курсор.
Вывод информации о текущем документе
Чтобы быстро вывести на экран информацию об имени текущего файла, названии текущего рабочего листа и количестве листов в текущей рабочей книге, можно использовать макрос, код которого приведен в листинге 3.71.
Листинг 3.71. Информация о текущем документе
Sub Showinfo О
Dim i As Integer
'Выводим имя'Выводим имяфайла рабочей книгифайла рабочей книги
'Выводим имя
'Выводим имя
файла рабочей книги
файла рабочей книги
Range("Al") = ActiveWorkbook.Name 'Выводим имя текущего листа Range(ИВ1") = ActiveSheet.Name
Выводим номера листов
For i = 1 То ActiveWorkbook * Sheets.Count
ActiveSheet.Cells(i, 3) = i
Next i
End Sub
Результат выполнения макроса представлен на рис. 3.24.
Рис. 3.24. Информация о текущем файлеРис. 3.24. Информация о текущем файле
Рис. 3.24. Информация о текущем файле
Рис. 3.24. Информация о текущем файле
В данном случае в ячейке А1 отображается имя текущего файла, в ячейке В1 — имя активного рабочего листа, а в столбце С — информация о количестве рабочих листов в текущей книге.
Вывод результата расчетов в отдельном окне
Выполнив несложный трюк, можно вывести результат расчетов, полученный с помощью формулы, в отдельном информационном окне. Для этого можно создавать самые разнообразные макросы (в зависимости от сложности расчета, содержимого ячеек и формул и т. л.). В листинге 3.72 приведен пример одного из таких макросов*
Листинг 3・72・ Окно с результатом расчетов
Sub ResultToWindoi^ ()
'Переходим на первый лист Worksheets(1).Activate 'Заносим в ячейки данные Range (ПА2'*) = 5 Range("АЗ”) = ”=А2+3" 'Выводим результат расчета MsgBox Range(пАЗ").Formula + " = "+ str(Range("АЗ").Value) End Sub
Результат выполнения данного макроса показан на рис, 3.25.
Рис. 3.25. Формула и результат
Кроме того, после выполнения макроса в ячейке А2 появится значение 5, а в ячейке АЗ — 8.
Вывод разрешения монитора
Разрешение монитора просматривается и редактируется в окне свойств экрана (Пуск ► Настройка ► Панель управления ► Зкран > Параметры). Однако для просмотра разрешения можно написать соответствующий макрос (листинг 3.73). Для определения разрешения монитора используется функция Windows API GetSystemMetrics, В качестве единственного параметра она принимает номер системной настройки, значение который необходимо узнать (в данном случае 0 — это ширина изображения, 1 — высота). Фушщия GetSystemMetrics возвращает численное значеь!ие запрашиваемого параметра.
Листинг 3.73. Разрешение монитора
1Объявление API-функции
Declare Function GetSystemMetrics Lib nuser3211 一
(ByVai nlndex As Long) As Long
,Константы, которые передаются в функцию дл月 определения 一 горизонтального я вертикального размеров изображения
Const SM_CXSCREEN = О
Const SM—CYSCREEN = 1
Sub GetMonitorResolution()
Dim IngHorzRes As Long
Dim IngVertRes As Long
' Получение ширины и высоты изображения на мониторе
IngHorzRes = GetSystemMetrics(SM_CXSCREEN)
IngVertRes = GetSystemMetrics(SM_CYSCREEN)
* Отображение сообщения
MsgBox пТекущее разрешение: 11 & IngHorzRes & "x” & IngVertRes
End Sub
После запуска макроса (в окне макросов он будет называться GetMonitorResolution) отобразится окно, в котором будет показано текущее разрешение монитора.
Что открыто в данный момент?
При работе с большим количеством рабочих книг иногда возиикает необходимость быстро узнать, какие из них открыты в данный момент. Решить эту задачу поможет следующий макрос (листинг 3.74).
Листинг 3.74. Открытые файлы
Sub WorkBooksList()
Dim book As Object
'Вывод имени каждой рабочей книги
For Each book In Workbooks
MsgBox (book.Name)
Next
End Sub
После выполнения данного макроса откроется окно с именем текущей рабочей кгш- ги. После нажатия в данном окне кнопки ОК в нем будет указано имя другой открытой книги, затем, после нажатия ОК, — следующей н т. д. Таким образом можно быстро просмотреть названия всех открытых рабочих книг.
Если книга содержит большое количество рабочих листов, то быстро просмотреть нх названия можно с помощью следующего макроса (листинг 3.75). Этот макрос отображает названия всех листов текущей рабочей книги.
Листинг 3.75. « П ере л исты ван не » книги
Sub SheetsOfBook()
Dim sheet As Object
1 Отображение имен всех листов активной рабочей книги
For Each sheet In ActiveWorkbook.Sheets
MsgBox (sheet»Name)
Next
End Sub
После запуска макроса на экране отобразится такое же окно, как при выполнении предыдущего макроса. В нем будет указано название первого рабочего листа текущей книги, а затем, после каждого нажатия кнопки ОК, — названия последующих листов.
Создание бегущей строки
Можно ли в Excel создать бегущую строку? Да, можно, и поможет нам в этом кодт приведенный в листинге 3*76.
Листинг 3.76. Создание бегущей строки
Dim intSpacesLeft As Integer ' Количество пробелов в начале строки Sub Start()
'Установка начального количества пробелов intSpacesLeft = 10
' Первый вызов функции бегущей строки
MovingString
End Sub
Sub MovingString О
If intSpacesLeft >= 0 Then 'Отображение строки
Range (ПА111) .Value = Space (intSpacesLeft) & "Привет!" intSpacesLeft = intSpacesLeft - 1 ' Указывем Excel, что данную процедуру нужно вызвать через _ 1 секунду
Application.OnTime Nov? + TimeValue(n00:00:01"), "MovingString” End If
End Sub
После запуска макроса start в ячейке Al будет отображаться бегущая строка с текстом Привет!.
Создание бегущей картинки
Возможности VBA предусматривают создание самых разных движущихся изображений. Например, с помощью приведенного в листинге 3.77 макроса из ячейки А1 включается движение надписи привет!, повернутой на 30° и написанной полужирным шрифтом.
Листинг 3.77. Бегущая картинка
Sub Movingimage()
Dim i As Integer
Dim image As Object
' Создание изображения (в ячейке "А1**) With Range(”Al")
' Формирование значения в ячейке: 'текст
•Value = пПривет!" 'полужирный шрифт .Font * Bold = True 'цвет
.Font.Color = RGB(233, 133, 229)
* размер шрифта
.Font.Size = 16 'угол наклона .Orientation = 30
'Отображение текста полностью
•EntireColumn.AutoFit
'Копирование в буфер обмена .Сору
* Создание самостоятельного изображения (на основе _ скопированных в буфер обмена данных)
Set image = ActiveSheet.Pictures.Paste(Link:=False)
Содержимое ячейки больше не нужно »Clear End With
'Задание начального положения изображения (левый верхний угол листа)
With image
•Top = О
.Left = О End With
MsgBox "ПУСК” With image
Перемещение изображения по диагонали For i = О T。 100
•Top = i ,Left = i Next
Удаление изображения
• Delete
Мигающая ячейка
End With
т Удаление ссылки на изображение
Set image = Nothing
End Sub
Чтобы картинка пришла в движение, необходимо запустить макрос, после чего в появившемся на экране окне с надписью ПУСК! (рис. 3.26) нажать кнопку ОК.
Рис. 3.26. Запуск бегущей картинкиРис. 3.26. Запуск бегущей картинки
Рис. 3.26. Запуск бегущей картинки
Рис. 3.26. Запуск бегущей картинки
Мигающая ячейка
Рассмотрим достаточно интересный трюк, с помощью которого можно заставить мигать (то есть попеременно изменять цвета) любую ячейку в течение некоторого промежутка времени.
Предположим, что нам необходима ячейка, которая 10 раз каждые 5 секунд будет изменять цвет фона с красного на зеленый. Для решения этой задачи воспользуемся следующим макросом (листинг 3.78).
Листинг 3.78< Мигание ячейки
Sub BlinkingCell()
Static intCalls As Integer ' Счетчик количества миганий
Else
Назначим ячейке зеленый цвет
Range (^Al**) . Interior .Color = RGB (0 f 255, 0)
End If
'Эту процедуру необходимо вызвать через 5 секунд
Application. OnTime Now + TimeValue (1100 : 00:05м) , "BlinkingCell" Else 'Хватит мигать
Range (**Aln) . Interior .Colorlndex = xlNone intCalls h 0 End If End Sub
После запуска макроса BlinkingCell будет мигать ячейка Al (рис. 3.27).
Рис. 3.27. Мигающая ячейка
Путем внесения соответствующих изменений в приведенный макрос можно регулировать продолжительность цикла н изменять цвета фона по своему усмотрению.
Вращающиеся автофигуры
Можно ли заставить автофигуры вращаться? Оказывается, можно, и это вовсе не так сложно, как может показаться на первый взгляд. В этом разделе мы рассмотрим, каким образом можно заставить перемещаться с одновременным вращением сразу две автофигуры.
Для реализации данного трюка нам нужно в первую очередь написать макрос, код которого представлен в листинге 3.79 (этот код нужно поместить в стандартный модуль редактора VBA)..
Листинг 3.79. Вращение автофигур
Sub RotatingAutoShapes()
Static fRunning As Boolean
'Проверка, выполняется ли уже этот макрос
If fRunning Then
'При повторном запуске останавливаем все запущенные макросы fRunning = False
End
End If
223223Вращающиеся автофигуры
223
223
* Укажем, что макрос запущен fRunning = True
Dim cell As RangeDim intLeftBorder As LongDim intRightBorder As LongDim cell As RangeDim intLeftBorder As LongDim intRightBorder As LongDim intTopBorder As Dim intBottomBorder Dim alngVertSpeed(1 Dim alngHorzSpeed(1Dim intTopBorder As Dim intBottomBorder Dim alngVertSpeed(1 Dim alngHorzSpeed(1LongAs LongTo 2) As LongTo 2) As LongLongAs LongTo 2) As LongTo 2) As LongDim ashShapes(1 To 2) As Shape Dim i As IntegerDim ashShapes(1 To 2) As Shape Dim i As IntegerРабочая ячейкаЛевая граница ячейки Правая граница ячейки Верхняя граница ячейки Нижняя граница ячейки Массивы со значениями горизонтальной и вертикальной составляющих скоростей фигур Массив перемещаемых автофигурРабочая ячейкаЛевая граница ячейки Правая граница ячейки Верхняя граница ячейки Нижняя граница ячейки Массивы со значениями горизонтальной и вертикальной составляющих скоростей фигур Массив перемещаемых автофигур
Dim cell As Range
Dim intLeftBorder As Long
Dim intRightBorder As Long
Dim cell As Range
Dim intLeftBorder As Long
Dim intRightBorder As Long
Dim intTopBorder As Dim intBottomBorder Dim alngVertSpeed(1 Dim alngHorzSpeed(1
Dim intTopBorder As Dim intBottomBorder Dim alngVertSpeed(1 Dim alngHorzSpeed(1
Long
As Long
To 2) As Long
To 2) As Long
Long
As Long
To 2) As Long
To 2) As Long
Dim ashShapes(1 To 2) As Shape Dim i As Integer
Dim ashShapes(1 To 2) As Shape Dim i As Integer
Рабочая ячейка
Левая граница ячейки Правая граница ячейки Верхняя граница ячейки Нижняя граница ячейки Массивы со значениями горизонтальной и вертикальной составляющих скоростей фигур Массив перемещаемых автофигур
Рабочая ячейка
Левая граница ячейки Правая граница ячейки Верхняя граница ячейки Нижняя граница ячейки Массивы со значениями горизонтальной и вертикальной составляющих скоростей фигур Массив перемещаемых автофигур
'Заполнение массива автофигур
Set ashShapes (1) = ActiveSheet.shapes(1)
Set ashShapes(2) = ActiveSheet.shapes(2)
'Заполнение массива скоростей: ' для первой фигуры alngVertSpeed(1) = 3 alngHorzSpeed(1) = 3 * для второй фигуры alngVertSpeed(2) = 4 alngHorzSpeed(2) = 4
' Получение границ рабочей ячейки Set cell = Range("В2") intLeftBorder = cell * Left
intRightBorder 』 cell.Left + cell.Width intTopBorder = cell.Top intBottomBorder - cell.Top + cell.Height
■ Выполнение вращения и перемещения фигур Do
'Изменение положения каждой автофигуры For i « 1 То 2
With ashShapes(i)
' Контроль достижения правой границы ячейки
If ,Left + .Width + alngHorzSpeed(i) > intRightBorder Then 'Корректировка положения *Left = intRightBorder - .Width
* Изменение направления горизонтальной скорости _ на противоположное
alngHorzSpeed(i) = -alngHorzSpeed(i)
End If
'Контроль достижения левой границы ячейки
If .Left + alngHorzSpeed(i) < intLeftBorder Then
'Корректировка положения
.Left = intLeftBorder
'Изменение направления горизонтальной скорости _ на противоположное
alngHorzSpeed(i) ^ -alngHorzSpeed(i)
End If
' Контроль достижения нижней границы ячейки
If .Top + .Height + alngVertSpeed(i) > intBottomBorder Then
* Корректировка положения
.Top r intBottomBorder - .Height
'Изменение направления вертикальной скорости 一 на противоположное
alngVertSpeed(i) = -alngVertSpeed(i)
End If
'Контроль достижения верхней границы ячейки
If .Top + alngVertSpeed(i) < intTopBorder Then
Корректировка положения
.Top = intTopBorder
'Изменение направления вертикальной скорости _ на противоположное
alngVertSpeed(i) = -alngVertSpeed(i)
End If
'Перемещение автофигуры
.Left = .Left + alngHorzSpeed(i)
.Top = .Top + alngVertSpeed(i)
* Вращение автофигуры (изменение направления вращения _ происходит каждый раз при изменении направления _ вертикального перемещения)
•IncrementRotation alngVertSpeed(i)
' Даем Excel команду обработать пользовательский ввод DoEvents
End With
Next
Loop
End Sub
Вызов таблицы цветов
Теперь в ячейке В2 нужно создать две любые автофигуры (перед этим ячейку В2
следует существенно увелшшть, сделав ее размером примерно с четверть экрана, чтобы было место для вращения автофигур).
ПРИМЕЧАНИЕ
Адрес ячейки можно устанавливать любой, но для зто「о необходимо внести соответствующие изменения в код макроса.
Теперь, запустив созданный макрос, можно полюбоваться резулыатом своей работы —автофигуры будут вращаться и одновременно перемещаться в пределах указанной ячейки. При желании можно раскрасить автофнгуры в разные цвета и уста- новить какой-нибудь фон для янейки.
Вызов таблицы цветов
Пр» необходимости можно вывести на экран таблицу цветов и соответствующих значений свойства Colorindex (данное cboiictbo задает ивдексированный цвет за- лнвкн в соответствии с палитрой цветов). Для этого создадим и запустим следующий макрос (листинг 3.80).
Листинг 3.80. Отображение таблицы цветов
Sub ShowColorTable()
Dim intColor As Integer
'Формирование заголовка таблицы
Range (Aln) Value = "Цвет"
Range ("Bl") .Value = nЗначение свойства Colorindex'*
'Покажем ячейку "А1Т, (начало таблицы) Range ("Al1') .Select ActiveWindow.ScrollRow = 1
End Sub
В результате выполнения макроса откроется таблица, изображенная на рис. 3.28.
Рис. 3.28. Таблица цветов
В столбце А данной таблицы отображается перечень цветов, а в столбце В — соответствующие им значения свойства Colorindex. На рисунке показан лишь фрагмент таблицы, поскольку полностью она состоит из 56 строк.
Создание калькулятора
Используя средства языка VBA, можно быстро создать простейший калькулятор, предназначенный для вычисления значений арифметических выражений. Пример макроса, который позволяет это сделать, приведен в листинге 3.81.
Листинг 3.81. Создание калькулятора
Sub SimpleCalculator()
Dim strExpr As String
'Ввод выражения
strExpr = InputBox(пЧто будем считать?n)
'Подсчет и вывод результата
MsgBox strExpr & " = ” & Application«Evaluate(strExpr)
End Sub
После выполнения данного макроса появится окно, изображенное на рис. 3.29.
Рис. 3・29. Калькулятор
В данном окне с клавиатуры следует ввести выражение, значение которого необходимо вычислить, и нажать кнопку ОК либо клавишу Enter. Результат расчета будет показан в информационном окне (рис. 3.30).
Рис. 3.30. Результат расчета
Если строку макроса strExpr = inputBox (|ГЧто будем считать?п) напнсать в виде, например, strExpr * InputBox ( нБыстрое вычисление11) t то окно ввода выражения будет выглядеть как на рис. 3.31*
Рис. 3.31. Замена текста
Окно результата расчета при зтом не изменится (рис. 3.32).
Рис. 3・32, Окно результата расчета
Еще о создании пользовательских меню
Мы уже рассматривали некоторые способы создания пользовательского меню (см. выше раздел «Формирование пользовательского меню冷).
Предлагаемый же в данном разделе пример является более масштабным; созданное пользовательское меню будет помещено вместо главного меню программы.
Кроме того, в этом примере можно увидеть команды созданного меню «в работе^ (то есть при выполнении команды на экране отобразится определенный результат).
Сначала рассмотрим создание пользовательского меню, которое полностью состоит из пользовательских команд. После этого ревизуем меню, в котором наряду с пользовательскими будут и штатные средства Excel.
Меню с пользовательскими командами
Для реализации данного трюка нам потребуется создать два кода. Один из них будет помещен в модуль ЭтаКнига, а другой — в стандартный модуль. Первый код выглядит следующим образом (листинг 3.82).
Листинг 3.82. Код в модуле ЭтаКнига
Sub Workbook_Open()
'Задание имени меню
strMenuName = "MyConunandBarNameи
Создание меню
CreateCustomMenu
End Sub
Sub WorkbookBeforeclose(Cancel As Boolean)
Удаление меню перед закрытием книги1
DeleteCustomMenu
End Sub
Второй код необходимо набрать в любом стандартном модуле. В нем определяется структура пользовательского меню и лорядок его работы. Содержимое данного кода представлено в листинге 3*83.
Листинг 3.83. Код в стандартном модуле
Public strMenuName As String ' Имя строки меню
Private cbrcBar As CommandBarControl
Sub CreateCustomMenu()
Dim cbrMenu As CommandBar
Dim cbrcMenu As СommandBarControl* Выпадающее меню "Меню"
Dim cbrcSubMenu As CommandBarControl ' Выпадаоцее меню к Допол нит ел ь н о11
'Если уже есть пользовательское меню, то оно удаляется DeleteCustomMenu
т Создание меню вместо стандартного
Set cbrMenu = Application.CommandBars.Add(strMenuName# msoBarTop, _ True, True)
'Создание выпадающего меню с названием "Меню1*
Set cbrcMenu = cbrMenu.Controls * Add(msoControlPopup, , , , True) With cbrcMenu
.Caption = н &Менюм
End With
* Создание пункта меню
With cbrcMenu.Controls.Add(Type:=msoControlButton, Temporary:=True)
.Caption = n&Меню1п
.OnAction = "СаИМепи!"
End With
'Создание пункта меню
With cbrcMenu.Controls.Add(Type:=msoControlButtonf _ Temporary:=True)
.Caption = "Мвню2"
.OnAction = MCallMenu2"
End With
'Создание подменю первого уровня
Set cbrcSubMenu = cbrcMenu * Controls.Add(Type:=msoControlPopup, Temporary:=True)
With cbrcSubMenu
.Caption = "Подменю!1'
.BeginGroup = True
End With
Создание пункта меню
With cbrcMenu.Controls.Add(Type:=msoControlButton, Temporary:=True)
.Caption = нВкл/Выкл"
.OnAction = "MenuOnOff"
* Style = msoButtonlconAndCaption
,Faceld =463
End With
'Создание пункта меню в подменю первого уровня
With cbrcSubMenu.Controls.Add(Type:=msoControlButtonf Temporary:=True)
.Caption = "Полманю1"
.OnAction = "CallSubMenuln
■Style = msoButtonlconAndCaption
.Faceld = 2950
.State = msoButtonDown
End With
'Создание пункта меню в подменю первого уровня (его состояние __ изменяется посредством пункта "Вкл/Выкл"), для чего сохраним ссылку на созданный пункт меню
Set cbrcBar = cbrcSubMenu.Controls >Add(Type:=msoControlButton# Temporary:=True)
With cbrcBar
.Caption = "П0лменю2"
* OnAction = MCallSubMenu2H
'Сначала меню де активировано
.Enabled = False
End With
Создание подменю второго уровня
Set cbrcSubMenu = cbrcSubMenu.Controls.Add(Type:^soControlPopup, Temporary:=True)
With cbrcSubMenu
.Caption = нПодчПодменю1"
•BeginGroup = True
End With
'Создание пункта меню в подменю второго уровня
With cbrcSubMenu.Controls.Add(Type:=msoControlButton, 一 Temporary:=True)
.Caption = "ПослМеню!11
.OnAction = ''CallLastMenulv
.Style « msoButtonlconAndCaption
.Faceld = 71
.State = msoButtonDown
End With
'Создание пункта меню в подменю второго уровня
With cbrcSubMenu.Controls.Add(Type:=msoControlButton, Temporary:=True)
.Caption = "ПослМеню2п
.OnAction = llCallLastMenu2H
・ Style = msoButtonlconAndCaption
.Faceld = 72 .Enabled = True End With
' Отображение меню cbrMenu.Visible = True Set cbrcSubMenu = Nothing Set cbrcMenu = Nothing Set cbrMenu - Nothing End Sub
Sub DeleteCustomMenu()
'Удаление строки меню On Error Resume Next Application.CommandBars(strMenuName)•Delete On Error GoTo 0 End Sub
Sub CallMenul()
'Обработка вызова Меню1
MsgBox "Приветствует меню 1!", vblnformation, ThxsWorkbook.Name End Sub Sub CallMenu2()
'Обработка вызова Меню2
MsgBox "Приветствует меню 2!", vblnformation, ThisWorkbook.Name End Sub
Sub CallSubMenu1(}
Обработка вызова Подменю1
MsgBox мПриветствует подменю 1!", vblnformation, ThisWorkboоk.Name End Sub Sub CallSubMenu2()
'Обработка вызова Подменю2
MsgBox nПриветствует подменю 2!", vblnformation. ThisWorkbook.Name End Sub
Sub CallLastMenul()
I Обработка вызова Последнего меню1
MsgBox пПриветствует последнее меню 1!", vblnformation, ThisWorkbook.Name End Sub
Sub CallLastMenu2()
* Обработка вызова Последнего меню2
MsgBox и Приветствует последнее меню 21", vbln formation. Th is Workbook, Name End Sub
Sub MenuOnOff()
Активация или деактивация пункта 11Ме ню- По дне ню 1 - Подае ню2 м
cbrcBar.Enabled = Not cbrcBar.Enabled
End Sub
Чтобы пользовательское меню отобразилось вместо главного меню программы, необходимо запустить макрос CreateCustomMenu (после написания кода данный макрос будет доступен в окне выбора макросов). Результат представлен на рис. 3.33.
Рис. 3.33. Созданное пользовательское меню
Данное меню работает следующим образом: при выполнении любой его команды появляется окно с соответствующим сообщением (рис. 3.34). Исключение составляет команда Вкл/Выкл — с ее помощью осуществляется включение/вьислючение пункта Подменю! ► Подменю^.
Рис. 3.34. Результат выбора пункта Меню1
Для возврата в первоначальное состояние следует воспользоваться макросом DeleteCustomMenu (в некоторых случаях для《отката» нужно закрыть рабочую книгу, затем вновь открыть ее и лишь после этого запустить макрос Dele teCus t omMe nu). Для доступа к данному макросу можно воспользоваться панелью инструментов Visual Basic (при отсутствии главного меню эту панель можно включить, щелкнув правой кнопкой мыши на любой панели инструментов и выбрав ее в открывшемся контекстном меню).
Замена стандартного меню пользовательским
В процессе работа иногда возникает необходимость скрыть стандартное меню н заменить его пользовательским, после чего вернуться к первоначальному состоянию. В данном подразделе мы создадим пользовательское меню, которое будет вюпачать в себя мешо Файл (это меню будет просто скопировано из стандартного меню) и меню Дополнительно.
Для реалнзаннн поставленной задачи необходимо в стандартном модуле редактора VBA написать код, представленный в листинге 3.84.
Листинг 3.84. Создание пользовательского меню
Sub CreateMenu()
Dim cbrMenu As CommandBar Dim cbrcNewMenu As CommandBarControl
'Удаление меню, если оно уже есть Call DeleteMenu
Добавление строки пользовательского меню Set cbrMenu = ConimandBars. Add (MenuBar :=True) With cbrMenu
.Name = "Моя строка меню" .Visible = True End With
Копирование стандартного меню иФайлн
CommandBars (^Worksheet Menu Bar1*) . FindControl (ID:=30002) .Copy _ CommandBars(пМоя строка меню")
' Добавление нового меню - пДополнительно" Set cbrcNewMenu = cbrMenu.Controls.Add(msoControlPopup) cbrcNewMenu.Caption = "^Дополнительно"
Добавление команды в новое маню With cbrcNewMenu.Controls.Add(msoControlButton}
< Caption = "&Восстанови*гь обычную строку меню" .OnAction = пDeleteMenun,
End With ' Добавление команды в новое меню With cbrcNewMenu.Controls,Add(Type:=msoControlButton) .Caption = *ЧС правка11 End With
End Sub
Sub DeLeteMenu()
'Пытаемся удалить меню (успешног если оно ранее создано!
On Error Resume Next
CommandBars(пМоя строка меню").Delete
On Error GoTo 0
End Sub
В результате написания данного кода будет создан макрос CreataMenu. При его выполнении вместо стандартного меню будет отображаться пользовательское, В1слючающее в себя пункты Файл (этот пункт скопирован из стандартного меню) и Дополнительно. С помощью команды Дополнительно ► Восстановить обычную строку меню осуществляется быстрое восстановление стандартного меню. Команда Дополнительно ► Справка имеет л исто демонстрационную функцию.
Склонение фамилии, имени и отчества
Трюк, который мы рассмотрим в данном разделе, удобно применять при работе со списками ФИО. С его помощью можно быстро переводить требуемые ФИО в родительный или дательный падеж. Чтобы достичь подобного эффекта, следует воспользоваться макросом, код которого приведен в листинге 3.85 (данный код записывается в стандартном модуле).
Листинг 3*85. Склонение ФИО
Public Sub PossessiveCase()
String, strName3 As String'Выделяем имя1 Выделяем фамилию'Выделяем отчествоString, strName3 As String'Выделяем имя1 Выделяем фамилию'Выделяем отчество'Склоняем ФИО в родительный падеж Dim strNamel As String, strName2 As strNamel = dhGetName(ActiveCellr 1) strName2 = dhGetName(ActiveCell, 2} strName3 工 dhGetName(ActiveCell, 3)
String, strName3 As String
'Выделяем имя
1 Выделяем фамилию
'Выделяем отчество
String, strName3 As String
'Выделяем имя
1 Выделяем фамилию
'Выделяем отчество
'Если в ячейке менеа трех слов - закрытие процедуры
If strNamel > "” Or strName2 = "" Or strName3 = "" Then Exit Sub
1 Скл。冃月ем
Cells(ActiveCell.Row^ ActiveCell.Column) = dhPossessive{ strNamel, strName2/ strName3)
End Sub
Public Sub DativeCase()
'Объявление переменных
As String,1)2)As String,1)2)strName3 As StringstrName3 As StringDim strNamel As String, strName2 strNamel = dhGetName(ActiveCell, strName2 = dhGetName(ActiveCell,
As String,
1)
2)
As String,
1)
2)
strName3 As String
strName3 As String
strName3 = dhGetName(ActiveCell, 3)
' Если в ячейке менее трех слов - закрытие процедуры
If Len (strNamel) = 0 Or Len (strName2) = 0 Or Len (strNaiue3) = 口 _ Then Exit Sub
Cells(ActiveCell.Row, ActiveCell.Column) = dhDative( _ strNamel, strName2, strName3)
End Sub
Function dhPossessive(strNamel As String# strName2 As String, strName3 As String) As String
Dim fMan As Boolean
* Определяем, мужские ФИО или женские
fMan = (Right (strNanie3, 1) = "q")
Склонение фамилии б родительный падеж
If Len(strNamel) > 0 Then If fMan Then
' Склонение мужской фамилии
Select Case Right(strNamel, I)
Case "o”, "м3 ”月匕 “a" dhPossessive = strNamel Case "й"
dhPossessive = Mid(strNamel, 1, Len(strNamel) - 2) +"qno" Case Else
dhPossessive = strNamel + "a" End Select Else
'Склонение женской фамилии
Select Case Right(strNamel, 1)
Case ”3 "m", "6","日3 "?", "д", 喉l "才1 “к", “л”, "м", "н", “пЗ "р", п©% ”т", "”,3, "ц", 'F'l _ МШ«, "£Ц","£>"
dhPossessive = strNamel Case "я"
dhPossessive ^Mid (strNamel, 1, Len (strNamel) - 2) & иой" Case Else
dhPossessive = Mid(strNamel,工,Len(strNamel) - 1) & "q货" End Select End If dhPossessive = dhPossessive & ” ”
'Склонение имени в родительный падеж If Len(strName2) > 0 Then If fMan Then 'Склонение мужского имени Select Case Right(strName2, 1) Case "й”,'%”
dhPossessive = dhPossessive & Mid{strName2,— 1, Len(strName2) - 1) & "я"
Case Else dhPossessive = dhPossessive & strName2 & "曰" End Select Else 'Склонение женского имени Select Case Right(strName2, 1) Case "a"
Select Case Mid(strName2, Len(strName2) - 1, 1) Case "w", °г° dhPossessive 二 dhPossessive & Mid( _ strName2, 1, Len(strName2) - 1) & ”n" Case Else
dhPossessive = dhPossessive & Mid(strName2, 1, Len(strName2) - 1) & ”ы"
End Select
Case "月" If Mid(strName2, Len(strName2) - 1, 1) = "m” Then dhPossessive = dhPossessive & Mid(strName2, 1, Len(strName2) - 1} & "и" Else dhPossessive = dhPossessive & Mid ^strName2, 1, Len(strName2) - 1J & "и" End If Case "ь”
dhPossessive = dhPossessive & Mid(strName2, _ 1, Len (strName2) - 1) & "и11
Case Else dhPossessive = dhPossessive & strName2 End Select End If dhPossessive = dhPossessive & ” " End If * Склонение отчества в родительный падеж If Len(strName3) > 0 Then
If fMan Then
dhPossessive = dhPossessive & strName3 & Ma"
Else dhPossessive 二 dhPossessive & Mid(strName3, 1, Len(strName3) - 1) & "r" End Xf End If End Function
Function dhDative(strNamel As String, strName2 As String, strName3 As String) As String Dim fMan As Boolean 'Определяем, мужские ФИО или женские fMan = (Right(strName3, 1) = "q”)
Склонение фамилии в дательный падеж If Len(strNamel) > 0 Then If fMan Then
'Склонение мужской фамилии Select Case Right(strNamel, I) Case "о”, "л”, "я”, "a" dhDative = strNamel Case "宓"
dhDative = Mid(strNamel, 1, Len (strNamel) - 2) + "ому" Case Else
dhDative = strNamel + "y" End Select Else 'Склонение женской фамилии Select Case Right(strNamel, 1)
Case b", "m", ”6", "в", “г”,"n", "Ю "写","к", "л", _ "м", "н% "口”『”р", "сЗ "т”,"ф”,"х\ "н”,”q", "ш", "щ" , "ь" dhDative = strNamel
Case "я”
dhDative = Mid (strNamel, 1, Len(strNamel) - 2) & '•ой'1 Case Else
dhDative = Mid(strNamelr 1f Len(strNamel) - 1) & "q货" End Select End If dhDative = dhDative & ” ” End If 'Склонение имени в дательный падеж If Len(strNam电2) > 0 Then If fMan Then
'Склонение мужского имени Select Case Right(strName2f 1) Case ”% "L dhDative = dhDative & Mid(strName2, 1f Len (strName2) * 1) & "炉 Case Else
dhDative = dhDative & strNameZ & "у” End Select Else 'Склонение женского имени Select Case Right(strName2f 1) Case "а", °яп
If Mid(strName2/ Len(strName2) - 1, 1) ^ "и" Then dhDative = dhDative & Mid(strName2x 1, Len(strName2) - 1) & 1”“
Else dhDative 工 dhDative & Mid(strName2, 1, Len(strName?) - 1) & "e” End If Case "b” dhDative = dhDative & Mid(strName2, 1, _ Len (strNaine2) - 1) & "m11 Case Else dhDative = dhDative & strName2 End Select End If dhDative = dhDative & ” ” End If 1 Склонение отчества в дательный падеж If Len (strNanie3) > 0 Then If fMan Then dhDative = dhDative & strName3 & "у" Else
dhDative = dhDative & Mid (strName3, 1 f Len (strName3) -1) & "台" End If End If End Function
Function dhGetName(strString As String, intNum As Integer) 1 Функция воэеращает слово с номером intNum во входной строке strString Dim strTemp As String Dim intWord As Integer Dim intSpace As Integer
'Удаление пробелов по краям строки
strTemp = Trim(strString)
' Просмотр строки (до слова с нужным номером)
For intWord = 1 То intNum - 1
'Поиск следующего пробела
intSpace = InStr{strTemp," ”)
If intSpace = 0 Then
'Строка закончилась
intSpace = Len(strTemp)
End If
' Строка strTemp теперь начинается co слова с номером intWord strTemp = Trim(Right(strTemp, Len(strTemp) - intSpace))
Next intWord
,Выделение нужного слова (по пробелу после него)
intSpace = InStr(strTemp," ”)
If intSpace = 0 Then
intSpace и Len(strTemp)
End If
dhGetName = Trim(Left(strTemp, intSpace))
End Function
Чтобы ФИО отобразились в родительном падеже, следует установить курсор в ячейку с этими ФИО н запустить макрос possessiveCase; в дательном падеже —макрос DativeCase (после написания кода эти макросы будут доступны в окне макросов).
■ ВНИМАНИЕ
Для реализации трюка следует соблюдать условие — ячейка должна содер- .жать не менее трех слов. В противном случае операция выполнена не будет.
Следует учитывать» что в ячейке сначала должна следовать фамилия, за ней — имя, и затем — отчество.
Данный макрос не всегда корректно обрабатывает сложные нмена и фамилии.
Получение информации об используемом принтере
С помощью небольшого макроса можно вывести на экран информацию об используемом принтере. Код макроса записывается в стандартном модуле редактора VBA и выглядит следующим образом (листинг 3.86),
Листинг 3.86. Информация о принтере
1 Объявление API-функции
Declare Function GetProfileStringA Lib "kernels?1" _ (ByVai IpAppName As String, ByVai IpKeyName As String, ByVai IpDefault As String, ByVai IpReturnedString As — String, ByVai nSize As Long) As Long
Sub Принтер()
Буфер для API-функцииСтрока с полной информациейНазвание принтераДрайвер принтераПорт принтераБуфер для API-функцииСтрока с полной информациейНазвание принтераДрайвер принтераПорт принтераDim strFullInfo As String * 255
Буфер для API-функции
Строка с полной информацией
Название принтера
Драйвер принтера
Порт принтера
Буфер для API-функции
Строка с полной информацией
Название принтера
Драйвер принтера
Порт принтера
Dim strinfo As String
Dim strprinter As String
Dim strDriver As String
Dim strPort As String
Dim strMessage As String
Dim intPrinterEndPos As Integer
Dim intDriverEndPos As Integer
'Заполнение буфера пробелами
strFullInfo = Space(255)
'Получение полной информации о принтере
Call GetProfileStringA("Windows n, nDevice", ° °, strFullInfo, 254)
'Удаление лишних символов таз конца возвращенной строки
'Строка strinfo имеет формат <имя_принтера>,<драйвер>,<порт>: strinfo = Trim(strFullInfo)
'Поиск запятых в строке (окончаний названий принтера и драйвера) intPrinterEndPos = Application.Find(",к# strinfo, 1)
intDriverEndPos = Application.Find(H,°, strinfo, intPrinterEndPos + 1)
'Определение названия принтера
strPrinter = Left(strlnfo, intPrinterEndPos - 1)
'Определение драйвера
strDriver = Mid(strinfo, IntPrinterEndPos + 1, intDriverEndPos -IntPrinterEndPos - 1)
'Определение порта (его название заканчивается символом ":”) strPort = Mid(strlnfo, intDriverEndPos + 1, InStr(1, strinfo, ”:"}
-intDriverEndPos - 1)
'Формирование информационного сообщения
strMessage = пПринтер:" & Chr(9) & strPrinter & Chr(13)
strMessage = strMessage & нДрайвер:M & strDriver & Chr (13)
strMessage = strMessage & "strPort:" & Chr(9) & strPort 'Вывод информационного сообщения
MsgBox strMessage, vblnformation, nСведения о принтере по умолчанию" End Sub
В данном примере для получения информации о принтере используется API-функция GetProfileStringA* Эта функция возвращает в строку-буфер strFulllnfo ин- формацшо в виде <имя_принтера>, <драйвер>, <порт>:.
После запуска данного макроса на экран выводится окно Сведения о принтере по умолчанию (название окна можно корректировать по своему усмотрению путем внесения соответствующих изменений в код макроса), в котором будет показана марка принтера, а также его драйвер и порт.
Вывод текущей даты и времени
Применив несложный трюк, можно в любо" момент вывести на экран окно с информацией о текущей дате и времени. Для дос-пгжения такого эф巾екта достаточно написать и запустить макрос, код которого выглядит следующим образом (листинг 3.87).
Листинг 3.87. Сообщение о дате н времени
Sub TimeAndDate()
Dim strDate As String# strTime As String Dim strGreeting As String Dim strUserName As String Dim intSpacePos As Integer strDate = Format(Date, "Long Date") strTime = Format(Time, "Medium Time”) ' Приветствие - в зависимости от времени суток If Time < TimeValue(”12:00") Then strGreeting ^ пДоброе утро, Elself Time < TimeValue (ri17 : 00") Then strGreeting = ITДобрый день, ” Else strGreeting ^ "Добрый вечер, ” End If 'В приветствие добавляется имя текущего пользователя strUserName = Application.UserName intSpacePos = InStr(1, strUserName, ” ", 1) 'Управление ситуацией, когда в имени нет пробела If intSpacePos = 0 Then intSpacePos - Len(strUserName) strGreeting = strGreeting & Left(strUserName, intSpacePos)
'Вывод на экран информационного сообщения о дате и времени
MsgBox strDate & vbCrLf & strTime, vbOKOnly, strGreeting
End Sub
После каждого выполнения данного макроса на экране будет отображаться окно с информацией о текущей дате и времени. В заголовке окна, помимо имени пользователя, будет содержаться текст Доброе утро, Добрый день либо Добрый вечер (в зависимости от времени суток).
Автоматическое создание документов Word на основе табличных данных Excel
В данном разделе мы рассмотрим трюк, с помощью которого можно автоматически создавать текстовые документы Word на основе данных, хранящихся в таблице Excel. Эта бывает необходимо, например, для быстрого формирования текстовых отчетов, в которых должны фигурировать табличные данные. Использование этого приема мы рассмотрим на конкретном примере.
Предположим, что у нас есть следующие данные о продажах по регионам (рис. 335).
Рис. 3.35. Данные о продажахРис. 3.35. Данные о продажахЕЕЗдесь приведены данные о продажах по Вашему региону за отчетный периодЗдесь приведены данные о продажах по Вашему региону за отчетный период
Рис. 3.35. Данные о продажах
Рис. 3.35. Данные о продажах
Е
Е
Здесь приведены данные о продажах по Вашему региону за отчетный период
Здесь приведены данные о продажах по Вашему региону за отчетный период
ВНИМАНИЕ
При изучении данного раздела следует обращать внимание на расположение данных на рабочем листе (то есть на координаты задействованных ячеек)*
Для автоматического создания отчетов на основании приведенных данных следует в стандартном модуле редактора VBA написать код, приведенный в листинге 3.88.
Листинг 3.88. Создание документов Word на основе таблицы Excel
Sub ReportToWord()
Количество сообщений Получатель сообщения Сумма за товарКоличество сообщений Получатель сообщения Сумма за товарDim intReportCount As Integer
Количество сообщений Получатель сообщения Сумма за товар
Количество сообщений Получатель сообщения Сумма за товар
Dim strForWho As String
Dim strSum As String
Dim strProduct As StringDim strOutFileName As StringDim strMessage As StringDim rgData As RangeDim objWord As ObjectDim i As IntegerDim strProduct As StringDim strOutFileName As StringDim strMessage As StringDim rgData As RangeDim objWord As ObjectDim i As IntegerНазвание товараИмя файла для сохранения сообщения Текст дополнительного сообщения Обрабатываемые ячейкиНазвание товараИмя файла для сохранения сообщения Текст дополнительного сообщения Обрабатываемые ячейки
Dim strProduct As String
Dim strOutFileName As String
Dim strMessage As String
Dim rgData As Range
Dim objWord As Object
Dim i As Integer
Dim strProduct As String
Dim strOutFileName As String
Dim strMessage As String
Dim rgData As Range
Dim objWord As Object
Dim i As Integer
Название товара
Имя файла для сохранения сообщения Текст дополнительного сообщения Обрабатываемые ячейки
Название товара
Имя файла для сохранения сообщения Текст дополнительного сообщения Обрабатываемые ячейки
243243Автоматунеское создание документов Word на основе данных Excel
243
243
' Создание объекта Word
Set objWord = CreateObject (MWord* Application'1)
Информация с рабочего листа
Set rgData = Range("Al")*
strMessage = Range("E6”)
'Просмотр записей на листе Лист1 intReportCount = Application.CountA(Range(ИА:АН)) For i = 1 To intReportCount
'Динамические сообщения в строке состояния Application, StatusBar = г'Создание сообщения " & i
Назначение данных переменным strForWho = rgData.Cells(i, 1) .Value strProduct = rgData*Cells(i, 2).Value strSum = Format(rgData.Cells(i, 3).Value, "#,000й)
'Имя файла для сохранения отчета
strOutFileName = ThisWorkbook.path & "\" & strForWho & ".dec" 'Передача команд в Word
With objWord
,Documents.Add With .Selection
1 Заголовок сообщения
*Font* Size = 14
.Font.Bold * True
* ParagraphFormat * Alignment - 1
,TypeText Text:r"。 T q E T"
'Дата
.TypeParagraph
.Typeparagraph .Font.Size н 12 <ParagraphFormat.Alignment 工 0 ,Font.Bold = False
.TypeText Text:="Дата:" & vbTab & _ Format (Date, "mmmm d, yyyy')
'Получатель сообщения
.Typeparagraph
.TypeText Text:=иКому: менеджеру " & vbTab & strForWho
'Отправитель
.Typeparagraph
.TypeText Text:=п0т:" & vbTab & Application.UserName
'Сообщение
.Typeparagraph
.TypeParagraph
•TypeText strMessage
.TypeParagraph
•TypeParagraph
'Название товара
.TypeText Text:=пПродано товара:M & vbTab & strProduct
•TypeParagraph
'Сумма за товар
.TypeText Text:=нНа сумму:п & vbTab & _
Format(strSum, n$#,##0n)
End With
'Сохранение документа
.ActiveDocument.SaveAs FileName:=strOutFileName
End With
Next i
'Удаление объекта Word
objWord.Quit
Set objWord = Nothing
245245Создание списка панелей инструментов м контекстнь1Х меню
245
245
примере будут созданы три документа с именами магазин 1. doc, Магазин 2. doc и магазин 3. doc. Содержимое документа магазин i.doc показано на рис. 3.36 (другие документы выглядят аналогичным образом).
ОТЧЕТ
Дата: Август 20г 2005
Кому, менеджеру Магазин 1
От: Lesha
Здесь приведены
данные о продажах по Вашему региону за отчетный период
Продано товара: Москва
На сумму: $50 000
Рис. 3.36. Документ Word, созданный на основе данных таблицы Excel
В данном примере Lesha — это имя пользователя, создавшего документ. Очевидно, что путем внесения соответствующих изменений в код макроса форму создаваемого отчета можно корректировать по своему усмотрению.
Создание списка панелей инструментов и контекстных меню
При необходимости можно сформировать на рабочем листе список доступных панелей инструментов и контекстных меню. Для этого достаточно наяисать (в стандартном модуле редактора VBA) и запустить на выполнение макрос, код которого приведен в листинге 3.89.
Листинг 3.89. Список панелей инструментов и контекстных меню
Sub ListOfMenues()
Din intRow As Integer ' Хранит текущую строку
Dim cbrBar As CommandBar
Очистка всех ячеек текущего листа
Cells.Clear
intRow м 1' Начинаем запись с первой строки
Просматриваем список панелей инструментов и меню 一 и записываем информацию о каждом элементе в таблицу
For Each cbrBar In CommandBars
'Порядковый номер
Cells(intRow, 1) = cbrBar.Index
'Название
Cells(intRow, 2) = cbrBar.Name
Тип
Select Case cbrBar.Type
Case msoBarTypeNormal
Cells (intRow, 3) = "Панель инструментов**
Case msoBarTypeMenuBar
Cells(intRow, 3) = нСтрока меню"
Case msoBarTypePopup
Cells(intRow, 3) = "Контекстное меню" End Select
* Встроенный элемент или созданный пользователем Cells(intRow, 4) ^ cbrBar.Builtln
1 Переходим на следующую строку intRow = intRow + 1
Next
End Sub
Результат выполнения данного макроса (после написания кода он будет доступен в окне списка макросов) показан на рис. 3.37*
А
Вс
D
1
2 .
1
2
Worksheet Мели Bai Строка меню Chart Menu Ваг [Строка меню
ИСТИНА
ИСТИНА
.3.'
3
Standard: Панель инструменте ИСТИНА
■д::
4
Formatting
Панель инструменте ИСТИНА
5
予
PivotTable
Chart
Пан ель инстру ме нтс ИСТИ НА гПанель инструменте ИСТИНА
7 [Reviewing
Панель инструмент^ ИСТИНА
"Tty
9jForms_
9 (Stop Recording
4nl匸、*,сь»* — 1 ГЧ*«*л
Панель инструменту ИСТИНА Панель инструмекге 5c砲照…
Пм» к* я» у,.・4+~1 14c'TIAUA
Рис. 3.37. Фрагмент списка панелей инструментов и меню
Данный список выводится на активном рабочем листе.
Создание списка пунктов главного меню Excel
Подобным образом можно сформировать список подменю и команд, входящих в главное меню программы. Для этого в стандартном модуле нужно написать следующий код (листинг 3.90).
247247Созаанме с门иска пунктов контекстных меню
247
247
Листинг 3*90. Список содержимого главного меню
Sub ListOfMenues О
Dim intRow As Integer ' Текущая строка, куда идет запись
Dim cbrcMenu As CommandBarControl1 Главное меню
Dim cbrcSubMenu As CommandBarControl1 Подменю
Dim cbrcSubSubMenu As CommandBarControl ' Подменю в подменю
'Очищаем ячейки текущего листа Cells.Clear
1 Начинаем запись с первой строки intRow = 1
' Просматриваем все элементы строки меню
On Error Resume Next ' Игнорируем ошибки
For Each cbrcMenu In ConmandBars(1).Controls
Просматриваем элементы выпадающего меню cbrcMenu For Each cbrcSubMenu In cbrcMenu.Controls
'Просматриваем элементы подменю cbrcSubMenu For Each cbrcSubSubMenu In cbrcSubMenu.Controls
'Выводим название Cells(intRow, 1)= 'Выводим название Cells(intRow, 2)= * Выводим название Cells(intRow, 3)='Выводим название Cells(intRow, 1)= 'Выводим название Cells(intRow, 2)= * Выводим название Cells(intRow, 3)=главного меню
'Выводим название Cells(intRow, 1)= 'Выводим название Cells(intRow, 2)= * Выводим название Cells(intRow, 3)=
'Выводим название Cells(intRow, 1)= 'Выводим название Cells(intRow, 2)= * Выводим название Cells(intRow, 3)=
cbrcMenu.Caption
подменю
cbrcSubMenu.Caption
вложенного подменю
cbrcSubSubMenu.Caption
'Переходим на следующую строку intRow 』intRow + 1
Next cbrcSubSubMenu
Next cbrcSubMenu
Next cbrcMenu
End Sub
После запуска макроса ListOfMenues (этот макрос появится в окне выбора макросов после написания приведенного выше кода) список подменю и команд главного меню будет сформирован на текущем рабочем листе.
Создание списка пунктов контекстных меню
Чтобы вывести аналогичный список содержимого контекстных меню программы, нужно написать и выполнить макрос, код которого приведен в листинге 3.91.
Листинг 3.91. Список содержимого контекстных меню
Sub ListOfContextMenues()
Dim intRow As Long
Dim intControl As Integer Dim cbrBar As CommandBar
'Отметка ячеек активного листа Cells.Clear
Начинаем вывод с первой строки intRow n 1
' Просмотр списка контекстных меню и вывод информации о них For Each cbrBar In CommandBars
If cbrBar * Type = msoBarTypePopup Then
Порядковый номер
Cells(intRow, 1) = cbrBar.Index 'Название
Cells(intRow, 2) = cbrBar.Name
'Просмотр всех элементов контекстного меню и вывод — названий этих элементов в ячейки текущей строки
For intControl = 1 То cbrBar.Controls.Count
Cells(intRow, intControl +2)=_ cbrBar.Controls(intControl).Caption Next intControl
Переход на следующую строку таблицы intRow = intRow + 1 End If Next cbrBar
'Делаем ширину ячеек таблицы оптимальной для просмотра Cells.EntireColumn.AutoFit
End Sub
Сформированный в результате выполнения данного макроса список будет расположен на текущем рабочем листе.
Отображение панели инструментов при определенном условии
При включении большого количества панелей инструментов (как системных, так и пользовательских) могут возникать ситуации, когда эти панели занимают значительную часть окна программы, затрудняя тем самым работу пользователя. Од-
нако можно сделать так» что пользовательская панель инструментов будет отображаться на экране только при выполнении какого-либо условия. Следует отметить, что подобная возможность уже реализована применительно к некоторым штатным панелям инструментов: например, панель Диаграммы обычно появляется автоматически при работе с диаграммами. В данном разделе мы рассмотрим прием» после реализации которого пользовательская панель инструментов будет отображаться лишь тогда, когда курсор находится в определенном диапазоне.
В модуле рабочего листа напишем следующий код (листинг 3,92).
Листинг 3*92. Код в модуле рабочего листа
Sub Worksheet_SelectionChange(ByVai Target As Excel.Rangel
'Проверка условия отображения
If Union (Target, Range (f,Al: D5M)) - Address ^ —
Range ("Al:D5r,) .Address Then
'Условие выполнено - можно показывать панель
CommandBars("AutoSense").Visible - True
Else
'Условие не выполнено - панель нужно скрыть
CommandBars("AutoSenseп)*Visible = False
End If
End Sub
Из содержимого данного кода видно, что условием отображения пользовательской панели ннструментоЕ будет выделение любой ячейки диапазона A1:D5 (либо выделение произвольного диапазона внутри данного диапазона).
Теперь необходшю написать в стандартном модуле код, содержимое которого приведено в листинге 3,93. Для начала работы с панелью необходимо запустить макрос CreatePanel.
Листинг 3.93. Код в стандартном модуле
Sub CreatePanel ()
Dim cbrBar As CommandBar
Dim button As ConunandBarButton
Dim i As Integer
i Удаление одноименной панели (при ее наличии)
On Error Resume Next
CommandBars (,TAutoSense") .Delete
On Error GoTo 0
'Создание панели инструментов
Set cbrBar = CommandBars * Add
' Создание кнопок и их настройка For i = 1 То 4
Set button = cbrBar.Controls.Add(msoControlButton) With button .OnAction = "ButtonClick" & i .Faceld = i + 37 End With Next i cbrBar.Name = "AutoSense" End Sub Sub ButtonClick3() 'Перемещение вниз On Error Resume Next ActiveCell.Offset(lf 0).Activate End Sub
Sub ButtonClickl() 'Перемещение вверх On Error Resume Next ActiveCell.Offset(-1f 0).Activate End Sub
Sub ButtonClick2() 1 Перемещение вправо On Error Resume Next ActiveCell.Offset(0, 1).Activate End Sub
Sub ButtonClick4() 'Перемещение влево On Error Resume Next ActiveCell*Offset(0, -1).Activate End Sub
Созданная панель инструментов называется AutoSense н включает в себя четыре кнопки со стрелками, предназначенные для перемещения курсора на одну ячейку в соответствующем направлении. Эта панель будет отображаться только при условии, что курсор расположен внутри диапазона A1:D5. Если курсор вывести из этого диапазона даже с помощью кнопок данной панели, то она перестанет отображаться и появится вновь только при соблюдении указанного условия.
Скрытие и отображение панелей инструментов
Как известно, управле】ше отображением панелей инструментов осуществляется с помощью соответствующих команд подменю Вид ► Панели инструментов. Однако данный способ имеет существенный недостаток — чтобы скрыть панели инструментов, необходимо в данном меню последовательно выбрать каждую из них, н то же самое нужно сделать для включения их отображения* При использовании большого количества панелей инструментов ла это требуется слишком много времени. В данном разделе мы научимся быстро управлять отображением сразу всех используемых панелей.
I ВНИМАНИЕ
JДля успешной реализации данного примера в текущей рабочей книге дол.жен находиться лист Лист1. В противном случае необходимо внести соот
ветствующие изменения в приведенный ниже код.
В стандартном модуле редактора VBA напишем следующий код (листинг 3.94).
Листинг 3.94. Управление отображением панелей инструментов
Sub HidePanels ()
Dim cbrBar As CommandBar
Dim intRow As Integer' Номер текущей строки листа
Отключение обновления экрана
Application > ScreenUpdating = False
'Подготовка к сохранению
Cells.Clear
Скрытие видимых панелей и сохранение их названий
intRow = 1• Запись имен с первой строки
For Each cbrBar In CommandBars
If cbrBar.Type = msoBarTypeNormal Then
If cbrBar.Visible Then
cbrBar,Visible = False
Cells(intRow, 1) = cbrBar.Name
intRow = intRow + 1
End If
End If
Next
'Включение обновления экрана
Application * ScreenUpdating = True
End Sub
Sub ShowPanels()
Dim cell As Range1 Текущая ячейка листа
'Отключение обновления экрана
Application.Screenupdating - False
'Отображение скрытых панелей
On Error Resume Next
For Each cell In Range(^AiA").Specialcells( _ xlCellTypeConstants)
CommandBars (cell*Value).Visible ^ True
Next cell
1 Включение обновления экрана .
Application.Screenupdating ^ True
End Sub
После написания кода в окне выбора макросов появятся два макроса: HidePanels и ShowPanels. При выполнении первого макроса все используемые панели инструментов будут скрыты, а при выполнении второго они восстановятся на прежних местах. На рабочем листе Лист1 будет храниться перечень скрытых панелей. Для удобства работы можно назначить обоим макросам кнопки и поместить нх на рабочий лист (но не на какую-ннбуд1b панель инструментов).
Создание меню на основе данных рабочего листа
Рассмотрим еще один способ создания пользовательского меню, которое включается в состав главного меню программы. Характерной особенностью данного способа является то, что основой для формирования меню будут хранящиеся на рабочем листе данные.
В качестве исходных данных для создания пользоватсльского меню используем содержимое листа Ли ст1 (рис. 3.38).
Теперь в модуле ЭтаКнига напишем такой код (листинг 3.95)*
Листинг 3.95. Код в модуле ЭтаКнига
Sub Workbook_Open()
'Создание меню
Call CreateCustomMenu
End Sub
Sub Workbook_BeforeClose(Cancel As Boolean)
' Удаление меню перед закрытием книги
Call DeleteCustomMenu
End Sub
в
с
D
Е J
Уровень 5 ПодписьчПозиция/Макрос Разделитель
1 ;&Выручка10
Gceib"
烹
2;&Оптован торговля
4J
3;&Москва
GoToAssumptions
5
3:&Киев
GoToModel
6
3 &Минск
GoToScenarios
<О^са
GoToNotes
2;&PgH 悖
ViewScenarios
2,&Ввод данных
DataEntry
ИСТИНА
387!
10
2;&Печать документов
Printing
ИСТИНА
4
и
2<&Диаграммы
3^Продукты питания
ViewChartl
4^(
f3
3?&ТНП
ViewChart2
436
14
3 8<Сопутствующие товары iViewChart3
427:
15
2:&Справзная информация
ИСТИНА
16
3| ^Подакцизный товар
Helpl
17
3 ^Лицензионный товар
Help2
18
J ^Прочее
Help3
ИСТИНА
И 4
1ене
Рис. 3.38. Исходные данные
Следующий код (листинг 3.96) необходимо написать в стандартном модуле.
Листинг 3.96, Код в стандартном модуле
Sub CreateMenv()Dim sheet As WorksheetDim intRow As IntegerDim cbrpBar As CommandBarPopup Dim objNewItem As Object Dim objNewSubItem As Object Dim intMenuLevel As Integer Dim strCaption As String Dim strAction As String Dim fIsDevider As Boolean Dim intNextLevel As IntegerDim strFacelD As String' Расположение данных для меню Set sheet =Sub CreateMenv()Dim sheet As WorksheetDim intRow As IntegerDim cbrpBar As CommandBarPopup Dim objNewItem As Object Dim objNewSubItem As Object Dim intMenuLevel As Integer Dim strCaption As String Dim strAction As String Dim fIsDevider As Boolean Dim intNextLevel As IntegerDim strFacelD As String' Расположение данных для меню Set sheet =Лист с описанием менюЛист с описанием меню* Считываемая строка' Выпадающее меню1 Элемент меню cbrpBar'Элемент подменю objNewItem'Уровень вложенности пункта меню'Название пункта меню'Макрос пункта меню* Нужен разделитель1 Уровень вложенности следующего __ пункта меню'Номер значка пункта меню* Считываемая строка' Выпадающее меню1 Элемент меню cbrpBar'Элемент подменю objNewItem'Уровень вложенности пункта меню'Название пункта меню'Макрос пункта меню* Нужен разделитель1 Уровень вложенности следующего __ пункта меню'Номер значка пункта менюThisWorkbook.Sheets(иЛистМенюн)ThisWorkbook.Sheets(иЛистМенюн)
Sub CreateMenv()
Dim sheet As Worksheet
Dim intRow As Integer
Dim cbrpBar As CommandBarPopup Dim objNewItem As Object Dim objNewSubItem As Object Dim intMenuLevel As Integer Dim strCaption As String Dim strAction As String Dim fIsDevider As Boolean Dim intNextLevel As Integer
Dim strFacelD As String
' Расположение данных для меню Set sheet =
Sub CreateMenv()
Dim sheet As Worksheet
Dim intRow As Integer
Dim cbrpBar As CommandBarPopup Dim objNewItem As Object Dim objNewSubItem As Object Dim intMenuLevel As Integer Dim strCaption As String Dim strAction As String Dim fIsDevider As Boolean Dim intNextLevel As Integer
Dim strFacelD As String
' Расположение данных для меню Set sheet =
Лист с описанием меню
Лист с описанием меню
* Считываемая строка
' Выпадающее меню
1 Элемент меню cbrpBar
'Элемент подменю objNewItem
'Уровень вложенности пункта меню
'Название пункта меню
'Макрос пункта меню
* Нужен разделитель
1 Уровень вложенности следующего __ пункта меню
'Номер значка пункта меню
* Считываемая строка
' Выпадающее меню
1 Элемент меню cbrpBar
'Элемент подменю objNewItem
'Уровень вложенности пункта меню
'Название пункта меню
'Макрос пункта меню
* Нужен разделитель
1 Уровень вложенности следующего __ пункта меню
'Номер значка пункта меню
ThisWorkbook.Sheets(иЛистМенюн)
ThisWorkbook.Sheets(иЛистМенюн)
'Удаление одноименно го меню (при его наличии) Call DeleteMenu
' Данные считываем со второй строки intRow - 2
Добавление меню Do Until IsEmpty(sheet.Cells(intRow, 1))
■' Считываем информацию о пункте меню With sheet
'Уровень вложенности intMenuLevel = .Cells(intRow, 1) 'Название strCaption = * Cells(intRow, 2) 'Название макроса для меню strAction = .Cells(intRow, 3) 'Нужен ли разделитель перед меню? fIsDevider = .Cells(intRow, 4)
Номер стандартного значка (если значок нужен) strFacelD = -Cells(intRow, 5) 'Уровень вложенности следующего меню intNextLevel = «Cells(intRow + 1, 1) End With 'Создаем меню в зависимости от уровня его вложенности Select Case intMenuLevel
Case 1
'Создаем меню
Set cbrpBar = Application.CommandBars(1). _ Controls.Add(Type:«msoControlPopup, _ Before:=strAction, Temporary:=True)
cbrpBar * Caption = strCaption Case 2
* Создаем элемент меню If intNextLevel = 3 Then
* Следующий элемент вложен в создаваемый, то есть создаем раскрывающееся подменю
Set objNewItem = 一 cbrpBar * Controls.Add(Type:=msoControlPopup)
Else
'Создаем команду меню Set objNewItem - _
cbrpBar.Controls.Add(Type:=msoControlButton) obj Newltem.OnAction = strAction
End If
'Установка названия нового пункта меню objNewItem.Caption ^ strCaption
'Установка значка нового пункта меню (если нужно) If strFacelD <> "*' Then
objNewItem,Faceld = strFacelD
End If
' Если нужно, то добавим разделитель If flsDevider Then
objNewltem,BeginGroup « True
End If
Case 3
'Создание элемента подменю
Set objNewSubltem « — objNewItem*Controls.Add(Type:=msoControlButton)
'Установка его названия
objNewSubltem.Caption = strCaption 'Назначение макроса (или команды) objNewSubltem.OnAction = strAction 'Установка знайка (если нужно) If strFacelD о "” Then
obj NewSubltem.Faceld = strFacelD End If
* Если нужно г то добавим разделитель If flsDevider Then
objNewSubltem.BeginGroup = True End If End Select
'Переход на следующую строку таблицы
intRow = intRow + 1
Loop
End Sub
Sub peleteMenu()
Dim sheet As Worksheet ' Лист с описанием меню
Dim intRow As Integer * Считываемая строка
Dim strCaption As String * Название меню
Set sheet = ThisWorkbook. Sheets ("ЛистМеню*1)
I Данные начинаются co второй строки intRow = 2
'Считываем данные, пока есть значения в столбце "А”, 一 и удаляем созданные ранее меню (с уровнем вложенности 1)
On Error Resume Next
Do Until IsEmpty(sheet.Cells(intRow, 1))
If sheet.Cells(intRow, 1) = 1 Then strCaption ^ sheet.Cells(intRow, 2) Application.CommandBars(1).Controls(strCaption).Delete End If intRow = intRow + 1
Loop
On Error GoTo 0
End Sub
После написания данного кода в окне выбора макросов появятся макросы CreateMenu л DeleteMenu — соответственно для создания и удаления пользовательского меню. Для удобства работы можно назначить каждому мшсросу кнопки.
Пользовательское меню, созданное на основании приведенных на рис. 3.38 исходных данных, показано на рис. 3.39.
Рис. 3.39. Пользовательское меню Выручка
Новое меню будет автоматически формироваться при каждом открьтш рабочей KHimi и удаляться при ее закрытии.
Создание контекстного меню
В предыдущих разделах мы рассматривали различные способы формирования пользовательских меню, включаемых в состав главного меню программ— Здесь же мы научимся создавать контекстное меню.
Итак, создадим пользовательское контекстное меню со следующими командами; Числовой формат, Выравнивание, Шрифт, Границы, Узор и Защита. С помощью этих команд на экран будет выводиться окно форматирования ячейки (вызываемое также с помощью команды главного меню Формат ► Ячейки) с соответствующей открытой вкладкой. Созданное меню будет вызываться щелчком правой кнопкой мыши в любой ячейке диапазона A2:D5.
Для решения поставленной задачи необходимо написать три кода: в модуле рабочего листа, в модуле ЭтаКнига н в стандартном модуле.
Код, который нужно поместить в модуль рабочего листа, выглядит следующим образом (листинг 3.97).
Листинг 3.97. Код в модуле рабочего листа
Sub Worksheet_BeforeRightClick(ByVai Target As Excel.Range, Cancel As Boolean)
'Проверка, попадает ли выделенная ячейка в диапазон
If Union (Target .Range (nAl") , Range (nA2 :D5'f) ) .Address = _
Range("A2:D5")* Address Then
'Показываем свое контекстное меню
CommandBars ("MyContextMenu) . ShowPopup Cancel = True
End If
End Sub
После этого в модуль Эта Книга необходимо поместить код, приведенный в листинге 3.98*
Листинг 3.98. Код в модуле ЭтаКнига
Sub Workbook__Open ()
' Создание контекстного меню при открытии книги
Call CreateCustomContextMenu
End Sub
Sub Workbook_BeforeClose(Cancel As Boolean) т Удаление меню при закрытии книги Call DeleteCustomContextMenu
End Sub
В стандартном модуле нужно написать самый большой код — его содержимое представлено в листинге 3.99.
Листинг 3.99. Код в стандартном модуле
Sub CreateCustomContextMenu(I
' Удаление одноименного меню Call DeleteCustomContextMenu
'Кнопка "Выравнивание” With .Add(msoControlButton) .Caption = *4 Выравнивание...и .OnAction = "ShowFormatAlignment” .Faceld = 217
End With 'Кнопка "Шрифт" With .Add(msoControlButton) .Caption = **&Шрифт. . •" .OnAction = и ShowFormatFontn .Faceld - 291
End With
'Кнопка ** Границы1*
With .Add(msoControlButton) .Caption = н&Границы...n .OnAction = "ShowFo rma tBo rde r" .Faceld = 149 .BeginGroup = True
End With
'Кнопка мУзор"
With .Add(msoControlButton) .Caption = "&Узор.・." .OnAction = и ShowFormatPatterns" -Faceld = 1550
End With 'Кнопка "Защита" With .Add(msoControlButton) .Caption = ”&3ащита・・." .OnAction = "ShowFormatProtection” .Faceld = 2654
End With
End With
End Sub
Sub DeleteCustomContextMenu()
'Удаление меню
On Error Resume Next
CommandBars (,rMyContextMenuH) .Delete End Sub
Sub ShowFormatNumber()
* Число
Application * Dialogs(xlDialogFormatNumber).Show End Sub
Sub ShowFormatAlignment()
Выравнивание
Application•Dialogs(xlDialogAlignment).Show
End Sub
Sub ShowFormatFont()
■ Шрифт
Application.Dialogs(xlDialogFormatFont).Show
End Sub
Sub ShowFormatBorder()
'Граница
Application.Dialogs(xlDialogBorder).Show
End Sub
Sub ShowFormatPatterns()
'Вид (Узор)
Application.Dialogs(xlDialogPatterns).Show
End Sub
Sub ShowFormatProtection()
'Защита
Application.Dialogs(xlDialogCellProtection).Show
End Sub
После написания данного кода будут сформированы макросы создания пользовательского контекстного меню (CreateCustomContextMenu) и его удаления (DeleteCustomContextMenu), а также макросы, привязанные к командам созданного меню и предназначенные для вызова соответствующих вкладок диалогового окна Формат ячеек.
После выполнения макроса CreateCustomContextMenu будет сформировано контекстное меню, изображенное на рис. 3.40.
Это меню будет вызываться при щелчке правой кнопкой мыши в любой ячейке диапазона A2:D5.
С помощью его команд осуществляется быстрый переход к соответствующей вкладке окна форматирования активной ячейки.
Просмотр содержимого папки
В процессе работы может возннкатЕ, необходимость просмотра содержимого той или иной папки (например, для поиска требуемого файла). Чтобы ускорить данный процесс и не запускать для этой цели Проводник, рекомендуется воспользоваться макросом, код которого приведен в листинге 3.100.
Листинг 3.100. Просмотр содержимого папки
'Объявление API-функции для отображения стандартного окна _ просмотра папок
Declare Function SHBrowseForFolder Lib "shell32.dll" _
Alias "SHBrowseForFolderA*1 (IpBrowselnfo As BROWSEINFO) As Long
Объявление API-функции для преобразования данных, возвращаемых _ функцией SHBrowseForFolder, в строку
Declare Function SHGetPathFromIDList Lib "sh31132.dll" _ Alias nSHGetPathFromIDListAn (ByVai pidl As Long, ByVai _ pszPath As String) As Long
'Структура используется функцией SHBrowseForFolder
Type BROWSEINFO
hwndOwner As Long ' Родительское окно (для диалога)
pidlRoot As Long' Корневая папка для просмотра
strDisplayName As String
strTitle As String * Заголовок окна
ulFlags As Long' Флаги для окна
'Следующие три параметра в VBA не используются
Ipfn As Long
IParam As Long
ilmage As Long
End Type
Sub BrowseFolder()
Dim strPath As String * Папка, список файлов которой выводится
Dim strFile As String
Dim intRow As Long ' Текущая строка таблицы
' Выбор папки
strPath = dhBrowseForFolder()
If strPath = "” Then Exit Sub
If Right(strPath, 1} <> n\" Then strPath = strPath & "\"
'Оформление заголовка отчета
ActiveSheet.Cells•ClearContents
ActiveSheet. Cells (1, 1) = "Имя файла **
ActiveSheet.Cells(1, 2) ^ "Размер” ActiveSheet.Cells(1, 3) - иДата/время" ActiveSheet. Range ("Al: Cl **) , Font • Bo Id = True
Просмотр объектов в папке••*
Первый объект папки strFlle = Dir(strPath, 7} in t Row = 2 Do While strFile <> "”
* Запись в столбец "А” имени файла ActiveSheet*Cells(intRow, 1) = strFile 'Запись в столбец "В" размера файла ActiveSheet.Cells(intRow, 2) = FileLen(strPath & strFile) 'Запись в столбец "С” времени изменения файла ActiveSheet.Cells(intRow, 3)二 FileDateTime(strPath & strFile) 1 Следующий объект папки strFile = Dir intRow « intRow + 1
Loop End Sub
Function dhBrowseForFolder() As String
Dim biBrowse As BROWSEINFO
Dim strPath As String Dim IngResult As Long Dim intLen As Integer
'Заполнение полей структуры BROWSEINFO
'Корневая папка - Рабочий стол biBrowse.pidlRoot = 0&
'Заголовок окна biBrowse.strTitle = "Выбор папки" 'Тип возвращаемой папки biBrowse.ulFlags ~ &Н1
* Вывод стандартного окна просмотра папок IngResult - SHBrowseForFolder(biBrowse)
' Обработка результата работы окна If IngResult Then
'Получение пути (по возвращенным данным) strPath = SpaceS(512}
If SHGetPathFromlDList(ByVai IngResult, ByVai strPath) Then
,Строка пути заканчивается символом Chr(0)
intLen - InStr(strPath# Chr5(0))
1 Вьщеление и возврат пути
dhBrowseForFolder 工 Left(strPathr intLen - 1)
Else
* He удалось получить путь
dhBrowseForFolder ="”
End If
Else
* Пользователь нажал кнопку "Отмена"
dhBrowseForFolder =""
End If
End Function
Особенным в данной программе является использование АРТ-фуикций работы с объектами файловой системы Windows — SHBrowseForFolder И SHGetPathFromI DList. Первая функция отображает стандартное диалоговое окно просмотра дерева папок и возвращает целое значение, ндентифмцирующее выбранную папку (или 0 в случае отмены выбора). Вторая функция позволяет определить путь папки, идентифицируемой этим значением.
После написания данного кода в окне выбора макросов станет доступен макрос BrowseFolder. После его выполнения откроется окно Обзор папок, в котором по обычным правилам Windows следует указать путь к требуемой папке и нажать кнопку 0К. В результате на текущем рабочем листе будет сформирован перечень файлов, входящих в состав указанной папки (рис. 3.41).
ААВ I СВ I СП^Э^4^Н7П^Э^4^Н7Имя файлаРазмер01 Банковский, doc02 Гражданский,бос03 Закон о подоходном wj04 Конституция.^ос i话Wi6『dsEi讶к6口百к@06 Налогоеый.^осИмя файлаРазмер01 Банковский, doc02 Гражданский,бос03 Закон о подоходном wj04 Конституция.^ос i话Wi6『dsEi讶к6口百к@06 Налогоеый.^осДата/времяДата/время624640 24 02.ОТ412:S2624640 24 02.ОТ412:S21712640 24.02.2004 15:01177664! 19.02.2004 11:271712640 24.02.2004 15:01177664! 19.02.2004 11:27216576 Г419840:416256i216576 Г419840:416256i24.02.200424.02.20044 02.2004 15:114 02.2004 15:11807 0 бухучёте, doc90624可08 Трудовой кодекс, doc836096to09 Уголовный кодекс, doc1137664Ш.10 УПК doc93713Б807 0 бухучёте, doc90624可08 Трудовой кодекс, doc836096to09 Уголовный кодекс, doc1137664Ш.10 УПК doc93713БГ'^23 0272004 话方:4СЙ-2004 12:354 022004 12:49Г'^23 0272004 话方:4СЙ-2004 12:354 022004 12:49Рис. 3.41. Список файловРис. 3.41. Список файлов
А
А
В I С
В I С
П^Э^4^Н7
П^Э^4^Н7
Имя файлаРазмер
01 Банковский, doc
02 Гражданский,бос
03 Закон о подоходном wj
04 Конституция.^ос i
话Wi6『dsEi讶к6口百к@
06 Налогоеый.^ос
Имя файлаРазмер
01 Банковский, doc
02 Гражданский,бос
03 Закон о подоходном wj
04 Конституция.^ос i
话Wi6『dsEi讶к6口百к@
06 Налогоеый.^ос
Дата/время
Дата/время
624640 24 02.ОТ412:S2
624640 24 02.ОТ412:S2
1712640 24.02.2004 15:01
177664! 19.02.2004 11:27
1712640 24.02.2004 15:01
177664! 19.02.2004 11:27
216576 Г
419840:
416256i
216576 Г
419840:
416256i
24.02.2004
24.02.2004
4 02.2004 15:11
4 02.2004 15:11
8
07 0 бухучёте, doc
90624
可
08 Трудовой кодекс, doc
836096
to
09 Уголовный кодекс, doc
1137664
Ш.
10 УПК doc
93713Б
8
07 0 бухучёте, doc
90624
可
08 Трудовой кодекс, doc
836096
to
09 Уголовный кодекс, doc
1137664
Ш.
10 УПК doc
93713Б
Г'^
23 0272004 话方:
4СЙ-2004 12:35
4 022004 12:49
Г'^
23 0272004 话方:
4СЙ-2004 12:35
4 022004 12:49
Рис. 3.41. Список файлов
Рис. 3.41. Список файлов
Для каждой позиции даиного спнска в соответствующих столбцах указывается имя файла, его размер (в байтах), а также дата и время создания или последнего изменения файла. При необходимости можно формировать данный список с указанием полного пути к каждому файлу. В данном случае код макроса будет выглядеть следующим образом (листинг 3.101).
Листинг ЗЛ01. Просмотр содержимого папки с указанием полного пути к файлам
'Объявление API-функции для отображения стандартного окна _ просмотра папок
Declare Function SHBrowseForFolder Lib "sheLI32.dll." _
Alias "SHBrowseForFolderA" (IpBrowselnfo As BROWSEINFO) As Long 'Объявление API-функции для преобразования данных, возвращаемых 一 функцией SHBrowseForFolder, в строку
Declare Function SHGetPathFromIDList Lib "shell32.dll" _ Alias MSHGetPathFromIDListAn (ByVai pidl As Long, ByVai _ pszPath As String) As Long
'Структура используется функцией SHBrowseForFolder Type BROWSEINFO
hwndOwner As Long ' Родительское окно {для диалога) pidlRoot As Long ' Корневая папка для просмотра strDisplayName As String strTitle As String ' Заголовок окна ulFlags As Long1 Флаги для окна
Следующие три параметра в VBA не используются Ipfn As Long 1Param As Long iImage As Long End Type
Sub BrowseFolderl()
Dim strPath As String ' Папка, список файлов которой выводится Dim strFile As String Dim intRow As Long ' Текущая строка таблицы
'Выбор папки
strPath = dhBrowseForFolder() If strPath = H" Then Exit Sub
If Right(strPath, 1) <> "、” Then strPath = strPath & "\"
* Просмотр объектов в папке...
Первый объект папки strFile = Dir(strPath, 7) intRow = 2
Do While strFile <> ""
'Запись в столбец "А” имени файла ActiveSheet-Cells(intRow, 1) = strPath & strFile 'Запись в столбец "В" размера файла ActiveSheet.Cells(intRow, 2) = FileLen(strPath & strFile) 1 Запись в столбец "С" времени изменения файла ActiveSheet.Cells(intRow, 3) = FileDateTiwe(strPath & strFile) 'Следующий объект папки strFile = Dir intRow = intRow + 1
Loop
End Sub
Function dhBrowseForFolder() As String
Dim biBrowse As BROWSEINFO
Dim strPath As String Dim IngResult As Long Dim intLen As Integer
'Заполнение полей структуры BROWSEINFO
'Корневая папка - Рабочий стол biBrowse.pidlRoot - 0& 'Заголовок окна
biBrowse.strTitle = "Выбор папки”
* Тип возвращаемой папки biBrowse *ulFlags = &Н1
I Выводим стандартное окно просмотра папок IngResult = SHBrowseForFolder(biBrowse)
'Обработка результата работы окна
If IngResult Then
'Получение пути (по возвращенным данным) strPath = SpaceS(512)
If SHGetPathFromIDList(ByVai IngResult, ВуVai strPath) Then 1 Строка пути заканчивается символом Chr (0) intLen = InStr(strPathr Cht$(0)) 'Выделение и возврат пути dhBrowseForFolder = Left(strPath, intLen - 1)
265265Полученье мнформаиим о состоянии дисков
265
265
Else
' He удалось получить путь dhBrowseForFolder ="”
End If
Else
'Пользователь нажал кнопку "Отмена" в окне dhBrowseForFolder =""
End If
End Function
После написания данного кода в окне выбора макросов станет доступным макрос BrowseFolderi. Результат его выполнения показан на рис. 3.42.
AAI ВI ВССИмя файлаС:\ЗаконыЙ1 Банковский.^Имя файлаС:\ЗаконыЙ1 Банковский.^С:\3аконы\02 Граждански'С:\3аконы\02 Граждански'С:\Законы\ОЗ Закон оС:\Законы\ОЗ Закон оЯС:\ЗаконыЧ)4 Конституций С:\ЗаконыМЙ^4»V^<^--1i.r,-,—lrHECrE-,-,rf™-llE-,—ГТ — *- —7 САЗаконыте Налоговый.^ЯС:\ЗаконыЧ)4 Конституций С:\ЗаконыМЙ^4»V^<^--1i.r,-,—lrHECrE-,-,rf™-llE-,—ГТ — *- —7 САЗаконыте Налоговый.^Размер [Дата/время624640 : 24'022004 12:52 …17126Й! 24,02.ОТ4 15:0 一彳万丽汇…{дО2;2ОЙ4 11-27 "方齿形「五质方面飞:右419840Размер [Дата/время624640 : 24'022004 12:52 …17126Й! 24,02.ОТ4 15:0 一彳万丽汇…{дО2;2ОЙ4 11-27 "方齿形「五质方面飞:右41984024.02.2004 15:12国;g2a0415124.02.2004 15:12国;g2a04151
A
A
I В
I В
С
С
Имя файла
С:\ЗаконыЙ1 Банковский.^
Имя файла
С:\ЗаконыЙ1 Банковский.^
С:\3аконы\02 Граждански'
С:\3аконы\02 Граждански'
С:\Законы\ОЗ Закон о
С:\Законы\ОЗ Закон о
ЯС:\ЗаконыЧ)4 Конституций С:\ЗаконыМЙ^
4»V^<^--1i.r,-,—lrHECrE-,-,rf™-llE-,—ГТ — *- —
7 САЗаконыте Налоговый.^
ЯС:\ЗаконыЧ)4 Конституций С:\ЗаконыМЙ^
4»V^<^--1i.r,-,—lrHECrE-,-,rf™-llE-,—ГТ — *- —
7 САЗаконыте Налоговый.^
Размер [Дата/время
624640 : 24'022004 12:52 …17126Й! 24,02.ОТ4 15:0 一彳万丽汇…{дО2;2ОЙ4 11-27 "方齿形「五质方面飞:右
419840
Размер [Дата/время
624640 : 24'022004 12:52 …17126Й! 24,02.ОТ4 15:0 一彳万丽汇…{дО2;2ОЙ4 11-27 "方齿形「五质方面飞:右
419840
24.02.2004 15:12
国;g2a04151
24.02.2004 15:12
国;g2a04151
Рис. 3.42. Список файлов с указанием пути
На рисунке виднот что для каждой позиции данного списка указывается полный путь к файлу.
Получение информации о состоянии дисков
При необходимости можно быстро получить w вывести на активном рабочем листе разнообразную информацию о текущем состоянии дисков компьютера. Для этого достаточно воспользоваться макросом, код которого выглядит так (листинг ЗЛ02).
Листинг ЗД02. Просмотр информации。дисках компьютера
Sub Driveslnfo()
Dim objFileSysObject As Object ' Объект для работы — с файловой системой
Dim obj Drive As Object' Ан ализируe мый диск
Dim intRow As Integer1 Заполняемая строка листа
* Создание объекта для работы с файловой системой
Set objFileSysObject = CreateObject("Scripting.FileSystemObjectM)
* Очистка листа
Cells.Clear
'Запись с первой строки
intRow = 1
Case 0 Cells(intRow,Case 1 Cells(intRow,Case 2 Cells(intRow,Case 3 Cells(intRow, Case 4Cells(intRow, Case 5Cells(intRow, End Select 'Метка диска Cells(intRow, 4) я • Общий размер Cells(intRow, 5)= • Свободное место Cells(intRow, 6)=Case 0 Cells(intRow,Case 1 Cells(intRow,Case 2 Cells(intRow,Case 3 Cells(intRow, Case 4Cells(intRow, Case 5Cells(intRow, End Select 'Метка диска Cells(intRow, 4) я • Общий размер Cells(intRow, 5)= • Свободное место Cells(intRow, 6)=ААЛОЖЬТ D ^ ИСТИНАЛОЖЬТ D ^ ИСТИНАЕ ЛОЖЬЕ ЛОЖЬ;C「D」「ЕСъемный:Жес^й !SYSfEMH64^^1Жесткий -WORK ['95237480Б4;C「D」「ЕСъемный:Жес^й !SYSfEMH64^^1Жесткий -WORK ['95237480Б4CD-ROMCD-ROM2197780Б24;'^^Й1Ш2197780Б24;'^^Й1Ш
Case 0 Cells(intRow,
Case 1 Cells(intRow,
Case 2 Cells(intRow,
Case 3 Cells(intRow, Case 4
Cells(intRow, Case 5
Cells(intRow, End Select 'Метка диска Cells(intRow, 4) я • Общий размер Cells(intRow, 5)= • Свободное место Cells(intRow, 6)=
Case 0 Cells(intRow,
Case 1 Cells(intRow,
Case 2 Cells(intRow,
Case 3 Cells(intRow, Case 4
Cells(intRow, Case 5
Cells(intRow, End Select 'Метка диска Cells(intRow, 4) я • Общий размер Cells(intRow, 5)= • Свободное место Cells(intRow, 6)=
А
А
ЛОЖЬ
Т D ^ ИСТИНА
ЛОЖЬ
Т D ^ ИСТИНА
Е ЛОЖЬ
Е ЛОЖЬ
;C「D」「Е
Съемный:
Жес^й !SYSfEMH64^^
1Жесткий -WORK ['95237480Б4
;C「D」「Е
Съемный:
Жес^й !SYSfEMH64^^
1Жесткий -WORK ['95237480Б4
CD-ROM
CD-ROM
2197780Б24;
'^^Й1Ш
2197780Б24;
'^^Й1Ш
'Запись на лист информации о дисках компьютера On Error Resume Next
For Each objDrive In objFileSysObject.Drives
'Буква диска
Cells(intRow, 1) = obj Drive.DriveLetter
'Готовность
Cells(intRow, 2) = objDrive.IsReady
• Тип диска
Select Case obj Drive.DriveType
= ^Неизвестно"
= "Съемный"
= "Жесткий"
n "Сетевой"
= "CD-ROM”
= "RAM”
objD rive.VolumeName
objDrive.Totalsize
objDrive.AvailableSpace
intRow = intRow + 1
Next
End Sub
После написания кода в окне выбора макросов появится макрос Driveslnfo. В результате его выполнения на текущем рабочем листе будет сформирован список, пример которого показан на рис. 3.43.
Рис. 3.43. Список с информацией о дисках компьютера
267267Расчет среднепз арнфметбческопэ
267
267
Для каждой позиции списка последовательно указывается буква диска, его «готовность к работе» в данный момент, тип диска, название тома, общий объем диска и свободное в настоящее время место на нем.
Очевидно, что содержимое данного списка зависит от конфи^рации используемого компьютера.
Расчет среднего арифметического
В данном разделе мы рассмотрим небольшой трюк, с помощью которого можно быстро рассчлтать среднее значение ячеек, расположенных над активной ячейкой, с отображением результата в активной ячейке.
Как известно, расчет среднего значения можно выполнять штатными средствами Excel — с помощью функции срзнач. Однако в некоторых случаях удобнее воспользоваться макросом, код которого представлен в листинге ЗЛОЗ (этот код нужно набрать в стандартном модуле редактора VBA).
Листинг 3.103. Расчет среднего значения
Sub CalculateAverage()
Dim strFistCell As String
Dim strLastCell As String
Dim strFormula As String
'Условия закрытия процедуры
If ActiveCell.Row = 1 Then Exit Sub
* Определение положения первой и последней ячеек для расчета strFistCell = ActiveCell.Offset(-1, 0}.End(xlUp).Address strLastCell = ActiveCell.Offset(-1# 0).Address
' Формула для расчета среднего значения
strFormula = n=AVERAGE (,r & strFistCell & ":11 & strLastCell & ") n
* Ввод формулы в текущую ячейку
ActiveCell.Formula = strFormula
End Sub
В результате выполнения данного макроса в активной ячейке отобразится среднее арифметическое, рассчитанное на основании расположенных выше непустых ячеек; при этом ячейки с данными должны следовать одна за другой, без пробелов. Иначе говоря, если активна ячейка А5, а над ией все ячейки содержат данные, кроме ячейки А2, то среднее арифметическое будет рассчитано на основании данных ячеек АЗ и А4 (ячейка А1 в расчете участвовать не будет). Если же
пустой является только ячейка А4, то среднее арифметическое в ячейке А5 рассчитано не будет.
Вывод списка доступных шрифтов
При необходимости можно сформировать и вывести на печать список доступных в системе шрифтов. Для этого нужно написать и выполнить следующий макрос (листинг 3.104).
Листинг 3*104. Список шрифтов
Sub ListOfFonts()
Dim cbrcFonts As CommandBarControl
Dim cbrBar As CommandBar
Dim i As Integer
'Получение доступа к списку шрифтов (элемент управления в виде — раскрывающегося списка на панели инструментов "Форматированиеи)
Set cbrcFonts = Application-CommandBars (^Formatting*1) . _ FindControl(ID:=1728)
If cbrcFonts Is Nothing Then
' Панель ^Форматирование11 не открыта - откроем ее
Set cbrBar = Application.CommandBars.Add
Set cbrcFonts = cbrBar.Controls *Add(ID:=1728)
End If
* Подготовка к выводу шрифтов (очистка ячеек)
Range("А:А")^ClearContents
'Вывод списка шрифтов в столбец "А" текущего листа
For i = 0 То cbrcFonts.Listcount - 1
Cells(i + 1, 1) = cbrcFonts.List(i + 1)
Next i
'Закрытие панели инструментов **Форматирование'1, если мы были _ вынуждены ее открывать
On Error Resume Next
cbrBar♦Delete
End Sub
В результате работы данного макроса перечень доступных шрифтов будет сформирован на активном рабочем листе н столбце А. После этого список шрифтов можно по обычным правилам вывести на печать.
Особенностью данной программы является использовагше и качестве источника списка шрифтов элемента управления панели инструментов Форматирование. Именно с помощью этого элемента управления мы всегда выбираем шрифт, редактируя текст в любом приложении Microsoft Office.
Обработка сразу нескольких внешних файлов
Рассматриваемый в данном разделе прием позволяет выполнить быстрый импорт и обработку (в соответствии с заданными условиями) файлов с расширением, отличным от XLS.
Предположим, что у нас есть три текстовых файла: TextOl .txt, Text02.txt и Text03. txt. Поскольку по своей структуре они однотипны и отличаются только содержащимися в них данными, рассмотрим для наглядности только файл TextOl. txt (рис. 3.44).
в ТЕХТ01 ^ БлокнотМ回碑
Ф'^ Пра* SWT Мд С吧吧—
каасвссаввсаавааавассасаввкаасвссаввсаавааавассасаввСумма 12455 13223 8733 28N 11833
каасвссаввсаавааавассасавв
каасвссаввсаавааавассасавв
22833 54"22833 54"5 842
22833 54"
22833 54"
3700
12873
168016803 349 6517 9124 1509 5683 6654
1680
1680
25992599164 9"6 4510 9451 "06 823
2599
2599
Рис. 3.44. Текстовый файл TextO1.txt
Указанные файлы должны быть расположены в той же панке, что и текущая рабочая книга,
Нам необходимо импортировать все эти файлы в книгу Excel, добавив при этом в каждый из них формулы суммирования, описывающие данные в файле. Для решения данной задачи напишем в стандартном модуле редактора VBA код, представленный в листинге 3.105.
Листинг 3.105. Обработка текстовых файлов
Sub ImportTextFiles()
Dim fsSearch As FileSearch
Dim strFileName As String
Dim strPath As String
Dim i As Integer
Задание пути и возможного имени файла strFileName = ThisWorkbook.path & "\" strPath м "text??, txtг,
'Создание объекта FileSearch
Set fsSearch = Application * FileSearch
'Настройка объекта для поиска With fsSearch
Маска для поиска
.Lookin = strFileName
'Путь для поиска
.FileName - strPath
'Поиск всех файлов, удовлетворяющих маске .Execute
'Выход, если файлы не существуют
If .FoundFiles.Count = 0 Then MsgBox ,rФайлы не обнаружены" Exit Sub
End If
End With
Обработка найденных файлов
For i = 1 To fsSearch,FoundFiles.Count Call ImportTextFile(fsSearch*FoundFiles(i))
Next i
End Sub
Sub ImportTextFile(FileName As String)
Импорт файла
Workbooks.OpenText FileName:=FileName, _ Origin:=xlWindows t —
StartRow:^1, _
DataType:^xlFixedWidth, 一
Fieldinfo:= _
Array(Array(Of 1), Array(3, 1), Arr^y(12, 1)) 'Ввод формул суммирования
Range(HD1").Value = "A”
Range(HD2M).Value = "B"
Range(nD3H).Value = "C”
Range (nEl:E3**) TFormula = ,T=COUNTIF (B:B, DI) n
Range (nFl:F3rt) .Formula = H=SUMIF (B:B, D1,C:C)11 End Sub
В результате написания данного кода в окне выбора макросов появится макрос importTextFiles. После его запуска будут автоматически созданы три книги Excel — по одной для каждого текстового файла. Этим книгам по умолчанию будут присвоены имена TEXTOi, ТЕХТ02 и ТЕХТОЗ. На рис. 3.45 показан фрагмент книги ТЕХТО1.
凤 Microsoft Excel - ТЕХТО1
:囿 Файл : Qpa&ca : £н& Вставка Формат Сервис Данные
I Arial CyrI Arial CyrF3A Lb.F3A Lb.三[е:]:口三[е:]:口* К и .雲重釜雷:纾笈 ^СУММЕСЛИ(В:В;03;С:С)* К и .雲重釜雷:纾笈 ^СУММЕСЛИ(В:В;03;С:С)HH22JjA3iCJjA3iC4 В4 В.1] 72282 ;12455(8 I 7: 4由估] 包方正:力6费4 51 873可 I 厂.1] 72282 ;12455(8 I 7: 4由估] 包方正:力6费4 51 873可 I 厂665b5b28730 二_1期!」28730 二_1期!」垂8|В垂8|В22833j _ I5437ТЛ22833j _ I5437ТЛв с А А в男 О-12У^ ^^13^в с А А в男 О-12У^ ^^13^二 ^^ _ 8700 一„二 ^^ _ 8700 一„1680' 3349!1680' 3349!一茵7一一茵7一
I Arial Cyr
I Arial Cyr
F3
A Lb.
F3
A Lb.
三[е:]:口
三[е:]:口
* К и .雲重釜雷:纾
笈 ^СУММЕСЛИ(В:В;03;С:С)
* К и .雲重釜雷:纾
笈 ^СУММЕСЛИ(В:В;03;С:С)
H
H
2
2
JjA
3iC
JjA
3iC
4 В
4 В
.1] 72282 ;
12455(8 I 7: 4由估] 包方正:力6费4 51 873可 I 厂
.1] 72282 ;
12455(8 I 7: 4由估] 包方正:力6费4 51 873可 I 厂
6
6
5b
5b
28730 二_1期!」
28730 二_1期!」
垂
8|В
垂
8|В
22833j _ I
5437ТЛ
22833j _ I
5437ТЛ
в с А А в男 О-12У^ ^^13^
в с А А в男 О-12У^ ^^13^
二 ^^ _ 8700 一„
二 ^^ _ 8700 一„
1680' 3349!
1680' 3349!
一茵7一
一茵7一
Рис. 3.45. Фрагмент книги ТЕХТ01
В соответствии с приведенным выше кодом во всех трех книгах в ячейках диапазонов Е1:ЕЗ м F1:F3 будут автоматически введены формулы суммирования, описывающие данные в файле.
ПРИМЕЧАНИЕ
Рассматриваемый в данном разделе трюк можно реализовать только в версиях Excel, начиная с 2000.
Все исходные данные, используемые при рассмотрении примера, условны. Путем внесения соответствующих поправок в приведенный выше код можно изменять имена обрабатываемых файлов, пути к ннм, способ обработки файла н т. д.
Запуск таблицы символов из Excel
Возможности программы предусматривают запуск других приложений из текущей рабочей книги. В данном разделе мы рассмотрим, каким образом моясно запустить из Excel таблицу символов.
ПРИМЕЧАНИЕ
В Excel 2002 таблицу символов можно вызвать с помощью команды главного меню Вставка ► Символ. Поэтому описываемы員 в данном разделе пример будет интересен в первую очередь пользователем, у которых установлена версия до 2002.
Для реализации поставленной задачи нужно в стандартном модуле редактора VBA написать следующий код (листинг 3.106).
Листинг 3.106* Вызов таблицы символов
Sub ShowSymbolTable ()
On Error Resume Next
'Запуск Charmap.exe - таблицы символов
Shell "Charmap.exe", vbNormalFocus
If Err <> 0 Then
MsgBox ^Невозможно запустить таблицу символов.° л vbCritical End If End Sub
После написания кода будет создан макрос showSymbolTable, при выполнении которого на экране отобразится таблица символов (рис. 3.46).
Рис. 3.46. Таблица символов
При необходимости можно сделать так, что после закрытия таблицы символов на экране отобразится окно с соответствующим сообщением. Для достижения такого эффекта нужно для вызова таблицы использовать макрос, код которого приведен в листинге 3.107*
Листинг 3.107. Таб;1ица символов
,Декларация API-функций:
'для открытия процесса
Declare Function OpenProcess Lib 11 kernel32м _
(ByVai dwDesiredAccess As Long, ByVai blnheritHandle As Long, ByVai dwProcessId As Long) As Long
'для получения кода завершения процесса
Declare Function GetExitCodeProcess Lib nkerne!32"— (ByVai hProcess As Long, IpExitCode As Long) As Long
'для закрытия процесса
Declare Function CloseHandle Lib kernel32° — (hProcess) As Long
Sub ShowSymbolTablel()
Dim IProcessID As Long
Dim hProcess As Long
Dim lExitCode As Long
On Error Resume Next
* Запуск таблицы символов (Charman.exe)- Функция возвращает _ идентификатор созданного процесса
IProcessID = Shell ("Charmap.exe,f, 1)
If Err <> 0 Then
MsgBox "Нельзя запустить Charman.exe1', vbCritical, "Ошибка" Exit Sub
End If
'Открытие процесса по идентификатору (IProcessID). Функция _ возвращает дескриптор процесса (handle)
hProcess = OpenProcess(&Н400, False, IProcessID)
'Ждем, пока процесс завершится, для этого периодически _ получаем код завершения процесса (пока Charman.ехе исполняется, функция GetExitCodeProcess возвращает &Н103)
Do
GetExitCodeProcess hProcess, lExitCode
DoEvents
Loop While lExitCode = &H103
'Закрытие процесса
CloseHandle (hProcess)
'Вывод на экран информационного сообщения
MsgBox nCharmap.exe завершает свою работу1*
End Sub
После запуска макроса showSymbolTablel, который будет создан в результате написания данного кода, на экране опять же отобразится окно таблицы символов, изображенное на рис. 3.46. Отличие данного макроса от предыдущего состоит в том, что после закрытия окна Таблица символов на экране отобразится окно с сообщением Charmap.exe завершает свою работу.
Создание раскрывающегося списка
Раскрывающийся список является одним из наиболее удобных элементов управле* ния, поскольку с его помощью можно быстро установить требуемое значение того или иного элемента интерфейса (в частности, ячейки). В этом разделе мы рассмотрим пример, реализация которого поможет пользователю самостоятельно создавать раскрывающиеся списки с заранее заданным перечнем возможных значений*
Предположим, что нам необходимо создать раскрываюшийся список, имеющий 12 возможных значений, каждое из которых представляет собой название месяца. Для удобства использования поместим этот список на панель инструментов, которую также создадим самостоятельно. Созданную панель инструментов назовем Список месяцев.
Для решения поставленной задачи напишем в стандартном модуле редактора VBA код, который представлен в листинге 3.108.
Листинг 3.108. Создание панели со списком
Sub CreatePanel ()
Dim i As Integer
On Error Resume Next
'Удаление одноименной панели (если есть)
CommandBars ("Список месяцев*1) .Delete
On Error GoTo 0
'Создание панели "Список месяцев"
With CommandBars- Add
.Name = "Список месяцев1'
'Создание списка месяцев
With .Controls.Add(Type:=msoControlDropdown)
' Настройка (имя, макрос, стиль)
.Caption = "DaSDD”
.OnAction = "SetMonthTf
Создание раскрывающегося списка
.Style н msoBu11onAutomatic
'Добавление в список названий месяцев
For i = 1 То 12
.Additem Format(DateSerial(1, i, 1), "mmmm")
Next i
* Выделение первого месяца
.Listindex = 1
End With
Показываем созданную панель
.Visible = True
End With
End Sub
Sub SetMonth()
Перенос названия выделенного месяца в ячейку
On Error Resume Next
With CommandBars ("Список месяцев11) .Controls (HDateDDH)
ActiveCell.Value = .List(* ListIndex)
End With
End Sub
В результате написания данного кода будут созданы два макроса: CreatePanel и SetMonth. Первый предназначен для создания панели инструментов Список месяцев с раскрывающимся списком (рнс. 3.47), а второй — для помещения выбранной позиции списка в активную ячейку рабочего листа.
Рис. 3.47. Созданный раскрывающийся списокРис. 3.47. Созданный раскрывающийся список
Рис. 3.47. Созданный раскрывающийся список
Рис. 3.47. Созданный раскрывающийся список
Подобным образом можно создавать любые раскрывающиеся списки с произвольным перечнем значений как включенные в панель инструментов, так и созданные отдельно от нее — для этого достаточно внести соответствующие изменения в приведенный выше код.
Добавление команды в меню
Выше мы рассматривали несколько способов формирования пользовательских меню и включали их в главное либо в контекстное меню. Однако в процессе эксплуатации программы могут возникать ситуации, когда для решения той или иной задачи можно обойтись лишь одной пользовательской командой, включив ее в какое-либо из имеющихся меню.
В данном разделе мы рассмотрим, каким образом можно добавить пользовательскую команду в меню.
Добавление команды в меню Сервис
Итак, добавим в меню Сервис, которое входит в состав главного меню программы, пользовательскую команду Очистить все, кроме формул. Кроме того, для удобства работы назначим данной команде сочетание клавиш Ctrl+Shift+C>
Для реализации поставленной задачи необходимо в стандартном модуле редактора VBA написать код, который выглядит следующим образом (листинг 3.109).
Листинг 3.109. Новая команда в меню Сервис
Sub AddMenuItem()
Dim cbrpMenu As CommandBarPopup
'Удаление аналогичной команда (при ее наличии)
Call DeleteMenuItem
Получение доступа к меню 11 Сервис"
Set cbrpMenu = CommandBars(1).FindControl(ID:^30007)
If cbrpMenu Is Nothing Then
He удалось получить доступ
MsgBox ^Невозможно добавить элемент»11
Exit Sub
Else
' Добавление новой команды в меню
With cbrpMenu.Controls.Add(Type:=msoControlButton)
' Название команды
♦Caption = мОчистить в&се, кроме формулп
* Значок
.Faceld = 348
'Сочетание клавиш (только надпись на кнопке)
.ShortcutText = f,Ctrl+Shift+CK
'Сопоставленный макрос
.OnAction = "Executecommand"
* Добавление разделителя перед командой
.BeginGroup = True
End With
End If
'Сопоставление с макросом сочетания клавиш Ctrl+Shift+C
Application.MacroOptions —
Macro: = nExecuteCommandH,
HasShortcutKey:=True,
ShortcutKey:^MCn
End Sub
Sub ExecuteCommand()
Очистка содержимого всех ячеек (кроме формул)
On Error Resume Next
Cells.Specialcells(xlCellTypeConstants, 23).ClearContents
End Sub
Sub DeleteMenuItem()
'Удаление команды из меню
On Error Resume Next
CommandBars(1).FindControl(ID:=30007)・ _
Controls (,тОчистить в&се, кроме формул') .Delete
End Sub
В результате написания кода будут созданы три макроса: AddMenuitem (добавле* ние команды Очистить все, кроме формул в меню Сервис)» DeleteMenuItem (удаление команды из меню Сервис) и Executecommand (макрос запускается при выполнении команды).
Меню Сервис с добавленной командой Очистить все, кроме формул показано на рис. 3.48.
При выполнении команды Сервис ► Очистить все, кроме формул из ячеек текущего рабочего листа будет удалена вся нн〔»ормаиня, за исключением формул. Следует отметнть, что данную операцию можно выполнять и без помощи команды Очистить все, кроме формул — для этого достаточно запустить макрос Executecommand.
Для удаления команды Очистить все, кроме формул из меню Сервис нужно выполнить макрос DeleteMenuItem.
Добавление команды в меню Вид
Добавим в меню Вид, которое также входит в состав главного меню программы, пользовательскую команду Линии сетки. С помощью дашюй команды можно будет управлять отображением сетки на текущем рабочем листе.
Итак, в стандартном модуле редактора VBA напишем код, который представлен в листинге ЗЛЮ.
Рис. 3.48. Добавление новой команды в меню Сервис
Листинг 3.110. Код в стандартном модуле
Dim AppObject As New Classi
Sub AddCommand()
Dim cbrpBar As CommandBarPopup
End If
Даем объекту AppObj ect обрабатывать события Set AppObj ect.AppEvents = Application End Sub
Sub DeleteCommand()
Удаление каманды из меню (если она там есть)
On Error Resume Next
CommandBars(1).FindControl(ID:=30004) . _ Controls (,f&Линии сетки"') .Delete
End Sub
Sub GhangeGridlinesState()
Изменение состояния отображения линий сетки _
на противоположное (если нет - покажем, если есть - скроем)
If TypeName(ActiveSheet) = "Worksheetи Then
ActiveWindow.DisplayGridlines = _
Not ActiveWindow* DisplayGridlines
'Установка или снятие флажка в меню Call CheckGridlines
End If
End Sub
Sub CheckGridlines()
Dim button As CommandBarButton On Error Resume Next
'Поиск команды rtЛинии сетки1* в меню "Видн
Set button = CommandBars(1)•FindControl(ID:=30004). _ Controls (п&Линии сетки11)
'Изменение состояния флажка на противоположное
Xf ActiveWindow*DisplayGridlines Then
'Установка
button.State = msoButtonDown
Else
Снятие■
button,State 二 msoButtonUp End If End Sub
После этого необходимо в редакторе VBA создать модуль класса и поместить в него следующий код (листинг 3.111)»
Листинг 3.111. Koq в модуле класса
Public WithEvents AppEvents As Application
『Обработка события активации листа
Sub AppEvents_SheetActivate(ByVai Sh As Object)
Call CheckGridlines
End Sub
'Обработка события активации книги
Sub AppEvents_WorkbookActivate(ByVai Wb As Excel.Workbook)
Call CheckGridlines
End Sub
* Обработка события активации окна
Sub AppEvents_WindowActivate _
(ByVai Wb As Workbook, ByVai Wn As Window)
Call CheckGridlines
End Sub
В результате выполнения макроса AddCommand (после написания кода этот макрос появится в окне выбора макросов) в меню Вид будет добавлена команда Линии сетки, с помощью которой ^foжнo включать/выключать отображение сетки на текущем рабочем листе (рис. 3.49).
Если в данный момент сетка отображается» то возле команды Линии сетки будет установлен флажок. При выключении отображения сетки этот флажок пропадает.
Для удаления команды Линии сетки из меню Вид необходимо выполнить макрос DeleteConmiand (он также будет доступен в окне выбора макросов после написания приведенного выше кода).
Трюки и эффекты с помощником
Всем хорошо известен такой элемент Microsoft Excel, как встроенный помощник, для которого можно выбрать анимированный персонаж. В этой главе мы рассмотрим несколько интересных трюков, которые можно реализовывать при использовании помощника.
Мультфильм с помощником в главной роли
При желании можно самостоятельно создать небольшой мультфильм, главную роль в котором исполнит помощник. Данный трюк вряд ли будет иметь практическое применение, но с развлекательной точки зрения достаточно интересен. Для его реализации нужно написать и применить следующий макрос (листинг 4.1).
Листинг 4Л. «Танцующий» помощник
Sub RunAssistantDance()
Static intAction As Integer
' Заставляем помощника выполнять действие (всего 16)
DoAssistantAction intAction
intAction = intAction + 1
If intAction < 16 Then
'Следующее действие через 3 секунды
Application,OnTime Time + TimeUalue("00:00:3”),_
и RunAssistantDance11
End If
End Sub
Sub DoAssistantAction(intAction As Integer)
Dim astAssistant As Assistant
Set astAssistant = Application<Assistant
' Помещаем помощника в центр активного окна
astAssistant.Тор 二 Application.ActiveWindow.Top _
+ Application.ActiveWindow.Height / 2
astAssistant.Left = Application.ActiveWindow.Left 一
+ Application ActiveWindow.Width / 2
'Показываем помощника
astAssistant.On = True
astAssistant.Visible = True
Дополнен。® гюмоиднмка текстом, заголовком, кнопк。访 и значком
Case 1
astAssistant.Animation = msoAnimationCheckingSomething
Case 2
astAssistant.Animation = msoAnimationBeginSpeaking
Case 3
astAssistant.Animation = msoAnimationCharacterSuccessMajor
Case 4
astAssistant,Animation = msoAnimationEmptyTrash
Case 5
astAssistant *Animation = msoAnimationGestureDown
Case 5
astAssistant.Animation = msoAnimationGestureLeft
Case 6
astAssistant.Animation = msoAnimationGestureRight
Case 7
astAssistant.Animation = msoAnimationGestureUp
Case 8
astAssistant.Animation = rasoAnimationGetArtsy
Case 9
astAssistant.Animation = msoAnimationGetAttentionMajor
Case 10
astAssistant *Animation = msoAnirnationGetAttentionMinor
Case 11
astAssistant * Animation = msoAnimationGetTechy
Case 12
astAssistant.Animation = msoAnimationGetWizardy
Case 13
astAssistant.Animation = msoAnimationGoodbye
Case 14
astAssistant.Animation 二 msoAnimationGreeting
Case 15
astAssistant.Animation = msoAnimationDisappear
End Select
End Sub
После запуска макроса RunAssistantDance на экране появится помощник, который вскоре начнет «исполнять свою роль步.По окончании мультфильма персонаж исчезнет и через небольшой промежуток времени появится вновь*
Дополнение помощника текстом, заголовком, кнопкой и значком
В этом разделе мы рассмотрим трюк, с помощью которого можно создать для помощника какой-либо произвольный текст, а также снабдить его значком и кнопкой
ОК. Для достижения такого эффекта воспользуемся макросом, код которого приведен в листинге 42
Листинг 42 Настройка помощника
Sub AssistantMessage()
Dim strTitle As String ' Заголовок сообщения Dim strMessage As String * Текст сообщения
'Содержимое заголовка и текста в окне помощника strTitle = "Спрашивайте - ответим"'
strMessage = "{cf 249}{ul 1) Рукм мыли{ul 0}?" _
& vbCr & ”{cf б} He забыть обновить антивирус!п
'Настраиваем помощника With Application.Assistant
'Включаем и показываем помощника .On = True .Visible = True
'Создаем окно сообщения With .NewBalloon
.BalloonType = msoBalloonTypeButtons
'Кнопка "OK" в окне помощника ^button = msoButtonSetOK
Значок в окне помощника
* Icon = msoIconAlert
Заголовок в окне помощника
,Heading = strTitle
Текст в окне помощника .Text = strMessage 'Отображение окна .Show
End With
End With End Sub
В результате применения данного макроса на экране вместе с помощником появится окно, изображенное на рис. 4.1.
Это окно исчезает после нажатия кнопки ОК. Следует отметить» что в данном окне заголовок написан полужирным шрифтом, строка под ним — красным цветом с подчеркиванием, а последняя строка — сине-зеленым цветом (см. формат строки сообщения в коде макроса).*
Нсвне параметры помацну|ка
」\ Спрашивайте - ответим
Руки мыли?
Не забыть обновить антивирус!
Рис. 4.1 • Сопровождение помощника
Новые параметры помощника
При необходимости можно добавить в окно, сопровождающее помощника, дополнительные флажки. Решить эту задачу поможет следующий макрос (листинг 4.3).
Листинг 4.3. Новые параметры помощника
Sub Assistantcheckboxes()
Dim i As Integer
Dim strMessage As String
With Assistant
'Включение и отображение помощника
.On = True
.Visible = True
'Создание окна сообщения With .NewBalloon
* Настройка окна...
'Тип окна
.BalloonType = msoBalloonTypeButtons
'Заголовок
.Heading = пВыберите страну"
,Добавление флажков
.CheckBoxes(1).Text = "Россия"
.CheckBoxes(2)Text = "США"
.CheckBoxes(3).Text = нЮжная Африкаи .button = msoButtonSetOkCancel
'Вывод информационного окна в зависимости — от установленных флажков
For i = 1 То 3 If .CheckBoxes(i).Checked Then strMessage = strMessage & _ .CheckBoxes(i).Text & vbCr End If
Next
'Отображение окна сообщения (имеется в виду — стандартное окно)
If Len(strMessage) = 0 Then MsgBox "No choice.n
Else
MsgBox strMessage End If End If End With End With End Sub
После применения данного макроса на экране вместе с помощником появится следующее окно (рис. 4.2).
Выберите страну
Г* Россия 厂США 厂 Южная Африка I 國二][Отмена ]
Рис. 4.2・ Добавленные параметры
После нажатия в данном окне кнопки ОК откроется окно с названиями установленных флажков.
Использование помощника для выбора цвета заливки
Добавим в окно помощника режим, с помощью которого можно выбрать цвет ячеек рабочего листа. Для этого воспользуемся таким макросом (листинг 4*4).
287287Использование псмснцникадла выбора ивета заливки
287
287
Листинг 4.4. Выбор цвета заливки рабочего листа
Sub AssistantChooseColor()
Dim intChoise As Integer
With Assistant
I Включение и отображение помощника .On = True •Visible = True With .NewBalloon
'Настройка окна.••
* Тип
.BalloonType = msoBalloonTypeButtcns
'Заголовок
.Heading = "Какой нужен цвет?"
'Первый цвет
.Labels(1).Text = "Красныйм 'Второй цвет .Labels(2).Text = "Желтый" 'Третий цвет
.Labels(3).Text = "Зеленый" 'Тип кнопок
*button = msoButtonSetNone 'Оображение окна intChoise = Show
* Информационное сообщение о выбранном цвете MsgBox "Выбран: ” & .Labels (intChoise)»Text End With
End With
В результате выполнения данного макроса на экране вместе с помощником появнт-
ся окно, изображенное на рис. 43
Какой нужен цвет?
ё Красный:• Желтый• Зеленыйё Красный:• Желтый• ЗеленыйРис. 4.3. Выбор цвета ячеекРис. 4.3. Выбор цвета ячеек
ё Красный:
• Желтый
• Зеленый
ё Красный:
• Желтый
• Зеленый
Рис. 4.3. Выбор цвета ячеек
Рис. 4.3. Выбор цвета ячеек
При выборе любого из значений на зкране появится окно, в котором будет указано название выбранного цвета. После нажатия в информационном окне кнопки ОК все ячейки рабочего листа будут окрашены в выбранный цвет. Для возврата к исходному состоянию нужно будет выделить весь рабочий лист н установить цвет заливки Авто.
Эксперименты с диаграммами
В Microsoft Excel реализованы широкие функциональные возможности для работы с диаграммами. Однако в этой главе мы не будем останавливаться на традиционных приемах работы с диаграммами, а рассмотрим нестандартные подходы, а также различные трюки и эффекты, которые можно реализовывать применительно к диаграммам.
Построение диаграммы с помощью макроса
В данном разделе мы рассмотрим, каким образом можно построить диаграмму с тю- мощью макроса.
Предположим, что у нас есть таблица с исходными данными (рис. 5.1), на основании которых необходимо построить диаграмму.
А [ В
СD ! Е
亍
Магазин 1
Январь15450
Магазин 2 !Магазин Э'Магазин 4 %萌而!2f6T487452
—
Февраль] 25250
41521j 2504519Б214
4
Март]~ 14130
西豌 369B5:45214
Рис, 5.1. Исходные данные для построения д供а「раммн
В данной таблице представлена информация о выручке за первый квартал (помесячно) по четырем торговым точкам. Обратите внимание на расположение таблицы (то есть на координаты диапазона, в котором она находится, — А1:Е4).
Для построения диаграммы следует написать и выполнить макрос, код которого приведен в листинге 5.1.
Листинг 5.1 ・ Макрос построения диаграммы
Sub CreateChart()
1 Создание и настройка диаграмьйы
With Charts.Add
'Данные из первого листа
•SetSourceData Source:=Worksheets(1).Range("Al:E4"}
1 Заголовок
.HasTitle = True
.ChartTitle.Text = "Выручка по магазинамn
'Активизируем диаграмму
.Activate
End With
End Sub
В результате выполнения данного макроса будет построена диаграмма, изображенная на рис. 52
Рис. 5.2. Построенная диаграмма
При написании макроса наряду с другими параметрами мы указали диапазон, который следует обрабатывать (А1:Е4), а также заголовок диаграммы — Выручка по магазинам. Созданная диаграмма помещается на автоматически сформированный рабочий лист, которому по умолчанию присваивается имя Диаграмма! (при последующих построениях диаграммы каждый раз будет создаваться новый лист Диаграмма с номером, увеличенным на 1 по сравнению с предыдущим).
При необходимости на основании этих же данных (см. рис. 5.1) можно создать внедренную диаграмму. Для этого нужно написать и запустить следующий макрос (листинг 5.2).
Листинг 5.2. Построение внедренной диаграммы
Sub CreateEmbeddedChart()
* Создание и настройка внедренной диаграммы
With Worksheets(1).Chartobjects.Add{100, 60, 250, 200)
' Объемная диаграмма
.Chart•ChartType = xl3DArea
1 Источник данных
.Chart -SetSourceData Source:=Worksheets(1).Range("Al:E4")
End With
End Sub
Результат выполнения данного макроса представлен на рис. 5.3.
На рисунке видно, что диаграмма внедрена на рабочий лист с исходными данными.
Можно также создать диаграмму на основе выделенных данных. В листинге 5.3 приведен текст макроса, в котором, помимо прочего, указывается размер диаграм* мы и ее расположение.
2525025250и 1: Магазин 2 Магазин 31545042070- 丁~и 1: Магазин 2 Магазин 31545042070- 丁~42870-42870-.21014.2101441521256454152125645100000]00000J600004000020000100000]00000J600004000020000ххйи«5ххйи«5Е HweejmwЕ Hweejmw96214:96214:Магазин 4 » 074S2!Магазин 4 » 074S2!,Март Январь,Март Январь■ Январь■ Февраль口 Март■ Январь■ Февраль口 Март
25250
25250
и 1: Магазин 2 Магазин 3
1545042070- 丁~
и 1: Магазин 2 Магазин 3
1545042070- 丁~
42870-
42870-
.21014
.21014
4152125645
4152125645
100000]
00000J
60000
40000
20000
100000]
00000J
60000
40000
20000
ххйи«5
ххйи«5
Е Hweejmw
Е Hweejmw
96214:
96214:
Магазин 4 » 074S2!
Магазин 4 » 074S2!
,Март Январь
,Март Январь
■ Январь
■ Февраль
口 Март
■ Январь
■ Февраль
口 Март
Рис. 5.3. Внедренная диаграмма
Листинг 53 Создание диаграммы на основе выделенных данных
Sub CreateCharOnSelection()
т Создание диаграммы (с заданием положения на листе)
With ActiveSheet.Chartobjects * Add( Selection.Left + Selection,Width, — Selection.Top + Selection.Height, 300, 200).Chart
'Тип диаграммы
.ChartType = xlColumnClustered
* Источник данных - выделение
.SetSourceData Source:=Selection, PlotBy:=xlColumns
* Без легенды
* HasLegend - False
1 Без заголовка .HasTitle = True .ChartTitle.Characters .Text = нВыручка за период'1 'Выделение диаграммы
.Parent.Select
End With
End Sub
Результат выполнения данного макроса представлен на рис. 5.4 — на основании данных таблицы, которая расположена в левом верхнем углу, создана диаграмма.
Не стоит забывать, что перед запуском макроса необходимо выделить диапазон, данные которого должны быть учтены при построении диаграммы.
При подведении указателя мыши к столбикам диаграммы на экране будет отображаться соответствующая всплывающая подсказка.
Рис. 5.4. Диаграмма на основе выделенных данных
Сохранение диаграммы в отдельном файле
После создания диаграммы может возникнуть вопрос - а где ее хранить? Можно использовать для этого листы рабочей книги, а можно сохранить диаграмму в отдельном файле под указанным именем. Например, с помощью приведенного в листинге 5.4 макроса анаграмма будет сохранена под именем диаграмма. gif.
Листинг 5.4. Сохранение диаграммы
Sub SaveChart()
'Сохранение выделенной диаграммы в файл
If ActiveChart Is Nothing Then
'Нет выделенных диаграмм
MsgBox "Выделите диаграмму1'
Else
' Сохранение...
ActiveChart.Export ActiveWorkbook.path & n\Диаграмма.gif*•, "GIF"
End If
End Sub
Перед запуском макроса сохраняемую диаграмму необходимо выделить — в противном случае при попытке сохранения на экране отобразится окно с сообщением Выделите диаграмму. После применения макроса диаграмма будет сохранена под указанным именем в текущем каталоге.
Однако при сохранении диаграммы может возникнуть необходимость в интерактивном задании имени и расположения файла диаграммы. Для этого можно использовать макрос, код которого приведен в листинге 5.5.
Листинг 5.5. Сохранение диаграммы под указанным именем
Sub InteractiveSaveChart(}
Dim strFileName As String * Имя файла для сохранения
'Проверка, выделена ли диаграмма
If ActiveChart Is Nothing Then
'Нет выделенных диаграмм
MsgBox "Выделите диаграмму"
Else
'Выбор файла для сохранения
strFileName = Application.GetSaveAsFilename( 一
ActiveChart.Name & ".gif", "Файлы GIF (*.gif), *・gif", 1, _ ^Сохранить диаграмму в формате GIF")
'Проверка, выбран ли файл
If strFileName о и" Then
т Сохранение выделенной диаграммы в файл
ActiveChart.Export strFileName, "GIF"
End If
End If
End Sub
Как и в предыдущем примере, перед сохранением диаграмму нужно выделить, иначе появится окно с соответствующим сообщением. После запуска макроса опсроет- ся окно Сохранить диаграмму в формате GIF (см. соответствующую строку приведенного выше кода), в котором по обычным правилам Windows указываете* путь для сохранения и присваивается имя файлу диаграммы.
Построение и удаление диаграммы нажатием одной кнопки
В данном разделе мы рассмотрим трюк, реализовав который можно будет быстро строить и удалять диаграммы нажатием лишь одной кнопки.
Предположим, у нас есть следующие исходные данные (выручка по торговым точкам), на основании которых нужно построить диаграмму (рис. 5.5).
Я По магазинам ;Магазнн1 !Магазин2 МагазинЗ Ма^змн4 :
而而論h,…寸二,就剣二:渉电一二Щ^~37Ь0;
Рис. 5.5. Исходные данные для построения диаграммы
Теперь нам нужно написать код, который представлен в листинге 56 Этот код должен быть помещен в модуль рабочего листа.
Листинг 5.6. Быстрое построение и удаление диаграммы
Sub СreateChaft ()
'Создание диаграммы
Charts ・ Add
■ Параметры диаграммы
Тип диаграммы
AativeChart.ChartType = xlLineMarkers
Заголовок
ActiveChart. SetSourceData Range (f,Bl: E2n) , xlRows
ActiveChart * Location xlLocationAsObject, Name
Остальные параметры With ActiveChart
1 Заголовок
.HasTitle 工 True
* CbartTitle.Characters.Text = Name
' Заголовок оси категорий
*Axes(xlCategory, xlPrimary)»HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitie.Characters.Text =Sheets(Name).Range("Al").Value
'Заголовок оси значений
•Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text _ =Sheets (Name) . Range (MA211) .Value
* Отображение легенды
.HasLegend - False
.HasDataTable = True
.DataTable.ShowLegendKey = True
'Настройка отображения With .Axes(xlCategory).HasMajorGridlines =.HasMinorGridlines = End With With .Axes(xlValue),HasMajorGridlines ^.HasMinorGridlines = End WithEnd WithEnd Sub'Настройка отображения With .Axes(xlCategory).HasMajorGridlines =.HasMinorGridlines = End With With .Axes(xlValue),HasMajorGridlines ^.HasMinorGridlines = End WithEnd WithEnd SubсеткисеткиTrueFalseTrueFalseTrueFalseTrueFalse
'Настройка отображения With .Axes(xlCategory)
.HasMajorGridlines =
.HasMinorGridlines = End With With .Axes(xlValue)
,HasMajorGridlines ^
.HasMinorGridlines = End With
End With
End Sub
'Настройка отображения With .Axes(xlCategory)
.HasMajorGridlines =
.HasMinorGridlines = End With With .Axes(xlValue)
,HasMajorGridlines ^
.HasMinorGridlines = End With
End With
End Sub
сетки
сетки
True
False
True
False
True
False
True
False
Sub DeleteChart()
'Удаление диаграммы
ActiveSheet.Chartobjects * Delete End Sub
После написания кода мы уже можем строить диаграмму — для этого достаточно запустить макрос CreateChart. Но мы упростим этот процесс.
Поместим на текущий рабочий лист две кнопки: Создать диаграмму и Удалить диаграмму (при этом следует воспользоваться средствами панели инструментов Формы, вызываемой с помощью команды Вид ► Панели инструментов > Формы). К кнопке Создать диаграмму привяжем макрос CreateChart, а к кнопке Удалить диаграмму — макрос Deletechart (после написания кода оба эти макроса будут доступны в окне выбора макросов). Теперь для создания диаграммы достаточно будет наткать кнопку Создать диаграмму — результат представлен на рис. 5.6.
Рис. 5.6. Создание диаграммы одним нажатием кнопки
Для удаления построенной диаграмма с рабочего листа достаточно нажать кнопку Удалить диаграмму.
В предыдущем разделе мм рассматривали порядок сохранения диаграммы в отдельном файле с расширением GIF. Этот процесс также можно упростить.
Для этого на текущем рабочем листе нужно с помощью панели инструментов Формы создать кнопку Сохранить диаграмму в файл и привязать к этой кнопке макрос InteractiveSaveChart (код данного макроса приведен в предыдущем разделе).
В результате при нажатии данной кнопки откроется окно, в котором по обычным правилам Windows следует указать путь и имя сохраняемого файла.
Не стоит забывать, что перед сохранением диаграммы ее необходимо выделить.
Вывод списка диаграмм в отдельном окне
В процессе работы иногда бывает необходимо узнать, какие диаграммы содержит текущий рабочий лист или книга. В данном разделе мы рассмотрим несколько макросов, позволяющих репшть эту задачу.
Например, если нужно быстро узнать количество внедренных диаграмм текущего рабочего листа, то можно воспользоваться таким макросом (листинг 5.7).
Листинг 57 Внедренные диаграммы
Sub ShowSheetCharts()
Dim strMessage As String
Dim i As Integer
'Формирование списка диаграмм
For i = 1 To ActiveSheet*ChartObjects.Count strMessage = strMessage & ActiveSheet.Chartobjects(i).Name 一 & vbNewLine
Next i
'Отображение списка
MsgBox strMessage
End Sub
После выполнения данного макроса на экране отобразится окно с перечнем имен внедренных диаграмм активного рабочего листа.
Можно вывести список рабочих листов, содержащих обычные диаграммы (вынесенные на отдельный рабочий лист). Пример макроса, позволяющего решить эту задачу, приведен в листинге 5.8.
Листинг 5,8. Перечень рабочих листов, содержащих обычные диаграммы
Sub ShowBookCharts О
Dim crt As chart
Dim strMessage As String
' Формирование списка диаграмм
For Each crt In ActiveWorkbook.Charts
strMessage = strMessage & crt.Name & vbNewLine
Next
'Отображение списка
MsgBox strMessage
End Sub
После применения данного макроса появится окно с перечнем рабочих листов текущей книги, содержащих диаграммы.
Применение случайной цветовой палитры
Рассматриваемый в данном разделе трюк носит чисто эргономический характер. С его помощью можно при работе с внедренными диаграммами применять совершенно случайные цвета заливки элементов диаграммы.
Для получения эффекта случайной цветовой палитры можно использовать следующий макрос (листинг 5.9).
Листинг 5・9・ Случайная цветовая палитра
Sub RandomChartColors()
Dim intGradientStyle As Integer, intGradientVariant As Integer Dim i As Integer
'Проверка, выделена ли диаграмма
If ActiveChart Is Nothing Then Exit Sub
'Изменение оформления всех категорий
For i = 1 То ActiveChart * Seriescollection.Count With ActiveChart.Seriescollection(i)
Вид градиентной заливки (случайный) intGradientStyle = Int(Rnd *7)+1 If intGradientStyle = 6 Then intGradientStyle = 1 Xf intGradientStyle = 7 Then
intGradientVariant = Int(Rnd * 2) + 1 Else
intGradientVariant = Int(Rnd * 4) + 1 End If
' Применение градиента
・Fill.TwoColorGradient Style:=intGradientStylef Variant:=intGradientVariant
' Установка случайных цветов фона и обводки (используются _ для градиента)
.Fill.ForeColor.SchemeColor = Int(Rnd * 57) + 1
.Fill.BackColor.SchemeColor = Int(Rnd * 57) + 1 End With
Next i
End Sub
Чтобы изменить цветовую палитру диаграммы, необходимо выделить ее и запустить данный макрос.
Эффект прозрачности диаграммы
С помощью несложного трюка можно сделать так, что диаграмма будет прозрачной. Для этого можно применить, например, такой макрос (листинг 5.10).
Листинг 5.10. Эффект прозрачности диаграммы
Sub TransparentChart()
Dim shpShape As Shape
Dim dblColor As Double
Dim srSerie As Series
Dim intBorderLineStyle As Integer
Dim intBorderColorIndex As Integer
Dim intBorderWeight As Integer
'Проверка, есть ли выделенная диаграмма If ActiveChart Is Nothing Then Exit Sub 'Изменение отображения каждой категории For Each srSerie In ActiveChart.Seriescollection - If (srSerie.ChartType = xlColumnClustered Or _ srSerie.ChartType = xlColumnStacked Or _ srSerie.ChartType = xlColumnStackedl00 Or _ srSerie.ChartType = xlBarClustered Or — srSerie.ChartType = xlBarStacked Or _ srSerie.ChartType = xlBarStackedlOO) Then
'Сохранение прежнего цвета категории dblColor - srSerie.Interior.Color 'Сохранение стиля линий intBorderLineStyle = srSerie * Border♦Linestyle 'Цвет границы xntBorderColorlndex = srSerie.Border.Colorindex т Толщина линий границы intBorderWeight = srSerie.Border.Weight
,Создание автофигуры
Set shpShape = ActiveSheet * shapes.AddShape — (msoShapeRectangle, 1, 1, 100, 100)
With shpShape
' Закративаем нужным цветом
.Fill.ForeColor•RGB = dblColor
'Делаем прозрачной
.Fill.Transparency = 0.4
'Убираем линии
.Line.Visible = msoFalse
End With
'Копируем автофигуру в буфер обмена shpShape.CopyPicture Appearance:=xlScreen, Format:=xlPicture
'Вставляем автофигуру в изображения столбцов категории и настраиваем
With srSerie
'Собственно вставка
.Paste
'Возвращаем на место толщину линий
»Border.Weight = intBorderWeight
'Стиль линий
.Border.Linestyle = intBorderLineStyle
Цвет границы
.Border.Colorindex = intBorderColorIndex
End With
'Автофигура больше не нужна shpShape ・ Delete
End If
Next srSerie
End Sub
После применения данного макроса диаграмма станет прозрачной. Степень прозрачности указывается в строке .Fill. Transparency = 0.4 —в данном примере она равна 40 %. При необходимости данный параметр можно изменить по своему усмотрению. Например, на рис. 5.7 показана диаграмма, у которой прозрачность составляет 60 % (эта же диаграмма изображена на рис. 5*4 в непрозрачном виде).
Выручка за период
Рис. 5.7. Прозрачная диаграмма
Данный трюк применяется к созданным ранее диаграммам.
Построение диаграммы на основе данных нескольких рабочих листов
В процессе работы нередко возникает необходимость в оперативной обработке данных, которые хранятся на нескольких рабочих листах. Как известно, одним из способов обработки информации является построение диаграмм. В этом разделе мы рассмотрим, каким образом можно построить одновременно несколько диаграмм, исходными данными для которых будет информация, расположенная на нескольких рабочих листах.
Предположим, что у нас имеются пять разных таблиц, которые расположены на пяти рабочих листах, причем количество строк в этих таблицах различается. Одна из таких таблиц показана на рис. 5.8.
А
В
с
D—
1
Таблица 4
Магазины] Октябрь
Магазин ji „25000
Магазин 23200
Ноябрь …""3100
25400
Декабрь
1500
3250
Итого за 4
кв.
29600
31而
•6 ^Магазин 3
7 ^Магазин 4
18 iМагазин Ё эПйтогд''
17400
жоо
740028400
_2500
3140
51240
28700
湎
9200
一二函 29850'
40400
~ 20740
卅 150990
Рис. 5.в. Пример таблицы
Для построение диаграмм на основании данных, хранящихся в этих таблицах» мож но использовать макрос, код которого приведен в листинге 5.11.
Листинг 5.11. Одновременное создание нескольких диаграмм
Sub ManyCharts()
Dim intTop As Long, intLeft As Long
Dim intHeight As Long, intWidth As Long
Dim sheet As Worksheet
Dim IngFirstRow As Long' Первая строка с данными
Dim intSerie As Integer1 Текущая категория диаграммы
Dim strErrorSheets As String 1 Список листов, для которых _
не удалось построить диаграммы
intTop = 1' Верхняя точка первой диаграммы
intLeft ^ 1' Левая точка каждой диаграммы
intHeight = 180* Высота каждой диаграммы
intWidth = 300' Ширина каждой диаграммы
'Постоение диаграммы для каждого листа, кроме текущего For Each sheet In ActiveWorkbook.Worksheets
If sheet.Name <> ActiveSheet.Mame Then
'Первый заполненный ряд
IngFirstRow = 3 'Первая категория intSerie = 1
On Error GoTo DiagrammError
' Добавление и настройка диаграммы
With ActiveSheet.Chartobjects.Add _
(intLeft, intTopr intWidth, intHeight).Chart
Do Until IsEmpty(sheet * Cells(IngFirstRow + intSerie, 1))
Создание ряда
.Seriescollection.NewSeries
'Значения для ряда
.Seriescollection(intSerie) *Values = _
sheet.Range(sheet.Cells(IngFirstRow + intSerie, 2), _ sheet.Cells(IngFirstRow + intSerie, 4))
* Диапазон данных для подписей
.Seriescollection(intSerie).XValues = _ sheet.Range("B3:D3 ”)
Название ряда (берется из столбца "А" таблицы с данными)
.Seriescollection(intSerie).Name = sheet.Cells (— IngFirstRow + intSerie, 1)
intSerie = intSerie + 1
Loop
Настройка внешнего вида диаграммы .ChartType = x!3DColumnClustered .ChartGroups(1).Gapwidth = 20 .PlotArea・Interior.Colorindex = xlNone .ChartArea.Font.Size — 9 1 Диаграмма с легендой -HasLegend = True 'Заголовок .HasTitle = True
.ChartTitie.Characters.Text = sheet.Range(HA1n) 'Задание диапазона значений на осях .Axes(xlValue).Minimumscale = О .Axes(xlValue).Maximumscale = 120000 1 Стиль линий сетки (прерывистый) .Axes(xlValue) * Maj orGridlines.Border. _ LineStyle = xlDot End With On Error GoTo 0 'Сдвиг верхней точки следующей диаграммы на высоту текущей диаграммы
intTop = intTop + intHeight AfterError:
End If
Next sheet
If strErrorSheets О п'* Then
'Отобразим список листов, для которых не построили диаграммы MsgBox "Не удалось построить диаграммы для листов:м & Chr(13)
& strErrorSheets, vbExclamation
End If
Exit Sub
DiagrammError:
'Добавление в список имени листа, для которого не смогли _ построить диаграмму (ошибка в данных для диаграммы)
strErrorSheets = strErrorSheets & sheet.Name & Chr (13)
'Удаление пустой диаграммы на текущем листе
ActiveSheet.Chartobjects(ActiveSheet.Chartobjects.Count).Delete
* Продолжаем работу с другими листами
Resume AfterError
End Sub
Перед запуском макроса нужно создать пустой рабочий лист для диаграмм. Макрос следует запускать, находясь на этом рабочем листе. В результате выполнения макроса будет создано сразу пять диаграмм, расположенных одна под другой, — по диаграмме для каждой таблицы. Диаграммам будут присвоены названия в соответствии со значением, хранящимся в ячейке А1 (например, на рис. 5.8 в данной ячейке хранится значение Таблица 4, поэтому и соответствующая ей диаграмма будет называться Таблица 4). Особо следует отметить, что приведенный макрос корректно обрабатывает данные в разных таблицах, несмотря на то что количество строк в них различается.
Создание подписей к данным диаграммы
Опытным пользователям Excel известно, что порядок добавления подписей на диаграммы оставляет желать лучшего. В данном разделе мы рассмотрим прием, который позволяет быстро создать подписи к точкам диаграммы.
Диаграмма, а также исходные данные, на основании которых она построена, приведены на рис. 5.9.
Для управления отображением подписями к точкам диаграммы нужно в стандартном модуле редактора VBA написать следующий код (листинг 5.12).
Листинг 5Л2. Подписи к данным диаграммы
Sub ShowLabels()
Диапазон с подписямиДиаграммаТочка, для которой добавляется подписьДиапазон с подписямиДиаграммаТочка, для которой добавляется подписьDim rgLabels As Range
Диапазон с подписями
Диаграмма
Точка, для которой добавляется подпись
Диапазон с подписями
Диаграмма
Точка, для которой добавляется подпись
Dim chrChart As Chart Dim intPoint As Integer 'Определение диаграммы
Set chrChart = ActiveSheet.Chartobjects(1).Chart
Рис. 5.9. Диаграмма без подписей
* Запрос на ввод диапазона с исходными данными
On Error Resume Next
Set rgLabels = Application.InputBox _
(prompt:=иУкажите диапазон с подписями", Type:=8)
If rgLabels Is Nothing Then Exit Sub
On Error GoTo 0
'Добавление подписей
chrChart.Seriescollection(1).ApplyDataLabels _
Type:=xlDataLabelsShowValue,
AutoText:=True, _ LegendKey:=False
'Просмотр диапазона и назначение подписей
For intPoint = 1 То chrChart.Seriescollection(1).Points.Count
chrChart.Seriescollection(1). 一
Points(intPoint).DataLabel.Text = rgLabels(intPoint) Next intPoint End Sub
Sub DeleteLabels()
'Удаление подписей диаграммы
ActiveSheet.Chartobjects(1).Chart.Seriescollection(1).— HasDataLabels = False
End Sub
В результате написания данного кода будут созданы два макроса: ShowLabels (для включения подписей) и DeleteLabels (для их выоючения). После выполнения
макроса showLabels откроется диалоговое окно, в котором нужно указать диапазон исходных данных для создания подписей.
На рис. 5.10 показана диаграмма с подпргсями.
_300i_300iПосле iПосле i:1Ж:1Ж17бТ17бТA i В i С I D I E i F :A i В i С I D I E i F :Рис. 5.10. Диаграмма с подписямиРис. 5.10. Диаграмма с подписями缘•■!■缘•■!■ПослеПосле而"而"_До„ jTod1_До„ jTod1第一.第一.
_300i
_300i
После i
После i
:1Ж
:1Ж
17бТ
17бТ
A i В i С I D I E i F :
A i В i С I D I E i F :
Рис. 5.10. Диаграмма с подписями
Рис. 5.10. Диаграмма с подписями
缘•■!■
缘•■!■
После
После
而"
而"
_До„ j
Tod1
_До„ j
Tod1
第一.
第一.
В данном случае в качестве исходных данных для создания подписей был использован диапазон А2:А9.
Создание полезных программ
В данной главе приведено несколько конкретных примеров создания приложени!! для дальнейшего их использования в Microsoft Excel.
Программа для составления кроссвордов
В этом разделе мы рассмотрим, каким образом, используя механизм пользовательских форм и механизм макросов, можно создать программу для быстрого составления кроссвордов.
Написание макросов
В первую очередь нам необходимо создать рабочую книгу с листом. В стандартном модуле следует написать код, который приведен в листинге 6.1. В дальнейшем мы подробнее рассмотрим назначение макросов, которые будут созданы после написания кода.
Листинг 6Л. Программа для составления кроссворда
Const dhcMinCol 工 1Const dhcMaxCol = 35Const dhcMinRow = 1Const dhcMaxRow = 35Const dhcMinCol 工 1Const dhcMaxCol = 35Const dhcMinRow = 1Const dhcMaxRow = 35Номер первого столбца кроссворда
Const dhcMinCol 工 1
Const dhcMaxCol = 35
Const dhcMinRow = 1
Const dhcMaxRow = 35
Const dhcMinCol 工 1
Const dhcMaxCol = 35
Const dhcMinRow = 1
Const dhcMaxRow = 35
Номер последнего столбца кроссворда
Номер первой строки кроссворда
Номер последней строки кроссворда
Sub Clear()
Выделение и очистка всех используемых для кроссворда ячеек
Range(Cells(dhcMinRow, dhcMinCol), _ Cells(dhcMaxRow, dhcMaxCol)).Select
Selection.Clear
Удаление сетки всего кроссворда
ClearGrid
Range (,fAlH) .Select
End Sub
Sub ClearGrid0
• Удаление сетки кроссворда (в выделенных ячейках)...
Возврат прежнего цвета ячеек
Selection.Interior.Colorlndex = xlNone
* Задание начертания границ ячеек по умолчанию
Selection.Bonders(xlDiagonalDown).LineStyle ^ xlNone
Selection.Borders(xlDiagonalUpI.LineStyle = xlNone
Selection.Borders(xlEdgeLeft).LineStyle = xlNone
Selection.Borders(xlEdgeTop).LineStyle = xlNone
Selection.Borders(xlEdgeBottom).Linestyle = xlNone
Selection.Borders(xlEdgeRight).LineStyle = xlNone Selection.Borders (xllnsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone End Sub
Sub DrowCrosswordGrid()
'Процедура начертания сетки кроссворда
Задание цвета всех ячеек кроссворда
Selection.Interior.ColorIndex 工 35 'Линии по диагонали не нужны Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone
'Задание начертания границ всех диапазонов, входящих _ в выделение, а также границ между соседними ячейками _ всех диапазонов
On Error Resume Next 'Левые границы With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin .Colorindex = xlAutomatic End With * Правые границы With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous •Weight = xlThin .Colorindex = xlAutomatic
End With
Верхние границы
With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin .Colorindex = xlAutomatic
End With
'Нижние границы
With Selection.Borders(xlEdgeBottom)
•LineStyle = xlContinuous .Weight = xlThin -Colorlndex = xlAutomatic
End With
* Вертикальные границы между ячейками With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight - xlThin
.Colorindex = xlAutomatic
End With
'Горизонтальные границы между ячейками With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.Colorindex = xlAutomatic
End With
End Sub
Sub DisplayGrid()
'Включение сетки на листе
ActiveWindow.DisplayGridlines = True End Sub
Sub HideGridQ
Выключение сетки на листе
ActiveWindow.DisplayGridlines = False
End Sub
Sub AutoNumber()
Нумерация клеток, являющихся началом слов
Dim intRow As Integer
1 Текущая строка
Dim intCol As Integer
1 Текущий ряд
Dim cell As Range
1 Текущая ячейка (с координатами —
(intRow, intCol))
Dim fTop As Boolean
'=True, если cell имеет соседей сверху
Dim fBottom As Boolean
* = True, если cell имеет соседей снизу
Dim fLeft As Boolean
'=True, если cell имеет соседей слева
Dim fRight As Boolean
' =True, если cell имеет соседей справа
Dim intDigit As Integer
'Текущий номер слова в кроссворде
intDigit = 1
Нумерация слов с 1
Проходим по всем клеткам диапазона, используемого _ для кроссворда, сверху вниз слева направо и анализируем _ каждую угловую и крайнюю (левую и верхнюю) ячейки
For intRow = dhcMinRow То dhcMaxRow For intCol = dhcMinCol To dhcMaxCcl 'Текущая ячейка Set cell = Cells(intRow, intCol)
' Проверка, входит ли ячейка в кроссворд (по ее цвету) If cell.Interior.Colorlndex = 35 Then
fLeft н False fRight = False fTop = False fBottom = False On Error Resume Next * Определение наличия соседей у ячейки... 'сверху
fTop = cell.Offset(-1, 0).Interior.Colorindex = 35 'снизу
fBottom = cell.Offset(1, 0).Interior.Colorindex - 35 'слева
fLeft - cell*Offset(0, ^1).Interior.Colorindex 二 35 'справа
fRight = cell,Offset(0, 1).Interior.Colorindex = 35 On Error GoTo 0
'Анализ положения ячейки
If (Not fTop And Not fLeft) Or —
(Not fBottom And Not fLeft And fRight) Or (Not fLeft And fRight) Or _ (Not fTop And fBottom) Then
'Ячейка подходит для начала слова SetDigit intOigit, cell intDigit = intDigit + 1 End If End If Next intCol Next intRow
End Sub
Sub SetDigit(intDigit As Integer, cell As Range)
Вставка цифры intDigit в ячейку, заданную параметром cell cell.Value = intDigit
'Изменение настроек шрифта так, чтобы было похоже — на настоящий кроссворд
'Маленький размер шрифта
cell.Font,Size = 6
'Выравнивание текста по левому верхнему углу ячейки
cell-HorizontalAlignment = xlLeft
cell.Vert icalAlignment = xlTop
End Sub
Sub ToPrint()
' Удаление цветовой подсветки кроссворда
Cells.Interior.Colorindex = xlNone
End Sub
Sub ToNumber()
'Закрытие первой формы и переход ко второй
UserForml・ Hide
UserForm2.Show
End Sub
Листинг 6.1 состоит из девяти макросов (семь первых можно запускать вручную):
DrowCrosswordGrid — рисует сетку кроссворда для выделенных ячеек;
口 Clear — удаляет кроссворд с рабочего листа;
口 ciearGrid — удаляет рамку кроссворда в выделенных ячейках;
口 AutoNumber — записывает номера в ячейки кроссворда;
口 DisplayGrid — показывает сетку рабочего листа;
HideGrid — убирает сетку рабочего листа;
Q ToPrint — удаляет цветовую подсветку ячеек кроссворда;
SetDigit — помещает нужное число в указанную ячейку (этот макрос используется макросом AutoNumber для записи номеров в ячейки);
ToNumber — переход от основной формы ко второй форме (см. ниже).
Вызывать все эти макросы вручную довольно неудобно. Их можно запускать посредством элементов правления, которые можно поместить прямо на рабочий лист или на пользовательскую форму. О создании пользовательской формы рассказывается в следующем разделе.
Создание пользовательских форм
Для создания основной формы программы необходимо воспользоваться панелью инструментов Формы, для вызова которой следует выполнить команду главного меню Вид ► Панели инструментов ► Формы. С помощью данной панели нужно по обычным правилам создать форму, изображенную на рис* 6.1.
Рис. 6.1. Первая форма программы
К элементам формы привяжем макросы (все привязываемые макросы входят в состав кода, который приведен выше, и доступны в окне, открываемом при выполнении команды Сервис > Макрос ► Макросы):
переключатель Сетка присутствует — макрос DisplayGrid;
переключатель Сетка на поле отсутствует — макрос HideGrid;
кнопка Новый кроссворд — макрос clear;
кнопка Нарисовать рамку — макрос DrawCrasswordGrid;
кнопка Стереть рамку — макрос ciearGrid;
кнопка Дальше — макрос ToNumber.
Теперь аналогичным образом (с помощью панели инструментов Формы) создадим еще одну форму, которая показана на рис. 62
К элементам данной формы привяжем следующие макросы (они также присутствуют в коде и доступны в окне выбора макросов):
кнопка Автонумерация — макрос AutoNumber;
кнопка Очистить все — макрос Clear;
кнопка Вывести на печать — макрос ToPrint.
Следует отметить, что можно не создавать пользовательские формы, а размещать все элементы управления прямо на рабочем листе, используя все ту же панель инструментов Формы. Если так поступить^ то кнопка Далее в первой (главной) форме становится ненужной.
Итак, у нас все готово для составления кроссвордов. О порядке использования программы рассказывается в следующего разделе.
Рис. 6.2. Вторая форма программы
Порядок использования программы
С помощью созданной программы можно быстро составлять и нумеровать сетку кроссворда. Рассмотрим конкретный пример.
На листе создадим несколько выделеюшх областей, объединив их (рис. 63).
Рис. 6.3. Выделение нескольких областей
Теперь нажмем кнопку Нарисовать рамку — результат представлен ла рис. 6*4.
Нажимаем кнопку Дальше — будет отображена вторая форма программы (см. рис. 6.2). В этой форме следует нажать кнопку Автонумерация. В результате сетка кроссворда будет быстро пронумерована (рис. 6.5).
Теперь нажимаем кнопку Вывести на печать, н на листе отобразится готовая сетка кроссворда (рис. 6.6).
Рис. 6.4. Рамка кроссворда
Рис* 6.5. Нумерация сетки кроссворда
Рис. 6.6. Готовая сетка кроссворда
С помощью кнопки Очистить есе с листа удаляется рамка кроссворда*
Кнопка Стереть рамку, которая находится в главной форме, позволяет удалить всю рамку (для этого ее нужно выделить) либо ее выделенный фрагмент.
При нажатии кнопки Новый кроссворд удаляется все содержимое документа, после чего можно приступать к составлению нового кроссворда.
Игра «Минное поле»
Пользователям Windows известно, что в комплект поставки операционной системы входит несколько игр, в том числе Сапер. Однако не многие знают, что подобную игру можно создать самостоятельно в Excel, используя механизм макросов.
Игра «Минное поле», о которой рассказывается в данном разделе, во многом анало- гачна стандартной игре Сапер. Для создания игры необходимо написать несколько макросов, объедргненных в два кода: первый код должен быть помещен в модуль того рабочего листа, на котором предполагается разместить игру, а второй — в стандартный модуль.
В модуль рабочего листа необходимо поместить такой код (листинг 6.2).
Листинг 6・2・ Код в модуле рабочего листа
Sub Worksheet_SelectionChange(ByVai Target As Range)
Dim intCol As Integer, intRow As Integer
Dim intMinesAround As Integer
Dim fInGameField As Boolean
'Определим, попадает ли в игровое поле выделенная ячейка
fInGameField = (Target.Row >= 2} And (Target.Kow <= 7)— And (Target.Column >= 2) And (Target.Column <= 7)
* Обрабатываем выделение ячейки
If Target .Value = ”*'' And f InGameField Then
• Пользователь выделил ячейку с миной - покажем мину
Target.Font.Color = RGB(0, 0, 0)
Target.Interior.Color = RGB(255, 0, 0)
1 Пользователь проиграл!
EndGame
Elself flnGameField Then
'Пользователь выделил пустую ячейку. Оформим эту ячейку
Target * Interior.Color = RGB(0, 0, 255)
Target.Font.Color = RGB(0, 255, 0)
Target.Font.Size =16
• Подсчитаем количество мин рядом с ячейкой (вокруг ячейки) For intCol = Target.Column - 1 To Target,Column + 1
For intRow 口 Target.Row - 1 To Target.Row + 1 If Target.Worksheet.Cells(intRow, intCol).Value 二 ”*” — Then
'Нашли очередную мину intMinesAround = intMinesAround + 1 End If
Next
Next
* Отображение количества мин Target.Value = intMinesAround End If
End Sub
Код, который должен находиться в стандартном модуле, выглядит следующим образом (листинг 6.3).
Листинг 6.3* Код в стандартном модуле
Sub NewGame()
'Начало новой игры
' Подготовим поле для игры InitGame
Dim intRow As Integer, intCol As Integer
Dim intMinesCount As Integer ' Количество мин
' Расставляем мины (то есть в случайные ячейки помещаем _ значения и*и делаем цвет шрифта таким же, как цвет 一 фона этих ячеек)
For intMinesCount ^ 1 То 10
'Строка для мины (от 2 до 7) intRow = Int( (6 * Rnd) +1)+1 'Столбец для мины (от 2 до 7) intCol = Int ( (6 * Rnd) +1)+1
'Ставим мину, если ячейка пустая If Cells(inURow, intCol) <> … Then Cells(intRow, intCol).Font.Color = 一 Cells(intRow, intCol)* Interior.Color
Cells (intRow, intCol) .Value = '•*" Else
'В данной ячейке мина есть - продолжим поиск ячеек intMinesCount = intMinesCount - 1
End If
Next
' Вывод информации о количестве мин в строку состояния Application.StatusBar = пКоличество мин “ & intMinesCount End Sub Sub InitGame()
,Раскраска (оформление) листа перед началом игры
Dim intRow As Integer, intCol As Integer
'Цвет фона всех ячеек
Cells.Interior.Color = RGB(0, 200, 75) 'Цвет шрифта всех ячеек
Cells * Font.Color ^ RGB(0, 0, 0)
'Размер шрифта
Cells.Font»Size = 18 'Все надписи - по центру
Cells.HorizontalAlignment = xlCenter
' Всем ячейкам игрового поля назначим особый цвет
For intRow = 2 То 7
For intCol = 2 То 7
Cells(intRowf intCol>.Interior.Color = RGB(200, 200, 200)
Cells(intRow, intCol).Value ="”
Next
Next
End Sub
Sub EndGame()
, Завершение игры (поражение)
Dim intRow As.Integer, intCol As Integer
'Покажем все мины. Для этого сделаем цвет шрифта всех ячеек черньш (ведь во всех ячейках с минами "★” цвет шрифта и цвет заливки одинаковы)
For intRow = 2 То 7
For intCol = 2 То 7
If Cells(intRow, intCol).Value = ”*" Then
Cells(intRow, intCol).Font.Color ^ RGB(0, 0, 0)
End If
Next
Next
MsgBox "Проигрыш" End Sub
В данном примере рабочее поле игры будет расположено в диапазоне B2:G7. Для удобства поместим под ним кнопку вызова новой игры (для этого воспользуемся панелью инструментов Формы, которая вызывается с помощью команды Вид ► Панели инструментов ► Формы) и привяжем к ней макрос NewGame (этот макрос будет доступен в окне выпора после написания кода).
На рис, 6.7 показан интерфейс созданной игры «Минное поле».
*Начало игры*Начало игрыРис. 6.7. Игра «Минное поле»Рис. 6.7. Игра «Минное поле»
*Начало игры
*Начало игры
Рис. 6.7. Игра «Минное поле»
Рис. 6.7. Игра «Минное поле»
Для запуска новой игры нужно нажать кнопку Начало игры или запустить макрос NewGame. Количество спрятанных мин будет показано в строке состояния. Ячейки на минном поле удобнее выбирать с помощью мыши. При выборе пустой ячейки в ней отобразится количество мин, расположенных рядом с данной ячейкой. При выборе ячейки с миной появится окно с сообщением Проигрыш (текст сообщения можно изменять по своему усмотрению путем внесения соответствующих корректировок в код игры).
Игра «Угадай животное»
В данном разделе мы рассмотрим создание небольшой игры, которая называется «Угадай животное». Смысл ее заключается в том, что пользователь загадывает определенное животное, а компьютер с помощью «наводящих» вопросов пытается его отгадать. Характерной особенностью игры является то, что она способна к «самообучению»: если какое-то животное не отгадано и пользователь дал подсказку, оно в дальнейшем будет угадываться.
Итак, создадим рабочую книгу, в которую входят листы Main и Data. Лист Main — это лист, который будет открыт по умолчанию при запуске данной книги. На нем следует расположить кнопку, с помощью которой будет запускаться игра (подроб-
нее об этом рассказано ниже). Здесь также можно ввести произвольный текст, например, приветствие или что-то в этом роде: Вас приветствует программа "Угадай животное" И Т. П.
Содержимое листа Data показано на рис. 6.8 (обратите внимание на координаты данных — именно на такое их расположение ориентирован приведенный ниже код программы).
Dim intLastRow As IntegerDim intKow As IntegerDim intYesRow As IntegerDim intNoRow As IntegerDim strText As StringDim strNewName As StringDim strNewQuestion As StringDim intLastRow As IntegerDim intKow As IntegerDim intYesRow As IntegerDim intNoRow As IntegerDim strText As StringDim strNewName As StringDim strNewQuestion As String
Dim intLastRow As Integer
Dim intKow As Integer
Dim intYesRow As Integer
Dim intNoRow As Integer
Dim strText As String
Dim strNewName As String
Dim strNewQuestion As String
Dim intLastRow As Integer
Dim intKow As Integer
Dim intYesRow As Integer
Dim intNoRow As Integer
Dim strText As String
Dim strNewName As String
Dim strNewQuestion As String
Приступим к созданию макроса игры. Для этого в модуле рабочего листа Main напишем код, который приведен в листинге 6.4.
Листинг 64 Игра «Угадай животное*
Sub StartGame О
Номер строки для вставки записей
Номер текущей строки
Номер строки, из которой братьданные при утвердительном ответе
Номер строки, из которой брать 一данные при отрицательном ответе
Строка с вопросом или названием —животного
Строка с названием нового животного
Строка с новым вопросом
Dim intRes As Integer
'Начало игры
MsgBox "Начнем игру. Задумайте животное.", vbOKOnlyf — "Задумайте животноем
'Определение номера ряда для вставки записей. _ intLastRow-1 - номер последнего ряда, содержащего данные intLastRow = Worksheets(nData°).Range(°D1").Value + 1
'Данные в таблице идут с первого ряда
intRow = 1
Do While intRow < intLastRow
1 Текст вопроса или название животного из столбца "А,т strText = Worksheets ("Data11) .Cells (intRow, 1) .Value ' Номер p月да, из которого брать данные при утвердительном _ ответе, берем из столбца "В”
intYesRow = Worksheets(MData").Cells(intRow, 2)-Value
Номер ряда, из которого брать данные при отрицатель ном _ ответе, берем из столбца "С"
intNoRow = Worksheets("Datan).Cells(intRow, 3).Value
If intYesRow > 0 Then
'В строке strText содержится вопрос. Зададим его intRes = MsgBox(strText, vbYesNo, "Вопрос”) If intRes = vbYes Then
'Переходим по утвердительному ответу intRow = intYesRow
Else
'Переходим по отрицательному ответу intRow = intNoRow
End If
Else
Альтернативы закончились * В строке strText - название 一 животного. Спросим, его ли загадали
intRes = MsgBox (11 Это " & strText & "?", vbYesNo, "Вопрос") If intRes = vbYes Then
'Животное угадано.
MsgBox г,Угадано 1 Спасибо за игру! ", vbOKOnly, "Игра завершена"
Exit Do
Else
'Животное не угадали, но данные уже занкончились, _ Нужно пополнить наши данные, чтобы отличать животное _ с названием strText от загаданного
'Ввод названия нового животного
strNewName ^ InputBox("Сдаюсь. Кто это?", _ ^Напечатайте название животногоп)
If strNewName <> "“ Then
* Ввод вопроса, по которому отличать животных strNewQuestion = InputBox(^Задайте вопрос, по ” & _ ^которому можно отличить '" & strNewName & — ":от ‘” & strText & "'", "Напечатайте вопрос11)
If strNewQuestion <> "” Then
' Определение, какие из животных соответствует _ утвердительному ответу на вопрос
intRes = MsgBox(иПравильный ответ ка ваш " & _ "вопрос - " & strNewName & ”‘”, vbYesNo, _
'*Какой ответ на вопрос?т,)
'Добавление в таблицу названия нового животного
Worksheets ("Data*) -Cells (intLastRow, 1).
Value = strNewName
Перемещения названия животного# которое было _ ранее, в конец таблицы
Worksheets (,TDatan) .Cells (intLastRow + 工,1) . _ Value = strText
Замена названия этого животного вопросом
Worksheets (^Data) .Cells (intRow^ 1).—
Value = strNewQuestion
' Корректировка номеров строк для перехода _
в зависимости от того, какое животное является —
,правильным ответом на введенный пользователем вопрос
If intRes = vbYes Then
'Новое животное - правильный ответ
Worksheets("Data4).Cells(intRow, 2).— Value = intLastRow
Worksheets ("Data11) .Cells (intRow, 3). _
Value = intLastRow + 1
Else
'Бывшее ранее животное - правильный ответ
Worksheets("Data").Cells(intRow, 2). _
Value = intLastRow + 1
Worksheets (•,Data1T) • Cells (intRow, 3}.— Value = intLastRow
End If
После этого на листе Main создадим кнопку Старт (для этого следует воспользоваться панелью инструментов Формы) н назначим ей макрос startGame. После нажатая данной кнопки на экране отобразится окно, изображенное на рис. 6.9.
Рис. 6.9. Начало игры
После нажатия в данном окне кнопки ОК программа начнет задавать вопросы, с помощью которых попытается узнать, какое животное загадано. Если отгадать не удастся, то программа выдаст окно с соответствующим запросом, в котором с клавиатуры можно ввести название загаданного животного, а затем — вопрос, ответом на который является введенное значение. Введенные данные сохранятся в таблице и будут использоваться в дальнейшем.
Работа данной программы и, главное, ее «обучение^ основаны на особенном строении данных, используемых этой программой. Они организованы в виде бинарного дерева4 Каждый элемент этого дерева, являющийся вопросом, — узел, а элемент, являющийся названием животного, — лист. Каждый узел содержит два элемента (пусть левый и правый). При отрицательном ответе на вопрос рассматривается левый элемент» при утвердительном — правый. Если рассматриваемый элемент является узлом, то опять задается вопрос н анализируется ответ. Если же элемент — лист, то мы дошли до конца цепочки возможных вопросов и ответов, остается только спросить, является ли содержимое листа правильным ответом. В случае правильного ответа работа программы завершается. Если же ответ неправильный, то пользователь вводит вопрос, позволяющий отличить загаданное им животное от того, которое предположила программа. Название животного заменяется вопросом (на место листа дерева вставляется узел). Слева помещается название старого животного (лист), а справа — загаданного пользователем (тоже лист дерева). Так пополняются знания приведенной программы.
Так как для хранения данных у нас используется таблица, то элементы дерева хранятся в следующем виде* Значение элемента дерева (текст вопроса или название животного) содержится в столбце А. Для узла (то есть вопроса) в столбце В содержится номер строкн, на которую следует перейти при утвердительном ответе, а в столбце С — номер строки, на которую необходимо перейти при отрицательном ответе на вопрос. Для листа (названия животного) столбцы В и С пусты.
Кроме того, в ячейке D1 хранится номер первой строки, которая может быть использована для вставки новых данных. Заодно этот номер используется для предотвращения ошибок программы (зацикливания и прочих неприятностей) при поврежде* нии данных.
Расчет на основании ячеек определенного цвета
В зтом разделе мы отвлечемся от создания развлекательных программ типа игр и рассмотрим более практичный трюк. С его помощью можно разработать программу, которая будет выполнять необходимые расчеты с теми исходными данными, которые хранятся только в ячейках определенного цвета (или написаны шрифтом определенного цвета). Иначе говоря, в качестве критерия для включения в расчет тех или иных данных будет приннматься либо цвет заливки соответствующей ячейки^ либо цвет шрифта. Достоинством данной программы является то, что она проста и удобна в использовании.
Знакомиться с программой будем в два этапа: на первом этапе напишем код программы и создадим пользовательские формы, на втором — рассмотрим порядок ее использования.
Создание программы
Итак, для создания программы нужно в модуле VBA написать код, который выполняет все расчеты, и создать форму, которая позволит сделать использование функции расчета более наглядным.
Программный код в стандартном модуле VBA выглядит следующим образом (листинг 6.5)*
Листинг 65 Код в стандартном модуле
Const dhcSum As Integer = О
ConstConstdhcAvgdhcAvgInteger = 1Integer = 1Const dhcMax AsConst dhcMax AsInteger = 2Integer = 2Const dhcMin AsConst dhcMin AsInteger = 3Integer = 3
Const
Const
dhcAvg
dhcAvg
Integer = 1
Integer = 1
Const dhcMax As
Const dhcMax As
Integer = 2
Integer = 2
Const dhcMin As
Const dhcMin As
Integer = 3
Integer = 3
Const dhcCount As Integer = 4
Const dhcSumPlus As Integer = 5
Const dhcSumMinus As Integer = 6
Const dhcCountFull As Integer = 7
Const dhcCountNotNul1 As Integer = 8
Const dhcCountPlus As Integer = 9
Const dhcCountMinus As Integer ^ 10
Sub CalcColors()
1 Отображение формы Load frmColorCalc frmColorCalc,Show
End Sub
с установленным цветом шрифта _с установленным цветом шрифта _Public Function ColorCalc(strRange As String, IngColor As Long, fBackBolor As Boolean, _ intMode As Integer, Optional fAbsence As Boolean) As Double
с установленным цветом шрифта _
с установленным цветом шрифта _
'Операции над ячейками или заливки
Dim rgData. As RangeDim i As IntegerDim Values() As VariantDim intCount As IntegerDim cell As Range Dim varOut As VariantDim rgData. As RangeDim i As IntegerDim Values() As VariantDim intCount As IntegerDim cell As Range Dim varOut As VariantДиапазон ячеек для расчетов
Dim rgData. As Range
Dim i As Integer
Dim Values() As Variant
Dim intCount As Integer
Dim cell As Range Dim varOut As Variant
Dim rgData. As Range
Dim i As Integer
Dim Values() As Variant
Dim intCount As Integer
Dim cell As Range Dim varOut As Variant
Массив со значениями для расчета
Количество значений в массиве
В этой переменной хранятся _ результаты промежуточных подсчетов и окончательный результат
Set rgData = Range(strRange)
ReDim Values(1 To rgData.Count)
' Просматриваются все ячейки входного диапазона * Значения тех из них, _ цвет которых удовлетворяет условию, записываются в массив Values
For Each cell In rgData.Cells
'Если нужно суммировать по заливке:
If fBackBolor = True Then
'Включение ячейки в сумму в зависимости от цвета _ заливки и фильтра
If fAbsence Then
Если ячейка имеет заданный цвет, то она не включается — в вычисления
If cell * Interior.Color <> IngColor Then intCount = intCount + 1 Values(intCount) = cell.Value
End If
Else
'Если ячейка имеет заданный цвет, то она включается _ в вычисления
If cell.Interior-Color = IngColor Then intCount ^ intCount + 1 Values(intCount) = cell.Value
End If
End If
'В противном случае - суммируется по шрифту Else
'Включение ячейки в сумму в зависимости _ от ее цвета и фильтра
If fAbsence Then
' Если ячейка имеет заданный цвет, то она не включается в вычисления
If cell * Font.Color <> IngColor Then intCount = intCount + 1 Values(intCount) = cell.Value
End If
Else
'Если ячейка имеет заданный цвет, то она включается _ в вычисления
If cell.Font * Color = IngColor Then intCount = intCount + 1 Values(intCount) = cell.Value End If End If
End If
Next cell
Выполнение над собранными значениями операциих заданной в intMode For i = 1 То intCount
Select Case intMode
Case dhcSum, dhcAvg
Подсчет суммы значений varOut 工 varOut + Values(i)
Case dhaSumPlus
* Подсчет суммы положитель них значений
If Values(i) > 0 Then varOut = varOut + Values(i) Case dhcSuraMinus
Посчет суммы отрицательных значений
If Values(i) < 0 Then varOut = varOut + Values(i) Case dhcMax
Нахождение максимального значения
If Values(i) > varOut Then varOut = Values(i) Case dhcMin
'Нахождение минимального значения
If i = LBound(Values) Then varOut = Values(i)
If Values(i) < varOut Then varOut = Values(i) Case dhcCount
'Подсчет количества значений
varOut = varOut + 1
Case dhcCountFull
'Подсчет количества заполненных ячеек
If Not IsEmpty(Values(i)) Then varOut = varOut + 1 Case dhcCountNotNull
* Подсчет количества пустых ячеек
工f Not IsEmpty(Values(i)) And Values(i) <> 0 Then _ varOut = varOut + 1
Case dhcCountPlus
'Подсчет количества положительных значений
If Values(i) > 0 Then varOut = varOut + 1 Case dhcCountMinus
* Подсчет количества отрицательных значений
If Values(i) < 0 Then varOut = varOut + 1 End Select
Next i
'Окончательные операции для некоторых видов расчета
If intMode = dhcAvg Then
Вычисление среднего значения ColorCalc = varOut / intCount
Else
ColorCalc = varOut
End If
End Function
В приведенном выше коде реализованы следующие элементы:
функция ColorCalc — выполняет все расчеты с использованием цвета (параметры этой функции и ее аргументы рассматриваются в следующем разделе);
макрос CalcColors — отображает форму управления расчетом (см. ниже),
В проект VBA необходимо также добавить форму и поместить в ее модуль код, приведенный в листинге 6.6.
Листинг 6.6. Код в модуле формы
Dim IngCurColor As Long * Выбранный цвет, по которому _ идентифицировать (отбирать) ячейки
Dim intMode As Integer ' Номер типа вычисления в списке
Sub cmbApplyColor_Click()
If cboOtherColor4Value >= 0 Then
' Вычисление с использованием выбранного в списке цвета IngCurColor = cboOtherColor.Value SetColorSum
End If
Sub cmbColorl_Click()
'Вычисление с использованием цвета нажатой кнопки IngCurColor = cmbColorl.BackColor
SetColorSum
End Sub
Sub cmbColor2-Click()
* Вычисление с использованием цвета нажатой кнопки LngCurColor = cmbColor2.BackColor
SetColorSum
End Sub
Sub cmbColor3_Click()
“ Вычисление с использованием цвета нажатой кнопки LngCurColor = cmbColor3.BackColor
SetColorSum
End Sub
Sub cmbColor4_Click()
' Вычисление с использованием цвета нажатой кнопки IngCurColor = cmbColor4.BackColor
SetColorSum
End Sub
Sub cmbColor5_Click()
Вычисление с использованием цвета нажатой кнопки IngCurColor = cmbColor5.BackColor
SetColorSum
End Sub
Sub cmbColor6__Click ()
Вычисление с использованием цвета нажатой кнопки IngCurColor 二 cmbColor6.BackColor
SetColorSum
End Sub
Sub cmbColor7_Click()
* Вычисление с использованием цвета нажатой кнопки IngCurColor = cmbColor7.BackColor
SetColorSum
End Sub
Sub cmbColor8__Сlick ()
'Вычисление с использованием цвета нажатой кнопки IngCurColor = cmbColor8.BackColor
SetColorSum
End Sub
Sub cmbColor9_Click()
• Вычисление с использованием цвета нажатой кнопки IngCurColor = cmbColor9.BackColor SetColorSum
End Sub
Sub cmbColorlO_Click()
'Вычисление с использованием цвета нажатой кнопки IngCurColor = cmbColorlO.BackColor SetColorSum
End Sub
Sub cmbColorll_Click()
* Вычисление с использованием цвета нажатой кнопки IngCurColor = cmbColorll.BackColor SetColorSum
End Sub
Sub cmbColor 12__Click ()
■ Вычисление с использованием цвета нажатой кнопки IngCurColor = cmbColorl2.BackColor SetColorSum End Sub
Sub SetColorSum()
'Вычисление с использованием заданного цвета Dim strFormula As String
'Проверка правильности введенных диапазонов и номеров ячеек If txtResCell.Value = "” Then
MsgBox *'Введите адрес ячейки вставки функциип, vbCritical, "Внимание!"
txtResCell.SetFocus
Exit Sub
Elself txtRange.Value = "” Then
MsgBox "Введите адрес диапазона суммирования'1, _ vbCritical, "Внимание!м
txtRange.SetFocus
Exit Sub
End If
* Формирование формулы
strFormula 二 и=Со1огСа1с(n & ”""" & txtRange.Value & ' & ”「& IngCurColor & ",” & CInt (tglType .Value) & "," & intMode & "," & CInt(chkVarify.Value) & ”)"
* Запись формулы в ячейку
Range(txtResCell.Value).Formula = strFormula End Sub
Sub cmbExit_Click()
1 Закрытие формы Unload Me End Sub
Sub cboCalcTypes_AfterUpdate()
Изменение режима вычисления - сохраним в переменной номер вычисления
intMode = cboCalcTypes.Listindex End Sub
Sub cboOtherColor_Change()
'Изменение выделенного цвета в списке "Другой0 If cboOtherColor.Text <> •"” Then
Сохранение выбранного цвета в переменной IngCurColor 二 Vai(cboOtherColor.Value) End If End Sub
Sub tglType_Click()
'Изменение типа идентификации ячеек
If tglType.Value = -1 Then
Идентификация по цвету заливки tglType.Caption = "Заливка" Else
Идентификахлия по цвету шрифта
tglType.Caption = мШрифт"
End if
GetColors
End Sub
Sub txtRange_AfterUpdate()
'Изменение диапазона с исходными данными - покажем _кнопки с цветами, представленными в новом диапазоне
GetColors
End Sub
Sub txtRange_BeforeUpdate(ByVai Cancel As MSForms.ReturnBoolean) 'Проверка корректности данных, введенных в поле _ диапазона исходных данных
Dim rgData As Range
Dim cell As Range
'Проверкаr введен ли диапазон данных
If txtRange.Text = "” Then
MsgBox 11В в едите адрес диапазона суммирования !11, vbCritical, нОшибка выполнениян
Cancel = True
End If*
If txtResCell.Text = "” Then Exit Sub
On Error GoTo Errl
'Проверка отсутствия циклических ссылок (чтобы одна 一 из входных ячеек не была одновременно и выходной)
Set rgData = Range(txtRange.Text)
For Each cell In rgData.Cells
If cell *Address(False, False) = 一
Range(txtResCell.Text).Address(False, False) Then ' Нашли циклическую ссылку
MsgBox "Введите другой адрес во избежание ” & _
появления циклических ссылок", vbCritical,
** Внимание!"
Cancel = True
Exit Sub
End If
Next cell
Exit Sub
Errl:
Обработка ошибок при работе с ячейками If Err.Number = 1004 Then
MsgBox "Введите корректный адрес ячейки", vbCritical, 11 Ошибка ввода"
Cancel = True Exit Sub Else
MsgBox Err.Description, vbCritical, "Ошибка ввода" Cancel = True Exit Sub End If End Sub
Sub txtResCell_BeforeUpdate(ByVai Cancel As MSForms.ReturnBoolean) * Проверка корректности данных, введенных в поле — адреса выходной ячейки Dim rgData As Range Dim cell As Range
* Проверка, введен ли диапазон данных If txtRange.Text = "" Then
MsgBox nВведите адрес диапазона суммирования!", _ vbCritical, "Ошибка выполнения1'
Cancel = True”
End If If txtResCell.Text = "” Then Exit Sub On Error GoTo Errl 'Проверка отсутствия циклических ссыпок (чтобы одна 一 из входных ячеек не была одновременно и выходной) Set rgData = Range(txtRange.Text) For Each cell In rgData.Cells
If cell.Address(False, False) =_
Range(txtResCell,Text).Address(False, False) Then 'Нашли циклическую ссылку MsgBox "Введите другой адрес во избежание "&_ "появления циклических ссылок", vbCritical, _ "Внимание!” Cancel = True Exit Sub End If Next cell Exit Sub
Errl:
' Обработка ошибок при работе с ячейками
If Err.Number = 1004 Then
MsgBox "Введите корректный адрес ячейки", vbCritical, мОшибка ввода"
Cancel = True
Exit Sub
Else
MsgBox Err.Description, vbCritical, "Ошибка вводан
Cancel = True
Exit Sub
End If
End Sub
Sub UserForm_Activate()
т Инициализация формы при активации
Dim intFunc As Integer
Dim strFunc As String
'Заполение'Заполениесписка доступных операций
'Заполение
'Заполение
cboCalcTypes.Additem cboCalcTypes.List(0, cboCalcTypes.Additem cboCalcTypes.List(1f cboCalcTypes.Additem cboCalcTypes.List(2, cboCalcTypes.Additem cboCalcTypes.List(3, cboCalcTypes.Additem cboCalcTypes.List(4, cboCalcTypes-Additem cboCalcTypes.List(5, cboCalcTypes.Additem cboCalcTypes.List(6, cboCalcTypes.Addltem cboCalcTypes.List(7, cboCalcTypes.Additem cboCalcTypes * List(8, cboCalcTypes.Additem cboCalcTypes * List(9, cboCalcTypes.AddItem cboCalcTypes * List(10,cboCalcTypes.Additem cboCalcTypes.List(0, cboCalcTypes.Additem cboCalcTypes.List(1f cboCalcTypes.Additem cboCalcTypes.List(2, cboCalcTypes.Additem cboCalcTypes.List(3, cboCalcTypes.Additem cboCalcTypes.List(4, cboCalcTypes-Additem cboCalcTypes.List(5, cboCalcTypes.Additem cboCalcTypes.List(6, cboCalcTypes.Addltem cboCalcTypes.List(7, cboCalcTypes.Additem cboCalcTypes * List(8, cboCalcTypes.Additem cboCalcTypes * List(9, cboCalcTypes.AddItem cboCalcTypes * List(10,= uСумма"
cboCalcTypes.Additem cboCalcTypes.List(0, cboCalcTypes.Additem cboCalcTypes.List(1f cboCalcTypes.Additem cboCalcTypes.List(2, cboCalcTypes.Additem cboCalcTypes.List(3, cboCalcTypes.Additem cboCalcTypes.List(4, cboCalcTypes-Additem cboCalcTypes.List(5, cboCalcTypes.Additem cboCalcTypes.List(6, cboCalcTypes.Addltem cboCalcTypes.List(7, cboCalcTypes.Additem cboCalcTypes * List(8, cboCalcTypes.Additem cboCalcTypes * List(9, cboCalcTypes.AddItem cboCalcTypes * List(10,
cboCalcTypes.Additem cboCalcTypes.List(0, cboCalcTypes.Additem cboCalcTypes.List(1f cboCalcTypes.Additem cboCalcTypes.List(2, cboCalcTypes.Additem cboCalcTypes.List(3, cboCalcTypes.Additem cboCalcTypes.List(4, cboCalcTypes-Additem cboCalcTypes.List(5, cboCalcTypes.Additem cboCalcTypes.List(6, cboCalcTypes.Addltem cboCalcTypes.List(7, cboCalcTypes.Additem cboCalcTypes * List(8, cboCalcTypes.Additem cboCalcTypes * List(9, cboCalcTypes.AddItem cboCalcTypes * List(10,
= nСреднееn ”2“
= "Максимум"
= nМинимум" "4 «
= "Количеств。 ячеек"
п5°
= Сумма положительныхп
"6"
п "Сумма отрицательных*
= "Количество непустыхп “8”
"255”1) = "Красный" "52479"1) = "Оранжевый" "65535"1) = "Желтый” "32768"1) к "Зеленый" •'1677 6 960м1) = "Голубой" "26711680"1) ^ и Синий11 ”16711935”1) ^ "Фиолетовыйн "16777215п1) ^ "Белый11"О'*1) = нЧерныйм"255”1) = "Красный" "52479"1) = "Оранжевый" "65535"1) = "Желтый” "32768"1) к "Зеленый" •'1677 6 960м1) = "Голубой" "26711680"1) ^ и Синий11 ”16711935”1) ^ "Фиолетовыйн "16777215п1) ^ "Белый11"О'*1) = нЧерныйм
"255”
1) = "Красный" "52479"
1) = "Оранжевый" "65535"
1) = "Желтый” "32768"
1) к "Зеленый" •'1677 6 960м
1) = "Голубой" "26711680"
1) ^ и Синий11 ”16711935”
1) ^ "Фиолетовыйн "16777215п
1) ^ "Белый11
"О'*
1) = нЧерныйм
"255”
1) = "Красный" "52479"
1) = "Оранжевый" "65535"
1) = "Желтый” "32768"
1) к "Зеленый" •'1677 6 960м
1) = "Голубой" "26711680"
1) ^ и Синий11 ”16711935”
1) ^ "Фиолетовыйн "16777215п
1) ^ "Белый11
"О'*
1) = нЧерныйм
Заполнение списка дополнительных цветов
cboOtherColor.Additem cboOtherColor.List(О, cboOtherColor.AddItem cboOtherColor.List(1, cboOtherColor.Addltem cboOtherColor.List(2, cboOtherColor.Addltem cboOtherColor.List(3, cboOtherColor.Addltem cboOtherColor.List(4, cboOtherColor.Addltem cboOtherColor.List(5, cboOtherColor.Addltem cboOtherColor.List(6, cboOtherColor.Addltem cboOtherColor.List(7, cboOtherColor.Addltem cboOtherColor.List(8,
If Selection.Cells.Count 二 1 Then
* На листе есть выделенная ячейка. Определим, есть ли в этой ячейке формула с функцией ColorCalc
intFunc = InStr (Selection .Formula, "ColorCalc,') If intFunc > 0 Then
'Формула есть, заполним поля формы для вычислений
* Адрес ячейки с результатом txtResCell.Text = Selection.Address(False, False)
'Выделяем аргументы функции...
' Номера ячеек с исходными данными strFunc = Mid(Selection.Formula, intFunc + 11) intFunc = InStr (strFunc,…”)
txtRange.Text = Left(strFunc, intFunc - 1)
' Режим вычислений
strFunc = Mid(strFuncf intFunc + 1)
strFunc = Left(strFunc, Len(strFunc) - 1) intFunc = InStr (strFunc, ”」)
cboCalcTypes.Text = cboCalcTypes *List(Vai(Left$(— strFunc, intFunc - 1)), 1)
strFunc = Mid(strFunc, intFunc + 1) chkVarify.SetFocus chkVarify.Value = CBool(strFunc) IblChoose.Visible = True
GetColors
Else
'Будем применять формулу для выделенной ячейки txtRange.Value - Selection.Address(False, False) * В выделенной ячейке конкретная функция не задана.
Выберем первую функцию в списке cboCalcTypes.Text = "Суммаи End If Else 'Будем применять формулу для выделенной ячейки txtRange * Value = Selection.Address(False, False) 'В выделенной ячейке конкретная функзя не задана. Выберем первую функцию в списке cboCalcTypes.Text = "Сумма" End If End Sub
Sub GetColors ()
Отображение кнопок выбора цвета окрашенными в цвета, встречающиеся среди ячеек заданного диапазона
Dim rgCells As RangeDim i As IntegerDim intColorNumber As IntegerDim IngCurColor As LongDim fColorPresented As BooleanDim Ctrl As ControlDim strCtrl As StringDim fBackColor As BooleanDim rgCells As RangeDim i As IntegerDim intColorNumber As IntegerDim IngCurColor As LongDim fColorPresented As BooleanDim Ctrl As ControlDim strCtrl As StringDim fBackColor As BooleanНомер следующей кнопки — выбора цветаАнализируемый цветКнопка с цветом _IngCurColor уже существуетНомер следующей кнопки — выбора цветаАнализируемый цветКнопка с цветом _IngCurColor уже существует=True, если ячейки _ идентифицируются по цвету фона =False - по цвету шрифта=True, если ячейки _ идентифицируются по цвету фона =False - по цвету шрифта
Dim rgCells As Range
Dim i As Integer
Dim intColorNumber As Integer
Dim IngCurColor As Long
Dim fColorPresented As Boolean
Dim Ctrl As Control
Dim strCtrl As String
Dim fBackColor As Boolean
Dim rgCells As Range
Dim i As Integer
Dim intColorNumber As Integer
Dim IngCurColor As Long
Dim fColorPresented As Boolean
Dim Ctrl As Control
Dim strCtrl As String
Dim fBackColor As Boolean
Номер следующей кнопки — выбора цвета
Анализируемый цвет
Кнопка с цветом _
IngCurColor уже существует
Номер следующей кнопки — выбора цвета
Анализируемый цвет
Кнопка с цветом _
IngCurColor уже существует
=True, если ячейки _ идентифицируются по цвету фона =False - по цвету шрифта
=True, если ячейки _ идентифицируются по цвету фона =False - по цвету шрифта
fBackColor = tglType,Value
On Error Resume Next
'Скрытие всех кнопок выбора цвета For Each Ctrl In Me.Controls
If Left (Ctrl.Name, 8) = "cmbColor11 Then Ctrl.Visible - False
End If
Next Ctrl
On Error GoTo ErrRange
Set rgCells = Range(txtRange.Text) On Error GoTo 0
'Получение цвета первой ячейки If fBackColor = False Then
IngCurColor = rgCells.Cells(ij.Font.Color Else
IngCurColor ^ rgCells.Cells(i).Interior.Color End If
'Назначения цвета первой ячейки первой кнопке cmbColorl.BackColor = IngCurColor cmbColorl.Visible = True
Просмотр остальных ячеек и при нахождении новых цветов отображение кнопок, окрашенных в эти цвета
intColorNumber = 2
For i = 2 То rgCells.Cells.Count fColorPresented = False
'Получение цвета i-й ячейки If fBackColor = False Then
IngCurColor 二 rgCells.Cells(i).Font.Color
Else
IngCurColor = rgCells.Cells(i).Interior.Color End If
* Проверка, отображается ли уже кнопка с таким цветом For Each Ctrl In Me.Controls
If Left(Ctrl.Name, 8} = "cmbColor0 Rnd — Ctrl.Visible = True Then
If IngCurColor = Ctrl.BackColor Then
'Кнопка с цветом i-й ячейки уже отображается fColorPresented = True
Exit For
End if
End If
Next Ctrl
If Not fColorPresented Then
Кнопки с цветом IngCurColor еще нет - покажем ее intColorNumber = intColorNumber + 1 strCtrl = "cmbColor" & intColorNumber
Me.Controls(strCtrl).BackColor - IngCurColor
Me.Controls(strCtrl).Visible = True
End If
Next i
Exit Sub
ErrRange:
'Обработка ошибок при работе с диапазоном
If txtRange.Text = ”” Then
MsgBox "Введите адрес диапазона суммирования"f vbCritical, "Внимание!n
Else
MsgBox "Введен некорректный адрес диапазона суммирования11, vbCritical, "Ошибка!"
End If
'Установка курсора в поле ввода диапазона txtRange.SetFocus
End Sub
После помещения кода, представленного в листинге 6.6, в модуль формы необходимо сформировать ее внешний вад, как показано на рис. 6.10.
При работе с формой необходимо выполнить следующие действия (для присвоения значений свойствам используется панель VBA Properties (Свойства)):
форме присвоить имя frmColorCalc;
двенадцати кнопкам (в правой верхней часта формы) присвоить названия от cmbColorl ДО cmbColorl2;
口 текстовому полю для указания диапазона суммирования присвоить имя txtRange; □ текстовому полю для указания адреса ячейки с результатом присвоить имя txtResCell;
раскрнвающемус只 списку Другой присвоить имя cboOtherColor, а его свойству CoiumnCount — значение 2;
кнопке, расположенной справа от этого списка, присвоить имя cmbApplyColor;
口 раскрывающемуся списку Тип вычислений присвоить имя cboCalcTypes, а его свойству CoiumnCount — значение 2;
флажку Проверять нрисвонть имя chkvarify;
Вычисления с цветомВычисления с цветомДиапа>&исуминр0в«мияДиапа>&исуминр0в«мияJJJJJJJJ二 и二 иэлементу управления ToggleButton с надписью Шрифт присвоить имя tglType.
Вычисления с цветом
Вычисления с цветом
Диапа>&исуминр0в«мия
Диапа>&исуминр0в«мия
JJJJ
JJJJ
二 и
二 и
Признаксумнкровмия
ГфоверятьГфоверятьОтменаОтменаРис, 6«10« Пользовательская формаРис, 6«10« Пользовательская формаШрифт
Гфоверять
Гфоверять
Отмена
Отмена
Рис, 6«10« Пользовательская форма
Рис, 6«10« Пользовательская форма
'■ • • * ' г ''''.А<фос ячейки - ввода фориулы'■ • • * ' г ''''.А<фос ячейки - ввода фориулыТипвьгпугде】岬;Типвьгпугде】岬;
'■ • • * ' г ''''.
А<фос ячейки - ввода фориулы
'■ • • * ' г ''''.
А<фос ячейки - ввода фориулы
Тип
вьгпугде】岬;
Тип
вьгпугде】岬;
После произведенных действий можно легко заметить, что макросы в модуле формы —это обработчики событий соответствующих элементов управления.
Теперь создадим кнопку запуска программы (например, с помощью панели инструментов Формы, вызываемой командой Вид ► Панели инструментов > Формы) и назначим ей макрос calccolors, который будет доступен в окна выбора макро^ сов. На этом процесс создания профаммы можно считать завершенным.
Работа с программой
Для запуска созданной нами программы нажмем кнопку, которой назначен макрос CalcColors, — откроется окно, соответствующее пользовательской форме, которая приведена на рис. 6.10. Предварительно следует выделеть обрабатываемый диапазон — н этом случае поле Диапазон суммирования будет заполнено автоматически. В противном случае в данном поле следует с клавиатуры ввесги требуемый диапазон (например,厶5£15). Параметр Признак суммирования определяет, какой цвет шрифта или заливки будет применяться в качестве критерия отбора. Ирл этом справа в поле Выберите цвет отображается перечень цветов, входящих в обрабатываемый диапазон; для выбора достаточно щелкнуть мышью на кнопке соответствующего цвета. В расположенном ниже поле Другой из списка можно выбрать другой цвет. Список включает в себя варианты Красный, Оранжевый, Желтый, Зеленый, (Ълубой, Синий, Фиолетовый, Белый, Черный. Справа от поля Другой расположена кноп・ ка, при нажатии которой выбранный цвет будет применен.
В поле Адрес ячейки ввода формулы следует указать адрес ячейки, в которой будет показан результат расчетов.
Если установлен флажок Проверять, то будет включен «обратный фильтр». Иначе говоря, при установленном данном флажке в расчет принимаются те ячейки диапазона, которые не соответствуют указанному цвету. Напрнмер, если выбран красный цвет, то яче^кн с красным шрифтом (заливкой) не будут приниматься в расчет.
В поле Тил вычислений из раскрывающегося списка выбирается требуемая операция:
Сумма;
Среднее;
Максимум;
Минимум;
Количество ячеек;
Сумма положительных (значений);
Сумма отрицательных (значений);
Количество непустых (ячеек);
Количество непустых ненулевых (ячеек);
Количество положительных (значений);
Количество отрицательных (значений).
По умолчанию в поле Тип вычислений установлено значение Сумма*
Функция, которая создается в результате работы программы и результат применения которой отображается в ячейке, указанной в поле Адрес ячейки ввода формулы, выглядит примерно следующим образом:
=ColorCalc("D14:F17";255;0;0;0)
Эта формула включает в себя следующие элементы:
ColorCalc — имя функции;
D14 : F17 — обрабатываемый диапазон (можно ввести несколько диапазонов — в этом случае их следует указать через запятую);
255 — цвет, используемый в качестве критерия отбора (в рассматриваемом примере —красный);
0 (первый) — указывает на то, что параметру Признак суммирования установлено значение Шрифт (при выборе значения Заливка в [юрмуле будет отображаться -1);
0 (второй) — указывает на операцию, выбранную в поле Тип вычислений (в данном случае — Сумма); соответствующие константы перечислены в начале модуля, содержащего код функции CalcColor;
0 (третий) — указывает, что в расчет принимаются данные» соответствующие выбранному цвету (если указано 1, значит, включен «обратный фильтро; иначе говоря, в окне настройки параметров установлен флажок Проверять).
Формулы для подобных расчетов можно вводить и без пользовательской формы. При этом нужно строго соблюдать правила передачи параметров в функцию ColorCalc.
Полезные советы
Данная глава представляет собой перечень часто задаваемых вопросов, касающихся работы в Excel, и ответов на них. Предлагаемый материал поможет читателю быстро выйти из многих затруднительных ситуаций, которые могут возникать в процессе использования программы* Для удобства восприятия материал представлен в режиме «вопрос — ответ*.
Можно ли каким-либо способом увеличить количество строк и столбцов рабочего листа?
В настоящее время невозможно увеличить ни количество строк, ни столбцов рабочего листа, поскольку оно жестко зафиксировано разработчиком — корпорацией Microsoft,
Можно ли изменить шрифт, используемый по умолчанию для новой книги?
Да, можно. Для зтого следует выполнить команду Сервис > Параметры и в открывшемся окне иерей™ на вкладку Общие. Здесь в поле Стандартный шрифт из раскрывающегося списка можно выбрать шргк|л\ а в поле Размер — указать размер выбранного шрифта. Оба эти параметра будут использованы по умолчанию при создании новой книги, листа либо при следующем запуске Excel.
При открытии рабочей книги появляется стандартное предупреждение Excel о наличии в ней макросов. Однако ранее все макросы из данной книги были удалены. В чем может быть причина, В частности, не является ли это свидетельством того, что в компьютере завелся вирус?
При отсутствии макросов такое сообщение действительно может свидетельствовать о наличии в компьютере вирусов. Но здесь есть важный момент: при удалении макросов из рабочей книги необходимо удалить также модуль, в котором они находились. В подавляющем большинстве подобных случаев причиной появления сообщения о наличии макросов является не наличие вирусов, а то, что макросы были удалены, но модуль, в котором они содержались, остался.
Можно ли где-нибудь найти надстройки для Excel?
В первую очередь следует отметить, что Excel включает в себя ряд стандартных надстроек, которыми можно воспользоваться в любое удобное время. Переход в режим работы с надстройками осуществляется с помощью команды Сервис ► Надстройки. Кроме того, ряд дополнительных надстроек «от разработчика» можно загрузить со страницы Microsoft Office Update, В Интернете можно также найти множество надстроек для Excel (как платных, так и бесплатных), созданных независимf>imh разработчиками. Наконец, надстройки можно создавать собственными силами.
Каким образом в Excel обрабатываются дата и время — как текст или как числа?
Значения даты и времени обрабатываются в программе Excel как числа. При этом представление даты и времени в ячейке зависит от заданного для это!) ячейки формата чисел. При вводе даты или времени в ячейку, имеющую основной формат чисел, она приобретает встроенный формат даты или времени соответствен-
но. По умолчанию значения даты и времени выравниваются по правому краю ячейки. Если автоматически распознать формат даты или времени не удается, введенные значения интерпретируются как текст, который по умолчанию выравнивается в ячейке по левому краю.
Какие символы при работе в Excel могут быть интерпретированы как числа?
В программе Microsoft Excel числа могут содержать только следующие знаки:
0123456789 + -(),/$%.Ее
Все знаки «плюс» (+), стоящие перед числом, игнорируются, а запятая интерпретируется как разделитель десятичных разрядов. Все другие сочетания знаков, состоящие из цифр и иных знаков, распознаются в программе как текст.
Как программа Excel определяет, какой числовой формат необходимо использовать?
Как правило, числовой формат, применяемый к ячейке, определяется способом отображения числа в таблице. Если в ячейку, имеющую общий числовой формат, введено число, могут быть применены различные числовые форматы. Например, если введено число 15,77р., то в данном случае автоматически npi шеняется денежный 巾口 рмат.
Чтобы изменить числовой формат, внделнте ячейки, содержащие числа. В меню Формат выберите команду Ячейки. В открывшемся окне перейдите на вкладку Число, а затем выберите необходи^ю категорию и формат.
Как отобразить числовое представление даты или времени?
Независимо от формата, используемого для представления даты или времени, в программе Excel все даты хранятся как целые числа, а время сохраняется в виде десятично荘 дроби. Чтобы показать дату в виде числа или время в виде дроби, выделите ячейки, содержащие дату или время, выполните команду Формат ► Ячейки, в открывшемся окне перейдите на вкладку Число, а затем в списке Числовые форматы выберите формат Общий.
Можно ли в Excel вводить числа как текст, и если да, то как это сделать?
Да, такая возможность существует. В программе Microsoft Excel числа хранятся в виде числовых данных, даже если к содержащим их ячейкам был применен текстовый формат. Если такие данные, например коды товаров, необходимо интерпретировать как текст, то сначала желательно применить текстовый формат к пустым ячейкам (в окне Формат ячеек выберите формат Текстовый), а затем ввести числа. Если числа уже введены, назначьте ячейкам текстовый формат и, выделяя каждую ячейку* нажимайте клавишу F2, азатем — Enter, чтобы ввести данные заново.
Сколько значащих цифр поддерживается в программе Excel?
Независимо от количества отображаемых разрядов, числа хранятся с точностью 15 разрядов* Если число имеет больше 15 значащих цифр, разряды после 15-го преобразуются в нули (0).
Можно ли каким-нибудь образом изменить количество действий «отката», которое установлено в Excel по умолчанию, и если да, то как это сделать?
Да, такая возможность есть. Но сразу следует отметить, что выполнять данную операцию можно только опытным пользователям, поскольку она непосредственно связана с внесением изменений в системный реестр, а, как известно, неосторожное об* ращение с реестром может повлечь за собой серьезные проблемы.
Итак, для решения данной задачи нужно войта в раздел реестра hkey_current_user\ Software\Microsoft\Office\10.0\Excel\0ptions (вместо подраздела 10 • 0 может быть подраздел 9.0 или 8 ・ 0 — в зависимости от используемой версии профаммы) н найти параметр UndoHistory типа DWORD. Ecjui такого параметра нет, то его необходимо создать. В качестве значения данного параметра следует указать требуемое количество действий(отката>. Чтобы выполненные изменения вступили в силу, может потребоваться перезагрузка компьютера.
Каким образом можно отключить отображение заголовков строк и столбцов?
Для этого необходимо выполнить команду Сервис ► Параметры и в открывшемся окне на вкладке Вид снять флажок заголовки строк и столбцов, после чего нажать кнопку ОК.
Каким образом из окна На額стройки, открываемого с помощью команды Сервис ► Надстройки, можно удалить неиспользуемые надстройки?
Удаление надстроек из окна Надстройки штатными средствами Excel не предусмотрено. Решить данную проблему можно двумя способами. Первый способ заключается в редактировании системного реестра и удалении ссылок на те файлы надстроек, использовать которые в дальнейшем не планируется. Второй способ предусматривает удаление с жесткого диска файлов ненужных надстроек. После этого при попытке подключения такой надстройки в диалоговом окне Надстройки программа сама предложит удалить эту надстройку из списка.
Можно ли сделать так, чтобы макрос не отображался в окне списка макросов (данное окно вызывается с помощью команды Сервис ► Макрос ► Макросы), и если да, то как это сделать?
Да, при создании либо редактировашш макроса можно запретить его отображение в окне списка макросов. Для этого достаточно воспользоваться ключевым словом Private, например: Private Sub ИмяМакроса (). Если в дальнейшем потребуется включить макрос в список макросов, то ключевое слово Private иужно убрать из кода.
Каким образом при написании кода макроса можно вызвать процедуру, которая расположена в другой рабочей книге?
Для вызова процедуры из другой рабочей книги нужно воспользоваться методом Run объекта Application. Ниже показан фрагмент программного кода:
Run "Primer*xlsIMyMacro"
В данном примере вызывается процедура МуМасго, расположенная в рабочей книге Primer.xls,
В чем заключается разница между процедурой VBA и макросом?
Здесь никакой разницы нет. Эти термины в настоящее время являются взаимозаменяемыми.
При написании кода в редакторе VBA не работает символ продолжения текущей строки (подчеркивание) > В чем может быть проблема и как выйти из дашюй сн・ туации?
Скорее всего, проблема заключается в том, что в данном случае для продолжения строки используется только один символ — подчеркивание, а нужно использовать два символа: сначала — пробел, затем — подчеркивание.
Что представляет собой организатор картинок Microsoft?
Организатор картинок — это совместно используемая программа, которая доступна также и в других приложениях Microsoft Office. Она включает в себя средства поис* ка и вставки изображений, а также аудио- и видеофайлов. Кроме того, данную программу можно применять для просмотра графических файлов. С помощью организатора картинок можно получить доступ к коллекции картинок на сайте Microsoft.
Для перехода в режим работы организатора картинок предназначена команда Вставка ► Рисунок ► Картинки.
Никак не удается найти персональную книгу макросов, В чем может быть проблема?
Персональная книга макросов — это файл Personal .xls. В данном случае проблем ма, скорее всего, в том, что этот файл еще просто не создай. Персональная книга макросов создается только после того, как в нее записан хотя бы один макрос.
При открытии рабочей книги Excel выдает запрос на обновление связей* Однако проверка всех имеющихся формул показалаf что ни в одной из них связей нет* Как убрать это ошибочное сообщение?
Вероятнее всего, это сообщение ошибкой не является. Дело в том, что связи могут существовать не только в формулах. Если данная рабочая книга содержит диаграмму, то нужно щелкнуть на каждой из последовательностей диаграммы и просмотреть формулы ряд» Если формула ссылается на другую рабочую книгу, то это означает наличие связи. Для удаления этой связи нужно переместить исходные данные диаграммы в текущую рабочую книгу и создать диаграмму заново.
При выполнении команды Вставка ► Имя ► Присвоить открывается диалоговое окно Присвоение имени, в котором нужно прокрутить имеющийся список» обращая при этом внимание на значение поля Формула. Необходимо удалить те имена, которые ссылаются на другую рабочую книгу, либо те, которые имеют неправильные ссылки #ссьш!.
Каким образом можно установить произвольный размер листа, например X столбцов на Y строк?
Наиболее приемлемый вариант — просто скрыть все лишние строки н столбцы с помощью команд Формат ► Строка ► Скрыть и Формат ► Столбец ► Скрыть соответственно.
Можно ли в Excel вывести на экран скрытое сообщение со списком разработчиков, как это делается в некоторых других программах?
Чтобы получить такое сообщение (кстати, подобные скрытые сообщения называются «пасхальные яйца») в Excel 2000, необходимо выполнить следующие действия.
L Открыть новую рабочую книгу Excel.
Нажать клавишу F5.
Ввестн Х2000 : L2000, после чего нажать Enter.
Нажать клавишу Tab — в результате курсор переместится в столбец М.
Удерживая нажатыми клавиши Ctrl н Shift, щелкнуть правой кнопкой мыши на кнопке Мастер диаграмм, которая расположена на панели инструментов Стандартная, В отдельных случаях щелкнуть нужно не правой, а левой кнопкой.
В результате выполненных действий на экране отобразится список разработчиков программы Excel 2000. В Excel 2002 подобна функциональность на данный момент не обнаружена.
Существует ли в настоящее время какая-нибудь утилита, с помощью которой можно было бы преобразовать приложение Excel в отдельный ЕХЕ-файл?
К сожалению, на сегодняшний день о подобных утилитах ничего не известно, поэтому, скорее всего, их просто нет.
Никак не удается ввести текст, который начинается с двух прописных букв. В чем может быть причина и как решить данную проблему?
Причина заключается в параметрах автозамены. Чтобы решить данную проблему, нужно выполнить команду Сервис ► Параметры автозамены и в открывшемся окне Автозамена на вкладке Автозамена снять флажок Исправлять ДВе ПРописные буквы в начале слова. Здесь же можно отредактиро вать и другие параметры автозамены.
Можно ли оптимизировать запуск Excel, и если да, то как это сделать?
Для оптимизации запуска программн существует несколько способов. Например, чтобы отключить отображение программной заставки, которая требует определенных ресурсов компьютера при загрузке Excel, необходимо выполнить следующее: щелкнуть правой кнопкой мыши па ярлыке Excel на Рабочем столе (либо на соответствующем пункте меню Пуск) н в открывшемся контекстном меню выбрать пункт Свойства. Затем в открывшемся окне иужно перейти на вкладку Ярлык и в поле Объ* ект в конце строки добавить символы /Е (не вместо имеющегося значения, а именно добавить в конце строки!)* После нажатия в данном окне кнопки 0К программа Excel будет запускаться без экранной заставки, что несколько ускорит процесс загрузки.
На этой же вкладке можно задать сочетание клавиш, с помощью которого будет запускаться Excel. Для этого нужно в поле Быстрый вызов ввести требуемую комбинацию клавиш и нажать кнопку 0К.
Как в Excel 2002 включить отображение команд меню, которое использовалось в предыдущих версиях (то есть чтобы при открытии меню все команды отобра- жалггсь сразу, а не после задержки)?
Чтобы решить данный вопрос, нужно изменить настройку отображения меню. Для этого следует выполнить команду Вид ► Панели инструментов ► Настройка и в открывшемся окне на вкладке Параметры установить флажок Всегда показывать полные меню. Теперь при открытии меню будут отображаться сразу все входящие в него команды, как это было в предыдущих версиях программы.
Можно ли, используя штатные средства программы, изменить количество рабочих листон в новой книге?
Для решения дашюй задачи нужно выполнить команду Сервис ► Параметры и в открывшемся окне на вкладке Общие в поле Листов в новой книге установить требуемое количество рабочих листов. При этом следует учитывать, что максимально возможное значение данного ноля — 255.
Как ввести в ячейку несколько абзацев? При нажатии Enter не получается — курсор переходит в следующую ячейку.
Нередко возникают ситуации, когда в ячейк^т необходимо ввести текст, содержащий несколько абзацев. Однако при нажатии оашшш Enter осуществляется переход в следующую ячейку. Для решения данной проблемы следует после ввода абзаца нажать сочетание клавиш Alt+Enter — таким образом можно ввести в ячейку текст, содержапин! несколько абзацев.
Каким образом можно создавать разные рабочие книги с одинаковым форматированием?
В данном случае наиболее приемлемым является использование механизма шаблонов. Для этого нужно подготовить рабочую книгу, на основании которой будут создаваться другие книги, и задать в ней необходимые параметры форматирования и оформления документа, после чего сохранить данную книгу как шаблон (с помощью команды Файл ► Сохранить как, указав в окне Сохранение документа в по* ле Тип файла значение Шаблон). Если при этом в качестве панки для сохранения выбрать каталог автозагрузки Excel — XLStart (обычно эта папка хранится ПО адресу С:\Program Files\Microsoft Office\Office 10\XLStart), TO CO- зданныЛ шаблон будет использоваться по умолчанию при запуске Excel. Если же сохранить шаблон в каком-нибулъ другом месте, то для доступа к нему необходимо будет воспользоваться командой Файл ► Открыть.
Можно ли в Excel изменить установленный по умолчанию тип диаграммы?
Возможности программы предусматривают установку типа диаграммы, которая будет использоваться по умолчанию при создании новых диаграмм. Для этого нужно создать любую новую диаграмму кли открыть лист с созданной ранее диаграммой, выделить диаграмму н выполнить команду Дна「р日 мма ► Тип диаграммы (либо пункт Тип диаграммы контекстного меню). I【ослезтого в открывшемся окне следует выбрать требуемый тип диаграммы и нажать кнопку Сделать стандартной. Тип днафаммы, используемый по умолчан>1ю, можно изменять в любое время по мере надобности.
Каким образом можно перетащить ячейку на другой рабочий лист?
Обычньш образом перетащить ячейку на другой рабочий лист не получится. Для решения данной проблемы нужно при перетаскивании нажать клавишу ALtT после чего с помощью ярлычков выбрать требуемый лист.
Можно ли при установленном формате с двумя знаками после запятой сделать так, чтобы нулевые значения не отображались?
В процессе заполнения таблицы при установленном формате с двумя знаками после запятой в ячейках, значения которых равны нулю, появляется запись 0,00. Однако при решении ряда задач подобные значения недопустимы. Конечно, по окончании подготовки документа такие значения можно с корректировать вручную, однако это по целому ряду причин далеко не лучший вариант.
Для решения данной проблемы целесообразнее будет убрать обнуление ячеек. Для этого необходимо выполнить команду Сервис ► Параметры, в открывшемся окне перейти на вкладку Вид и снять флажок нулевые значения. После этого нулевое значение не появится в ячейке даже после ввода его вручную. Не стоит забывать, что данная настройка будет действительна только для активного рабочего листа.
Для Excel 2000 был создан макрос, который добавляет код VBA к проекту. При запуске этого макроса в Excel 2002 появляется сообщение об ошибке. В чем может быть причина и как выйти из этой ситуации?
Причина заключается в том, что в Excel 2002 имеется новый параметр — Доверять доступ к Visual Basic Project По умолчанию данный параметр отключен. Чтобы его включить, нужно вьшолиить команду Сервис ► Макрос ► Безопасность и в отмывшемся окне Безопасность на вкладке Надежные источники установить соответстт4у- юший флажок.
Как известно, при использовании в расчетах формул в ячейках отображается не сама формула, а результат ее вычисления. Однако при необходимости проверить правильность формул (особенно при работе с большими объемами информации) это неудобно, поскольку для проверки каждой формулы нужно устанавливать курсор в соответствующую ячейку. Можно ли сделать так, чтобы вместо результатов вычислений в ячейках отображались сами формулы, и если да, то как потом вернуться в первоначальное состояние?
Данная проблема решается штатными средствами программы. Для этого нужно воспользоваться командой Сервис > Зависимости формул ► Режим проверки формул. При ее выполнении осуществляется переход в режим отображения формул. Для возврата к первоначальному состоянию следует повторно выполнить эту команду.
Можно ли в Excel выполнить одновременное форматирование нескольких рабочих листов?
В Excel реализована возможность одновременного форматирования нескольких рабочих листов. Для этого перед форматированием нужно выделить требуемые листы. Чтобы выделить все листы текущей рабочей книги, нужно щелкнуть правой
кнопкой мыши на ярлычке любого листа и выбрать в контекстном меню пункт Выделить все листы. Для выборочного выделения листов нужно щелкать на соответствующих ярлычках, удерживая клавишу Ctrl либо Shift. Вьшолненное форматирование будет применено сразу ко всем выделенным листам текущей рабочей книш.
Необходимо настроить автоматическое форматирование, которое зависит от вводимых данных (например, если значение в ячейке больше 100, то цвет ее фона становится желтым иъ п.)< Можно ли это сделать штатными средствами программы, не прибегая к помощи макросов?
Да, такая возможность есть — для подобных целей удобно использовать условное форматирование. Переход в данный режим работы осуществляется с помощью команды Формат ► Условное форматирование.
При работе с большими объемами информации иногда возникает необходимость быстро ознакомиться со всеми примечаниями. Можно ли штатными средствами системы сделать так, чтобы на рабочем листе отобразились все имеющиеся примечания (а не только Ш1Д1псаторы в правом верхнем углу соответствующих ячеек)?
Да, штатные средства программы предусматривают такую возможность. Для этого нужно выполнить команду Сервис ► Пара метры, в открывшемся окне перейта на вкладку Вид и установить переключатель Примечания в положение примечание и индикатор, после чего нажать кнопку ОК.
Можно ли как-нибудь узнать, содержит ли текущая рабочая книга макровирус?
В большинстве случаев для решения данной проблемы целесообразно воспользоваться специал из!<рованным и анл !вирусными программами. Если же это по каким- либо причинам затруднительно, то можно попробовать приведенный ниже способ.
В редакторе VBA нужно открыть проект, соответствующий подозрительной рабочей книге, просмотреть все модули и обратить внимание на незнакомый код VBA. В большинстве случаев код вируса плохо отформатирован н содержит большое количество переменных с незнакомыми (и даже странными) названиями.
Данные на рабочем листе расположены в нескольких диапазонах, которые разделены между собой пустыми строками либо пустыми столбцами. Можно ли каким-нибудь способом быстро выделить один из этих диапазонов?
Оптгшал ьный способ в данном случае — это установить курсор в любую ячейку вну* три диапазона и нажать одновременно клавиши Ctrl и * («звездочкам — на цифровой клавиатуре). В результате будет полностью выделен диапазон с активной ячейкой.
Каким образом можно быстро пересчитать формулы, применяющие пользовательскую функцию?
Для решения данной задачи следует воспользоваться комбинацией клавиш Ctrl+ALt+F9.
Как известно, для вывода на печать какой-нибудь области рабочего листа нужно выделить ее, а затем в окне настрой1си параметров печати установить реясим Выделенный диапазон. При зтом, если необходимо распечатать несколько разных
выделенных областей, приходится повторять данную операцию каждый раз. Можно ли автоматизировать этот процесс?
Данная проблема решается достаточно просто. Для этого следует выделшъ все области, которые необходимо вывести на печать (несколько областей можно выделить, удерживая нажатой клавишу Ctrl), после чего в окне настройки параметров печати, как обычно, установить режим Выделенный диапазон. В результате каждая выделенная область будет распечатана на отдельной странице. Следует учитывать, что предложенный способ можно использовать только в том случае, если все выделешгые области расположены на одном рабочем листе.
Можно ли каким-либо способом запретить пользователям «прокручивать» рабочий лист?
Для решения данной проблемы можно посоветовать с1фыть неиспользуемые строки и столбцы. Если этот вариант по каким-либо причгтам неприемлем, то можно воспользоваться соответствующим оператором VBA. Ниже ггриведен пример, в котором оператор устанавливает область прокрутки на листеЛист! таким образом, что пользователь не сможет работать с ячейками за пределами диапазона А1:Е2О:
Worksheets (лЛист111) .ScrollArea = ПА1 :Е20"
Для восстановления первоначальной области прокрутки следует воспользоваться таким оператором:
Worksheets(мЛист1п).ScrollArea = “"
Необходимо учитывать, что значение свойства ScrollArea не сохраняется в рабочей книге, поэтому его необходимо устанавливать при каждом открытии книги. Данный оператор можно разместить в процедуре Workbook_open.
При предварительном просмотре документа перед его выводом на печать выяснилось, что содержащиеся в нем данные выходят за пределы страницы, поэтому печатать в таком виде его нельзя. Можно ли решить эту проблему, не изменяя размеров ячеек?
Возможно, в данном случае будет целесообргшньш изменение масштаба документа. Для этого нужно выполнить команду Файл ► Параметры страницы и в открывшемся окне на вкладке Страница установить переключатель в положение разместить не более чем на 1 стр. в ширину и 1 стр. в высоту. При повторном открытии окна Параметры страницы можно определить, в каком масштабе будет распечатан документ — 9To значение отобразится в поле переключателя установить ... % от натуральной величины.
Можно ли сделать так, чтобы документ распечатывался вместе с сеткой?
По умолчанию Excel не выводит на печать сетку рабочего листа. Однако при необходимости эту настройку можно изменить. Чтобы документ выводился на печать вместе с сеткой, необходимо в окне Параметры страницы (открывается с помощью команды Файл ► Параметры страницы) на вкладке Л ист установить флажок сетка, после чего нажать кнопку ОК. Здесь же находится еще несколько полезных параметров. В частности, путем установки флажка заголовки строк и столбцов можно выво-
дить на печать номера строк и названия столбцов; в поле примечания нз раскрывающегося списка можно выбрать требуемый режим вывода на печать имеющихся на рабочем листе примечаний (возможные значения — нет, В конце листа и Как на листе); в поле ошибки ячеек как указывается наиболее приемлемый способ печати находящихся в ячейках ошибок
Можно ли каким-либо образом изменять цвет ярлыков рабочих листов?
Возможность изменения цвета ярлыков рабочих листов реализована, начиная с вверсии Excel 2002. Для этого нужно щелкнуть правой кнопкой мыши на ярлыке и в открывшемся контекстном меню выбрать пункт Цвет ярлычка. В результате откроется окно Выбор цвета ярлычка. В данном окне нужно выбрать квадратик с нужным цветом и нажать кнопку ОК. В предыдущих версиях Excel возможность изменить цвет ярлыка рабочего листа отсутствует.
Можно ли изменять цвета шрифта, которые используются по умолчаишо для оформле!шя фрагментов программного кода (ключевых слои, комментариев, иден- тифшеаторов ит* д.) в редакторе VBA?
Для перехода в режим соответствующих настроек нужно в редакторе VBA выполнить команду Tools ► Options (Сервис ► Параметры) и в открывшемся окне перейти на вклад icy Editor Format (Формат редактора). На данной вкладке приводится перечень всех возможных фрагментов программного кода. Для настройки оформления следует выбрать требуемую позицию списка и в соответствующих полях указать тип и размер шрифта, его цвет, цвет выделенного текста и др.
Существует ли возможиость изменения предложенного по умолчанию шрифта ярлыков рабочих листов?
Да, такая возможность существует, но соответствующие настройки выполняются не в Excel, а в разделе Экран окна Панель управления. Для перехода в режим настройки размера шрифта, используемого для ярлыков рабочих листов, нужно выполнить команду Пуск ► Панель управления ► Экран, затем в открывшемся окне перейти на вкладку Оформление и нажать кнопку Дополнительно — в результате откроется окно Дополнительное оформление. В данном окне в поле Элемент из раскрывающегося списка нужно выбрать значение Полоса прокрутки н установить требуемый размер шрифта в поле Размер. При этом необходимо учитывать, что выполненные изменения коснутся и других элементов интерфейса (в частности, соответствующим образом изменится полоса прокрутки в окнах приложений).
Можно ли изменить используемые в программе по умолчанию шрифт и цвет комментариев к ячейкам?
Да, такая возможность существует, и она также находится за пределами Excel. В окне Свойства: Зкран (открываемом с помощью команды Пуск ► Панель управления ► Экран) нужно перейти на вкладку Оформление и нажать кнопку Дополнительно —откроется окно Дополнительное оформление. В данном окне в поле Элемент нужно выбрать значение Всплывающая подсказка, после чего в открывшихся полях указать требуемый шрифт и цвет. Необходимо помнить, что выполненные
изменения отразятся и в других местах (в иастностн, соответствующим образом изменится шрифт и цвет системных всплывающих подсказок).
При добавлении в редакторе VBA нового модуля он всегда начинается со строки Option Explicit. Что означает данная строка и для чего она нужна?
Если строка option Explicit находится в начале модуля, это означает» что необходимо объявлять все переменные, которые будут использоваться в пределах данного модуля. Если необходимо отключить автоматическое появление данной строки в новых модулях, то следует в редакторе VBA выполнить команду Tools ► Options (Сервис ► Параметры), в открывшемся окне перейти на вкладку Editor (Редактор) и снять флажок Require Variable Declaration (Явное описание переменных).
При использовании сложных макросов иногда возникает необходимость в получении динамической информации о ходе их выполиения. Можно ли выводить такую информацию в строке состояния?
Да, используя средства VBA, можно решить данную проблему. Для этого следует назначить строковые данные свойству statusBar объекта Application. Соответствующий оператор выглядит следующим образом:
Application.StatusBar = "Обработка файла ” & FileNum
По окончании процедуры следует вернуть строке состояния первоначальный вид. Для этого используется такой оператор:
Application,StatusBar = False
По ошибке были удалены некоторые элементы главного меню рабочего листа, и возвратить их никак не получается. С помощью перезапуска Excel проблему решить не удалось. Какой может быть выход из дашюй ситуации?
Для решения данной проблемы нужно выполнить команду Сервис ► Настройка (либо Вид ► Панели инструментов ► Настройка), затем в открывшемся окне на вкладке Панели инструментов выделить позицию списка Строка меню листа и нажать кнопку Сброс. В результате главное меню примет вид, который был установлен по умолчанию.
Приложение. Основные объекты Excel
В данном прмложенмн кратко описаны наиболее часто используемые в приведенных в книге примерах стандартные объекты Microsoft Excel:
Application;
Chart;
Range;
Workbook;
口 Worksheet.
В целях обеспечения краткости данного приложения описаны не все свойства, методы н процедуры обработки событий приведенных объектов, а лишь те из них, которые реально использовались в примерах программ.
Объект Application
Объект Application представляет собой все приложение Microsoft Excel. Этот объект предоставляет доступ к настройкам и параметрам запущенного приложение Excel. С помощью объекта Application можно также получать доступ к функциям (Cell, Range и др.) и объектам верхнего уровня (ActiveCell, ActiveChart и др.). Следует отметите что к большинству свойств и методов объекта Application можно получать доступ, применяя инструкции вида Cell вместо Application.Cell, то есть объект Application подразумевается по умолчанию*
В табл. ПЛ приведены свойства объекта Application.
Таблица П.1. Свойства объекта Application
Название
Тип значения
Описание
ActiveCell
Range
Только для чтения. Возвращает объект Range, используемый для доступа к ячейке» в которой находится курсор. Если активный лист книги не является рабочим листом, то возвращается Nothing
ActiveChart
Chart
Только для чтения. Возвращает объект Chart, который используется для доступа к активной диаграмме. Если нет выделенной диаграммы, то возвращается Nothing
ActiveSheet
Worksheet
Только для чтения. Возвращает объект Worksheet, который используется для доступа к активной рабочей книге. Если нет активного рабочего листа, то возвращается Nothing
Таблица П.1. Свойства объекта Application (продолжение)
Название
Тип значения
Описание
ActiveWindow
Window
Только для чтения. Возвращает объект Window, который используется для доступа к активному окну. Если не открыто ни одного окна, то возвращается Nothing
Active Workbook
Workbook
Только для чтения. Возвращает объект Workbook, который используется для доступа к книге, находящейся в активном окне. Если не открыто ни одного окна с рабочей книгой, то возвращается Nothing
Caller
Range
Возвращает объект Range при доступе из функции, которая является частью формулы в ячейке или диапазоне
String
Возвращает название документа при доступе из макросов Auto Open, Auto Close, Auto_Activate и Auto_Deactivate.
Возвращает название диаграммы или адрес ячейки при доступе из макросов» установленных для данных объектов в параметрах OnDoubleClick и OnEntry
Error
Возвращает значение типа Error во всех случаях, не описанных выше
Caption
String
Позволяет получать или задавать текст, который отображается в строке заголовка главного окна Excel, Если необходимо вернуть стандартный заголовок окна, то параметру нужно присвошъ значение Empty
Cells
Range
Только для чтения. Возвращает объект Range для доступа к ячейкам активного рабочего листа. Не работает, если нет активного рабочего листа (возвращает Nothing)
Charts
Sheets
Только для чтения. Возвращает коллекцию (типа Sheets), содержащую только листы диаграмм рабочей книги (объекты типа Chart). Возвращает Nothing, если не открыто ни одной книги
Columns
Range
Только для чтения. Возвращает объект Range, представляющий собой все столбцы активного рабочего листа. Возвращает Nothing, если активный документ не является рабочим листом
CommandBars
CommandBars
Только для чтения. Возвращает объект CommandBars, представляющий собой коллекцию объектов CommandBar (панели инструментов, меню, контекстные меню и др.)
Dialogs
Dialogs
Только для чтения. Возвращает коллекцию встроенных диалоговых окон
НазваниеТип ^нячеивн!
Описание
EnableCancelKey XIEnableCancelKey
Позволяет устанавливать, как Excel нужно обрабатывать нажатие клавиш Ctrl+Pause Break, Esc, которые используются для прерывания работы макросов
FileSearchFileSearch
Возвращает объект FileSearch, с помощью которого можно искать файлы в заданных папках по различным критериям
RangeRange
Только для чтения. Возвращает объект Range, который используется для доступа к заданной ячейке или диапазону
RowsRange
Только для чтения. Возвращает объект Range, представляющий собой все строки активного рабочего листа. Возвращает Nothing, если активный документ не является рабочим листом
Screen Updating Boolean
Позволяет отключить или включить обновление изображения приложением Excel
SelectionObject
Только для чтения. Предоставляет доступ к выделенному объекту. Если выделенных объектов нет* то возвращается Nothing, Точный тип возвращаемого объекта зависит от типа выделенного объекта (для ячеек — Range)
SheetsSheets
Возвращает коллекцию Sheets, содержащую see листы активной рабочей книги (зквивалентно использованию ActiveWorkbook.Sheets). Не работает, если нс открыто ни одной рабочей khith
StatusBarString
Позволяет получать или устанавливать текст, отображаемый в строке состояния Excel, Для установки текста по умолчанию этому свойству необходимо присвоить значение False
ThisWorkbookWorkbook
Только для чтения. Возвращает объект Workbook для доступа к рабочей книге, в которой запущен макрос
WindowsWindows
Только для чтения. Возвращает коллекцию Windows, элементами которой являются окна всех открытых рабочих книг
WorkbooksWorkbooks
Только для чтения. Возвращает коллекцию Workbooks, элементами которой являются все открытые рабочие книгм
WorkshcetF unction WorksheetFu notion
Только для чтения. Возвращает объект WorksheetFunction, с помощью которого можно получить доступ к встроенным функциям работы с данными на рабочем листе
WorksheetsWorksheets
Только для чтения. Возврашает коллекцию Worksheets, элементами которой являются только рабочие листы активной книги (эквивалентно использованию ActiveWorkbook.WorkSheets). Не работает, когда не открыто ни одной рабочей книга
В табл. П.2 приведены методы объекта Application.
Таблица П2 Методы объекта Application
Название
Параметры
Возвращаемое значение
Описание
InputBox
Prompt (String) — текст сообщения в окне;
Title (Variant) — заголовок окна; Default (Variant) — текст, введенный по умолчанию;
Left (Variant)—不киорднната окна;
Top (Variant) — У-координата окна;
HelpFile (Variant) — имя файла справки для этого окна;
HelpContextld (Variant)— идентификатор темы в файле справки;
Type (Variant) — тип окна ввода
Variant
Отображает встроенное диалоговое окно для ввода данных. Тип окна зависит от значения параметра Туре. Если заданы параметры HelFile и HelpContextld, то в окне будет дополнительно отображаться кнопка Справка.
Возвращает текст, число, диапазон (Range) или прочие данные, введенные в окне
Intersect
Два и более объекта Range
Range
Возвращает объект Range, являющийся пересечением заданных диапазонов
OnTime
EarliestTime (Variant) — время, когда нужно вызвать макрос; Procedure (Variant) — имя макроса;
LatestTime (Variant)— предельное время запуска макроса;
Schedule (Variant) — тип добавления макроса
После вызова данного метода макрос с именем, заданным параметром Procedure, будет вызван в указанное в параметре EarliestTime время. Если Excel не удастся вызвать макрос до указанного в параметре LatestTime времени, то этот макрос вызываться не будет. Параметр Schedule, равный True, отменяет предыдущий вызов данного метода для заданного макроса
Run
Macro (Variant) — имя макроса, объект Range, идентификатор функции DLL;
Argl-Arg30 (Variant)— передаваемые параметры
Вызывает указанный макрос, функцию в ячейке или функцию в зарегистрированной DLL нли XLL. Количество и порядок передаваемых аргументов зависят от конкретного макроса или функции
Union
Два и более объекта Range
Range
Возвращает объект Range, являющийся объединением заданных диапазонов
Название
Параметры
Возвращаемое значение
Опнстнне
Wait
Time (Variant) — время в стандартном формате
Boolean
Прерывает исполнение макроса до времени, указанного в параметре Time. Возвращает True, если исполнение макроса было приостановлено на указанный промежуток времени
Объект Chart
Объект chart представляет собой отдельный лист с диаграммой или диаграмму на рабочем листе, внедренную в объект chartobject. Объект Chart предоставляет полный контроль над диаграммой: возможность задания ее свойств, вызова методов и обработки событий.
В табл. П.З приведены свойства объекта Chart.
Таблица П.З. Свойства объекта Chart
Название
Тип значения
Описание
Chart Area
ChartArea
Только для чтения. Возвращает объект ChartArea, предоставляю щи й доступ к объектам, диаграммы (таким как легенда, осн, названия осей и др.)
ChartTitle
ChartTitle
Только для чтения. Возвращает объект ChartTitle, который позволяет работать с заголовком диаграммы
ChartType
XlChartType
Позволяет получить или установить тип диаграммы
HasTitle
Boolean
Позволяет узнать, отображается ли заголовок диаграммы. С помощью этого свойства можно также отобразить или скрыть заголовок диаграммы
PlotArea
PIoiArea
Только для чтения. Возвращает объект PlotArea, с помощью которого можно получить доступ к области рисования диаграммы
В табл. П4 приведены методы объекта chart.
Таблица П.4. Методы объекта Chart
Название
Параметры
Возвращаемое значение
Описание
Activate
Активизирует (выделяет) диаграмму
Таблица П.4. Методы объекта Chart (продолжение)
Название
Параметры
Возвращаемое значение
Описание
Apply Data Labels
Type (XlDalaLabelsType) — тип подписи данных;
LegendKey (Variant) — режим отображения ключа легенды;
AutoText (Variant) — режим отображения подписей к значениям;
Has Leader Lines (Variant) — режим отображения главной линии;
ShowSeriesName (Variant)— режим отображения названий рядов;
ShowCategoryName (Variant)— режим отображения названий категорий;
Show Value (Variant) — режим отображения значений;
Showpercentage (Variant)— режим отображения количества процентов от максимального значения;
ShowBubbleSize (Variant)— режим отображения размера пузырьков (для пузырьковой диаграммы);
Separator (Variant) — разделитель для подписей
Позволяет включить или выключить отображение определенных подписей к значениям диаграммы. Параметр Туре задает, какой параметр необходимо изменить. Заданному параметру присваивается значение, заданное в одном из остальных параметров данного метода (от LegentKey до ShowBubbleSize). Значения этих параметров ——True (включить отображение) или False (отменить отображение).
Параметр Separator задает строку с разделителем между данными, которые берутся для подписей значений диаграммы
Axes
Type (XIAxisType) — тип оси; AxisGroup (XIAxisGroup)— группа осей
Object
Возвращает объект для работы с осью заданного типа или коллекцию таких объектов
Export
FileNamc (String) — имя файла для экспорта;
FilterName (Variant) — название графического фильтра;
Interactive (Variant) — режнм отображения окна сохранения файла
Boolean
Позволяет сохранить диаграмму в файл на диске в формате, заданном названием графического фильтра. Если параметр Interactive равен True, то открывается стандартное диалоговое окно сохранения файла, с помощью которого выбирается имя файла для сохранения.
Возвращает True, если диаграмма сохранена в файл
Название
Параметры
Возврн- щаемое значение
Описание
Location
Where (XlChartLocation) — тип нового положения диаграммы; Name (Variant) — название объекта, заданного в параметре Where
Позволяет перемещать диаграмму в рабочей книге (сделать из внедренной диаграммы диаграмму на отдельном листе и наоборот)
SeriesColleciion
Index (Variant) — номера или названия нужных рядов
Object
「1озвол耳ет получить объект, дающий возможность работать с нужным рядом (Series), или коллекцию таких объектов (SeriesCollection) ।
SetSourceData
Source (Range)——диапазон с исходными данными;
PIotBy (XIRowCol) — режим отображения данных
Позволяет задать диапазон с исходными данными для диаграммы. Режим отображения данных задает, как отображать исходные данные (ряды в строках или в столбцах)
Объект Range
Объект Range представляет собой строку, столбец, ячейку, выделеьшые ячейки либо однн или несколько объединенных диапазонов ячеек. Range является наиболее часто используемым и основным объектом, предоставляющим доступ к данным таблиц Excel.
В табл. П*5 приведены свойства объекта Range.
Таблица П.5. Свойства объекта Range
Название
Тип значения
Описание
Address
Siring
Только для чтения. Возвращает адрес ячейки, которая представлена объектом Range, Если объект Range содержит несколько ячеек, не входящих в один диапазон, то возвращается строка с адресами каждой ячейки через запятую. Если объект Range содержит диапазоны, то для каждого диапазона возвращается строка с адресами перво員 и последней ячеек диапазона, разделенными двоеточием
Areas
Areas
Только для чтения. Возвращает коллекцию, содержащую все диапазоны, которые представлены в объекте Range
Таблица П.5. Свойства объекта Range (продолжение)
Название
Тип значения
Описание
Borders
Borders
Только для чтения. Возвращает коллекцию объектов типа Border, позволяющих работать с границами ячеек (задавать параметры их отображения)
Cells
Range
Только для чтения. Возвращает объект Range для ячеек, содержащихся в заданном диапазоне
Column
Long
Только для чтения. Возвращает номер первого столбца, элементы которого входят в диапазон или диапазоны исходного объекта Range
Columns
Range
Только для чтения. Возвращает объект Range, представляющий собой все столбцы, содержащиеся в диапазоне или диапазонах исходного объекта Range
Comment
Comment
Только для чтения. Возвращает объект Comment, позволяющий работать с примечанием для левой верхней ячейки диапазона
Count
Long
Только для чтения. Возвращает количество ячеек, содержащихся в диапазоне или диапазонах, представленных объектом Range
End
Range
Только для чтения. Возвращает объект Range, предоставляющий доступ к последней заполненной ячейке столбца или строки в заданном направлении от другой ячейки
EntireColumn
Range
Только для чтения. Возвращает объект Range для столбцов, в которых содержатся ячейки, входящие в исходный диапазон
EntireRow
Range
Только для чтения. Возвращает объект Range для строк, в которых содержатся ячейки, входящие в исходный диапазон
Font
Font
Возвращает объект Font, позволяющий изменять настройки шрифта (название шрифта, начертание символов и др.) для ячеек диапазона
Formula
Variant
Позволяет получить или задать строку с формулой для заданной ячейки
FormulaLocal
Variant
Позволяет получить или задать строку с формулой для заданной ячейки
FormulaRlCl
Variant
Позволяет получить или задать строку с формулой для заданной ячейки. При этом используется другая система нумерации ячеек — так называемая R1C1- нотация. В ней после R указывается номер строки, а после С — номер столбца (например, адрес АЮ в этой нотации будет записан как R1C10)
Height
Variant
Только для чтения. Возвращает суммарную высоту ячеек диапазона
Hori zonta I Alignment
Variant
Позволяет получить или установить тип горизонтального выравнивания в ячейке или ячейках диапазона
Название
Тин значення
Описание
Interior
Interior
Только для чтения. Возвращает объект Interior, позволяющий изменять оформление ячейки или ячеек диапазона
Left
Variant
Только для чтення* Возвращает смещение самой левой ячейки диапазона от начала столбца А
Name
Names
Позволяет получить или задать имя ячейки (ячеек диапазона). Для ячеек имена представлены специальным объектом Name
Next
Range
Только для чтения. Возвращает объект Range для следующей ячейки диапазона
NumberFormat
Variant
Позволяет получить или задать формат ячейки или ячеек диапазона. Если ячейки диапазона имеют разные форматы, то возвращает значение NULL
Offset
Range
Только для чтения. Возвращает объект Range для ячейки, смещенной относительно исходной на заданное количество строк и столбцов
Orientation
Variant
Позволяет получить или установить ориентацию текста в ячейке (угол наклона текста к горизонтальной оси). Принимает значения от -90 до 90
Parent
Object
Только для чтения. Возвращает родительский объект для ячейки или ячеек диапазона ——рабочий пнет, на котором расположена ячейка (ячейки)
Range
Range
Только для чтения. Позволяет получить объект Range для ячейки или поддиапазона исходного диапазона
Row
Long
Только для чтения. Возвращает номер первой строки, элементы которой входят в диапазон или диапазоны исходного объекта Range
Rows
Range
Только для чтения. Возвращает объект Range, представляющий собой все строки, содержащиеся в диапазоне или диапазонах исходного объекта Range
Text
String
Только для чтения. Возвращает текст в ячейке, заданной объектом Range
Top
Variant
Только для чтения. Возвращает смешение верхней ячейки диапазона или диапазонов объекта Range от начала первой строки
Value
Variant
Позволяет получить или установить значение ячейки
VerticalAlignment
Variant
Позволяет получить или установить тип вертикального выравнивания в ячейке или ячейках диапазона
Width
Variant
Только для чтения. Возвращает суммарную ширину ячеек диапазона
Worksheet
Worksheet
Только для чтения. Возвращает объект Worksheet, представляющий собой рабочий лист, на котором находится диапазон
В табл. П.6 приведены методы объекта Range.
Таблица П.6. Методы объекта Range
Название
Параметры
Возвращаемое значение
Описание
Activate
Активизирует (выделяет) одну ячейку. Если ячейка входит в выделенный ранее диапазон, то этот диапазон остается выделенным
AddComment
Text (Variant) — текст примечания
Позволяет добавить примечание к ячейке. Текст примечания задается параметром Text
AutoFilter
Field (Variant) — смещение от ячейки, на которой базируется фильтр;
Criteria 1 (Variant)——критерий отображения ячеек;
Operator (XIAutoFilterOperator)— применяемый оператор отображения:
Criteria2 (Variant)——второй критерий отображения ячеек;
VisibleDropDown (Variant)— режим отображения списка для настройки фильтра
Включает или выключает фильтрацию отображения ячеек на рабочем листе.
Параметры отображения задаются с помощью Criteria! и Criteria2. При отображении ячеек будет применен оператор, заданный параметром Operator. Если значение параметра VisibleDropDown задать равным True, то в ячейках будет показан раскрывающийся список для выбора оператора
Clear
Удаляет вес данные (значения, примечания и др.), связанные с ячейками заданного диапазона, а также устанавливает по умолчанию параметры форматирования этих ячеек
ClearComments
Удаляет примечания для ячеек заданного диапазона
ClearContents
Удаляет данные ячеек заданного диапазона. Параметры форматирования сохраняются
Copy
Destination (Variant)— указывает, куда копировать
Копирует данные ячеек заданного диапазона в буфер обмена Windows или в другой диапазон.
Диапазон-приемник указывается в параметре Destination. Если этот параметр нс задан, то данные копируются в буфер обмена
Название
Параметры
Возвращаемое значение
Описание
Find
What (Variant) — искомые данные;
After (Variant)——первая ячейка для поиска;
Lookln (Variant)— просматриваемые данные;
LookAt (XILookAt) — область поиска;
SearchOrder (XlSearchOrder)— порядок просмотра ячеек;
SearchDirection (XISearchDireciion)— направление просмотра ячеек;
MatchCase (Variant) — параметры учета регистра символов;
Match Byte (Variant) — параметры учета кодирования символов;
SearchFormat (Variant) — формат поиска
Range
Нтет заданные параметром What данные в диапазоне. Поиск начинается с ячейки After (если она задана) или с начала диапазона.
При поиске могут просматриваться различные данные, связанные с ячейками (значения ячеек, примечану^я и др.). — задаются парамегром Lookln.
В зависимости от значения параметра LookAt просматривается весь диапазон или его часть.
Параметр SearchDirection задает порядок просмотра ячеек——по строкам или по столбцам.
Остальные параметры задают особенности сравнения данных при поиске
FindNext
After (Variant)——ячейка, после которой искать
Range
Продолжает поиск, начатый при вызове метода Find
Select
Выделяег все ячейки диапазона
Sort
Keyl (Variant) — первая ячейка- ключ для сортировки;
Order 1 (XlSortOrder) — порядок сортировки по первому ключу; Кеу2 (Variant)——вторая ячейка- ключ для сортировки;
Order2 (XlSortOrder) — порядок сортировки по второму ключу; КеуЗ (Variant)——третья ячейка- ключ для сортировки;
Order3 (XlSortOrder) — порядок сортировки по третьему ключу; Header (XlYesNoGuess) — режим сортировки первых строк; OrderCustom (Variant)— используется для задания нестандартного порядка отсортированных элементов; MatchCase (Variant) — режим учета регистра символов; Orientation (XISortOrientation)— ориентация сортируемых ячеек; SortMethod (XISortMclhod)— метод сортировки
Позволяет сортировать значения в ячейках по нескольким ключам (от I до 3). Ячейки, принадлежащие ключевым рядам или строкам, задаются в параметрах Keyl-КеуЗ. Порядок сортировки по этим ключам (возрастающий или убывающий) задастся параметрами Order 1-Order3.
Параметр Orientation задает, сортировать строки или столбцы. При задании значения параметра Header равным True, первые строки 厶иш столбцы) не сортируются.
Если параметр MatchCase равен True, то при сортировке учитывается регистр символов. Параметр SortMethod задает метод сортировки текста.
Параметры DataOption 1 - DataOpiion3 задают, сортировать текст по соответствующим ключам отдельно от чисел илн нет
Таблица П.6. Методы объекта Range (продолжение)
Название
Параметры
Возвра* щаемое значение
Описание
Sort
DataOptionl
(XlSortDataOption) — режим сортировки текста первого ключа;
DataOption2
(X)SonDataOption) — режим сортировки текста второго ключа; DataOption3
(XlSortDataOption) — режим сортировки текста третьего ключа
SpecialCells
Type (XlCellType) — тип содержимого ячейю*;
Value (XISpecialCellsValue)— характер содержимого
Range
Позволяет получить диапазон ячеек, которые удовлетворяют требованиям: наличие содержимого типа, заданного параметром Туре (например, примечания), или соответствие характера содержимого ячейки заданному параметром Value (например, код ошибки)
Объект Workbook
Посредством объекта Workbook осуществляется доступ к рабочим книгам, открытым в Excel. Данный объект позволяет работать с данными, структурой рабочей книги, управлять ее отображением, изменять структуру. С помощью объекта workbook также легко реализовать создание и сохранение рабочих книг.
В табл* П.7 приведены свойства объекта Workbook.
Таблица П.7* Свойства объекта Workbook
Название
Тип значения
Описание
Charts
Sheets
Только для чтения. Возвращает коллекцию Sheets, состоящую только из листов диаграмм данной книги
Name
String
Только для чтения. Возвращает строку с именем рабочей книги
Names
Names
Только для чтения. Возвращает коллекцию Names, элементами которой являются все определенные имена в данной рабочей книге (в том числе имена, определенные в рабочих листах, такие как имена ячеек)
Path
String
Только для чтения. Возвращает полный путь, по которому сохранена рабочая книга. Если книга не сохранена, то возвращается пустая строка
НазваниеТип значения
Описание
ProtectStructure Boolean
Только для чтения. Возвращает True, если структура рабочей книги защищена. В противном случае возвращает False
SheetsSheets
Только для чтения. Возвращает коллекцию Sheets, состоящую из всех листов рабочей книги (рабочих листов и листов, диаграмм)
WindowsWindows
Только для чтения. Возвращает коллекцию Windows, элементами которой являются объекты Window всех окон рабочей книги
WorksheetsSheets
Только для чтения. Возвращает коллекцию Sheets, состоящую только из рабочих листов данной книги
В табл. П.8 приведены методы объекта Workbook.
Таблица П.8* Методы объекта Workbook
Название
Параметры
Описание
Protect
Password (V ariant) — пароль для снятия защиты;
Structure (Variant) — режим защиты структуры книги;
Windows (Variant) — режим защиты окон книги
Включает защиту рабочей книги. Если задан параметр Password, то содержащийся в нем пароль необходимо указывать для снятия зашиты с рабочей книги.
Если параметр Structure равен True, то защищается структура, а если параметр Windows равен True, то защищается расположение окон данной рабочей книги
SaveAs
FileName (Variant) — путь для сохранения;
FileFormat (Variant) — формат;
Password (Variant) — пароль для открытия файла книги;
WriteResPassword (Variant) — пароль для сохранения изменений в книге; ReadOnlyRecommcnded (Variant)— рекомендация открытия только для чтения;
CreateBackup (Variant) — режим создания резервных копий;
AccessMode (Variant) — режим доступа к книге после сохранения; ConflictResolution (Variant) — режим борьбы с конфликтами (при совместной работе с сохраненной книгой);
AddToMru (Variant) — добавить книгу в список недавно открытых файлов;
Local (Variant) — режим использования региональных настроек
Сохраняет рабочую книгу в файл, заданный параметром FileName в заданном параметром FileFormat формате.
Если задан параметр Password, то сохраняемый файл защищается паролем. Если задан параметр WriteResPassword^ то для книги устанавливается пароль на сохранение изменений. При этом книгу можно будет открывать без пароля только для чтения (если не задан параметр Password).
При задании параметра CreateBackup равным True перед началом работы с книгой будет создаваться ее резервная копия.
Параметры AccessMode н ConflictResolution позволяют настроить книгу для совместной работы.
При значении параметра Local, равном True, книга сохраняется с использованием региональных настроек (для разделителей частей числа, даты и др.). При значении параметра, равном False, используется формат данных VBA
Таблица П.8. Методы объекта Workbook (продолжение)
Название
Параметры
Описание
Unprotect
Password (Variant) — пароль для снятия защиты
Отключает защиту рабочей кннгн. Если в параметре Password указан неверный пароль, то при вызове данного метода будет сгенерирована ошибка
В табл. П.9 приведены пропелурн обработки событий объекта Workbook.
Таблица П.9. Процедуры обработки событий объекта Workbook
Название
Параметры
Описание
BeforeClose
Cancel (Boolean) — режим обработки события приложением Excel
Вызывается перед закрытием рабочей книги. Если параметру Cancel присвоить значение True, то Excel игнорирует это событие» то есть книга не закрывается
BeforePrint
Cancel (Boolean) — режим обработки события приложением Excel
Вызывается перед отправкой рабочей книги на печать. Если параметру Cancel присвоить значение True, то Excel игнорирует это событие, то есть данные книги напечатаны не будут
Open
Вызывается при открытии рабочей книги
Объект Worksheet
С помощью объекта Worksheet осуществляется работа с листами рабочей книги. Данный объект содержит ряд свойств и методов, обеспечивающих возможность модифицировать данные рабочего листа и управлять их отображением. Рабочий лист (объект worksheet) поддерживает несколько обрабо^иков событий, использование которых позволяет задавать определенные особенности поведения Excel при работе с данными рабочими листами.
В табл. П.10 приведены свойства объекта Worksheet.
Таблица Л.10. Свойстаа объекта Worksheet
Название
Тип значения
Описание
Cells
Range
Только для чтения» Возвращает объект Range, содержащий все ячейки данного рабочего листа
Columns
Range
Только для чтения. Возвращает объект Range, содержащий все столбцы данного рабочего листа
Comments
Comments
Только для чтения. Возвращает коллекцию Comments, содержащую все примечания к ячейкам данного рабочего листа
Hyperlinks
Hyperlinks
Только для чтеши. Воавращаст коллекцию Hyperlinks, содержащую все объекты Hyperlink данного рабочего листа. Каждый из таких объектов хранит информацию об одной гиперссылке на рабочем листе
Название
Тин значения
Описание
Index
Long
Только для чтения. Возвращает индекс данного рабочего листа в коллекции Sheets рабочей книги, содержащей этот лист
Name
String
Позволяет получить или изменить имя рабочего листа
Names
Names
Только для «пения. Возвращает коллекцию Names, содержащую все определенные имена данного рабочего листа
Parent
Object
Только для чтения. Возвращает родительский объект для данного рабочего листа — рабочую книгу (Worksheet), в которой находится лист
ProtectContents
Boolean
Только для чтения. Возвращает True, если содержимое рабочего листа защищено от изменений
Range
Range
Только для чтешш. Возвращает объект Range, содержащий заданную ячейку, диапазон или диапазоны рабочего листа
Rows
Range
Только для чтения. Возвращает объект Range, содержащий все строки данного рабочего листа
Shapes
Shapes
Только для чтения. Возвращает коллекцию Shapes, содержащую все автофигуры, расположенные на данном рабочем листе
UsedRange
Range
Только для чтения. Возвращает объект Range, содержащий диапазон ячеек рабочего листа, заполненFfbiii какими-либо данными
В табл. П.11 приведены методы объекта Worksheet
Таблица П.11. Методы объекта Worksheet
Название
Аргументы
Возвращаемое значение
Описание
Activate
Активизирует данный рабочий лист (эквивалентно щелчку на закладке листа в окне рабочей книги)
ChartObjects
Index (Variant)— идентификатор диаграммы
ChartObject, ChartObjects
Возвращав объект ChartObject (контейнер для внедренной диаграммы), если задан параметр Index.
Если параметр не задан, то возвращает коллекцию ChartOtyects, которая состоит нз всех объектов ChartObject данного рабочего листа
Select
Для рабочего листа этот метод работает аналогично методу Activate
В табл. ПЛ2 приведены события объекта Worksheet.
Таблица П.12. События объекта Worksheet
Название
Параметры
Описание
BeforeRightClick
Target (Range) •— ячейка, над которой была нажата кнопка мыши;
Cancel (Boolean) — режим обработки события приложением Excel
Вызывается перед выполнением стандартного действия прн нажатии правой кнопки мыши в ячейке рабочего листа.
Параметр Target содержит объект Range для ячейки^ над которой произошло нажатие правой кнопки мыши.
Если параметру Cancel присвоить значение True, то Excel игнорирует это событие
Change
Target (Range)— измененная ячейка
Вызывается при изменении содержимого ячейки рабочего листа. Параметр Target содержит объект Range для измененной ячейки
SelectionChange
Target (Range)— диапазон ячеек
Вызывается при изменении выделения на рабочем листе. Параметр Target содержит объект Range для нового диапазона выделенных ячеек
Алфавитный указатель
Автофитура 97
вращение 222
Автофильтр 211
Б
Бегущая строка 219
Г
Главное мешо 246
д
Данные
запись в текстовый файл 200
Диаграмма
внедренная 291
построение с помощью макроса 290
прозрачная 298
размер 291
расположение 291
создание подписей 303
сохранение 293
степень прозрачности 300
удаление 296
Диапазон 103. 105
выделение 178
граница 118
заливка 120
заполнение данными ПО, 112
именованный 180
поиск данных 116
сл^айные числа 165
форматирование 212
Закладка 96
Импорт данных 203, 269
Интервал 177
Калькулятор 226
результат расчета 227
Каталог автозагрузки 81
Колонтитул 99
Контекстное меню 98
создание 256
м
Макрос 169
личная книга 83, 136
Массив 32,131
Мастер 申 ункии 订 100
Меню
добавление команды 276
создание 252
удаление команды 277
Модуль
класса 279
рабочего листа 102, 118, 121
н
Надстройка 136
О
Обзор папок 262
Объем жесткого диска 267
П
Панель инструментов 188
добавление элементов 189
редактирование 82
создание 189, 274
управление отображением 251
условное отображение 249
Папка
список содержимого 260
Поиск данных 211
Пользовательская форма 311
Пользовательское меню 228
структура 228
Помощник 282
выбор цвета ячеек 286
добавление флажка 285
мультфильм 282
произвольный текст 283
Последовательность чисел 111
длина 111
начальное значение 114
шаг ИЗ
Примечание 119, 182
индикатор 182
формирование списка 184
Р
Рабочая книга 81
защита 85, 90, 91
Цветовая najnrrpaслучайная 297эЭкспорт данных 203Электронные часы 115ЯЯчейка 103, 106адрес 119ввод дробных чисел 104выделение 169максимальное значение 107. 160примечание 119скрытая 151скрытие данных 108скрытое имя 132тип данных 162цвет 286числовой форлтат 127VVBAAPI-функция 74встроенные типы данных 24дескриптор 62закрытие файла 63запись в файл 63идентификатор 23инициализация переменных 28класс 71коллекция 36комме1ггарий 23константа 29массив 32метка 49модуль диаграммы 20модуль класса 20модуль рабочего листа 20модуль рабочей книги 20объявление переменных 27окно с сообщением 67операторы 29открытие файла 61ошибка времени выполнения 68перечисление 41процедура 51ссылка 26стандартный модуль 19структура 38структура объектов 77структура проекта 18форма 20функция 54цикл 43чтение из файла 63элементы проекта 19Цветовая najnrrpaслучайная 297эЭкспорт данных 203Электронные часы 115ЯЯчейка 103, 106адрес 119ввод дробных чисел 104выделение 169максимальное значение 107. 160примечание 119скрытая 151скрытие данных 108скрытое имя 132тип данных 162цвет 286числовой форлтат 127VVBAAPI-функция 74встроенные типы данных 24дескриптор 62закрытие файла 63запись в файл 63идентификатор 23инициализация переменных 28класс 71коллекция 36комме1ггарий 23константа 29массив 32метка 49модуль диаграммы 20модуль класса 20модуль рабочего листа 20модуль рабочей книги 20объявление переменных 27окно с сообщением 67операторы 29открытие файла 61ошибка времени выполнения 68перечисление 41процедура 51ссылка 26стандартный модуль 19структура 38структура объектов 77структура проекта 18форма 20функция 54цикл 43чтение из файла 63элементы проекта 19
Цветовая najnrrpa
случайная 297
э
Экспорт данных 203
Электронные часы 115
Я
Ячейка 103, 106
адрес 119
ввод дробных чисел 104
выделение 169
максимальное значение 107. 160
примечание 119
скрытая 151
скрытие данных 108
скрытое имя 132
тип данных 162
цвет 286
числовой форлтат 127
V
VBA
API-функция 74
встроенные типы данных 24
дескриптор 62
закрытие файла 63
запись в файл 63
идентификатор 23
инициализация переменных 28
класс 71
коллекция 36
комме1ггарий 23
константа 29
массив 32
метка 49
модуль диаграммы 20
модуль класса 20
модуль рабочего листа 20
модуль рабочей книги 20
объявление переменных 27
окно с сообщением 67
операторы 29
открытие файла 61
ошибка времени выполнения 68
перечисление 41
процедура 51
ссылка 26
стандартный модуль 19
структура 38
структура объектов 77
структура проекта 18
форма 20
функция 54
цикл 43
чтение из файла 63
элементы проекта 19
Цветовая najnrrpa
случайная 297
э
Экспорт данных 203
Электронные часы 115
Я
Ячейка 103, 106
адрес 119
ввод дробных чисел 104
выделение 169
максимальное значение 107. 160
примечание 119
скрытая 151
скрытие данных 108
скрытое имя 132
тип данных 162
цвет 286
числовой форлтат 127
V
VBA
API-функция 74
встроенные типы данных 24
дескриптор 62
закрытие файла 63
запись в файл 63
идентификатор 23
инициализация переменных 28
класс 71
коллекция 36
комме1ггарий 23
константа 29
массив 32
метка 49
модуль диаграммы 20
модуль класса 20
модуль рабочего листа 20
модуль рабочей книги 20
объявление переменных 27
окно с сообщением 67
операторы 29
открытие файла 61
ошибка времени выполнения 68
перечисление 41
процедура 51
ссылка 26
стандартный модуль 19
структура 38
структура объектов 77
структура проекта 18
форма 20
функция 54
цикл 43
чтение из файла 63
элементы проекта 19
количество печатных стран ад 101
сохранение 153
условное закрытие 86
файл рабочей области 81
Рабочий лист 95
защита 100
имя 100
Разрешение монитора 217
Раскрывающийся список 274
С
Сетка
управление отображением 277
Скриншот выделенных ячеек 109
Список
контекстных меню 245
панелей инструментов 245
содержимого папки 260
шрифтов 268
Справочная подсистема И
Средневзвешенное значение 154
Среднее арифмепгческое 267
Стандартный модуль 92я 101, Ш, 124, 148
Столбец
скрытие 175
Строка
скрытие 174
состояния 170
формул 109
т
Таблица 101
HTML-формат 205
преобразование в НТМ-файл 208
преобрааоваиие в HTML-код 207
Таблица символов
запуск 271
Таблица цветов 225
Текстовьп! документ 242
Текстовый файл 203
Ф
Файл
проверка наличия 194
удаление 197
Форматнрование ячейки 256
Формула 131, 133
копирование 132
ошибки 134
Функция 136
аргумент 143
результат расчета 144
ц
Цвет заливки 286
* Ввод количества ячеек по горизонтали и вертикали, которое необходимо заполнить
IngRows = Vai (InputBox (*'Количество ячеек в высоту"))
intCols = Vai (InputBox ( "Количество ячеек в ширину11))
1 Ввод строки для пояска
strFindData = InputBox("Введите данные для поиска")
1 Если ячейка мигала менее 10 раз, то изменим — в очередной раз ее цвет
If intCalls < 10 Then intCalls = intCalls + 1 'Определение, какой цвет необходимо установить If Range (пА111) t Interior.Color о RGB (255, 0, 0) Then 'Цвет ячейки не красный, так что теперь назначим _ именно красный цвет Range(ПА1м).Interior.Color = RGB{255, 0, 0)
1 Создание меню
* Оформление заголовка отчета
ActiveSheet.Cells.ClearContents
ActiveSheet. Cells (1, 1) = нИмя файла11
ActiveSheet.Cells(1, 2) = "Размер"
ActiveSheet.Cells (1, 3) = пДата/время1*
ActiveSheet.Range ("Al:Cl° J.Font * Bold 一 True
'Получение доступа к меню **Вид"
Set cbrpBar = CommandBars(1).FindControl(ID:=30004) If cbrpBar Is Nothing Then
' He удалось получить доступ к меню MsgBox "Невозможно добавить элемент меню.11 Exit Sub
Else
'Добавление команды
With cbrpBar.Controls.Add(Type:=msoControlButton) .Caption = *r&Линии сетки**
.OnAction = °GhangeGrid.linesState"
End With
• Тип идентификации ячеек (по шрифту или цвету) strFunc = Mid(strFunc, intFunc + 2) intFunc = InStr(strFunc, 4,") strFunc = Mid(strFunc, intFunc + 1) intFunc = InStr(strFunc, ”,”)
tglType.Value = Left(strFunc, intFunc - 1)
А.「ла〃ки访,А. Чиртик
А. Гладкий, А. Чиртик
трюки^фф^ь,
С^ППТЕР^
Москва • Санкт-Петербург • Нижний Новгород • ВоронежРостов-на-Дону • Екатеринбург • Самара • НовосибирскКиев ・ Харьков • Минск
2006
А А Гладкий, А А. Чиртик
Excel. Трюки и эффекты
Серия «Трюки и эффекты»
Заведующий редакцией Руководитель проекта Научные редакторы Художник Корректоры ВерсткаЗаведующий редакцией Руководитель проекта Научные редакторы Художник Корректоры ВерсткаД ГурскийД ГурскийМ МоисееваК Моисеева, А. Чиртик А. Татарка Т. Курьянович, £. Павлович4 К叩 тукМ МоисееваК Моисеева, А. Чиртик А. Татарка Т. Курьянович, £. Павлович4 К叩 тук
Заведующий редакцией Руководитель проекта Научные редакторы Художник Корректоры Верстка
Заведующий редакцией Руководитель проекта Научные редакторы Художник Корректоры Верстка
Д Гурский
Д Гурский
М Моисеева
К Моисеева, А. Чиртик А. Татарка Т. Курьянович, £. Павлович
4 К叩 тук
М Моисеева
К Моисеева, А. Чиртик А. Татарка Т. Курьянович, £. Павлович
4 К叩 тук
ББК 32.973*23-018.2
УДК 004.42
Гладкий А. А” Чиртик А. А.
Г52 Excel Трюки и эффекты. — СПб.: Питер, 2006. ― 368 с.: ил. — (Серия «Трюки и эффекты»).
ISBN 5-469-01223-9
Данная книга предназначена для пользователей Microsoft Excel и содержит описание приемов и методов работы, которые ввиду своей специфичности недостаточно представлены (либо вообще не представлены) в пользовательской, справочной н иной соответствующей документации. Изучение приведенных в книге примеров позволит читателю открыть для себя неизвестные ранее возможности Excel. Предлагаемый материал легко усваивается благодаря тому, что излагается доступным и понятным языком,
© ЗАО Издательский дом «Питер», 2006
Все права защищены. Никакая часть данной книги не может быть воспроизведена а какой бы то нм было форме без письменного разрешения владельцев авторских прав,
Информация, содержащаяся в данной книге, полумена из источников, рассматриваемых издательством как надежные. Тем не мене®, имея в виду возможные чепо&ечвстие или технические ошибки» издательство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственность за возможные ошибки, связанные с использованием книги.
ISBN 5-469-01223-9
ООО «Пктер Принт», 194044, Санкт-Петербург, 5. СампсониевсккЙ пр(. 2 9a.
Лнцензт ИД № 05784 от 07.09.01.
Налоговая льгота ——общероссийский классификатор продукции ОК 005-93, том 2; 953005 ——литература учебная.
Подписано в печать 02.12.05. Формат 70*10。|心 Усл. п. л. 29,67. Тираж 3500 экз. Заказ № 6843.
Отпечатано с готовых диапозитивов в ФГУП «Печатный двор» им. А. М. ГорькогоФедерального агентстна по печати и массовым коммуникациям.
197110. Санкт-Петербург, Чкаловский пр., 15.
Краткое содержание
Введение 11
От издательства 16