Основы программирования
16.2. Переменные и типы данных
Объявление переменных
Данные, используемые в процедурах, разделяются на два основных вида: константы и переменные. Для обозначения констант и переменных служит идентификатор (имя). Существуют правила, согласно которым формируются идентификаторы переменных.
- Идентификатор состоит из букв, цифр или знаков, причем первый символ идентификатора – всегда буква.
- Не рекомендуется использовать в идентификаторе буквы русского языка, несмотря на то, что это допускается в локализованных версиях MS Office. Применение нелатинских символов в идентификаторах может привести к проблемам с переносимостью приложения на другие компьютеры.
- Нельзя использовать в качестве идентификаторов служебные или ключевые слова и стандартные имена.
- Нельзя использовать пробелы и точки в качестве разделителей частей идентификаторов. Для разделения обычно применяется нижнее подчеркивание или написание каждой части идентификатора с прописной буквы.
- Символы объявления типа, например, "#", можно использовать только как последний символ идентификатора – суффикс.
- Строчные и прописные буквы в идентификаторе равнозначны.
- Длина идентификатора не может превышать 255 символов. Длина имен объектов не должна превышать 40 символов.
Переменная – это величина, которая хранится в памяти и значение которой может изменяться во время выполнения программы. Каждая переменная имеет тип, который соответствует типу данных, сохраняемых в ней.
Константа – постоянное значение, используемое в программе. Символьные константы заключаются в двойные кавычки, а для констант, представляющих даты, вместо кавычек используются символы решетка ("#"). Например, #1.12.2006#.
Константы, которым присвоен идентификатор, применяются в качестве переменных, имеющих постоянные значения. Применение констант улучшает читабельность программы и уменьшает вероятность ошибок при использовании постоянных значений. Синтаксис объявления константы:
Const name=expression, например, Const pi=3.14
В языке имеются встроенные константы, идентификаторы которых зарезервированы. Идентификаторы констант VB начинаются с префикса "vb". Например, для перехода на новую строку часто задействуют константы vbLf, vbCr, vbCrLf.
В дополнение к константам VB используются константы приложения, начальные буквы которых определяются приложением, например, константы Excel VBA начинаются с префикса "xl". Для просмотра полного перечня встроенных констант в Object Browser применяется строка поиска Constants.
Рекомендуется объявлять используемые в программе переменные. Можно привести много аргументов в пользу объявления переменных.
- Объявление переменных поможет избежать самого распространенного типа ошибок – ошибок, связанных с неправильным написанием имен переменных, например, вместо идентификатора wbkVar в операторе может быть записано wkbVar.
- Если переменная объявлена, Visual Basic проверяет, используется ли правильный тип данных в операциях с этой переменной.
- Объявление переменных исключает преобразование значений переменных при вычислении выражений из типа Variant в другой.
- Применение переменных различных типов уменьшает объем памяти, занимаемый переменными, и сокращает время выполняемых вычислений, благодаря чему программы становятся более эффективными.
- Объявление переменных позволяет использовать одни и те же переменные в нескольких процедурах или модулях (модульные и глобальные переменные). Можно определять переменные, сохраняющие свои значения после выхода из процедуры.
Чтобы избежать использования переменных без объявления, достаточно поместить в область Declarations инструкцию Option Explicit. Тогда обращение к не объявленной ранее переменной вызовет сообщение об ошибке компиляции (рис.16.5).
Чтобы принудительно следовать стратегии объявления переменных, в окне команды Tools-Options (рис. 15.4) отмечается опция Require Variable Declaration, и тогда инструкция Option Explicit будет автоматически вставляться во все модули и процедурные листы проекта.
Типы данных
В VBA, как и в любом языке, используются данные элементарных типов: Boolean, Byte, Integer, Long, Single, Double, Currency, Date, String, Object, Variant, а также данные пользовательского типа User-defined data type (см. таблицу 16.2).
Переменная может принимать значения только одного типа, который указывается при ее описании или предполагается по умолчанию. Тип переменной накладывает ограничения на ее возможные значения и определяет разрешенные операции. Присвоение переменной значения, не соответствующего ее типу, вызывает преобразование значения или может привести к ошибке.
Для объявления переменных используются операторы Dim, Private, Public и Static.
Синтаксис оператора Dim:
Dim VariableName [As DataType]
- VariableName – идентификатор переменной;
- DataType – тип данных. Необязательный параметр, по умолчанию – Variant.
Например, Dim p As Integer.
Операторы Private, Public и Static имеют такой же синтаксис, что и оператор Dim.
VBA предусматривает включение в идентификаторы переменных суффиксов, определяющих тип переменной – %, &, !, #, @, $. Например, Dim Name$ определяет переменную Name$ как символьную (стринговую).
Операторы объявления переменных относятся к неисполняемым операторам, т. е. они содержат некоторую информацию для VB, не выполняют никаких действий, могут стоять в любом месте программы, но непременно раньше использования определяемой переменной. Рекомендуется объявлять переменные в начале процедуры или модуля, это улучшает читабельность программы.
Локальные переменные могут быть объявлены неявно (контекстуально). Обычно это происходит, если имя переменной присутствует слева в операторе присваивания или используется в качестве переменной цикла. Переменная, объявленная неявно, всегда имеет тип Variant.
Тип Variant
Тип Variant применяется для переменных, которые во время выполнения программы могут принимать значения любого типа, за исключением пользовательских типов данных.
При вычислении арифметических выражений переменные типа 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 – ключевое слово, указывающее на отсутствие ссылки на объект.
В качестве объектного выражения можно применять свойство, функцию или метод, возвращающие объект нужного типа. Типы объектного выражения и объектной переменной должны совпадать. Например, Set rng=Range("A1:B10"). Чтобы очистить объектную переменную, в операторе присваивания используется значение Nothing, которое аннулирует ссылку на объект и освобождает ресурсы. Например, Set rng= Nothing.
Массивы
Массив – это совокупность переменных одного типа. Элементы массива имеют одинаковые характеристики (тип, размер и т.д.). Каждому массиву при объявлении присваивается имя – идентификатор. Переменные, входящие в массив, называются элементами массива. Любой элемент массива обозначается именем массива с индексом, например, A(5), где А – имя массива, 5 – индекс. Другими словами, отдельный элемент массива определяется его позицией (индексом) в массиве. Можно сказать, что массив – это именованная совокупность переменных одного типа, которые различаются значениями своих индексов. Некоторые операторы позволяют осуществлять групповую обработку элементов массива, например, оператор Join. Элементы массива могут участвовать во всех конструкциях языка, в которых допускается использование обычных переменных.
С понятием массива связано понятие размерности. Чаще всего используются одномерные массивы (векторы или строки) и двумерные массивы (матрицы). Максимальное количество измерений массива – 60. Например, ежедневная утренняя и вечерняя температура воздуха в течение месяца представляется двумерным массивом из 31 строки и 2 столбцов, а эта же температура в течение года является уже трехмерным массивом 12*31*2.
Индекс элемента массива – это число (положительное, отрицательное или 0). Количество индексов элемента массива должно соответствовать количеству измерений массива: первый индекс соответствует первому измерению, второй индекс – второму и т. д. Для указания индекса можно использовать переменные или выражения. При этом значение выражения округляется до целого числа.
Значение каждого индекса имеет нижнюю и верхнюю границу. Массив должен быть обязательно объявлен. Синтаксис объявления массива:
Dim varname(subscripts) As type
- varname – имя массива;
- subscripts – индексы измерений массива;
- type – тип элемента массива.
Для каждого измерения (subscripts) можно указать нижнюю и верхнюю границы индекса (граничная пара) в виде lower to upper, где обе границы суть целые числа или выражения, результат вычисления которых есть число. Нижняя граница может быть опущена, тогда она предполагается нулевой, если инструкция Option Base не указывает на другое. Например, размещенная в области Declarations инструкция Option Base 1 устанавливает нижний индекс всех массивов в единицу.
Рекомендуется предусматривать такие значения индексов, которые соответствовали бы максимально возможному количеству элементов массива в каждом измерении. Индексы каждого измерения отделяются друг от друга запятой. Например, объявление Dim A (1 To 5, 2 To 17) определяет двумерный массив A из пяти строк с индексами от 1 до 5 и 16 столбцов с индексами от 2 до 17, всего 80 элементов. Запись A(3,10) указывает на девятый элемент третьей строки.
Если в момент объявления массива неизвестен его размер или же в процессе выполнения программы требуется менять размеры массива, то массив изначально необходимо объявить как динамический. При объявлении динамического массива не указывается его размерность, например, Dim A(). Далее в программе должны быть установлены размеры массива при помощи оператора Redim, синтаксис которого:
ReDim [Preserve] varname (subscripts) [As type]
- Preserve – ключевое слово, позволяющее сохранить существующие элементы массива;
- varname – идентификатор массива;
- subscripts – индексы массива;
- type – тип элементов массива.
Если массив многомерный, то при переопределении массива может быть изменена только верхняя граница последнего измерения. Попытка изменения нижней границы индекса приведет к ошибке. При переопределении динамического массива без ключевого слова Preserve все элементы массива уничтожаются. Если размерность массива увеличивается, то включение Preserve в оператор ReDim сохраняет существующие элементы массива. Если размерность массива уменьшается, то данные, находящиеся вне границ переопределенного массива, теряются.
Для определения границ динамического массива применяются функции LBound и UBound . Синтаксис:
LBound (arrayname [,dimension]) UBound (arrayname [,dimension])
- arrayname – имя массива,
- dimension – номер измерения массива.
Пользовательский тип
Пользовательский тип (User-Defined Data Type) представляет собой структуру данных, состоящую из нескольких логически связанных между собой элементов. Каждый пользовательский тип описывается с помощью инструкции Type в области Declarations (рис.16.6). Завершение определения пользовательского типа данных – инструкция End Type. В блоке Type...End Type не допускаются номера строк и метки строк. Например:
Определяемые пользователем типы данных могут включать в себя один или несколько элементов любого типа данных, в том числе массивы и определенные пользователем типы данных. Можно создавать массивы пользовательских типов данных. Структура пользовательского типа данных может быть многоуровневой.
Обращение к элементу структуры осуществляется при помощи составного имени для исключения неоднозначности. Полное составное имя включает в себя имена структуры и всех подструктур, в которые входит определяемый элемент. Имена подструктур должны следовать в порядке иерархии, т. е. в том же порядке, в котором они определены в структуре.
Для структур в целом применимы только операторы присваивания, элементы структур можно использовать в выражениях, соответствующих типу элемента. Например, оператор Dim arr As sqn определяет переменную arr приведенного на рис.16.6 пользовательского типа данных sqn, состоящую из двух элементов. В следующих операторах обращение к элементам структуры выполнено с указанием названия переменной arr:
arr.sqn_unity = d arr.sqn_zero = d^2arr.sqn_unity