Ссылки на объекты

Кроме обычных переменных, в Visual Basic часто встречаются неременные, представляющие собой ссылку на объект. Оказывается, зачастую использование переменных для ссылок на объекты позволяет не только сократить и упростить текст программы, но и существенно ускорить ее работу.
Применение переменной-объекта отличается от использования обычных переменных: нужно не только объявить такую переменную, но и назначить ей соответствующий объект с помощью специального оператора Set. Вот синтаксис этого объявления и назначения:
Dim <имяПеременкой> As Object
Set <имяПеременной> = <ссылкаНаОбъект>
Иногда при объявлении такой переменной удобно заранее указать конкретный тип объекта — можно использовать любой конкретный объект из объектной модели Office. Приведем пример упомянутого объявления и назначения:
Dim MyBase As Database
Set MyBase = CurrentDb( )
После такого объявления и назначения вы можете применять переменную MyBase для обращения к текущей открытой базе данных. Мало того, что такая ссылка короче: она еще и быстрее обрабатывается, и программа, использующая переменные для прямых ссылок на объекты вместо сложных иерархических ссылок, включающих в себя большое количество операторов уточнения (точек), работает быстрее. Время, которое уходит у программы на разрешение ссылок, пропорционально количеству операторов уточнения, которые приходится обрабатывать программе.
Совет
Еще одно замечание о быстродействии. Если вы всерьез озабочены быстродействием вашей программы, то рекомендуется при описании переменных типа "объект" использовать конкретные объекты модели Office, а не универсальное описание Object. В оправдание можно привести примерно те же соображения, что и по поводу применения универсального типа Variant при описании обычных переменных: обработка такого типа переменных требует дополнительного времени и места в памяти.
Объектная переменная будет указывать на объект до тех пор, пока мы другим оператором Set не присвоим ей ссылку на другой объект этого же типа или не присвоим ей значение Nothing, что означает, что переменная не содержит никакой ссылки. Например:
Set txt = Nothing
После такого действия переменная продолжает существовать, хотя и не ссылается ни на какой объект. Другим оператором Set ей можно снова присвоить ссылку на объект.
Замечание
Обратите внимание, что объектные переменные, в отличие от обычных переменных, содержащих значения, включают в себя только ссылки на объекты, а не сами объекты или их копии.
Массивы
Массив — это переменная, в которой хранится одновременно несколько значений одинакового типа. Формальное определение массива таково: он представляет собой совокупность однотипных индексированных переменных.
Количество используемых индексов массива также может быть различным. Чаще всего применяются массивы с одним или двумя индексами, реже — с тремя, еще большее количество индексов встречается крайне редко. В VBA допускается использовать до 60 индексов. О количестве индексов массива обычно говорят как о размерности массива. Массивы с одним индексом называют одномерным, с двумя — двумерными и т. д. Массивы с большим количеством измерений могут занимать очень большие объемы памяти, так что следует быть осторожным в их применении.
Прежде чем использовать массив, нужно обязательно объявить его с помощью оператора Dim и указать при этом тип хранящихся в массиве значений. Все значения в массиве обязаны принадлежать к одному типу данных. Это ограничение на практике можно обойти, использовав при объявлении массива тип Variant — в этом случае элементы массива смогут принимать значения разных типов. Вот синтаксис оператора объявления массива:
Dim <имяМассива> (<размер1>, <размер2>, …) As <типДанных>
где указанные в скобках величины <размер1>, <размер2> и т.д. задают размеры массива — количество индексов и максимально допустимое значение для каждого. конкретного индекса. При этом индексирование элементов массива по умолчанию начинается с нуля. Так, объявление
Dim Array1 (9) As Integer
определяет одномерный массив из 10 элементов, являющихся переменными целого типа, а объявление
Dim Array2 (4, 9) As Variant
определяет двумерный массив из пятидесяти (5×10) элементов, являющихся переменными универсального типа variant.
Замечание
В качестве стандартного значения нижней границы для допустимых значений индекса может использоваться не только ноль. Можно изменить это стандартное значение с помощью оператора Option Base. Например, если поместить в начало вашего модуля оператор Option Base 1, то индексирование элементов массивов по умолчанию будет начинаться не с нуля, а с единицы.
При объявлении массива можно указать не только верхнюю границу индекса, но и его нижнюю границу, т. е. явно задать диапазон изменения конкретного индекса массива, причем нижняя граница может быть любым целым числом, необязательно неотрицательным. Вот синтаксис такого определения:
Dim <имяМассива> (<мин1> То <макс1>, …)
As <типДанных>
Например, если вы собираетесь работать с массивом метеорологических данных, представляющих собой средние дневные температуры за последние две недели, то может оказаться весьма удобным дать следующее определение массива:
Dim Temperature (-14 То 0)
As Single
При этом, например, Temperature (-2) будет соответствовать позавчерашней температуре, а для определения нужного индекса для интересующего вас дня будет достаточно использовать разность дат.
В приведенных выше примерах речь шла о массивах фиксированного размера, количество элементов в которых явно указано во время описания массива в операторе Dim. Такие массивы называются статическими. В VBA допускается использование и динамических массивов, размеры которых при описании не фиксируются. Определение размера динамического массива может быть сделано непосредственно во время выполнения программы.
При определении динамического массива в операторе Dim после имени массива стоят лишь пустые скобки и описание типа переменных. Количество индексов и диапазон их изменения не задаются. Однако перед тем, как использовать массив, нужно выполнить оператор ReDim, который задаст размерность и диапазоны изменения индексов динамического массива.
Синтаксис объявления и определения размеров динамического массива таков:
Dim <имяМассива> ( ) As <типДанных>
ReDim <имяМассива> (<размер1>, <размер2>, . . . )
Вот как может выглядеть объявление, определение размеров и использование динамического массива, а затем последующее изменение размерности и размеров этого же массива:
Dim dArray ( ) As Variant
ReDim dArray ( 1 , 2 )
dArray (0, 0) = 2
dArray (0, 1) = 3
k = dArray (0, 0) + dArray (0, 1)
ReDim dArray (k)
dArray (0) = "Строка1"
В этом примере массив dArray сначала определяется как двумерный массив из шести элементов, а затем переопределяется как одномерный массив, причем верхняя граница индекса задается значением переменной k.
Замечание
Чтобы определить текущую нижнюю или верхнюю границу массива, можно использовать функции LBound и Ubound соответственно.
Учтите, что по умолчанию при изменении размеров массива ему заново выделяется память и текущие значения его элементов теряются. Чтобы не потерять текущие значения массива при изменении его размеров, используется ключевое слово Preserve. Например, чтобы увеличить размер массива dArray на один элемент, не потеряв значений существующих элементов, можно поступить следующим образом:

ReDim Preserve dArray (UBound( dArray) + 1)