Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
864to868
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
864to868
864to868
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Probleme beim UserForm schließen /

Probleme beim UserForm schließen /
29.04.2007 21:34:14
Lenhard
Moin Moin!
Ich habe schon so einige UserForm erstellt und in diese einen "Abbrechen"-Button (hier "CommandButton1") integriert. Mit folgenden Code habe ich das UserForm immer geschlossen:

Private Sub CommandButton1_Click()
Unload Me
End Sub


Nun habe ich aber etwas neues in einem neuen UserForm erstellt: TextBox'en mit Pflichteingaben. Wenn ich nun das UserForm über diesen "Abbrechen"-Button schließen will und in einer TextBox mit Pflichteingabe steht zu diesem Zeitpunkt nix, dann klappt das Abbrechen nur, wenn ich zuvor etwas in die betreffende TextBox eingegeben habe.
Ich will aber einen Abbruch, egal in welchen Zuständen sich das UserForm und/oder die Bestandteile des UserForms befinden.
Hat da jemand eine Lösung für mich?
Gruß aus dem hohen Norden!
Lenhard

32
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Probleme beim UserForm schließen /
29.04.2007 21:37:00
Josef
Hallo Lenhard,
poste doch den gesamten Code des UF, oder sollen wir raten?
Gruß Sepp

AW: Probleme beim UserForm schließen /
29.04.2007 21:44:00
Oberschlumpf
Hi Lenhard
Ich denke, du benötigst gar keinen Abbrech-Button, da ja ein Klick ins kleine x oben rechts auch das Schließen des UFs übernimmt.
Aber du benötigst einen Button, der halt alle Eingaben überprüft, und wenn alles ok ist, wird der Code weiter ausgeführt - wenn noch Eingaben fehlen, wird mit einer MsgBox eben darauf hingewiesen.
Aber das Schließen des UFs wird eigtl durch programmierte Pflichteingaben nicht beeinflosst, da diese Pflichteingaben eben nur dirch den einen Button kontrolliert werden.
Konnte ich dir helfen?
Wenn nicht, kannst du ja deine Datei mal uploaden. Denn wir sehen ja nicht, welchen weiteren Code du wo hin geschrieben hast.
Ciao
Thorsten

Anzeige
AW: Probleme beim UserForm schließen /
29.04.2007 22:10:00
Lenhard
Erst mal vielen Dank für Eure Reaktionen! ...aber den ganzen Code hier posten... ...Puuuhhh...
Das mit dem "Zu-x'en" oben rechts des UserForms klappt auch nicht, Thorsten. Ist auch nur eine TextBox mit einer Pflichteingabe leer, dann muss ich erst etwas in diese eingeben, bevor ich das UserForm via meinem "Abbrechen"-Button schließen kann.
Den gesamten Code hier posten. Da muss ich noch mal schauen, Sepp.
Gruß
Lenhard

AW: Probleme beim UserForm schließen /
29.04.2007 22:13:59
Josef
Hallo Lenhard,
wenn du willst das man die hilft, dann kannst du uns den Code nicht vorenthalten.
es muss auch nicht der gesamte Code sein, aber zumindest die Teile die mit der Pflichteingabe und dem Schließen zusammenhängen.
Gruß Sepp

Anzeige
AW: Probleme beim UserForm schließen /
29.04.2007 22:35:56
Lenhard
Hallo Sepp!!
So, ich habe mir nun den gesamten Code des UserForm noch mal vorgenommen. Zunächst hier der Code, der dafür sorgt das in einer TextBox des UserForms ein Datum eingetragen werden muss:

Private Sub txtBoxDatum_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With txtBoxDatum
If Not IsDate(.Text) Or .Text = "" Then
MsgBox "Bitte geben Sie ein gültiges Datum ein!", 64, "Fehler"
Cancel = True
.Text = Format(Date, "dd.mm.yyyy")
.SelStart = 0
.SelLength = Len(.Text)
End If
End With
End Sub


Und wenn nun in der TextBoxDatum kein Datum steht, dann kann ich das UserForm auch nicht mehr über den CommandButton1 schließen, welches mit folgenden Code arbeitet:


Private Sub CommandButton1_Click()
Unload Me
End Sub


Vielen Dank im Voraus!
Gruß
Lenhard

Anzeige
AW: Probleme beim UserForm schließen /
30.04.2007 03:44:00
Luschi
Hallo Lenhard,
Dein Problem kannst Du so lösen:

'Im Modulkopf des Formulars
Dim abbrOK As Boolean
Private Sub UserForm_Initialize()
abbrOK = False
End Sub
Private Sub txtBoxDatum_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not abbrOK Then
With Me.txtBoxDatum
If Not IsDate(.Text) Or .Text = "" Then
MsgBox "Bitte geben Sie ein gültiges Datum ein!", 64, "Fehler"
Cancel = True
.Text = Format(Date, "dd.mm.yyyy")
.SelStart = 0
.SelLength = Len(.Text)
End If
End With
End If
End Sub
Private Sub CommandButton1_Click()
abbrOK = True
Unload Me
End Sub

