Clever-Excel-Forum

Normale Version: Zahlengenerator
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo!

Ich habe einen Zahlengenerator (für 6 Zahlen - wie beim Lotto) erstellt, wobei alle auszugebenden Zahlen nur 1x vorkommen sollen. Ab B3 (bis B8) werden nun meine 6 Zahlen (im Zahlenbereich 1-49) angezeigt.

Hier der Code:

Sub ZahlenGenerator()
  Dim i As Integer, zahlen(5), j As Integer
   
  Randomize
  ' Erste Zahl ziehen, Variable belegen
  zahlen(0) = Int(Rnd * 49) + 1
  ' Die nächsten 5 Zahlen
  For i = 1 To 5
    Randomize
    zahlen(i) = Int(Rnd * 49) + 1
      ' Prüfen, ob Zahl schon gezogen ist
      For j = 0 To i - 1
        If zahlen(j) = zahlen(i) Then
          'Zahl schon gezogen
          i = i - 1
          Exit For
        End If
      Next j
    Next i
  ' Ausgabe der Zahlen in der Tabelle ab B3
  For i = 0 To 5
  Sheets("Tabelle1").Cells(i + 3, 2).Value = zahlen(i)
  Next i
   
End Sub


Ich möchte am Anfang nun eine Abfrage über eine InputBox ("Wie viele Zahlen sollen ausgegeben werden?") machen. Hier wird die Anzahl der auszugebenden Zahlen eingetragen. Z.B. 10. Dann sollen ab B3 die 10 Zahlen (also 1, 2, 3 ..10 - in zufälliger Reihenfolge) bis B12 eingetragen werden.

Wie würde das gehen?

Danke

Gruß Markus
Hi

z.B. so
Code:
Public Sub ZufallB()
Dim Zahlen, Ausgabe, Anzahl, k As Integer

Sheets("Tabelle1").Range("B3:B100").ClearContents
Anzahl = InputBox("Anzahl eingeben", , 1)
If IsNumeric(Anzahl) Then
  With CreateObject("System.Collections.Arraylist")
     Randomize
     Do
      k = Int(Rnd * 49) + 1
       If Not .Contains(k) Then
         .Add (k)
       End If
     Loop While Int(Anzahl) > .Count
     Sheets("Tabelle1").Range("B3").Resize(Int(Anzahl)) = Application.Transpose(.toarray)
  End With
End If
End Sub

Gruß Elex
Ihr armen Antikexcelanten! In XLWeb, XL365, XL2021 alternativ:
=LET(z;ZUFALLSMATRIX(49);VERGLEICH(INDEX(z;SEQUENZ(6));SORTIEREN(z)))
=INDEX(SORTIERENNACH(SEQUENZ(49);ZUFALLSMATRIX(49));SEQUENZ(6))
Code:
Sub M_snb()
  sp = [transpose(row(1:49))]
  [A1:A50] = "=rand()"
  sn = [index(rank(A1:A50,A1:A50),)]
 
  MsgBox Join(Array(sp(sn(1, 1)), sp(sn(2, 1)), sp(sn(3, 1)), sp(sn(4, 1)), sp(sn(5, 1)), sp(sn(6, 1))), vbLf)
End Sub
Hallo Markus,

Deine Aufgabe ist m. E. eine Teilmenge der Funktionalität meines Testdatengenerators:
http://www.sulprobil.com/sbgeneratetestdata_en/

Mir war damals wichtig, dass sich die generierten Daten nicht ständig ändern, wenn F9 gedrückt wird, sondern genau dann, wenn ich die Daten durch Drücken des Makroknopfes neu erzeugen will.

Viele Grüße,
Bernd
Mitleid mit Lupo1: nur 2 sehr einfache Excel-Formel Rand & Rank.
F9 oder Button benützen.
@snb: 
  • RANK (RANG) ist eine etwas "behinderte" Excel-Funktion (muss z.B. immer von ZUFALLSZAHL()-Funktionen getrennt sein; außerdem s.u.). 
  • Außerdem hat MS bei den vielen RANG-Versionen es nicht geschafft, alle wirklich relevanten Fragen zu erschlagen.
  • Und wenn Du Deine 4 (unvermeidlichen!) Zeilen gegenüber meiner einen wirklich so viel besser findest, dann joine doch mal händisch 27 aus 49.
  • [A1].Formula2R1C1 = "=INDEX(SORTBY(SEQUENCE(49),RANDARRAY(49)),SEQUENCE(27))"

D1:D8: 1 5 4 3 3 4 5 1
=RANG(D1:D8;EINDEUTIG(D1:D8)) klappt nicht
=LET(d;D1:D8;r;EINDEUTIG(d);RANG(d;r)) klappt nicht
Erst =RANG(D1:D8;D10#) mit D10: =EINDEUTIG(D1:D8) klappt wie gewünscht: 4 1 2 3 3 2 1 4. Also nur mit physischem Zelleintrag des Zwischenergebnisses.