Выбрать главу

С другой стороны, довольно часто необходимо работать с наборами родственных в некотором смысле элементов разного типа. Именно такие наборы составляют структуру типичной базы данных. В базе данных для хранения адресов, например, каждая запись представляет собой некоторый набор элементов информации (имя и адрес), относящихся к одному объекту (человеку). Для подобных данных как раз и предлагается создавать пользовательские типы данных- как это сделать, вы узнаете чуть позже, в разделе "Определение своих собственных типов данных").

Использование многомерных массивов

Прежде чем заняться индивидуальными значениями, хранящимися в массиве, рассмотрим несколько общих вопросов, относящихся к массивам. Прежде всего следует сказать, что массивы могут быть многомерными. Простой список лотерейных номеров из примера в начале этой главы является одномерным массивом. Моделью двумерного массива может служить нижеприведенная табличка данных, организованных в строки и столбцы.

Ежедневные наблюдения за курами тремя анонимными биологами

12

2

21

4

9

3

11

0

0

Представить трехмерный массив тоже не слишком сложно. На рис. 13.1 показан трехмерный массив в виде диаграммы.

Рис. 13.1. Эта диаграмма представляет трехмерный массив в виде набора кубиков с числами

А вот представить себе массив большей размерности уже не так просто, хотя для VBA это не составляет никаких проблем - массивы VBA могу иметь размерность вплоть до 60.

Объявление массивов

Как и обычные переменные, массивы должны быть объявленными. При этом объявление массива по форме отличается от объявления переменной только в одной дополнительной детали. Вот несколько примеров:

' Объявление одномерного массива данных типа Date:

Dim datTimeOfImpact (cdatMaxObservations) As Date

' Объявление массива типа Currency без объявления размера:

Public curPriceQuot es () As Currency

' Объязление четырехмерного массива типа Integer:

Dim intArrayOf Integers (34, 13, 29, 4) As Integer

Как видите, разница объявлений для обычных переменных и массивов заключается в том, что в объявлении массива за именем следуют скобки, в которых может не содержаться ничего, а могут содержаться значения, задающие размеры массива по каждому из его измерений.

(Обратите внимание, что в первом из вышеприведенных примеров размер одномерного массива задается именованной константой.)

Не забудьте при объявлении массива указать тип данных, включив в объявление массива As Type с подходящим ключевым словом, задающим тип. Если не указать тип, VBA создаст массив типа Variant, в результате чего требования вашей программы к памяти возрастут, а ее выполнение замедлится. Массивы данных типа Variant допустимы и в некоторых ситуациях могут быть вполне подходящим решением, но всегда, когда это возможно, лучше назначать массивам конкретный тип данных.

Общее число элементов данных в массиве равно произведению величин, характеризующих каждое из его измерений, - вы об этом уже знаете. Но здесь нужно обратить ваше внимание на одну деталь. Число элементов в массиве intArray Of Integer s в третьем объявлении из предложенного выше примера равно 35x14x30x5, так что это маленькое объявленьице резервирует место для массивчика из 73500 элементов.

Вы можете спросить, почему я считаю, что размер массива по каждому из его измерений на единицу больше соответствующих значений в объявлении (35 вместо 34 и т.д.). Ответ вы найдете ниже.

Нумерация элементов массива

Если вы не укажете иное, элементы массива индексируются (т.е. нумеруются) начиная с 0; говоря иначе, первым в массиве будет элемент с индексом 0. По этой причине значение, задающее размерность массива в объявлении, должно быть на единицу меньше числа элементов, которые предполагается иметь. Например, если предполагается создать массив из 10 элементов, для размера нужно указать значение 9.

Об этом не следует забывать, когда придется обращаться к элементам массива. Ссылка типа intMaccив (1) на самом деле означает обращение ко второму элементу в массиве.

Если же вам не нравится отсчет от 0, можно начать нумерацию элементов в любом массиве от другого числа - обычно от 1. Чтобы заставить VBA нумеровать все массивы от 1. поместите в раздел объявлений модуля (перед всеми процедурами) оператор

Option Base 1

Действие этого оператора касается только массивов внутри соответствующего модуля, поэтому при необходимости нужно будет разместить подобные операторы внутри каждого модуля.

Можно задать схемы нумерации и для каждого из измерений в отдельности. Например:

Dim sngNumbers (55 То 75, 7 Тo 16, 99)

В этом примере объявляется трехмерный массив, в котором по первому измерению имеется 21 место, с началом нумерации от 55 до 75; по второму - 10 мест с началом нумерации с 7, а последнее измерение предполагает наличие 100 месте нумерацией от 0.

Если при объявлении массива указать значение для его размера, то размер массива останется фиксированным в ходе всего выполнения программы - программа не сможет сделать массив меньше или больше. Чтобы объявить массив фиксированного размера, укажите в скобках в его объявлении конкретные значения для каждого из измерений массива. Например, оператор

Dim strХорошиеМысли (9, 19) As String

объявляет двумерный массив, который всегда будет содержать 30 строк и 20 столбцов строковых данных (конечно, массив на самом деле не содержит данные в строках и столбцах, по мысленное представление массива в виде подобной таблицы очень удобно).

Фиксирование размера массива при его объявлении определенно можно рекомендовать, если точно известно, что изменение размера массива не потребуется.

В этом случае вы застрахованы и от непредусмотренных изменений размера массива в программе. Правда, потенциальным недостатком фиксированного размера является то, что вы не сможете освободить в программе занимаемую массивом память для других нужд.

Объявление динамических массивов

Объявляйте массив как динамический в следующих случаях.

* Если вы не знаете и не можете узнать размер массива до выполнения программы.

* Если знаете, что размер массива в ходе выполнения программы будет меняться.

* Если после завершения использования массива хотите освободить занимаемую им память для других целей (большие массивы могут занимать немало памяти, которую можно освободить для использования динамических массивов).

Чтобы объявить динамический массив, просто не указывайте размер массива при его объявлении. Например, оператор

Dim dateДниРождения () As Date

подготовит VBA к использованию массива элементов типа Date, на самом деле не создавая пока массив.

Динамический массив не может хранить данные до тех пор, пока вы не создадите массив реально, указав его размер. Для этого используется оператор ReDim, как в следующем примере с одномерным массивом:

ReDim dateДниРсждений (intЧислоДнейРождения - 1)

Обратите внимание на то, что размер создаваемого этим оператором массива задается выражением, использующим переменную, в предположении, что значение этой переменной уже определено в программе. Значение переменной приходится уменьшать на 1, чтобы привести число элементов массива в соответствие с предлагаемой VBA нумерацией массивов от 0, если, конечно, вы не изменили систему нумерации, принятую по умолчанию, как описывалось в разделе "Нумерация элементов массива".