Musterlösung
So sollte sich nun unser Programm entwickelt haben!
Der Dialog stellt sich wie folgt dar:

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