Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Пользовательские типы данных

Поиск

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

Type Персона

Имя As String

ДатаРождения As Date

Возраст As Integer

End Type

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

Туре                                        Ключевое слово, отмечающее начало определения типа

Персона                               Имя пользовательского типа

Имя As String                    Первый элемент пользовательского типа

ДатаРождения As Date    Второй элемент пользовательского типа

Возраст As Integer         Третий элемент пользовательского типа

End Type                                  Ключевые слова, отмечающие конец определения типа.

Когда эта инструкция помещена в начало модуля, она определяет пользовательский тип Персона, состоящий из трех элементов — строки Имя, целого числа Возраст и даты ДатаРождения. Как используется переменная такого типа? Взгляните на пример.

Type Персона

Имя As String

ДатаРождения As Date

Возраст As Integer

End Type

Sub ПользовательскийТипПеременной()

Dim User1 As Персона

User1.Имя = "Иванов”

User1.ДатаРождения = #2/23/75#

User1.Возраст = Year(Date) - Year(User1.ДатаРождения)

MsgBox User1. Имя & ", возраст " & User1.Возраст & _

" дата рождения " & User1.ДатаРождения

End Sub

Во второй строке объявлена переменная Userl пользовательского типа Персона. Затем, в строках 3, 4 и 5 различным элементам этой переменной присваиваются значения: Иванов для Имя, #2/23/75# для ДатаРождения, а Возраст есть разность между текущим годом (Year(Date)[13]) и годом рождения (Year(User1.ДатаРождения)). В шестой строке элементы переменой Userl выводятся в информационное окно.

Обратите внимание на символ продолжения в конце шестой строки.

Литерал даты

В вышеприведенном примере мы впервые использовали литерал даты — значение даты, ограниченное значками #. Такую форму записи применяют всякий раз, когда присваивают переменной типа Date дату в численном выражении. Литерал даты напоминает обычную текстовую строку, ограниченную символами #, а не кавычками.

Массивы VBA

Массивы VBA и других языков программирования весьма схожи; они незаменимы работе с большими объемами данных. Попросту говоря, массив — это переменная, содержащая несколько значений, или еще проще — пронумерованная группа значений одного и того же типа. Если обычные переменные полезны при работе с одиночными значениями определенного типа, массив пригодится при действиях с набором значений того же типа.

Конечно в действительности массивы устроены сложнее хотя бы потому, что они могут быть многомерными. Каждое измерение массива характеризуется численным индексом. Одномерный массив — это просто пронумерованный список значений. Он имеет начальную (первый элемент) и конечную точки (последний элемент); между ними помещены остальные значения массива, которые не перекрываются и однозначно определяются своими индексами.

Двухмерный массив более сложен — в него включены наборы списков одной длины. Часто такие наборы называют таблицами или матрицами. Они состоят из строк и столбцов, на пересечении которых находятся табличные данные. Простой пример двухмерного массива изображен на Рис. 3‑1.

Рис. 3‑1.Двухмерный массив, известный также как таблица или матрица

Трехмерный массив можно считать набором таблиц, в котором все таблицы имеют одинаковые количества строк и столбцов. Трехмерные массивы напоминают рабочую книгу Excel, содержащую несколько листов. Для доступа к элементу трехмерного массива надо указывать три координаты — строку, столбец и таблицу.

Но это не предел! Четырехмерный массив — еще больше, и в его состав входят группы таблиц с одинаковой структурой. Продолжая аналогию с рабочей книгой, можно сказать, что четырехмерный массив подобен папке с файлами рабочих книг, теперь для доступа к значению Вам придется указывать не только строку, столбец и таблицу, но и файл.

Массивы VBA могут иметь до 60 измерений. Представьте себе какие сложные наборы данных Вы сможете поместить в 60-мерный массив. Впрочем, чаще всего в VBA используют одно- и двухмерные массивы; даже трехмерные массивы применяют редко. С массивами большей размерности не работают почти никогда, в частности из-за того, что они, как правило, требуют больше памяти, чем доступно на персональном компьютере.

Объявление массива

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

Вот пример описания одномерного массива для данных типа Integer.

Dim ЧисловойМассив(10) As Integer

Оно ничем не отличается от описания переменной, которое обсуждалось ранее, за единственным исключением — после имени переменной вводится число в круглых скобках, указывающее VBA, что Вы объявляете не одиночную переменную, а массив, и определяющее его структуру. Здесь мы задали только одно число, значит, будет создан одномерный массив ЧисловойМассив, предназначенный для хранения 10 целых чисел. В действительности число 10 определяет верхнюю границу индексов массива. Если Вы указываете, что массив должен содержать 10 элементов, VBA по умолчанию полагает, что номер первого элемента — 1.

Объявление двухмерного массива выглядит так:

Dim ДвухмерныйМассив (10,20) As String

Таблица ДвухмерныйМассив состоит из 10 строк и 20 столбцов и содержит до 200 строковых переменных.

И еще один пример — описание трехмерного массива типа Variant:

Dim ТрехмерныйМассив(5,50,100) As Variant

