Frage von Marceloblau01, 188

Kann man ein Makro erstellen, dass einen Zufallsgenerator so lange laufen lässt bis eine bestimmte Bedingung erfüllt ist?

Hallo liebe Excel Experten, ich habe einen Zufallsgenerator der mir 6 aus 49 Zahlen , also Lottozahlen , ausgibt. Ich verwende aber für die Lottozahlen eine Schablone , die mir immer dann in einer Zelle eine 1 anzeigt , wenn Zufallszahlen erstellt wurde die bestimmte Bedingungen erfüllen, jetzt möchte ich aber nicht pausenlos die Enf. Taste drücken bis in der von mir bestimmten Zelle eine 1 erscheint. Kann mir vielleicht jemand , unter der Voraussetzung dass das überhaupt geht, ein Makro schreiben das dieser Zufallszahlen so lange generiert bis in der Zelle eine 1 steht? ich möchte dann den Zufallsgenerator immer dann per Button wie neu starten.

wie immer für reichlich Vor und Ratschläge sehr dankbar

MfG Uwe

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Ninombre, Community-Experte für Excel, 120

Alternativ könntest Du die Zahlen auch direkt in VBA erzeugen. Es gibt sicherlich fertige Skripte für Lottozahlen, also das verhindert wird, dass doppelte gezogen werden. Bei den Treffern, die ich hatte, muss man aber angemeldet sein im jeweiligen Forum für den Download.

Quick and dirty wäre es so (Prüfen, ob schon vorhanden und ggf. wiederholen bis es passt)

Sub lotto()
For i = 1 To 6
Cells(1, i).Value = Int((49 * Rnd) + 1)
While WorksheetFunction.CountIf(Range(Cells(1, 1), Cells(1, 6)), Cells(1, i).Value) > 1
Cells(1, i).Value = Int((49 * Rnd) + 1)
Wend
Next
End Sub

Wenn weitere Logik hinter Deiner Prüfung liegt, ist der Ansatz von azmd108 einfacher umzusetzen.

Kommentar von Marceloblau01 ,

Ist ein Makro das die Entf Taste so lange auslöst bis in einer bestimmten Zelle zB C1 eine 1 steht nicht einfacher ?

Kommentar von Marceloblau01 ,

Ninombre, dein Makro ist zwar super und funktioniert , ich würde es gern verwenden aber ich möchte die Zelle bestimmen in der die 1 stehen soll bis das Makro stoppt. an welcher Stelle des Makro muss ich die Zelle angeben?

Kommentar von Ninombre ,

Ich hatte gezögert, weil ich normalerweise nicht VBA und Excelfunktionen verbinden würde. So sollte es aber gehen:

Sub ping()
i = 1
While Cells(1, 3).Value <> 1 'cells 1,3 wäre C1
Cells(100, 1).Value = Int((49 * rnd) + 1) 'hilfszelle A100
If i > 1000 Then Exit Sub 'not-aus damit es nicht endlos läuft
i = i + 1
Wend
MsgBox (i) 'löschen, nur zur info wieviele versuche notwendig waren
End Sub

Es braucht trotzdem eine Hilfszelle, in der über das Makro Änderungen vorgenommen werden, damit die Zufallszahlen neu generiert werden. Dafür habe ich im Beispiel A100 genommen, kann aber jede beliebige Zelle sein.

Geprüft wird jetzt auf C1 - kannst Du ändern wie benötigt. Angabe muss aber numerisch erfolgen als Zeile, Spalte.

Als Sicherheit, dass sich das Makro nicht endlos wiederholt, falls mal ein Fehler gemacht wurde (z.B. die falsche Zelle abgefragt wird, die eben nie 1 werden kann), wird nach 1000 Versuchen abgebrochen. Lässt sich natürlich noch erhöhen. Rein optional, weil es mich interessiert hat wird die Anzahl der Versuche noch als Messagebox ausgegeben. Zeile einfach löschen, wenn es nervt.

Kommentar von Marceloblau01 ,

