- •Об авторе
- •Введение
- •Глава 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
- •Группы новостей
- •Веб-сайты
- •Сайт Йона Пелтиера
- •Системные требования
- •Использование компакт-диска
- •Файлы и программы, находящиеся на компакт-диске
- •Решение проблем
- •Предметный указатель
Глава 8. Основы программирования на VBA |
215 |
Переменные, типы данных и константы
Главное назначение VBA— обработка данных. Одни данные сохраняются в объек тах, например в диапазонах рабочих листов, а другие — в созданных переменных.
Переменная представляет собой именованное место хранения данных в памяти ком пьютера. Переменные могут содержать данные разных типов — от простых логических, или булевых, значений (True или F a lse ) до больших значений с двойной точностью (см. следующий раздел). Значение присваивается переменной с помощью оператора ра венства (подробнее об этом — далее). Вы существенно облегчите себе жизнь, если нау читесь присваивать переменным простые описательные имена. Однако помните, что VBA поддерживает несколько правил, ограничивающих вас в именовании переменных.
•Вы можете использовать в названиях символы букв, числа и некоторые знаки пре пинания, но первой в имени переменной всегда должна вводиться буква.
•VBA не различает регистры. Чтобы сделать имена переменных удобочитаемыми,
программисты часто используют смешанный регистр (например, I n t e r e s t -
R a t e , а не i n t e r e s t r a t e ) .
• Нельзя использовать в именах пробелы или точки. Чтобы сделать имена перемен ных более удобными для чтения, программисты вводят символ подчеркивания
( I n t e r e s t _ R a t e ) .
•Специальные символы объявления типов (#, $, %, & или !) также не применяются в имени переменной.
•Названия переменных ограничены 254 символами (вряд ли вы, будучи в здравом уме, придумаете настолько длинное название).
Вприведенном далее списке содержатся отдельные примеры выражений присваива ния, в которых используются различные типы переменных. Названия переменных указы ваются слева от знака равенства. Каждый оператор присваивает переменной слева от знака равенства значение, которое располагается справа от знака равенства.
х= 1
I n t e r e s t R a t e = 0 . 0 7 5
LoanPayof f A m ou n t |
= 2 4 3 0 8 9 . 8 7 |
|
D a ta E n te re d = F a l s e |
||
x = x + 1 |
|
|
MyNum = |
YourN um |
* 1 . 2 5 |
UserName |
= "Б о б |
Д ж онсон" |
D a t e S t a r t e d = # 1 2 /1 4 /2 0 0 6 # |
||
В VBA используется очень много зарезервированных слов, т.е. таких слов, которые не допускается применять в качестве названий переменных или процедур. Если вы попытае тесь ввести одно из таких слов, то будет отображено сообщение об ошибке. Например, не смотря на то что зарезервированное слово Next могло бы стать описательным названием многих переменных, следующая инструкция генерирует синтаксическую ошибку:
Next = 132
К сожалению, сообщения о синтаксических ошибках не всегда достаточно описа
тельны. Указанная |
выше инструкция генерирует сообщение об ошибке: C om pile |
erro r: E xpected |
V a ria b le (Ошибка компиляции: ожидается переменная). Ситуа |
ция не совсем понятна, поэтому при отображении такого сообщения об ошибке обра щайтесь к справочной системе, чтобы убедиться в том, что имя переменной не задейст вовано в VBA в других целях.
216 |
Часть III. Visual Basic for Applications |
Определение типов данных
Интерпретатор VBA облегчает жизнь программистам, автоматически обрабатывая любые типы данных. Не во всех языках программирования управление данными выпол няется на столь простом уровне. Например, многие языки программирования являются строго типизированными, т.е. программист должен явно объявлять тип данных каждой используемой переменной.
Тип данных указывает, в каком виде данные хранятся в памяти: как целые значения, дейст вительные числа, текст или др. VBA может автоматически типизировать данные, однако это чревато негативными последствиями — медленным выполнением операций и менее эффек тивным использованием памяти. В результате, позволяя VBA самостоятельно определять ти пы данных, вы можете столкнуться с проблемами выполнения больших или сложных прило жений. Если вам приходится экономить каждый байт памяти, то вы должны хорошо разби раться в типах данных. Еще одно преимущество явного объявления типа данных всех используемых переменных состоит в том, что хотя VBA дополнительно ищет ошибки на эта пе компиляции, подобные ошибки довольно сложно выявить другими способами проверки.
В табл. 8.1 перечислены поддерживаемые в VBA типы данных (специальные типы данных будут описаны далее в этой главе).
Таблица 8.1 . Встроенные типы данных VBA
Тип данных
B y t e
B o o l e a n
I n t e g e r
Long
S i n g l e
D o u b le
C u r r e n c y
D e c im a l
D a te Obj e c t
S t r i n g
(переменной
длины)
S t r i n g
(фиксирован ной длины)
V a r i a n t
(числа)
Количество зарезерДиапазон значений вированных байтов
1 |
0-255 |
2 |
T ru e (Истина) или F a l s e (Ложь) |
2 |
-32768 - 32767 |
4 |
-2147483648 - 2147483647 |
4 |
-3.402823Е38 - -1 .401298Е-45 (отрицательные |
|
числа); 1.401298Е-45 - 3.402823Е38 (положитель |
|
ные числа) |
8 |
-1,79769313486232Е308 - |
|
-4,94065645841247Е-324 (отрицательные числа); |
|
4,94065645841247Е—324 - 1,79769313486232Е308 |
|
(положительные числа) |
8 |
-922337203685477,5808 - 922337203685477,5807 |
12 |
+/-79228162514264337593543950335 без десятич |
|
ных знаков; +/-7,9228162514264337593543950335 |
|
с 28 знаками после запятой |
8 |
1 января 100 года - 31 декабря 9999 года |
4 |
Любая ссылка на объект |
10 + длина строки |
0 - приблизительно 2 млрд символов |
Длина строки |
1 - приблизительно 65400 символов |
16 |
Любое числовое значение в пределах диапазона типа |
|
данных Double. Может также включать специальные |
|
значения типа Empty, E r r o r , N o th in g и N u l l |
Глава 8. Основы программирования на VBA |
217 |
||
|
|
|
Окончание табл. 8.1 |
Тип данных |
Количество зарезер Диапазон значений |
|
|
|
вированных байтов |
|
|
Variant |
22 + длина строки |
0 - примерно 2 млрд |
|
(символы) |
Зависит от типа |
Зависит от элемента |
|
Пользова |
|
||
тельский |
|
|
|
Примечание
Тип данных D e c im a l необычен тем, что его нельзя объявить. На самом деле он является подтипом типа V a r i a n t . Для преобразования в десятичный тип данных типа v a r i a n t воспользуйтесь функцией VBA CDec.
Рекомендуется выбирать тот тип данных, в котором используется минимальное коли чество байтов для хранения значений, но он также должен быть достаточным для пред ставления максимальных значений переменных. При работе с данными в VBA скорость выполнения операций зависит от объема данных, которые обрабатываются с помощью VBA. Другими словами, чем меньше байтов зарезервировано для данных, тем быстрее VBA получает доступ к данным и обрабатывает их.
Для проведения математических вычислений в рабочих листах Excel использует тип дан ныхDouble. Его рекомендуется применять и в процессе обработки чисел в VBA для обеспе чениятой же точности вычислений. Для обработки целочисленных значений идеально подхо дит тип I n te g e r , если, конечно, вы уверены, что используемые значения не превышают 32767. В противном случае обратитесь к типу данных Long. При управлении номерами строк в рабочем листе Excel лучше применять тип данных Long, так как количество строк в рабо чем листе превышает максимальное значение, допустимое в типе данных I n te g e r .
Тестирование типов данных
Чтобы оценить важность определения типа данных, автор разработал специальную процедуру, выполняющую циклические вычисления с последующим отображением за траченного времени.
Sub T i m e T e s t () |
|
|
|||
Dim |
х |
A s |
L o n g , |
у |
A s L o n g |
Dim |
A |
A s |
D o u b le , |
В A s D o u b le , С A s D o u b le |
|
Dim |
i |
A s |
L o n g , |
j |
A s L o n g |
|
Dim |
S t a r t T i m e |
A s |
D a t e , E n d T im e A s D a t e |
||||||
' |
С о хран ени е |
|
в р е м е н и |
н а ч а л а в ы ч и с л е н и й |
||||||
|
S t a r t T i m e = T im e r |
|
||||||||
' |
Выполнение |
|
в ы ч и с л е н и й |
|||||||
|
х |
= |
О |
|
|
|
|
|
|
|
|
у |
= |
О |
|
|
|
|
|
|
|
|
F o r |
i = |
1 |
|
То |
10000 |
|
|||
|
|
х |
= |
х |
+ |
|
1 |
|
|
|
|
|
у |
= |
х |
+ |
|
1 |
|
|
|
|
|
F o r |
j |
|
= |
1То |
10000 |
|||
|
|
|
А |
= |
|
х |
+ |
у |
+ |
i |
|
|
|
В |
= |
|
у |
- |
х |
- |
i |
|
|
|
С |
= |
|
х |
/ |
у |
* |
i |
|
|
N e x t |
j |
|
|
|
|
|
|
|
|
N ext |
i |
|
|
|
|
|
|
|
|
1 |
Получение |
|
в р е м е н и |
о к о н ч а н и я в ы ч и с л е н и й |
||||||
218 |
Часть III. Visual Basic for Applications |
EndTime = Tim er
'Отображение общего времени в секундах
MsgBox Form at(EndTim e - S ta rtT im e , "0 .0 ")
End Sub
Ha компьютере автора выполнение этой процедуры заняло 7,7 секунды (этот пока затель определяется вашей системой). Затем были закомментированы операторы Dim, с помощью которых объявляются типы данных. Для этого в начале каждой строки, со держащей операторы Dim, были вставлены апострофы. В результате интерпретатор VBA использовал тип данных, заданный по умолчанию, а именно — V a ria n t. После это го процедура была выполнена еще раз.
Мораль проста: для скорейшего выполнения VBA-приложений объявляйте переменные!
Рабочая книга, содержащая этот код, находится на прилагаемом к книге компактдиске в файле tim in g te x t.x ls m .
Объявление переменных
Если вы не объявили тип данных для переменной, используемой в процедуре VBA, по умолчанию будет задан тип данных Variant. Данные с типом Variant имеют только одно заслуживающее внимания свойство: они изменяют свой тип в зависимости от того, какие операции над ними выполняются.
В следующей процедуре показано, каким образом переменная принимает разные ти пы данных.
Sub |
V a ria ntD e m o () |
||
|
MyVar |
= |
"123" |
|
MyVar |
= |
MyVar / 2 |
|
MyVar |
= |
"О твет: " & MyVar |
|
MsgBox MyVar |
||
End |
Sub |
|
|
В процедуре VariantDemo переменная MyVar вначале выступает строкой из трех символов. Затем эта “строка” делится на два и приобретает числовой тип данных. После этого MyVar присоединяется к строке, что вызывает обратное преобразование MyVar в строку. Оператор MsgBox отображает окончательное строковое значение: О твет: 61,5.
Чтобы проиллюстрировать проблемы, которые могут возникнуть при обработке типа данных Variant, рассмотрим следующую процедуру.
Sub V ariantD em o2()
MyVar = "123"
MyVar = MyVar + MyVar
MyVar = "О твет: " & MyVar
MsgBox MyVar
End Sub
При выполнении этой процедуры в окне сообщений появляется сообщение Ответ: 123123. Скорее всего, это не тот результат, которого вы ожидали. В процессе управле ния текстовыми данными, представленными типом Variant, оператор “+” выполняет конкатенацию строк.
Определение типа данных
Для определения типа данных переменной используется функция VBA TypeName. Ниже представлена модифицированная версия предыдущей процедуры. Эта процедура на каждом шаге отображает тип данных переменной MyVar. Вы увидите, что сначала
Глава 8. Основы программирования на VBA |
219 |
переменная является строкой, затем преобразуется в числовой тип D ouble и в заверше ние снова становится строкой.
Sub VariantDemo2 ()
MyVar = "123"
MsgBox ТурeName(MyVar)
MyVar = MyVar / 2
MsgBox TypeName(MyVar)
MyVar = "О твет: " & MyVar
MsgBox TypeName(MyVar)
MsgBox MyVar
End Sub
Благодаря VBA преобразование типов для необъявленных переменных выполняется автоматически. Этот процесс может показаться удачным выходом из создавшейся ситуа ции, однако помните, что при этом снижается скорость обработки данных, быстрее за полняется свободная память, а также повышается риск возникновения ошибок.
Объявлять каждую переменную в процедуре перед ее использованием — замечатель ная привычка. В процессе объявления переменной вы явно указываете ее название и тип данных. Объявление переменных дает два основных преимущества.
• Программы работают быстрее и используют память более эффективно. Тип данных по умолчанию V a ria n t резервирует больше памяти, чем необходимо, и вызывает многократную проверку данных, занимающую процессорное время. Если программа точно знает тип данных, она не выполняет дополнительную про верку данных и резервирует ровно столько памяти, сколько необходимо для хра нения конечных данных.
•Объявив переменные, можно избежать ошибок, связанных с неправильным введением имен переменных. Предполагается, что вы используете оператор Op tio n E x p lic it, делающий обязательным объявление всех переменных (см. сле дующий раздел). Предположим, что вы также в коде применяете необъявленную пе ременную с названием C u rren tR ate . Наряду с этим на определенном этапе про
цедуры вы обращаетесь к оператору C urentR ate = 0.75. Такая ошибка в названии переменной, которую тяжело выявить, скорее всего, будет причиной не правильных результатов.
Обязательное объявление всех переменных
Чтобы обеспечить обязательное объявление всех используемых переменных, необхо димо включить следующую строку в качестве первой инструкции в модуле VBА:
Option E x p lic it
Этот оператор отвечает за то, что программа будет приостанавливаться всякий раз при нахождении в ней необъявленной переменной. VBA выведет сообщение об ошибке (рис. 8.1); для продолжения процедуры следует объявить переменную.
0 примерах, приведенных в этой главе
Настоящая глава содержит ряд примеров кода VBA, обычно представленных в виде простых процедур. Все примеры призваны объяснять наиболее простым образом различные концепции программирования. По этой причине в большинстве случаев поставленные задачи выполняются неэффективно. Другими словами, не следует с точностью использовать эти примеры в своих проектах. В следующих главах книги приведенные примеры представляют действительную ценность.
Глава 8. Основы программирования на VBA |
221 |
выполнения процедуры переменная становится невостребованной, поэтому Excel осво бождает соответствующую область памяти. Если нужно сохранить значение переменной, объявите ее как S t a t i c (см. раздел “Переменные S t a t i c ”).
Наиболее популярный способ объявить локальную переменную — вставить оператор Dim между операторами Sub и End Sub. Операторы Dim обычно вводятся непосредст венно после оператора Sub, перед кодом процедуры.
Примечание
Если вас интересует происхождение ключевого слова Dim, то примите к сведению, что это сокращение от “Dimension” — “размерность” . В прежних версиях BASIC этот оператор использовался исключительно для объявления размерности массива. В VBA ключевое слово Dim применяется для объяв ления любой переменной, а не только массивов.
В представленной далее процедуре используется шесть локальных переменных, объ явленных с помощью операторов Dim.
Sub MySub () |
In te g e r |
|
|
||
Dim x As |
|
|
|||
Dim |
F ir s t |
As Long |
|
|
|
Dim |
In te re s tR a te |
As |
S in g le |
||
Dim TodaysDate |
As |
Date |
|||
Dim UserName As |
S trin g |
||||
Dim MyValue |
|
|
код процедуры] - |
||
1 - [Здесь |
указывается |
||||
End Sub |
|
|
|
|
|
Обратите внимание, что последний оператор Dim в этом примере объявляет не тип данных, а только саму переменную. В результате переменная приобретает тип V a ria n t.
Кроме того, можно объявить несколько переменных, воспользовавшись единствен ным оператором Dim.
Dim х As |
In te g e r, |
у As |
In te g e r, z As In te g e r |
Dim F ir s t |
As Long, |
L a s t |
As Double |
Предупреждение
В отличие от других языков программирования, в VBA нельзя объявить тип данных одновременно для группы переменных, разделив переменные запя тыми. Например, следующий оператор является корректным, хотя и не объ являет переменные как in te g e r:
Dim i , j , k As In te g e r
В VBA только k объявляется как in te g e r; остальные переменные объявля ются как V a ria n t. Для объявления переменных i, j и к в виде in te g e r ис пользуйте следующий оператор:
Dim i As In te g e r, j As In te g e r, к As In te g e r
Если переменная объявлена как локальная, другие процедуры в том же модуле могут использовать подобное имя, но каждый экземпляр переменной считается уникальным в своей процедуре.
Как правило, локальные переменные — самые эффективные, так как VBA освобож даетпамять, которую они используют, после окончания процедуры.
222 |
Часть III. Visual Basic for Applications |
Еще один способ указания типов данных для переменных
Как и в большинстве других версий BASIC, язык VBA позволяет присоединить сим вол к названию переменной, чтобы указать ее тип данных. Например, можно объявить переменную MyVar как целое число, добавив к ее названию символ %.
Dim MyVar%
Символы объявления типов данных представлены для большинства типов данных VBA. Отсутствующие в таблице типы данных не имеют собственного символа объявле ния типа.
Тип данных |
Символ объявления типа |
In te g e r |
% |
Long |
& |
S in g le |
i |
Double |
# |
Currency |
@ |
S trin g |
$ |
Этот метод типизации данных — пережиток старых версий BASIC; лучше объявлять переменные с помощью других методов, описанных в этой главе. Символы объявления типов перечислены здесь только потому, что вы можете встретиться с ними в старых программах.
Переменные уровня модуля
Иногда необходимо, чтобы переменная была доступна во всех процедурах модуля. В таком случае объявите переменную перед первой процедурой модуля (за пределами процедур или функций).
В приведенном ниже примере оператор D im — первая инструкция в модуле. Обе проце дуры, P ro c e d u re l и P ro ce d u re 2 , имеют доступ к переменной C u rre n tV a lu e .
Dim |
C u rre n tV a lu e as In te g e r |
|
||
Sub |
P ro c e d u re l() |
|
|
|
' |
- [З д е с ь |
в в о д и т с я |
к о д п ро ц едуры ] |
- |
End |
Sub |
|
|
|
Sub |
P ro ce d u re 2 () |
|
|
|
' |
- [З д е с ь |
в в о д и т с я |
к о д п ро ц едуры ] |
- |
End |
Sub |
|
|
|
Обычно значение переменной уровня модуля не изменяется к окончанию выполнения процедуры (по достижении оператора End Sub либо End F u n c tio n ) . Исключение из этого правила бывает в случае применения оператора End. Как только интерпретатор VBA выполняет оператор End, все переменные уровня модуля теряют свои значения.
Переменные P u b lic
Чтобы сделать переменную доступной во всех процедурах всех модулей VBA проек та, необходимо объявить переменную на уровне модуля (перед объявлением первой про цедуры) с помощью ключевого слова P u b lic , а не Dim.
P u b lic C u rre n tR a te as Long
Ключевое слово P u b lic делает переменную C u rre n tR a te доступной для любой процедуры проекта, даже для процедур, которые располагаются в других модулях проек та. Этот оператор следует вставить перед первой процедурой модуля. Более того, подоб
