Типы данных относятся к самым фундаментальным понятиям любого языка программирования. Тип
данных определяет множество допустимых значений, которое может принимать указанная
переменная.
В VBA имеются следующие основные типы данных:
Тип данных |
Размер (байт) |
Диапазон
значений |
||
Byte (байт) |
1 |
От 0 до 255 |
||
Boolean (логический) |
2 |
True или False |
||
Integer (целое
число) |
2 |
От -32 768 до
32 767 |
||
Long (длинное
целое число) |
4 |
От -2 1 47 483
648 до 2 1 47 483 647 |
||
single (число
с плавающей запятой обычной точности) |
4 |
От -3.402823Е38
до ‑1.401298Е-45 для отрицательных значений; |
||
Double (число
с плавающей запятой двойной точности) |
8 |
От -1 ,7976931
3486232Е308 до -4.94065645841
247Е-324 для отрицательных значений; от 4.94065645841
247Е-324 до 1.79769313486232Е308
для положительных значений |
||
Currency (денежный) |
8 |
От -922 337 203685477.5808 до 922337203685477.5807 |
||
Тип данных |
Размер (байт) |
Диапазон
значений |
Decimal (масштабируемое
целое число) |
14 |
+/-792281 6251
4264337593543950335 с 28 знаками справа от запятой; минимальное ненулевое
значение имеет вид +/-0,0000000000000000000000000001 |
Date (даты и
время) |
8 |
От 1 января
100 г. до 31 декабря 9999 г. |
Ob j ect (объект) |
4 |
Любой указатель
объекта |
string (строка
переменной длины) |
10 + длина строки |
От 0 до приблизительно
2 миллиардов |
string (строка
постоянной длины) |
Длина строки |
От 1 до приблизительно
65 400 |
Variant (числовые
подтипы) |
16 |
Любое числовое
значение вплоть до границ диапазона для типа Double |
Variant (строковые
подтипы) |
22 + длина строки |
Как для строки
(string) переменной длины |
Тип данных,
определяемый пользователем (с помощью ключевого слова Туре) |
Объем определяется
элементами |
Диапазон каждого
элемента определяется его типом данных |
Описание
типа каждой переменной делает программу надежнее и, кроме того, убыстряет ее
работу, т. к. VBA не требуется тратить время на распознавание типа неописанной
переменной при каждом обращении к ней.
Синтаксис:
Dim [WithEvents]
ИмяПеременной[([Индексы])] [As [New] Тип]
[,[WithEvents]
ИмяПеременной[([Индексы])] [As [New] Тип]] . . .
Аргументы:
WithEvents |
Ключевое слово,
указывающее, что аргумент имяперемен-ной является именем объектной
переменной, которая используется при отклике на события, генерируемые
объектом ActiveX (т. е. объектом, который может быть открыт для других
приложений и средств программирования) |
||
ИмяПеременной |
Имя переменной,
удовлетворяющее стандартным правилам именования переменных |
||
Индексы |
Размерности
переменной массива; допускается описание до 60 размерностей. Для задания
аргумента индексы используется следующий синтаксис: [Нижний То]
Верхний [, [Нижний То] Верхний] ... Если нижний
индекс не задан явно, нижняя граница массива определяется инструкцией
option Base. Если отсутствует инструкция option Base, нижняя граница
массива равняется нулю |
||
New |
Ключевое слово,
включающее возможность неявного создания объекта. Если указано ключевое
слово New при описании объектной переменной, новый экземпляр объекта
создается при первой ссылке на него, поэтому нет необходимости присваивать
ссылку на объект с помощью инструкции Set |
||
Тип |
Тип данных переменной.
Для каждой описываемой переменной следует использовать отдельное предложение
As Тип |
||
Переменные,
описанные с помощью ключевого слова Dim на уровне модуля, доступны для всех
процедур в данном модуле. Переменные, описанные на уровне процедуры, доступны
только в данной процедуре.
Инструкция
Dim предназначена для описания типа данных переменной на уровне модуля или процедуры.
Например, следующая инструкция описывает переменную с типом integer.
Dim N As Integer
Инструкция
Dim предназначена также для описания объектного типа переменных. Далее приводится
описание переменной для нового экземпляра рабочего листа.
Dim X
As New Worksheet
Если при
описании объектной переменной не используется ключевое слово New, то для использования
объекта, на который ссылается переменная, существующий объект должен быть присвоен
переменной с помощью инструкции Set.
Если тип
данных или тип объекта не задан, и в модуле отсутствует инструкция DefTnn, по
умолчанию переменная получает тип variant. Для обязательного описания всех переменных
надо поместить в начале модуля инструкцию option Explicit. Использование этой
инструкции полезно при отладке программ, т. к. она позволяет легче отслеживать
возможную путаницу в именах при наборе программы.
В VBA пользователь
определяет имена переменных, функций, процедур, типов, постоянных и других объектов.
Вводимые пользователем имена должны отражать суть обозначаемого объекта так,
чтобы делать программу легко читаемой. В VBA имеются следующие ограничения на
имена:
Хотя регистр
букв (верхний или нижний) в имени не имеет значения, умелое использование его
может существенно облегчить понимание содержательной стороны переменной. Например,
вместо плоских и невыразительных имен
процентная
ставка х_начзнач
предпочтительнее
использовать следующие имена, которые легче воспринимаются, благодаря выделению
некоторых символов, входящих в них, разумным использованием верхнего регистра
ПроцентнаяСтавка
х_НачЗнач
Инструкция
DefTиn (вместо тип в имени инструкции фигурируют буквы, обозначающие
конкретный тип данных) используется на уровне модуля для задания типа данных
по умолчанию для переменных, аргументов, передаваемых в процедуры, и значений,
возвращаемых процедурами Function и Property Get, имена которых начинаются с
соответствующих символов.
Синтаксис:
DefBool ДиапазонБукв
[ , ДиапазонБукв] ... |
Тип данных Boolean |
||
DefByte ДиапазонБукв!,
ДиапазонБукв] ... |
Тип данных Byte |
||
Deflnt ДиапазонБукв
[ , ДиапазонБукв] ... |
Тип данных Integer |
||
DefLng ДиапазонБукв!,
ДиапазонБукв] ... |
Тип данных Long |
||
DefCur ДиапазонБукв
[, ДиапазонБукв] ... |
Тип данных Currency |
||
DefSng ДиапазонБукв
[, ДиапазонБукв] ... |
Тип данных Single |
||
DefDbl ДиапазонБукв
[, ДиапазонБукв] ... |
Тип данных Double |
||
DefDate ДиапазонБукв
[, ДиапазонБукв] ... |
Тип данных Date |
||
DefStr ДиапазонБукв
[, ДиапазонБукв] ... |
Тип данных String |
||
DefObj ДиапазонБукв
[, ДиапазонБукв] ... |
Тип данных Оbject |
||
DefVar ДиапазонБукв
[, ДиапазонБукв] ... |
Тип данных Variant |
||
Аргумент
ДиапазонБукв имеет следующий синтаксис:
Буква1[-Буква2]
Аргументы
Буква1 и Буква2 указывают границы диапазона имен, для которых задается тип данных
по умолчанию.
В следующем
примере инструкция устанавливает, что все переменные с именами, начинающимися
с букв из диапазона от А до Q, имеют строковый тип:
DefStr A-Q
Инструкция
Def Тип действует только на модуль, в котором она используется.
При указании
диапазона букв обычно определяется тип данных по умолчанию для переменных, которые
начинаются с первых 128 символов набора. Однако при указании диапазона A—Z задается
тип данных по умолчанию для всех переменных, включая те, что начинаются с международных
символов из расширенной части набора (128-255).
Еще одним
способом задания типа переменной по умолчанию является включение в конец имени
специального символа, устанавливающего тип переменной. Допустимо использование
следующих специальных символов для установки типов.
* |
Integer |
||
& |
Long |
||
| |
Single |
||
# |
Double |
||
@ |
Currency |
||
$ |
String |
||
Как и в других
языках программирования, в VBA вы можете использовать массивы. Примеры объявления
массивов приведены ниже.
Dim B(3, 3) As Single
Dim A(12) As
Integer
Первая строка
объявляет двумерный массив 3x3 (матрицу), состоящий из действительных чисел.
Вторая строка объявляет одномерный массив (вектор) из 12 целых чисел, причем
по умолчанию первый элемент массива будет А(0), а последний А(11). В этом случае
говорят, что о — базовый индеке. Можно изменить базовый индекс, написав в начале
листа модуля инструкцию Option Base1. После этого индексы массивов А и В будут
начинаться с единицы. Другим способом изменения базового индекса является использование
ключевого слова то при объявлении массива:
Dim B(l То 3, 1 То 3) As Single
Dim A(l To 12)
As Integer
Массив в
программе определяется поэлементно. Например,
Dim B(l To 2,
1 То 2) As Single
B(l,l)=2
В(1,2)=4
В(2,1)=1
В(1,2)=6
Удобным способом
определения одномерных массивов является функция Array, преобразующая список
элементов, разделенных запятыми, в вектор из этих значений, и присваивающая
их переменной типа variant. Например,
Dim A As Variant
А = Аггау(10,20,30)
В = А(2)
Иногда в
процессе выполнения программы требуется изменять размер массива. В этом случае
первоначально массив объявляют как динамический. Для этого при объявлении массива
не надо указывать размерность, например:
Dim R() As Single
В программе
следует вычислить необходимый размер массива и связать его с некоторой переменной,
например n, затем изменить размер динамического массива с помощью оператора
ReDim.
Синтаксис:
ReDim [Preserve]
ИмяПеременной(Индексы) [As Тип] [, ИмяПеременной(Индексы) [As Тип]] ...
Аргументы:
| Preserve |
Ключевое слово,
используемое для сохранения данных в существующем массиве при изменении
значения последней размерности |
||
ИмяПеременной |
Имя переменной,
удовлетворяющее стандартным правилам именования переменных |
||
Индексы |
Размерности
переменной массива; допускается описание до 60 размерностей. Аргумент
индексы использует следующий синтаксис: [Нижний То]
Верхний [, [Нижний То] Верхний] . . . Если нижний
индекс не задан явно, нижняя граница массива определяется инструкцией
Option Base. Если отсутствует инструкция option Base, нижняя граница
массива равняется нулю |
||
Тип |
Тип данных массива |
||
Например,
установим границы массивы R:
ReDim R(l To
10)
Допустимо
повторное использование инструкции ReDim для изменения числа элементов и размерностей
массива.
Функции
и процедуры для работы с массивами
При работе
с массивами бывает полезно применять следующие функции и процедуры.
Array (СписокАргументов) |
Создает массив
типа variant. Аргумент спи-сокАргументов представляет разделенный
запятыми список значений, присваиваемых элементам массива. Пример: Dim День As Variant
День = Array ("Пн", "Вт", "Ср", "Чт",
"Пт") |
||
IsArray (ИмяПеременной) |
Возвращает True,
если переменная содержит массив; в противном случае возвращается False.
Функцию IsArray используют дляпроверки значений переменных типа variant,
содержащих массивы |
||
LBound (ИмяМассива
[, Размерность]) и Ubound (ИмяМассива |
Возвращают минимальное и максимальное допустимые значения указанной размерности. Аргументы:
|
||
[, Размерность]) |
|
||
Erase СписокМассивов |
Повторно инициализирует
элементы массивов фиксированной длины и освобождает память, отведенную
для динамического массива, списокМассивов представляет имена одной
или нескольких очищаемых переменных массивов, разделенных запятой.
Инструкция Erase устанавливает элементы массивов фиксированной длины
следующим образом: массив чисел или строк фиксированной длины (присваивает
каждому элементу значение 0), массив строк переменной длины (присваивает
каждому элементу значение пустой строки), массив типа variant (присваивает
каждому элементу значение Empty). Erase освобождает память, используемую
динамическими массивами. Перед тем как из программы вновь появится
возможность сослаться на динамический массив, необходимо переопределить
размерности переменной массива с помощью инструкции ReDim. |
||
Константы,
в о.тличие от переменных, не могут изменять свои значения. Использование констант
делает программы легче читаемыми и позволяет проще вносить исправления — отпадает
необходимость многократно исправлять значения по тексту программы, т. к. достаточно
ввести новое значение при определении константы.
Синтаксис:
[Public | Private] Const ИмяКонстанты [As Тип] = Выражение
Аргументы:
Public |
Ключевое слово,
используемое на уровне модуля для описания констант, доступных всем
процедурам во всех модулях. Не допускается в процедурах. |
||
Private |
Ключевое слово,
используемое на уровне модуля для описания констант, доступных только
внутри модуля, в котором выполняется описание. Не допускается в процедурах. |
||
ИмяКонстанты |
Имя константы,
удовлетворяющее стандартным правилам именования переменных |
||
Тип |
|
||
Выражение |
Литерал, другая
константа или любое сочетание, которое включает все арифметические
или логические операторы, за исключением is |
||
Пример:
Const ПроцентнаяСтавка
As Single = 0.2
Const Фирма
= "OOO Бескрайние просторы"
Тип
данных, определенный пользователем
Наряду с
массивами, представляющими нумерованный набор элементов одного типа, существует
еще один способ создания структурного типа — тип, определенный пользователем,
или в привычной терминологии для программистов запись. Запись — это совокупность
нескольких элементов, каждый из которых может иметь свой тип. Элемент записи
называется полем. Запись является частным случаем класса, в котором не
определены свойства и методы.
Синтаксис:
[Private | Public]
Type ИмяПеременной ИмяЭлемента [([Индексы])] Аs тип [ИмяЭлемента [([Индексы])]
As тип]
End Type
Аргументы:
Public |
Используется телем типов, всех модулях для описания определяемых пользова-которые доступны для всех процедур во всех проектов
|
||
Private |
Используется
для описания определяемых пользователем типов, которые доступны только
в модуле, в котором выполняется описание |
||
ИмяПеременной |
Имя типа, определяемого
пользователем |
||
ИмяЭлемента |
Имя элемента,
определяемого пользователем типа |
||
Индексы |
Размерности
элемента, являющегося массивом. Для, задания массива, размеры которого
могут изменяться, указываются только скобки. Аргумент Индексы использует
следующий синтаксис: [Нижний То]
Верхний [, [Нижний То] Верхний] . . |
||
Тип |
Тип данных элемента;
поддерживаются типы: Byte, Boolean, Integer, Long, Currency, Single,
Double, Date, String (для строк переменной длины), String* длина
(для строк фиксированной длинны), Object, variant и другой, определяемый
пользователем тип или объектный тип |
||
В данном
примере инструкция туре используется для определения типа данных (только на
уровне модуля). При появлении в модуле класса инструкции туре должно предшествовать
ключевое слово Private. '
' Тип, определенный
пользователем
Туре Студент
'
' Элементы типа данных
'
Фамилия As String * 20 Имя As String * 20
Отчество As String * 20 НомерЗачетки As Integer
Группа As String * 10 Курс As Long
ДатаРождения As Date
End Type
Sub ВводДанных()
' Описание переменной Экономист
'
Dim Экономист
As Студент
' Присвоение
значений элементам переменной Экономист
With Экономист
.НомерЗачетки
= 12003
.Группа = "Менеджмент"
End With
End Sub
Можно создавать
массив, содержащий элементы собственного типа. Например, следующий массив состоит
из сведений о 20 студентах.
Dim СтудентЭкономист(1
to 20) As Студент
' Присваивает
значения элементам первой компоненты массива
CтудентЭкономист(1). Фамилия = "Промокашкин"
CтудентЭкономист(1).
Имя = "Евстегней" СтудентЭкономист(1).
Отчество = "Поликарпович"