Die Variable abbrOK wird beim Initialisieren auf "Falsch" gesetzt. Deshalb muß beim Ereignis "Verlassen der Textbox"
mit "If Not abbrOK" getestet werden.
Man könnte das Ganze auch Umdrehen; also abbrOK auf "Wahr" setzen und dann mit "If abbrOK" testen.
Aber ich bin ein Verneinungs-Fetischist und stelle mir die Frage: "darf Abgebrochen werden?"
Ist die Antwort "Nein", so soll die Variable auch "Nein" als Inhalt haben.
Man könnte statt "If Not abbrOK" auch "If abbrOK = False" schreiben, aber da jeder Ausdrucks-Vergleich mit einem Wahrheitswert endet, ist die 1. Variante zu bevorzugen. Denn hier wird nur 1mal verglichen, während bei der 2. Variante 3 Arbeitsschritte notwendig sind.
1. Wert von abbrOK ermitteln
2. abbrOk mit dem logischen Wert "False" vergleichen
3. ist dieser Vergleich "Falsch" oder "Wahr"
4. jetzt entscheiden ob die If-Verzweigung ausgeführt werden muß
Das geschieht immer dann, wenn der 3. Schritt "Wahr" ergibt
Bei der 1. Variante kommt gleich "Wahr" oder "Falsch" heraus und somit sind nur der 3. und 4. Schritt erforderlich.
Leider sieht man auch in der Excel-Hilfe und im Internet-MSDN immer mehr die 2. Variante als Lösung.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Probleme beim UserForm schließen /
30.04.2007 08:25:00
Erich
Hallo Luschi,
hast du deine Lösung wirklich ausprobiert?
Wenn abbrOK = True gesetzt wird, wird sofort danach die UF mit "Unload Me" geschlossen,
der Textbox-Code hat überhaupz keine Chance, den auf True gesetzten Wert abzufragen.
Umgekehrt: Der Code des Abbrechen-Buttons kann erst laufen, nachdem die Textbox verlassen wurde.
Das aber wird durch die Prüfung im Textbox_Exit verhindert, der Benutzer bleibt in der Textbox "gefangen".
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: Probleme beim UserForm schließen /
30.04.2007 22:54:41
Lenhard
Hallo Luschi!
Schaust Du hier noch mal rein? ...ich hatte Dich gebeten mir noch mal zu erklären was der "Modulkopf des Formulars" ist.
Wenn es Dir nix ausmacht, würde ich mich wirklich sehr freuen, noch mal kurz von Dir zu hören.
Danke und viele Grüße aus dem hohen Norden
Lenhard

Anzeige
AW: Probleme beim UserForm schließen /
30.04.2007 08:40:00
Erich
Hallo Lenhard,
das Problem ist IMHO weniger ein programmtechnisches als ein logisches, gedankliches.
Einerseits erzwingst du im Textbox_Exit unbedingt die Eingabe eines Datums,
andererseits soll der Benutzer die UF auch ohne Datumseingabe verlassen können.
Was passiert, wenn der Benutzer die Textbox überhaupt nicht anspricht?
Dann wird auch nicht auf Datum geprüft - der Benutzer kann die UF irgendwie verlassen.
Nur wenn er (vielleicht versehentlich) in die Textbox klickt, bleibt er dort gefangen,
bis er ein Datum eingibt.
Tatsächlich willst du die Eingabe des Datums nur bedingt sicherstellen:
Das Datum muss nur dann vorhanden sein, wenn NICHT auf Abbrechen geklickt wird,
sondern die UF anders (etwa per OK-Button) verlassen wird.
Was soll mit dem Datum geschehen, wo wird es gebraucht?
Wenn es nur in eine Zelle eingetragen werden soll, ginge das z. B. so:
https://www.herber.de/bbs/user/42133.xls
Wenn es im Code der UF irgendwo gebraucht wird, muss man eben dort - vor der Verwendung - prüfen.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Probleme beim UserForm schließen /
30.04.2007 11:21:34
Lenhard
Vorweg: Vielen Dank für Eure Hilfen, Luschi und Erich!
Du hast es richtig formuliert, Erich: Ich bin in der TextBox "gefangen". Ich verstehe auch die Logik warum, aber habe noch zu wenig VBA-Wissen drauf mir den entscheidenden Code zu erstellen, der eine Ausnahme für dieses Problem kreiert.
Deinen Vorschlag habe ich ausprobiert, Luschi. Leider noch ohne Erfolg, bin aber noch am experimentieren. Folgendes kann ich allerdings noch nicht unterbringen:
'Im Modulkopf des Formulars
Dim abbrOK As Boolean
...ich bin ehrlich: Was ist denn nun der "Modulkopf"? Ihr merkt, zahlreiche Grundlagen muss ich auch erst noch verstehen. Magst mir das bitte noch mal erklären. Danke! ...und am besten mir gleich "Mundgerecht" per geschriebenen anbieten.
Ich habe mich sehr über die zusätzlichen Erklärungen von Euch beiden gefreut!! Das hilft mir wirklich sehr!! Vielen vielen Dank!
Jetzt schau ich mir Erichs Vorschlag mit dem Link zur Excel-Datei an. Auf alle Fälle kommt eine Rückmeldung von mir. Da ich allerdings zwischendurch auch noch zur Arbeit muss, kann es bei mir immer einwenig dauern.
Viele Grüße
Lenhard

