Szukaj…


Uwagi

W tym artykule pokażemy, jak utworzyć pełną niestandardową klasę w języku VBA. Wykorzystuje przykład obiektu DateRange , ponieważ data początkowa i końcowa są często przekazywane razem do funkcji.

Dodawanie właściwości do klasy

Procedura Property to seria instrukcji, które pobierają lub modyfikują właściwość niestandardową w module.

Istnieją trzy typy osób przystępujących do nieruchomości:

  1. Procedura Get , która zwraca wartość właściwości.
  2. Procedura Let , która przypisuje wartość (nie Object ) do obiektu.
  3. Procedura Set , która przypisuje odwołanie do Object .

Akcesoria do właściwości są często definiowane parami, przy użyciu zarówno Get i Let / Set dla każdej właściwości. Właściwość tylko z procedurą Get byłaby tylko do odczytu, a właściwość tylko z procedurą Let / Set byłaby tylko do odczytu.

W poniższym przykładzie zdefiniowano cztery akcesoria do właściwości dla klasy DateRange :

  1. StartDate ( odczyt / zapis ). Wartość daty reprezentująca wcześniejszą datę w zakresie. Każda procedura wykorzystuje wartość zmiennej modułowej mStartDate .
  2. EndDate ( odczyt / zapis ). Wartość daty reprezentująca późniejszą datę w zakresie. Każda procedura wykorzystuje wartość zmiennej modułowej, mEndDate .
  3. DaysBetween ( tylko do odczytu ). Obliczona wartość całkowita reprezentująca liczbę dni między dwiema datami. Ponieważ istnieje tylko procedura Get , tej właściwości nie można modyfikować bezpośrednio.
  4. RangeToCopy ( tylko do zapisu ). Procedura Set używana do kopiowania wartości istniejącego obiektu DateRange .
Private mStartDate As Date                ' Module variable to hold the starting date
Private mEndDate As Date                  ' Module variable to hold the ending date
  
' Return the current value of the starting date
Public Property Get StartDate() As Date
    StartDate = mStartDate
End Property

' Set the starting date value. Note that two methods have the name StartDate
Public Property Let StartDate(ByVal NewValue As Date)
    mStartDate = NewValue
End Property
  
' Same thing, but for the ending date
Public Property Get EndDate() As Date
    EndDate = mEndDate
End Property
  
Public Property Let EndDate(ByVal NewValue As Date)
    mEndDate = NewValue
End Property

' Read-only property that returns the number of days between the two dates
Public Property Get DaysBetween() As Integer
    DaysBetween = DateDiff("d", mStartDate, mEndDate)
End Function

' Write-only property that passes an object reference of a range to clone
Public Property Set RangeToCopy(ByRef ExistingRange As DateRange)

Me.StartDate = ExistingRange.StartDate
Me.EndDate = ExistingRange.EndDate

End Property

Dodanie funkcjonalności do klasy

Dowolną publiczną Sub , Function lub Property w module klasy można wywołać, poprzedzając wywołanie odwołaniem do obiektu:

Object.Procedure

W klasie DateRange można użyć Sub do dodania liczby dni do daty końcowej:

Public Sub AddDays(ByVal NoDays As Integer)
    mEndDate = mEndDate + NoDays
End Sub

Function może zwrócić ostatni dzień następnego miesiąca (pamiętaj, że GetFirstDayOfMonth nie będzie widoczny poza klasą, ponieważ jest prywatny):

Public Function GetNextMonthEndDate() As Date
    GetNextMonthEndDate = DateAdd("m", 1, GetFirstDayOfMonth())
End Function

Private Function GetFirstDayOfMonth() As Date
    GetFirstDayOfMonth = DateAdd("d", -DatePart("d", mEndDate), mEndDate)
End Function

Procedury mogą przyjmować argumenty dowolnego typu, w tym odwołania do obiektów definiowanej klasy.

Poniższy przykład sprawdza, czy bieżący obiekt DateRange ma datę początkową i końcową, która obejmuje datę początkową i końcową innego obiektu DateRange .

Public Function ContainsRange(ByRef TheRange As DateRange) As Boolean
    ContainsRange = TheRange.StartDate >= Me.StartDate And TheRange.EndDate <= Me.EndDate
End Function

Zwróć uwagę na użycie notacji Me jako sposobu na uzyskanie dostępu do wartości obiektu uruchamiającego kod.

Zakres modułu klasy, instancja i ponowne użycie

Domyślnie nowy moduł klasy jest klasą prywatną, więc jest dostępny tylko do tworzenia instancji i używania w ramach VBProject, w którym jest zdefiniowany. Możesz zadeklarować, utworzyć instancję i użyć klasy w dowolnym miejscu w tym samym projekcie:

'Class List has Instancing set to Private
'In any other module in the SAME project, you can use:

Dim items As List
Set items = New List

Ale często piszesz klasy, których chciałbyś użyć w innych projektach bez kopiowania modułu między projektami. Jeśli zdefiniujesz klasę o nazwie List w ProjectA i chcesz użyć tej klasy w ProjectB , musisz wykonać 4 akcje:

  1. Zmień właściwość instancji klasy List w ProjectA w oknie Properties, z Private na PublicNotCreatable

  2. Utwórz publiczną funkcję „fabryki” w ProjectA która tworzy i zwraca instancję klasy List . Zwykle funkcja fabryki zawiera argumenty inicjujące instancję klasy. Funkcja fabryczna jest wymagana, ponieważ klasa może być używana przez ProjectB ale ProjectB nie może bezpośrednio utworzyć instancji klasy ProjectA .

     Public Function CreateList(ParamArray values() As Variant) As List
         Dim tempList As List
         Dim itemCounter As Long
         Set tempList = New List
         For itemCounter = LBound(values) to UBound(values) 
             tempList.Add values(itemCounter)
         Next itemCounter
         Set CreateList = tempList
     End Function
    
  3. W ProjectB dodaj odwołanie do ProjectA za pomocą menu Tools..References...

  4. W ProjectB zadeklaruj zmienną i przypisz do niej instancję List za pomocą funkcji fabryki z ProjectA

     Dim items As ProjectA.List
     Set items = ProjectA.CreateList("foo","bar")
    
     'Use the items list methods and properties
     items.Add "fizz"
     Debug.Print items.ToString()
     'Destroy the items object
     Set items = Nothing
    


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow