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

на главную - закладки

Жанры

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

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

Шрифт:

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

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

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

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

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

Обратите внимание на то, что размер создаваемого этим оператором массива задается выражением, использующим переменную, в предположении, что

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

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

Чтобы при переопределении массива сохранить часть данных, используйте вместе с оператором ReDim ключевое слово Preserve. Такая последовательность операторов объявляет динамический массив, создает его как двумерный массив заданного размера, а затем увеличивает размеры массива по второму измерению, не разрушая уже имеющиеся данные:

Dim dblGalacticMasses As Double

* * *

ReDim Preserve dblGalacticMasses (1 To 30, 1 To 50)

* * *

ReDim Preserve dblGalacticMasses (1 To 30, 1 To 100)

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

Чтобы в программе использовать конкретный элемент массива, напечатайте имя массива, за которым следуют скобки с указанным в них индексом этого элемента. Индекс должен задавать целые значения для каждого из измерений массива. Например, выражение strSayings (4, 6), очевидно, однозначно идентифицирует строковые данные из строки 4 и столбца 6 в двумерном массиве строк.

Не забывайте, что числа или значения, которые вы должны указать в индексе для идентификации элемента массива, зависят от системы нумерации, указанной вами при объявлении массива. Если массив объявлен оператором Dim strSayings ( 10, 20 ) As String, то выражение strSayings (4, 6) идентифицирует данные из пятой строки седьмого столбца массива. Но если массив объявлен Dim strSayings ( 4 To 10, 6 То 50) As String, то же самое выражение означает данные из первой строки первого столбца.

В рамках описанной системы можно использовать элементы массива как обычные переменные. Вы можете сделать следующее:

* присвоить элементу массива значение; в следующем примере значение присваивается X конкретному элементу трехмерного массива данных типа Currency:

curBigDough ( 5, 8, 19 ) = 27.99

* присвоить значение, хранящееся в массиве, некоторой переменной, например:

datThatDate = datTheseDates ( 25,10)

* использовать значение элемента массива в выражении, например:

intA = 35 * ( intB + intCounts ( 3,2 ) )

Конечно,

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

Sub FortuneTeller

Dim strTodaysFortune(1 To 10)

Dim intUserChoice As Integer

strTodaysFortune(1) = _

"Вы станете богатым и знаменитым на 15 минут . "

strTodaysFortune(2) = _

"Вам предстоит обед с высоким незнакомцем ."

strTodaysFortune(3) = "Стоимость ваших акций удвоится!"

strTodaysFortune(4) = _

"Вы вспомните, где положили свои ключи."

strTodaysFortune(5) = _

"Вы получите огромный букет от анонимного почитателя."

strTodaysFortune(6) = "Вы опоздаете на обед."

strTodaysFortune(7) = "Все ваши мечты сбудутся."

strTodaysFortune(8) = _

"Вам вернут взятые у вас библиотечные книги."

strTodaysFortune(9) = _

"Никто не заметит ваших разных носков."

strTodaysFortune(l0) = _

"Вы встретите своего старого друга в супермаркете."

intUserChoice = InputBox("Чтобы узнать свое будущее," _

& " введите число от 1 до 10")

MsgBox (strTodaysFortune(intUserChoice))

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

Чтобы выяснить, как много элементов может вместить некоторое измерение массива, используйте функцию Ubound, которая особенно полезна при работе с динамическими массивами, поскольку в разные моменты выполнения программы динамический массив может содержать разное число элементов. Синтаксис функции UBound следующий:

UBound [имя_массива, измерение]

Аргумент имя_массива, очевидно, задает имя массива, к которому нужно обратиться, а аргумент измерение задает целое число, которое подскажет VBA, какое измерение массива вас интересует. Если измерение не указано, функция UBound возвратит размер первого измерения массива.

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

Этот подход иллюстрируется следующей небольшой программой, в которой трехмерный массив заполняется последовательными целыми значениями начиная с 1. Вот ее программный код:

Const Size As Integer = 3

Dim dblMatrix (1 To Size, l To Size, l To Size) As Double

Sub ArrayFiller

Dim I As Integer, J As Integer, К As Integer, X As Integer

X = 1

For I = 1 To Size

For J = 1 To Size

For К = 1 To Size

dbl Matrixf l, J, K) = X

X = X + 1

Next К

Next J

Next I

End Sub

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

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Его огонь горит для меня. Том 2

Муратова Ульяна
2. Мир Карастели
Фантастика:
юмористическая фантастика
5.40
рейтинг книги
Его огонь горит для меня. Том 2

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Наследник

Кулаков Алексей Иванович
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
8.69
рейтинг книги
Наследник

Совершенно несекретно

Иванов Дмитрий
15. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Совершенно несекретно

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Единственная для темного эльфа 3

Мазарин Ан
3. Мир Верея. Драконья невеста
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Единственная для темного эльфа 3

Жандарм

Семин Никита
1. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
4.11
рейтинг книги
Жандарм

Долгий путь домой

Русич Антон
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Долгий путь домой

Прогрессор поневоле

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

Наследие Маозари 6

Панежин Евгений
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 6

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита