Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA Bedingung Anzeige Textfelder

VBA Bedingung Anzeige Textfelder
07.04.2020 16:33:30
Christian
Hallo,
ich habe mir eine Stundentabelle erstellt und diese so gestaltet, dass alle Felder in der UserForm ausgefüllt sein müssen, bevor die Daten in eine Tabelle übernommen werden. Jetzt stoße ich allerdings an meine Grenzen und für mich wird es zu kompliziert. Daher benötige ich Hilfe.
Folgendes soll noch eingearbeitet werden: Wenn in der ComboBox1, die Einträge "Urlaub, Feiertag oder Krank" ausgewählt werden, dann soll TextFeld2 und TextFeld3 ausgeblendet werden. Dann soll naturlich auch nicht der Hinweis erscheinen "Es wurden nicht alle Textfelder ausgefüllt." und die Daten sollen ohne Befüllen dieser zwei Felder in die Tabelle übernommen werden. TextFeld1 und die ComboBox1 müssen aber trotzdem beide befüllt werden, sonst soll wieder der Hinweis kommen "Es wurden nicht alle Textfelder ausgefüllt."
Ich hoffe, dass ich es einigermaßen verständlich beschreiben konnte und bin über jede Hilfe von Euch sehr dankbar.
Private Sub ComboBox1_Change()
End Sub

Private Sub CommandButton1_Click()
Dim objtxt As Object
For Each objtxt In UserForm1.Controls
If TypeName(objtxt) = "TextBox" Or (TypeName(objtxt) = "ComboBox") Then
If objtxt.Value = "" Then
MsgBox " Es wurden nicht alle Textfelder ausgefüllt.!", 48
objtxt.SetFocus
Exit Sub
End If
End If
Next
Dim erste_freie_Zeile As Integer
ActiveSheet.Unprotect Password:=""
erste_freie_Zeile = Sheets("Stundennachweis").Range("A65536").End(xlUp).Offset(1, 0).Row
Sheets("Stundennachweis").Cells(erste_freie_Zeile, 1) = CDate(TextBox1.Text)
Sheets("Stundennachweis").Cells(erste_freie_Zeile, 2) = Format(TextBox2.Text, "hh:mm")
Sheets("Stundennachweis").Cells(erste_freie_Zeile, 3) = Format(TextBox3.Text, "hh:mm")
Sheets("Stundennachweis").Cells(erste_freie_Zeile, 4) = ComboBox1.Text
Unload Me
ActiveSheet.Protect Password:=""
End Sub

Private Sub CommandButton2_Click()
Unload Me
End Sub

Private Sub TextBox1_Change()
End Sub

Private Sub TextBox2_Change()
End Sub

Private Sub TextBox3_Change()
End Sub

Private Sub UserForm_Initialize()
Dim Wiederholungen As Integer
For Wiederholungen = 2 To Sheets("Hilfstabelle").Range("A65536").End(xlUp).Row
ComboBox1.AddItem Sheets("Hilfstabelle").Cells(Wiederholungen, 1)
Next
End Sub

Anzeige

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Bedingung Anzeige Textfelder
07.04.2020 18:16:32
Regina
Hi, ungetestet:
Private Sub ComboBox1_Change()
If ComboBox1 = "Urlaub" or ComboBox1="Krank" or ComboBox1 ="Feiertag" then
TextBox2.Visible = False
TextBox3.Visible = False
Else
TextBox2.Visible = True
TextBox3.Visible = True
End if
End Sub
Hier die Prüfung (nicht sehr elegant und ebenfalls ungetestet):
For Each objtxt In UserForm1.Controls
If TypeName(objtxt) = "TextBox" Or (TypeName(objtxt) = "ComboBox") Then
' Spezialfälle behandeln
If Combobox1  "Urlaub" And Combobox1  "Krank" And Combobox1  "Feiertag" Then
If objtxt.Value = "" Then
MsgBox " Es wurden nicht alle Textfelder ausgefüllt.!", 48
objtxt.SetFocus
Exit Sub
End If
Else
If objtxt.Name  "TextBox2" And objtxt.Name  "TextBox3" Then
If objtxt.Value = "" Then
MsgBox " Es wurden nicht alle Textfelder ausgefüllt.!", 48
objtxt.SetFocus
Exit Sub
End If
End If
End If
End If
Next
Wenn das so nicht passt, lade bitte einmal eine Beispielmappe hoch.
Gruß Regina
Anzeige
AW: VBA Bedingung Anzeige Textfelder
07.04.2020 19:05:08
Christian
Hallo Regina,
vielen Vielen Dank, die Lösung funktioniert super. Ich hätte noch eine andere Frage, kann man eingeben, dass das Datum und die Uhrzeit in der UserForm nur in einem bestimmenten Format eingegeben werden kann (Datum TT.MM.JJJJ und Zeit hh:mm)? Das habe ich auch nicht hin bekommen.
Anzeige
AW: VBA Bedingung Anzeige Textfelder
07.04.2020 19:33:40
Regina
Hi, es gibt für Textfelder im UserForm keine direkte Format-Einstellung für Datum oder Text. Du müsstest nach der Eingabe prüfen. Dafü könntest Du zum Beispiel das Exit-Ereignis eines Textfeldes nutzen. Wenn Du das korrekte Datumsformat prüfen möchtest, könntest Du so vorgehen:

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not (TextBox1 Like "?.?.?" And IsNumeric(TextBox1)) Then
TextBox1.SetFocus
MsgBox "Eingabe in Textbox ist Falsch"
Exit Sub
End If
End Sub
Gruß Regina
Anzeige
AW: VBA Bedingung Anzeige Textfelder
07.04.2020 19:55:48
Christian
Hallo Regina,
jetzt ist es fast perfekt nur soll bei der falschen Eingabe auf das Feld wieder zurück gesprungen werden, bis es im richtigen Format eingebeben wurde. Wenn das noch möchglich ist wäre ich mehr als glücklich.
Ich bedanke mich aber jetz schon mal für diese perfekte Unterstützung. Leider reicht mein VBA Wissen für solche Anforderungen nicht aus und ich finde es toll, wenn man hier so eine super Hilfe bekommt.
Anzeige
AW: VBA Bedingung Anzeige Textfelder
07.04.2020 20:02:49
Regina
Hi, dann füge vor dem Exit Sub ein
Cancel = true
ein.
Gruß Regina
AW: VBA Bedingung Anzeige Textfelder
07.04.2020 20:28:59
Christian
Nochmal Tausend Dank für die tolle Unterstützung, jetzt passt alles perfekt.
Liebe Grüße Christian
AW: VBA Bedingung Anzeige Textfelder
07.04.2020 20:43:35
Regina
prima, vielen Dank für die Rückmeldung!
Gruß Regina
Anzeige
AW: VBA Bedingung Anzeige Textfelder
07.04.2020 21:23:12
Christian
jetzt habe ich nochmal ein kleines Problem, welches ich beim Fertigstellen festgestellt habe.
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not (TextBox2 Like "?:?" And IsNumeric(TextBox2)) Then
TextBox2.SetFocus
MsgBox "Zeit Format ist Falsch"
Cancel = True
Exit Sub
End If
End Sub
hierbei zeigt es immer an: Format falsch. Habe das nur ins Zeitformat abgeändert, aber da muss sicher noch etwas anderes geändert werden.
dies war das für das Datum und das funktioniert tadellos:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not (TextBox1 Like "?.?.?" And IsNumeric(TextBox1)) Then
TextBox1.SetFocus
MsgBox "Datums Format ist Falsch"
Cancel = True
Exit Sub
End If
End Sub

