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

В практических задачах управления данными чаще приходится работать с наборами элементов совершенно разных типов. В VBA-программе для управления такой информацией лучше всего создать пользовательский тип данных.

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

База данных – это набор записей, каждая из которых состоит из полей для хранения отдельных элементов информации. Разные поля могут хранить данные совершенно различных типов (строки, числа, даты или что-то другое). Содержимое одного и того же поля при переходе от записи к записи может меняться, но тип хранимых в поле данных остается во всех записях одним и тем же.

Переменную пользовательского типа можно сравнить с отдельной карточкой в каталоге или одной записью в базе данных. Чтобы представить целый каталог с карточками или базу данных с записями, необходимо объявить массив данных пользовательского типа (табл. 8).

Пользовательский тип данных - student2.ru Таблица 8

Пользовательский тип данных - student2.ru Пользовательский тип данных - student2.ru 33 Петров Николай Химиков 100–128 12.09.99
Пользовательский тип данных - student2.ru 12 Сидоров Михаил Пр. Мира 6–12 15.06.99
Иванов Сергей Пр. Маркса 100 21.08.99

Пользовательский тип данных - student2.ru

 
  Пользовательский тип данных - student2.ru
Пользовательский тип данных - student2.ru Пользовательский тип данных - student2.ru Пользовательский тип данных - student2.ru Пользовательский тип данных - student2.ru Пользовательский тип данных - student2.ru

Для объявления пользовательского типа данных используется оператор Type.

Type Имя записи

Имя поля As Тип

Имя поля As Тип

.............

Имя поля As Тип

End Type

В следующем примере объявляется тип данных, указанных в табл. 8.

Пример

Type Персона

Nom As Integer

Fam As String

Im As String

Ad As String

Tel As Long

Dat As Date

End Type

В операторе Type объявляется тип данных одной записи, которая состоит из переменной целого типа, трех строковых значений, длинного целого и даты.

Когда переменная типа Персона будет объявлена, то в этой переменной автоматически будет предусмотрено место для всех шести элементов, перечисленных в объявлении типа.

Чтобы получить целую базу данных (см. табл. 8), необходимо объявить массив с помощью оператора Dim:

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

После объявления переменной ее можно заполнять и обрабатывать.

При работе с элементами записи необходимо указывать имя записи и через точку имя поля.

Пример

Персона. Nom = 33

Персона. Fam = "Петров"

Персона. Im = "Николай"

Персона. Ad = "Химиков 100–128"

Персона. Tel = 332681

Пользовательский тип данных - student2.ru Персона. Dat = #12.09.99#

Пользовательский тип данных - student2.ru

Оператор присоединения

При заполнении нескольких элементов сразу используется оператор присоединения With. Он может сократить объем вашей программы.

Общий вид оператора присоединения With:

With Имя записи

Операторы, в которых присутствуют имена полей

End With

Пример

With Персона

. Nom = 33

. Fam = "Петров"

. Im = "Николай"

. Ad = "Химиков 100–128"

. Tel = 332681

. Dat = #12.09.99#

End With

Пример 1

Пусть данные табл. 8 находятся на первом рабочем листе Excel. Прочитать эту таблицу и вывести на печать все данные о Петрове Николае.

Программный код

Option Explicit

Type Персона

Nom As Integer

Fam As String

Im As String

Ad As String

Tel As Long

Dat As Date

End Type

Sub PR25()

Dim T(10) As Персона, i As Integer

‘ считывание таблицы

For i = 1 To 3

With T(i) ‘ оператор присоединения

. Nom = Cells(i, 1)

. Fam = Cells(i, 2)

. Im = Cells(i, 3)

. Ad = Cells(i, 4)

. Tel = Cells(i, 5)

. Dat = Cells(i, 6)

End With

Next i

‘ обработка таблицы

For i = 1 To 3

With T(i)

If . Fam = "Петров" And . Im = "Николай" Then

MsgBox (. Nom & " " & . Fam & " " & . Im & " "_

& . Ad & " " & . Tel & " " & . Dat)

End If

End With

Next i

End Sub

Пример 2

