Textboxen und comboboxen vor schließen der Userform prüfen

Hallo an alle,

ich habe da ein kleines Problem mit der Überprüfung ob in allen Textboxen und Comboboxen Werte eingetragen wurden oder nicht, bevor die Daten in eine Tabelle geschrieben werden und die UserForm geschlossen wird. Ich benutze da folgenden Code, aber der funktioniert nicht. Leider weis ich nicht mehr wo ich ihn her hab. Kann einer vieleicht erkennen was da falsch ist und warum?
Code:
Private Sub cmdBeenden_Click()
    For Each ctl In Me.Controls
        If ctl.Tag = „X“ Then
            If Len(ctl) = 0 Then
                MsgBox „Bitte füllen Sie alle Felder aus“ & vbCrLf & „Wenn Wngabe nicht möglich, dann 0“, vbOKOnly, „Fehler bei der Eingabe!“
                ctl.SetFocus
                Exit Sub
            End If
        End If
    Next ctl
    With Tabelle1
        With .Cells(.Rows.Count, 1).End(xlUp).Offset(1)
            .Value = RaumName.Value
            .Offset(, 1).Value = BezeichnungLMAlt.Value
            .Offset(, 2).Value = CDbl(WattLMAlt.Value)
            .Offset(, 3).Value = CDbl(AnzahlLMAlt.Value)
            .Offset(, 4).Value = TypVGAlt.Value
            .Offset(, 5).Value = CDbl(WattLampeAlt.Value)
            .Offset(, 6).Value = CDbl(AnzahlLampeAlt.Value)
            .Offset(, 7).Value = CDbl(LebensdauerLMAlt.Value)
            .Offset(, 8).Value = CDbl(PreisLMAlt.Value)
            .Offset(, 9).Value = CDbl(AnzahlStarterAlt.Value)
            .Offset(, 10).Value = CDbl(PreisStarterAlt.Value)
            .Offset(, 11).Value = CDbl(Betriebsstunden.Value)
            .Offset(, 12).Value = CDbl(Betriebstage.Value)
            .Offset(, 13).Value = CDbl(WechselLMAlt.Value)
            .Offset(, 14).Value = CDbl(WechselVGAlt.Value)
            .Offset(, 15).Value = CDbl(TauschLampe.Value)
            .Offset(, 16).Value = RaumKalt.Value
            .Offset(, 17).Value = CDbl(RaumTemp.Value)
            .Offset(, 18).Value = TSensorAlt.Value
            .Offset(, 19).Value = BMelderAlt.Value
            .Offset(, 20).Value = CDbl(BMelderAltZeit.Value)
            .Offset(, 21).Value = DimmAlt.Value
            .Offset(, 22).Value = CDbl(KostenHMAlt.Value)
            .Offset(, 23).Value = VGWechsel.Value
            .Offset(, 75).Value = Datum.Value
            .Offset(, 76).Value = Bearbeiter.Value
        End With
        Sheets(„Tabelle1“).Activate
    End With
    
    'Wechselt zur Tabelle "Programm und schließt die Userform
   Sheets(„Programm“).Activate
   Unload Me
End Sub

Hallo Olero,

ich habe da ein kleines Problem mit der Überprüfung ob in
allen Textboxen und Comboboxen Werte eingetragen wurden oder
nicht, bevor die Daten in eine Tabelle geschrieben werden und
die UserForm geschlossen wird. Ich benutze da folgenden Code,
aber der funktioniert nicht.

„der funktioniert nicht“? Klasse Meldung:frowning:

Im anderen Forum wo du heute deshalb angefragt hast, sagtes du dazu:

"Wenn nicht alle Felder gefüllt sind bekomme ich die Meldung „Laufzeitfehler 13, Typen unverträglich“. Sind alle Felder gefüllt, werden die Daten weg geschrieben und die UserForm geschlossen. Kann einer erkennen warum er die Prüfung nicht macht wenn die Felder nicht alle gefüllt sind?

Vllt., in welcher Codezeile kommt denn der Fehler? Immer die gleiche egal wie du befüllst?

Gruß
Reinhard

Hallo Reinhard,

