Создание пользовательских типов данных в VBA Excel. Оператор Type, его описание и параметры. Создание массива «одномерных массивов» с пользовательскими данными.
Определение пользовательских типов данных
Пользовательский тип данных в VBA Excel представляет из себя набор элементов, каждому из которых пользователем присваивается свой тип данных. Другими словами, пользовательский тип данных — это набор данных разного типа, который может быть присвоен одной переменной.
Если простую переменную (не массив) объявить с пользовательским типом данных, она будет представлять из себя «одномерный массив»* с элементами разных типов данных, определенных пользователем.
Если с пользовательским типом данных объявить переменную массива, она будет представлять из себя массив «одномерных массивов»* пользовательских данных.
* Выражение «одномерный массив» взято в кавычки, так как фактически это не массив, а набор пользовательских данных, но для практического применения это не имеет значения.
Синтаксис и параметры оператора Type
Синтаксис оператора Type
1 2 3 4 5 6 7 |
Type <strong>Name</strong> <strong>Element</strong>_1 as <strong>Tip</strong> <strong>Element</strong>_2 as <strong>Tip</strong> <strong>Element</strong>_3 as <strong>Tip</strong> ---------------- <strong>Element</strong>_n as <strong>Tip</strong> End Type |
Пользовательский тип данных в VBA Excel может быть объявлен с ключевым словом Public или Private, которое явно укажет зону его видимости. Если ключевое слово опущено, конструкция с оператором Type по умолчанию объявляется с зоной видимости Public.
Параметры оператора Type
Параметр | Описание |
---|---|
Name | Имя пользовательского типа данных, по которому этот тип данных будет присваиваться переменным. |
Element | Наименование отдельного элемента пользовательского типа данных. |
Tip | Тип данных отдельного элемента (стандартный тип VBA). |
Применение пользовательских типов данных
Применение пользовательских типов данных в VBA Excel рассмотрим на примере домиков для животных.
Объявление пользовательского типа данных
Объявление пользовательского типа данных (конструкция с оператором Type) размещается в самом начале модуля в разделе Declarations.
Пример 1
1 2 3 4 5 6 |
Type Domik naimenovaniye As String obyem_m3 As Single material As String kolichestvo As Long End Type |
В этом примере:
- Domik — имя, по которому этот тип данных будет присваиваться переменным;
- naimenovaniye — наименование домика для животных;
- obyem_m3 — объем домика в куб. метрах;
- material — материал, из которого сделан домик;
- kolichestvo — количество домиков на складе.
Заполнение данными массива
Обычно в качестве контейнеров для пользовательских типов данных в VBA Excel используются массивы. В простую переменную можно уместить только один набор пользовательских данных, а в массив — сколько нужно. В следующем примере мы заполним трехэлементный массив тремя наборами пользовательских данных.
Если представить набор пользовательских данных как «одномерный массив», то таким образом мы создадим массив «одномерных массивов» с пользовательскими данными.
Пример 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub Primer2() 'Объявляем трехэлементный массив 'с пользовательским типом данных Dim a(1 To 3) As Domik 'Заполняем первый элемент массива a(1).naimenovaniye = "Скворечник" a(1).obyem_m3 = 0.02 a(1).material = "сосна" a(1).kolichestvo = 15 'Заполняем второй элемент массива a(2).naimenovaniye = "Собачья будка" a(2).obyem_m3 = 0.8 a(2).material = "береза" a(2).kolichestvo = 5 'Заполняем третий элемент массива a(3).naimenovaniye = "Клетка кролика" a(3).obyem_m3 = 0.4 a(3).material = "металл" a(3).kolichestvo = 6 End Sub |
Обращение к пользовательским данным в массиве
Для обращения в коде VBA Excel к пользовательским данным в массиве используется та же конструкция, что и при записи: указывается элемент массива и через точку наименование элемента пользовательских данных.
Пример 3
1 2 3 4 5 6 7 8 9 10 11 |
'Считываем информацию из массива Dim b As Variant b = a(2).naimenovaniye MsgBox b b = a(3).obyem_m3 MsgBox b b = "Мы продаем следующие товары: " _ & a(1).naimenovaniye & ", " _ & a(2).naimenovaniye & " и " _ & a(3).naimenovaniye MsgBox b |
Для наглядной демонстрации вставьте строки кода Примера 3 перед строкой End Sub Примера 2.
Здравствуйте!
А как в третьем примере найти в массиве номер элемента,
материал которого — металл?
Спасибо!
Здравствуйте!
Несколько связанных вопросов:
можно ли например верхний элемент задавать переменной?
можно ли сделать что-то подобное для массива?
можно ли определять размерность переменной в середине кода?
Спасибо!
Привет!
На все вопросы ответ – нельзя.
Погорячился я с ответом. В последнем параграфе этой статьи смотрите пример переопределения размерности массива с помощью переменных.
1. Можно, только если использовать динамический массив
Для увеличения размерности массива, не удаляя из него данные
2. Изменять тип переменной после объявления уже нельзя. Для этой цели можно использовать тип Variant, который может принимать значения разных типов.
такой вопрос: нужно последовательно перебрать данные в массиве пользовательского типа (как в примере выше Domik) для перебора желательно использовать for each…
пытаюсь
пишет что нельзя использовать пользовательский тип. как обойти эту проблему?
Здравствуйте, Юрий!
Цитата с сайта разработчиков: «Оператор For…Each…Next нельзя использовать с массивом пользовательского типа, поскольку тип Variant не может содержать пользовательские типы».
Обсуждение закрыто.