Пусть данные табл. 8 находятся на первом рабочем листе Excel. Прочитать таблицу с листа Excel и отсортировать записи по возрастанию номеров. Полученную таблицу вывести на лист Excel ниже исходной таблицы.

В описании переменных добавляются:

Dim N, K, As Integer

Dim P As Персона

Описание и ввод таблицы – как в примере 1.

Основная часть программы

For k = 1 To n – 1

For i = 1 To n – k ‘ сортировка методом “пузырька”

If T(i). Nom > T(i + 1). Nom Then

P = T(i)

T(i) = T(i + 1)

T(i + 1) = P

End If

Next i

Next k

‘ распечатка новой таблицы

For i = 1 To n

With T(i)

Cells(i + n + 1, 1) = . Nom

Cells(i + n + 1, 2) = . Fam

Cells(i + n + 1, 3) = . Im

Cells(i + n + 1, 4) = . Ad

Cells(i + n + 1, 5) = . Tel

Cells(i + n + 1, 6) = . Dat

End With

Next i

End Sub

Добавим в табл. 8 поле “Начисление”, т.е. одна запись будет состоять из следующих полей: Nom, Fam, Im, Ad, Tel, Dat, Nach.

Для добавления в запись нового поля следует добавить его в описание записи (раздел Type).

Пример 3

В новой таблице вычислим сумму, начисленную на всех сотрудников .

В описании переменных добавляется:

Dim S As Integer

В описание записи добавляется поле Nach.

Основная часть программы

S = 0

For i = 1 To N

With t(i)

S = S + . Nach

End With

Next i

Cells(i+N, 1) = "Итого"

Cells(i+N, 7) = S

Пример 4

Задана таблица вкладов клиентов банка, состоящая из следующих полей (табл. 9).

Таблица 9

№ счета Фамилия И.О. Сумма вклада, руб. Проценты Итог
Петров И.С.  
Иванов К.Т.  
Сидоров В.А.  

Вычислить сумму, полученную через год каждым клиентом (столбец “Итог”), общую сумму первоначальных вкладов и итоговую сумму всех вкладчиков, а также определить вкладчика с самым большим итоговым вкладом.

Программный код

Option Explicit

Type Stroka

Nch As Integer

Fam As String

IO As String

PSum As Double

Pro As Integer

Itog As Double

End Type

Sub PR26()

Dim Klient(100) As Stroka

Dim N As Integer

Dim i As Integer

Dim SP As Double

Dim SItog As Double

Dim imax As Integer

Dim max As Double

N = Val(InputBox("Введите количество клиентов"))

‘ Заполнение таблицы

For i = 1 To N

With Klient(i)

. Nch = Cells(i, 1)

. Fam = Cells(i, 2)

. IO = Cells(i, 3)

. PSum = Cells(i, 4)

. Pro = Cells(i, 5)

. Itog = . PSum + (. PSum * . Pro) / 100

End With

Next i

Range(Cells(i + N + 1, 1), Cells(100, 100)).Select

Selection.Clear

Cells(i + N + 1, 1).Select

Cells(i + N + 1, 2) = "итоговая таблица"

SItog = 0: SP = 0: max = –32000

For i = 1 To N

With Klient(i)

SP = SP + . PSum

SItog = SItog + . Itog

If . Itog > max Then

max = . Itog

imax = i

End If

Cells(i + N + 2, 1) = .Nch

Cells(i + N + 2, 2) = .Fam

Cells(i + N + 2, 3) = .IO

Cells(i + N + 2, 4) = .PSum

Cells(i + N + 2, 5) = .Pro

Cells(i + N + 2, 6) = .Itog

End With

Next i

Cells(2 * N + 4, 1) = "итого"

Cells(2 * N + 4, 4) = SP

Cells(2 * N + 4, 6) = SItog

Cells(2 * N + 6, 1) = "maxkl"

Cells(2 * N + 6, 2) = Klient(imax).Fam

End Sub

Подпрограммы

При написании длинных программ рационально использовать подпрограммы.

Подпрограмма – это отдельный блок, который может восприниматься как отдельная программа. В VBA существует два вида подпрограмм: подпрограмма-процедура и подпрограмма-функция.

Наши рекомендации