
13. Приложение 2 Переменные
Любая программа (макрос, процедура, функция) создает и использует переменные. Большинство ошибок в программе – неправильная работа с переменными. Приведем основные правила работы с переменными и укажем распространенные причины ошибок.
Переменная – это именованная область памяти, предназначенная для хранения данных. Таким образом, для доступа к содержимому памяти достаточно знать имя переменной. Тип данных задает определенный формат или размер содержимого переменной.
В VBA существуют общие правила для написания имен: переменных, функций, процедур и так далее.
Имя должно начинаться с буквы и может содержать до 254 символов: буквы, цифры и знаки препинания.
В имени нельзя использовать специальные символы: #, $, %, &, !, /, \
В имени нельзя использовать пробелы и точки, вместо них принято ставить знак подчеркивания _.
VBA не различает регистры. Но в сложном имени принято каждое слово начинать с большой буквы: UserName.
Явное объявление переменной
Оператор явного объявления переменной может находиться в любом месте программы до первого использования переменной. Синтаксис:
Dim <имя переменной> As <тип переменной>
В отличие от других языков программирования, в VBA нельзя объявить тип данных одновременно для группы переменных, разделив переменные запятыми. Например, следующий оператор является корректным, однако он не объявляет все переменные как Integer.
Dim i, j, k As Integer
Здесь только k объявляется как Integer, другие же переменные получают тип Variant (изменяющийся), то есть типы переменных i, j будут зависеть от использования переменных, и могут меняться в разных операторах. Часто это приводит к ошибкам в программе на этапе исполнения, которые очень трудно искать.
Если для программы установлено требование явного описания типов всех переменных (оператор Option Explicit в начале модуля), то при использовании переменной j типа Variant в другой программе, где она в списке аргументов описана другим типом, например, j As Integer, на этапе компиляции возникает ошибка:
То есть обнаружено смешение (mismatch), несоответствие типов для аргумента, переданного в программу по ссылке (ByRef), то есть по адресу переменной в оперативной памяти. Нажатие клавиши <OK> открывает тот модуль и то место в программе, где темным фоном выделена конфликтная переменная. Заголовок программы будет выделен желтым фоном.
Для исправления ошибки нужно все переменные объявить как Integer, например, следующим оператором:
Dim i As Integer, j As Integer, k As Integer
После исправления ошибки нужно выполнить команду меню Run/Reset, желтый фон исчезнет, и можно будет снова запустить программу.
Типы переменных
VBA поддерживает различные типы переменных, к которым можно добавлять пользовательские типы, комбинации стандартных типов переменных. Приведем список основных типов переменных.
Тип данных |
Длина в байтах, тип |
Диапазон значений |
Byte |
1 короткое целое |
от 0 до 255 |
Boolean |
2 логическое |
True =1 или False =0 |
Integer |
2 целое |
от -32768 до +32767 |
Long |
4 длинное целое |
от –2147483648 до +2147483647 |
Single |
4 число с плавающей точкой |
от –3,4×1038 до –1,4×10-45 от +1,4×10-45 до +3,4×1038 7-8 значащих цифр |
Double |
8 число с плавающей точкой двойной точности, в ячейках листа Excel |
от –1,8×10308 до –4,9×10-324 от +4,9×10-324 до +1,8×10308 15 значащих цифр |
Currency |
8 число с фиксированной точкой, денежная единица |
от –922’337’203’685’477,5808 до +922’337’203’685’477,5807 |
Decimal |
14 десятичное число, только внутри переменной Variant |
28 цифр в числе, все до запятой или все после запятой |
Date |
8 Дата/Время |
1.01.100 – 31.12.9999 Dim dtVar As Date DtVar=#1/21/04# ′станд. USA |
Object |
4 байта |
Любая ссылка на объект |
String (перем.длина) |
10 байт + длина строки (1 байт на символ) |
От 0 до 2147483647 байт Dim St As String St=”Привет!” |
String*длина (фикс.длина) |
длина строки (1 байт на символ) |
Dim St As String*20 St=”Привет!” |
Variant |
16 любой тип данных |
любое числ. значение в рамках диапазона типа Double |
Variant (символы) |
22 байта + длина строки (1 байт на символ) |
любое числ. значение в рамках диапазона типа Double |
Usertype |
Пользовательский тип данных |
|