Anzeige
AW: VBA Bedingung Anzeige Textfelder
07.04.2020 21:35:02
Regina
... sorry, bei der Uhrzeitprüfung muss das "IsNumeric" raus:
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not TextBox2 Like "?:?" Then
TextBox2.SetFocus
MsgBox "Zeit Format ist Falsch"
Cancel = True
Exit Sub
End If
End Sub
Gruß Regina
Anzeige
AW: VBA Bedingung Anzeige Textfelder
07.04.2020 21:40:22
Christian
nochmal vielen vielen Dank, jetzt funktioniert es.
Liebe Grüße Christian
AW: VBA Bedingung Anzeige Textfelder
07.04.2020 22:06:26
Christian
https://www.herber.de/bbs/user/136510.xlsm
Mist, passt doch etwas noch nicht, wenn man nun bei der UserForm auf Abbruch geht, übernimmt er keinen Abbruch. Habe die Datei mal hochgeladen.
Anzeige
AW: VBA Bedingung Anzeige Textfelder
07.04.2020 22:24:01
Regina
...ok, dann nicht das Exit, sondern das AfterUpdate-Ereignis.
Ändere alle Exit-Ereignisse os ab:
Private Sub TextBox1_AfterUpdate()
If Not (TextBox1 Like "?.?.?" And IsNumeric(TextBox1)) Then
TextBox1.SetFocus
MsgBox "Datumformat ist falsch eingegeben, bitte korregieren!"
Cancel = True
Exit Sub
End If
End Sub
gruß Regina
Anzeige
AW: VBA Bedingung Anzeige Textfelder
08.04.2020 07:50:38
Regina
Hallo Christian, der gepostete Code haut auch nicht hin:
Egal wie man prüft, es wird immer geprüft, bevor das Unload erfolgt und dann kommt die Fehlermeldung.
Die einzoge Lösung, die mir einfällt:
Prüfe nicht beim Verlassen oder Updaten der Textboxen, sondern bringe das Prüfen in dem Button unter, mit dem die Daten in das Tabellenblatt geschrieben werden.
Private Sub CommandButton1_Click()
Dim objtxt As Object
If Not (TextBox1 Like "?.?.?" And IsNumeric(TextBox1)) Then
TextBox1.SetFocus
MsgBox "Datumformat ist falsch eingegeben, bitte korregieren!"
Exit Sub
End If
If Not TextBox2 Like "?:?" Then
TextBox2.SetFocus
MsgBox "Zeitformat ist falsch eingegeben, bitte korregieren!"
Exit Sub
End If
If Not TextBox3 Like "?:?" Then
TextBox3.SetFocus
MsgBox "Zeitformat ist falsch eingegeben, bitte korregieren!"
Exit Sub
End If
For Each objtxt In UserForm1.Controls
If TypeName(objtxt) = "TextBox" Or (TypeName(objtxt) = "ComboBox") Then
' Spezialfälle behandeln
If ComboBox1  "Urlaub" And ComboBox1  "Krank" And ComboBox1  "Feiertag" Then
If objtxt.Value = "" Then
MsgBox " Es wurden nicht alle Textfelder ausgefüllt.!", 48
objtxt.SetFocus
Exit Sub
End If
Else
If objtxt.Name  "TextBox2" And objtxt.Name  "TextBox3" Then
If objtxt.Value = "" Then
MsgBox " Es wurden nicht alle Textfelder ausgefüllt.!", 48
objtxt.SetFocus
Exit Sub
End If
End If
End If
End If
Next
Dim erste_freie_Zeile As Integer
ActiveSheet.Unprotect Password:="LV"
erste_freie_Zeile = Sheets("Stundennachweis").Range("A65536").End(xlUp).Offset(1, 0).Row
Sheets("Stundennachweis").Cells(erste_freie_Zeile, 1) = CDate(TextBox1.Text)
Sheets("Stundennachweis").Cells(erste_freie_Zeile, 2) = Format(TextBox2.Text, "hh:mm")
Sheets("Stundennachweis").Cells(erste_freie_Zeile, 3) = Format(TextBox3.Text, "hh:mm")
Sheets("Stundennachweis").Cells(erste_freie_Zeile, 4) = ComboBox1.Text
Unload Me
ActiveSheet.Protect Password:="LV"
End Sub
Gruß Regina
Anzeige
AW: VBA Bedingung Anzeige Textfelder
08.04.2020 23:21:28
Christian
Hallo Regina,
habe das alles eingearbeitet und jetzt funktioniert es super. Beim durchtesten habe ich noch einen kleinen Fehler gefunden. Wenn man beim Datum z.B. 02.02.200 eingibt, läuft es auf Laufzeitfehler. Ist sicher nur eine Kleinigkeit aber ich komme einfach nicht dahinter. Ich lade die Datei nochmal hoch und hoffe nochmal auf Hilfe.
https://www.herber.de/bbs/user/136549.xlsm
Gruß Christian
Anzeige
AW: VBA Bedingung Anzeige Textfelder
09.04.2020 07:29:35
Pierre
Hallo Christian,
vielleicht nicht die eleganteste Lösung, aber probier mal:
folgende Zeile im Code ersetzen:
Sheets("Stundennachweis").Cells(erste_freie_Zeile, 1) = CDate(TextBox1.Text)

