VBA-Excel Fehler: Zahl ist ungültig?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

Devo23 
Fragesteller
 02.09.2021, 09:35

Dankeschön!
Es lässt sich eingeben, zeigt jedoch leider nichts an.

0
daCypher  02.09.2021, 09:41
@Devo23

Hast du denn die Tabelle ausgefüllt? Mit der Kundennr in der Spalte H?

Schick am Besten mal deinen Code, dann kann ich dir besser helfen, als wenn ich einfach ins Blaue raten muss.

1
Devo23 
Fragesteller
 02.09.2021, 09:53
@daCypher

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

0
Devo23 
Fragesteller
 02.09.2021, 09:54
@daCypher

Darf es eventuell keine Textbox sein, wo er es ausgibt?

0
Devo23 
Fragesteller
 02.09.2021, 09:57
@Devo23

Die Kundennummer ist bei mir bei C.

0
daCypher  02.09.2021, 10:48
@Devo23

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
1
Devo23 
Fragesteller
 03.09.2021, 06:47
@daCypher

Dankeschön, leider wird bei mir dennoch nichts ausgegeben. :(
Woran kann das liegen?

0
daCypher  03.09.2021, 08:22
@Devo23

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.

1
Devo23 
Fragesteller
 03.09.2021, 11:38
@daCypher

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.

0
Devo23 
Fragesteller
 03.09.2021, 11:52
@Devo23

Ahhh @daCypher, anscheinend durchläuft er bis zum Ende und findet die Angabe gar nicht. Am Ende geht er dann leer aus.
If str = Worksheets("Gesp").Cells(i, 3).Value Then dann ist doch hier etwas falsch

0

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")
Woher ich das weiß:Berufserfahrung – Programmierer
Devo23 
Fragesteller
 03.09.2021, 07:22

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,

0
Suboptimierer  03.09.2021, 07:22
@Devo23

Was bekommst du denn für eine Fehlermeldung?

Weißt du, wie man debuggt?

1
Devo23 
Fragesteller
 03.09.2021, 07:24
@Suboptimierer

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?

0
Suboptimierer  03.09.2021, 07:32
@Devo23

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.

1
Suboptimierer  03.09.2021, 07:36
@Suboptimierer

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
1
Devo23 
Fragesteller
 03.09.2021, 07:38
@Suboptimierer

Danke für die schnelle Rückmeldung. Selbst mit x wird nichts ausgegeben.
Die Nummer steht richtig.
Debuggen habe ich nicht richtig drauf.

0
Suboptimierer  03.09.2021, 07:49
@Devo23

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"
1