Hallo Ninombre, wäre es möglich in dieses Makro von dir noch etwas einzubauen? Ich habe folgendes Problem: wenn Aufgrund der Zählenwenn Funktion in der Zelle eine 1 erscheint , worauf ja das Makro anhält, aber der Zellwert 1 entstanden ist weil in dem Zellbereich in dem er sucht ein Doppler vorkam, hält das Makro quasi ständig an wegen dieser Doppler. Kann man nun ein "Doppler- Abfrage" für einen Zellbereich einbauen so dass das Makro automatisch weiter läuft? Das größte Problem sehe ich aber darin das ich ca 390 Zeilen habe mit je einer Zählenwenn Funktion und nur eine Zelle die aus diesen 390 Zellen zählt und auf diese eine Zelle bezieht sich das Makro. Das heißt der Zellbereich der nach Dopplern abgesucht werden muss bezieht sich dann auf zB. A1 : F1 und das dann bis A390 : F390. Ist das machbar?

Vielen Dank im voraus

MfG Uwe

Kommentar von Ninombre ,

hi, gibt es die Prüfung auf die 1 jeweils in allen 390 Zeilen und in jeder Zeile darf es eine Zahl nur einmal geben? Dann müsste es meinem Verständnis nach ja ziemlich viele Versuche geben müssen, bis alle Zeilen gleichzeitig diese Bedingung erfülle. Wenn ich es mit 390 Zeilen und den Zahlen 1-49 teste, kommt es fast nie zustande, dass wirklich keine der Zeilen eine doppelte Zahl aufweist.

Idee daher: In einer Zeile mit Deiner bestehenden Logik die Zufallszahlen generieren, auf C = 1 prüfen und doppelte ausschließen. Sobald das erreicht ist, die Zahlen in eine Zeile kopieren und das Spiel wiederholen bis 390 Zeilen gefüllt sind.

In welchen Spalten stehen denn die Zahlen, die dann zu kopieren wären?

Kommentar von Marceloblau01 ,

Danke für deine Antwort, also das Problem bei mir ist das ich zB 3 Zellen mit Zufallsbereich(1;9) habe dann vielleicht 2 Zellen mit Zufallsbereich (20;29) und dann eine mit Zufallsbereich (40;49) das heißt ich generiere die 6 Zahlen immer einzeln und das 390 mal aber in jeder Zeile generiere ich immer andere Zahlen , dann hab ich also 6 Zellen in jeder Zeile die prüfen und dann eine Zelle die alle 6 Zellen prüft und die Zelle des Sub ping() prüft alle 390 Zellen, aber weil ich so viele gleiche Zahlenbereiche generiere kommt sehr oft ein Doppler, das geht aber leider auch nicht anders zu machen , es sei denn , du weißt wie ich 2 oder 3 Zellen auf den gleichen Zufallsbereich generieren kann. das würde bedeuten beispielsweise A1:A9 Zufallsbereich (1;9) in B1 B2 B3 >>>3 Zahlen generieren ohne Doppler aus diesem Zahlenbereich. Bei A1:A49 Zufallsbereich (1;49) B1,B2,B3,B4,B5 B6, geht das ja auch, ich habe diese Formel. wenn du das schaffst das zu konstruieren auf 2,3 oder 4 Zahlen aus einem Zufallsbereich dann wäre das Problem gelöst.

Kommentar von Ninombre ,

puh, das klingt kompliziert, zumindest schwierig zu verstehen, ohne die Tabellen sehen zu können. Das Problem mit den Zufallsbereich() Formel ist halt, dass sie sich ständig verändern. Evtl. wäre es einfacher handhabbar, die Zahlen per Makro zu generieren. Dafür müsstest Du näher definieren, wie die Zahlenbereiche für die Zufallszahlen aussehen müssen. Ggf. auch als neue Frage einstellen, damit die anderen Excelmenschen auch noch Input liefern können. Gab ja noch ein paar Ideen zum Thema Zufallszahlen. Falls möglich könntest Du die Excel auf Dropbox o.ä. einstellen, denn mit direktem Einblick wird es einfacher die Logik zu verstehen.

Kommentar von Marceloblau01 ,

Ninombre, Vielen vielen Dank funktioniert wunderbar alles super,

Kommentar von Marceloblau01 ,

Ich könnte das Problem auch wie folgt lösen: ich lasse in A1:A49 Zahlen generieren von 1-9 und nehme dann die Formel für B1-B6 die ich habe, die ohne Doppler generiert und beziehe mich dann entweder auf B1 , auf B1 und B2 oder auf B1 ,B2,B3  , so könnte es gehen

Kommentar von Marceloblau01 ,

