Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 6(VBA).doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.03 Mб
Скачать

Работа с массивами

Массивом называется упорядоченная последовательность эле­ментов одного типа, обращение к которым осуществляется при помощи его имени и индекса (т. е. порядкового номера элемента). Как правило, работа с элементами массива выполняется в циклах, где в качестве индекса выступает счетчик цикла.

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

Существует две разновидности массивов: статические и ди­намические.

Статические массивы. При объявлении такого массива зна­чения его верхней и нижней границ не могут быть изменены в программе.

Данный вид массивов описывается в программе так же, как и переменные - при помощи одного из служебных слов: Dim, Pri­vate, Public или Static с последующим указанием типа по­сле служебного слова As. При этом может быть указана как верхняя граница, так и обе границы одновременно, например:

Dim arrA(9) As Byte Dim arrB(l To 10) As Byte

В данном случае оба массива содержат одно и то же количе­ство элементов одинакового типа. Однако нумерация элементов аггА начинается с нуля, в то время как нумерация arrB - с еди-

ницы. Для явного указания границ следует использовать служеб­ное слово То, в то время как при описании стандартного массива.

441

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

Следует отметить, что значения границ не должны выходить за пределы диапазона, используемого для типа Long, в против­ном случае компилятор выдаст ошибку переполнения Overflow.

Заполнение элементов массива, как правило, выполняется в , цикле, например:

Dim arrA(l То 10) As Integer Dim intl As Byte For intl = 1 to 10

arrA(intI) = intl^2 Next

В качестве значений элементов массива могут выступать как значения определенного типа, так и другие массивы, которые могут иметь разные типы. При этом в последнем случае объяв­ляемый массив должен иметь тип Variant.

Массивы бывают одномерными и многомерными. Для описа­ния многомерных массивов используются конструкции, анало­гичные рассмотренным, однако отличие состоит в том, что гра­ницы размерностей указываются через запятую, например:

Dim аrrА(4, 4) As Byte Dim arrB(l To 5, 1 To 5) As Byte

В данном примере объявленные массивы являются двумер­ными и содержат одинаковое количество элементов, нумерация которых, однако, отличается: аггА нумеруется начиная с нуля, arrB — начиная с единицы.

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

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

1. Объявить массив с использованием одного из служебных слов, например Dim, но без указания размерности (или размерностей).

442

2. В нужном месте процедуры описать данный массив с тре­буемым значением для размерности при помощи оператора ReDim.

Например:

Dim arrA() As Byte ' Описание типа массива

ReDim аrrА(5) ' Указание размерностей

Следует отметить, что при указании значений для размер­ностей динамического массива оператором ReDim его тип не может быть изменен. В том случае, если в данном операторе тип будет указан, то он должен совпадать с тем, который объ­явлен в операторе Dim, иначе на стадии компиляции приложе­ния будет выдано сообщение об ошибке.

Например:

Dim arrA() As Byte ' Тип Byte

ReDim arrA(5) As Byte ' Тип Byte

ReDim arrA(10) As Integer ' Ошибка

При помощи оператора ReDim можно устанавливать любые значения границ и количество размерностей, а также менял» любой из установленных параметров, как в сторону увеличе­ния, так и в сторону уменьшения. Например:

Dim arrA() As Byte

ReDim arrA(5)

' Диапазон: (0 to 5)

ReDim arrA(2, 2)

' Диапазон: (0 to 2, 0 to 2)

ReDim arrA(l To 4)

' Диапазон: (1 to 4)

ReDim arrA(3, 3, 1 То 3)

' Диапазон: (0 to 3, 0 to 3, 1 to 3)

В качестве значений как верхней, так и нижней границы могут быть использованы не только числа, но и переменные целого типа, например: |

Dim intl As Integer

Dim arrA() As Integer

intl =10

ReDim arrA(intI)

443

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

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

Dim intl As Integer

Dim arrA() As Integer

ReDim arrA(l To 10)

For intl = 1 To 10

arrA(intI) = intl^2

Next

ReDim Preserve arrA(1 To 15)

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

Следует обратить особое внимание на тот факт, что при по­мощи ключевого слова Preserve может быть изменена только верхняя граница последней размерности массива, попытка изме­нения других границ, например:

ReDim Preserve arrA(15)

приведет к ошибке при выполнении программы. В частности приведенный оператор изменяет не только верхнюю, но и ниж­нюю границу аrrА.

444

В Visual Basic существует возможность определения значений нижней и верхней границы массива, для чего используются функции LBound и Ubound... соответственно.

Например: I

Dim intLow As Integer, intHigh As Integer

Dim arrA(-10 To 10) As Integer

intLow = LBound(arrA) ' infcLow = -10

intHigh = UBound(arrA) ' intHigh = 10

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

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

Например:

Dim inti As Integer

Dim arrA() As Integer

intl=1000

ReDim arrA(intI) ....' Память для arrA: 1000 * 2 = 2000 байт

Erase arrA ... .' Память для arrA: 0 байт