Группы и рассылки:

Вы здесь

Составные (пользовательские) типы данных в VBA

Версия для печати

В статье "Типы данных в Visual Basic (VBA)" мы познакомились с основными простейшими типами в VBA. Но средства VBA нам позволяют создавать свои составные (пользовательские) типы данных, основанные на простейших типах. Для чего это нужно? Например, нам необходимо описать некоторые объекты по следующим параметрам: Длина, Ширина, Глубина, Цвет, Материал и т.д. Это можно сделать двумя способами:
1 - На каждый параметр создать переменную определенного типа
2 - Создать свой пользовательский (составной) тип, содержащий все эти параметры и описать переменную этого типа.
Пока не совсем понятно, что я имел ввиду. Сейчас на примере разберем.

Что нам дает описание собственного типа?

Удобство! В одной переменной вы можете передать множество параметров разного типа. Такой подход значительно упростит код и сделает его легко-читаемым, да и с объектами легче работать.

Как описать свой тип данных в VBA?

В VBA для описания своего типа предусмотрена конструкция:

[Private | Public] Type НазваниеТипа
Элемент1 As Тип
Элемент2 As Тип
....

End Type

где:
Prvate/Public -
определяет область видимости нашего типа (private - виден только в текущем модуле, public - виден во всех модулях)
Type - ключевое слово, указывающее на описание нового типа "НазваниеТипа"
Элемент1,2...n - собственно поля простых типов
End Type - конец описания типа.

На примере рассмотрим описание вышеупомянутого составного типа, который содержит несколько элементов описывающих объект.

Описать тип можно в любом модуле, но если таких составных типов в проекте будет не один 10-ок, то для простоты рекомендую выносить их описание в отдельный модуль. Итак, создадим наш тип MyObject с элементами:
Длина, Ширина, Глубина - типа Single
Цвет, Материал - типа String.

Option Explicit
Public Type MyObject
  dl as single
   sh as single
   gl as single
   cvet as string
   mat as string
End Type

Sub TestMyType ()
dim obj as MyObject
obj.dl = 35.5
obj.sh = 15
obj.gl=3
obj.cvet = "Черный"
obj.mat = "Резина"

' для более удобного обращения к полям объекта obj
'воспользуемся конструкцией with ... end with
with obj
  msgbox "Параметры объекта:" & chr(13) & "Длина - "& .dl & chr(13) _
           & "Ширина - "& .sh & chr(13) & "Глубина - " & .gl & chr(13) _
           & "Цвет - " & .cvet & chr(13) & "Материал - " & .mat
end with

end sub

Обратите внимание что когда Вы ставите точку после названия переменной obj у вас выпадает список всех доступных полей.

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

Type MyObject
  dl as single
   sh as single
   gl as single
   cvet as string
   mat as string
End Type

Public Type MyType
  ID as long
  Myobj as MyObject
' .... 
End Type

Обращаться к полю MyType.MyObject.pole1

На этом все! До скорого...

Автор: 
Deys

Комментарии

Здравствуйте. Можно ли очистить сразу весь пользовательский тип? Например, я использую глобальный пользовательский тип и хочу очищать его после очередного запуска макроса. Если в пользовательском типе 3 переменные, то нужно для каждой писать очистку. Можно ли как-то сразу очистить весь пользовательский тип?

 
Приветствую. 
Нет, сразу очистить весь пользовательский тип нельзя. Но можно написать процедурку типа:

Private Sub ClearMyType(myvar As MyObject)
with myvar
  .dl = Empty
  .sh = Empty
  .gl = Empty
  .cvet = Empty
 .mat = Empty
End With

End Sub

и вызывать ее:
...
ClearMyType obj
...
 
По правде очистить пользовательский массив можно. Делается это так:
Создаем пользовательский тип:
Public Type my1
       ID        As String
       NameAvto  As String
       NumberFil As String
End Type
 Объявляем массив из пользовательских типов:
Public FileData() As my1

И наконец очищаем его
ReDim FileData(0)

Заполняем его:
FileData(UBound(FileData)).NumberFil = Cells(xx, нн).Value
изменяем размерность массива с сохранением записанных данных
ReDim Preserve FileData(UBound(FileData) + 1)

обращаться можно по индексу через цикл For
фактически это виртуальная таблица в памяти компутера.
 
 

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CAPTCHA
Для предотвращения регистрации спам-роботов введите символы с картинки.
CAPTCHA на основе изображений
Введите символы, изображенные на картинке.
Разместить свое видео на сайте
Вы можете разместить свои 
видео-уроки на сайте
БЕСПЛАТНО!


Подробнее>>>