Шаг 163.
VBA в MSExcel.
Пользовательские объекты. Пример создания класса

    На этом шаге мы рассмотрим пример создания и использования класса.

    Рассмотрим пример создания класса Вектор, моделирующего двумерный вектор. У объектов класса Вектор будут определены три свойства: координата абсциссы, координата ординаты и длина вектора (это свойство является свойством только для чтения). Кроме того, для объектов класса вектор будут определены два метода, первый из которых возвращает вектор, являющийся результатом покомпонентного произведения вектора на число, а второй — результат скалярного произведения двух векторов.

    Итак, в модуле класса, у которого установлено свойство Name, равное Вектор, наберите следующий код:

' X - координата абсциссы
' У - координата ординаты

Dim X, Y As Double
Public Property Get Абсцисса() As Double
  ' Возвращает значение свойства Абсцисса
  Абсцисса = X
End Property
Public Property Get Ордината() As Double
  ' Возвращает значение свойства Ордината
  Ордината = Y
End Property
Public Property Let Абсцисса(ByVal НоваяАбсцисса As Double)
  ' Устанавливает значение свойства Абсцисса
  If Not IsNumeric(НоваяАбсцисса) Then
    MsgBox "Абсцисса не является числом", vbInformation, "VBA"
    Exit Property
  End If
  X = НоваяАбсцисса
End Property
Public Property Let Ордината(ByVal НоваяОрдината As Double)
  ' Устанавливает значение свойства Ордината
  If Not IsNumeric(НоваяОрдината) Then
    MsgBox "Ордината не является числом", vbInformation, "VBA"
    Exit Property
  End If
  Y = НоваяОрдината
End Property
Public Property Get Длина() As Double
  ' Возвращает длину вектора. Это свойство только для чтения
  Длина = Sqr(X ^ 2 + Y ^ 2)
End Property
Public Sub ПрибавитьВектор(ByVal ДругойВектор As Вектор)
  ' Покоординатное сложение двух векторов
  X = X + ДругойВектор.Абсцисса
  Y = Y + ДругойВектор.Ордината
End Sub
Public Sub УмножитьНаЧисло(ByVal Число As Double)
  ' Покоординатное умножение вектора на число
  If Not IsNumeric(Число) Then
    MsgBox "Число, на которое умножается вектор," & Chr(13) _
      & "на самом деле не число", vbInformation, "VBA"
    Exit Sub
  End If
  X = Число * X
  Y = Число * У
End Sub
Public Function СкалярноеПроизведение(ByVal ДругойВектор As Вектор)
  ' Скалярное произведение векторов
  СкалярноеПроизведение = X * ДругойВектор.Абсцисса _
    + Y * ДругойВектор.Ордината
End Function
Private Sub Class_Initialize()
  ' Инициализация класса
  ' Вектор (1, 0)
  X = 1
  Y = 0
End Sub

    Проверить работу созданного класса можно, например при помощи следующей процедуры, код которой набирается на стандартном листе модуля.

Sub ДемонстрацияОбъектов()
  Dim a, s As Double
  ' Объявление двух векторов
  Dim МойВектор As Вектор
  Dim ЕщеВектор As Вектор
  ' Создание вектора
  Set МойВектор = New Вектор
  ' Установка координат вектора
  With МойВектор
    .Абсцисса = 1
    .Ордината = 1
  End With
  ' Определение длины вектора
  a = МойВектор.Длина
  MsgBox CStr(a)
  ' Умножение вектора на 2
  МойВектор.УмножитьНаЧисло Число:=2
  ' Определение координат преобразованного вектора
  MsgBox CStr(МойВектор.Абсцисса)
  MsgBox CStr(МойВектор.Ордината)
  ' Создание еще одного вектора
  Set ЕщеВектор = New Вектор
  With ЕщеВектор
    .Абсцисса = 2
    .Ордината = 3
  End With
  ' Сложение векторов
  МойВектор.ПрибавитьВектор ДругойВектор:=ЕщеВектор
  ' Определение координат преобразованного вектора
  MsgBox CStr(МойВектор.Абсцисса)
  MsgBox CStr(МойВектор.Ордината)
  ' Определение скалярного произведения
  s = МойВектор.СкалярноеПроизведение(ДругойВектор:=ЕщеВектор)
  MsgBox CStr(s)
End Sub


Рис.1. Тексты класса и процедуры

Текст этого примера можно взять здесь.

    Со следующего шага мы начнем рассматривать работу с внешними базами данных.




Предыдущий шаг Содержание Следующий шаг