Массивы
Простейший и самый распространенный структурный тип - массив - упорядоченная совокупность данных одного типа. Порядок на элементах массива задается индексами его элементов. В VBA массивы могут быть одномерными и многомерными. Удивительно, сколь высока допустимая размерность массива, - число измерений доходит до 60. За всю свою многолетнюю практику не припомню случая использования более чем трехмерных массивов.
Конечно, все, что было сказано о глобальных и локальных переменных, общих и закрытых, двух уровней объявления, - относится и к массивам. Появляется только единственное дополнение, связанное с необходимостью указать размерность массива и границы изменения индексов. Поэтому синтаксис объявления массивов несколько расширен, - после имени переменной в круглых скобках указывается список размерностей массива:
{Dim | Private | Public | Static }<имя переменной> (<список размерностей>) [ As <имя типа>]
Синтаксически каждое измерение в списке отделяется запятой и определяется заданием нижней и верхней границы изменения индексов. По историческим причинам в Бейсике нижняя граница была фиксирована и равна 0. Затем ввели специальную опцию OptionBase, позволяющую устанавливать эту границу равную 1 или 0. Подумав еще, разрешили задавать нижнюю и верхнюю границу, причем и та и другая могут быть выражениями при одном ограничении - это должны быть константные выражения, не содержащие переменных. Вот "классическое" объявление одномерного массива и работа с ним:
Public Sub MyArray() Const LowBound As Integer = -5, HighBound As Integer = 5 Dim MyArr(LowBound To HighBound) As Byte Dim I As Integer Debug.Print "Элементы массива MyArr:" For I = LowBound To HighBound MyArr(I) = I + 6 Debug.Print MyArr(I) Next I End Sub
При печати элементов этого массива будут напечатаны числа от 1 до 11 по числу его элементов.
При объявлении массива всегда задавайте нижнюю границу, исходите из того, что граничная пара, задающая размерность, должна удовлетворять синтаксису:
<граничная пара> ::= <константное выражение> To <константное выражение>
Не используйте Option Base. Это ненадежное средство.
Программист Бэдли (не "наш" программист), зная, что массивы положено объявлять, дал следующее объявление:
Dim BadArr(10)
Запись получилась короткой, он написал ее быстро и был горд собой. Могу подтвердить, Бэдли действительно быстро пишет программы, жаль только, что они не всегда правильно работают. Вот еще один пример его работы:
'Option Base 0 Option Base 1 Dim Vector(10) Dim A1(5), A2(5) As Integer 'Бэдли добавил новое объявление массива Matrix 'При работе с матрицей ему удобно было, чтобы индексы начинались с 1, 'поэтому он изменил опцию Base, отменив предыдущее соглашение 'Ранее работавшая процедура War перестала работать Dim Matrix(10, 20) As Double
Public Sub War() Dim i For i = 0 To 5 A1(i) = i: A2(i) = i + 5 Vector(i) = A1(i): Vector(i + 5) = A2(i) Next i End Sub
Каждая строчка этого быстро написанного текста должна быть переписана при хорошем программировании.