Иногда удобнее создать свой собственный пользовательский тип данных. Как и переменные, пользовательские типы данных упрощают восприятие программного кода и позволяют обращаться к отдельным, но родственным в некотором смысле, элементам как к частям единого целого. Но массив данных пользовательского типа оказывается еще удобнее, если приходится иметь дело с группами сложных составных наборов информации.
Знакомство с массивами
Предположим, у вас есть набор чисел, представляющих цены, оценки за экзамен, расстояния от Земли до каких-то астрономических объектов или нечто другое. Представьте себе, что вы печатаете этот набор чисел в виде списка на листе бумаги, каждое число - в отдельной строке. То, что у вас получится, можно назвать простым массивом. Например:
Гарантированно выигрышные лотерейные номера
214236
54 5273
371453
891982
00000
941241
В списках, подобных этому, отдельные элементы имеют вполне определенные значения, но не имеют специальных идентификационных пометок. Если нужно, чтобы на один из элементов списка обратил внимание кто-то другой, вам придется сказать приблизительно следующее: "Это третий элемент в списке лотерейных номеров". Примерно так же VBA работает с массивами.
Ссылка на элемент массива
Каждый массив в VBA имеет имя, т.е. аналог заголовка списка на листе бумаги. Чтобы работать с отдельным элементом массива, нужно сослаться на него по имени массива и индексу - целому числу, соответствующему месту элемента в массиве. Например, выражение intLottoArray ( 3 ) ссылается на третий (или четвертый, в зависимости от системы нумерации) элемент массива с именем intLottoArray. Как вы, наверное, догадались, intв начале имени массива говорит о том, что в этом массиве предполагается хранить целые значения. Поэтому можно утверждать, что данные, хранящиеся в intLottoArray (3), представляют собой целое число.
Данные массива
При работе с массивами нужно помнить следующее.
* Можно создавать массивы данных любых типов. VBA с успехом хранит в массивах строки, даты, денежные значения и данные любых числовых типов.
* В одном массиве могут храниться данные только одного типа. Нельзя создать массив с раздельными ячейками для хранения и данных типа Date и данных типа String.
Правда, второе ограничение очень легко преодолеть. Как вы уже знаете, тип данных Variant допускает хранение данных любого из допустимых в VBA типов, и массивы данных типа Variant тоже вполне допустимы. Здесь следует иметь в виду, что информация, хранимая в виде данных типа Variant, занимает существенно больше места в памяти, чем та же информация в виде данных более определенного типа; для массивов произвольной длины это может потребовать дополнительно очень значительного расхода памяти. Но необходимость поместить в один массив неопределенной длины набор данных различных типов возникает крайне редко.
С другой стороны, довольно часто необходимо работать с наборами родственных в некотором смысле элементов разного типа. Именно такие наборы составляют структуру типичной базы данных. В базе данных для хранения адресов, например, каждая запись представляет собой некоторый набор элементов информации (имя и адрес), относящихся к одному объекту (человеку). Для подобных данных как раз и предлагается создавать пользовательские типы данных- как это сделать, вы узнаете чуть позже, в разделе "Определение своих собственных типов данных").
Использование многомерных массивов
Прежде чем заняться индивидуальными значениями, хранящимися в массиве, рассмотрим несколько общих вопросов, относящихся к массивам. Прежде всего следует сказать, что массивы могут быть многомерными. Простой список лотерейных номеров из примера в начале этой главы является одномерным массивом. Моделью двумерного массива может служить нижеприведенная табличка данных, организованных в строки и столбцы.
Ежедневные наблюдения за курами тремя анонимными биологами
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 столбцов строковых данных (конечно, массив на самом деле не содержит данные в строках и столбцах, по мысленное представление массива в виде подобной таблицы очень удобно).
Фиксирование размера массива при его объявлении определенно можно рекомендовать, если точно известно, что изменение размера массива не потребуется.
В этом случае вы застрахованы и от непредусмотренных изменений размера массива в программе. Правда, потенциальным недостатком фиксированного размера является то, что вы не сможете освободить в программе занимаемую массивом память для других нужд.