die erste Fehlermeldung kommt in Zeile 33. Wenn beim schreiben in die Tabelle der Wert aus der TextBox in ein Double gewandelt wird. Das is deshalb so, weil ich getestet habe ob das Programm die Prüfung macht. Wenn ich mehrere Felder ausfülle, dann ist der Laufzeitfehler bei dem Textfeld welches nicht gefüllt ist und wo der Wert in ein Double gewandelt wird. Die Msg-Box mit dem Hinweis das die Felder nicht alle gefüllt sind erscheint überhaupt nicht. Reinhard, jetzt frage mich bitte nicht was es mit dem Tag „X“ auf sich hat. Ich habe da absolut keine Ahnung.

Gruß
Olerostock

Hallo Reinhard,

ich habe es hin bekommen. Den ganzen Kram mit Tag rausgenommen und über die Object-Prüfung erledigt.
Hier noch schnell der Code:
Private Sub cmdNeueLampe_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

With Tabelle1
With .Cells(.Rows.Count, 1).End(xlUp).Offset(1)
.Value = RaumName.Value
.Offset(I, 1).Value = BezeichnungLMAlt.Value
.Offset(I, 2).Value = CDbl(WattLMAlt.Value)
.Offset(, 3).Value = CDbl(AnzahlLMAlt.Value)
.Offset(, 4).Value = TypVGAlt.Value
.Offset(, 5).Value = CDbl(WattLampeAlt.Value)
.Offset(, 6).Value = CDbl(AnzahlLampeAlt.Value)
.Offset(, 7).Value = CDbl(LebensdauerLMAlt.Value)
.Offset(, 8).Value = CDbl(PreisLMAlt.Value)
.Offset(, 9).Value = CDbl(AnzahlStarterAlt.Value)
.Offset(, 10).Value = CDbl(PreisStarterAlt.Value)
.Offset(, 11).Value = CDbl(Betriebsstunden.Value)
.Offset(, 12).Value = CDbl(Betriebstage.Value)
.Offset(, 13).Value = CDbl(WechselLMAlt.Value)
.Offset(, 14).Value = CDbl(WechselVGAlt.Value)
.Offset(, 15).Value = CDbl(TauschLampe.Value)
.Offset(, 16).Value = RaumKalt.Value
.Offset(, 17).Value = CDbl(RaumTemp.Value)
.Offset(, 18).Value = TSensorAlt.Value
.Offset(, 19).Value = BMelderAlt.Value
.Offset(, 20).Value = CDbl(BMelderAltZeit.Value)
.Offset(, 21).Value = DimmAlt.Value
.Offset(, 22).Value = CDbl(KostenHMAlt.Value)
.Offset(, 23).Value = VGWechsel.Value
.Offset(, 75).Value = Datum.Value
.Offset(, 76).Value = Bearbeiter.Value
End With
Sheets(„Tabelle1“).Activate
End With
End Sub

Danke Dir trotzdem.
Gruß
Olerostock

Vba-Tipp, was ist Codezeile 8 nach Vba-Nummerierung gezählt
Hallo Ole,

Für die die nur wegen der Codenzeilennummerierung mitlesen, nachstehend sieht man wie Vba bzw. der Editor Codezeilen nummeriert.

die erste Fehlermeldung kommt in Zeile 33.

Nein. In Zeile 33 (nach Vba Zählweise) steht gar kein Cdbl(…) drin.

Wenn ich mehrere Felder
ausfülle, dann ist der Laufzeitfehler bei dem Textfeld welches
nicht gefüllt ist und wo der Wert in ein Double gewandelt
wird.

In einem Textfeld sind die Werte „Text“, egal ob da Zahlen drin stehen.
CDbl, CInt,… bringen den Fehler wenn sie einen Text in eine Zahl wandeln sollen.

Sub tt()
MsgBox CDbl(Val("")) ' funktioniert
MsgBox CDbl(Val("a")) ' funktioniert
MsgBox CDbl("a") ' Laufzeitfehler 13, Typen unverträglich
MsgBox CDbl("") ' Laufzeitfehler 13, Typen unverträglich
End Sub

Reinhard, jetzt frage
mich bitte nicht was es mit dem Tag „X“ auf sich hat. Ich habe
da absolut keine Ahnung.

Ich weiß, mit Teilen des Codes, auch mit dem Tag X warst du vor Wochen schonmal in w-w-w. Am Tag X habe ich das wiedererkannt und mal nachgeschaut, :frowning:

Gruß
Reinhard

Zählweise, Nummerierung:

Option Explicit

Private Sub cmdBeenden\_Click()
1 For Each ctl In Me.Controls
2 If ctl.Tag = "X" Then
3 If Len(ctl) = 0 Then
4 MsgBox "Bitte füllen Sie alle Felder aus" & vbCrLf & "Wenn Wngabe nicht möglich, dann 0", vbOKOnly, "Fehler bei der Eingabe!"
5 ctl.SetFocus

