Verursacht ein Überlauf den Fehler?

D

D@nger

Hallo,

vielleicht wisst ihr von meinem Problem.
Wenn ich auf einen Button klicke, der bestimmte Dinge berechnet beendet sich das Programm auf einigen Rechnern einfach.

Im Commandbutton steht z.B. folgendes (nur ein kleiner Ausschnitt):
Visual Basic:
Private Sub Command2_Click()
If Preis_Luxe.Text <> "" Then
Gpreis_Luxe.Text = T_Luxe.Text * Preis_Luxe.Text * A_Luxe.Text
Else
Preis_Luxe.Text = "0"
Gpreis_Luxe.Text = T_Luxe.Text * Preis_Luxe.Text * A_Luxe.Text
End If
End Sub

So, dieser Code bezieht sich ja jetzt auf Preis_Luxe.Text, Gpreis_Luxe.Text,
T_Luxe.Text und A_Luxe.Text

In diesen Feldern steht folgendes:
Visual Basic:
Private Sub A_Luxe_Change()
If Not IsNumeric(A_Luxe.Text) Then
A_Luxe.Text = "0"
End If
End Sub

Visual Basic:
Private Sub T_Luxe_Change()
If Not IsNumeric(T_Luxe.Text) Then
T_Luxe.Text = "0"
End If
End Sub

Visual Basic:
Private Sub Preis_Luxe_KeyPress(KeyAscii As Integer)
CheckNumericInput Preis_Luxe, KeyAscii, False
'Es wir geprüft, ob die Eingabe numerisch ist.
End Sub

Visual Basic:
Private Sub Gpreis_Luxe_Change()
On Error Resume Next
Gpreis_Luxe.Text = Format(CDbl(Gpreis_Luxe.Text), "###.00")
On Error Resume Next
If Gpreis_Luxe.Text = ",00" Then Gpreis_Luxe.Text = "0,00"
End Sub

So, wenn ich in dem Ereignis Gpreis_Luxe_Change() das "On Error Resume Next" an zweiter Stelle nicht eingebaut hätte würde das Programm auch bei mir einen Fehler melden (Stack....).
ich denke mal, dass das daran liegt, dass diese Zeile immer wieder das Change Ereignis aufruft, oder? Und ich denke mal, dass einige Rechner damit nicht zurecht kommen. Kann das sein?
Denn ich habe es auf einigen Rechnern testen lassen. Auf 2en funktioniert es nicht und auf 2en funktioniert es.

Vielen Dank schon mal.
 
Zuletzt bearbeitet von einem Moderator:
Warum hast du das "On Error Resume Next" überhaupt drin? So merkst du ja gar nicht ob ein Fehler auftritt oder nicht. Mach doch eine "gescheite" Fehlerabfrage. Außerdem macht es keinen Sinn, die "On Error Resume Next"-Anweisung zweimal in eine Prozedur reinzuschreiben (So wie du es bei Gpreis_Luxe_Change gemacht hast). Denn ab dem Zeitpunkt, wo "On Error Resume Next" kommt, ist das für die ganze Prozedur bis "End Sub" gültig.
Mein Vorschlag also:
Code:
Private Sub Gpreis_Luxe_Change()
On Error Goto ErrHandler
10: Gpreis_Luxe.Text = Format(Gpreis_Luxe.Text, "###.00")
20: If Gpreis_Luxe.Text = ",00" Then Gpreis_Luxe.Text = "0,00"

ErrHandler:
If Err.Number <>0 Then
  MsgBox "Fehler Nr." & Err.Number & " in Zeile " & Erl & ":" & vbCrLf & Err.Description
  Err.Clear
End If
End Sub
 
Zuletzt bearbeitet:
Also erstmal sieht es immer sehr hässlich aus, wenn man mit Strings rechnet - nimm mal die Val-Funktion zur Umrechnung von Strings in numerische Werte.

Und dann noch eine kleine Vereinfachung:

Code:
Preis_Luxe.Text = "0"
Gpreis_Luxe.Text = T_Luxe.Text * Preis_Luxe.Text * A_Luxe.Text

... ist dasselbe wie ...

Code:
Preis_Luxe.Text = "0"
Gpreis_Luxe.Text = "0"

Dafür muss ich nicht extra eine Rechnung bemühen ...


Ich habe das mal nachgebaut und ich glaube dein Fehler liegt an Gpreis_Luxe_Change (wie du selber schon vermutet hast). Kann es sein, dass der Programmabbruch nur dann auftritt, wenn als Ergebnis eine 0 rauskommt?

Geh doch einfach mal mit dem Debugger durch die Change-Prozedur. Wenn eine 0 in dem Textfeld (Gpreis_Luxe.Text) steht, dann wandelt die Format-Funktion das ganze um in ",00". Danach gibst du die Anweisung, dass stattdessen "0,00" eingetragen werden soll. Weil aber bei jeder Änderung die Change-Prozedur erneut aufgerufen wird, wird auch wieder die Format-Funktion aufgerufen - und die macht wieder ",00" draus. Hast quasi 'ne Endlosschelife, die früher oder später einen Stack-Fehler verursachen muss.

Umgehen kannst du das, indem du per If-Abfrage festlegst, dass eine 0 nicht durch die Format-Funktion umgewandelt wird, sondern direkt durch "0,00".

Code:
Private Sub Gpreis_Luxe_Change()
    If Val(Gpreis_Luxe.Text) <> 0 Then
        Gpreis_Luxe.Text = Format(CDbl(Gpreis_Luxe.Text), "###.00")
    Else
        Gpreis_Luxe.Text = "0,00"
    End If
End Sub


Gruß David.
 
Oder mach es doch ganz einfach so:
Code:
Private Sub Gpreis_Luxe_Change()
Gpreis_Luxe.Text = vba.Format(Gpreis_Luxe.Text,"0.00")
End Sub
 
Zurück