Musterlösung

So sollte sich nun unser Programm entwickelt haben!

Der Dialog stellt sich wie folgt dar:

Finale

Beispiel:

Option Explicit
 
Private Sub txtNachname_AfterUpdate()
 
    txtNachname.Value = Trim$(txtNachname.Value)
 
End Sub
 
Private Sub txtVorname_AfterUpdate()
 
    txtVorname.Value = Trim$(txtVorname.Value)
 
End Sub
 
Private Sub txtStrasse_AfterUpdate()
 
    txtStrasse.Value = Trim$(txtStrasse.Value)
 
End Sub
 
Private Sub txtOrt_AfterUpdate()
 
    txtOrt.Value = Trim$(txtOrt.Value)
 
End Sub
 
Private Sub txtPlz_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 
    Select Case KeyAscii
           Case 48 To 57 'nichts zu tun
           Case Else     'alles andere verwerfen
                KeyAscii = 0
    End Select
 
End Sub
 
'
Private Sub txtGebDatum_AfterUpdate()
 
    Dim sDate   As String
    Dim dtDate  As Date
 
   'Eingabe "trimmen"
    sDate = Trim$(txtGebDatum.Value)
   'Länge 0 prüfen
    If Len(sDate) > 0 Then
       'Länge <> 10 prüfen
        If Len(sDate) <> 10 Then
           'Hinweis anzeigen
            MsgBox "Ungültige Datumseingabe. Bitte das Format TT.MM.JJJJ verwenden!"
           'Eingabefeld leeren
            txtGebDatum.Value = ""
        Else
           'Gültigkeit des Datums überprüfen
            If Not IsDate(sDate) Then
               'Hinweis anzeigen
                MsgBox "Ungültige Datumseingabe. Bitte das Format TT.MM.JJJJ verwenden!"
               'Eingabefeld leeren
                txtGebDatum.Value = ""
            Else
                dtDate = CDate(sDate)
                MsgBox "Sind sind/werden " & Year(Date) - Year(dtDate) & " Jahre alt!"
            End If
        End If
    End If
 
End Sub
 
Private Sub cmdOK_Click()
    Dim sHinweis As String, lZaehler As Long, ctrControl As TextBox
   'Eingabe für das Feld [Nachname] überprüfen
    If Len(Trim$(txtNachname.Value)) = 0 Then
        If Len(sHinweis) > 0 Then sHinweis = sHinweis & ", " & vbCrLf
        sHinweis = sHinweis & "der Nachname"
        If ctrControl Is Nothing Then Set ctrControl = txtNachname
        lZaehler = lZaehler + 1
    End If
   'Eingabe für das Feld [Vorname] überprüfen
    If Len(Trim$(txtVorname.Value)) = 0 Then
        If Len(sHinweis) > 0 Then sHinweis = sHinweis & ", " & vbCrLf
        sHinweis = sHinweis & "der Vorname"
        If ctrControl Is Nothing Then Set ctrControl = txtVorname
        lZaehler = lZaehler + 1
    End If
   'Eingabe für das Feld [Strasse und Hausnummer] überprüfen
    If Len(Trim$(txtStrasse.Value)) = 0 Then
        If Len(sHinweis) > 0 Then sHinweis = sHinweis & ", " & vbCrLf
        sHinweis = sHinweis & "die Straße"
        If ctrControl Is Nothing Then Set ctrControl = txtStrasse
        lZaehler = lZaehler + 1
    End If
   'Eingabe für das Feld [Postleitzahl] überprüfen
    If Len(Trim$(txtPlz.Value)) = 0 Then
        If Len(sHinweis) > 0 Then sHinweis = sHinweis & ", " & vbCrLf
        sHinweis = sHinweis & "die Postleizahl"
        If ctrControl Is Nothing Then Set ctrControl = txtPlz
        lZaehler = lZaehler + 1
    End If
   'Eingabe für das Feld [Ort] überprüfen
    If Len(Trim$(txtOrt.Value)) = 0 Then
        If Len(sHinweis) > 0 Then sHinweis = sHinweis & ", " & vbCrLf
        sHinweis = sHinweis & "der Ort"
        If ctrControl Is Nothing Then Set ctrControl = txtOrt
        lZaehler = lZaehler + 1
    End If
   'Eingabe für das Feld [Geburtsdatum] überprüfen
    If Len(Trim$(txtGebDatum.Value)) = 0 Then
        If Len(sHinweis) > 0 Then sHinweis = sHinweis & ", " & vbCrLf
        sHinweis = sHinweis & "das Geburtsdatum"
        If ctrControl Is Nothing Then Set ctrControl = txtGebDatum
        lZaehler = lZaehler + 1
    End If
   '-----------------------------------------------------------------
   'Auswertung der vorherigen Prüfungen
   '-----------------------------------------------------------------
    If lZaehler = 1 Then
         sHinweis = _
            "Die Eingaben sind unvollständig, da eine Information fehlt:" & _
             vbCrLf & vbCrLf & sHinweis & "!"
         MsgBox sHinweis, vbExclamation, "Adressenverwaltung"
         ctrControl.SetFocus
    ElseIf lZaehler > 1 Then
         sHinweis = _
            "Die Eingaben sind unvollständig, da " & Str(lZaehler) & _
            " Informationen fehlen:" & vbCrLf & vbCrLf & sHinweis & "!"
         MsgBox sHinweis, vbExclamation, "Adressenverwaltung"
         ctrControl.SetFocus
    Else
        sHinweis = _
            "Die Eingaben sind OK!" & vbCrLf & vbCrLf & "Sie sind aktuell " & _
            Alter(CDate(txtGebDatum.Value)) & " Jahre alt!"
        MsgBox sHinweis, vbInformation, "Adressenverwaltung"
        Unload Me
    End If
End Sub
 
' Profilösung
Private Function Alter(ByVal dtGebDat As Date) As Long
 
    Alter = Year(Now) - Year(dtGebDat) + _
      (DateSerial(Year(Now), _
       Month(dtGebDat), _
       Day(dtGebDat)) > Now)
 
End Function

In dieser Musterlösung wurde die „Profi-Variante für die Altersberechnung eingefügt. Hier können natürlich auch die Minimallösung oder selbst erstellte Funktionen benutzt werden.

Neu in dieser Musterlösung ist in der Prozedur cmdOK_Click() die Nutzung der Objektvariablen ctrControl.
Mit dieser Objektvariablen wird jeweils auf die Textbox referenziert, die leer ist. Damit hat man die Möglichkeit, nach allen Plausibilitätsprüfungen die erste Textbox automatisch zu aktivieren, die leer ist (Ergonomie). Dazu ist es notwendig, sich auch wirklich nur die erste leere Textbox zu merken. Wenn man sich alle leeren Textboxen merkt, so wird auch nur die letzte (leere) Textbox aktiviert.

Man „merkt“ sich eine Textbox, in dem man über die Objektvariable auf die betroffene Textbox verweist:

Set ctrControl =  txtNachname

Objekte werden grundsätzlich über die Set-Anweisung referenziert.
Um auch wirklich nur die erste leere Textbox zu referenzieren, ist es notwendig, vor der Referenzierung zu prüfen, ob die Objektvariable bereits einen Verweis auf eine andere Textbox besitzt. In diesem Fall erfolgt keine erneute Referenzierung, und die erste Zuweisung bleibt bestehen.

Um zu prüfen, ob eine Objektvariable bereits eine Referenz auf eine Control (eigentlich: auf ein Objekt) besitzt, muss man den „Wert“ gegen „Nothing“ vergleichen. Besitzt eine Objektvariable den Wert „Nothing“, wurde sie noch nicht referenziert.

If ctrControl Is Nothing Then Set ctrControl =  txtNachname

Wurde die Objektvariable referenziert, so verweist diese auf eine der Textboxen; und zwar auf die erste, leere Textbox. Um diese Textbox nun zu aktivieren (d.h. den Cursor in das Steuerelement setzen), reicht es aus, die Textbox eigene Funktion SetFocus über die Objektvariable zu benutzen:

ctrControl.SetFocus