Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema TextBox
BildScreenshot zu TextBox TextBox-Seite mit Beispielarbeitsmappe aufrufen

unterschiedliche Zufallszahlen berechnen

Betrifft: unterschiedliche Zufallszahlen berechnen von: HansW
Geschrieben am: 10.07.2007 20:10:50

Hallo Excelspezialisten,
ich würde mich freuen, wenn mir jemand von Euch bei meinem Problem helfen könnte.
Ich habe folgendes Makro

int2 = 1
int3 = 1
cntr = 0
strd = "D" & int3
strg = "G" & int3
strh = "H" & int2
Do
Range(strh).Formula = "=zufallsbereich(1, " & Range(strd).Value & ")"
int2 = int2 + 1
strh = "H" & int2
cntr = cntr + 1
Loop While (cntr < Range(strg).Value)

Das Makro wird solange durchlaufen, bis der Zähler kleiner als der Wert in der Zelle strg (z.B.4) ist. Ferner schreibt es in die Spalte H eine Zufallszahl aus dem Intervall 1 bis z.B.5 (strd).
Nun möchte ich erreichen, dass das Makro falls es eine Zufallszahl ausgibt, die es schon gibt, eine neue Zufallszahl berechnet.
Also z.B. im ersten Durchlauf gibt die Schleife eine 1 aus und schreibt es in die Zelle H1, im zweiten Durchlauf ist die Zufallszahl eine 3 und wird in H2 geschrieben, im dritten Schleifendurchlauf wird eine 5 in H3 ausgegeben, im vierten Durchlauf wird eine 1 erzeugt und bevor sie in H4 geschrieben wird, wird diese neuberechnet da es sie schon gibt- und so gibt es irgendwann eine beliebige Zahl z.B. 2 aus.
Hat jemand von Euch eine Idee wie man das realisieren kann? Es müssen ja immer alle vorherigen Zellen überprüft werden und gegebenenfalls eine Zelle mehrfach berechnet werden. Ich scheitere leider an dieser Herausforderung.
Vielen Dank für Eure Hilfe im Voraus!
Hans

  

Betrifft: AW: unterschiedliche Zufallszahlen berechnen von: nighty
Geschrieben am: 10.07.2007 20:37:14

hi hans :-)

keine ahnung was du vohast :-))

gruss nighty

hier ein code der leicht anzupassen ist und zur zeit 6 aus 50 zieht ohne doppelte

Option Explicit

Sub makro01()
Randomize Timer
ReDim zuzahl(50) As Integer
Dim zahl(50) As Integer
Dim endeindex As Integer
Dim allezahlen As Integer
Dim ziehung As Integer
Dim gezogen As Integer
endeindex = 50
For allezahlen = 1 To 50
zuzahl(allezahlen) = allezahlen
Next allezahlen
For ziehung = 1 To 6
gezogen = Int(Rnd * endeindex) + 1
zahl(ziehung) = zuzahl(gezogen)
zuzahl(gezogen) = zuzahl(endeindex)
endeindex = endeindex - 1
ReDim Preserve zuzahl(endeindex)
Cells(ziehung, 1) = zahl(ziehung)
Next ziehung
End Sub




  

Betrifft: AW: unterschiedliche Zufallszahlen berechnen von: HansW
Geschrieben am: 10.07.2007 21:00:41

Hi Nighty,
leider bin ich doch nicht ganz so gut mit Excel und im schreiben von Macros. Um es anzupassen bräuchte ich etwas Hilfe von Dir! Ich wäre Dir wirklich dankbar dafür!!!
Also ich verstehe Dein MAcro so:

</p><pre>Sub makro01()
Randomize Timer // hat keine Bedeutung
ReDim zuzahl(50) As Integer // Du definierst ein Feld mit 50 Inhalten und 50 ist keyword
Dim zahl(50) As Integer // zahl wird als Int definiert aber was heißt (50)?
Dim endeindex As Integer
Dim allezahlen As Integer
Dim ziehung As Integer
Dim gezogen As Integer
endeindex = 50
For allezahlen = 1 To 50 // die Schleife wird 50 mal durchlaufen
zuzahl(allezahlen) = allezahlen // verstehe nicht was hier genau geschieht
Next allezahlen //auch hier verstehe ich es nicht ganz
For ziehung = 1 To 6 // Schleife wird 6 mal durchlaufen
gezogen = Int(Rnd * endeindex) + 1 // verstehe ich leider auch nicht
zahl(ziehung) = zuzahl(gezogen) //dito
zuzahl(gezogen) = zuzahl(endeindex) //dito
endeindex = endeindex - 1 //endeindex wird um 1 reduziert
ReDim Preserve zuzahl(endeindex) //hier wird auf redim zugegriffen aber wie
Cells(ziehung, 1) = zahl(ziehung) // was hier geschieht bleibt mir ein Rätzel
Next ziehung // Wiederholung der Ziehung
End Sub</pre><p>

Es tut mir leid, daß ich so eine Flasche bin:-)
1000 Dank für Deine Hilfe und Deine Geduld,
Hans


  

Betrifft: AW: unterschiedliche Zufallszahlen berechnen von: Wolfgang
Geschrieben am: 10.07.2007 21:29:50

Hier der kommentierte Code, inhaltlich unverändert! Sehr schönes Progrämmle! Gruß, Wolfgang

Sub makro01()
Dim zuzahl() As Integer, _
    zahl(50) As Integer, _
    endeindex As Integer, _
    allezahlen As Integer, _
    ziehung As Integer, _
    gezogen As Integer

    ReDim zuzahl(50) 'Das Feld "zuzahl" (enthält später alle [noch]
                    'möglichen Ergebnisse) wird auf 50 Felder gesetzt
    Randomize Timer 'Der Zuf.Zahlen-Generator wird mit der
                    'Systemzeit initialisiert
    endeindex = 50  'Der Zähler für die Anzahl der noch ziehungsfähigen
                    'Zahlen wird mit 50 initialisiert
    
    'Nun wird das Var.-Feld mit Zahlen vorbelegt
    '(1 mit 1, 2 mit 2, ... , 50 mit 50)
    For allezahlen = 1 To 50
        zuzahl(allezahlen) = allezahlen
    Next allezahlen
    
    'Nun wird 6mal gezogen. Gezogen wird nicht direkt das Ergebnis,
    'sondern der Platz im Index. Anfänglich ist Platz und Zahl identisch,
    'später werden verbrauchte Zahlen entfernt und von hinten aufgefüllt.
    For ziehung = 1 To 6
        'Gezogener Index im Bereich 1-50 / 1-49 / 1-48 / ...
        gezogen = Int(Rnd * endeindex) + 1
        'Der Inhalt des gezogenen Index wird in der Variablen "Zahl" gespeichert
        zahl(ziehung) = zuzahl(gezogen) 'z.B. zahl(1) = zuzahl(23)
        'Die "verbrauchte" Zahl wird durch die letzte Zahl
        'des Feldes ersetzt
        zuzahl(gezogen) = zuzahl(endeindex)
        'Der Index der letzten Zahl wird reduziert
        endeindex = endeindex - 1
        'Das Feld wird verkleinert
        ReDim Preserve zuzahl(endeindex)
        'Das 1.(2./3./4./...) Ergebnis wird in Zelle A1 (A2, A3, ...) geschrieben
        Cells(ziehung, 1) = zahl(ziehung)
    Next ziehung
End Sub


Man könnte auch auf die Var. "Zahl" ganz verzichten und das Ergebnis direkt in das Tabellenblatt schreiben. Des weitern muss das Feld "Zahl" hier eigentlich nur 6 Felder enthalten.


  

Betrifft: AW: unterschiedliche Zufallszahlen berechnen von: HansW
Geschrieben am: 10.07.2007 21:32:19

Wolfgang und Nighty,
ich danke Euch ganz herzlich!Ich hoffe, daß ich nun mein Problem lösen kann!
Vielen Dank,
Hans


  

Betrifft: AW: unterschiedliche Zufallszahlen berechnen von: nighty
Geschrieben am: 10.07.2007 21:41:55

hi hans :-)

hier eine bessere beschreibung.bzw erklaer ein wenig detaillierter was du möchtest

gruss nighty

Rem zwingt dich variablen zu deklarieren
Option Explicit

Sub Zufall()
Rem startinitialisierung der zufallszahl
Randomize Timer
Rem deklarierung der variablen
Rem da in diesem beispiel aus 50 zahlen gezogen werden soll,dimensionierung auf 50,wobei 0  _
nicht genutzt wird,siehe auch option base
ReDim zuzahl(50) As Integer
Rem 6 gezogene zahlen also deklarierung auf 6 felder,wobei 0 nicht genutzt wird,siehe auch  _
unter option base
Dim zahl(6) As Integer
Dim endeindex As Integer
Dim allezahlen As Integer
Dim ziehung As Integer
Dim gezogen As Integer
Rem festhalten des ende von diesem array - zahl(50)
endeindex = 50
Rem das eindimensionale array mit 50 feldern wird befuellt mit einer wiederholungsschleife von  _
50 durchlaeufen
Rem alternativ waeren zellen oder selbst definierte zahlen in einem weiteren array
For allezahlen = 1 To 50
zuzahl(allezahlen) = allezahlen
Next allezahlen
Rem eine schleife mit 6 durchlaeufen da 6 zahlen gezogen werden sollen
For ziehung = 1 To 6
Rem ziehung einer zahl zwichen 1-50 bzw bei jedem durchlauf eine verkuerzung um 1 bezugnehmend  _
auf die var endeindex
gezogen = Int(Rnd * endeindex) + 1
Rem zuweisung der gezogenen zahl zu einer neuen variablen
zahl(ziehung) = zuzahl(gezogen)
Rem der gezogene index wird mit der letzten position im array getauscht,daher wird vermieden  _
das doppelte gezogen werden
zuzahl(gezogen) = zuzahl(endeindex)
Rem verkuerzung des array indexes von -1
endeindex = endeindex - 1
Rem redimensionierung des verkuerzten arrays
ReDim Preserve zuzahl(endeindex)
Rem ausgabe spalte a
Cells(ziehung, 1) = zahl(ziehung)
Next ziehung
End Sub




  

