Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Schleife hängt sich bei mehr als 7 Wiederholungen auf

Schleife hängt sich bei mehr als 7 Wiederholungen auf
30.04.2024 06:21:20
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!
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
30.04.2024 06:38:17
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
Anzeige
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
30.04.2024 10:46:14
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
Anzeige
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
30.04.2024 15:01:14
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
Anzeige
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
30.04.2024 15:06:57
Onur
Und am Anfang
Randomize

schreiben
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
30.04.2024 14:44:47
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
Anzeige
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
30.04.2024 15:16:58
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
30.04.2024 08:53:34
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

Anzeige
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
30.04.2024 10:43:59
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
Anzeige
AW: Schleife hängt sich bei mehr als 7 Wiederholungen auf
30.04.2024 14:49:09
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
30.04.2024 15:11:17
Mikaes
Super, danke dir für die detaillierten Erklärungen - einiges was ich hier nicht wusste, das hilft natürlich sehr!
Gruß Michael
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige