Читать книгу Excel. Трюки и эффекты - Александр Чиртик, Алексей Гладкий - Страница 8
Глава 1
Краткое руководство по VBA
Переменные
ОглавлениеВ данном разделе читатель ознакомится с основными особенностями использования переменных при написании программ на языке VBA.
Встроенные типы данных
VBA располагает множеством встроенных типов данных. Условно эти типы можно разделить на численные типы, строки, ссылки, типы для хранения даты и времени, объектные ссылки, массивы и особый тип для хранения значения любого типа, именуемый Variant.
Численные типы данных
Основные характеристики численных типов VBA приведены в табл. 1.2.
Таблица 1.2. Численные типы данных VBA
Примечание
Численный тип Decimal как самостоятельный тип на сегодняшний день не поддерживается. Однако его можно использовать в пределах типа Variant (о типе Variant будет рассказано далее).
Строки
Для хранения символьных данных в VBA реализована поддержка типа данных String (строка). В переменных этого типа могут храниться отдельные символы и большие фрагменты текста. Строки в VB А бывают двух видов: фиксированной и переменной длины. Разница между этими двумя типами строк понятна из их названий.
Строки фиксированной длины применяются, когда длина текста, который хранится в них, постоянна или не может превышать известный предел (например, для хранения отдельных символов). Строки фиксированной длины в ряде случаев обрабатываются быстрее строк переменной длины. Максимальный размер строки фиксированной длины – около 65 400 символов.
Строки переменной длины являются более гибким инструментом обработки текста в программах на VBA. Длина этих строк может динамически изменяться в зависимости от длины хранимого в них текста. Максимальная длина таких строк – около 2 млрд символов.
Дата и время
Для удобства работы со значениями даты и времени в VBA введен тип данных Date. Он позволяет задавать значения времени и даты в формате, удобном для восприятия, а также упрощает вычисления с временными интервалами. Этот тип данных, естественно, используется и в таблицах Excel.
Нужно заметить, что тип Date не является внутренним типом, используемым VBA для хранения даты и времени. Вместо него применяется тип Single (число с плавающей точкой). Целая часть этого числа – количество суток, прошедших с 30 декабря 1899 года, дробная – прошедшая часть текущих суток.
Тип данных Variant
В VBA предусмотрен один универсальный тип данных – Variant. Переменная этого типа может хранить значение любого поддерживаемого VBA типа (в том числе и ссылки на объекты, о которых будет рассказано ниже).
Однако при обработке переменных типа Variant тратится дополнительное время на определение и преобразование типа данных в этих переменных – самый универсальный тип данных VBA оказывается и самым медленным. Поэтому следует избегать слишком частого и неоправданного использования переменных этого типа (например, в качестве целочисленных итераторов, счетчиков и т. д.).
Когда переменная типа Variant пуста (ей не присвоено никакого значения), она заполняется специальным значением Empty.
Ссылки. Тип данных Object
Важно понимать, что в VBA переменные, предоставляющие доступ к объектам, являются только ссылками на эти объекты. В данном языке программирования невозможно получить сам объект (его двоичный код). Все операции по созданию, удалению объектов и манипулированию ими, осуществляются только с использованием ссылок.
Объекты, доступные из VBA, существуют, пока на них установлена хотя бы одна ссылка. Первая ссылка на объект устанавливается при его создании. В процессе работы можно как устанавливать новые ссылки на объект, так и удалять их с использованием специальной инструкции Set. Пусть objRef – ссылка на некоторый объект. Тогда операция установления новой ссылки будет иметь такой вид:
Set objNewRef = objRef
Теперь objNewRef ссылается на тот же объект, что и objRef. Операция же удаления ссылок будет выглядеть следующим образом:
Set objRef = Nothing
Set objNewRef = Nothing
Если на объект не было других ссылок, кроме этих, то он будет удален.
Для доступа к объектам в VBA предусмотрен тип данных Object. Он является универсальным, так как может быть ссылкой на объект любого типа.
Объявление переменных
Для объявления переменных элементарных типов (не массивов) в блоке объявлений модуля используется следующая инструкция:
Public | Private [WithEvents] Имя_переменной [As [New] Имя_-
типа] _
[, Имя_переменной [As [New] Имя_типа]]…
Ключевые слова, записанные до первых квадратных скобок, задают область видимости переменных:
• Public – позволяет объявлять глобальные переменные и общие переменные-члены класса (о классах будет рассказано позже);
• Private – позволяет объявлять переменные, доступные только в одном модуле, и частные переменные-члены класса.
Для объявления переменных элементарных типов (не массивов) в процедурах или функциях используется такая инструкция (локальных переменных):
Dim | Static [WithEvents] Имя_переменной [As [New] Имя_типа] _
[, Имя_переменной [As [New] Имя_типа]]…
Ключевые слова, записанные до первых квадратных скобок, задают время жизни переменных:
• Dim – используется для объявления локальных переменных, которые уничтожаются после выхода из процедуры;
• Static – используется для объявления локальных переменных, значения которых сохраняются между вызовами процедуры или функции.
Ключевое слово WithEvents используется для объявления переменной-обработчика событий объекта.
Имя_переменной – это идентификатор объявляемой переменной.
Имя_типа – название типа данных объявляемой переменной.
Если конструкция [As [New] Имя_типа] не используется, то типом объявляемой переменной автоматически становится тип Variant.
Если используется ключевое слово New, то создается новый объект. New нельзя использовать совместно с WithEvents, а также при объявлении переменной типа Object и если тип Имя_типа не является объектным.
Ниже приведены примеры объявления переменных на VBA:
Public intData As Integer
Private intCount As Integer, varData
Dim strText As String
Static a, b, c
Dim objRef As Object
Dim objCtrl As New Control
Внимание!
При объявлении в одной строке нескольких переменных слово As относится только к переменной, непосредственно после идентификатора которой оно следует. Например, при объявлении Dim а, Ь, с As Integer переменные а и b будут иметь тип Variant, а переменная с – тип Integer.
Инициализация переменных
После того как переменная объявлена, VBA производит ее инициализацию указанным ниже образом.
• Переменным численных типов автоматически присваивается нулевое значение.
• Строки переменной длины после объявления являются пустыми (с нулевой длиной). Строки фиксированной длины заполняются нулевыми символами.
• Данные типа Date инициализируются значением 00:00:00 30.12.1899 (это равняется нулю при представлении даты в численном формате, о котором было рассказано выше).
• Все переменные типа Object и подобные (то есть ссылки на объекты определенного типа) принимают значение Nothing, если при их объявлении не создан новый объект (не использовалось New).
Явное и неявное объявление переменных
Рассмотренное выше объявление переменных называется явным.
VBA также поддерживает неявное объявление переменных. Под неявным объявлением подразумевается возможность использования переменной без ее объявления посредством инструкции Dim, Static, Private или Public. При первом обращении к такой переменной для нее автоматически выделяется память и происходит ее инициализация. Следует отметить, что все неявно объявленные переменные имеют тип Variant.
Использование неявного объявления переменных может как упростить написание программ, так и значительно усложнить процесс их отладки.
К примеру, можно очень долго разбираться, почему же после вычисления такого выражения, как dblSalaryAccount = dblSalaryAcount * 10. 5, значение переменной dblSararyAccount стало равным нулю, если до этого оно было равно 5.37 5. Все дело в небольшой ошибке в названии идентификатора переменной, в результате которой создается новая переменная dblSalaryAcount, которая инициализируется нулевым значением. В случае использования явного объявления переменных подобных ошибок в программе быть не может, потому что каждый раз при обнаружении необъявленного идентификатора VBA выдает ошибку.
Для включения требования обязательного объявления переменных используется директива Option Explicit. Чтобы данная директива добавлялась в каждый новый модуль автоматически, нужно с помощью меню Tools → Options (Сервис → Параметры) редактора VBA открыть диалоговое окно Options (Параметры) и на вкладке Editor (Редактор) установить флажок Require Variable Declaration (Явное описание переменных).