Betrifft: AW: unterschiedliche Zufallszahlen berechnen von: nighty
Geschrieben am: 10.07.2007 21:43:51

hi all :-)

schönen dank fuer eure hilfe :-))

gruss nighty


  

Betrifft: AW: unterschiedliche Zufallszahlen berechnen von: HansW
Geschrieben am: 10.07.2007 22:41:11

Hallo Nighty, hallo Wolfgang,
nun muss ich doch noch einmal stören!Mein Problem ist, daß ich eigentlich mehre Durchläufe machen möchte.
Schon stehe ich wieder auf dem Schlauch:-)
So kann ich leider nicht für z.B. ReDim zuzahl(50) statt der 50 Range(xyz).value einsetzen. Schon bekomme ich immer Fehlermeldungen zurück gegeben auch wenn ich eine weitere Variable definiere, muß ich wohl eine Zahl eintippen. Wie kann ich das umgehen?
Das andere Problem ist, daß ich meine Ausgabe auch in eine Schleife einbinden möchte. Die Spalte läßt sich ja ganz einfach angeben (statt 1 für A eine 2 für B usw.) Wenn ich jetzt allerdings z.B. erst in der 3.Reihe anfangen möchte zu schreiben wie kann ich das umsetzen?
Vielen Dank für Eure Hilfe!!!!!!!
Eurer Hans


  

Betrifft: AW: unterschiedliche Zufallszahlen berechnen von: Wolli
Geschrieben am: 11.07.2007 10:25:07

Moin! Bitte sag mal konkret:
1.) Aus welchem Bereich sollen die Zahlen sein? (1-50? 2-7? ???)
2.) Wie viele Zahlen (ohne doppelte) willst Du in einem Durchgang ziehen? Es können nicht mehr sein, als verschiedene Zahlen verfügbar sind.
3.) Wie viele Durchgänge willst Du machen?
4.) Wohin sollen die Zahlen ausgegeben werden? Untereinander? Nebeneinander?

Allgemein: Eine For-Next-Schleife kann auch z.B. "For i = 5 to 17 Step 2" lauten, Start 5, Ende 17, Schrittweite 2. Wenn die Schrittweite nicht angegeben wird, wird 1 angenommen.

Gruß, Wolli (=Wolfgang)


  

Betrifft: AW: unterschiedliche Zufallszahlen berechnen von: nighty
Geschrieben am: 11.07.2007 13:18:18

hi hans :-)

nun kannst es glaub ich besser haendeln,achte auf die kommentare,ausgabe erfolgt ab der dritten zeile,daher +2
bei dem beispiel wo aus den zellen gelesen wird,beginnend ab der 2 zeile,daher das +1

gruss nighty

Option Explicit

Sub makro01()
Randomize Timer
Dim max As Long
Dim ziehungen As Integer
Dim endeindex As Integer
Dim allezahlen As Integer
Dim ziehung As Integer
Dim gezogen As Integer
max = 50 'zwichen1-50 wird gezogen
ziehungen = 6 'anzahl ziehungen
ReDim zuzahl(max) As Integer
ReDim zahl(ziehungen) As Integer
endeindex = max
Rem die naechsten drei zeilen lesen 50 zellen beginnend ab zeile 2 aus der spalte a aus,dann  _
sollte der darunterliegende dreierblock gelöscht werden
For allezahlen = 1 To max
zuzahl(allezahlen) = Cells(allezahlen + 1, 1)
Next allezahlen
Rem die naechsten drei zeilen lesen 50 zahlen aus der wiederholungsschleife aus,dann sollte der  _
darueberliegende dreierblock gelöscht werden
For allezahlen = 1 To max
zuzahl(allezahlen) = allezahlen
Next allezahlen
For ziehung = 1 To ziehungen
gezogen = Int(Rnd * endeindex) + 1
zahl(ziehung) = zuzahl(gezogen)
zuzahl(gezogen) = zuzahl(endeindex)
endeindex = endeindex - 1
ReDim Preserve zuzahl(endeindex)
Cells(ziehung + 2, 1) = zahl(ziehung)
Next ziehung
End Sub




 

Beiträge aus den Excel-Beispielen zum Thema "unterschiedliche Zufallszahlen berechnen"