VBA Counter Problem?
Hallo Zusammen,
ich hab ein Problem in VBA. Ich muss bei jedem klicken auf Raten den counter +1 erhöht werden. Leider ergibt sich bei mir eine Endlos-Schleife. Brauche Hilfe.
Private Sub btnRaten_Click()
Dim Userzahl As Integer 'Eingegebene Zahl
Dim PCzahl As Integer 'Zufallszahl
Dim anzahl As Integer
Dim Ende As Boolean
anzahl = 0
PCzahl = Int((Rnd() * 100) + 1)
Userzahl = Val(tbxEingabe.Value)
Ende = False
Do Until Ende = True
anzahl = anzahl + 1
If Userzahl < PCzahl Then
lblAusgabe = "Die Zahl " & Userzahl & " ist zu klein"
Ende = False
ElseIf Userzahl > PCzahl Then
lblAusgabe = "Die Zahl " & Userzahl & " ist zu groß"
Ende = False
ElseIf Userzahl = PCzahl Then
lblAusgabe = "Gewonnen!"
Ende = True
End If
lblCounter.Caption = anzahl
Loop
End Sub
Danke für eure Hilfe.
4 Antworten
Du musst die Funktion aufteilen in zwei Funktionen.
Einmal eine Initialisierungsfunktion, die z.B. aufgerufen wird, wenn das Formular geöffnet wird. Da wird dann eine Zufallszahl erzeugt und der Zähler auf 0 gesetzt.
Und einmal eine Funktion, die aufgerufen wird, wenn der Benutzer auf den Button klickt. Da wird dann jedes Mal geprüft, ob die Eingabe stimmt und der Zähler hochgezählt
Option Explicit
Private Anzahl As Integer
Private PCzahl As Integer
Private Sub UserForm_Initialize()
Anzahl = 0
PCzahl = Int((Rnd * 100) + 1)
End Sub
Private Sub btnRaten_Click()
Dim Userzahl As Integer
If Not IsNumeric(Me.txtEingabe.Value) Then
Me.lblAusgabe.Caption = "Du darfst nur Zahlen eingeben"
Exit Sub
End If
Userzahl = Val(Me.txtEingabe.Value)
Anzahl = Anzahl + 1
If Userzahl > PCzahl Then
Me.lblAusgabe.Caption = "Die Zahl " & Userzahl & " ist zu groß"
ElseIf Userzahl < PCzahl Then
Me.lblAusgabe.Caption = "Die Zahl " & Userzahl & " ist zu klein"
Else
Me.lblAusgabe.Caption = "Richtig. Du hast " & Anzahl & " Versuche gebraucht."
UserForm_Initialize
End If
End Sub
Du hast eine Endlosschleife, weil in jeden Schleifendurchlauf sich weder Userzahl, noch PCzahl ändert.
Ein paar Zeilen habe ich nicht verstanden, weil ich die Befehle nicht kenne:
Userzahl = Val(tbxEingabe.Value)
Das habe ich ersetzt durch
Userzahl = InputBox("Zahl eingaben")
Was macht diese Zeile? Die bisherige Anzahl an Versuchen wird gespeichert in einer Variablen lblCounter. Mit lblCounter wird aber nichts mehr gemacht. Und was .Caption bedeutet verstehe ich nicht.
lblCounter.Caption = anzahl
Verstehen würde ich noch anzahl = lblCounter.Caption aber nicht Caption auf der linken Seite.
Denkbar wäre
lblCounter = anzahl
wobei ja eigentlich "anzahl" der counter ist, da
anzahl = anzahl +1
___________
Zu deinem Problem: Du bist in einer Endlosschleife, da Userzahl sich nicht verändert. Es wird immer vergleichen PCzahl mit Userzahl, aber Userzahl ändert sich nie.
aber anzahl wird doch lblCounter zugewiesen, nicht umgekehrt.
Ich kenne z.B. noch
zahl = Cells(1,1).Value
Hier wird die Zelle angesprochen und dort speziell der Wert extrahiert und zahl zugewiesen. Bei dir ist es aber umgekehrt in der Reihenfolge. Das habe ich so noch nie gesehen:
lblCounter.Caption = anzahl
Nunja. Ich habe zuerst versucht, den Wert in eine Zelle zu speichern und wenn man nochmal auf den Button Raten klickt, dass man diesen Wert so aufrufen könnte. Aber leider hat das auch nicht funktioniert.
Wert in eine Zelle schreiben:
wert = 75
Cells(1,1) = wert
'Abrufen aus der Zelle
wert = Cells(1,1)
aber das kennst du wahrscheinlich
Ok. Aber wie schaffe ich es, dass wenn man auf den Button klickt der Wert anzahl um 1 erhöht wird ohne das ein Laufzeitfehler passiert.
Ist dein Button eine Userform? oder wie darf man sich deinen Button vorstellen?
In der Userform gibt es einen Label für die Textausgabe, eine Textbox, ein Label für die Anzahl der Runde (Anzahl) und der Button Raten
Die Frage wäre, wieso nutzt du überhaupt die Schleife?
Die macht so keinen Sinn. Anzahl wird einfach hochgezählt bis zur Grenze von Integer, dann findet der Überlauf statt. Der Datentyp verträgt keine höheren Werte.
Eine Textbox nennt man nach ungarischer Notation txtEingabe und nicht tbxEingabe.
Sag mal in Worten was getan werden soll.
Ich glaube nämlich mit jedem Klick soll sich die Zufallszahl verändern.
Userzahl tbxEingabe ist eine Textbox in dem der User eine Zahl eingibt. Wenn man auf den Button Raten klickt, dann soll eine if verzweigung prüfen, ob die eingebebene Zahl größer, kleiner oder gleich groß ist. bei jedem klicken soll die anzahl +1 sein. der lblCounter.caption ist ein label, der den Wert von anzahl zurückgibt.