Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Массивы. VBA предоставляет возможность создавать и использовать сложные структуры данных на основе базовых типов




VBA предоставляет возможность создавать и использовать сложные структуры данных на основе базовых типов. Сюда относятся массивы и пользовательский тип (user-defined type).

СТРУКТУРНЫЕ ТИПЫ ДАННЫХ

Структурный тип данных – это тип данных, который позволяет в одной величине хранить одновременно несколько значений. К структурным типам данных VBA относятся массивы и пользовательские типы данных.

Массив – это упорядоченная совокупность данных одного типа (см. типы данных VBA). Порядок элементов массива задается индексами его элементов. Количество элементов определяет размер массива, а количество индексов (в VBA - до 60) - его размерность. VBA поддерживает статические и динамические массивы.

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

(Public | Private | Dim) <имяМассива> (<размер1>, <размер2>,..., <размер N>) As <типДанных>

Указанные в скобках величины <размер1>, <размер2>, …, <размер N> задают количество индексов и максимально допустимое значение для каждого конкретного индекса (его верхняя граница). Таким образом, определяются размерность массива (количество индексов) и размер массива – количество элементов данного массива. При этом индексирование элементов массива по умолчанию начинается с нуля. Так, объявление

Dim Array1 (9) As Integer,

определяет одномерный массив из 10 целых чисел, а объявление

Dim Array3 (4, 9) As Variant,

определяет двумерный массив из пятидесяти (5х10) элементов типа Variant.

В VBA имеется возможность изменить индекс нижней границы с помощью оператора Option Base (указание Option Base 1 или Option Base 0 в общем разделе модуля). Более того, при объявлении массива можно явно указать и верхнюю, и нижнюю границы. Синтаксис оператора объявления массива с указанием границ для индексов:

Dim <имяМассива> (<мин1> To <макс1>[,..., <минN> To <максN>]) As <типДанных>

Примеры:

Dim A (1 To 3, 1 To 3) As Single Dim B (1 To 12) As Integer

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

Листинг 19. Обращение к элементам массива

' ЗАДАЧА: Сгенерировать 10 случайных целых чисел от 0 до 100, ' записать их в массив и вывести в окно отладчика Sub sample14() Randomize Timer ' запуск генератора случайных чисел Dim myarr(1 To 10) As Long ' объявление массива ' запись чисел в массив For i = 1 To 10 myarr(i) = Round(Rnd * 100) Next ' чтение элементов массива и вывод значений в отладчик For i = 1 To 10 Debug.Print myarr(i) Next End Sub

Удобным способом определения одномерных массивов является функция Array, преобразующая список элементов, разделенных запятыми, в массив из этих значений:

Dim A As Variant A = Array (10, 20, 30) B = A(2)

В данном примере переменная А создается как одномерный массив, состоящий из трех элементов (10, 20, 30), а переменная В принимает значение второго элемента массива А (20).

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

Dim <имяМассива> () As <типДанных>

Для указания и изменения размеров такого массива используется специальный оператор - ReDim:

ReDim <имяМассива> (<размер1>, <размер2>,..., <размер N>)

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

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

Листинг 20 демонстрирует работу с динамическим массивом (нумерация строк приведена только для удобства пояснений).

Листинг20. Работа с динамическим массивом

1: Public Vector() As Integer 2: Public Sub DMassiv() 3: Dim N As Byte, I As Byte 4: 5: N = InputBox("Введите фактическую размерность вектора") 6: ReDim Vector(N) 7: For I = 1 To N 8: Vector(I) = 2 * I + 1 9: Next I 10: 11: 'Массив расширяется с сохранением ранее вычисленных элементов 12: ReDim Preserve Vector(2 * N + 1) 13: For I = N + 1 To 2 * N + 1 14: Vector(I) = 2 * I 15: Next I 16: Debug.Print "Элементы массива Vector:" & Chr(13) 17: For I = 1 To 2 * N + 1 18: Debug.Print Vector(I) 19: Next I 20: End Sub

Поясним приведенный код. Сначала на уровне модуля объявляется глобальный динамический массив Vector (строка 1). В момент объявления размерность динамического массива не указывается, соответственно не выделяется память. Все это произойдет позже, в процессе выполнения программы. Далее приводится одна из возможных процедур, работающая с этим массивом Vector. В строке 12 массив переопределяется (увеличивается его размер) с сохранением предыдущих значений. Затем массив расширяется (цикл в строках 13-15). В последнем цикле (строки 17-19) значения элементов сформированного массива выводятся в окно отладки (Immediate).

В рассмотренном примере изменялся размер динамического массива, но не его размерность (массив оставался одномерным). Приведем фрагмент кода программы, в котором изменяются и размер, и размерность динамического массива:

1: Sub sample22 () 2: Dim dArray () As Variant 3: ReDim dArray(1,2) 4: dArray(0,0) = 2 5: dArray(0,1) = 3 6: k = dArray(0,0) + dArray (0,1) 7: ReDim dArray(k) 8: dArray(0) = "Строка1" 9: End Sub

В этом примере массив dArray сначала определяется как двумерный массив из шести элементов (2x3) (строка 3), а затем переопределяется как одномерный массив, причем верхняя граница индекса задается значением k (строка 7).

Динамические массивы с успехом можно применять там, где необходимы динамические структуры данных, например списки, стеки, очереди.




Поделиться с друзьями:


Дата добавления: 2013-12-13; Просмотров: 512; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.