Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Пользовательские типы данныхСодержание книги
Поиск на нашем сайте
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 с.) |