- •Об авторе
- •Введение
- •Глава 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
- •Группы новостей
- •Веб-сайты
- •Сайт Йона Пелтиера
- •Системные требования
- •Использование компакт-диска
- •Файлы и программы, находящиеся на компакт-диске
- •Решение проблем
- •Предметный указатель
886 |
Часть VII. Дополнительные темы |
Функции
Ясоздал функцию VBA для использования в формулах рабочего листа. Но в результате
еевыполнения отображается сообщение об ошибке #ИМЯ?. Что здесь неправильно?
Скорее всего, причина в том, что функция находится в модуле кода листа (например, Л и с т 1 ) либо в модуле T h is W o rk b o o k (ЭтаКнига). Пользовательские функции рабоче го листа должны находиться в стандартных модулях VBА.
Я создал функцию VBA, которая работает при вызове ее из другой процедуры, а при использовании в составе формулы рабочего листа не работает. В чем здесь проблема?
Функции VBA, вызываемые в формулах рабочего листа, ограничены в своих возмож ностях. В общем случае эти функции являются строго пассивными. Это означает, что функции не могут изменять активную ячейку, применять форматирование, открывать ра бочую книгу или изменять активный лист. При попытке выполнения любого из этих дей ствий возвращается ошибка.
Я создал пользовательскую функцию рабочего листа. При получении доступа к этой функции из диалогового окна мастера функций выводится сообщение о невозможно сти предоставления справочной информации. Как устранить эту проблему?
Для того чтобы добавить к функции описание, активизируйте рабочую книгу, которая содержит эту функцию. Затем выберите команду Вид1^Макросы1^Макросы (View1^ Macros1^Macros) для отображения диалогового окна Макрос (Macro). Функция не ото бражается в списке, поэтому укажите ее имя в поле Имя макроса (Macro Name). После ввода имени функции щелкните на кнопке Параметры (Options) для отображения диа логового окна Параметры макроса (Macro Options). В поле Описание (Description) введите описание функции.
Можно ли отображать справочную информацию для аргументов функции в диало говом окне мастера функций?
Да. В Excel 2010 появился новый аргумент метода M acroOptions, позволяющий реали зовать эту возможность. Можно написать макрос, выполняющий присваивание описаний аргументам функции. Дополнительные сведения по этой теме можно найти в главе 10.
Моя функция рабочего листа отображается в категории “Определенные пользо вателем”окна мастера функций. Как переместить функцию в другую категорию?
Для этого необходимо воспользоваться кодом VBA. Следующий оператор перемеща ет функцию MyFunc в категорию 1 (Финансовые функции (Financial)):
A p p lic a tio n . M acroO ptions M acro:= "MyFunc", C ate g o ry:= 1
Представленная ниже таблица содержит список допустимых номеров категорий функций.
Номер |
Категория |
0 |
Без категории (отображается только в категории Все функции) |
1Финансовые
2Дата и время
3Математические и тригонометрические
4Статистические
Глава 31. Часто задаваемые вопросы о программировании в Excel |
887 |
Окончание таблицы
Номер Категория
5Ссылки и массивы
6Работа с базами данных
7Текстовые
8Логические
9Информационные
10Команды (обычно эта категория скрыта)
11Настройка (обычно эта категория скрыта)
12Управление макросами (обычно эта категория скрыта)
13DDE/внешние (обычно эта категория скрыта)
14Определенные пользователем (по умолчанию)
15Инженерные
Как создать новую категорию функций?
Укажите текстовую строку для аргумента C a t e g o r y метода M a c r o O p t io n s . Ниже приводится пример.
A p p lic a tio n .M a c ro O p tio n s M acro:= "MyFunc", _
C a te g o ry := "Корпоративные функции XYZ"
У меня есть пользовательская функция, которая будет применяться в формуле ра бочего листа. Как сделать так, чтобы при вводе неверного значения функция воз вращала значение ошибки (#ЗНАЧ1)?
Е сл и ф ункция называется M y F u n c t io n , то м ож но использовать следую щ ий опера тор для возврата кода о ш и б к и в ячейку, содерж ащ ую ф ункцию :
M yFunction = C V E rr(x lE rrV a lu e )
В этом примере x l E r r V a l u e является предопределенной константой. Константы остальных кодов ошибок описываются в интерактивном справочном руководстве.
В коде VBA я воспользовался функцией Windows API, которая работала великолеп но. Затем я передал рабочую книгу коллеге, он попытался открыть ее и получил со общение об ошибке компиляции. В чем причина появления этой проблемы?
Вероятнее всего, причина появления проблемы заключается в том, что ваш коллега использует 64-разрядную версию Excel 2010. Для обеспечения совместимости с этой версией объявления API-функций должны включать ключевое слово “PtrSafe”. Пример объявления API-функции, которое корректно в 32-разрядной версии Excel, но вызывает ошибку в 64-разрядной версии Excel 2010, приводится ниже.
D eclare F u n c tio n G etW indow sD irectoryA L ib |
"k e rn e l3 2 " |
_ |
(ByVal lp B u ffe r As S trin g , ByVal nS ize |
As Long) As |
Long |
Во многих случаях обеспечение совместимости объявления с 64-разрядной версией Excel достигается путем добавления слова “PtrSafe” после ключевого слова D e c la r e . Этот метод обычно применяется при объявлении API-функций, хотя некоторые такие функции требуют изменения типа данных аргументов.
Ниже приводится пример объявления, которое совместимо как с 32-, так и с 64-раз- рядной версиями Excel 2010.
888 |
Часть VII. Дополнительные темы |
|
D e cla re P trS a fe F u n c tio n G etW indow sD irectoryA |
L ib |
"k e rn e l3 2 " _ |
(ByVal lp B u ffe r As S tr in g , ByVal n S ize As |
Long) |
As Long |
Причина сбоя кода VBA в Excel 2007 (и более ранних версиях) может заключаться в том, что ключевое слово P trS a fe не распознается. Ниже представлен пример исполь зования директив компилятора для объявления API-функции, которая совместима с 32-раз- рядной версией Excel (включая версии, предшествующие Excel 2010) и с 64-разрядной версией Excel 2010.
# I f VBA7 And Win64 |
Then |
|
|
|
L ib |
"k e rn e l3 2 " _ |
|
D e cla re P trS a fe |
F u n c tio n G e tW indow sD irectoryA |
||||||
(ByVal lp B u ffe r As |
S tr in g , |
ByVal nS ize |
As |
Long) |
As |
Long |
|
#E lse |
G e tW indow sD irectoryA L ib |
"k e rn e l3 2 " |
_ |
||||
D e cla re F u n c tio n |
|||||||
(ByVal lp B u ffe r As |
S trin g , |
ByVal n S ize |
As |
Long) |
As |
Long |
|
#End I f |
|
|
|
|
|
|
|
Первый оператор D e c la re |
применяется в том случае, когда значения констант VBA7 |
||||||
и W ind64 будут T ru e |
(в случае использования 16-разрядной версии Excel 2010). Для |
||||||
всех других версий Excel применяется второй оператор D e c la re .
Как выполнить пересчет формул, применяющих пользовательскую функцию?
Для этого можно воспользоваться комбинацией клавиш <Ctrl+Alt+F9>.
Можно ли использовать встроенные функции рабочего листа Excel в коде VBA?
В большинстве случаев — да. Функции Excel рабочего листа задаются с помощью метода W o rk s h e e tF u n c tio n объекта A p p lic a t io n . Например, доступ к функции
вы получите, введя следующий оператор:
Ans = A p p lic a tio n . W o rk s h e e tF u n c tio n . Sum (Range (11A l :A3 ") )
В этом примере подсчитывается сумма всех значений в ячейках А1:АЗ (в активном листе), которая присваивается переменной Ans.
Если VBA содержит эквивалент функции рабочего листа, то последнюю нельзя ис пользовать на рабочем листе. Например, если VBA задает функцию подсчета квадратно го корня (S q r), то функцию SQRT рабочего листа в коде VBA использовать нельзя.
Существует ли способ задать разрыв строки в тексте окна сообщения?
Для этого необходимо воспользоваться символом возврата каретки или перевода строки. Представленный далее оператор отображает окно сообщения, которое содержит текст, состоящий из двух строк. Встроенная константа v b N e w L in e представляет символ перевода строки.
MsgBox "Привет" & vbNewLine & A p p lic a tio n .UserName
Объекты, свойства, методы и события
Существует ли список событий Excel, которые можно использовать ?
Да. Соответствующие сведения можно найти в справочной системе.
Количество доступных свойств и методов огромно. Как воспользоваться методами и свойствами, доступными для определенного объекта?
Существует несколько способов получения этой информации. Можно воспользовать ся окном Object Browser, которое отображается в редакторе VBE. Нажмите клавишу
Глава 31. Часто задаваемые вопросы о программировании в Excel |
889 |
<F2> для получения доступа к окну Object Browser и выберите Excel из раскрывающе гося списка Libraries/Workbooks (Все библиотеки). Список Classes (Классы) (слева) содержит все доступные объекты Excel. При выборе объекта его свойства и методы ото бражаются справа в списке Members (Компоненты).
Кроме того, список свойств и методов можно отобразить при введении имени объек та. Например, введите следующий код:
Range ( " A l" ) .
При вводе точки будет отображен список всех доступных свойств и методов объекта Range. Если этого не произошло, то необходимо выбрать Tools^Options (Сервис1^ Параметры), перейти на вкладку Editor (Редактор) и установить флажок Auto List Members (Автоматическая вставка объектов). К сожалению, свойство автоперечисления работает далеко не со всеми объектами. Например, ввод следующего оператора не при ведет к отображению списка всех свойств и методов:
A c tiv e s h e e t. Shapes(1 ).
Большое количество информации по языку VBA содержит также справка, которую можно вызвать в окне справки Visual Basic Editor. В нем вы найдете описание методов и свойств всех объектов, которые могут вызвать интерес разработчика. Самым простым способом получения этой информации является ввод имени объекта в окне отладки (Immediate) в нижней части окна VBE или наведение указателя на имя объекта с после дующим нажатием клавиши <F1>. В результате будет отображен раздел справочного ру ководства, посвященный этому объекту.
В чем смысл использования коллекций? Является ли коллекция объектом? Что та кое коллекция?
Коллекция — это объект, который содержит группу подобных объектов. Коллекция получает название в виде существительного во множественном числе. Например, кол лекция W o rk s h e e ts — это объект, который содержит объекты W o rk s h e e t рабочей книги. Коллекцию можно воспринимать как массив: W o rk s h e e ts (1) указывает пер вый объект W o rk s h e e t в коллекции W orkbooks. Вместо индекса допускается указы вать имя рабочего листа, например W o rk s h e e ts ( " J Ih c tI м). Концепция коллекции упрощает одновременное управление подобными объектами. А для циклического пере бора членов коллекции можно воспользоваться конструкцией F o r E a c h -N e x t.
Когда в коде VBA я ссылаюсь на рабочий лист, возникает сообщение об ошибке “subscript out of range”. Но я не использую подсценарии. В чем тут дело?
Эта ошибка возникает при попытке получить доступ к несуществующему члену кол лекции. Например, приведенный ниже оператор создает сообщение об ошибке, если ак тивная рабочая книга не содержит рабочий лист, который называется M yS heet.
Set X = A ctive W o rkb o o k .W o rksh e e ts( "M ySheet")
Как лишить пользователя возможности прокручивать рабочий лист?
Для этого можно или скрыть неиспользуемые строки и столбцы, или воспользоваться оператором VBA для перенастройки полосы прокрутки на рабочем листе. Следующий оператор устанавливает область прокрутки на листе Лист1 таким образом, что пользо ватель не может активизировать ячейки за пределами диапазона B2:D50.
W o rkshe ets( "Л и с т !") . S c ro llA re a = "B2:D50"
890 |
Часть VII. Дополнительные темы |
Для того чтобы восстановить первоначальную область прокрутки, воспользуйтесь та ким оператором:
W o rksh e e ts( "Л ист1" ) . S c ro llA re a = ""
Помните, что значение свойства S c ro llA re a не сохраняется вместе с рабочей кни гой. Таким образом, необходимо устанавливать это свойство при каждом следующем от крытии рабочей книги. Данный оператор можно разместить в процедуре обработчика событий Workbook_Open.
Какая разница между использованием методов S e le c t и A p l l i c a t i o n . Goto?
Метод S e l e c t объекта R an ge выделяет диапазон только на активном рабочем лис те. Метод A p p l i c a t i o n . G o t o можно использовать для выделения диапазона на лю бом листе рабочей книги. Метод A p p lic a t i o n . G o t o может либо активизировать, ли бо деактивизировать другой лист. Кроме того, метод G o to позволяет прокручивать ра бочий лист, чтобы расположить выделенный диапазон в левом верхнем углу экрана.
Какая разница между активизацией и выделением диапазона?
В отдельных случаях методы A c tiv a te и S e le c t приводят к одинаковому эффек ту. Но-зачастую они возвращают разные результаты. Предположим, что выделен диапа зон А1:СЗ. Приведенный ниже оператор активизирует ячейку СЗ. Первоначальный диа пазон остается выделенным, но ячейка СЗ становится активной, т.е. курсор находится в этой ячейке.
Range("С З " ) .A c tiv a te
Предположим также, что диапазон А1:СЗ выделен. Представленный далее оператор выделяет единственную ячейку, которая становится активной.
Range("С З " ) .S e le c t
Существует ли быстрый способ удаления всех значений из рабочего листа без уда ления формул?
Да. Код выполняется по отношению к активному рабочему листу и удаляет значения всех ячеек, которые не содержат формул (форматирование ячеек тоже не очищается).
On E rro r Resume N ext
C e lls . S p e c ia lC e lls (x lC e llT y p e C o n s ta n ts , 2 3 ) .C le a rC o n te n ts
Второй аргумент, 23, представляет собой сумму значений, представленных следую
щими встроенными константами: x lE r r o r s (16), |
x l L o g i c a l (4), xlN u m b ers (1) |
и x lT e x t V a lu e s (2). |
|
Использование оператора On E r r o r R esum e |
N e x t позволяет отменить сообще |
ние об ошибке, которое возникает, если ни одна ячейка не соответствует указанному критерию.
Я знаю, как писать операторы VBA, выделяющие диапазон, для которого известен адрес. Объясните, как создать оператор выделения, если известны только номер строки и номер столбца?
Для этого воспользуйтесь методом C e lls . Следующий оператор выделяет ячейку в пятой строке и двенадцатом столбце (т.е. ячейку L5):
C e lls (5, 12) .S e le c t
Глава 31. Часто задаваемые вопросы о программировании в Excel |
891 |
При попытке создать макрос, вызывающий команду Excel Файл^Выход из Excel (File°>Exit Excel), Excel закрывается до того, как отобразится сгенерированный код. Существует ли команда VBA для выхода из Excel?
Для выхода из Excel используйте следующую инструкцию:
A p p lic a t io n . Q u it
Как отключить обновление экрана в процессе работы макроса?
Представленный далее оператор отключает обновление экрана и ускоряет работу макроса, модифицирующего отображаемую информацию.
A p p lic a tio n . S creenU pdating = F alse
По завершении выполнения процедуры свойству S c r e e n U p d a t i n g присваивается значение T r u e . Для восстановления обновления экрана воспользуйтесь следующим опе ратором:
A p p lic a tio n . S creenU pdating = F alse
Какой самый простой способ создания имени диапазона с помощью VBA?
Если включить запись макроса при создании имени диапазона, то будет получен сле дующий код.
R a n g e ("D 1 4 :G 2 0 ").S e le ct
ActiveW orkbook.N am es.Add Name:= " In p u tA re a ", _
R e fe rs T o R lC l:= " =Лист1!R14C4: R2 0C7"
Но намного проще использовать следующий оператор:
S h e e ts( "Л йст1" ) . Range( "D14: G20" ) . Name = "In p u tA re a "
Как определить, имеет ли имя конкретная ячейка или диапазон?
Для этого необходимо проверить значение свойства Nam e объекта N am e, который содержится в объекте R a n g e . Следующая функция принимает диапазон в качестве аргу мента и возвращает имя диапазона, если оно существует. Если диапазон не имеет имени, то функция возвращает значение F a ls e .
F u n c tio n RangeName(rng) As V a ria n t
On |
E rro r |
Resume |
N ext |
|
RangeName |
= |
r n g . Name. Name |
||
I f |
E rr <> |
0 |
Then |
RangeName = False |
End F u n c tio n
На первый взгляд создается впечатление, что в Excel 2010 отсутствует окно пред варительного просмотра. Переход к предварительному просмотру осуществляется в режиме просмотра Backstage (после выполнения команды Файл^Печать), а классическое окно предварительного просмотра отсутствует
Единственный способ перехода в классическое окно предварительного просмотра — воспользоваться следующим оператором VBA:
A c tiv e S h e e t. P rin tP re v ie w
892 |
Часть VII. Дополнительные темы |
Можно ли отображать сообщения в строке состояния в процессе выполнения мак роса? Я использую сложный макрос и неплохо бы иметь представление о ходе его выполнения
Рекомендуется присвоить описательный текст свойству S ta tu s B a r объекта A p p li c a tio n . Приведем пример соответствующего оператора.
A p p lic a tio n . S ta tu s B a r = "Обрабатывается файл " & FileNum
После завершения процедуры необходимо восстановить строку состояния с помощью такого фрагмента кода.
A p p lic a tio n . S ta tu s B a r |
= |
F alse |
A p p lic a tio n .S ta tu s B a r |
= |
"" |
Я написал макрос VBA, который копирует диапазон и вставляет его в другое место на рабочем листе. Этот макрос использует метод S e le c t. Существует ли более эффективный способ копирования и вставки?
Да. Хотя при записи макроса ячейки сначала выделяются, выделение выполнять во все не обязательно - на самом деле это только замедляет работу макроса. Запись простой операции копирования и вставки приводит к генерированию кода VBA, состоящего из четырех строк. Две из них вызывают метод S e le c t.
Range("A l " ) . S e le c t
S e le c tio n . Copy
R a n g e ("B l") .S e le c t
A c tiv e S h e e t. Paste
Эти четыре строки кода можно заменить одним оператором, который приводится ниже.
Range(" A l " ) . Сору Range( " B l")
Обратите внимание на то, что последний оператор не требует использования метода S e le c t.
Я не нашел метода сортировки массива VBA. Значит ли это, что нужно копиро вать значения на рабочий лист и применять метод R ange. S o rt?
В языке VBA не существует встроенных средств сортировки массивов. Копирование массива на рабочий лист — это только один из методов, но можно создать собственную процедуру сортировки. В настоящее время существует довольно много алгоритмов сор тировки, часть из которых достаточно просто реализуется с помощью VBA. В этой книге приводится код VBA нескольких методов сортировки.
Мой макрос работает с выделенными ячейками, но он неудачно завершается, если выделенной оказывается диаграмма. Как удостовериться в том, что выделен диа пазон ячеек?
Можно воспользоваться функцией VBA TypeName, которая применяется для про верки объекта S e le c tio n . Ниже приведен пример такого кода.
I f |
TypeN am e(S election) <> "Range" Then |
|
MsgBox "Выделите диапазон!" |
|
E x it Sub |
End |
I f |
Еще одним вариантом является использование свойства R a n g e S e lec tio n , которое возвращает объект Range, представляющий выделенные ячейки рабочего листа. Данное свойство возвращает выделенные ячейки на рабочем листе указанного окна, даже если
Глава 31. Часто задаваемые вопросы о программировании в Excel |
893 |
помимо них выделен графический объект. Это свойство объекта Window, а не объекта Workbook. Следующий оператор отображает адрес выделенного диапазона:
MsgBox A ctive W in d o w .R a n g e S e le ctio n .A d d re ss
Как определить, активна ли диаграмма?
Используйте следующее выражение.
I f |
A c tiv e C h a rt Is N o th in g Then |
|
MsgBox "Выделите диаграмму " |
|
E x it Sub |
End |
I f |
Окно сообщения появится на экране только в том случае, если диаграмма неактивна (имеется в виду как внедренная диаграмма, так и диаграмма на отдельных листах).
Макрос VBA должен подсчитать количество строк, выделенных пользователем. Ме тод S e le c t io n . Rows. Count не применяется, если выделены несмежные строки. Это ошибка?
На самом деле так и должно быть. Метод Count возвращает количество элементов в первой выделенной области (предположим, что выделение состоит из нескольких облас тей). Для того чтобы получить точное количество строк, код VBA должен определить количество выделенных областей и подсчитать количество строк в каждой области. Сна чала необходимо воспользоваться методом S e le c t io n .A r e a . Count, чтобы получить количество областей. Ниже приведен пример, который сохраняет общее количество вы деленных строк в переменной NumRows.
NumRows |
= |
0 |
For Each |
a re a In S e le c tio n .A re a s |
|
NumRows |
= NumRows + a re a . Rows. Count |
|
Next area |
|
|
Кстати, это относится и к подсчету количества выделенных столбцов. |
||
Я использую Excel для создания накладных. Существует ли способ генерации уни кального номера накладной?
Одним из способов является использование системного реестра. Следующий код де монстрирует такой способ.
C ounter |
= |
G e tS e ttin g ("X Y Z C o rp '\ " In vo ice N u m ", |
"C o u n t", 0) |
|
C ounter |
= |
C ounter |
+ 1 |
|
S a ve S e ttin g "XYZ |
C o rp ", "Invo ice N um ", "C o u n t", |
C ounter |
||
При выполнении данного кода текущее значение извлекается из системного реестра, увеличивается на единицу и назначается переменной Counter. После этого обновлен ное значение сохраняется в системном реестре. Значение переменной C ounter можно использовать в качестве уникального номера накладной.
Этот прием можно применять и в других целях. Например, можно подсчитать коли чество раз, когда была открыта рабочая книга. Для этого код, подобный указанному вы ше, включается в процедуру Workbook_Open.
Существует ли свойство рабочей книги Excel, которое определяет ее постоянное отображение на экране?
К сожалению, не существует.
894 |
Часть VII. Дополнительные темы |
Существует ли оператор VBA для выделения последнего значения в строке или
столбце? Как правило, я могу воспользоваться комбинацией клавиш <Ctrl+Shift+J> или <Ctrl+Shift+ —» для выполнения этого действия, но как это сделать с помощью макроса?
Эквивалентом комбинации клавиш <Ctrl+Shift+i> в VBA выступает следующий оператор:
S e le c tio n . E n d (x lD o w n ).S e le c t
Для иных направлений используются три другие константы: xlT oL ef t, x lT oR ig h t
и xlUp.
Как определить последнюю непустую ячейку в выбранном столбце?
Представленный ниже оператор отображает адрес последней непустой ячейки в столбце А.
MsgBox A c tiv e S h e e t. C e lls (R o w s . C ou nt, 1 ) .E n d (x lU p ).A d d re s s
Но этот оператор не работает, если последняя ячейка в столбце непустая. Для того чтобы обойти эту маловероятную ситуацию, воспользуйтесь следующим кодом.
W ith |
A c tiv e S h e e t. C e lls (R o w s . C ou nt, 1) |
|
I f |
Is E m p ty ( .V alue) Then |
|
|
MsgBox |
. E nd(x lU p ) .Addre s s |
E lse |
|
|
|
MsgBox |
.Addre s s |
End I f |
|
|
End W ith |
|
|
Ссылки VBA могут стать очень длинными, особенно если нужно точно указать объект врабочей книге ирабочем листе. Существует ли способ сократить длину ссылок?
Да. Для этого воспользуйтесь оператором S et для создания объектной переменной. Ниже приведен пример подобного кода.
Dim |
MyRange |
as |
Range |
Set |
MyRange |
= |
ThisW orkbook.W o rksh e e ts( "Л ист1" ) . Range( " A l") |
После выполнения оператора S et можно ссылаться на объект Range по имени MyRange. Например, вы имеете возможность определить значение ячейки с помощью следующего оператора:
MyRange.Value = 10
Кроме упрощения ссылок на объекты, использование таких переменных ускоряет вы полнение кода.
Существует ли способ объявления массива, если неизвестно, сколько элементов он будет содержать ?
Да. Можно объявить динамический массив с помощью оператора Dim. При этом исполь зуются пустые скобки. Как только станет известно, сколько элементов будет содержаться в массиве, воспользуйтесь оператором ReDim, чтобы переопределить массив. Оператор ReDim P reserve позволяет переопределить массив без потери текущего содержимого.
Можно ли предоставить пользователю возможность отменить результат выпол нения макроса ?
Да, но эта возможность недоступна по умолчанию. Для того чтобы включить ее, мо дуль кода VBA должен отслеживать изменения, проведенные макросом. Макрос должен быть готов отменить внесенные изменения при выборе пользователем команды Отмена.
Глава 31. Часто задаваемые вопросы о программировании в Excel |
895 |
Чтобы разрешить пользователю выполнять команду Отмена, воспользуйтесь мето дом OnUndo в качестве последнего оператора макроса. Этот метод позволяет указать текст, который отображается в меню команды Отмена, а также процедуру, вызываемую командой Отмена. Ниже приводится пример.
A p p lic a tio n . OnUndo "Последний макрос ", "MyUndoMacro"
Можно ли приостановить выполнение макроса, чтобы пользователь мог ввести данные в определенную ячейку?
Для того чтобы получить значение от пользователя и поместить его в определенную ячейку, можно воспользоваться функцией Excel InputB ox. Например, первый оператор фрагмента кода, приведенного ниже, отображает окно ввода. Как только пользователь введет значение, оно будет помещено в ячейку А1.
U serV al = A p p lic a tio n .In p u tB o x (p ro m p t:= "Значение", T y p e := l) I f TypeNam e(UserVal)<>"B oolean" Then R a n g e ("A l") = U serV al
VBA имеет функцию InputBox, но метод с таким же названием содержится в объекте Appl i c a t i o i l Они одинаковы?
Нет. Метод Excel InputB ox является более гибким, так как позволяет проверить вве денное пользователем значение. В предыдущем примере в качестве значения аргумента Туре метода InputB ox использовалась единица (представляет числовое значение). Это значение позволяет удостовериться, что пользователь ввел в поле числовое значение.
Для того чтобы написать оператор VBA, который создает формулу, следует вста вить символ кавычек (") в текст. Как это сделать?
Предположим, что вам с помощью кода VBA необходимо ввести следующую форму лу в ячейку с адресом В1.
=ЕСЛИ(А1="Да", ИСТИНА, ЛОЖЬ)
Следующий оператор генерирует сообщение о синтаксической ошибке, поскольку используются встроенные символы кавычек.
R a n g e ("B l").o rm u la = " =ЕСЛИ(А1="Да", ИСТИНА,ЛОЖЬ)" ' неверно
Решением будет последовательное использование двух двойных кавычек. В этом слу чае внутренние кавычки Excel интерпретирует как одинарные кавычки. Представленный далее оператор приводит к необходимому результату.
R a n g e ("B l") .Form ula = "=ЕСЛИ(A l= ""Y e s "", ИСТИНА,ЛОЖЬ)"
Еще одним способом является использование функции VBA Chr с аргументом 34. Функция возвращает символ кавычки. Следующий пример демонстрирует применение этого способа.
Range( " B l" ) . Form ula = _
" =ЕСЛИ (Al= " Sc Chr (34) & "Да" & C hr(34) & ", ИСТИНА, ЛОЖЬ) "
Еще один способ заключается в том, чтобы воспользоваться формулой, в которой вместо символов кавычек используются апострофы. Затем с помощью функции VBA R eplace апострофы заменяются кавычками.
MyFormula = "=ЕСЛИ А1=' Д а' , TRUE,FALSE)" |
|
Range( " B l" ) . Form ula = R eplace(M yForm ula, |
C h r(3 4 )) |
