Пользовательский тип данных
В практических задачах управления данными чаще приходится работать с наборами элементов совершенно разных типов. В VBA-программе для управления такой информацией лучше всего создать пользовательский тип данных.
Огромное число баз данных фактически представляют такого же типа организованную структуру, но в электронном виде.
База данных – это набор записей, каждая из которых состоит из полей для хранения отдельных элементов информации. Разные поля могут хранить данные совершенно различных типов (строки, числа, даты или что-то другое). Содержимое одного и того же поля при переходе от записи к записи может меняться, но тип хранимых в поле данных остается во всех записях одним и тем же.
Переменную пользовательского типа можно сравнить с отдельной карточкой в каталоге или одной записью в базе данных. Чтобы представить целый каталог с карточками или базу данных с записями, необходимо объявить массив данных пользовательского типа (табл. 8).
Таблица 8
![]() ![]() | Петров | Николай | Химиков 100–128 | 12.09.99 | |
![]() | Сидоров | Михаил | Пр. Мира 6–12 | 15.06.99 | |
Иванов | Сергей | Пр. Маркса 100 | 21.08.99 |
![]() |
![Пользовательский тип данных Пользовательский тип данных - student2.ru](/images/matematika/polzovatelskiy-tip-dannykh-453540-7.png)
![Пользовательский тип данных Пользовательский тип данных - student2.ru](/images/matematika/polzovatelskiy-tip-dannykh-453540-8.png)
![Пользовательский тип данных Пользовательский тип данных - student2.ru](/images/matematika/polzovatelskiy-tip-dannykh-453540-9.png)
![Пользовательский тип данных Пользовательский тип данных - student2.ru](/images/matematika/polzovatelskiy-tip-dannykh-453540-10.png)
![Пользовательский тип данных Пользовательский тип данных - student2.ru](/images/matematika/polzovatelskiy-tip-dannykh-453540-11.png)
Для объявления пользовательского типа данных используется оператор 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
Персона. Dat = #12.09.99#
Оператор присоединения
При заполнении нескольких элементов сразу используется оператор присоединения 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 существует два вида подпрограмм: подпрограмма-процедура и подпрограмма-функция.