Anzeige
AW: Probleme beim UserForm schließen /
30.04.2007 11:47:00
Lenhard
Hallo Erich!
Ich habe mir Deine Excel-Datei angesehen. Ja! ...so sollte es funktionieren. Sehr schön! Aber leider kann ich Deinen Vorschlag - noch nicht - umsetzen, da ich natürlich mehrere Textboxen und ComboBoxen mit Pflichteingabe im UserForm habe. Bei klick auf meinen OK-Button wird folgender Code aktiviert:
Private Sub CommandButton1_Click() ' IST NUN BEI MIR DER OK-BUTTON
Dim lz As Integer
Application.ScreenUpdating = False
With Sheets("Röntgendokumentation")
' ActiveSheet.Unprotect
lz = .Range("B:O").Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row + 1 'Prüft ob eine Zeile kpl. frei ist
.Cells(lz, 2) = WorksheetFunction.Max(Range(.Cells(5, 1), .Cells(lz, 2))) + 1 'Realisiert die fortlaufende Nummerierung in Spalte B
.Cells(lz, 3) = CDate(textBoxDatum)
.Cells(lz, 4) = ComboBoxStation
.Cells(lz, 5) = TextBoxNachname
.Cells(lz, 6) = TextBoxVorname
.Cells(lz, 7) = CDate(TextBoxGebDat)
.Cells(lz, 8) = ComboBoxUntersuchung
.Cells(lz, 9) = ComboBoxArzt
.Cells(lz, 10) = ComboBoxPflege01
.Cells(lz, 11) = ComboBoxPflege02
.Cells(lz, 12) = TextBoxKV
.Cells(lz, 13) = TextBoxMA
.Cells(lz, 14) = TextBoxMin
.Cells(lz, 15) = TextBoxGRay
.Cells(lz, 16) = TextBoxBilderAnzahl
' ActiveSheet.Protect
End With
Unload Me
End Sub

Was passiert, wenn der Benutzer die Textbox überhaupt nicht anspricht?
Dann wird auch nicht auf Datum geprüft - der Benutzer kann die UF irgendwie verlassen.
Nur wenn er (vielleicht versehentlich) in die Textbox klickt, bleibt er dort gefangen,
bis er ein Datum eingibt.


Wenn die bzw. eine TextBox überhaupt nicht angesprochen wird, kann ich ohne Probleme das UserForm schließen. Sobald man einmal in einer TextBox mit Pflichteingabe reingeht, ist man in dieser "gefangen".
Vielen Dank Erich!
Gruß
Lenhard

Anzeige
AW: UserForm-Eingaben prüfen
30.04.2007 18:44:00
Erich
Hallo Lenhard,
hier habe ich mal beispielhaft drei Prüfungen eingebaut, für Datum, Nachname und GebDatum.
Schlägt eine der Prüfungen fehl, bekommt die fehlerhafte Box den Focus, die Prozedur wird beendet,
die UF also nicht geschlossen.
Die Prüfungen können aufeinander aufbauen (wie im Beispiel: GebDatum >= Datum).
Erst wenn alle Prüfungen erfolgreich durchlaufen sind, erfolgt eine Ausgabe.
Damit vermeidest du unvollständige Zeilen in der Tabelle.
Beim Abbrechen-Button wird die UF unbesehen geschlossen.
Der Code ist ungetestet - ich habe deine UF nicht nachgebaut.

Option Explicit
Private Sub CommandButton1_Click()              ' OK-Button
Dim lz As Integer, wsRD As Worksheet
' --------------------------------------------------------------------- Prüfungen
With txtBoxDatum
If IsDate(.Text) Then   ' verwende Datum, z. B.
MsgBox "Bitte geben Sie ein gültiges Datum ein!", 64, "Fehler"
.SetFocus
.Text = Format(Date, "dd.mm.yyyy")
.SelStart = 0
.SelLength = Len(.Text)
Exit Sub
End If
End With
With TextBoxNachname
If Len(.Text)  CDate(txtBoxDatum) Then
MsgBox "Das Geburtsdatum kann nicht vor dem obigen Datum liegen!", 64, "Fehler"
.SetFocus
.SelStart = 0
.SelLength = Len(.Text)
Exit Sub
End If
Else
MsgBox "Bitte geben Sie ein gültiges Geburtsdatum ein!", 64, "Fehler"
.SetFocus
Exit Sub
End If
End With
' --------------------------------------------------------------------- Ausgabe
Application.ScreenUpdating = False
With Sheets("Röntgendokumentation")
'Prüft ob eine Zeile kpl. frei ist
lz = .Range("B:O").Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row + 1
'Realisiert die fortlaufende Nummerierung in Spalte B
.Cells(lz, 2) = WorksheetFunction.Max(Range(.Cells(5, 1), .Cells(lz, 2))) + 1
'.Unprotect
.Cells(lz, 3) = CDate(.Text)
.Cells(lz, 4) = ComboBoxStation ' ohne Prüfung
.Cells(lz, 5) = .Text
.Cells(lz, 6) = TextBoxVorname ' ohne Prüfung
.Cells(lz, 7) = CDate(.Text)
.Cells(lz, 8) = ComboBoxUntersuchung ' ohne Prüfung
.Cells(lz, 9) = ComboBoxArzt
.Cells(lz, 10) = ComboBoxPflege01
.Cells(lz, 11) = ComboBoxPflege02
.Cells(lz, 12) = TextBoxKV
.Cells(lz, 13) = TextBoxMA
.Cells(lz, 14) = TextBoxMin
.Cells(lz, 15) = TextBoxGRay
.Cells(lz, 16) = TextBoxBilderAnzahl
'.Protect
End With
Unload Me
Set wsRD = Nothing
Application.ScreenUpdating = True
End Sub
Private Sub CommandButton2_Click()              ' Abbrechen
Unload Me
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: UserForm-Eingaben prüfen
30.04.2007 23:48:00
Lenhard
Ohhhh Erich! Sorry! Dieser Beitrag von Dir ist irgendwie von mir übersehen worden. KEINE BÖSE ABSICHT!!
Ich bin nun schon seit Stunden dabei, Deine Ideen umzusetzen. Ich glaube, es FUNKTIONIERT!!! ...aber wenn alles integriert ist und alle Tests abgeschlossen sind, melde ich mich noch mal Dir.
Aber erst mal vorweg: Vielen Dank für Deine Mühe!!!
Gruß
Lenhard

