Hallo,
ich habe (in Excel 2007) eine Userform.
Auf dieser UserForm befinden sich zwei Frames und - davor - noch zwei Optionsfelder.
Optionsfeld1 sagt „Neuer Fall“, Optionsfeld2 sagt „Erledigung unter Nummer…“. Sobald Optionsfeld2 angeklickt wird erscheint ein Textfeld unter dem eine Nummer eingetragen werden kann.
Bei einem „Neuen Fall“ können in Frame1 Daten eingetragen werden die dann in einer Tabelle gespeichert werden.
Gebe ich im o. g. Textfeld eine Nummer an soll Excel die, unter dieser Nummer vorhandenen, Daten (aus „neuer Fall“) wieder anzeigen und Frame1 deaktivieren.
Aus diesem Grund habe ich in „Textfeld_Exit“ ein Programm eingefügt welches mir die o. g. Aufgabe erfüllen soll. Vorher prüfe ich natürlich, ob unter dieser Nummer bereits etwas gespeichert ist. Dies funktioniert insoweit ordentlich.
Wechsel ich jedoch - nachdem ich in dem Textfeld etwas eingetragen habe - zum Optionsfeld1 wird auch hier wieder die Exit-Anweisung ausgeführt (was wiederum zum Hinweis führt dass die Nummer nicht vorhanden ist oder die Werte in Frame1 eingetragen werden). Dies möchte ich jedoch in diesem einen Fall nicht.
Wie kann ich das jedoch verhindern? Oder wie kann man das besser codieren?
LG Tobi@s
Hallo Tobias,
du könntest versuchen, den Ablauf mit einer Variable vom Typ Boolean zu steuern.
Die Variable deklarierst du als
Private bolDoNothing As Boolean
oberhalb aller Prozeduren im Codemodul des Userforms.
Diese Variable hat normalerweise den Wert False.
Wenn du möchtes, das bestimmte Ereigninis-Prozeduren temporär nicht ausgeführt werden sollen, dann setzt du den Wert der Variablen auf True.
Sobald die Ereignis-Prozeduren wieder aktiv werden sollen setzt du den Wert der Variablen wieder auf False.
In allen Ereignisprozeduren, die temporär sofort wieder verlassen werden sollen, fügst du zu Beginn eine Prüfung auf den Wert der Variablen ein. Ist der Wert True dann wird per Exit die Prozedur sofort wieder verlassen.
Gruß
Franz
Beispiel:
Option Explicit
Private bolDoNothing As Boolean 'Variable zur temporären Deaktivierung von Ereignisprozeduren
Private Sub cmbEintragen\_Click()
Dim lngZeile As Long
'Commandbutten zum Eintragen der eingegebenen Daten in Tabelle
lngZeile = 2
Worksheets(1).Cells(lngZeile, 1).Value = CLng(Me.TextBox1.Text)
'usw.
'Textbox-Exit-Makro wieder scharf schalten
bolDoNothing = False
End Sub
Private Sub TextBox1\_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If bolDoNothing = True Then Exit Sub
bolDoNothing = True
'ab hier dann der normal auszuführende Code
MsgBox "Text-Exit-Box"
End Sub
Hallo Franz,
du könntest versuchen, den Ablauf mit einer Variable vom Typ
Boolean zu steuern.
ich versteh deinen Gedankengang. Nur verstehe ich nicht: wie soll ich dem Exit-Ereignis nun beibringen dass ich mal „richtig“ das Feld verlasse (um weiter zu berechnen etc.) und dass ich es mal „falsch“ verlasse (um eben wieder zu „neu“ zu gehen und alle Eingaben wirkungslos sind)?
Denn das Ereignis kommt ja noch bevor ich etwas anderes tun kann. Sprich: ich habe mMn kein Hinweis dass ich es „falsch“ verlassen habe. Wenn zb der Fokus auf „Optionsfeld1“ bereits läge könnte ich das als Test benutzen.
Eine Hilfslösung habe ich mir bereits ausgedacht: ich lösche das Exit-Ereignis wieder und erstelle dafür eine Schaltfläche. Und wenn der Nutzer die Daten sehen möchte soll er sie anklicken und nur dann zeigt er die Daten an. Die Prüfung ob die Zahl richtig ist kann in diesem Fall dann dort prüfen oder wenn ich die Ergebnisdaten zu der (hoffentlich vorhandenen) Nummer eben eingeben möchte letztendlich.
Trotzdem bleibt für mich die Frage mit dem Exit-Ereignis. Vielleicht kann ichs auch in anderen Momenten ja mal nutzen oder so 
LG Tobi@s
Hallo Tobias,
wenn ich dich richtig verstanden habe, dann machst du mit der Textbox eine Datensatzauswahl.
Jetzt ist das Ergebnis:
- Datensatz gefunden
mit dem gefundenen Datensatz soll ja jetzt irgend etwas gemacht werden(Daten ergänze und speichern oder sonst etwas) also wird mit dem Exit-Ereignis der Textbox nach meinem Schema die Variable auf True gesetzt.
oder
- keinDatensatz gefunden
die Variable bleibt auf False, es kann also gleich wieder ein Wert in der Textbox eingegeben und verarbeitet werden.
Wenn jetzt die Eingabe für den gefundenen Datensatz abgeschlossen wird, z.B. mit einer Schaltfläche, dann wird im Code zu der Schaltfläche die Variable wieder auf False gesetzt. Danach kann dann wieder eine Eingabe in der Textbox verarbeitet werden.
Gruß
Franz
Hallo Franz,
wenn ich dich richtig verstanden habe, dann machst du mit der
Textbox eine Datensatzauswahl.
also ich gebe dort die „laufende Nummer“ ein unter der bereits Daten gespeichert sind. Aber soweit ist es richtig.
Jetzt ist das Ergebnis:
- Datensatz gefunden
mit dem gefundenen Datensatz soll ja jetzt irgend etwas
gemacht werden(Daten ergänze und speichern oder sonst etwas)
also wird mit dem Exit-Ereignis der Textbox nach meinem Schema
die Variable auf True gesetzt.
oder
- keinDatensatz gefunden
die Variable bleibt auf False, es kann also gleich wieder ein
Wert in der Textbox eingegeben und verarbeitet werden.
Wenn jetzt die Eingabe für den gefundenen Datensatz
abgeschlossen wird, z.B. mit einer Schaltfläche, dann wird im
Code zu der Schaltfläche die Variable wieder auf False
gesetzt. Danach kann dann wieder eine Eingabe in der Textbox
verarbeitet werden.
soweit habe ich das auch ohne Variable raus
Ich brauch ja nur prüfen ob das Textfeld leer ist (2). Ist nichts drin prüft er auch nichts.
Nun ist aber das Problem: Nutzer möchte Nummer 1145 eintippen und fängt an. Nachdem er bereits „11“ geschrieben hat merkt er: ne, haut nicht hin, ist nicht der Fall; ich brauch doch neue Nummer (ist zwar unwahrscheinlich, möchte aber - bei unseren Nutzern *ggg* - auf Nummer sicher gehen). Jetzt klickt er auf „Neuer Fall“ und verlässt das Textfeld.
Textfeld_Exit prüft: aha, nicht leer also prüfen. Nummer 11 gibt es, also Daten eintragen. Und genau das soll er eben nicht machen 
Und da hilft mMn die Variable auch nichts, denn ich habe ja keine Gelegenheit irgendwann mal den Grund für „false“ festzulegen. Denn wenn der Nutzer tatsächlich Fall 11 haben möchte dann soll er es ja korrekt prüfen …
LG Tobi@s