Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика VBA.pdf
Скачиваний:
891
Добавлен:
27.03.2016
Размер:
1.1 Mб
Скачать

5 Обработка массивов данных

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

Например, ALFA(3), X(3,5), MASSIV(L,M+2).

Список индексов - это обычно целые числа или переменные, отделенные друг от друга запятыми и заключенные в скобки. Допустимо также в качестве индекса использовать любое арифметическое выражение. Результат вычисления при наличии дробной части преобразуется к целому числу по законам алгебраического округления. Например: если в программе встречается ссылка на элемент массива A(R+T), то при R=2.3 и T=3.2 он будет рассматриваться как элемент A(6), а если T=3.1, то рассматриваться будет элемент A(5).

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

трехмерными и т.д. Например: X(k), M2(ind), Primer(i+2*l) - обозна-

чают элементы одномерных массивов; Mas(i, j), R(2, 5) обозначают элементы двумерных массивов.

В VBA используются статические и динамические массивы. При определении статического массива указывается его количество элементов. Размер резервируемой области памяти для хранения значения статического массива зависит от типа и количества элементов в массиве. Для динамически размещаемых массивов место в оперативной памяти отводится в момент выполнения программы.

66

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

Dim Array(50) As Single, Var2() As Single, M(3,4) As Integer

объявляет одномерный статический массив вещественного типа Array, содержащем 51 элемент (индексы элементов должны быть в диапазоне от 0 до 50), динамический массив вещественного типа с именем Var2 и двумерный массив М целого типа, содержащем 20 элементов (4 строки и 5 столбцов).

Если нижней индекс массива отличается от нуля, то при объявлении массива необходимо указать диапазон индексов:

Dim Array1(1 To 10) As Single, Mas(1 To 3 , 1 To 4) As Integer

Этим оператором объявлены статические массивы Array1 вещественного типа из десяти элементов и целочисленный двумерный массив Mas из 12-ти элементов (3 строки и 4 столбца). При задании диапазона индексов допускается использование отрицательных констант. Если же первый индекс всех массивов должен быть равен единице, то перед первой процедурой модуля можно добавить следующее объявление:

Option Base l

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

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

67

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

Массив размещается в последовательно расположенных ячейках памяти. Если массив одномерный, то его элементы хранятся в памяти друг за другом, например, A(1), A(2), A(3), ...

Количество элементов и размерность динамического массива объявляется внутри программы до первого его использования оператором ReDim, который имеет синтаксис, аналогичный оператору Dim. Для динамических массивов допустимо изменять как диапазон индексов, так и размерность массива. При этом, если изменяется только верхний индекс массива (для многомерных массивов только верхнее значение последнего индекса), то старые значения массива можно сохранить добавлением в оператор ReDim опции Preserve. В приведенном ниже примере показаны различия в полученном результате для одинаковых программ с использованием опции Preserve и без нее.

Пример 5.1.

Вариант программы с опцией

Вариант программы без опции

Preserve

Preserve

Sub tt()

Sub tt()

Dim m() As Single

Dim m() As Single

. . .

. . .

ReDim m(1 To 3)

ReDim m(1 To 3)

m(1) = 1 : m(2) = 1.2 : m(3) = 1.3

m(1) = 1 : m(2) = 1.2 : m(3) = 1.3

ReDim Preserve m(1 To 5)

ReDim m(1 To 5)

m(4) = 1.4 : m(5) = 1.5

m(4) = 1.4 : m(5) = 1.5

For Each a In m

For Each a In m

Debug.Print a

Debug.Print a

Next

Next

End Sub

End Sub

68