Лекция 15: Переменные, константы и типы данных Вопрос 1. Переменные, константы и типы данных Как и в других языках программирования, в VBA для хранения временных значений, передачи параметров и проведения вычислений используются переменные. Обычно перед использованием переменной производится ее объявление (определение имен переменных, которые будут использоваться в программе) и объявление типа данных, для хранения которых предназначена эта переменная. В VBA, как и в обычном языке Basic, для этого используется оператор Dim. Синтаксис этого оператора имеет следующий вид: Dim <имяПеременной> [As <типДанных>] В VBA действуют следующие правила именования переменных. Имя не может быть длиннее 255 символов. Имя должно начинаться с буквы, за которой могут следовать буквы, цифры или нижняя черта. Имя не должно содержать пробелов, знаков препинания или специальных символов, за исключением самого последнего знака. В конце к имени переменной может быть добавлен один из следующих шести специальных символов — описателей типа данных: !, #, $, %, &, @. Эти символы не являются частью имени переменной, т.е. если в программе используются одновременно имена string 1$ и string 1, то они относятся к одной и той же строковой переменной. Нельзя использовать одно и то же имя переменной с разными символами определения типа данных или одновременно явное описание типа данных и не соответствующий этому типу данных специальный символ. Кроме того, не допускается использование в качестве имен переменных ключевых слов VBA и имен стандартных объектов. Допускается использование в именах переменных букв не только латинского алфавита, но и кириллицы, что может оказаться удобным для русских пользователей: при желании можно давать переменным имена на русском языке. Пример 1. Описание переменных: Dim i As Integer, j As Integer Dim X As Double В VBA имеется оператор Option Explicit. Если начать модуль с этого оператора (он должен быть расположен в самом начале модуля до начала первой процедуры), то VBA будет требовать обязательного объявления переменных в этом модуле и генерировать сообщения об ошибке всякий раз, как встретит необъявленную переменную. Краткий перечень используемых типов данных VBA дан в табл. 11.1 Таблица 11.1 Типы данных VBA При описании переменной указание типа данных может быть опущено. Тип переменной может в таком случае определяться последним символом ее имени: @, #, %, &, !, $ (соответственно Currency, Double, Integer, Long, Single, String). Например, поскольку символ $ является символом определения типа для строковых данных, то переменная под именем text$ автоматически становится переменной типа «строка символов». В дальнейшем этот специальный символ указания типа данных может быть опущен, однако постоянное присутствие в имени переменной символа определения типа будет напоминать о том, к какому типу данных относится эта переменная, что поможет избежать ошибок использования несовместимых типов данных. Если же последний символ не является ни одним из перечисленных ранее и явное указание типа тоже не используется, то в этом случае переменной назначается по умолчанию тип данных variant, который позволяет хранить в ней данные любого типа. Для определения типа данных аргументов процедуры или функции используется описание типа данных непосредственно в их заглавной строке. Например, заглавная строка процедуры, описывающей параметры как переменные строкового типа, имеет вид Sub SplitStr(str1 As String, str2 As String, str3 As String) Определение типа данных возвращаемого функцией значения завершает заглавную строку функции, например, выражение Function FindSplitSpace (strl As String) As Integer описывает возвращаемое функцией значение как переменную короткого целого типа. Для описания констант используется оператор Const, схожий с оператором описания переменных Dim. Синтаксис этого оператора имеет вид Const <имяКонстанты> [As <типДанных>] = <выражение> Здесь <выражение> — это любое значение или формула, возвращающие значение, которое должно использоваться в качестве константы. Например, оператор, определяющий целую константу maxLen, имеет вид Const maxLen% = 30 Как и переменные, константы могут содержать значения различных типов данных, но при этом они не меняют своих значений во время выполнения программы. кроме описываемых пользователем констант существуют еще предопределенные встроенные константы, которые используют в тексте программ без предварительного описания. При именовании встроенных констант используется стандартное соглашение, позволяющее определить, к объектам какого приложения они относятся: имена встроенных констант, относящихся к объектам Access, начинаются с префикса ас, относящихся к объектам Excel — с префикса х1, относящихся к объектам Word — с префикса wd, а относящихся к объектам VBA — с префикса vb. Например, в команде DoCmd.OpenForm "Orders", acNormal, , stLinkCriteria используется встроенная константа Access acNormal. Кроме обычных переменных в Visual Basic часто используются переменные, представляющие собой ссылку на объект. Оказывается, что зачастую использование переменных для ссылок на объекты позволяет не только сократить и упростить текст программы, но и существенно ускорить ее работу. Использование переменной объекта немного отличается от использования обычных переменных: нужно не только объявить такую переменную, но и перед ее использованием назначить ей соответствующий объект с помощью специального оператора Set. Синтаксис такого объявления и назначения имеет вид Dim <имяПеременной> As Object Set <имяПеременной> = <ссылкаНаОбъект> Иногда при объявлении такой переменной удобно заранее указать конкретный тип объекта, для чего можно использовать любой конкретный объект из объектной модели Office. Например: Dim MyBase As Database Set MyBase = DBEngine .Workspaces (0) . Databases (0) После такого объявления и назначения можно использовать переменную MyBase для обращения к текущей открытой базе данных. Массив — это переменная, в которой хранится одновременно несколько значений одинакового типа. Формально массив представляет собой совокупность однотипных индексированных переменных. Число индексов массива также может быть различным. Чаще всего используются массивы с одним или двумя индексами, реже — с тремя; большее число индексов встречается крайне редко. В VBA допускается использовать до 60 индексов. О числе индексов массива обычно говорят как о его размерности. Массивы с одним индексом называют одномерными, с двумя — двухмерными и т.д Массивы с большим количеством измерений могут занимать очень большие объемы памяти, поэтому следует быть осторожным npи их применении. Прежде чем использовать, массив нужно обязательно объявить его с помощью оператора Dim и указать при этом тип хранящихся в нем значений. Все значения в массиве обязаны принадлежать к одному типу данных. Это ограничение на практике можно обойти, используя при объявлении массива тип variant, тогда элементы массива смогут принимать значения различных типов. Синтаксис оператора объявления массива имеет вид Dim <имяМассива> (<размер1>, <размер2>,...) As <тип Данных> Здесь (<размер1>, <размер2>,...) — размеры массива, т.е. число индексов и максимально допустимое значение для каждого конкретного индекса. При этом индексирование элементов массива по умолчанию начинается с нуля. Так, объявление Dim Arrayl (9) As Integer определяет одномерный массив из переменными целого типа, а объявление 10 элементов, являющихся Dim Аггау2 (4, 9) As Variant определяет двухмерный массив из пятидесяти (5х 10) элементов, являющихся переменными универсального типа Variant. При объявлении массива можно указать не только верхнюю границу индекса, но и нижнюю, т. е. явно задать диапазон изменения конкретного индекса массива, причем нижняя граница может быть любым целым числом. Синтаксис такого определения имеет вид Dim <имяМассива> (<мин1> То <макс1>, ...) As <типДанных> В приведенных примерах речь все время шла о массивах фиксированного размера, число элементов в которых явно указано во время описания массива в операторе Dim. Такие массивы называются статическими. В VBA допускается использование и динамических массивов, размеры которых при описании не фиксируются. Определение размера динамического массива может быть сделано непосред ственно во время выполнения программы. При определении динамического массива в операторе Dim после имени массива стоят лишь пустые скобки и описание типа переменных. Число индексов и диапазон их изменения не задаются. Однако перед тем как использовать массив, нужно выполнить оператор ReDim, который задаст размерность и диапазоны изменения индексов динамического массива. Синтаксис объявления и определения размеров динамического массива имеет вид Dim <имяМассива> () As <типДанных> ReDim <имяМассива> (<размер1>, <размер2>,...)