Объявление переменных
Данные, используемые в процедурах, разделяются на два основных вида: константы и переменные. Для обозначения констант и переменных служит имя (идентификатор). Имя состоит из латинских букв, цифр или знаков, причем первый символ всегда буква.
Внимание:Нельзя использовать служебные слова и стандартные имена как идентификаторы.
Нельзя использовать пробелы и точки в качестве разделителей частей имен.
Символы объявления типа, например, "#" можно использовать только как последний символ имени (см. ниже таблицу суффиксов).
Строчные и прописные буквы в имени считаются равными.
Длина имени не может быть более 255 символов. Длина имен объектов не должна превышать 40 символов.
Не рекомендуется использовать в имени буквы русского языка, несмотря на то, что это допускается в локализованных версиях MS Office. Применение не латинских символов в идентификаторах может привести к проблемам с переносимостью приложения на другие компьютеры.
Константа - постоянное значение, используемое в программе. Константам можно присвоить имя и использовать их в качестве переменных, имеющих постоянные значения. Символьные константы заключаются в кавычки, а константы, представляющие даты, заключаются в символы решетка (#). Например, #1.12.2006#.
Прежде чем использовать константу в тексте модуля, ее обязательно следует объявить. Синтаксис объявления константы Const name=expression
Например, Const pi=3.14
В языке имеются встроенные константы, имена которых зарезервированы. Использование констант улучшает читабельность программы и уменьшает вероятность ошибок при использовании постоянных значений. Имена констант VB начинаются с vb, а константы Excel VBA начинаются с xl. Для просмотра полного перечня встроенных констант задайте поисковую строку Constants в Object Browser.
Переменная - это величина, которая хранится в памяти и значение которой может изменяться во время выполнения программы. Каждая переменная или константа имеет тип, соответствующий типу данных, сохраняемых в ней.
Важность объявления переменных
Перечислим основные аргументы в пользу объявления переменных.
Объявление переменных поможет избежать самого распространенного типа ошибок - ошибок, связанных с неправильным написанием имен переменных, например, вместо идентификатора wbkVar в команде может быть записано wkbVar.
Если переменная объявлена, Visual Basic проверяет, используется ли правильный тип данных в операциях с этой переменной.
Объявление переменных исключает преобразование значений переменных, которое происходит при вычислении выражений, из типа Variant в другой тип.
Использование переменных различных типов уменьшает память, занимаемую переменными, и сокращает время выполняемых вычислений, благодаря чему программы становятся более эффективными.
Объявление переменных позволяет создавать переменные, которые можно использовать в нескольких процедурах или модулях (модульные и глобальные переменные). Можно определять также переменные, сохраняющие свои значения после выхода из процедуры.
Чтобы избежать использования переменных без объявления, можно поместить в область Declarations каждого модуля инструкцию Option Explicit. Тогда при обращении к переменной, не объявленной ранее, возникнет сообщение об ошибке компиляции.
(рис 4.1) Ошибка компиляции - переменная неопределеннаЧтобы принудительно следовать стратегии объявления переменных, включите опцию Require Variable Declaration (Требовать описание переменных) в окне команды Tools-Options и тогда инструкция Option Explicit будет автоматически вставляться во все модули и процедурные листы проекта.
Типы данных
В VBA, как и в любом языке, используются данные различных типов: числовые, строковые, логические и т.п. - всего 11 элементарных типов. Допустимо использование данных пользовательского типа.
Типы данных
| Тип данных |
Размер в байтах |
Разрядность |
Диапазон значений |
| Boolean (логическое) |
2 |
5 |
True, False |
| Byte (байт) |
1 |
3 |
от 0 до 255 |
| Integer (целое) |
2 |
5 |
от -32768 до 32767 |
| Long (длинное целое) |
4 |
10 |
от -2147483648 до 2147483647 |
| Single (действительное, одинарная точность) |
4 |
7 |
от -3.402823E+38 до -1.401298E-45 и от 1.401298E-45 до 3.402823E+38 |
| Double (действительное, двойная точность) |
8 |
15 |
от -1.79769313486232E+308 до -4.94065645841247E-324 и от 4.94065645841247E-324 до 1.79769313486232E+308 |
| Currency (фиксированная точка) |
8 |
10 |
от -922337203685477.5808 до 922337203685477.5807 |
| Date (дата) |
8 |
от 01.01.100 до 31.12.9999 |
| String (символьная строка) |
10 байт + 1 байт на символ для строк переменной длины Длина строки для строк фиксированной длины
|
до 2^16 символов |
| Object (объект) |
4 |
Указатель на любой объект |
| Variant (любое значение) |
16 байт для числовых значений |
См. диапазон значений для Double |
| 22 байта плюс длина строки для символьных значений |
до 65400 символов |
| User-defined )data type (пользовательский тип данных) |
Размер определяется элементами |
Разрядность и диапазон каждого элемента, входящего в пользовательский тип, определяется типом данных элемента |
В языке VBA предусмотрено предварительное объявление переменных, участвующих в программе, но оно не является обязательным.
Важно:Переменная может принимать значения только одного типа, который указывается при ее описании или предполагается по умолчанию.
Тип переменной накладывает ограничения на ее возможные значения и определяет разрешенные операции.
Присвоение переменной значения, не соответствующего ее типу, вызывает преобразование значения или может привести к ошибке.
Для объявления переменных используются операторы Dim, Private, Public и Static.
Синтаксис оператора Dim:
Dim VariableName [As DataType]
VariableName - идентификатор переменной,
DataType - тип данных. Необязательный параметр. По умолчанию Variant.
Операторы Private, Public и Static имеют такой же синтаксис, что и оператор Dim. Их использование разбирается ниже.
Примеры
| Dim p As Integer Dim q As String
Dim r As Variant
|
Каждая переменная объявлена отдельным оператором на отдельной строке |
| Dim p As Integer, q As String, r As
Variant
|
Несколько объявлений переменных в одной строке. Разделитель - запятая
|
| Dim p, q, r As Integer
|
Только переменная r будет определена как целая, остальные будут иметь тип Variant |
VBA позволяет включать в имена переменных суффиксы, определяющие тип переменной. Например, Dim Name$ определяет переменную Name$ как стринговую.
В таблице справа представлены суффиксы и типы переменных, объявляемых с помощью добавления суффикса в конец идентификатора.
| Суффикс |
Тип |
| % |
Integer |
|
Long |
| ! |
Single |
| # |
Double |
| @ |
Currency |
| $ |
String |
Внимание:Операторы объявления переменных относятся к неисполняемым операторам, т.е. они содержат некоторую информацию для VB, не выполняя никаких действий.
Оператор объявления переменной может стоять в любом месте программы, но обязательно раньше использования определяемой переменной.
Объявление переменных в начале процедуры или модуля улучшает читабельность программы.
Локальные переменные (понятие вводится ниже) могут быть объявлены неявно (контекстуально). Обычно это происходит, если имя переменной присутствует слева в операторе присваивания или используется в качестве переменной цикла. Переменная, объявленная неявно, всегда имеет тип Variant.
Тип Variant
Переменная, которая используется без объявления, а также переменная, тип которой явно не задан, относится к типу Variant.
Тип Variant используется, если во время выполнения программы переменная может принимать значения любого типа, за исключением пользовательских типов данных.
Использование переменной типа Variant поглощает больше ресурсов компьютера, чем использование переменной элементарного типа.
Переменная типа Variant может содержать специальные значения: Empty, Null, Nothing или Error.
| Значение |
Описание |
| Empty |
Устанавливается при инициализации. В случае использования переменной как числа означает нуль, а в случае использования ее как символа - строку нулевой длины (пустую строку). Значение Empty может быть установлено специально, чтобы показать отсутствие значения.
|
| Null |
Специальное значение, которое применяется, чтобы показать, что переменная не содержит верных данных. Это значение устанавливается оператором присваивания или является результатом вычисления выражения, если один из операндов имеет значение Null. |
| Nothing |
Устанавливается при инициализации объектной переменной или оператором Set. Свидетельствует об отсутствии ссылки на объект (см. Раздел 6.Объекты MS Excel). |
| Error |
Специальное значение, устанавливаемое функцией CVErr. Позволяет программе выполнить альтернативное действие в ситуации ошибки (системные ошибки выполнения, например, ошибка деления на нуль, не имеются в виду). Подробно см. Help. |
Важно:Используйте функции IsEmpty, IsNull, IsError для сравнения значения переменной со специальными значениями.
При вычислении арифметических выражений переменные типа Variant, содержащие числовые значения, ведут себя обычным образом: переменные этого типа преобразуются в другой тип в сторону увеличения длины результата.
Если в арифметическом выражении участвует переменная типа Variant, содержащая символьное значение, то ее значение преобразуется в число, если это возможно. В противном случае числовые значения преобразуются в строки и, если выполняемая операция не операция сложения, то возникает ошибка.
Объектные переменные
Объектная переменная занимает четыре байта и хранит адрес, указывающий на объект. Обычно в программах используют объектную переменную при создании собственного объекта. Подробно см. раздел Использование объектных переменных.
Объявление переменных объектного типа ничем не отличается от объявления переменных других типов. Синтаксис объявления объектной переменной Dim varname As type, где type - тип объекта.
Возможен тип любого объекта VBA или ключевое слово Object. Например, Dim p As Object, Dim r as Range, Dim w As Workbook.
Оператор Set
Для работы с объектами требуется устанавливать значение объектной переменной. В отличие от переменных других типов установка значения объектной переменной выполняется при помощи оператора Set.
Синтаксис оператора:
Set objectvar = objectexpression|Nothing
objectvar - объектная переменная;
objectexpression - объектное выражение;
Nothing - ключевое слово, указывающее на отсутствие ссылки на объект.
Переменная может иметь тип любого объекта, определенного в языке VBA. В качестве объектного выражения можно использовать свойство, функцию или метод, возвращающие объект нужного типа.
Внимание:Оператор Set только устанавливает ссылку на объект, не создавая никакой копии.
Типы объектного выражения и объектной переменной должны совпадать.
Чтобы очистить объектную переменную, используйте значение Nothing в операторе присваивания, которое аннулирует ссылку на объект и освобождает ресурсы. Например: Set rng= Nothing.
Массивы
Переменные можно объединять в массивы. Массив - это совокупность переменных одного типа.
Преимущества:Вместо нескольких однотипных переменных используется одна переменная.
Можно применять групповую обработку элементов массива.
Каждый массив имеет имя - идентификатор. Переменные, входящие в массив, называются элементами массива. Любой элемент массива обозначается переменной с индексом, например, A(5). Другими словами отдельный элемент массива определяется своей позицией (индексом) в массиве. Можно сказать, что массив это именованная совокупность переменных одного типа, которые различаются значениями своих индексов.
С понятием массива связано понятие размерности. Чаще всего используются одномерные массивы (векторы или строки) и двумерные массива (матрицы). Максимальное количество измерений массива - 60.
Примеры массивов
Ежедневная утренняя и вечерняя температура воздуха в течение месяца представляется двумерным массивом из 31 строки и 2 столбцов, а эта же температура в течение года является уже трехмерным массивом 12x31x2.
Перечень десяти дисциплин по каждой из пяти специализаций представляется двумерным массивом из 5 строк и 10 столбцов.
Важно:Элементы массива имеют одинаковые характеристики (тип, размер и т.д.).
Элементы массива могут использоваться во всех конструкциях языка, в которых допускается использование обычных переменных.
Индекс элемента массива - это число (положительное, отрицательное или 0).
Количество индексов элемента массива должно соответствовать количеству измерений массива: первый индекс соответствует первому измерению, второй индекс - второму и т.д.
Для указания индекса можно использовать переменные или выражения. При этом значение выражения округляется до ближайшего целого числа.
Значение каждого индекса имеет нижнюю и верхнюю границу. Если специально не указано другое значение, нижней границей индекса массива является 0.
Инструкция Option Base 1, размещенная в области Declarations, устанавливает нижний индекс всех массивов в единицу.
Массив должен быть обязательно объявлен. Синтаксис объявления массива:
Dim varname(subscripts) As type
varname - имя массива;
subscripts - индексы измерений массива;
type - тип элемента массива.
Для каждого индекса измерения ( subscripts ) можно указать нижнюю и верхнюю границы (граничная пара) в виде lower to upper, где обе границы суть целые числа или выражения, результат вычисления которых есть число. Нижняя граница может быть опущена, тогда она предполагается нулевой, если инструкция Option Base не указывает на другое. Индексы каждого измерения отделяются друг от друга запятой. Например, объявление Dim A (1 To 5, 2 To 17) определяет двумерный массив A из пяти строк с индексами от 1 до 5 и 16 столбцов с индексами от 2 до 17, всего 80 элементов. Запись A(3,10) указывает на девятый элемент третьей строки.
Рекомендуется:предусматривать такие значения индексов, которые соответствовали бы максимально возможному количеству элементов массива в каждом измерении.
Пример
Создать массив, значение каждого элемента которого равно индексу элемента.
Одномерный массив A имеет восемь элементов с индексами от 0 до 7.
Оператор присваивания значения и оператор распечатки значения записаны на одной строке через двоеточие.
(рис 4.2) Оператор присваивания значения и оператор распечатки значенияДинамические массивы
Если в момент объявления массива неизвестен его размер или же в процессе выполнения программы требуется изменить размеры массива, то массив изначально необходимо объявить как динамический. При объявлении динамического массива не указывается его размерность, например, Dim A(). Далее в программе должны быть установлены размеры массива при помощи оператора Redim.
Синтаксис:
ReDim [Preserve] varname (subscripts) [As type]
Preserve - ключевое слово, позволяющее сохранить существующие элементы массива;
varname - идентификатор массива;
subscripts - индексы массива;
type - тип элементов массива.
Внимание:Можно изменить только верхнюю границу индекса массива, Попытка изменения нижней границы индекса приведет к ошибке.
При переопределении динамического массива без ключевого слова Preserve все ранее определенные элементы массива очищаются. Включение Preserve в оператор ReDim сохраняет существующие элементы массива, если размерность массива увеличивается. Если размерность массива уменьшается, то данные, находящиеся вне границ переопределенного массива теряются.
Если массив многомерный, то при переопределении массива может быть изменена только верхняя граница последнего измерения.
Ключевое слово Preserve не может использоваться для изменения количества измерений массива.
Не используйте оператор Redim для изменения типа элементов массива.
Для определения границ динамического массива используются функции Lbound (индекс нижней границы) и Ubound (индекс верхней границы).
Синтаксис:
Lbound (arrayname [,dimension])
Ubound (arrayname [,dimension])
arrayname - имя массива,
dimension - номер измерения массива.
Для рассмотренной выше процедуры оператор Debug.Print Lbound(A,1) распечатает значение 0, а оператор Debug.Print Ubound(A,1) распечатает значение 7.
Пример
В процедуре запрашивается ввод целого числа. Создается массив из четного числа элементов, содержащих четные значения, меньшие или равные введенному числу.
Введенное число нацело делится на два. Результат - количество четных чисел, меньших или равных веденному числу. Если результат является четным числом, количество элементов в переопределяемом массиве равно этому числу; если нечетным числом, то на единицу меньше результата деления.
Введено число 125. Результат выполнения процедуры приведен ниже.
(рис 4.3) Создается массив из четного числа элементов, содержащих четные значения, меньшие или равные введенному числуВ процедуре используется условный оператор If, который определяет размер массива b в зависимости от четности результата деления нацело введенного числа. Функция Ubound используется для определения количества элементов созданного массива.
Пользовательский тип
Можно определить данные, состоящие из нескольких логически связанных между собой элементов - структура данных ( User-Defined Data Type ). Каждый пользовательский тип описывается с помощью инструкции Type в области Declarations. Завершение определения пользовательского типа данных - инструкция End Type. Например:
Type sqn
sqn_zero As Integer
sqn_unity As Integer
End Type
Важно:Определяемые пользователем типы данных могут включать в себя один или несколько элементов любого типа данных, в том числе массивы и определенные пользователем типы данных.
Не допускается номеров строк и меток строк в блоке Type...End Type.
Можно создавать массивы типов данных, определяемых пользователем. При описании массива фиксированного размера с пользовательским типом данных нельзя использовать переменные для задания размерности массива.
Структура пользовательского типа данных может быть многоуровневой. Обращение к элементу структуры осуществляется при помощи составного имени для исключения неоднозначности. Полное составное имя включает в себя имена структуры и всех подструктур, в которые входит определяемый элемент. Имена подструктур должны следовать в порядке иерархии, т.е. в том же порядке, в котором они определены в структуре.
Для структур в целом применимы только операторы присваивания, элементы структур можно использовать в выражениях, соответствующих типу элемента.
Область видимости переменных
Все переменные обладают областью определения (областью видимости) и временем жизни. Область видимости переменной - это те процедуры, в которых переменная может быть использована, т.е. в которых доступно значение переменной.
Переменную можно объявить на уровне процедуры или на уровне модуля. Переменные, объявленные на уровне процедуры, доступны только внутри этой процедуры. Это локальные переменные ( Local ) и область их видимости - конкретная процедура. Вне этой процедуры значение переменной непредсказуемо и использование переменной приводит к ошибке выполнения программы.
Область видимости переменных
| Уровень объявления |
Оператор объявления |
Переменная |
Область видимости |
| Процедура |
Dim, Private |
Локальная |
Процедура |
| Уровень модуля |
Dim, Private |
Модульная |
Все процедуры модуля |
| Уровень модуля в стандартном модуле ( Module ) |
Public |
Глобальная |
Все процедуры проекта |
| Уровень модуля на процедурном листе формы или объекта MS Excel |
Public |
Модульная |
Все процедуры процедурного листа, в котором переменная объявлена |
Переменные, объявленные явно в области описаний ( Declaratives ) при помощи оператора Private или Dim, являются модульными и известны во всех процедурах того модуля или процедурного листа, в котором они объявлены. На модульном уровне не имеет значения, какой использован оператор, но предпочтительнее использовать Private, чтобы отличить объявление модульных переменных от объявления локальных переменных.
Переменные, объявленные явно в области описаний стандартного модуля при помощи оператора Public, являются глобальными. Их значения известны во всех процедурах проекта. Такие переменные называют открытыми или общими переменными.
Важно:Модульные и глобальные переменные должны быть описаны явно.
Локальные переменные с одинаковыми идентификаторами, определенные в разных процедурах, являются разными переменными и использование подобной переменной в разных процедурах в предположении, что это одна и та же переменная, приводит к ошибке выполнения программы.
Можно использовать одинаковые идентификаторы для объявления локальных, модульных и глобальных переменных. Если имена переменных конфликтуют, иными словами в процедуре определена локальная переменная, идентификатор которой совпадает с идентификатором модульной или глобальной переменной, то внутри процедуры используется локальная переменная.
Например, если определена переменная Temp на уровне процедуры и на модульном уровне, то внутри процедуры будет использоваться локальная переменная, а значение модульной переменной Temp не будет принято во внимание.
Пример
Процедура использует переменные, объявленные на разных уровнях, и демонстрирует изменение значений этих переменных.
В окне Watches представлены значения переменных PR_A, PR_B и PU_C, которые они имеют до оператора процедуры, на котором остановилось выполнение процедуры (оператор выделен желтым цветом).
(рис 4.4) Использование переменных, объявленных на разных уровнях, и демонстрация изменения значений этих переменныхВремя жизни переменных
Время жизни - это тот период, в течение которого значение переменной сохраняется. Обычные локальные переменные инициализируются при входе в процедуру или при первом присвоении, если переменная не объявлена. При выходе из процедуры память, отведенная локальной переменной, освобождается, и переменная теряет свое значение - Visual Basic "забывает" значения локальных переменных. При следующем обращении к процедуре локальная переменная снова инициализируется.
Объявление Static позволяет сохранить значение локальной переменной при выходе из процедуры, т.е. продлить время ее жизни. При первом входе в процедуру статическая переменная инициализируется и получает некоторое значение. При выходе из процедуры память, отведенная такой переменной, сохраняется, но становится временно недоступной. При повторном входе в процедуру статическая переменная имеет то же значение, которое было у нее перед выходом из процедуры.
Важно:Объявление Static может быть указано только для локальных переменных.
Если ключевое слово Static использовано при объявлении процедуры, то все локальные переменные процедуры статические. Это можно сделать при вставке новой процедуры(команда Insert-Procedure ), пометив опцию All Local variables as Static в диалоговом окне Add Procedure.
Модульные переменные сохраняют значения в течение времени выполнения программы, записанной в том стандартном модуле или на том процедурном листе, на котором они объявлены.
Глобальные переменные сохраняют свои значения в течение всего времени выполнения программы проекта.
Время жизни локальной переменной - процедура, в которой она объявлена.
Время жизни статической переменной - модуль, в котором определена процедура, объявившая эту переменную.
Инициализация переменных
При входе в процедуру локальные переменные (за исключением переменных объявленных как Static ) автоматически получают начальные значения. Начальные значения устанавливаются в соответствии с типом переменной. Переменные, объявленные на уровне модуля, инициализируются при первом входе в модуль, статические переменные - при первом входе в процедуру.
Значения, устанавливаемые при инициализации переменных
| Тип |
Начальное значение |
| Integer, Long, Single, Double |
0 |
| String (переменная длина) |
Пустая строка (кол-во символов 0) |
| String (фиксированная длина) |
Заполняется символами, имеющими ASCII -код 0, иными словами Chr(0) |
| Variant |
Empty |
| Object |
Nothing |
На практике для того, чтобы избежать неясностей,
Рекомендуется:явным образом инициализировать переменную, прежде чем использовать ее в выражении или в правой части оператора присваивания.
Объявление переменных
Данные, используемые в процедурах, разделяются на два основных вида: константы и переменные. Для обозначения констант и переменных служит имя (идентификатор). Имя состоит из латинских букв, цифр или знаков, причем первый символ всегда буква.
Внимание:Нельзя использовать служебные слова и стандартные имена как идентификаторы.
Нельзя использовать пробелы и точки в качестве разделителей частей имен.
Символы объявления типа, например, "#" можно использовать только как последний символ имени (см. ниже таблицу суффиксов).
Строчные и прописные буквы в имени считаются равными.
Длина имени не может быть более 255 символов. Длина имен объектов не должна превышать 40 символов.
Не рекомендуется использовать в имени буквы русского языка, несмотря на то, что это допускается в локализованных версиях MS Office. Применение не латинских символов в идентификаторах может привести к проблемам с переносимостью приложения на другие компьютеры.
Константа - постоянное значение, используемое в программе. Константам можно присвоить имя и использовать их в качестве переменных, имеющих постоянные значения. Символьные константы заключаются в кавычки, а константы, представляющие даты, заключаются в символы решетка (#). Например, #1.12.2006#.
Прежде чем использовать константу в тексте модуля, ее обязательно следует объявить. Синтаксис объявления константы Const name=expression
Например, Const pi=3.14
В языке имеются встроенные константы, имена которых зарезервированы. Использование констант улучшает читабельность программы и уменьшает вероятность ошибок при использовании постоянных значений. Имена констант VB начинаются с vb, а константы Excel VBA начинаются с xl. Для просмотра полного перечня встроенных констант задайте поисковую строку Constants в Object Browser.
Переменная - это величина, которая хранится в памяти и значение которой может изменяться во время выполнения программы. Каждая переменная или константа имеет тип, соответствующий типу данных, сохраняемых в ней.
Важность объявления переменных
Перечислим основные аргументы в пользу объявления переменных.
Объявление переменных поможет избежать самого распространенного типа ошибок - ошибок, связанных с неправильным написанием имен переменных, например, вместо идентификатора wbkVar в команде может быть записано wkbVar.
Если переменная объявлена, Visual Basic проверяет, используется ли правильный тип данных в операциях с этой переменной.
Объявление переменных исключает преобразование значений переменных, которое происходит при вычислении выражений, из типа Variant в другой тип.
Использование переменных различных типов уменьшает память, занимаемую переменными, и сокращает время выполняемых вычислений, благодаря чему программы становятся более эффективными.
Объявление переменных позволяет создавать переменные, которые можно использовать в нескольких процедурах или модулях (модульные и глобальные переменные). Можно определять также переменные, сохраняющие свои значения после выхода из процедуры.
Чтобы избежать использования переменных без объявления, можно поместить в область Declarations каждого модуля инструкцию Option Explicit. Тогда при обращении к переменной, не объявленной ранее, возникнет сообщение об ошибке компиляции.
(рис 4.1) Ошибка компиляции - переменная неопределеннаЧтобы принудительно следовать стратегии объявления переменных, включите опцию Require Variable Declaration (Требовать описание переменных) в окне команды Tools-Options и тогда инструкция Option Explicit будет автоматически вставляться во все модули и процедурные листы проекта.
Типы данных
В VBA, как и в любом языке, используются данные различных типов: числовые, строковые, логические и т.п. - всего 11 элементарных типов. Допустимо использование данных пользовательского типа.
Типы данных
| Тип данных |
Размер в байтах |
Разрядность |
Диапазон значений |
| Boolean (логическое) |
2 |
5 |
True, False |
| Byte (байт) |
1 |
3 |
от 0 до 255 |
| Integer (целое) |
2 |
5 |
от -32768 до 32767 |
| Long (длинное целое) |
4 |
10 |
от -2147483648 до 2147483647 |
| Single (действительное, одинарная точность) |
4 |
7 |
от -3.402823E+38 до -1.401298E-45 и от 1.401298E-45 до 3.402823E+38 |
| Double (действительное, двойная точность) |
8 |
15 |
от -1.79769313486232E+308 до -4.94065645841247E-324 и от 4.94065645841247E-324 до 1.79769313486232E+308 |
| Currency (фиксированная точка) |
8 |
10 |
от -922337203685477.5808 до 922337203685477.5807 |
| Date (дата) |
8 |
от 01.01.100 до 31.12.9999 |
| String (символьная строка) |
10 байт + 1 байт на символ для строк переменной длины Длина строки для строк фиксированной длины
|
до 2^16 символов |
| Object (объект) |
4 |
Указатель на любой объект |
| Variant (любое значение) |
16 байт для числовых значений |
См. диапазон значений для Double |
| 22 байта плюс длина строки для символьных значений |
до 65400 символов |
| User-defined )data type (пользовательский тип данных) |
Размер определяется элементами |
Разрядность и диапазон каждого элемента, входящего в пользовательский тип, определяется типом данных элемента |
В языке VBA предусмотрено предварительное объявление переменных, участвующих в программе, но оно не является обязательным.
Важно:Переменная может принимать значения только одного типа, который указывается при ее описании или предполагается по умолчанию.
Тип переменной накладывает ограничения на ее возможные значения и определяет разрешенные операции.
Присвоение переменной значения, не соответствующего ее типу, вызывает преобразование значения или может привести к ошибке.
Для объявления переменных используются операторы Dim, Private, Public и Static.
Синтаксис оператора Dim:
Dim VariableName [As DataType]
VariableName - идентификатор переменной,
DataType - тип данных. Необязательный параметр. По умолчанию Variant.
Операторы Private, Public и Static имеют такой же синтаксис, что и оператор Dim. Их использование разбирается ниже.
Примеры
| Dim p As Integer Dim q As String
Dim r As Variant
|
Каждая переменная объявлена отдельным оператором на отдельной строке |
| Dim p As Integer, q As String, r As
Variant
|
Несколько объявлений переменных в одной строке. Разделитель - запятая
|
| Dim p, q, r As Integer
|
Только переменная r будет определена как целая, остальные будут иметь тип Variant |
VBA позволяет включать в имена переменных суффиксы, определяющие тип переменной. Например, Dim Name$ определяет переменную Name$ как стринговую.
В таблице справа представлены суффиксы и типы переменных, объявляемых с помощью добавления суффикса в конец идентификатора.
| Суффикс |
Тип |
| % |
Integer |
|
Long |
| ! |
Single |
| # |
Double |
| @ |
Currency |
| $ |
String |
Внимание:Операторы объявления переменных относятся к неисполняемым операторам, т.е. они содержат некоторую информацию для VB, не выполняя никаких действий.
Оператор объявления переменной может стоять в любом месте программы, но обязательно раньше использования определяемой переменной.
Объявление переменных в начале процедуры или модуля улучшает читабельность программы.
Локальные переменные (понятие вводится ниже) могут быть объявлены неявно (контекстуально). Обычно это происходит, если имя переменной присутствует слева в операторе присваивания или используется в качестве переменной цикла. Переменная, объявленная неявно, всегда имеет тип Variant.
Тип Variant
Переменная, которая используется без объявления, а также переменная, тип которой явно не задан, относится к типу Variant.
Тип Variant используется, если во время выполнения программы переменная может принимать значения любого типа, за исключением пользовательских типов данных.
Использование переменной типа Variant поглощает больше ресурсов компьютера, чем использование переменной элементарного типа.
Переменная типа Variant может содержать специальные значения: Empty, Null, Nothing или Error.
| Значение |
Описание |
| Empty |
Устанавливается при инициализации. В случае использования переменной как числа означает нуль, а в случае использования ее как символа - строку нулевой длины (пустую строку). Значение Empty может быть установлено специально, чтобы показать отсутствие значения.
|
| Null |
Специальное значение, которое применяется, чтобы показать, что переменная не содержит верных данных. Это значение устанавливается оператором присваивания или является результатом вычисления выражения, если один из операндов имеет значение Null. |
| Nothing |
Устанавливается при инициализации объектной переменной или оператором Set. Свидетельствует об отсутствии ссылки на объект (см. Раздел 6.Объекты MS Excel). |
| Error |
Специальное значение, устанавливаемое функцией CVErr. Позволяет программе выполнить альтернативное действие в ситуации ошибки (системные ошибки выполнения, например, ошибка деления на нуль, не имеются в виду). Подробно см. Help. |
Важно:Используйте функции IsEmpty, IsNull, IsError для сравнения значения переменной со специальными значениями.
При вычислении арифметических выражений переменные типа Variant, содержащие числовые значения, ведут себя обычным образом: переменные этого типа преобразуются в другой тип в сторону увеличения длины результата.
Если в арифметическом выражении участвует переменная типа Variant, содержащая символьное значение, то ее значение преобразуется в число, если это возможно. В противном случае числовые значения преобразуются в строки и, если выполняемая операция не операция сложения, то возникает ошибка.
Объектные переменные
Объектная переменная занимает четыре байта и хранит адрес, указывающий на объект. Обычно в программах используют объектную переменную при создании собственного объекта. Подробно см. раздел Использование объектных переменных.
Объявление переменных объектного типа ничем не отличается от объявления переменных других типов. Синтаксис объявления объектной переменной Dim varname As type, где type - тип объекта.
Возможен тип любого объекта VBA или ключевое слово Object. Например, Dim p As Object, Dim r as Range, Dim w As Workbook.
Оператор Set
Для работы с объектами требуется устанавливать значение объектной переменной. В отличие от переменных других типов установка значения объектной переменной выполняется при помощи оператора Set.
Синтаксис оператора:
Set objectvar = objectexpression|Nothing
objectvar - объектная переменная;
objectexpression - объектное выражение;
Nothing - ключевое слово, указывающее на отсутствие ссылки на объект.
Переменная может иметь тип любого объекта, определенного в языке VBA. В качестве объектного выражения можно использовать свойство, функцию или метод, возвращающие объект нужного типа.
Внимание:Оператор Set только устанавливает ссылку на объект, не создавая никакой копии.
Типы объектного выражения и объектной переменной должны совпадать.
Чтобы очистить объектную переменную, используйте значение Nothing в операторе присваивания, которое аннулирует ссылку на объект и освобождает ресурсы. Например: Set rng= Nothing.
Массивы
Переменные можно объединять в массивы. Массив - это совокупность переменных одного типа.
Преимущества:Вместо нескольких однотипных переменных используется одна переменная.
Можно применять групповую обработку элементов массива.
Каждый массив имеет имя - идентификатор. Переменные, входящие в массив, называются элементами массива. Любой элемент массива обозначается переменной с индексом, например, A(5). Другими словами отдельный элемент массива определяется своей позицией (индексом) в массиве. Можно сказать, что массив это именованная совокупность переменных одного типа, которые различаются значениями своих индексов.
С понятием массива связано понятие размерности. Чаще всего используются одномерные массивы (векторы или строки) и двумерные массива (матрицы). Максимальное количество измерений массива - 60.
Примеры массивов
Ежедневная утренняя и вечерняя температура воздуха в течение месяца представляется двумерным массивом из 31 строки и 2 столбцов, а эта же температура в течение года является уже трехмерным массивом 12x31x2.
Перечень десяти дисциплин по каждой из пяти специализаций представляется двумерным массивом из 5 строк и 10 столбцов.
Важно:Элементы массива имеют одинаковые характеристики (тип, размер и т.д.).
Элементы массива могут использоваться во всех конструкциях языка, в которых допускается использование обычных переменных.
Индекс элемента массива - это число (положительное, отрицательное или 0).
Количество индексов элемента массива должно соответствовать количеству измерений массива: первый индекс соответствует первому измерению, второй индекс - второму и т.д.
Для указания индекса можно использовать переменные или выражения. При этом значение выражения округляется до ближайшего целого числа.
Значение каждого индекса имеет нижнюю и верхнюю границу. Если специально не указано другое значение, нижней границей индекса массива является 0.
Инструкция Option Base 1, размещенная в области Declarations, устанавливает нижний индекс всех массивов в единицу.
Массив должен быть обязательно объявлен. Синтаксис объявления массива:
Dim varname(subscripts) As type
varname - имя массива;
subscripts - индексы измерений массива;
type - тип элемента массива.
Для каждого индекса измерения ( subscripts ) можно указать нижнюю и верхнюю границы (граничная пара) в виде lower to upper, где обе границы суть целые числа или выражения, результат вычисления которых есть число. Нижняя граница может быть опущена, тогда она предполагается нулевой, если инструкция Option Base не указывает на другое. Индексы каждого измерения отделяются друг от друга запятой. Например, объявление Dim A (1 To 5, 2 To 17) определяет двумерный массив A из пяти строк с индексами от 1 до 5 и 16 столбцов с индексами от 2 до 17, всего 80 элементов. Запись A(3,10) указывает на девятый элемент третьей строки.
Рекомендуется:предусматривать такие значения индексов, которые соответствовали бы максимально возможному количеству элементов массива в каждом измерении.
Пример
Создать массив, значение каждого элемента которого равно индексу элемента.
Одномерный массив A имеет восемь элементов с индексами от 0 до 7.
Оператор присваивания значения и оператор распечатки значения записаны на одной строке через двоеточие.
(рис 4.2) Оператор присваивания значения и оператор распечатки значенияДинамические массивы
Если в момент объявления массива неизвестен его размер или же в процессе выполнения программы требуется изменить размеры массива, то массив изначально необходимо объявить как динамический. При объявлении динамического массива не указывается его размерность, например, Dim A(). Далее в программе должны быть установлены размеры массива при помощи оператора Redim.
Синтаксис:
ReDim [Preserve] varname (subscripts) [As type]
Preserve - ключевое слово, позволяющее сохранить существующие элементы массива;
varname - идентификатор массива;
subscripts - индексы массива;
type - тип элементов массива.
Внимание:Можно изменить только верхнюю границу индекса массива, Попытка изменения нижней границы индекса приведет к ошибке.
При переопределении динамического массива без ключевого слова Preserve все ранее определенные элементы массива очищаются. Включение Preserve в оператор ReDim сохраняет существующие элементы массива, если размерность массива увеличивается. Если размерность массива уменьшается, то данные, находящиеся вне границ переопределенного массива теряются.
Если массив многомерный, то при переопределении массива может быть изменена только верхняя граница последнего измерения.
Ключевое слово Preserve не может использоваться для изменения количества измерений массива.
Не используйте оператор Redim для изменения типа элементов массива.
Для определения границ динамического массива используются функции Lbound (индекс нижней границы) и Ubound (индекс верхней границы).
Синтаксис:
Lbound (arrayname [,dimension])
Ubound (arrayname [,dimension])
arrayname - имя массива,
dimension - номер измерения массива.
Для рассмотренной выше процедуры оператор Debug.Print Lbound(A,1) распечатает значение 0, а оператор Debug.Print Ubound(A,1) распечатает значение 7.
Пример
В процедуре запрашивается ввод целого числа. Создается массив из четного числа элементов, содержащих четные значения, меньшие или равные введенному числу.
Введенное число нацело делится на два. Результат - количество четных чисел, меньших или равных веденному числу. Если результат является четным числом, количество элементов в переопределяемом массиве равно этому числу; если нечетным числом, то на единицу меньше результата деления.
Введено число 125. Результат выполнения процедуры приведен ниже.
(рис 4.3) Создается массив из четного числа элементов, содержащих четные значения, меньшие или равные введенному числуВ процедуре используется условный оператор If, который определяет размер массива b в зависимости от четности результата деления нацело введенного числа. Функция Ubound используется для определения количества элементов созданного массива.
Пользовательский тип
Можно определить данные, состоящие из нескольких логически связанных между собой элементов - структура данных ( User-Defined Data Type ). Каждый пользовательский тип описывается с помощью инструкции Type в области Declarations. Завершение определения пользовательского типа данных - инструкция End Type. Например:
Type sqn
sqn_zero As Integer
sqn_unity As Integer
End Type
Важно:Определяемые пользователем типы данных могут включать в себя один или несколько элементов любого типа данных, в том числе массивы и определенные пользователем типы данных.
Не допускается номеров строк и меток строк в блоке Type...End Type.
Можно создавать массивы типов данных, определяемых пользователем. При описании массива фиксированного размера с пользовательским типом данных нельзя использовать переменные для задания размерности массива.
Структура пользовательского типа данных может быть многоуровневой. Обращение к элементу структуры осуществляется при помощи составного имени для исключения неоднозначности. Полное составное имя включает в себя имена структуры и всех подструктур, в которые входит определяемый элемент. Имена подструктур должны следовать в порядке иерархии, т.е. в том же порядке, в котором они определены в структуре.
Для структур в целом применимы только операторы присваивания, элементы структур можно использовать в выражениях, соответствующих типу элемента.
Область видимости переменных
Все переменные обладают областью определения (областью видимости) и временем жизни. Область видимости переменной - это те процедуры, в которых переменная может быть использована, т.е. в которых доступно значение переменной.
Переменную можно объявить на уровне процедуры или на уровне модуля. Переменные, объявленные на уровне процедуры, доступны только внутри этой процедуры. Это локальные переменные ( Local ) и область их видимости - конкретная процедура. Вне этой процедуры значение переменной непредсказуемо и использование переменной приводит к ошибке выполнения программы.
Область видимости переменных
| Уровень объявления |
Оператор объявления |
Переменная |
Область видимости |
| Процедура |
Dim, Private |
Локальная |
Процедура |
| Уровень модуля |
Dim, Private |
Модульная |
Все процедуры модуля |
| Уровень модуля в стандартном модуле ( Module ) |
Public |
Глобальная |
Все процедуры проекта |
| Уровень модуля на процедурном листе формы или объекта MS Excel |
Public |
Модульная |
Все процедуры процедурного листа, в котором переменная объявлена |
Переменные, объявленные явно в области описаний ( Declaratives ) при помощи оператора Private или Dim, являются модульными и известны во всех процедурах того модуля или процедурного листа, в котором они объявлены. На модульном уровне не имеет значения, какой использован оператор, но предпочтительнее использовать Private, чтобы отличить объявление модульных переменных от объявления локальных переменных.
Переменные, объявленные явно в области описаний стандартного модуля при помощи оператора Public, являются глобальными. Их значения известны во всех процедурах проекта. Такие переменные называют открытыми или общими переменными.
Важно:Модульные и глобальные переменные должны быть описаны явно.
Локальные переменные с одинаковыми идентификаторами, определенные в разных процедурах, являются разными переменными и использование подобной переменной в разных процедурах в предположении, что это одна и та же переменная, приводит к ошибке выполнения программы.
Можно использовать одинаковые идентификаторы для объявления локальных, модульных и глобальных переменных. Если имена переменных конфликтуют, иными словами в процедуре определена локальная переменная, идентификатор которой совпадает с идентификатором модульной или глобальной переменной, то внутри процедуры используется локальная переменная.
Например, если определена переменная Temp на уровне процедуры и на модульном уровне, то внутри процедуры будет использоваться локальная переменная, а значение модульной переменной Temp не будет принято во внимание.
Пример
Процедура использует переменные, объявленные на разных уровнях, и демонстрирует изменение значений этих переменных.
В окне Watches представлены значения переменных PR_A, PR_B и PU_C, которые они имеют до оператора процедуры, на котором остановилось выполнение процедуры (оператор выделен желтым цветом).
(рис 4.4) Использование переменных, объявленных на разных уровнях, и демонстрация изменения значений этих переменныхВремя жизни переменных
Время жизни - это тот период, в течение которого значение переменной сохраняется. Обычные локальные переменные инициализируются при входе в процедуру или при первом присвоении, если переменная не объявлена. При выходе из процедуры память, отведенная локальной переменной, освобождается, и переменная теряет свое значение - Visual Basic "забывает" значения локальных переменных. При следующем обращении к процедуре локальная переменная снова инициализируется.
Объявление Static позволяет сохранить значение локальной переменной при выходе из процедуры, т.е. продлить время ее жизни. При первом входе в процедуру статическая переменная инициализируется и получает некоторое значение. При выходе из процедуры память, отведенная такой переменной, сохраняется, но становится временно недоступной. При повторном входе в процедуру статическая переменная имеет то же значение, которое было у нее перед выходом из процедуры.
Важно:Объявление Static может быть указано только для локальных переменных.
Если ключевое слово Static использовано при объявлении процедуры, то все локальные переменные процедуры статические. Это можно сделать при вставке новой процедуры(команда Insert-Procedure ), пометив опцию All Local variables as Static в диалоговом окне Add Procedure.
Модульные переменные сохраняют значения в течение времени выполнения программы, записанной в том стандартном модуле или на том процедурном листе, на котором они объявлены.
Глобальные переменные сохраняют свои значения в течение всего времени выполнения программы проекта.
Время жизни локальной переменной - процедура, в которой она объявлена.
Время жизни статической переменной - модуль, в котором определена процедура, объявившая эту переменную.
Инициализация переменных
При входе в процедуру локальные переменные (за исключением переменных объявленных как Static ) автоматически получают начальные значения. Начальные значения устанавливаются в соответствии с типом переменной. Переменные, объявленные на уровне модуля, инициализируются при первом входе в модуль, статические переменные - при первом входе в процедуру.
Значения, устанавливаемые при инициализации переменных
| Тип |
Начальное значение |
| Integer, Long, Single, Double |
0 |
| String (переменная длина) |
Пустая строка (кол-во символов 0) |
| String (фиксированная длина) |
Заполняется символами, имеющими ASCII -код 0, иными словами Chr(0) |
| Variant |
Empty |
| Object |
Nothing |
На практике для того, чтобы избежать неясностей,
Рекомендуется:явным образом инициализировать переменную, прежде чем использовать ее в выражении или в правой части оператора присваивания.