6 Exit Sub
7 End If
8 End If
9 Next ctl
10 With Tabelle1
11 With .Cells(.Rows.Count, 1).End(xlUp).Offset(1)
12 .Value = RaumName.Value
13 .Offset(, 1).Value = BezeichnungLMAlt.Value
14 .Offset(, 2).Value = CDbl(WattLMAlt.Value)
15 .Offset(, 3).Value = CDbl(AnzahlLMAlt.Value)
16 .Offset(, 4).Value = TypVGAlt.Value
17 .Offset(, 5).Value = CDbl(WattLampeAlt.Value)
18 .Offset(, 6).Value = CDbl(AnzahlLampeAlt.Value)
19 .Offset(, 7).Value = CDbl(LebensdauerLMAlt.Value)
20 .Offset(, 8).Value = CDbl(PreisLMAlt.Value)
21 .Offset(, 9).Value = CDbl(AnzahlStarterAlt.Value)
22 .Offset(, 10).Value = CDbl(PreisStarterAlt.Value)
23 .Offset(, 11).Value = CDbl(Betriebsstunden.Value)
24 .Offset(, 12).Value = CDbl(Betriebstage.Value)
25 .Offset(, 13).Value = CDbl(WechselLMAlt.Value)
26 .Offset(, 14).Value = CDbl(WechselVGAlt.Value)
27 .Offset(, 15).Value = CDbl(TauschLampe.Value)
28 .Offset(, 16).Value = RaumKalt.Value
29 .Offset(, 17).Value = CDbl(RaumTemp.Value)
30 .Offset(, 18).Value = TSensorAlt.Value
31 .Offset(, 19).Value = BMelderAlt.Value
32 .Offset(, 20).Value = CDbl(BMelderAltZeit.Value)
33 .Offset(, 21).Value = DimmAlt.Value
34 .Offset(, 22).Value = CDbl(KostenHMAlt.Value)
35 .Offset(, 23).Value = VGWechsel.Value
36 .Offset(, 75).Value = Datum.Value
37 .Offset(, 76).Value = Bearbeiter.Value
38 End With
39 Sheets("Tabelle1").Activate
40 End With
'Wechselt zur Tabelle "Programm und schließt die Userform
41 Sheets("Programm").Activate
42 Unload Me
End Sub

ich habe es hin bekommen. Den ganzen Kram mit Tag rausgenommen
und über die Object-Prüfung erledigt.
Hier noch schnell der Code:
Private Sub cmdNeueLampe_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

Hallo Olerostock,

du hast nur hinbekommen daß leer Felder bemerkt werden, na und, es sind viele Textfelder, völlig normal, je nach Benutzer, daß da Fehleingaben geschehen.
Schwupps ist LF 13 wieder da.

Was ist wenn jmd. ein Leerzeichen in das Feld eingibt?

Nachstehend als Code an sich was schlimmeres, da kommt kein Fehler aber du übernimmst FALSCHE Werte, das ist immer schlimmer für deine Tabelle.
Komma ist ruckzuck mit Punkt verwechselt.

Gruß
Reinhard

Minimalvoraussetzung zum Testen,
Userform1, zwei Textboxen, ein CommandButton

Option Explicit

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
 MsgBox CDbl(objtxt) ' Hier kommt dann evtl. LZF 13
Next
End Sub

Private Sub UserForm\_Activate()
TextBox1.Value = "2,0"
TextBox2.Value = "2.0"
End Sub

