PDA

Vollständige Version anzeigen : Schleifen und GOTO


phobos
25.09.2007, 17:52
Hallo Zusammen,

Will grad ein kleines Progrämmchen schreiben und komm bei einem Schleifenproblem nicht weiter.
Habe eine Userform. In dieser sind eine Textbox1 eine Textbox2 und ein Commandbutton.

Nach dem Aufruf der Userform steht in Textbox2 der Wert "170".
In Textbox1 gebe ich Zahlen von 0 bis 170 ein. Diese Zahl soll von den 170 abgezogen werden und in einem Sheet In der nächsten freien Zeile in Spalte 4 eingetragen werden.
Soweit kein Problem.

Jetzt gibt es 3 Fälle die Textbox2 haben kann.

1. Fall. Der Wert in Textbox2 > 0 . Der Wert von Textbox1 soll in die nächste freie Spalte(hinter dem vorherigen Wert) geschrieben werden und von dem aktuellen Wert in Textbo2 abgezogen werden.
2. Fall. Der Wert in Textbox2 < 0 . Es soll der vorherige Wert wieder übernommen werden und eine "0" soll in die nächste freie Spalte geschrieben werden.(ähnlich wie in Fall 2, nur eben eine Null)
3. Fall. Der Wert in Textbox2 = "0" .Dann soll, nach Abfrage ob man erneut beginnen möchte, die nächste freie Zeile beschrieben werden.
Ich hab das mit der GOTO Anweisung lösen wollen, komm da aber im Zusammenhang mit den Variablen auf keine Lösung.

Kann mir da jemand nen Tip geben?

Falls gewünscht häng ich noch meinen Versuch dran.

mfg
phobos

jinx
26.09.2007, 05:59
<font size="2" face="Century Gothic">Moin, phobos,

ich würde auf GoTo verzichten! Verwende stattdessen eine Select Case-Anweisung, die den Wert der Textbox erkennt (Val(Textbox1.Value) und verzweige dann weiter:

Select Case Val(TextBox1.Value)
Case Is > 0
MsgBox "Wert größer Null"
Case Is < 0
MsgBox "Wert kleiner Null"
Case 0
MsgBox "Wert ist genau null"
Case Else
MsgBox "Fall ist nicht vorgesehen!"
End Select
Texteingaben geben die MsgBox genau 0 aus, hier muss eine Prüfung auf IsNumeric für den Textbox-Inhalt zusätzlich erfolgen (Excel97).

Die erste freie Zeile ermittelt man z.B. für die Spalte A ohne Überprüfung der letzten Zelle auf Inhalt durch

lngFirstFree = Cells(Rows.Count, 1).End(xlUp).Row + 1</font>

phobos
30.10.2007, 11:58
hey jinx, danke für deine Info.

Ich komm da einfach nicht mehr weiter, mach schon zig Stunden rum.:rolleyes:
Ich habe die Sub in eine Userform geschrieben.

Da sind ja 2 Textboxen. In die erste Box soll ein Wert eingetragen werden. Dieser Wert soll nun von dem aktuellen Wert (Variable "a") in der zweiten Box abgezogen werden. (Startwert = "170")
Wenn ich die Userform aufrufe muss der Wert in der 2 Box "170" betragen!
Dann muss der Wert solange reduziert werden bis der Wert "0" ist.
Schreib ichs in die Sub ( a = 170) wird der Wert ja immer auf "170" zurückgesetzt.:(
Schreib ichs auserhalb der Sub funzt es auch net.

Hab die Datei mal im Anhang. Dann isses vielleicht verständlicher.

jinx
06.11.2007, 05:46
<font size="2" face="Century Gothic">Moin, phobos,

Du hast die Initialisierung für die Textbox sowohl im Userform_Activate als auch in der Schaltfläche eingestellt. Ändere bitte den Code für die Schaltfläche wie folgt ab:

Private Sub CBOK_Click()
Dim z As Long
Dim s As Long
Dim a As Long

a = aktuellepunkte.Text
z = Cells(Rows.Count, 1).End(xlUp).Row
s = Cells(z, Columns.Count).End(xlToLeft).Column + 1
If s < 5 Then
s = 5
End If
'übergabe der Werte
With Sheets("170")
.Cells(z, 1) = Date
.Cells(z, s) = Me.TBPunkte
End With
If Not IsEmpty(TBPunkte) Then
a = a - Me.TBPunkte
Me.aktuellepunkte.Text = a
With Me.TBPunkte
.Text = " "
.SetFocus
End With
End If
'Fallunterscheidung
Select Case Val(aktuellepunkte.Value)
Case Is > 0
MsgBox "Wert größer Null"
Case Is < 0
If MsgBox("Wert kleiner Null" & vbCrLf & "Neues Spiel?", vbYesNo + vbDefaultButton2 + vbQuestion) = vbNo Then
Unload Me
Else
aktuellepunkte.Text = 170
z = z + 1
Cells(z, 1).Value = Date
End If
Case 0
MsgBox "Wert ist genau null"
Case Else
MsgBox "Fall ist nicht vorgesehen!"
End Select
End Sub
Und tu Dir bitte selbst für die Zukunft mit einer aussagekräftigeren Benennung von Variablen einen Gefallen (oder schreibe Kommentare zu den Benamsungen für diejenigen in den Code, die ihn später warten müssen - mein Favorit bleibt aber der erste Weg ;)).</font>

phobos
06.11.2007, 08:19
Danke für deine Antwort jinx!

nur mal so zum Verständnis:
Wenn man jetzt mal die Fallunterscheidung aussen vor lässt, dann lag mein Fehler nur daran das ich der Variable nochmal in der Schaltfläche einen Wert zugewiesen habe?
Was ist mit diesem Block?
If Not IsEmpty(TBPunkte) Then
a = a - Me.TBPunkte
Me.aktuellepunkte.Text = a
With Me.TBPunkte
.Text = " "
.SetFocus
End With
End If

Was bewirkt hier die If-Abfrage?

Wenn du mir das erklären könntest!?, Vielleicht kapier ichs dann:rolleyes:

jinx
06.11.2007, 08:28
<font size="2" face="Century Gothic">Moin, phobos,

wenn bei jedem Druck der Schaltfläche der Wert neu eingestellt wird, kann es sich nur schwerlich gezielt verringern.

Wegen der Nachfrage: drück doch bitte mal ohne einen Eintrag in die obere Textbox auf die Schaltfläche. Der normalerweise auftretende Laufzeitfehler soll durch diese If-Bedingung abgefangen werden, der Wert soll nur bei nichtleerer Box (für die auch nur Werte bei der Eingabe zugelassen werden können) weiterberechnet werden...</font>