VBA-Excel Fehler: Zahl ist ungültig?
Hallo, ich arbeite zurzeit an einer Excel:
Ich versuche Daten aus einer Tabelle durch eine Abfrage der Nummern in einer UserForm auszugeben.
Mein Problem: Ich habe mir ein Tutorial angeschaut, doch dort wurde int benutzt, meine Nummer beinhaltet jedoch auch Buchstaben; das Ändern in String geht jedoch nicht.
Fehlermeldung bei der Eingabe = Zahl ungültig.
Tutorial: https://www.youtube.com/watch?v=HQ01Mt0CPRg
Wäre super, wenn mir das jemand definieren könnte.
LG
Devo
2 Antworten
Ich hab mir nicht das komplette Video angeschaut, aber bei der InputBox kannst du hinten den Teil mit Type:=1 weg machen, dann wird einfach ein String zurückgegeben.
Sub Kundensuche()
Dim i As Integer
Dim TNummer As String
Dim AnzZeilen As Long
AnzZeilen = Worksheets("Gesp").UsedRange.Rows.Count 'Zeilen zählen
TNummer = Application.InputBox("Bitte Kundennummer angeben", "Kundennummer", Type:=2) 'Fenster
For i = 1 To AnzZeilen
If TNummer = Worksheets("Gesp").Cells(i, 3).Value Then
With Worksheets("Gesp")
UserFormDaten.TB_T.Value = .Cells(i, 3).Value
UserFormDaten.TB_M.Value = .Cells(i, 5).Value
UserFormDaten.TB_I.Value = .Cells(i, 6).Value
UserFormDaten.TB_B.Value = .Cells(i, 8).Value
UserFormDaten.TB_B2.Value = .Cells(i, 7).Value
UserFormDaten.TB_S.Value = .Cells(i, 2).Value
UserFormDaten.TB_G.Value = .Cells(i, 1).Value
End With
End If
Next i
UserFormDaten.Show
End Sub
Anscheinend kann VBA die Felder im Formular nicht beschreiben, so lange es noch nicht geöffnet ist.
Ich hab es jetzt mal so gemacht, dass ich das Formular als Objekt erzeugt habe und da die Daten reinschreibe:
Sub Kundensuche()
Dim i As Integer
Dim TNummer As String
Dim AnzZeilen As Long
Dim Formular As UserFormDaten
Set Formular = New UserFormDaten
AnzZeilen = Worksheets("Gesp").UsedRange.Rows.Count 'Zeilen zählen
TNummer = Application.InputBox("Bitte Kundennummer angeben", "Kundennummer", Type:=2) 'Fenster
For i = 1 To AnzZeilen
If TNummer = Worksheets("Gesp").Cells(i, 3).Value Then
With Worksheets("Gesp")
Formular.TB_T.Value = .Cells(i, 3).Value
Formular.TB_M.Value = .Cells(i, 5).Value
Formular.TB_I.Value = .Cells(i, 6).Value
Formular.TB_B.Value = .Cells(i, 8).Value
Formular.TB_B2.Value = .Cells(i, 7).Value
Formular.TB_S.Value = .Cells(i, 2).Value
Formular.TB_G.Value = .Cells(i, 1).Value
End With
End If
Next i
Formular.Show
End Sub
Hmm, bei mir funktioniert das ganze ohne Probleme.
Ein paar Dinge, die sein könnten:
- Er findet nichts (z.B. weil die Daten nicht im Tabellenblatt "Gesp" stehen)
- Er findet zu viel (nachdem etwas gefunden wurde, läuft der Code noch weiter. Vielleicht wird irgendwo was mit leeren Zellen gefunden)
- Du hast einen Schreibfehler in einer Variable (VBA erstellt automatisch jede Variable, die noch unbekannt ist. Du kannst ganz am Anfang des Codefensters 'Option Explicit' schreiben, damit VBA nur die Variablen akzeptiert, die es kennt, bzw. die mit Dim erzeugt wurden.)
- Es wird irgendwo ein Fehler erzeugt und du hast Fehlermeldungen deaktiviert (z.B. mit "On Error Resume Next")
Mehr mögliche Gründe fallen mir nicht ein. Der Tipp von Suboptimierer ist gar nicht schlecht. Lass den Code einfach mal per Hand Zeile für Zeile durchlaufen (Klick in den Code und drücke für jede Zeile F8). Dann kannst du auch mit dem Cursor auf einzelne Variablen gehen und es wird dir angezeigt, welchen Wert sie gerade haben. Oder du kannst einen Rechtsklick auf eine bestimmte Zeile machen und auf "Ausführen bis Cursor-Position" klicken, um zu sehen, ob die Zeile überhaupt jemals ausgeführt wird.
Dankeschön!
Also die Zeilen werden durchlaufen, doch finden tut er nichts bzw gibts nichts aus.
Die Tabelle ist eigentlich lückenlos, nur am ende verständlich wieder leer.
Der Aufbau in Tabelle "Gesp" z.b= 100 | 200 | 1L34B | Kunde2 | 100 | 200, etc.
Und das ca. 20 Zeilen lang. Bei (i, 3) wird die Nummer 1L34B angesprochen.
Omg..... Es war so ein dummer Fehler meinerseits, welchen ich nicht bemerkt hatte. Ich DANKE euch @daCypher ; @Suboptimierer!!
Nimm die gewöhnliche, uralte Inputbox, nicht die von Application. Die gibt immer einen String zurück:
Dim str as String str = Inputbox("prompt", "titel")
Danke für die Antwort.
Funktioniert leider jedoch nicht.
Ich weiß nicht, ob er die Nummer nicht erkennt, oder die Daten gar nicht gelesen werden,
Das ist das Problem. Es kommt keine :( Es öffnet nur die Userform, doch ohne Daten. (Darf ich keine TextBox verwenden?)
Und auch wenn ich eine Nummer eingebe, die nicht dabei ist, öffnet es die Userform.
Kann es sein, dass was mit dem Öffnen des Fensters nicht stimmt?
Er scheint die Kundennummer nicht im Sheet zu finden. Achte darauf, dass deine Eingabe in der Spalte 8 des Sheets "Daten" steht.
Desweiteren sollte die Zelle in Excel als Text formatiert werden, damit z. B. fehlende führende Nullen den Vergleich nicht scheitern lassen.
Teste erstmal mit einfachen Eingaben. Schreibe in die Zelle "x" und in die InputBox gibst du auch "x" ein.
Und wie gesagt, falls Debugtechniken Teil des Tutorials sein sollten, solltest du diese Lektion vorziehen.
Und noch ein Extratipp: Verzichte wenn möglich im Code auf With.
Statt
With OriginalObjektMitWirklichLangemNamen
...
ist es aus Debuggründen wesentlich besser, dir einen Alias zu schaffen.
Set oomwln = OriginalObjektMitWirklichLangemNamen
Danke für die schnelle Rückmeldung. Selbst mit x wird nichts ausgegeben.
Die Nummer steht richtig.
Debuggen habe ich nicht richtig drauf.
Setze mal AnzZeilen fest auf 100 oder nimm die Schleife weg und setz i auf einen festen Wert.
Oder debugge manuell, indem du mittels debug.print schaust, ob eine Codestelle erreicht wurde.
Beispiel
debug.print "Vor der For-Schleife"
Dankeschön!
Es lässt sich eingeben, zeigt jedoch leider nichts an.