Das kann ich gerne tun wenn du mir kurz beschreibst wie das geht denn das habe ich noch nicht gemacht, Danke für deine Antwort
Gruß Uwe

Expertenantwort
von Oubyi, Community-Experte für Excel, 79

Angenommen in A1 steht eine Formel, die den Wert in B1 einbezieht und, wenn die Bedingungen erfüllt sind, 1 ausgibt.
Dann würde dieser Code solange einen Zufallswert in B1 schreiben, bis in A1 die 1 berechnet wird:

Sub Zufall()
Dim zelle As Range
With ActiveSheet
Set zelle = .Range("B1")
Do While .Range("A1") <> 1
zelle.Value = Int((49 * Rnd) + 1)
Loop
End With
End Sub

Hilft Dir das?

Kommentar von Marceloblau01 ,

so ist das schon korrekt , doch habe ich 6 Zellen in den Zufallszahlen generiert werden , von 1-49 , und auf diese bezieht sich die Formel in A1 also müssten  in B1-B6 Zufallszahlen generiert werden, und das müsste so lange laufen bis in A1 die 1 erscheint

Kommentar von Marceloblau01 ,

müsste ich dann schreiben ("B1:B6") ????

Kommentar von Oubyi ,

Etwas komplizierter:

Sub Zufall()
Dim i As Integer
With ActiveSheet
Do While .Range("A1") <> 1
For i = 1 To 6
Cells(i, 2) = Int((49 * Rnd) + 1)
Next i
Loop
End With
End Sub

Passt das jetzt so?

Kommentar von Marceloblau01 ,

nein leider nicht, also in A1:A49 steht bei mir =Zufallszahl() ,           in B1:B6 steht diese Formel                                                    =VERGLEICH(KKLEINSTE(A$1:A$49;ZEILE());A$1:A$49;0)

diese Ergeben jetzt ohne Doppler 6 aus 49 Zahlen,  in C1 steht folgende Formel {=WENN(UND($AB3=3;$AK3=3);1;0)} das tut aber nicht zur Sache denn C1 bezieht sich auf andere Zellen, ich möchte nur nicht so lange die Enf Taste drücken müssen bis in C1 endlich mal eine 1 steht. Diese sollte wenn möglich ein Makro übernehmen

Kommentar von Oubyi ,

Das ist ja ein ganz anderes Szenario. Du hast die Zufallszahlen schon, ich wollte sie per Makro generieren.
Du willst also nur solange neu berechnen bis in C1 der Wert 1 steht.
Das sollte einfach so klappen:

Sub neuBerechnen()
Do While ActiveSheet.Range("C1") <> 1
Application.Calculate
Loop
End Sub
Kommentar von Marceloblau01 ,

Geht nicht ein Makro das die Entf Taste so lange auslöst bis in C1 eine 1 steht?????

Antwort
von azmd108, 81

Klar geht das. Du musst einfach nur die entsprechende Zelle auf den Wert eins hin prüfen. Erst wenn der Wert 1 in der Zelle steht, wird das Makro gestoppt.  so z.B. (du könntest den Zufallswert auch in einer Variable speichern und erst dann die Zelle befüllen, wenn diese den Wert 1 annimmt.

Do

Cells(1, 1) = CInt(Int((6 * Rnd()) + 1))

Loop Until Cells(1, 1) = 1

Hier wird eine Zufallszahl zwischen 1 und 6 erzeugt und solange in die Zelle A1 geschrieben, bis der Wert in der Zelle = 1 ist.

Kommentar von Marceloblau01 ,

ich glaube du hast mich falsch verstanden , das Makro soll entweder den vorhandenen Zufallsgenerator (die Enf Taste drücken) bis in Zelle zB C3 eine 1 steht dann stoppen. oder das Makro soll selbst , wenn es geht ohne Doppler , 6 Zahlen aus 49 Zahlen generieren , so lang bis in C3 eine 1 steht. In Zelle C3 befindet sich eine Formel , die wenn bestimmte Bedingungen aus 6 Zahlen erfüllt sind, wenn das so ist , erscheint eine 1.

Kommentar von Oubyi ,

DH!
Sinnvoller ist es aber imho, eine andere Zelle, die von dem Wert in A1 abhängig ist auf 1 zu prüfen.
Denn so könntest Du direkt ein 1 in A1 schreiben, denn nur dann wird die Schleife verlassen.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten