
- •Часть VI
- •Глава 6.1 Создание приложений с помощью vba Возможности Visual Basic
- •Редактор Visual Basic (vbe)
- •Управление проектами в vbe
- •Глава 6.2 Основы программирования на ув6 Работа с переменными
- •Использование констант
- •Типы данных Object и Variant
- •Простейшие конструкции и операторы
- •Конструкции управления
- •Разновидности циклов
- •Работа с массивами
- •Работа со строками
- •Работа с датой и временем
- •Пользовательские процедуры и функции
- •Sub название процедуры (параметры) операторы
- •Function название функции (параметры) [As тип] операторы
- •Работа с записями
- •Работа с файлами
- •Input(число, номер)
- •Глава 6.3 Объектные модели
- •Объектная модель vba
- •Объектная модель Microsoft Office 2000
- •Объектная модель Microsoft Word 2000
- •Объектная модель Microsoft Excel 2000
- •Объектная модель Microsoft Access 2000
Работа с массивами
Массивом называется упорядоченная последовательность элементов одного типа, обращение к которым осуществляется при помощи его имени и индекса (т. е. порядкового номера элемента). Как правило, работа с элементами массива выполняется в циклах, где в качестве индекса выступает счетчик цикла.
У каждого массива определены нижняя и верхняя границы, в пределах которых может изменяться значение индекса. По умолчанию нижней границей любого массива является 0. Объем памяти, который требуется для массива, равен произведению байтов, выделяемых для одной переменной соответствующего типа, на количество его элементов.
Существует две разновидности массивов: статические и динамические.
Статические массивы. При объявлении такого массива значения его верхней и нижней границ не могут быть изменены в программе.
Данный вид массивов описывается в программе так же, как и переменные - при помощи одного из служебных слов: Dim, Private, 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 байт