Чтение онлайн

на главную

Жанры

VBA для чайников

Каммингс Стив

Шрифт:

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

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

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

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 столбцов строковых данных (конечно, массив на самом деле не содержит данные в строках и столбцах, по мысленное представление массива в виде подобной таблицы очень удобно).

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

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

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

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

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

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

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

Поделиться:
Популярные книги

Отмороженный 7.0

Гарцевич Евгений Александрович
7. Отмороженный
Фантастика:
рпг
аниме
5.00
рейтинг книги
Отмороженный 7.0

Довлатов. Сонный лекарь

Голд Джон
1. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь

Измена

Рей Полина
Любовные романы:
современные любовные романы
5.38
рейтинг книги
Измена

Идеальный мир для Лекаря 4

Сапфир Олег
4. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 4

Развод и девичья фамилия

Зика Натаэль
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Развод и девичья фамилия

Сила рода. Том 1 и Том 2

Вяч Павел
1. Претендент
Фантастика:
фэнтези
рпг
попаданцы
5.85
рейтинг книги
Сила рода. Том 1 и Том 2

Измена. Не прощу

Леманн Анастасия
1. Измены
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Измена. Не прощу

Тринадцатый II

NikL
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый II

Замуж второй раз, или Ещё посмотрим, кто из нас попал!

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Замуж второй раз, или Ещё посмотрим, кто из нас попал!

Бестужев. Служба Государевой Безопасности

Измайлов Сергей
1. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности

Седьмая жена короля

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Седьмая жена короля

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Начальник милиции 2

Дамиров Рафаэль
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции 2

Оружейникъ

Кулаков Алексей Иванович
2. Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Оружейникъ