2
www.ChF-Online.de  

Pflichtfeldprüfung

   Neuigkeiten
   API-Aufrufe in VBA
   VBA2HTML
   Word
   Word-VBA
 Verschiedenes
 Feld-Arbeiten
aktiv aktiv Form-Sachen
 Auflösungs-Erscheinung
 Fenster-Splitter
 Fortschrittliches
 Hyperlinks in Userformen
 Kontextmenü erstellen
aktiv  Pflichtfeldprüfung
 Vorgabewerte ändern
 Menü-/Symbolleisten
 VBA und Lotus Notes
 VBA und Mail
 Inside VBAIDE
 Von Word nach Outlook
 Fix-und-Fertiges/Projekte
   Word2007 (RibbonX)
   Word2010 (RibbonX)
   Outlook-VBA
   Links zu VB(A)
   DocToHelp
   Netport Express XL
   Astronomie
   Gästebuch
   Volltextsuche
   Sitemap
   Buch:Word-Programmierung
   Impressum & Kontakt
   Datenschutzerklärung
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.


 Besucher: 5 online  |  28 heute  |  2628 diesen Monat  |  1593783 insgesamt | Seitenaufrufe: 111   Letzte Änderung: 24.06.2006 © 2001-14 Christian Freßdorf
  Stein der Weisen: Wenn er an den Kopf trifft, tut es weh!
Dieter Thoma
 powered by phpCMS and PAX