HERBERS Excel-Forum - das Archiv
Schleife hängt sich bei mehr als 7 Wiederholungen auf
Mikaes
Liebes Forum,

bis jetzt war ich nur stiller Leser und konnte soweit für jedes Problem hier eine Antwort finden. Mein aktuelles Problem ist für viele hier vermutlich trivial, ich kann den Fehler allerdings leider nicht finden. Der Code unten baut auf einem Zufallszahlengenerator von denisreis auf.

Die kurze Prozedur soll 100 Zufallstipps in ein Array speichern. Die zweite Schleife funktioniert allerdings leider nur bis maximal "For x = 1 To 7". Ab "For x = 1 To 8" und aufwärts (gewünscht wäre "For x = 1 To 100") gibt Excel keine Rückmeldung mehr. Warum hängt sich die Schleife bei mehr als 7 Wiederholungen auf? Wie kann dies besser gelöst werden?

Private Sub Lotto6aus45()

Dim Array1(1 To 45) As Byte
Dim Array2(1 To 100, 1 To 6) As Byte
Dim x, y, z As Byte

For x = 1 To 45
Array1(x) = x
Next

For x = 1 To 100
For y = 1 To 6
Do
z = Int(Rnd * 45) + 1
Loop Until Array1(z) > 0

Array2(x, y) = z
Array1(z) = 0

Next y
Next x

End Sub

Vielen lieben Dank für jegliche Hilfe!
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
Mikaes
... mir ist der Fehler gerade selbst aufgefallen - ich habe vergessen das Array1 wieder zurückzusetzen - sonst würden nach 7 Durchgeängen ja alle Zahlen im Array auf 0 gehen und die Schleife damit zur Endlosbedingung werden. Hier jetzt eine funktionierende Variante. Vielleicht sieht jemand trotzdem noch Verbesserungspotential?

Dim Array1(1 To 45) As Byte
Dim Array2(1 To 100, 1 To 6) As Byte
Dim i, x, y, z As Byte

For i = 1 To 45
Array1(i) = i
Next

For x = 1 To 100
For y = 1 To 6
Do
z = Int(Rnd * 45) + 1
Loop Until Array1(z) > 0

Array2(x, y) = z
Array1(z) = 0
Next y

For i = 1 To 45
Array1(i) = i
Next
Next x

LG Mikaes
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
Onur
    Dim gezogen() As Boolean, z, x, y, arr(1 To 100, 1 To 6)

ReDim gezogen(1 To 45)
For x = 1 To 100
For y = 1 To 6
Do
z = Int(Rnd * 45) + 1
Loop Until Not gezogen(z)
gezogen(z) = True
arr(x, y) = z
'Cells(x, y) = z
Next y
ReDim gezogen(1 To 45)
Next x
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
Oppawinni
Schön, aber du müsstest dein Ziehungsgerät auch einfach nur immer am Anfang zurücksetzen.


For x = 1 To 100
ReDim gezogen(1 To 45)
For y = 1 To 6
Do
z = Int(Rnd * 45) + 1
Loop Until Not gezogen(z)
gezogen(z) = True
arr(x, y) = z
'Cells(x, y) = z
Next y
Next x
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
Onur
Und am Anfang
Randomize

schreiben
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
daniel
Hi
du kannst das einfacher lösen, wenn du die neuen Funktionen von Excel auch in VBA verwendest:

Sub Lotto1()


Dim Erg, x
Dim i As Long, j As Long

ReDim Erg(1 To 100, 1 To 6)

For i = 1 To UBound(Erg, 1)
x = Evaluate("SORTBY(SEQUENCE(45),RANDARRAY(45))")
For j = 1 To UBound(Erg, 2)
Erg(i, j) = x(j, 1)
Next
Next

End Sub


noch einfacher und vorallem Schleifenfrei geht es, wenn du ein Tabellenblatt als Zwischenspeicher nutzen kannst:
Sub Lotto2()

Dim Erg
With Cells(1, 1).Resize(100)
.Formula2 = "=CHOOSECOLS(SORTBY(SEQUENCE(,45),RANDARRAY(,45)),SEQUENCE(6))"
Erg = .CurrentRegion.Value
.ClearContents
End With
End Sub


die Tipps stehen jeweils im Array Erg

Gruß Daniel
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
Mikaes
Danke Oppawinni, Onur und Daniel für eure super Antworten! - Gibt mir jetzt einiges neues zu denken, muss das jetzt einmal die nächsten Tage verarbeiten (speziell die Anwendung der neuen Excel Funktionen).

Gruß Michael
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
Oppawinni
Schön wäre ja, wenn du Code auch mit Code-Tags posten würdest.
Da gibt es da über dem Eingabefenster par Knöppe. Die kann man durchaus verwenden

Zu deinem Code.
Du muss die Schleife zur Füllung deines Ziehungsgerätes natürlich nicht nochmal hinten anhängen, sondern nur vorne an die
richtige Stelle setzen ...

Etwa:



For x = 1 To 100
'Ziehungsgerät mit Zahlen füllen
For i = 1 To 45
Array1(i) = i
Next
'ziehung
For y = 1 To 6
'Zufallszahl ermitteln bis eine gefunden ist,
'die sich noch im Ziehungsgerät befindet
Do
z = Int(Rnd * 45) + 1
Loop Until Array1(z) > 0
'zahl aus Ziehungsgerät entnehmen
Array1(z) = 0
'in Array speichern
Array2(x, y) = z
Next
Next

AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
daniel
Hi
1. die Dimensionierung als Byte ist nur Ausnahmefällen sinnvoll, nämlich wenn man sehr große Arrays hat und der Variablenspeicherplatz knapp wird. Für die Verarbeitungsgeschwindigkeit ist Byte langsamer als Int oder Long.
Das liegt daran, das moderne Prozessoren in der Regel 32 bit und damit eine Variable vom Typ Long in einem Prozessschritt verarbeiten können, und somit kleinere Einheiten nichts bringen.

2. in VBA muss man jeder Variablen den Typ einzeln zuweisen. Eine Gruppenzuweisung bringt nichts.
in der Zeile: Dim x, y, z As Byte wird nur z als Byte deklariert, x und y werden Variant.
um alle drei Variablen als Byte zu deklarieren, muss man das so schreiben: dim x as Byte, y as Byte, z as Byte

3. wenn man Rnd ohne Randomize verwendet, erhält man nach jedem Excelneustart immer die selben Zufallszahlen.
in VBA ist es so, die "Zufallszahlen" in einer Liste hinterlegt sind und dann der Reihe nach ausgebeben werden. Mit Randomize legt man fest, an welcher Stelle man in die Liste einsteigt.
daher sollte man zu beginn ein Randomize Timer verwenden, damit man immer an einer anderen Stelle der Liste beginnt und somit auch andere zufallszahlen bekommt

4. ganzzahlige Zufallszahlen lassen sich mittlerweile einfacher über Worksheetfunction.RandBetween(1, 45) ermitteln.
hier kann man Ober- und Untergrenze direkt eingeben und es muss nichts gerechnet werden. Außerdem wird kein Randomize benötigt.

Gruß Daniel
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
Oppawinni
Eigentlich hast du ja das Danke verdient. Die Welt ist soo ungerecht.
Alles richtig. Insb. bei Verwendung von Rnd
sollte
Randomize
sollte zumindest einmal am Anfang angewandt werden.
Das kann aber doch auch nicht der ganze Code sein. Es gibt da z.B ja keine Ausgabe.
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
Mikaes
Super, danke dir für die detaillierten Erklärungen - einiges was ich hier nicht wusste, das hilft natürlich sehr!
Gruß Michael