Zahlen in Textbox mit Enter verarbeiten

waswiewo

Erfahrenes Mitglied
Hallo Kommunity,

ich sitze seit Jahren mal wieder an nem kleinen VBA-Projekt (Excel 2007).

Ich habe ein Bezeichnungsfeld mit einem Wert. Ich möchte, wenn ich eine Zahl in mein Textfeld geschrieben habe, diese erst bei Bestätigung von Enter von dem Wert des Bezeichnungsfelds abgezogen wird.

Momentan fängt er an zu rechnen, sobald ich die erste Zahl eintippe.

Hier mein Code:

Code:
Option Explicit

Private Sub TextBox1_change()

   Dim w As String
   
   w = TextBox1.Value
   
   If w = "" Or w Like "####" Then Exit Sub
   
   If w >= "0" Or w <= "180" Then
      Label1.Caption = Label1.Caption - CLng(w)
      TextBox1.Value = ""
   Else
      MsgBox "Bitte einen korrekten Wert eingeben!"
   End If
   
End Sub

Finde einfach nicht den Fehler. Ja gegoogelt und geSuFut hab ich schon wie nen Verrückter.

Kann mir wer nen kleinen Tipp geben?

MFG
 
Das KeyChange-Event ist dafür denkbar ungeeignet, da du hier die gedrückte Taste nicht abfragen kannst. Besser geht es mit dem KeyDown-Event, dein Code würde so aussehen:
Visual Basic:
Option Explicit

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 
 If KeyCode = 13 Then '13 steht für die gedrückte Enter-Taste
 
   Dim w As String
   
   w = TextBox1.Value
   
   If w = "" Or w Like "####" Then Exit Sub
   
   If w >= "0" Or w <= "180" Then
      Label1.Caption = Label1.Caption - CLng(w)
      TextBox1.Value = ""
   Else
      MsgBox "Bitte einen korrekten Wert eingeben!"
   End If
 
 End If
   
End Sub


Der Doc!
 
Hey!

Ich danke dir, funktioniert einwandfrei!

###EDIT: Habe noch eine Frage:

Ich habe 4 Do - Schleifen. Jede fragt einen Namen ab .. das klappt auch alles. Aber leider nur bis der 4te Name eingetragen wurde und ich mit OK bestätige. Danach kommt die Fehlermeldung: Laufzeitfehler 424 - Objekt erforderlich. Nur weiß ich nicht welches. Google sagt mir auch nichts gescheites.

Code:
Option Explicit

Private Sub startdart501_Click()

Dim sp As Variant

Dim eins As Variant
Dim zwei As Variant
Dim drei As Variant
Dim vier As Variant

eins = dart501.Label5.Caption

SpAnz:
sp = Application.InputBox("Bitte Spieleranzahl eingeben.", "Spieleranzahl", , Type:=1)

    Do
        If sp < 1 Or sp > 4 Then GoTo SpAnz
        
    Loop Until sp = 1 Or sp = 2 Or sp = 3 Or sp = 4
    
    If sp = 4 Then
    
Name1:
    eins = Application.InputBox("Bitte ersten Namen eingeben.", "Erster Spielername", , Type:=2)
Name2:
    zwei = Application.InputBox("Bitte zweiten Namen eingeben.", "Zweiter Spielername", , Type:=2)
Name3:
    drei = Application.InputBox("Bitte dritten Namen eingeben.", "Dritter Spielername", , Type:=2)
Name4:
    vier = Application.InputBox("Bitte vierten Namen eingeben.", "Vierter Spielername", , Type:=2)
    
    Do
    
        If eins = "" Then GoTo Name1
        
    Loop Until eins.IsText
    
    Do
    
        If zwei = "" Then GoTo Name2
        
    Loop Until zwei.IsText
    
    Do
    
        If drei = "" Then GoTo Name3
        
    Loop Until drei.IsText
    
    Do
    
        If vier = "" Then GoTo Name4
        
    Loop Until vier.IsText
    
    NextUserForm.Show
    
    End If

End Sub

MFG
 
Zuletzt bearbeitet:
Der Fehler ist klar, der Fehler kommt in der Zeile
Visual Basic:
Loop Until eins.IsText
und eigentlich auch in den weiteren Zeilen gleichen Typs. Du versuchst da einer Variant-Variable eine Eigenschaft zuzuweisen.

Wenn ich mir aber deinen gesamten Code hier so ansehe, kommt mir eigentlich das kalte Grauen, Do/Loops und Sprungmarken für eine einfache Namenseingabe, klarerweise dass du da die Übersicht verlierst.

Ein kleiner Tipp: Wenn du ja schon die Anzahl der Spieler abfragst, geh die Eingabe dann in einer For/Next-Schleife durch, und speichere die Namen in einem Array. Der Code für dich würde dann etwa so aussehen:
Visual Basic:
Option Explicit
 
Private Sub startdart501_Click()
 
    Dim sp As Integer, cnt As Integer, Result As String, bError As Boolean, sSpieler() As String 'sSpieler beinhaltet die Spielernamen
    bError = False
 
    sp = Application.InputBox("Bitte Spieleranzahl eingeben.", "Spieleranzahl", , Type:=1)
    If sp > 4 Then sp = 4: MsgBox "Maximal 4 Spieler! 4 Spieler werden angenommen!"
    ReDim sSpieler(sp)
    sSpieler(1) = dart501.Label5.Caption
    
    For cnt = 1 To sp
    
        If bError Then bError = False: MsgBox "Bitte einen Namen eingeben!"
        Result = Application.InputBox("Bitte " & cnt & " Namen eingeben.", cnt & " Spielername", , Type:=2)
        If Result = "" Then bError = True: cnt = cnt - 1 Else sSpieler(cnt) = Result
            
    Next cnt
    
    NextUserForm.Show

End Sub


Der Doc!
 
Absolute Spitzenklasse! Vielen Dank für deine großartige Hilfe!

Ein Problem(chen) hab ich nun. Versuche schon seit einigen Stunden einen Sverweis zu machen. Das Problem hierbei ist, dass die Daten nicht in einer Tabelle stehen sollen (Habe die Datei als *.xaml gespeichert, ohne Arbeitsblatt). Kann man diese in ein Mudul schreiben und diese mit einem Sverweis abfragen? Oder ist es besser, die Dateien aus einer externen Excel-Tabelle zu laden?

Ein anderes Problem gibt sich, wenn ich versuche die Eingaben der TextBox zu zählen um anschließend den Mittelwert in einem weiteren Label auszugeben. Dies ist aber nur ein Sekundär Problem =)

Nachtrag:

Und warum kann ich nach einer Fehlermeldung den Focus nicht in TextBox1 lassen? Er springt automatisch in die 2te Textbox.

Auch

Code:
      TextBox2.SetFocus
      TextBox1.SetFocus

funktioniert nicht.

Zweiter Nachtrag:

Habe nun rumprobiert und die TabStop-Funktion benutzt. Damit gehts!

Dritter Nachtrag:

Wenn ich auf Enter drücke, ohne dass etwas eingegeben wurde, dann kommt auch eine Fehlermeldung "Typen unverträglich"! "w = TextBox1.Value" wird dann gelb markiert. Kann man das umgehen?

MFG
 
Zuletzt bearbeitet:
Ich hab jetzt kein Excel da zum testen, eine Textbox wird aber normalerweise über .Text angesprochen und nicht über .Value.
Visual Basic:
w = TextBox1.Text


Der Doc!
 
Hi

Das hab ich auch schon versucht. Das Problem ist, dass ich kein Text in dm Feld haben will. Es werden nur Zahlen eingetragen. Wenn das Feld leer ist, also "", dann soll eine Fehlermeldung kommen. Dies klappt, wenn ich die TextBox als Variant deklariere, dann kann ich aber die Zahlen 20, 30, 40, etc nicht eingeben... Das selbe mit String - kein Plan warum. Wenn ich als Integer deklariere, dann klappt's mit allen Zahlen bestens, aber nicht, wenn das Feld leer ist und ich Enter drücke. Dann kommt nämlich die Meldung "Typen unverträglich".

Ich mein, es geht auch so, nur wenn man aus versehen mal die Entertaste drückt, ohne was einzugeben vorher, dann stürzt es immer ab.

Komisch, komisch ..
 
Eine Textbox als Variant oder Integer? Eine Textbox ist eine Textbox, in welche Variable du den Inhalt ausliest, hat nichts mit der Textbox allgemein zu tun.

Um zu prüfen, ob eine Textbox leer ist, verwendet man
Visual Basic:
If Text1.Text = "" Then 'Textbox hat keinen Inhalt

Wenn du verhindern willst, dass in deiner Textbox etwas anderes als Zahlen eingegeben werden, kannst du das KeyPress-Event verwenden:
Visual Basic:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
End Sub

Alternativ kannst du den Wert der Textbox auch mit Val() in eine Zahl umwandeln, Val() wandelt alles bis zum ersten alphanumerischen Zeichen in eine Zahl um und ignoriert alles dahinter (z.B. "12g65" wird zu 12).


Der Doc!
 
Dies funktioniert alles prima, danke!

Mein letztes Problem bereitet mir ein Verweis in eine fremde Excel Datei.

Code:
Private Sub sverweis()

 If Label1.Caption > 2 Or Label1.Caption < 171 Then

        Dim objExcel As New Excel.Application
        Dim objSheet As Object
   
        objExcel.Workbooks.Open ("E:\VBA Projekte\Dart Rechner\" & "finishes.xlsm")
   
        Set objSheet = objExcel.Sheets("Tabelle1")
        
        fsp1.Caption = WorksheetFunction.VLookup(Label1.Caption, objSheet.Range("A1:B169"), 2, False)
      
 End If

End Sub

Also, wenn im Label1 eine bestimmte Zahl steht soll er in der oben genannten Datei den Wert zu der Zahl suchen und in fsp1 wiedergeben. Macht er aber nicht ^^

Das Label fsp1 bleibt einfach leer.

Hab ich irgend etwas vergessen? Also die Pfadangaben sind alle richtig.

##### -- EDIT -- #####


Habe jetzt ein wenig weiter geforscht und folgendes probiert

Code:
Private Sub UserForm_Activate()

    Dim objExcel As New Excel.Application
    Dim objSheet As Object
    Dim varSuchbegriff As Variant

 If Label1.Caption > 2 Or Label1.Caption < 171 Then varSuchbegriff = Val(Label1.Caption) Else varSuchbegriff = Label1.Caption
 
        On Error Resume Next
   
        objExcel.Workbooks.Open ("E:\VBA Projekte\Dart Rechner\" & "finishes.xls")
   
        Set objSheet = objExcel.Sheets("Tabelle1")
        
        fsp1.Caption = WorksheetFunction.VLookup(varSuchbegriff, objSheet.Range("A1:B169"), 2, False)
        
        If Err.Number <> 0 Then fsp1.Caption = ""
        
        On Error GoTo 0

End Sub

Dies funktioniert! Die Daten aus der externen Excel-Datei werden auch angezeigt.

Nur leider funktioniert dies nur ein einziges Mal. Und zwar wenn die Userform gestartet wird. Wie lautet denn der Sub-Befehl den ich anwenden muss? Habe schon alles mögliche versucht.

Ich möchte es ca. so haben: Sub TextBox1.Focus() also jedes Mal wenn der Cursor in der Textbox ist.

MfG
 
Zuletzt bearbeitet:
Bei Excel-VBA heißt das Ereignis nicht Focus() oder GotFocus() sondern Enter():
Visual Basic:
Private Sub TextBox1_Enter()
   'Dein Code
End Sub


Der Doc!
 
Zurück