With Tabelle1
With .Cells(.Rows.Count, 1).End(xlUp).Offset(1)
.Value = RaumName.Value
.Offset(I, 1).Value = BezeichnungLMAlt.Value
.Offset(I, 2).Value = CDbl(WattLMAlt.Value)
.Offset(, 3).Value = CDbl(AnzahlLMAlt.Value)
.Offset(, 4).Value = TypVGAlt.Value
.Offset(, 5).Value = CDbl(WattLampeAlt.Value)
.Offset(, 6).Value = CDbl(AnzahlLampeAlt.Value)
.Offset(, 7).Value = CDbl(LebensdauerLMAlt.Value)
.Offset(, 8).Value = CDbl(PreisLMAlt.Value)
.Offset(, 9).Value = CDbl(AnzahlStarterAlt.Value)
.Offset(, 10).Value = CDbl(PreisStarterAlt.Value)
.Offset(, 11).Value = CDbl(Betriebsstunden.Value)
.Offset(, 12).Value = CDbl(Betriebstage.Value)
.Offset(, 13).Value = CDbl(WechselLMAlt.Value)
.Offset(, 14).Value = CDbl(WechselVGAlt.Value)
.Offset(, 15).Value = CDbl(TauschLampe.Value)
.Offset(, 16).Value = RaumKalt.Value
.Offset(, 17).Value = CDbl(RaumTemp.Value)
.Offset(, 18).Value = TSensorAlt.Value
.Offset(, 19).Value = BMelderAlt.Value
.Offset(, 20).Value = CDbl(BMelderAltZeit.Value)
.Offset(, 21).Value = DimmAlt.Value
.Offset(, 22).Value = CDbl(KostenHMAlt.Value)
.Offset(, 23).Value = VGWechsel.Value
.Offset(, 75).Value = Datum.Value
.Offset(, 76).Value = Bearbeiter.Value
End With
Sheets(„Tabelle1“).Activate
End With
End Sub

Danke Dir trotzdem.
Gruß
Olerostock

Hallo Reinhard,

Sorry mit der Code-Zeile, ich hatte en darüber stehenden Teil vergessen.
Ich habe im Zusammenhang mit dem wegschreiben der Daten noch eine Frage.
Zwischen dem .Offset(, 7).Value = CDbl(LebensdauerLMAlt.Value und dem .Offset(, 8)… soll eine Prüfung erfolgen ob in ComboBox10 der Wert „LED“ steht und wenn ja, dan soll der Wert aus TextBox24 in (, 7) geschrieben werden und nicht aus (LebensdauerLMAlt)?
Wie kann ich das bewerkstelligen?

Danke nochmals
MfG
Olerostock

Hallo Reihard,

bezüglich der Eingabe in die TextBox habe ich die Eingabebedingung noch festgelegt.
z.B.:
Private Sub EG_AnzahlStarterAlt_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Nur Zahlen dürfen eingegeben werden
Select Case KeyAscii
Case Asc(„0“) To Asc(„9“)
If InStr(EG_LebensdauerLMAlt, „,“) 0 Then
KeyAscii = 0
Else
End If
Case Else
KeyAscii = 0
End Select

End Sub

Bei Textfeldern mit Text dann natürlich andere Ascii-Zeichen.

MfG
Olerostock

Hallo Ole,

Sorry mit der Code-Zeile, ich hatte en darüber stehenden Teil
vergessen

iss ja okay. Mir ging es aber um etwas grundlegenderes. Wenn dich jemand in einem Forum fragt/bittet „In welcher Codezeile“ dann ist wie du gesehen hast 33 verwirrend.
33 ist ja von der Zählweise abhängig.

Also sehe bitte „welche“ nicht als Nummernanfrage, sondern so „zeige hier die Codezeile“
Wenn die eindeutig ist, also so nur einmal im Code vorkommt, so reicht das.
Kommt sie mehrmals so vor mußt du das genauer bezeichnen, beschreiben…

Ggfs. benutze den b-Tag. Der wird im Eingabefenster erläutert. Kinderleichte Benutzung wenn du das einmal indus hast. Dann kannste auch die anderen Html-Tags benutzen die über dem Eingabefeld sogar als Button da sind.

Zwischen dem .Offset(, 7).Value = CDbl(LebensdauerLMAlt.Value
und dem .Offset(, 8)… soll eine Prüfung erfolgen ob in
ComboBox10 der Wert „LED“ steht und wenn ja, dan soll der Wert
aus TextBox24 in (, 7) geschrieben werden und nicht aus
(LebensdauerLMAlt)?

Merkst du nichts? Du knallst da
„soll der Wert aus TextBox24 in (, 7) geschrieben werden“
rein.

Wenn ich rätseln will gehe ich hier ins Rätselbrett. Spielt keine Rolle ob ich durch 5 min Nachdenken drauf komme was du mit Textbox24 meinen könntest.
ERklärs doch einfach mit deinen bisher benutzten Objektbezeichnungen.
Betonung auf „einfach“.

Ich denke ich habe viel hier in die Antwort investiert, jetzt habe ich wie damals vor paar Wochen die Schnauze voll und so wie damals schreibe ich wieder einmal, willste mich veräppeln?.

Diese Beitragsfolge ist für mich erledigt.

Gruß
Reinhard.