Aktuelle Seite:
/vba/vbapflichtfelder.htm
Letzte Änderung: 24.06.2006

Getestet unter Word2000Getestet unter WordXP  
Beispiel anzeigen
Makro/Datei speichern
Print

Wer kennt nicht folgendes Problem:
Da hat man eine umfangreiche Eingabemaske (Userform) erstellt und möchte sicherstellen, dass bestimmte Pflichtfelder auch wirklich gefüllt werden, bevor die Eingabedaten weiterverwendet werden.

Eigentlich kein wirkliches Problem. Einfach beim Verlassen eines Feldes prüfen, ob die Feldlänge größer Null ist oder ungleich einem Leerstring.
Dieses Verhalten ist vielleicht nicht das anwenderfreundlichste, auch wenn es lehrreich ist ;-), es unterbricht aber u.U. die flüssige Dateneingabe und nötigt den Anwender zum wiederholten Schließen des Hinweisdialogs.

Im folgenden wird ein anderer Lösungsweg beschrieben:
Zuerst werden alle Eingaben gesammelt und erst beim Versuch, diese z.B. in die Formularfelder eines Dokumentes einzugeben, dahingehend geprüft, ob die Pflichtfelder überhaupt gefüllt sind. Dazu wird die .Tag-Eigenschaft der Textfelder verwendet, in der als Zeichen des Pflichfeldes der Wert "PF" eingetragen wird. Alternativ könnte auch eine unsichtbare Checkbox pro Pflichtfeld verwendet werden, wodurch jedoch der Aufwand erhöht wird.
In einer Schleife werden alle Pflichtfelder auf Inhalt geprüft. Ist ein Pflichtfeld nicht gefüllt, wird der Name des Feldes in ein Array eingelesen.
Sind alle Pflichtfelder geprüft, wird das Array mit den leeren Feldern zurückgeliefert. Sofern Elemente im Array eingetragen sind, werden alle enthaltenen Felder mit einer Farbe gekennzeichnet, ein Hinweistext aus den Feldnamen zusammengestellt und der Fokus und die Eingabemarke in das erste leere Feld gesetzt.
Aufgrund der Hervorhebung können die leeren Felder vom Anwender anschließend gefüllt werden. Beim Versuch die Daten in das Dokument einzufügen, werden dann erneut alle Felder geprüft und nur die evtl. verbleibenden leeren Felder in das Array aufgenommen usw.
Auf diese Weise wird mithilfe des dynamischen Arrays solange alle leeren Pflichtfelder gesammelt, bis keine mehr vorliegen.

Das folgende Beispiel verwendet das Click-Ereignis der Schaltfläche cmdInsert, mit der die Eingabedaten in die Formularfelder ("TM<Name>") eingefügt werden. Die Prüfung erfolgt in der Funktion  fkt_Pflichtfelder, und nur wenn diese Funktion ein False zurückliefert, wird der Hinweisdialog zusammengesetzt und die weitere Verarbeitung beendet.
Anschließend erfolgt in der Funktion  fkt_IsNumeric die Prüfung des PLZ-Felder auf numerische Werte.

Option Explicit 
Dim aPFelder() As String 
Private Sub cmdInsert_Click() 
Dim msg As String 
Dim i As Integer 
If fkt_Pflichtfelder = False Then 
  If UBound(aPFelder) > 0 Then 
    msg = "Folgende Pflichtfelder sind nicht ausgefüllt" & vbCrLf 
    For i = 1 To UBound(aPFelder)
      msg = msg & " - " & aPFelder(i) & vbCr
      frmEingabe.Controls(aPFelder(i)).BackColor = RGB(255, 255, 0)
    Next i
    MsgBox msg
    frmEingabe.Controls(aPFelder(1)).SetFocus
  End If 
  Exit Sub 
End If 
If fkt_PLZ = False Then Exit Sub 
ActiveDocument.FormFields("TMVorname").Result = txtVorname.Text
ActiveDocument.FormFields("TMNachname").Result = txtNachname.Text
ActiveDocument.FormFields("TMStrasse").Result = txtStrasse.Text
ActiveDocument.FormFields("TMOrt").Result = txtOrt.Text
ActiveDocument.FormFields("TMAnrede").Result = txtAnrede.Text
ActiveDocument.FormFields("TMPLZ").Result = txtPLZ.Text
DoEvents 
With Me 
  .Left = Left - 1
  .Left = Left + 1
End With 
End Sub 

