Formularz jest obiektem, podobnie jak skoroszyt, arkusz, wykres czy zakres komórek. Każdy obiekt posiada właściwości, metody i często zdarzenia. Większość osób nieprawidłowo używa formularza, ponieważ nie traktuje go jako obiektu, a tym samym nie odwołuje się w żaden sposób do jego własciwości globalnych.
Przykład
Na formularzu znajduje się kalendarz, na którym powinniśmy zaznaczyć datę swoich urodzin. W ten sposób chcemy sprawdzić ile pełnych lat żyjemy, jaki był wtedy konkretny dzień tygodnia i jaki znak zodiaku jest nam przypisany.
Takie informacje możemy uzyskać pobierając datę urodzenia do zmiennej poziomu modułu, a następnie tworząc właściwości do odczytu. W ten sposób zyskujemy to, że nasze makro główne (osadzone w zwykłym module) będzie odwoływać się nie do stanu poszczególnych kontrolek (w tym przypadku kalendarza) ale do konkretnych właściwości formularza.
Korzyści
Jakie płyną z tego korzyści? Przede wszystkim, w przypadku gdy kontrolkę kalendarza będziemy chcieli zastąpić kontrolkami typu ComboBox, nie będziemy musieli niczego zmieniać poza formularzem, ani w samych właściwościach formularza.
Zmieni się jedynie sposób przypisania wartości do zmiennej poziomu modułu mdtMyBirthDate. W ten sposób warstwa programistyczna zostanie oddzielona od warstwy biznesowej (merytorycznej części projektu).
Jeżeli myślimy o formularzach w kategorii klas powinniśmy odwoływać się do ich właściwości i metod. W ten sposób nasz kod jest czytelny (mimo, że całe rozwiązanie wydaje się na pozór nieco okrężne), zhermetyzowany, uporządkowany i bardzo łatwy w konserwacji.
Kod Formularza
Option Explicit
Dim mbOK As Boolean
Dim mdtMyBirthDate As Date
' Obsługa przycisku OK.
Private Sub cmdOK_Click()
mdtMyBirthDate = Calendar1.Value
If mdtMyBirthDate > Date Then
MsgBox "Wybierz prawidłową datę urodzin!", vbInformation
Exit Sub
End If
mbOK = True
Me.Hide
End Sub
' Obsługa przycisku Anuluj.
Private Sub cmdCancel_Click()
mbOK = False
Me.Hide
End Sub
' Powoduje, że znak [x] zachowuje się tak samo, jak przycisk Anuluj.
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
mbOK = False
Me.Hide
Cancel = True
End If
End Sub
' Zwróć, czy został naciśnięty przycisk OK, czy Anuluj.
Public Property Get OK() As Boolean
OK = mbOK
End Property
' Zwróć po prostu datę urodzin
Public Property Get DateOfBirth() As Date
DateOfBirth = mdtMyBirthDate
End Property
' Zwróć liczbę pełnych lat
Public Property Get Age() As Integer
Age = DateDiff("yyyy", mdtMyBirthDate, Date, vbMonday)
End Property
' Zwróć dzień tygodnia (słownie), w którym się urodziłeś
Public Property Get WeekDay() As String
WeekDay = Format(mdtMyBirthDate, "dddd")
End Property
' Oblicz znak zodiaku
Public Function ZodiacSign() As String
Dim iMonth As Integer
Dim iDay As Integer
iMonth = Month(mdtMyBirthDate)
iDay = Day(mdtMyBirthDate)
If iMonth = 3 Then
If iDay >= 21 Then 'And iDay <= 31 Then
ZodiacSign = "Aries"
Else
ZodiacSign = "Pisces"
End If
ElseIf iMonth = 4 Then
If iDay >= 20 Then 'And iDay <= 30 Then
ZodiacSign = "Taurus"
Else
ZodiacSign = "Aries"
End If
ElseIf iMonth = 5 Then
If iDay >= 21 Then 'And iDay <= 31 Then
ZodiacSign = "Gemini"
Else
ZodiacSign = "Taurus"
End If
ElseIf iMonth = 6 Then
If iDay >= 22 Then 'And iDay <= 30 Then
ZodiacSign = "Cancer"
Else
ZodiacSign = "Gemini"
End If
ElseIf iMonth = 7 Then
If iDay >= 23 Then 'And iDay <= 31 Then
ZodiacSign = "Leo"
Else
ZodiacSign = "Cancer"
End If
ElseIf iMonth = 8 Then
If iDay >= 23 Then 'And iDay <= 31 Then
ZodiacSign = "Virgo"
Else
ZodiacSign = "Leo"
End If
ElseIf iMonth = 9 Then
If iDay >= 23 Then 'And iDay <= 30 Then
ZodiacSign = "Libra"
Else
ZodiacSign = "Virgo"
End If
ElseIf iMonth = 10 Then
If iDay >= 23 Then 'And iDay <= 31 Then
ZodiacSign = "Scorpio"
Else
ZodiacSign = "Libra"
End If
ElseIf iMonth = 11 Then
If iDay >= 22 Then 'And iDay <= 30 Then
ZodiacSign = "Sagittarius"
Else
ZodiacSign = "Libra"
End If
ElseIf iMonth = 12 Then
If iDay >= 22 Then 'And iDay <= 31 Then
ZodiacSign = "Capricorn"
Else
ZodiacSign = "Sagittarius"
End If
ElseIf iMonth = 1 Then
If iDay >= 20 Then 'And iDay <= 31 Then
ZodiacSign = "Aquarius"
Else
ZodiacSign = "Capricorn"
End If
Else 'If iMonth = 2 Then
If iDay >= 19 Then 'And iDay <= 29 Then
ZodiacSign = "Pisces"
Else
ZodiacSign = "Aquarius"
End If
End If
End Function
Kod Wywołujący
Option Explicit
Sub FormAsClassModule()
Dim frmCalendar As UCalendar
Dim dtDOB As Date
Dim iAge As Integer
Dim sWeekDay As String
Dim sZodiacSign As String
Dim sZodiacElement As String
Dim bOK As Boolean
' Utwórz nową kopię formularza
Set frmCalendar = New UCalendar
' Wyświetl formularz i sczytaj informacje do zmiennych
frmCalendar.Show
dtDOB = frmCalendar.DateOfBirth
iAge = frmCalendar.Age
sWeekDay = frmCalendar.WeekDay
sZodiacSign = frmCalendar.ZodiacSign
bOK = frmCalendar.OK
' Teraz możemy usunąć kopię formularza
Unload frmCalendar
' Jeżeli użytkownik kliknął OK wtedy sprawdź jego żywioł
If bOK Then
Select Case sZodiacSign
Case "Taurus", "Virgo", "Capricorn": sZodiacElement = "Earth"
Case "Gemini", "Libra", "Aquarius": sZodiacElement = "Air"
Case "Aries", "Leo", "Sagittarius": sZodiacElement = "Fire"
Case "Cancer", "Scorpio", "Pisces": sZodiacElement = "Water"
End Select
' Wyświetl go w okienku
MsgBox "Your zodiac sign is " & sZodiacSign & vbCr & _
"Your zodiac element is " & sZodiacElement, vbInformation
End If
Set frmCalendar = Nothing
End Sub