Файл: Освой самостоятельно программирование для MS Access 2002 за 24 часа [П.Киммел].pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 21.10.2020
Просмотров: 7936
Скачиваний: 25

зволяет говорить о памяти как о множестве "ячеек", каждая из которых способна
хранить определенное значение. Все значения, присвоенные элементам массива, от-
носятся к одному типу данных. Впрочем, если речь идет о типе Variant, природа от-
дельных элементов массива может быть совершенно различна.
Массивы бывают и многомерными. Способность компьютеров управлять массива-
ми данных намного превосходит пределы житейского восприятия. Мир, который нас
окружает, трехмерный. Даже если вы и не физики, то все же нетрудно мысленно
представить еще одно, четвертое, измерение — время. А что дальше? Но компьютер-
ная программа способна оперировать массивами произвольной размерности и объе-
ма — лишь бы хватило памяти. Конечно, все это, большей частью, теория. На прак-
тике, к нашему всеобщему удовольствию, возможностей одно- и двухмерных масси-
вов, как правило, вполне достаточно.
Для хранения целого числа необходимо 32 бита, или 4 байта. Целочисленный мас-
сив из 10 элементов, таким образом, займет в памяти, около 40 байт. Массивы легче
воспринимать в виде ячеек памяти (рис.
Каждый элемент массива адресуется
посредством индекса, который может принимать значения в пределах от наименьшего
до наибольшего допустимого номера включительно.
34
56
66
31
78
Рис.
Для
массива используется непре-
рывный фрагмент компьютерной памяти. В каждой
ячейке содержится 16 бит, или 2 байта
В основе операций над индексами массивов лежит предположение о
том, что массиву отвечает так называемый базовый адрес памяти. Адрес
очередного элемента массива в памяти можно рассчитать по формуле
БазовыйАдрес + (Индекс *
К счастью, компилятор VBA выполняет все вычисления само-
стоятельно, и заботиться о них не нужно. Только в языках ассемблера
и С подобные операции все еще находят широкое применение.
Объявление массивов
т
О
Самый сложный вопрос, связанный с использованием массивов в про-
грамме на языке VBA, заключается в определении верного исходного
размера массива и типа
элементов. Синтаксис объявления массива
лишь незначительно отличается от конструкции объявления переменной:
т
Dim
)
ТипДанных
В выражении объявления могут использоваться служебные слова ReDim (вместо
Dim) и Static (дополнительно). О них речь пойдет чуть позже. Основная конструк-
ция объявления массивов связана с использованием слова Dim, за которым следует
имя массива, сопровождаемое целым числом в круглых скобках. Если число в скобках
не задано, массиву изначально память не отводится. Завершается выражение объявле-
ния как обычно — служебным словом As и обозначением типа данных, в качестве ко-
торого допустимо использовать любой стандартный или пользовательский тип.
Часть IV. Определение типов данных. Использование массивов и коллекций

При попытке изменить длину массива фиксированного размера, т.е. мас-
сива, объявленного с помощью служебного слова Dim с указанием раз-
мера, произойдет ошибка. Решить эту проблему можно, объявив массив
с помощью
Dim и оставив скобки пустыми (а лучше не задавайте
размер массива при его объявлении).
Массивы фиксированного размера
Количество элементов
массива фиксированного размера
задается в конструкции его
объявления. На протяжении всего сеанса работы программы число элементов такого
массива остается постоянным. Объявление массива фиксированного размера отвечает
синтаксическому выражению, приведенному выше, за тем исключением, что значение
ИсходныйРазмер должно быть указано обязательно. Текст листинга 12.1 содержит
пример объявления и использования массива фиксированного размера.
Листинг
Пример использования массива фиксированного размера
1:
2 :
3 :
4 :
5 :
6 :
Sub
)
Dim
As Integer
'
элементов массива
For I = 1 To 100
( I ) = I
Next I
9: For I = 100 to 1 Step -1
10:
11: Next I
12: End Sub
Строка 2 содержит выражение объявления массива Ints, предназначен-
| ного для хранения 100 целых чисел. Строки
демонстрируют конструк-
цию цикла для итеративного прохождения по всем элементам массива.
В практике программирования вам часто придется выполнять начальную
инициализацию элементов массивов определенными значениями. Если
инициализация не производится, каждому элементу массива по умолчанию
присваивается некоторое значение, зависящее от типа: например, числовые
элементы будут содержать значение 0, а символьные — null (пустая стро-
ка). В строках
расположен цикл, позволяющий отобразить содержи-
мое всех элементов массива, начиная с последнего и заканчивая первым, в
окне Immediate редактора Microsoft Visual Basic.
Мы не случайно остановимся на обоих направлениях перемещения по элементам
массива — прямом и обратном. Это важно, поскольку во многих случаях (как, напри-
мер, при сортировке данных, о чем речь пойдет в одной из последних разделов этой
главы) потребуются самые разнообразные способы обработки массивов данных.
Динамические массивы
Динамическим
называется массив, число элементов которого может изменяться во
время выполнения программы — в отличие от массива фиксированного размера, опре-
деляемого на этапе кодирования. Если для объявления динамического массива исполь-
час. Управление данными переменного объема
211

зуется служебное слово Dim, значение в круглых скобках опускается. Существует и дру-
гой вариант объявления, предусматривающий обязательное задание размера массива:
С ИсходныйРазмер )
Роль признака "изменяемости" объема массива играет теперь служебное слово
ReDim. Все остальное аналогично — идентификатор, число-размер в круглых скобках
и обозначение типа данных.
При необходимости изменения размера массива после инициализации его элементов
следует предусмотреть средства создания резервной копии данных. На первый взгляд,
последовательность действий может быть такой: объявить временный массив, скопиро-
вать значения массива, подвергающегося изменениям, во временный, выполнить моди-
фикацию массива и вернуть значения обратно. Это, однако, не лучший метод — VBA
позволяет использовать другой, в котором выражение повторного объявления содержит
служебное слово Preserve. Листинг 12.2 содержит пример, иллюстрирующий процеду-
ру изменения размера массива с использованием инструкции Preserve.
Листинг 12.2. Пример объявления динамического массива и изменения его размера
1:
2:
3:
4:
5:
7 :
9:
10
11
12
13
14
15
16
17
Sub
)
ReDim
As String
ReDim
As String
= "Greetings"
Strings (3)
Strings (4)
"Привет"
ReDim Preserve
As
Dim Elem As Variant
For Each Elem In Strings
Elem
Next
End Sub
Строки 2 и З листинга 12.2 содержат объявления одного и того же массива
символьных переменных. Второе объявление просто удлиняет массив до
десяти элементов; служебное слово Preserve в данном случае необяза-
тельно, поскольку массив пуст. В строках
выполняется инициализация
пяти первых элементов: обратите внимание на использование индекса в
круглых скобках, который указывает на номер текущего элемента массива.
Строка 11 содержит инструкцию повторного объявления, предусматри-
вающего увеличение размера массива до 30 элементов и гарантирующего
посредством слова Preserve сохранность данных. Цикл, который распо-
ложен в строках
позволяет удостовериться, что содержимое массива
не изменилось. Опасность потери значений подстерегает вас в случае от-
сутствия директивы Preserve либо уменьшения количества элементов
вместо его увеличения. В последнем случае даже Preserve не сможет по-
мочь, ибо нельзя сохранить то, чего заведомо нет.
Часть IV. Определение типов данных. Использование массивов и коллекций

Статические массивы
Все статические переменные объявляются внутри процедур или функций. То же
справедливо и в отношении
статических
массивов — т.е. массивов, объявленных с
использованием служебного слова Static. Статические объекты данных
свои значения даже в том случае, когда выполнение функции (подпрограммы) завер-
шилось. Они могут продолжать работу при очередном обращении к той же функции
или подпрограмме.
Конструкция объявления статического массива отличается присутствием служеб-
ного слова Static, например:
Static Dim
As String
Если изменить слово Dim на ReDim, статический массив станет еще и динамиче-
ским. Статические массивы находят разное применение (во второй части этой главы
приводится ряд
примеров).
Задание точки отсчета индекса массива
В некоторых языках программирования, например С, элементы массивов отсчиты-
ваются, начиная с нуля. Другими словами, допустимые значения индекса массива из
десяти элементов, определенного в программе на языке С, заключены в интервале от
О до 9. VBA позволяет явно указать точку отсчета индексов массивов. Этой цели слу-
жит команда Option Base:
Option Base 0 | 1
Команда Option Base должна располагаться в верхней части программного моду-
ля. По умолчанию в качестве базы отсчета принимается значение 0. В этом случае
первый элемент любого массива будет адресоваться нулевым значением индекса,
а
— значением
N-1.
Если вам удобно отсчитывать элементы массива с нуля, по-
ложитесь на стандартное "поведение" системы; в противном случае явно укажите ин-
струкцию Option Base 1. Главное, будьте последовательны в своих решениях.
Использование массивов для хранения
данных
Вполне возможно, что через некоторое время с программным кодом, который
вы — к восторгу современников — удосужились написать, придется работать и вашим
преемникам. Вероятно, этим счастливчикам не понравится, что в тексте кода вы (не
очень предусмотрительно) использовали явные обращения к нулевому или первому
элементу массива. Наилучший способ исключения подобной ситуации состоит в ис-
пользовании специальных средств языка, позволяющих избежать зависимости от вы-
бранной точки отсчета индексов.
Существует такая альтернатива: применять циклы вида For Each . . .
Next либо обратиться к функциям
и
Рекомендуется оста-
новить выбор на указанных функциях — если, разумеется, ваш код вообще
предусматривает циклические действия над элементами массивов. Синтак-
сические формулы обращения к функциям Lbound и Ubound таковы:
Измерение] )
ИмяМассива [, Измерение] )
час. Управление данными переменного объема

Обе функции требуют наличия, как минимум, одного аргумента — имени массива.
Второй (необязательный) параметр Измерение, указывает номер измерения массива,
для которого необходимо вычислить значение верхней или нижней границы измене-
ния индекса. Если аргумент Измерение не задан, по умолчанию предполагается, что
речь идет о первом измерении массива.
Значение, установленное командой Option Base, не оказывает
влияния на порядок отсчета номеров измерений массива — они всегда
перечисляются, начиная с единицы.
Далее рассмотрим два массива — двухмерный и трехмерный:
Dim
20) As String
5, 10) As Integer
Первый массив, Arrayl, двухмерный. Такие массивы называют
матрицами.
Вто-
рой,
— это трехмерная матрица. (В принципе, матрицей можно назвать даже
массив.) Массив Arrayl содержит 100 индексированных "ячеек" для хра-
нения символьных значений. Если вызвать функцию Ubound, передав ей единствен-
ный параметр Arrayl, она возвратит значение 5. Результатом обращения
A r r a y l , 2 ) будет число 20.
Функции
и Ubound гарантируют, что востребованное программой значение
индекса массива находится в допустимом диапазоне. Функции удобно применять в
качестве границ изменения переменной цикла — убедитесь в этом, прочитав текст
листинга 12.3.
Листинг
Пример объявления многомерного массива и использования функций
Lbound и Ubound
Sub
)
Dim I As Integer
Dim
10) As Integer
Dim
As Integer
11:
13:
For
Arrayl, 2
Array2 )
I =
Array2 ) To Ubound ( Array2
= I:
Next I
End Sub
Анализ
Строка 4 листинга 12.3 демонстрирует объявление массива, содержаще-
го 5 индексированных "ячеек" в первом измерении и 10 — во втором.
Таким образом, массив Arrayl способен хранить 50 целых чисел. В стро-
ке 5 объявлен одномерный массив
предусматривающий возмож-
ность хранения 100 целочисленных значений. Строка 7 иллюстрирует
применение функции Ubound для получения объема второго измерения
массива Arrayl, а результатом вычисления выражения, расположенного
в строке 8, будет "длина" единственного (первого) измерения массива
Строки
кода содержат пример цикла For . . . Next, в ко-
тором границы изменения индекса задаются с помощью функций
Lbound И Ubound.
Часть IV. Определение типов данных. Использование массивов и коллекций