- •Об авторе
- •Введение
- •Глава 1. Excel 2010: история программы
- •Краткая история электронных таблиц
- •Все начиналось с VisiCalc
- •Quattro Pro
- •Microsoft Excel
- •Почему программа Excel так удобна разработчикам
- •Место Excel в стратегии Microsoft
- •Объектное мышление
- •Рабочие книги
- •Рабочие листы
- •Листы диаграмм
- •Листы макросов XLM
- •Пользовательский интерфейс Excel
- •Ввод данных
- •Формулы, функции и имена
- •Выделение объектов
- •Форматирование
- •Глава 3. Особенности формул
- •О формулах
- •Вычисление формул
- •Ссылки на ячейки и диапазоны
- •Зачем нужны неотносительные ссылки
- •Ссылки на другие листы или рабочие книги
- •Применение имен к существующим ссылкам
- •Пересечение имен
- •Присвоение имен столбцам и строкам
- •Определение области действия
- •Присвоение имен константам
- •Присвоение имен объектам
- •Ошибки в формулах Excel
- •Формулы массивов
- •Пример формулы массива
- •Создание календаря с помощью формулы массива
- •Достоинства и недостатки формул массивов
- •Примеры формул суммирования
- •Другие инструменты подсчета
- •Работа со значениями даты и времени
- •Использование дат до 1900 года
- •Создание мегаформул
- •Глава 4. Файлы Excel
- •Запуск Excel
- •Типы файлов
- •Форматы файлов Excel
- •Форматы текстовых файлов
- •Форматы файлов баз данных
- •Другие форматы файлов
- •Создание шаблонов
- •Создание шаблонов рабочих книг
- •Файл XLB
- •Файлы надстроек
- •Настройки Excel
- •Глава 5. Приложения электронных таблиц
- •О приложениях электронных таблиц
- •Разработчик и конечный пользователь
- •Кто такие разработчики и чем они занимаются
- •Классификация пользователей электронных таблиц
- •Для кого предназначены приложения электронных таблиц
- •Решение проблем с помощью Excel
- •Основные типы электронных таблиц
- •Однопользовательские приложения
- •Приложения-утилиты
- •Надстройки с функциями рабочих листов
- •Одноблоковые бюджеты
- •Электронные таблицы для хранения данных и доступа к ним
- •Клиентские приложения баз данных
- •Глава 6. Принципы разработки приложений электронных таблиц
- •Этапы разработки приложения
- •Определение потребностей пользователя
- •Проектирование приложения с учетом потребностей пользователя
- •Определение удобного пользовательского интерфейса
- •Работа с конечным пользователем
- •Тестирование приложения
- •Создание привлекательных и интуитивно понятных приложений
- •Документирование усилий, затраченных на разработку
- •Распространение приложения среди пользователей
- •Обновление приложения
- •Другие вопросы разработки приложений
- •Версия Excel, установленная у пользователя
- •Трудности, касающиеся поддержки языка
- •Видеорежимы
- •Глава 7. Введение в VBA
- •Основы языка BASIC
- •Обзор VBA
- •Объектные модели
- •Сравнение VBA и XLM
- •Основы VBA
- •Работа с Project Explorer
- •Добавление нового модуля VBA
- •Удаление модуля VBA
- •Экспорт и импорт объектов
- •Работа с окнами кода
- •Сворачивание и восстановление окон
- •Сохранение кода VBA
- •Ввод кода VBA
- •Настройка среды VBE
- •Что записывается
- •Параметры записи
- •Улучшение записанных макросов
- •Об объектах и коллекциях
- •Иерархия объектов
- •О коллекциях
- •Ссылки на объекты
- •Свойства и методы
- •Свойства объекта
- •Методы объекта
- •Свойства объекта Comment
- •Методы объекта Comment
- •Коллекция Comments
- •Работа с объектами Range
- •Свойство Range
- •Свойство Offset
- •Что следует знать об объектах
- •Важные концепции для запоминания
- •Узнайте больше об объектах и свойствах
- •Обзор элементов и конструкций VBA
- •Комментарии
- •Переменные, типы данных и константы
- •Определение типов данных
- •Объявление переменных
- •Работа с константами
- •Операторы присваивания
- •Массивы
- •Объявление массивов
- •Объявление многомерных массивов
- •Объявление динамических массивов
- •Объектные переменные
- •Пользовательские типы данных
- •Встроенные функции
- •Управление объектами и коллекциями
- •Конструкция With - End With
- •Конструкция For Each - Next
- •Контроль за выполнением кода
- •Конструкция Select Case
- •Циклическая обработка инструкций
- •Глава 9. Работа с процедурами VBA
- •О процедурах
- •Объявление процедуры Sub
- •Область действия процедуры
- •Выполнение процедуры
- •Выполнение процедуры с помощью ленты
- •Выполнение процедуры из пользовательского контекстного меню
- •Выполнение процедуры из другой процедуры
- •Выполнение процедуры по щелчку на объекте
- •Выполнение процедуры по событию
- •Выполнение процедуры в окне отладки
- •Передача аргументов процедурам
- •Обработка ошибок
- •Перехват ошибок
- •Реальный пример
- •Цель
- •Требования к проекту
- •Исходные данные
- •Подход
- •Что необходимо знать
- •Написание кода
- •Создание процедуры сортировки
- •Устранение проблем
- •Доступность
- •Глава 10. Создание функций
- •Процедуры и функции
- •Назначение пользовательских функций
- •Простой пример функции
- •Анализ пользовательской функции
- •Синтаксис функции
- •Область действия функции
- •Аргументы функций
- •Примеры функций
- •Функции без аргументов
- •Функция с одним аргументом
- •Функция с двумя аргументами
- •Функция с аргументом в виде массива
- •Функция с необязательными аргументами
- •Функция VBA, возвращающая массив
- •Функция с неопределенным количеством аргументов
- •Расширенные функции для работы с датами
- •Отладка функций
- •Определение категории функции
- •Использование надстроек для хранения пользовательских функций
- •Использование функций Windows API
- •Примеры функций Windows API
- •Определение папки Windows
- •Определение состояния клавиши <Shift>
- •Дополнительная информация о функциях Windows API
- •Учимся на примерах
- •Работа с диапазонами
- •Копирование диапазона
- •Перемещение диапазона
- •Подсчет выделенных ячеек
- •Определение типа выделенного диапазона
- •Удаление всех пустых строк
- •Дублирование строк
- •Чтение и запись диапазонов
- •Перенесение одномерных массивов
- •Перенесение диапазона в массив типа Variant
- •Выбор ячеек по значению
- •Копирование несмежных диапазонов
- •Управление рабочими книгами и листами
- •Сохранение всех рабочих книг
- •Синхронизация рабочих книг
- •Методы программирования на VBA
- •Переключение значения булева свойства
- •Определение количества страниц для печати
- •Отображение списка шрифтов
- •Обработка последовательности файлов
- •Полезные функции для программ VBA
- •Функция FileExists
- •Функция FileNameOnly
- •Функция PathExists
- •Функция RangeNameExists
- •Функция SheetExists
- •Получение значения из закрытой рабочей книги
- •Полезные функции в формулах Excel
- •Получение информации о форматировании ячейки
- •Беседа с рабочим листом
- •Отображение даты сохранения файла или вывода файла на печать
- •Основы иерархии объектов
- •Подсчет количества ячеек между двумя значениями
- •Соответствует ли строка шаблону
- •Возвращение из строки n-го элемента
- •Возвращение максимального значения всех рабочих листов
- •Возвращение массива случайных целых чисел без повторов
- •Расположение значений диапазона в произвольном порядке
- •Определение текущего видеорежима
- •Чтение и запись параметров системного реестра
- •Глава 12. Создание собственных диалоговых окон
- •Перед созданием диалоговых окон...
- •Использование окон ввода данных
- •Функция VBA MsgBox
- •Отображение формы ввода данных с помощью VBA
- •CommandButton
- •Frame
- •Image
- •Label
- •ListBox
- •MultiPage
- •OptionButton
- •RefEdit
- •ScrollBar
- •SpinButton
- •TabStrip
- •TextBox
- •ToggleButton
- •Настройка элементов управления пользовательского диалогового окна
- •Общие свойства
- •Отображение пользовательского диалогового окна
- •Отображение немодальной формы
- •Отображение пользовательского диалогового окна на основе значения переменной
- •Загрузка пользовательского диалогового окна
- •О процедурах обработки событий
- •Закрытие пользовательского диалогового окна
- •Пример создания пользовательского диалогового окна
- •Создание пользовательской формы
- •Создание кода для отображения диалогового окна
- •Проверка правильности введенных данных
- •События объекта UserForm
- •События объекта UserForm
- •События элемента управления SpinButton
- •Ссылка на элементы управления пользовательского диалогового окна
- •Настройка панели инструментов Toolbox
- •Добавление новых страниц
- •Настройка или комбинирование элементов управления
- •Вопросы для самоконтроля
- •Создание заставки
- •Отключение кнопки закрытия пользовательского диалогового окна
- •Изменение размера диалогового окна
- •Добавление опций в элемент управления ListBox
- •Определение выделенного элемента списка
- •Определение нескольких выделенных элементов списка
- •Работа с многоколоночными элементами управления ListBox
- •Использование элемента управления ListBox для выделения строк на листе
- •Использование элемента управления ListBox для активизации листа
- •Использование внешних элементов управления
- •Глава 15. Дополнительные приемы работы с пользовательскими формами
- •Отображение индикатора текущего состояния
- •Создание мастеров
- •Программирование зависимостей
- •Выполнение задачи
- •Имитация работы функции MsgBox
- •Несколько кнопок с одной процедурой обработки событий
- •Глава 16. Разработка утилит Excel с помощью VBA
- •Об утилитах Excel
- •Создание утилит с помощью VBA
- •Признаки хорошей утилиты
- •Утилита Text Tools
- •Рабочая книга утилиты
- •Как работает утилита
- •Оценка проекта
- •Принципы работы утилиты
- •Дополнительно об утилитах Excel
- •Глава 17. Работа со сводными таблицами
- •Вводный пример
- •Просмотр созданного кода
- •Код сводной таблицы
- •Создание обратной сводной таблицы
- •Кратко о диаграммах
- •Создание внедренной диаграммы
- •Размещение диаграммы на листе диаграммы
- •Активизация диаграммы с помощью кода VBA
- •Деактивизация диаграммы
- •Определение активности диаграммы
- •Изменение размеров и выравнивание диаграмм
- •Экспорт диаграммы
- •События диаграмм
- •Поддержка событий для встроенных диаграмм
- •Тонкости создания диаграмм
- •Печать встроенных диаграмм на всю страницу
- •Отображение/сокрытие рядов данных
- •Создание фиксированной диаграммы
- •Анимирование диаграмм
- •Прокрутка диаграммы
- •Глава 19. Концепция событий Excel
- •Типы событий Excel
- •Понимание последовательности событий
- •Отключение событий
- •Ввод кода процедуры обработки события
- •События уровня объекта Workbook
- •Событие Open
- •Событие Activate
- •Событие SheetActivate
- •Событие NewSheet
- •Событие Deactivate
- •Событие BeforePrint
- •Событие Change
- •Включение событий уровня объекта Application
- •Определение факта открытия рабочей книги
- •События объекта UserForm
- •Запуск другого приложения из Excel
- •Использование функции Shell
- •Использование API-Функции ShellExecute
- •Инструкция AppActivate
- •Работа с внешними объектами
- •Раннее и позднее связывание
- •Простой пример позднего связывания
- •Использование метода SendKeys
- •Глава 21. Создание и использование надстроек
- •Определение надстройки
- •Основные причины создания надстроек
- •Создание надстройки
- •Пример надстройки
- •Установка надстройки
- •Тестирование надстройки
- •Распространение надстройки
- •Изменение надстройки
- •Членство в коллекциях
- •Получение доступа к VBA-процедурам надстройки
- •События объекта AddIn
- •Оптимизация производительности надстроек
- •Проблемы, связанные с использованием надстроек
- •Правильная установка
- •Ссылки на другие файлы
- •Указание правильной версии Excel
- •Глава 22. Работа с лентой
- •Начальные сведения о ленте
- •Активизация вкладки
- •Настройка ленты
- •Простой пример кода RibbonX
- •Некоторые замечания о настройке ленты
- •Код панели инструментов
- •Глава 23. Работа с контекстными меню
- •Обзор объекта CommandBar
- •Типы объектов CommandBar
- •Отображение контекстных меню
- •Настройка контекстных меню с помощью VBA
- •Сброс контекстных меню
- •Отключение контекстного меню
- •Отключение элементов контекстного меню
- •Добавление подменю в контекстное меню
- •Автоматическое добавление и удаление меню
- •Создание нового контекстного меню
- •Справка в приложениях Excel
- •Справочная система, созданная с помощью компонентов Excel
- •Использование примечаний к ячейке для предоставления справки
- •Использование средства HTML Help
- •Связывание файлов справочного руководства с приложением
- •Глава 25. Разработка пользовательских приложений
- •Что такое приложение, ориентированное на пользователя
- •Как это работает
- •Концепции разработки приложений
- •Концепция совместимости
- •Проблемы совместимости
- •Избегайте использования новых возможностей
- •Использование 64-разрядной версии Excel
- •Создание интернациональных приложений
- •Многоязычные приложения
- •Идентификация настроек системы
- •Параметры настройки даты и времени
- •Часто выполняемые операции с файлами
- •Управление файлами с помощью функций VBA
- •Использование объекта FileSystemObject
- •Открытие текстового файла
- •Чтение текстового файла
- •Запись в текстовый файл
- •Получение номера файла
- •Определение или установка позиции в файле
- •Примеры управления текстовыми файлами
- •Импортирование данных из текстового файла
- •Экспортирование диапазона в текстовый файл
- •Импортирование текстового файла в диапазон
- •Протоколирование операций в Excel
- •Фильтрация текстового файла
- •Экспортирование диапазона в формат HTML
- •Введение в IDE
- •Объектная модель IDE
- •Использование VBA для создания кода VBA
- •Простой пример
- •Глава 29. Модули классов
- •Определение модуля класса
- •Пример создания модуля класса
- •Дополнительные сведения о модулях классов
- •События модуля класса
- •Модуль класса CSVFileClass
- •Глава 30. Работа с цветом
- •Определение цвета
- •Цветовая модель RGB
- •Темы документа
- •Изменение цветов диаграммы
- •Списки часто задаваемых вопросов
- •Общие вопросы об Excel
- •Редактор Visual Basic
- •Процедуры
- •Функции
- •Объекты, свойства, методы и события
- •Пользовательские диалоговые окна
- •Надстройки
- •Пользовательский интерфейс
- •Справочная система Excel
- •Техническая поддержка со стороны компании Microsoft
- •Группы новостей
- •Веб-сайты
- •Сайт Йона Пелтиера
- •Системные требования
- •Использование компакт-диска
- •Файлы и программы, находящиеся на компакт-диске
- •Решение проблем
- •Предметный указатель
Глава 16. Разработка утилит Excel с помощью VBA |
519 |
конечных пользователей, то что же делает ее ценной? Ниже приведены характеристики хорошей утилиты.
•Утилита привносит что-либо новое в Excel. Это может быть и новая возмож ность, и комбинация существующих функций, и более простой способ использо вания одного из существующих средств.
•Утилита имеет универсальную природу. В идеальном случае она должна обла дать возможностями, которые работают в различных средах. Конечно, создать утилиту общего назначения намного сложнее, чем создать утилиту, работающую в строго определенной среде.
•Утилита обладает гибкостью. Наилучшие утилиты предоставляют большое ко личество параметров, что позволяет использовать их для обработки широкого диапазона ситуаций.
•Утилита выглядит и работает, как встроенная команда Excel. Утилиты долж ны выглядеть и вести себя так же, как и встроенные команды Excel, хотя можно добавлять и индивидуальные настройки.
•Утилита предоставляет пользователям необходимую справочную информа цию. Другими словами, следует создать документацию, к которой пользователь сможет обратиться в случае необходимости.
•Утилита отслеживает появление ошибок. Конечный пользователь не должен видеть сообщений об ошибках VBA. Любое сообщение об ошибке, которое уви дит пользователь, должно создаваться автором утилиты.
•Утилита предоставляет способ отмены результата собственных действий.
Пользователи, которых не удовлетворяет результат работы утилиты, должны иметь возможность отменить внесенные изменения.
Утилита Text Tools
В этом разделе рассматривается утилита Excel, которая была разработана в качестве составной части пакета Power Utility Рак. Утилита Text Tools (Текстовые инструменты) позволяет пользователю манипулировать текстом в выделенном диапазоне ячеек. В ча стности, эта утилита поддерживает такие операции:
•изменение регистра текста (верхний регистр, нижний регистр или правильный ре гистр);
•добавление символов в начале, в конце или в указанной позиции;
•удаление текста в начале, в конце или в указанной позиции строки;
•удаление лишних пробелов (или всех пробелов);
•удаление символов из текста (не выводимых на печать символов, символов алфа вита, нечисловых символов, не алфавитных символов либо числовых символов).
На рис. 16.1 показана утилита Text Tools в действии.
Глава 16. Разработка утилит Excel с помощью VBA |
521 |
•Она может быть реализована в виде подключаемого модуля и быть доступной с ленты.
•Утилита может оперировать текущими выделенными ячейками (включая несколь ко выделенных областей) и позволяет изменять выделенный диапазон в то время, когда отображается диалоговое окно.
•Утилита запоминает последнюю операцию, а также отображает настройки при следующем вызове диалогового окна.
•Утилита не должна влиять на ячейки, содержащие формулы.
•Она должна быть быстрой и эффективной. Например, если пользователь выделяет весь столбец, утилита игнорирует пустые ячейки в этом столбце.
•Утилита должна применять немодальные диалоговые окна, которые всегда ото бражаются на экране и готовы к применению.
•Она должна быть компактной и не перекрывать данные рабочего листа.
•Утилита должна разрешать пользователям отменять внесенные ранее изменения.
•Пользователи утилиты должны иметь доступ к исчерпывающей справочной ин формации.
Рабочая книга утилиты
Утилита Text Tools реализована в виде файла надстройки XLAM. В процессе разра ботки я использовал рабочую книгу с поддержкой макросов XLSM. Как только я убедил ся втом, что все работает, я сохранил рабочую книгу в виде надстройки.
Рабочая книга утилиты Text Tools состоит из следующих компонентов.
•Один лист. Каждая рабочая книга должна иметь как минимум один лист. В дан ном случае этот лист используется для хранения процедур, выполняющих отмену совершенных ранее действий.
•Один модуль кода VBA. Этот модуль содержит объявления общедоступных пе ременных и констант. Кроме того, в нем находится код отображения пользова тельской формы и управления процедурой отмены действия. Весь код, выпол няющий конечные действия, сохранен в модуле пользовательской формы.
•Одно диалоговое окно UserForm . Содержит пользовательскую форму. Код, вы полняющий обработку текста, находится в модуле кода для Use г Form.
П ри м ечан и е
Этот файл также включает результат некоторых изменений, выполненных вручную. Цель этих изменений — отображение команд на ленте (см. также раздел “Добавление кода RibbonX”). К сожалению, невозможно изменить ленту Excel с помощью VBA.
Установка н адстроек
Для установки любой надстройки, в том числе надстройки t e x t to o ls .x la m , вы полните следующие действия.
1.Выберите команду Файл^Параметры Excel (File^Excel Options).
2.В окне Параметры Excel (Excel Options) выберите вкладку Надстройки (Add-ins).
522 |
Часть V. Профессиональные методы программирования |
3.В раскрывающемся списке Управление (Manage) выберите пункт Надстройки Excel (Excel Add-Ins) и щелкните на кнопке Перейти (Go to), после чего отобразит ся диалоговое окно Надстройки (Add-Ins).
4.Если устанавливаемая надстройка находится в списке Доступные надстройки (Add-Ins Available), установите рядом с ней флажок. Если же надстройка отсутст вует в этом списке, щелкните на кнопке Просмотр (Browse) для поиска соответст вующего файла X L A M или X L A .
5.Щелкните на кнопке ОК для установки надстройки.
Надстройка будет установленной до тех пор, пока вы не удалите ее из списка.
Можете пропустить пп. 1-3 приведенной выше инструкции, нажав комбинацию клавиш <Alt+TI> для открытия окна Надстройки. Эта комбинация работает во всех версиях Excel.
Как работает утилита
Надстройка Text Tools включает код RibbonX, который создает новый элемент на ленте: Главная•=>Utilities^Text Tools. Выбор этого элемента приводит к выполнению процедуры которая вызывает процедуру
П ерекрестная ссы лка
Наличие двух вспомогательных процедур для этой утилиты ( S t a r t T e x t T o o ls и S h o w T e x tT o o ls D ia lo g ) обосновывается в разделе “Добавление кода RibbonX” .
Пользователь может выбрать необходимые опции для изменения текста и щелкнуть на кнопке Применить (Apply), чтобы применить их. Изменения сразу же будут пред ставлены в рабочей книге. Диалоговое окно продолжает отображаться на экране. Каж дую операцию можно отменить. Пользователь также имеет возможность выполнить не которые дополнительные действия. Щелчок на кнопке Справка приведет к отображе нию диалогового окна справочного руководства. Щелчок на кнопке Закрыть вызывает закрытие диалогового окна. А поскольку вы имеете дело с немодальным диалоговым ок ном, у вас есть возможность продолжать работать в Excel в то время как будет отобра жаться диалоговое окно. В этом смысле оно ведет себя подобно панели инструментов.
П ользовательская ф орма утилиты
Создание утилиты обычно начинается с разработки пользовательского интерфейса, который в данном случае определяется основным диалоговым окном. Операция по соз данию диалогового окна заставляет повторно пересмотреть все концепции проекта.
На рис. 16.2 показано диалоговое окно U se rF o rm утилиты Text Tools.
Нетрудно заметить, что расположение отдельных элементов управления в окне Us- e rF o rm различно в режиме проектирования и выполнения утилиты. Это происходит по тому, что их расположение динамически изменяется в коде. Ниже описаны главные эле менты диалогового окна.
•Список Операция (Operation). Этот список находится в левой части формы и предназначен для указания типа выполняемой операции.
•Список Процедура*!. Точно указывает текстовую операцию, соответствующую указанному в предыдущем списке типу.
526 |
Часть V. Профессиональные методы программирования |
П роцедура U s e r F o r m _ I n it ia liz e
Эта процедура выполняется перед отображением пользовательской формы. Она из меняет размер формы, чтобы поместить в нее все необходимые параметры (их значения сохраняются в системном реестре). Данная процедура также определяет список пунктов меню (под названием ComboBoxOperation), которые указывают выполняемую опера цию. Эти пункты меню перечислены ниже:
•изменение регистра;
•добавление текста;
•удаление на основе указанной позиции;
•удаление пробелов;
•удаление символов.
Процедура C om b oB oxO p eration _C h an ge
Эта процедура выполняется после выбора пользователем операции в раскрывающем ся списке. Она отображает или скрывает элементы управления. Например, если пользо ватель выбрал опцию Изменение регистра, отображается первый список (элемент управления ComboBox), в котором можно выбрать один из следующих элементов:
•ВЕРХНИЙ РЕГИСТР;
•нижний регистр;
•Подходящий регистр;
•Регистр предложения;
•ПЕРЕКЛЮЧИТЬ рЕГИСТР.
Процедура A p p ly B u tto n _ C lic k
Эта процедура вызывается после щелчка мышью на кнопке Применить (Apply). Она вы полняет проверку ошибок, позволяющую гарантировать выбор корректного диапазона, и вы зывает функцию CreateW orkRange, которая позволяет убедиться в том, что не обрабаты ваются пустые ячейки. (См. также раздел “Повышение эффективности утилиты”.)
Процедура A p p ly B u tto n _ C lick также вызывает процедуру SaveForUndo, кото рая сохраняет текущие данные, требуемые для выполнения операции отмены. (См. также раздел “Отмена ранее выполненных действий”.)
Затем эта процедура использует конструкцию S e le c t Case для вызова соответст вующей процедуры, которая выполняет нужную операцию — вызывает одну из следую щих процедур:
•ChangeCase;
•AddText;
•RemoveText;
•RemoveSpaces;
•R em oveC haracters.
Некоторые из этих процедур вызывают функции. Например, процедура ChangeCase может вызывать функцию T oggle Case либо S entenceC ase.
Глава 16. Разработка утилит Excel с помощью VBA |
527 |
Процедура C l o s e B u t t o n C l i c k
Выполняется после щелчка на кнопке Закрыть (Close). Она сохраняет параметры те кущего состояния в системном реестре и выгружает пользовательскую форму.
Процедура H e l p B u t t o n C l i c k
Выполняется после щелчка на кнопке Справка. Отображает содержимое справочно го файла (стандартный компилированный HTML-файл справки).
Повышение эф ф ективности утилиты
Процедуры утилиты выполняют возложенные на них задачи, циклически просматри вая диапазон ячеек. При этом нет никакого смысла просматривать неизменяющиеся ячейки, например пустые ячейки или ячейки с формулами.
Как уже отмечалось, процедура A p p ly B u tt o n _ C lic k вызывает процедуруфункцию C re a te W o rkR a n g e . Эта функция создает и возвращает объект Range, в ко тором нет пустых ячеек и ячеек с формулами. Например, пусть столбец А содержит
текст в диапазоне |
А1:А12. Если пользователь выделит весь столбец, то функция |
C reateW orkR ange |
преобразует диапазон всего столбца в диапазон без пустых ячеек |
(т.е. А1:А12). В результате приложение будет выполняться эффективнее, не обрабатывая ненужных данных (пустые ячейки и формулы).
Функция C re a te W o rkR a n g e использует два аргумента.
•Rng. Объект Range, представляющий выделенный пользователем диапазон данных.
•T e x tO n ly . Булево значение. Если оно равно T ru e , функция возвращает ячейки толь
ко с текстовыми значениями. В противном случае возвращаются все непустые ячейки.
P riv a te |
F u n c tio n |
|
CreateW orkRange(Rng, |
T extO nly) |
||||||||||
1 |
Создает |
и |
возвращ ает |
объект Range |
|
|
|
|||||||
|
Set |
|
CreateW orkRange |
|
= N o th in g |
|
|
|
|
|||||
' |
Единственная я ч е й ка , |
|
включающая формулу |
|
||||||||||
|
I f |
Rng.Count = |
1 And |
Rng. HasFormula |
|
Then |
|
|||||||
|
|
Set |
CreateW orkRange = N o th in g |
|
|
|
||||||||
|
End |
E x it |
F u n c tio n |
|
|
|
|
|
|
|
||||
|
|
I f |
|
|
|
|
|
|
|
|
|
|
|
|
' |
Единственная ячейка |
либо |
одна |
объединенная |
ячейка |
|||||||||
|
I f |
Rng.Count = |
1 Or |
Rng.Meгд е C e lIs |
= |
True |
Then |
|||||||
|
|
I f T e xtO n ly |
Then |
|
|
|
|
|
Then |
|
||||
|
|
|
I f |
Not |
IsN u m e ric(R n g ( 1 ) . V alue) |
|
||||||||
|
|
|
|
|
Set |
CreateWorkRange |
= Rng |
|
|
|
||||
|
|
|
|
|
E x it |
|
F u n c tio n |
|
|
|
|
|
||
|
|
|
E lse |
CreateWorkRange |
= N o th in g |
|
||||||||
|
|
|
|
|
Set |
|
||||||||
|
|
|
End |
E x it |
|
F u n c tio n |
|
|
|
|
|
|||
|
|
|
I f |
|
|
|
|
|
|
|
|
|
||
|
|
E lse |
|
Not |
IsE m p ty(R n g (1 )) |
Then |
|
|
|
|||||
|
|
|
I f |
|
|
|
||||||||
|
|
|
|
|
Set CreateW orkRange = Rng |
|
|
|
||||||
|
|
|
End |
E x it |
|
F u n c tio n |
|
|
|
|
|
|||
|
|
|
I f |
|
|
|
|
|
|
|
|
|
||
|
|
End |
I f |
|
|
|
|
|
|
|
|
|
|
|
|
End |
I f |
|
Resume N ext |
|
|
|
|
|
|
||||
|
On |
E rro r |
|
Rng. P a re n t.UsedRange) |
||||||||||
|
Set |
|
Rng |
= In te rs e c t(R n g , |
||||||||||
|
I f |
T e xtO n ly = |
True |
Then |
|
|
|
|
|
|||||
528 |
|
Часть V. Профессиональные методы программирования |
||
Set |
CreateWorkRange |
= |
Rng. S p e c ia lC e lls (x lC o n s ta n ts , _ |
|
I f |
x lT e x tV a lu e s ) |
|
|
|
E rr |
<> 0 Then |
|
= N o th in g |
|
|
Set |
CreateW orkRange |
||
|
On |
E rro r GoTo 0 |
|
|
End |
E x it F u n c tio n |
|
|
|
I f |
|
|
|
|
E lse |
CreateWorkRange |
= Rng. S p e c ia lC e lls _ |
||
|
Set |
|||
I f |
E rr |
(x lC o n s ta n ts , |
x lT e x tV a lu e s + xlNum bers) |
|
<> 0 Then |
|
= N o th in g |
||
|
Set |
CreateWorkRange |
||
|
On |
E rro r GoTo 0 |
|
|
End |
E x it F u n c tio n |
|
|
|
I f |
|
|
|
|
End I f |
|
|
|
|
End F u n c tio n |
|
|
|
|
П р и м еч ан и е
Функция CreateWorkRange практически повсеместно использует свойство S p e c ia lC e lls . Для получения дополнительных сведений о свойстве S p e c ia l C e lls создайте макрос, который выполняет различные выделения в диало говом окне Excel Выделение группы ячеек (Go То Special). Для перехода в это окно нажмите клавишу <F5> и щелкните на кнопке Выделить (Special) в диа логовом окне Переход (Go То).
Диалоговое окно Выделение группы ячеек имеет одну особенность. Обычно оно работает с текущим выделенным диапазоном. Например, если выделен целый столбец, то результатом будет подмножество ячеек этого столбца. Но если выделена одна ячейка, то диалоговое окно работает со всем листом. Именно поэтому функция C r e a te WorkRange проверяет количество ячеек, которые составляют диапазон, переданный функции в качестве аргумента.
С охранение настроек утилиты
Утилита Text Tools характеризуется одним очень интересным свойством: она сохра няет последние используемые настройки. Это невероятно удобно, поскольку чаще всего требуется повторно выполнять одни и те же действия.
Последние настройки приложения сохраняются в системном реестре. После щелчка на кнопке Закрыть выполняется функция S a v e S e ttin g s , которая отвечает за сохране ние значений каждого элемента управления. При запуске утилиты выполняется функция G e tS e ttin g s , которая запрашивает настройки из системного реестра.
В системном реестре настройки утилиты сохраняются в следующем разделе.
HKEY_CURRENT_USER\Software\ VB and VBA |
Program S e ttin g s \ _ |
|
T e xt T o o ls |
U t ilit y \ S e t t in g s |
|
На рис. 16.5 |
показаны эти настройки (в |
окнеч-редактора системного реестра — |
r e g e d i t . ехе).
В процессе просмотра кода утилиты Text Tools вы обнаружите, что для сохранения настроек используется восьмиэлементный массив (под именем U serC hoices).*B прин ципе, для хранения настроек можно воспользоваться переменными, но использование массива немного облегчает работу программиста.
530 |
|
Часть V. Профессиональные методы программирования |
|
U s e rC h o ic e s (7) |
"Н астройки", |
" R em oveC haractersIndex", _ |
|
S a ve S e ttin g |
APPNAME, |
||
U se rC h o ice s(8) |
|
|
|
S a v e S e ttin g |
APPNAME, |
"Н астройки", |
"cb S kip N o nT e xt", _ |
cbS kipN o nT ext.V a lue * -1
Отмена ранее вы полненны х действий
К сожалению, в Excel не существует прямого способа отмены операции средствами VBA. Конечно, написать макрос с подобными функциями можно, но это не так уж и просто. Также, в отличие от свойства отмены в Excel, операция отмены, реализуемая утилитой Text Tools, является одноуровневой. Другими словами, пользователь этой ути литы может отменить лишь последнюю операцию. Дополнительные сведения относи тельно применения свойства отмены в пользовательских приложениях можно найти во врезке “Отмена действия процедуры VBA”.
Вутилите Text Tools отмена ранее выполненной операции осуществляется путем пред варительного сохранения исходных данных в рабочем листе. Как только пользователь от меняет операцию, сохраненные ранее данные копируются обратно в рабочую книгу.
Вутилите Text Tools в модуле M odulel общедоступные данные объявляются сле дующим образом.
P u b lic |
UndoRange As |
Range |
P u b lic |
U s e rS e le c tio n |
As Range |
Перед изменением данных процедура A p p ly B u tton C lick вызывает процедуру SaveForUndo. В начале процедуры определяются три переменные.
Set |
U s e rS e le c tio n = S e le c tio n |
Set |
UndoRange = WorkRange |
T hisW orkbook. S h e e ts ( 1 ) . UsedRange. C le a r
Объектная переменная U s e r S e le c tio n сохраняет область, выделенную пользова телем, благодаря чему можно отменить выделение области в дальнейшем. В данном слу чае WorkRange — это объект Range, который включает рабочий диапазон без пустых ячеек и ячеек с формулами. Третий оператор удаляет любые сохраненные данные.
После этого выполняется цикл.
For |
Each RngArea In W orkRange.Areas |
|
T h isW o rkb o o k .S h e e ts( 1 ) .Range |
_ |
|
|
(R n g A re a .A d d re ss). Form ula |
= RngArea. Form ula |
N ext |
RngArea |
|
В цикле просматривается содержимое объекта WorkRange, а его данные сохраняют
ся в рабочем листе (если этот объект состоит только из одного непрерывного диапазона, то в нем анализируется всего одна область).
После успешного выполнения описанных выше операций в коде вызывается метод OnUndo. С его помощью определяется процедура отмены выполненных действий. На пример, в случае изменения регистра текста этот оператор принимает следующий вид.
A p p lic a tio n . OnUndo "Отмена изменения р е ги стр а ", "U ndoT extT ools"
Раскрывающийся список Отменить в Excel дополнится новой командой: Отменить изменение регистра (рис. 16.6). После ее выбора выполняется процедура UrrdoText- T ools, приведенная ниже.
