Der ewige Kampf mit TxtBoxen

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
UserForm TextBox MsgBox
Bild

Betrifft: Der ewige Kampf mit TxtBoxen
von: P-Quest :-)
Geschrieben am: 19.07.2015 12:40:09

Hallo,
Ich verwende in einen Userform eine Textbox (txtMenge) in der nur Zahlen zugelassen sein sollen. Mit diesem Wert wird dann in einer weiteren Textbox (txtWert) eine Berechnung durchgeführt.
Später werden die Daten per CmdButton in eine Tabelle geschrieben.
Ich kämpfe jetzt gerade mit der unverträglichkeiten der Typen in der ersten IF Anweisung, die immer dann als Fehler auftaucht, wenn ich keine Eingabe in txtMenge mache oder einen Text eingebe.
Mein Fehler liegt wohl daran, dass ich noch nicht richtig damit klarkomme, wann denn nun mit Text und wann mit Zahl (also mit in Zahl umgewandelten Text) gearbeitet werden muss.
Ich hatte das ganze schon mal so hinbekommen, dass die Fehlermeldung wie gewollt abgearbeitet wurde, dann gab es aber ein Problem mit dem VLookup, weil auch hier eine Typunverträglichkeit angezeigt wurde.
Kann mir da mal jemand auf die Sprünge helfen?!

Private Sub txtMenge_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    txtMenge = Trim(txtMenge.Value)
    If Not IsNumeric(txtMenge.Value) And txtMenge <> "" Or CByte(txtMenge.Value) = 0 Then
        Cancel = True
        If Not UFCloseMode Then MsgBox "Bitte geben Sie einen Wert größer 0 ein!", vbCritical, " _
Falsche Eingabe : " & UFCloseMode
        txtMenge.Value = ""
    Else
    txtWert.Value = WorksheetFunction.VLookup(cbID.Value, Worksheets("Stammdaten").ListObjects(" _
Stammdaten").DataBodyRange, 11, False) * txtMenge.Value
    txtWert.Value = Format(txtWert.Value, "####0.00 €")
    End If
End Sub

Bild

Betrifft: AW: Der ewige Kampf mit TxtBoxen
von: Nepumuk
Geschrieben am: 19.07.2015 12:54:00
Hallo,
If Not IsNumeric(txtMenge.Value) And txtMenge <> "" Or Val(txtMenge.Value) = 0 Then
").DataBodyRange, 11, False) * CDbl(txtMenge.Value)
Gruß
Nepumuk

Bild

Betrifft: AW: Der ewige Kampf mit TxtBoxen
von: Herbert Grom
Geschrieben am: 19.07.2015 12:54:39
Hallo P?,
eine Dateivorlage wäre hier sehr hilfreich. Lade doch mal eine Beispieldatei hoch. Behalte aber die Originalbezüge bei, so hast Du es hinterher leichter.
Servus

Bild

Betrifft: AW: Der ewige Kampf mit TxtBoxen
von: Daniel
Geschrieben am: 19.07.2015 13:08:55
Hi
wenn du eine IF-Bediungung aus mehreren Prüfungen erstellst, die mit AND oder OR vernküpft sind, berechnet Excel immer alle Prüfungen!
Das bedeutet, dass If Not IsNumeric(txtMenge.Value) And txtMenge <> "" verhindert also nicht den Fehlerabbruch von Or CByte(txtMenge.Value) = 0 wenn die Textbox leer ist.
dh IF-Prüfungen zur Fehlervermeidung müssen immer in eigene IF-Blöcke vorangstellt werden.
du könntest hier aber die Umwandlung von Text in Zahl mit der Funktion VAL machen.
diese erzeugt keinen Fehlerabbruch wenn der umzuwandelnde Wert keine Zahl ist, sondern hat dann den Wert 0 als Ergebnis.

Private Sub txtMenge_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim Menge As Double
Menge = Val(Replace(Trim(txtMenge.Text), ",", "."))
If Menge = 0 Then
    Cancel = True
    txtMenge.Value = ""
    If Not UFCloseMode Then MsgBox "..."
Else
    txtWert.Text = ....
End If
End Sub
was man beachten musss ist, dass VAL immer den Punkt als Dezimalzeichen erfordert, daher das Replace, falls jemand die Menge als Dezimalbruch eingeben will und das deutsche Komma verwendet.
Gruß Daniel

Bild

Betrifft: AW: An alle Antworter
von: P-Quest :-)
Geschrieben am: 19.07.2015 13:43:36
Besten Dank für die Hilfestellungen. Es funktioniert!

Bild

Betrifft: AW: Der ewige Kampf mit TxtBoxen
von: Michael
Geschrieben am: 19.07.2015 16:37:32
Hi zusammen,
nur der Vollständigkeit halber: es gibt auch die Möglichkeit, gar nicht erst falsche Eingaben zuzulassen:
https://www.herber.de/forum/archiv/692to696/692490_In_Textbox_nur_Zahlen_zulassen.html
Wenn ein Komma noch mit rein soll, kann man das in der CASE berücksichtigen: den Wert kann man einfach ermitteln, indem man ein gewünschtes Zeichen z.B. in A1 schreibt und in B1 die Formel = Code(a1)
Das ergibt fürs Komma 46.
Schöne Grüße,
Michael

Bild

Betrifft: AW: Der ewige Kampf mit TxtBoxen
von: P-Quest :-)
Geschrieben am: 19.07.2015 17:28:53
Vielen Dank für die weiterführende Info, Michael. Ich habe es in meinem Formular direkt übernommen. Macht sich gut :-)

Bild

Betrifft: freut mich, aber...
von: Michael
Geschrieben am: 19.07.2015 17:43:28
wenn ich's mir genau überlege, kommt man auch so um Errorhandling nicht herum - zumindest muß man aufpassen, daß nicht mehr als 1 Komma vorhanden ist, evtl. mit einer globalen Variablen "komma_vorhanden", die nach dem ersten Komma auf True gesetzt wird, damit sie keine weiteres mehr "durchläßt".
Es ist halt leider nie ganz so einfach, wie man es sich auf den ersten Blick vorstellt.
Happy Exceling,
Michael

Bild

Betrifft: AW: freut mich, aber...
von: Nepumuk
Geschrieben am: 19.07.2015 20:26:16
Hallo,
du kannst verhindern das der User etwas anderes eingibt als Zahlen und maximal ein Komma:

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
        Case 48 To 57
            'Number do nothing
        Case 44, 46
            If InStr(1, TextBox1.Text, ",") > 0 Then
                KeyAscii = 0
            Else
                KeyAscii = 44
            End If
        Case Else
            KeyAscii = 0
    End Select
End Sub

Gruß
Nepumuk

Bild

Betrifft: AW: freut mich, aber...
von: P-Quest :-)
Geschrieben am: 19.07.2015 21:12:33
Ja, stimmt, aber ich habe da im netz eine Lösung gefunden, die die Anzahl der Kommata abprüft. Werde ich mal testen.
Danke für den Hinweis!

Bild

Betrifft: AW: freut mich, aber...
von: Michael
Geschrieben am: 21.07.2015 16:58:53
Hi zusammen,
hab ich doch glatt nicht richtig hingesehen mit dem "46"...
... und zu umständlich gedacht mit einer globalen Variablen: ich versuche immer, Stringfuntionen wie instr möglichst sparsam zu verwenden, da sie "relativ" langsam sind, aber bei Tastatureingaben ist "die Maschine" ja immer schneller als der Anwender, so what.
Mir taugt Nepumuks Vorschlag jedenfalls, zumal ein versehentlicher Punkt gleich in ein Komma verwandelt wird.
Happy Exceling,
Michael

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Daten aus geschlossener Arbeitsmappe auslesen"