Frage von enchino, 50

Excel-Zufall : Es passiert immer der gleiche Zufall !?

Hallo Leute,

ich habe in Excel ein programm geschrieben, und dieses Programm liefert mir einen beliebigen Tag im Kalender, und markiert es mit gelb.

Wenn ich jedoch die Datei schließe, und es später wieder öffne, kommt (nach dem drücken des Buttons) exakt der gleiche Tag wie bei der letzten Öffnung, obwohl es doch eigentlich zufällig passieren sollte!

Es wird immer der gleiche Tag kommen, wenn ich die Datei wieder neu öffne.

Wie kriege ich es hin, dass immer ein anderer Tag bei der Neuöffnung der Tabelle drankommt?

Hier der Code:

Sub Datum()
  Dim r As Range, zufallszelle As Integer, zufallsbereich As Integer
  Set r = Range("B2:K32") 'merke dir nur befüllte Zellen (hier nur Konstanten, formeln würden ignoriert)
  zufallsbereich = Int(Rnd() * r.Areas.Count) + 1  'Ermittle, aus wievielen Bereichen die befüllten Zellen bestehen und suche dir irgendeine aus (RND-Funktion)
  zufallszelle = Int(Rnd() * r.Areas(zufallsbereich).Cells.Count) + 1  'Such dir aus dem beliebigen Bereich irgendeine Zelle aus
  r.Areas(zufallsbereich).Cells(zufallszelle).Activate  'Aktiviere die zufallszelle im Zufallsbereich
  r.Areas(zufallsbereich).Cells(zufallszelle).Interior.ColorIndex = 6
End Sub
Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von DeeDee07, Community-Experte für Excel, 17

Initialisiere den Zufallsgenerator mit

Randomize Timer

am Anfang des Codes.

Kommentar von Iamiam ,

DH!

braucht es das immer noch? hab ich nie gemacht und es funktioniert bei mir immer!

Aber ich hätte an sowas deshalb nie gedacht und vllt hilt es dem Frager ja!

Kommentar von DeeDee07 ,

Ich hab hier nur Excel2003, und ja, ich hab einfach dieses simple Makro zum Testen verwendet

Sub zufallszahl()
Range("A1") = Rnd
End Sub

Und tatsächlich, nach jedem Öffnen der Datei und Ausführung des Makros die gleiche Zahl(enfolge) in A1, wenn man Randomize Timer weglässt. KA, ob das in neuen Versionen anders ist.

Deine Analyse mit Knackpunkt "Anzahl Bereiche" sieht für mich als VBA-Laien jedoch auch einleuchtend aus.

Kommentar von Iamiam ,

im Nachhinein gehe ich davon aus, dass die Zuweisung zu einer Area=Bereich plus dsbzgl sinnlosem Kommentar vermutlich ein vereinfachter Ausdruck eines vorher aufwändigeren Bestimmungsverfahrens ist, das die (nicht?) gefüllten Zellen oder Zellbereiche  als Areas listet, damit nichts überschrieben wird.

Könnte ein statistischer Probenahmeplan für bestimmte Produktionstage oder Buchungsüberprüfung etc sein.

Das Randomize-Verhalten hab ich in all den Jahren noch nie beobachtet, könnte da eine Einstellung eine Rolle spielen? (bis hin zu Neuberechnung manuell?)

Kommentar von Iamiam ,

Habs jetzt ausprobiert, Du hast recht! ganze Liste (9 items) gleich!

und

  • randomize timer hilft!


Dim i: Randomize Timer: For i = 1 To 9: Range("A" & i) = Rnd: Next

Kommentar von enchino ,

oh mein gott, so einfach geht das? O.o , danke :)

Expertenantwort
von Iamiam, Community-Experte für Excel, 15

Da sind möglicherweise Missverständnisse drin.

  • Mit Set r = Range("B2:K32") definierst du einen Bereich mit nur 1 Area. Im Kommentartext finde ich  keinerlei Bezug zu dem, was in der Befehlszeile läuft.
  • zufallsbereich = Int(Rnd() * r.Areas.Count) + 1 : Da Rnd()=0..<1 ist Int(<1+1) immer 1 (könnte aber auch  beabsichtigt sein,)
  • zufallszelle = Int(Rnd() * r.Areas(zufallsbereich).Cells.Count) + 1 ist ergo
  • = Int(Rnd() * r.Areas(1).Cells.Count) + 1 und sollte tatsächlich eine Zellnummer >1 in Area1 ergeben, ist richtig
  • Da ich keinen wirklichen Fehler finde, hab ich vor End Sub noch diese Zeile eingefügt:
  • Debug.Print r.Areas(zufallsbereich).Cells(zufallszelle).Address & ", "



Daraufhin hab ich das Makro mal laufen lassen, dann einem Knopf zugewiesen, 
mit diesem Ergebnis (im Direktfenster, in Tabelle aneinandergehängt):

$D$11, , $B$22, , $H$10, , $G$27, , $G$32, , $B$9, , $E$32, , $G$18, , $K$32, , $F$2, , $C$5, , $I$26, , $F$3, , $J$13, , $F$31 ,  

ab hier Colorindex = 4 = grün, Datei geschlossen und wieder geöffnet:

$G$18, , $K$10, , $B$26, , $G$25, , $K$23, , $J$14, , $G$26, , $J$31, , $I$3, , $D$13, , $I$25, , $E$20,

Du siehst, bei mir funktioniert es! ???

Kommentar von Iamiam ,

möglicherweise hat es bei der ersten Probe deshalb lauter unterschiedliche Werte geliefert, weil ich vorher schon etliche Male Rnd abgefragt hatte. Wie im Kommentar zu Dee-Dees AW vermerkt, hat es ohne  Randomize Timer nach einem Start und einem Neustart der Datei sehr wohl gleiche Wertepaare geliefert.

Der Teufel ist eben ein Eichhörnchen - auch in VBA!

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten