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

на главную

Жанры

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

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

Шрифт:

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

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

Иллюстрация этого мысленного эксперимента показана на рис. 13.2.

Рис. 13.2. Этот чертеж представляет

массив для хранения данных; стрелки с буквами соответствуют измерениям массива

Обратите внимание на то, что в главной строке этого программного кода, dblMatrix ( I, J, К) = X, переменные I, J и К представляют соответственно первое, второе и третье измерения массива. На рис. 13.2 я произвольным образом назначил эти буквы сторонам куба, задающим его измерения.

Теперь посмотрите, как эти переменные используются в циклах For . . . Next. Счетчиком внешнего цикла является I, следующего- J и последнего, внутреннего, - К. Нужно понять, что VBA начнет выполнение с внутреннего цикла, пройдя к нему сквозь все содержащие его циклы. Кубы на рис. 13.3 показывают два последовательных момента в самом начале заполнения массива из этого примера.

Л пока этот внутренний цикл выполняется, VBA не меняет значения переменных I и J. Когда внутренний цикл первый раз пройден полностью, первый раз получит возможность сделать шаг следующий цикл- цикл J. Это увеличит значение J- и снова начнется выполнение внутреннего цикла от начала до конца. Значение изменится только тогда, когда цикл F выполнен все три раза. После увеличения начинает заполняться следующий слой массива (рис. 13.4).

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

Рис. 13.3. Эти два чертежа иллюстрируют последовательность, в которой процедура-пример заполняет массив по мере выполнения внутреннего цикла For. . .Next:

For K = 1 To Size

For J = 1 To Size

For I = 1 To Size

dblMatrix(I, u, K) = X

X = X + 1

Next I

Next J

Next K

В результате массив будет выглядеть так, как показано на рис. 13.5.

Рис. 13.4. Второй слой массива начнет заполняться только после того, как изменит значение счетчик самого внешнего цикла For. . . Next

Рис. 13.5. Этот чертеж иллюстрирует порядок заполнения массива измененной процедурой

Массив будет содержать те же значения, что и в первом случае, но они хранятся иными элементами массива.

В VBA 6 можно присвоить содержимое одного массива другому с помощью простого оператора наподобие

strMaccивКопия = strИсходныйМассив

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

массив должен также допускать хранение данных того типа, который назначен данными исходного массива.

В VBA 5 вам придется копировать данные массива поэлементно, примерно так:

' выяснение размера исходного массива и

' соответствующее переопределение второго массива

intРазмерМассива = UBound(strИсходныйМассив)

Re Dim strМассивКопия (intРазмерМассива)

' выполнение копирования

For I = 0 To intРазмерМассива

strМассивКопия (I) = strИсходныйМассив (I)

Next I

Управление наборами данных с помощью объектов Collection

Если нужно работать с наборами элементов информации, создайте для этой информации объект Collection (Коллекция). Как уже говорилось в главе 12, в VBA родовой класс Collection предназначен для хранения практически всего, что только возможно. На основе этого класса можно создать любое число объектов Collection. Коллекции используются для хранения других объектов, но точно так же коллекции можно использовать и для хранения данных почти любых из допустимых в VBA типов.

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

Оценка преимуществ использования коллекций

Если вы чувствуете себя вполне уверенно при работе с объектами VBA, то использование объектов Collection для управления множествами элементов может оказаться для вас более простым, чем использование массивов. Методы Add и Remove позволяют без труда изменять размеры коллекции, и при этом вероятность возникновения ошибок будет меньше, чем при использовании оператора ReDim в разных частях программы. (Эти преимущества становятся особенно важными, если необходимо часто добавлять и удалять элементы группы.)

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

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

Но самое главное ограничение при использовании объектов Collection - запрет па хранение в них данных пользовательского типа, т.е. их нельзя непосредственно использовать с базами данных (см. ниже раздел "Определение своих собственных типов данных"). Правда, с помощью несложных приемов программирования это ограничение довольно просто обойти. И кроме того, серьезно работая с VBA с базами данных, вы все равно, скорее всего, будете использовать готовые объекты из ядра Microsoft Jet (DAO) и библиотек ODBC, а не объекты, созданные кустарным способом.

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

Отмороженный 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
рейтинг книги
Оружейникъ