durch:
Sheets("Stundennachweis").Cells(erste_freie_Zeile, 1) = Format(TextBox1.Text, "DD.MM.YYYY")

Das sorgt dafür, dass kein Fehler mehr erscheint (zumindest bei mir), aber trotzdem das passende Format verwendet werden muss.
Und zusätzlich folgenden Block zwischen die "If Not TextBox1" und "If Not TextBox2" einfügen:
  If Len(TextBox1.Value) 

Hierbei musst du aber beachten, dass das Datum zukünftig immer vollständig eingetragen werden muss, also z. B. auch 01.05.2020, ansonsten kommt die Fehlermeldung. So kannst du aber zumindest umgehen, dass bei der Jahreszahl eine Ziffer vergessen wird.
Und noch eine Bitte: Rechtschreibung mal kontrollieren ;) korrigieren und in der letzten MsgBox ganz am Ende der Punkt ist zu viel.
Gruß Pierre
Anzeige
AW: VBA Bedingung Anzeige Textfelder
09.04.2020 11:16:54
Christian
Hallo Pierre,
der Code funktioniert jetzt super. Auch danke für den anderen Hinweis, man liest es selbst und übersieht dabei immer wieder den gleichen Fehler.
Nochmal Danke für die Unterstützung.
Gruß Christian
AW: VBA Bedingung Anzeige Textfelder
09.04.2020 14:52:02
Pierre
Sorry, ich komme erst jetzt zum Antworten...
Bitteschön, ja das kenne ich mit den Fehlern.
Irgendwann ist man blind ;)
Sollte natürlich auch keine Kritik sein, aber ich denke, gerade wenn andere mit der Datei arbeiten, ist es schöner, wenn keine grammatikalischen Fehler vorhanden sind.
Noch eins, falls du das hier noch lesen solltest: es heißt DatumSformat :)
Gruß Pierre
Anzeige
AW: VBA Bedingung Anzeige Textfelder
09.04.2020 17:12:26
Christian
Nochmal Danke.
Das Datumsformat war mir beim korrigieren des anderen Fehlers auch schon aufgefallen und ich hatte es bereits geändert. Trotzdem Danke für den Hinweis, manchmal ist man echt blind.
Gruß Christian
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

VBA-Bedingungen für die Anzeige von Textfeldern in Excel UserForms