Nach dem Zuweisen der Formularfeld-Inhalte wird ein Trick angewendet, um die Aktualisierung des Dokumentes und somit der Felder zu gewährleisten. Durch die Verschiebung der Userform um jeweils 1 Pixel nach links und wieder zurück, wird die Kontrolle an Word zurückgegeben. Ohne diese Übergabe kann es vorkommen, dass die Formularfeld-Inhalte erst beim Schließen der Userform korrekt aktualisiert werden.

In der Funkion fkt_Pflichtfelder werden nun die einzelnen Felder geprüft. Gleichzeitig erfolgt an dieser Stelle über den Funktionsaufruf  IsAlphaNumeric die Prüfung auf alphanumerische Eingabe. Liefert die Funktion ein False zurück (Feld enthält ungültige Zeichen), wird eine entsprechende Fehlermeldung ausgegeben.

Function fkt_Pflichtfelder() As Boolean 
Dim msg As String 
Dim frmFields As Control 
Dim i As Integer 
ReDim aPFelder(0)
i = 0: fkt_Pflichtfelder = False 
For Each frmFields In frmEingabe.Controls
  If frmFields.Tag = "PF" Then 
    frmFields.BackColor = wdColorWhite
    If frmFields.Text = "" Then 
      i = i + 1
      ReDim Preserve aPFelder(i)
      aPFelder(i) = frmFields.Name
    ElseIf frmFields.Name <> "txtPLZ" Then 
      If IsAlphaNumeric(frmFields.Text) = False Then 
      msg = "Das Feld '" & frmFields.Name & "' besitzt ungültige Zeichen!"
      MsgBox msg, vbCritical, "Eingabefehler"
      frmFields.BackColor = RGB(255, 255, 0)
      frmFields.SetFocus
      Exit Function 
      End If 
    End If 
  End If 
Next frmFields
If UBound(aPFelder()) = 0 Then fkt_Pflichtfelder = True 
End Function 

Zu beachten ist dabei das Format der Eingabefelder:
Als Erweiterung der Pflichtfeldprüfung lässt sich auch der Eingabetyp prüfen. Zu diesem Zweck stellt Word verschiedene Funktionen zur Verfügung; die wichtigste in diesem Fall ist die Funktion IsNumeric(). Mit dieser Funktion wird ein String darauf geprüft, ob nur Zahlen enthalten sind. Leider gibt es jedoch kein Pendant IsAlphaNumeric(), so dass man sich diese Prüfung selber zusammenbasteln muss ( IsAlphaNumeric).
Die Prüfen des Eingabeformats lässt sich entweder mithilfe unterschiedlicher .Tag-Eigenschaften steuern, oder über die Feldnamen.

Function IsAlphaNumeric(ByVal strTest As String) As Boolean  
Dim Text1, Text2, Text3, strZeichen As String 
Dim intZeichen As Integer 
IsAlphaNumeric = True 
Text1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ": Text2 = LCase(Text1) & " -"
': Text3 = "123456789+-/*"  
For intZeichen = 1 To Len(strTest)
strZeichen = (Mid$(strTest, intZeichen, 1))
If InStr(1, Text1 & Text2, strZeichen, 1) = 0 Then 
  IsAlphaNumeric = False 
End If 
Next intZeichen
End Function  

In der Funktion fkt_IsNumeric wird das angegebene Userform-Control auf numerischen Wert geprüft und ggf. eine Fehlermeldung ausgegeben. Gleichzeitig liefert die Funktion das Prüfungsergebnis als boolschen Wert zurück.

Function fkt_IsNumeric(ByRef txtField As Control) As Boolean  
Dim msg, strField As String 
With txtField
  If .Text <> "" Then 
    If IsNumeric(.Text) = True Then 
      strField = "TM" & Right(.Name, Len(.Name) - 3)
      ActiveDocument.FormFields(strField).Result = .Text
      fkt_IsNumeric = True 
      .BackColor = wdColorWhite
    Else 
      fkt_IsNumeric = False 
      msg = "Bitte in das Feld '" & .Name & "' nur Zahlen eintragen!"
      MsgBox msg, vbCritical, "Eingabefehler"
      .BackColor = RGB(255, 255, 0)
      .SetFocus
    End If 
  End If 
End With 
End Function  

Vor allem im Bereich der flexiblen Eingabewert-Prüfung lässt sich bestimmt noch einiges verbessern oder flexibler gestalten und somit viel Freiraum für eingene Lösungen.


 www.chf-online.de/vba/vbapflichtfelder.htm © 2001-11 Christian Freßdorf (Zaphod-Systems)