AW: UserForm-Eingaben prüfen
01.05.2007 08:08:00
Erich
Hallo Lenhard,
ich hoffe, du hast noch nicht zu viel Zeit in die Integration gesteckt. Da waren noch ein paar Ungereimtheiten drin.
(war ja ungestestet...)
Ich habe eine UF mit drei Boxen nachgebaut und den Code dafür überarbeitet:

Option Explicit
' In den BeforeUpdate-Prozeduren wird sichergestellt, dass die jeweilige Box
' keinen unzulässigen Wert enthält.
' (Es muss nichts eingegeben werden. Wenn etwas eingegeben wird, muss es gültig sein.)
' Bei Datums-Boxen mit gültigem Datum wird das Datum ins Standardformat gebracht.
'   (Wenn man z. B. 4-5-6 eingibt, erscheint 04.05.2006)
Private Sub txtBoxDatum_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
With txtBoxDatum
If .Text = "" Then Exit Sub   ' "Leer" ist hier erlaubt
If IsDate(.Text) Then
.Text = CDate(.Text)       ' Standardformat
Else
MsgBox "Bitte geben Sie ein gültiges Datum ein!", 64, "Fehler"
Cancel = True
End If
End With
End Sub
Private Sub TextBoxNachname_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
If Len(TextBoxNachname.Text) = 1 Then
MsgBox "Nachnamen mit nur einem Zeichen sind nicht möglich!", 64, "Fehler"
Cancel = True
End If
End Sub
Private Sub TextBoxGebDat_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
With TextBoxGebDat
If .Text = "" Then Exit Sub
If IsDate(.Text) Then
.Text = CDate(.Text)
Else
MsgBox "Bitte geben Sie ein gültiges Geburtsdatum ein!", 64, "Fehler"
Cancel = True
End If
End With
End Sub
' In der OK-Prozedur wird geprüft, ob alle Muss-Boxen Werte enthalten.
'  (WENN ein Wert drinsteht, ist er gültig, wurde geprüft in BeforeUpdate.)
' Beim Geburtsdatum wird zusätzlich geprüft, ob es sich mit dem Datum verträgt.
'  (Dann ist schon sicher, dass txtBoxDatum ein gültiges Datum enthält.)
Private Sub CommandButton1_Click()              ' OK-Button
Dim lz As Integer
' --------------------------------------------------------------------- Prüfungen
With txtBoxDatum
If .Text = "" Then
MsgBox "Bitte geben Sie ein Datum ein!", 64, "Fehler"
.SetFocus
.Text = Format(Date, "dd.mm.yyyy")
.SelStart = 0
.SelLength = Len(.Text)
Exit Sub
End If
End With
With TextBoxNachname
If .Text = "" Then
MsgBox "Bitte geben Sie einen Nachnamen ein!", 64, "Fehler"
.SetFocus
Exit Sub
End If
End With
With TextBoxGebDat
If .Text = "" Then
MsgBox "Bitte geben Sie ein Geburtsdatum ein!", 64, "Fehler"
.SetFocus
Exit Sub
Else
If CDate(.Text) > CDate(txtBoxDatum) Then
MsgBox "Das Geburtsdatum kann nicht vor dem obigen Datum liegen!", 64, "Fehler"
.SetFocus
Exit Sub
End If
End If
End With
' --------------------------------------------------------------------- Ausgabe
Application.ScreenUpdating = False
With Sheets("Röntgendokumentation")
'Prüft ob eine Zeile kpl. frei ist
lz = .Range("B:O").Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row + 1
'Realisiert die fortlaufende Nummerierung in Spalte B
.Cells(lz, 2) = WorksheetFunction.Max(Range(.Cells(5, 1), .Cells(lz, 2))) + 1
'.Unprotect
.Cells(lz, 3) = CDate(txtBoxDatum.Text)
'  .Cells(lz, 4) = ComboBoxStation
.Cells(lz, 5) = TextBoxNachname.Text
'  .Cells(lz, 6) = TextBoxVorname
.Cells(lz, 7) = CDate(TextBoxGebDat.Text)
'  .Cells(lz, 8) = ComboBoxUntersuchung
'  .Cells(lz, 9) = ComboBoxArzt
'  .Cells(lz, 10) = ComboBoxPflege01
'  .Cells(lz, 11) = ComboBoxPflege02
'  .Cells(lz, 12) = TextBoxKV
'  .Cells(lz, 13) = TextBoxMA
'  .Cells(lz, 14) = TextBoxMin
'  .Cells(lz, 15) = TextBoxGRay
'  .Cells(lz, 16) = TextBoxBilderAnzahl
'.Protect
End With
Unload Me
Application.ScreenUpdating = True
End Sub
Private Sub CommandButton2_Click()              ' Abbrechen
Unload Me
End Sub

Und hier meine Mappe - zum Ausprobieren:
https://www.herber.de/bbs/user/42156.xls
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: UserForm-Eingaben prüfen
01.05.2007 10:44:00
Lenhard
Moin Erich!
Ich war schon dabei! ...und ich finde es total toll, dass Du Du mir so hilfst. Ungereimtheiten habe ich gefunden, konnte sie aber aufgrund meines bereits erworbenen Wissens selber korrigieren. Sei ehrlich, Du machst das wie früher in der Schule: Wenn der Lehrer etwas falsch an die Tafel geschrieben hatte, dann wollte er nur testen, ob die Schüler aufpassenn und sich melden... Oder?! :-)) ...kleiner Scherz! Erich.
Vorab soviel: Deine Hilfe ist eine wirkliche Hilfe! Es läuft!!!
Selbstverständlich werde ich mich auch mit Deinem neuen Skript auseinandersetzen. Das wird aber ein paar Tage dauern (...vermute ich mal).
Egal wie: Du wirst eine Rückmeldung erhalten!! Ich werde wahrscheinlich noch einige Fragen haben. Z.B. CDate sorgt dafür, dass Werte aus einer TextBox im Datumformat in eine Tablle übergeben werden. Was ist z.B. dafür verantwortlich, das im Zahlenformat übergeben wird? Mit und ohne Komma.
Vielen vielen Dank! Erich
Gruß
Lenhard
Vielen Dank Erich!

AW: UserForm-Eingaben prüfen
01.05.2007 10:56:00
Erich
Hallo Lenhard,
danke für deine Rückmeldung!
Dein kleiner Scherz war tatsächlich ein Scherz - ich hatte schlampig programmiert und nicht getestet...
Zu deiner Frage: CDate macht aus einem Text ein Excel-Datum (ist auch eine Zahl).
Wenn du kein Datum, aber eine Zahl in die Tabelle schreiben willst, dann geht das mit
Cells(...) = CLng(TextBoxXY)
Ob dann Kommata und/oder Nachkommastellen angezeigt werden,
hängt nur vom Zahlenformat der Zelle ab.
Grüße von Erich aus Kamp-Lintfort

AW: UserForm-Eingaben prüfen
01.05.2007 13:28:00
Lenhard
Nee nee Erich! ...schlampige Programmierung ist was anderes. Das ist schon richtig gut, was Du da machst.
Danke für den CLng-Tip. Den werde ich auf alle Fälle anwenden können!!!
Ich habe noch eine Frage: Ist es möglich (Nur wenn es nicht allzuviel Mühe macht!!) eine kleine Prüfung bzgl. der Zeichen-Anzahl mit einzubauen?
Also die TextBoxNachname auf z.B. 20 Zeichen zu begrenzen. Bei Nichtbeachtung eine Message-Box mit dem entsprechenden Hinweis zu starten. Dann die automatische Rückkehr in die TextBoxName zwecks Änderung zu realiesieren, so das alles gleich markiert ist.
UND NUN KOMMTS: Ohne wieder in der TextBox gefangen zu sein, wenn man vor der Änderung der Zeichenanzahl auf "Abbrechen" geht....
Wenn ich da nämlich folgenden Code einbaue...

Private Sub TextBoxNachname_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Application.ScreenUpdating = False      'Begrenzt die Anzahl der Zeichen in der  _
TextBoxNachname auf 20
If TextBoxNachname.TextLength > 20 Then
MsgBox "Die Eingabe ist auf 20 Zeichen begrenzt!", 64, "Fehler"
Cancel = True
End If
Application.ScreenUpdating = True
End Sub


....bin ich nämlich wieder gefangen!!
Ich habe auch versucht, Teile dieses Codes einfach in Dein Skript an entsprechender Stelle mit dazu zu setzen... ...muss ich noch das Ergebnis mitteilen... :-))
Gruß
Lenhard

AW: UserForm-Eingaben prüfen
01.05.2007 14:09:22
Erich
Hallo Lenhard,
du hast zwei Möglichkeiten:
Entweder prüfst du die "Zeichenzahl <= 20" in einem Textbox-Ereignis
und verhinderst das Verlassen der Textbox bei mehr als 20 Zeichen (das bedeutet: Gefangen!)
oder du prüfst die Zeichenzahl erst beim OK-Button_Click und schickst den User dann ggf. zurück in die Textbox.
Dann stehen zeitweilig falsche Date in der UF.
Ich würde Variante 1 bevorzugen. Dazu brauchst du nur in meinem TextBoxNachname_BeforeUpdate
statt
If Len(TextBoxNachname.Text) = 1 Then
schreben:
If Len(TextBoxNachname.Text) <= 20 Then
Schau dir dazu auch mal meine Antwort an Thorsten an.
Noch eine Richtigstellung: Für Zahlen ist CDbl(TextBoxXY) richtig, nicht CLng(TextBoxXY).
CLng würde immer auf ganze Zahlen runden, aber es soll ja auch Nachkommastellen geben...
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: UserForm-Eingaben prüfen
01.05.2007 17:21:51
Lenhard
Hallo Erich!
Erinnerst Du Dich an meine Frage, wie eine TextBox eine Zahl in das Tabellenblatt übergibt? Nun, mit CDbl erhalte ich die Fehlermeldung "Debuggen" bzw. Laufzeitfehler. Das löst ? in mir aus.
Ich beziehe mich darauf:
With Sheets("Tabelle")
' ActiveSheet.Unprotect
lz = .Range("B:P").Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row + 1 'Prüft ob eine Zeile kpl. frei ist
.Cells(lz, 2) = WorksheetFunction.Max(Range(.Cells(5, 1), .Cells(lz, 2))) + 1 'Realisiert die fortlaufende Nummerierung in Spalte B
.Cells(lz, 3) = CDate(TextBoxDatum)
.Cells(lz, 4) = ComboBoxStation
.Cells(lz, 5) = TextBoxNachname
.Cells(lz, 6) = TextBoxVorname
.Cells(lz, 7) = CDate(TextBoxGebDat)
.Cells(lz, 8) = ComboBoxUntersuchung
.Cells(lz, 9) = ComboBoxArzt
.Cells(lz, 10) = ComboBoxPflege01
.Cells(lz, 11) = ComboBoxPflege02
.Cells(lz, 12) = CDbl(TextBoxKV)
.Cells(lz, 13) = CDbl(TextBoxMA)
.Cells(lz, 14) = CDbl(TextBoxMin)
.Cells(lz, 15) = CDbl(TextBoxGRay)
.Cells(lz, 16) = CDbl(TextBoxBilderAnzahl)
' ActiveSheet.Protect
End With
Muss ich da noch etwas weiteres beachten?
Die TextBoxen "TextBoxKV" bis "TextBoxBilderAnzahl" sind übrigens keine Pflichteibgaben mehr.
Wenn ich allerdings eine reine Zahleneingabe (auch mit Komma!) erzwingen könnte im Falle einer evtl. Eingabe, wäre das sehr von Vorteil.
Magst Du mir bitte noch mal helfen? Danke!
Gruß
Lenhard

AW: UserForm-Eingaben prüfen
01.05.2007 18:02:57
Erich
Hi Lenhard,
hier habe ich das mal beispielhaft für TextBoxKV (nur Zahlen, keine Pflichteingabe) umgesetzt:
https://www.herber.de/bbs/user/42169.xls
Neu (und im UF-Code mit "### NEU" gekennzeichnet) sind die Prüfprozedur für die Textbox
und die Ausgabezeile in der OK-Prozedur. Hier wird nichts ausgegeben, wenn die Box leer ist.
Das Darstellungsformat in der Tabelle legst du dort fest, für die ganze Spalte L.
In der Prüfprozedur wird der eingegebene Wert momentan auf 2 Nachkommastellen gerundet
(durch die Format-Funktion) und wieder in der Textbox angezeigt.
Viel Erfolg beim Übertragen!
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: UserForm-Eingaben prüfen
01.05.2007 12:02:00
Oberschlumpf
Hi Lenhard
Nur ne kleine Frage :-)
Hab mir gerad auch mal Erichs Datei angesehen. Funzt tadellos....aberrrrr
Dein Ziel war doch, wenn ich es richtig verstanden habe, dass, wenn einmal drin in einer Textbox, dann nur raus, wenn entweder Eintrag vorhanden ODER Klick auf Abbruch-Button.
Aber in Erichs Datei kannst du zwischen den Textboxen nach Belieben hin und her "springen", aber nix passiert :)
Und ich glaube, dass so eine oder ähnliche Lösung schon in diesem Thread vorhanden ist - kann mich natürlich aber auch täuschen.
Ciao
Thorsten:-)

AW: UserForm-Eingaben prüfen
01.05.2007 12:59:39
Lenhard
Moin Thorsten!
Jooo, Erichs Vorschläge funktionieren tadellos!! ...und ich setze sie gerade um. Da ist ja noch mehr drinn in meiner Datei.

Dein Ziel war doch, wenn ich es richtig verstanden habe, dass, wenn einmal drin in einer  _
Textbox, dann nur raus, wenn entweder Eintrag vorhanden ODER Klick auf Abbruch-Button.


...aber hier begann ja das Problem bei meiner alten Programmierung: Wenn eine TextBox nur einmal angesteuert war, dann kam ich durch "Abbrechen" nicht mehr ohne eine Eingabe heraus. Ich konnte erst abbrechen, wenn ich zumindestens ein Leerzeichen in die "Aus-Versehen-Angesteuerte" Textbox gegeben hatte.
Mit Erichs Hilfe läuft es nun.
Aber trotzdem auch noch mal vielen Dank an Dich: Du hast mir auch sehr geholfen!! ...weil ich hier bereits sehr viel gelernt habe!! Also es war nix umsonst von Dir!!!!
Gruß
Lenhard