Schritt-für-Schritt-Anleitung

  1. UserForm erstellen: Öffne Excel und erstelle eine UserForm mit den benötigten Textfeldern (TextBox1, TextBox2, TextBox3) und einer ComboBox (ComboBox1).

  2. ComboBox mit Werten füllen:

    Private Sub UserForm_Initialize()
       Dim Wiederholungen As Integer
       For Wiederholungen = 2 To Sheets("Hilfstabelle").Range("A65536").End(xlUp).Row
           ComboBox1.AddItem Sheets("Hilfstabelle").Cells(Wiederholungen, 1)
       Next
    End Sub
  3. Bedingte Sichtbarkeit der Textfelder: Füge den folgenden Code in das ComboBox1_Change-Ereignis ein:

    Private Sub ComboBox1_Change()
       If ComboBox1 = "Urlaub" Or ComboBox1 = "Krank" Or ComboBox1 = "Feiertag" Then
           TextBox2.Visible = False
           TextBox3.Visible = False
       Else
           TextBox2.Visible = True
           TextBox3.Visible = True
       End If
    End Sub
  4. Eingabewerte prüfen: Stelle sicher, dass beim Klicken auf den Button zur Datenübergabe alle notwendigen Felder befüllt sind. Füge dies in die CommandButton1_Click-Prozedur ein:

    Private Sub CommandButton1_Click()
       Dim objtxt As Object
       For Each objtxt In UserForm1.Controls
           If TypeName(objtxt) = "TextBox" Or (TypeName(objtxt) = "ComboBox") Then
               If objtxt.Value = "" Then
                   MsgBox "Es wurden nicht alle Textfelder ausgefüllt!", 48
                   objtxt.SetFocus
                   Exit Sub
               End If
           End If
       Next
  5. Datums- und Zeitformat prüfen: Verwende die Exit- oder AfterUpdate-Ereignisse, um sicherzustellen, dass die Eingaben das korrekte Format haben:

    Private Sub TextBox1_AfterUpdate()
       If Not (TextBox1 Like "??.??.????") Then
           MsgBox "Datumformat ist falsch eingegeben, bitte korrigieren!"
           TextBox1.SetFocus
           Exit Sub
       End If
    End Sub

Häufige Fehler und Lösungen

  • Laufzeitfehler bei Datumsformat: Wenn du beim Eingeben des Datums einen Fehler bekommst, stelle sicher, dass du das Datum im richtigen Format eingibst (TT.MM.JJJJ). Verwende die Format-Funktion:

    Sheets("Stundennachweis").Cells(erste_freie_Zeile, 1) = Format(TextBox1.Text, "DD.MM.YYYY")
  • Textfelder werden nicht ausgeblendet: Überprüfe die Bedingungen in ComboBox1_Change, um sicherzustellen, dass die Namen der Einträge korrekt sind.


Alternative Methoden

  • Verwendung von Datenüberprüfung: Du kannst auch die Datenüberprüfung in Excel verwenden, um sicherzustellen, dass die Eingaben in den Textfeldern den gewünschten Kriterien entsprechen, bevor die UserForm abgeschickt wird.

Praktische Beispiele

  • Szenario 1: Wenn ein Benutzer "Urlaub" auswählt, sollten die Textfelder für weitere Informationen (TextBox2 und TextBox3) nicht angezeigt werden und der Benutzer sollte keine Fehlermeldung erhalten, wenn diese Felder leer bleiben.

  • Szenario 2: Wenn das Datum im falschen Format eingegeben wird, sollte eine Fehlermeldung erscheinen und der Fokus sollte zurück auf das entsprechende Textfeld gesetzt werden.


Tipps für Profis

  • Benutze Cancel = True: Um sicherzustellen, dass der Benutzer nicht fortfahren kann, wenn die Eingaben ungültig sind, füge Cancel = True in die entsprechenden Prüfungen ein.

  • Code optimieren: Reduziere Wiederholungen im Code, indem du die Prüfungslogik in eine separate Funktion auslagerst.


FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass die Benutzer nur das richtige Datum eingeben?
Verwende das AfterUpdate-Ereignis, um das Format des Datums zu überprüfen, und setze den Fokus zurück, falls es falsch ist.

2. Was ist der Unterschied zwischen Exit und AfterUpdate?
Exit wird verwendet, wenn der Benutzer das Textfeld verlässt, während AfterUpdate aufgerufen wird, nachdem der Benutzer die Eingabe bestätigt hat.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige