Статические и динамические массивы


Язык VBA поддерживает два типа массивов — статические и динамические.

Статическиминазывают такие массивы, размерность которых была указана непосредственно при их объявлении.

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

'Одномерный массив из 51 элемента

DimMl(50)As Integer

'Двухмерный массив из 11 строк по 21 элементу

DimM2(10,20)As Integer

В этом примере первый оператор объявляет одномерный массив Ml из 51 целого числа. Как уже говорилось, в языке VBA по умолчанию принято нумерацию индексов начинать с нуля. Поэтому элементы массива М1будут пронумерованы от 0 до 50. Используя этот же принцип, аналогично, второй оператор объявляет двухмерный массив М2, который будет содержать 11 строк по 21 целому числу.

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

Например, чтобы присвоить значение 215 тридцать девятому элементу массива Ml можно воспользоваться любым из трех указанных ниже способов:

Ml (38) = 215

или

х = 38

М1(х) = 215

или

х = 38

М1(0) = х

М1(М1(0)) = 215

Для того чтобы сослаться на элемент двухмерного массива, необходимо указать два индекса: М2 (9, 12). В этом примере мы обращаемся к 13 элементу 10-й строки.

Если вариант нумерации элементов в массиве, начиная от нуля, почему-либо не подходит, можно поместить в начало модуля оператор Option Base 1, указывающий, что нумерация индексов массивов должна начинаться с 1. Но надо учитывать, что действие этого оператора распространяется только на те массивы, которые находятся в н у т р и данного модуля.

Такого же эффекта в нумерации индексов можно достичь с помощью ключевого слова То (см. пример в пункте "Многомерные массивы"). Он более универсален и позволяет задавать любое начальное значение индексам массива:

Dim Stroka(10 То 25, 30 То 40) As String

Здесь происходит объявление двухмерного массива строковых переменных с именем Stroka, в котором по первому измерению имеется 16 позиций (от 10-й по 25-ю), а по второму измерению — 11 позиций (от 30-й по 40-ю), т.е. всего 176 строковых переменных.

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

1) когда требуемый размер массива неизвестен заранее, до выполнения программы;

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

3) если после завершения использования массива в программе нужно освободить занимаемую им память.

При объявлении динамического массива его размерность (индексы) в скобках после имени массива неуказываются.

Dim D1( ) As String

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

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

Dim Ml ()

Dim M2 ()

Dim M3()

. . . . . . . .

ReDim Ml (5) '1 измерение, 6 элементов

ReDim M2 (5 То 11) '1 измерение, 7 элементов

ReDim М3 (1 То 6, 1 То 10) '2 измерения, 60 элементов

При о б ы ч н о м переопределении массива его содержимое полностью у н и ч т о ж а е т с я.

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

Dim M() As Single

ReDim M (l To 10, 1 To 20) j

ReDim Preserve M (l To 10, 1 To 50)

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

Надо учитывать, однако, что использование ключевого слова Preserve не всегда "спасает положение":

Ø при сокращении размеров массива д а н н ы е, оказавшиеся з а п р е д е л а м и его новых размеров, будут п о т е р я н ы.

Ø р а з м е р н о с т ь массива (количество измерений) н е л ь з я и з м е н и т ь.

Ø в м н о г о м е р н ы х массивах можно менять размер только п о с л е д н е г о измерения.

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

МассивДанных = МассивИсходныхДанных

Но для того, чтобы не было "неожиданных эффектов", нужно

Ø либо совпадение типов и количества элементов в обоих массивах,

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

В противном случае компилятор VBA автоматически заменит тип данных, размер и размерность результирующего массива на соответствующие характеристики исходного массива.

Для очистки и удаления массивов в языке VBA применяется оператор Erase. После заполнения элементов массива данные в них хранятся до тех пор, пока программа не присвоит им новые значения или пока VBA не удалит этот массив из памяти.

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

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

o Что касается статических массивов, то действие оператора Erase зависит от конкретного типа элементов данного массива:

Ø для любого ч и с л о в о г о типа оператор Erase записывает во все элементы массива значение н у л ь;

Ø для с т р о к о в о г о типа с переменной длиной строки оператор Erase помещает во все элементы массива строку нулевой длины, а строки фиксированной длины полностью заполняются символами пробелов;

Ø для типа Variant оператор Erase устанавливает все элементы массива на Empty (пусто);

Ø для типа Object оператор Erase устанавливает элементы массива на Nothing (ничто, ничего);

Ø для пользовательского типа оператор Erase устанавливает числовые типы на 0, строковые — на строки нулевой длины, Variant — на Empty, a Object — на Nothing.









Последнее изменение этой страницы: 2016-04-20; Нарушение авторского права страницы

infopedia.su не принадлежат авторские права, размещенных материалов. Все права принадлежать их авторам. Обратная связь