Hallo ihr Wissenden!
Ich habe mal wieder eine Frage zu meiner Datenbank und dem zugehörigen VBA-Code.
Ich habe in einem Formular das Feld "Warenbezeichnung".
Über das Ereignis "beim Verlassen" habe ich eine Ereignisprozedur mit dem folgenden VBA-Code erstellt:
If IsNull(Me!Warenbezeichnung) Or Me!Warenbezeichnung = "" Then
MsgBox("Es muss das Feld Warenbezeichnung ausgefüllt werden!")
Me.Warenbezeichnung.SetFocus
Else
Me.AllowEdits = True
DoCmd.RunCommand acCmdSaveRecord
End If
End Sub
Die Messagebox wird mir wie angefordert vom VBA-Code ausgegeben, wenn ich das Feld Warenbezeichnung mit einem Mausklick oder über drücken der Tabulatortaste verlasse. Jedoch wird der Mauscursor nicht wieder in das Feld zurückgesetzt und bleibt im nächsten Steuerelement stehen. Wodran mag dies liegen?
Ich habe die Ereignisprozedur auch schon testweise auf das Ereignis "Bei Fokusverlust" gesetzt und den Befehl Me.Warenbezeichung.SetFocus auf docmd.GoToControl "Warenbezeichnung" geändert, leider vollkommen ohne Auswirkungen: der Cursor springt treu und brav, nachdem die MsgBox wegeklickt wurde, auf das Feld, dass man abgeklickt hat bzw. in das durch das Drücken der Tabulatortaste gesprungen werden soll.
Hat jemand eine Idee, wo hier das Problem liegt?
Gruß
Samurai2_de
Hallo,
um solche Plausi-Prüfungen durchzuführen, ist das BeforeUpdate-Ereignisses des jeweiligen Textfeldes und/oder des Formulars besser geeignet...
Hallo,
wenn du das Verlassen des Feldes verhindern willst, nimm das Exit-Ereignis, dort gibt es (übrigens ebenso wie im BeforeUpdate) eine Cancel-Option.
Beispiel:Private Sub Warenbezeichnung_Exit (Cancel As Integer)
If IsNull(Me!Warenbezeichnung) Or Me!Warenbezeichnung = "" Then
MsgBox("Es muss das Feld Warenbezeichnung ausgefüllt werden!")
Cancel = True
Else
Me.AllowEdits = True
DoCmd.RunCommand acCmdSaveRecord
End If
End Sub
In anderen Fällen hilft es, den Fokus zunächst auf ein anderes Feld zu setzen und dann wieder zurück.
BTW:
Was bezweckst du mit dem ELSE-Zweig, insbesondere mit dem Speichern nach dem Setzen von AllowEdits? Zu dem Zeitpunkt - vorausgesetzt davor konnte noch nichts editiert werden - macht das Speichern keinen Sinn.
Nachtrag:
In diesem Fall ist der Hinweis von Franz natürlich berechtigt.
Hallo!
Vielen Dank für die schnelle Hilfe!
Die Version mit dem Cancel-Befehl funktioniert einwandfrei!
Zur Erklärung des VBA-Codes:
Das Feld Warenbezeichnung ist in meiner Tabelle als Pflichtfeld eingetragen. Ich möchte nun sicherstellen, dass die Datensätze zwischendurch nach dem Ausfüllen bestimmter Felder automatisch gespeichert werden. Ich habe hier ein paar "Spezialisten", die das Speichern gerne mal vergessen.
Durch den VBA-Code soll nun bei Verlassen des Feldes geprüft werden, ob die Daten eingegeben wurde und wenn nicht soll das automatische Speichern abgebrochen werden und der Benutzer dezent (*hust*) auf seinen Fehler hingewiesen werden. Das Feld "Warenbezeichung" ist in meinem Formular das dritte Feld in der Aktivierreihenfolge, die anderen Felder sind ebenfalls Pflichtfelder. Komischerweise wird aber gerade dieses (im Formular sogar optisch recht große) Feld "Warenbezeichung" zu gerne vergessen, während die beiden Felder zuvor immer brav ausgefüllt werden.
Nochmals vielen Dank für eure Hilfe, ich bin wieder einen Schritt weiter!
Gruß
Samurai2_de
Meine Frage nach dem Sinn des "AllowEdits" ist damit nicht beantwortet.
Gibt es irgendwo im Code des Klassenmoduls ein "AllowEdits=False"?
Zitat von: MaggieMay am Januar 22, 2015, 22:22:51
Gibt es irgendwo im Code des Klassenmoduls ein "AllowEdits=False"?
Ah, jetzt habe ich deine Frage verstanden!
Stimmt, wo du mich darauf ansprichst habe ich den Code noch einmal durchgeschaut und kein AllowEdits = False im Code des Klassenmoduls gefunden. Damit ist das AllowEdits = True wohl überflüssig... werde ich gleich mal entfernen. Danke für den Hinweis!
Gruß
Samurai2_de