AW: UserForm-Eingaben prüfen
01.05.2007 13:51:00
Erich
Hallo Thorsten,
die Textboxen als "Fallen" einzusetzen, war m. E. nicht als Ziel, sondern eher als Mittel anzusehen.
Ziel und Zweck des Ganzen ist doch, mit der UF richtige und vollständige Daten für die Tabelle zu erfassen,
wobei auch ein Abbruch möglich sein soll.
Lenhards Ziel (ganz oben so formuliert:"Ich will aber einen Abbruch,
egal in welchen Zuständen sich das UserForm und/oder die Bestandteile des UserForms befinden"
realisiert mein Vorschlag auch nicht:
In BeforeUpdate wird sichergestellt, dass beim Verlassen einer Textbox keine falschen Werte stehen.
Das erleichtert dem Benutzer nach einem Vertipper die sofortige Korrektur,
er wird sofort beim Verlassen der Textbox darauf hingewiesen.
Ansonsten steht es dem User frei, in welcher Reihenfolge er die Boxen füllt.
Hauptsache, bei "OK" sind alle Eingaben getätigt und passen zusammen.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: UserForm-Eingaben prüfen
01.05.2007 19:16:00
Lenhard
An dieser Stelle noch mal meinen ganz besonderen Dank an Dich, Erich!!
Nun läuft alles.
Sei mir bitte nicht böse, aber ich habe nicht unbedingt Deine letzteren Vorschläge kpl. zu mir "rübergedacht"... ...ich glaube ein Konzept, das irgendwo in der zeitlichen Mitte userer Forum-Korrespondens habe ich mir als Grundgerüst genommen und dann Stück für Stück zusammengefügt.
Also noch mals: Vielen Dank!
Gruß
Lenhard

AW: Probleme beim UserForm schließen /
30.04.2007 11:46:00
Oberschlumpf
Hi Lenhard
Hast du schon mal versucht, deinen ursprünglichen Code

Private Sub txtBoxDatum_Exit(ByVal Cancel As MSForms.ReturnBoolean)
With txtBoxDatum
If Not IsDate(.Text) Or .Text = "" Then
MsgBox "Bitte geben Sie ein gültiges Datum ein!", 64, "Fehler"
Cancel = True
.Text = Format(Date, "dd.mm.yyyy")
.SelStart = 0
.SelLength = Len(.Text)
End If
End With
End Sub


nicht in das Exit-Ereignis der Textbox zu schreiben, sondern in das AfterUpdate-Ereignis, und zwar so:


Private Sub txtBoxDatum_AfterUpdate()
With txtBoxDatum
If Not IsDate(.Text) Or .Text = "" Then
MsgBox "Bitte geben Sie ein gültiges Datum ein!", 64, "Fehler"
Cancel = True
.Text = Format(Date, "dd.mm.yyyy")
.SelStart = 0
.SelLength = Len(.Text)
End If
End With
End Sub


So wird ein Eintrag in der Textbox eigtl nur dann geprüft, wenn du denn etwas eingegeben hast.
Klappt es denn nun, oder biset immer noch Gefangener einer schnöden Textbox...hihi
Ciao
Thorsten

AW: Probleme beim UserForm schließen /
30.04.2007 12:15:00
Lenhard
Hallo Thorsten!
Ich sitze nun hier und schmunzel vor mich hin:

...oder biset immer noch Gefangener einer schnöden Textbox...hihi


"Wer den Schaden nicht hat, der braucht..." ...wie war das noch mal?!?!? :-)))
Deinen Vorschlag habe ich natürlich ausprobiert und er funktioniert auch, aber nun kann man z.B. per Tab-Steuerung einfach über die betreffende Zelle "hinweg gehen" ohne das meine Aufforderung zur Pflichteingabe kommt. Ist auch nicht in meinem Sinne.
Sobald der Cursor in der TextBox blinkt, muss ein Eintrag erfolgen. Das Ganze soll aber durch den Klick auf meinen "Abbrechen"-Button jederzeit durchbrochen werden können.
Trotzdem: Danke für Deine Hilfe!
Gruß
Lenhard

AW: Probleme beim UserForm schließen /
30.04.2007 12:51:12
Oberschlumpf
Hi Lenhard :-)
Der Mensch lästert nun mal gern - und in solchen Situationen bin ich verdammt gerne Mensch...hihi
Aber Spaß beiseite :-)
Ich glaube, dein Problem mit der Textbox und Abbrech-Button liegt ganz woanders.
Denn...
...schau dir mal dieses Bsp an:
https://www.herber.de/bbs/user/42139.xls
Ich hab ein UF mit 3 Textboxen (2x Pflichtfeld, 1x kein Pflichtfeld) und einem Abbrechen-Button erstellt.
In den beiden ersten Textboxen habe ich ins Exit-Ereignis deinen Code geschrieben.
Im Klick-Ereignis des Buttons steht auch nur
Unload Me
Na ja, es funktioniert alles, wie gewünscht (wenn ich dich richtig verstand)
Beim Start des UF ist der Cursor automatisch in Textbox1. Und da kommste auch nicht wieder raus, es sei denn, du gibst ein gültiges Datum ein.
Mit Tab springt der Cursor in Textbox2 - und hier wiederholt sich das Spiel.
Wenn du aber - noch in Textbox1 - ohne Tab mit der Maus auf den Button klickst, wird das UF problemlos geschlossen.
Ich habe zwar jetzt deinen OK-Button vernachlässigt und den Code darin nicht mit eingebaut.
Aber wenn ich einen Button mit Code nicht anklicke, wird dieser Code auch nicht ausgeführt.
Konnte ich helfen?
Oder anders formuliert....
....bin nun ICH der Befreier, der deine Gefangenschaft in einer Textbox beendet hat?
....kann der Befreier dann nicht auch die sich im richtigen Alter befindliche Tochter heiraten?
hihi...so war es zumindest früher immer in den Märchen :-)))....hmm...aber in den Märchen gab es noch keine schnöden Textboxen...shit...dann wird das mit der Heirat wohl doch nix...löl
Oder..ich will es nicht hoffen..bist du nun leider immer noch keinen Schritt weiter?
Ciao
Thorsten