Массив ТрехмерныйМассив состоит из пяти таблиц, каждая из которых содержит по 50 строк и 100 столбцов. Он может содержать до 25 000 элементов.

Как видите, при увеличении размерности быстро возрастают и требования к объему памяти. При определении массива VBA выделяет достаточно места для всех его элементов. Точный объем выделяемой памяти зависит от размера массива и типа данных в нем. Например, для целочисленного массива, содержащего 10 элементов, требуется 20 байт, поскольку каждое целое число занимает 2 байта. Трехмерный массив ТрехмерныйМассив, описанный выше и состоящий из значений типа Variant, займет не менее 400 000 байт (25 000 раз по 16 байт). Имейте в виду, что массивы с большим числом измерений займут много памяти и сильно снизят производительность. При попытке объявить массив с объемом, превышающим доступную память компьютера, Вы увидите на экране сообщение «Недостаточно памяти» (Out of Memory).

Инструкция Option Base

Нумерация массивов VBA может начинаться с 0 или 1. Конкретный способ указан в инструкции Option Base в начале модуля. Так, Option Base 0 задает нумерацию всех массивов по умолчанию с 0, a Option Base 1 — с 1. В отсутствие инструкции Option Base нумерация массивов по умолчанию начинается с 0. Но в следующих примерах мы для простоты считаем, что она начинается с 1.

Использование массива

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

Option Base 1

Sub ЦелочисленныйМассив()

Dim Vals(3) As Integer

Vals(1) = Int(100 * Rnd())

Vals(2) = Int(100 * Rnd())

Vals(3) = Int(100 * Rnd())

MsgBox "Выиграли лотерейные номера: " & Vals(1) & ", " & _

Vals(2) & ", " & Vals(3)

End Sub

В строке З объявлен одномерный массив Vals, содержащий 3 числа типа Integer. В строках 4—6 элементам этого массива присваиваются значения. Операторы присваивания для элементов массива выглядят точно так же, как операторы присваивания для переменных, за исключением того, что надо каждый раз указывать номер элемента, которому присваивается значение. Номер указан в круглых скобках после имени массива.

Обратите также внимание на формулу в правой части операторов присваивания (строки 4—6). В ней для генерации случайного целого числа от 0 до 100 используются встроенные функции VBA Rnd и Int. Первая из них генерирует действительное случайное число в интервале от 0 до 1 и может принимать один аргумент — «затравочное» число (подробности — в справочной системе VBA). Функция Int преобразует действительное число в целое, удаляя все цифры после десятичного разделителя (то есть всегда округляя до меньшего). Умножая случайное число, полученное функцией Rnd, на 100 и отбрасывая дробную часть, получаем случайное целое, принадлежащее диапазону от 0 до 100. Применив эту формулу трижды, мы зададим в массиве Vals три произвольных целых числа. В строке 7 программы ЦелочисленныйМассив элементы массива, каждый со своим индексом, передаются в функцию MsgBox.

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

Sub МассивVariant()

Dim Data(3) As Variant

Data(1) = "Иванов"

Data(2) = #3/21/1947#

Data(3) = Year(Date) - Year(Data(2))

MsgBox Data(1) & “, возраст “ & Data(3) & “, родился “ & Data(2)

End Sub

Здесь элементам массива присваиваются значения различных типов: первому элементу — строка, второму — дата, третьему — целое число. Поскольку Data объявлен как массив типа Variant, его элементам можно присваивать любые значения. В строке 6 значения всех элементов массива передаются в функцию MsgBox для отображения в диалоговом окне.

Расширим предыдущий пример и создадим двухмерный массив, содержащий имя, дату рождения и возраст 10 человек.

Sub 2D_МассивVariant()

Dim Data2(10, 3) As Variant

Data2(1,1) = " Иванов"

Data2(1,2) = #3/21/1947#

Data2(1,3) = Year(Date) - Year(Data(1,2))

MsgBox Data2(1,1) & ", возраст ” & Data2(1,3) & _

", родился " & Data2(1,2)

End Sub

Если считать массив Data2 таблицей, то этот код присваивает значения ее первой строке. Для задания остальных строк понадобятся дополнительные инструкции. Перепишем 2D_МассивVariant, используя преимущества нестандартного типа Персона, описанного ранее в этой главе. Для достижения такого же результата нам достаточно одномерного массива типа Персона, как показано ниже. Напомним, что определение типа должно стоять в начале модуля VBA.

Type Персона

Имя As String

ДатаРождения As Date

Возраст As Integer

End Type

Sub ПользовательскийМассив()

Dim Data3(10) As Персона

Data3(1).Имя = "Иванов"

Data3(1).ДатаРождения = #3/21/1947#

Data3(1).Возраст=Year(Date)-Year(Data3(1).ДатаРождения)

MsgBox Data3(1).Имя & ", возраст " & _

Data3(1).Возраст & ", родился " & _

Data3(1).ДатаРождения

End Sub

Выполнение программы ПользовательскийМассив заканчивается появлением такого информационного окна.



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 43; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.116.37.200 (0.008 с.)