AW: Probleme beim UserForm schließen /
30.04.2007 13:17:00
Lenhard
Hallo Thorsten!
Erst mal vielen Dank! ...aber bei Deiner Datei tritt der gleiche Effekt auf wie gehabt.
Hattest Du einen CommandButton zwecks Aktivierung auf ein Tabellenblatt "gelegt"? ...ich habe da nix gefunden. Macht aber nix: Habe ich mir kurz dazu gebaut.
"Abbrechen" funktioniert nur, wenn ein Pflichtfeld nicht einmal angesteuert war oder ein Eintrag vorhanden ist.
Sobald der Cursor auch nur 1x (!!) in einem Pflichtfeld geblinkt hat, ist man "gefangen"! Erst ein Eintrag ermöglicht nun ein Abbrechen.
Ach ja, das mit den Märchen... ...da ist man Ende immer irgendwie glücklich. "Und wenn sie nicht gestorben sind, dann..." ...ist auch irgendwie Wenn-Dann-Sonst... Oder?!

Private Sub CommandButton2_Click()
Unload Me
'Anstatt "Unload Me" müßte hier irgendwie etwas anderes stehen... ..."Ignoriere alle  _
Vorgaben die in irgendeiner Form im UserForm enthalten sind und mache einfach dicht!"
End Sub


...denn es muss doch irgendwie ein richtiges Abbrechen geben. Oder?! :-))
Gruß
Lenhard
PS ...muss nun wirklich zur Arbeit und bin erst heute Abend wieder zu Hause. Dann schau ich mal weiter.

AW: Probleme beim UserForm schließen /
30.04.2007 14:37:00
Lenhard
Hallo Leute!
Ich habe vielleicht die Lösung, brauche aber dafür noch mal Eure Hilfe. Bin gerade auf der Arbeit, konnte mich aber kurz mit Erlaubnis an einem Rechner 2absetzen":
Ich frage mich einfach folgendes: Wenn TextBoxen in einem UserForm unbedingt vor einem "Unload Me" Einträge haben wollen, warum geben wir sie ihnen nicht einfach!!?
Also bevor "Unload Me" geschieht, brauche ich den Code, der mir z.B. das aktuelle Datum, einen normalen Text (es würde ja ein "." reichen) und eine Zahl in eine TextBox schreibt.
Um das Gabze noch zu vervollständigen, das gleiche auch für ComboBoxen.

Private Sub CommandButton2_Click()
'Hier das "Futter" für alle TextBoxen und ComboBoxen die Pflichteingaben haben wollen
Unload Me
End Sub


Müßte das nicht gehen. Vielleicht keine schöne Lösung, aber es müßte doch funktionieren?! Oder?!
Gruß
Lenhard

AW: Probleme beim UserForm schließen /
30.04.2007 18:20:37
Oberschlumpf
Hi Lenhard
Deine Idee würde leider auch nicht funktionieren.
Denn alles ist abhängig von der Aktivier-Reihenfolge der Ereignisse.
Und das Exit-Ereignis einer Textbox (sobald sich der Cursor in einer befindet) steht in der Ablauf-Reihenfolge VOR dem Klick-Ereignis eines Buttons - aus dem Grund, weil ja eine Textbox den Fokus hat.
Aber...
...ich habe eine Möglichkeit gefunden.
Das MouseMove-Ereignis eines jeden anderen Steuerelementes steht in der Ablauf-Reihenfolge VOR dem Exit-Ereignis eines jeden anderen Steuerelementes.
Aus dem Grund habe ich ein kleines Label-Element in Rot eingebaut.
Wenn du nun vorm dem Klick auf den Abbrech-Button den Mauszeiger über das rote Label bewegst, und erst dann auf den Button klickst, wird das UF klaglos geschlossen.
Allerdings ist dies auch keine schöne Lösung, da du halt immer zuerst die Maus über das Label bewegen musst.
Den Gedanken, doch einfach das Move-Ereignis des Buttons zu verwenden, musst ich leider wieder verwerfen, da aufgrund der Größe des Buttons das Move-Ereignis doch auch schnell versehentlich ausgelöst wird. Und dann wäre das Verlassen einer Textbox auch mit Tab möglich.
Eine andere Idee hab ich leider auch (noch) nicht.
Hier die Datei - nun auch mit Aktivier-Code des UFs:
https://www.herber.de/bbs/user/42150.xls
Hilft es denn weiter?
Ciao
Thorsten

AW: Probleme beim UserForm schließen /
30.04.2007 22:50:36
Lenhard
Moin Thorsten!
...ja hast Recht: Leider klappt meine Idee nicht. Dadurch habe ich aber wieder mal dazu gelernt.
Deine Idee mit dem Label-Element und der MouseOver-Funktion ist auch nicht schlecht. Vielen Dank für Deine Mühe. Ich muss mal schauen ob ich die weiter verfolge. Erst mal vielen Dank!
Auch an alle anderen, die mir bisher hier geholfen haben: Vielen Dank!
Gruß
Lenhard

AW: Probleme beim UserForm schließen /
01.05.2007 19:10:00
Lenhard
Nun ist der Zeitpunkt gekommen, dass ich mich ganz ganz herzlich bedanken will!!
Ich bin nicht mehr in der TextBox gefangen und meine Datei läuft total rund und richtig gut. Sie ist zwar noch nicht fertig, aber zumindestens dieser Teil ist bewältigt.
Vielen vielen Dank nochmals an Thorsten, Sepp und - alle anderen mögen mir nicht böse sein - ganz besonders an Dich: Erich!! Ich habe sehr viel gelernt!
Ich meine, dass dieser Forums-Beitrag nun geschlossen werden kann.
Gruß
Lenhard

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige