Zufallszahlen bis Bedingung erfüllt ist
Hallo liebe Allwissenden!
Ich möchte für eine Multimomentaufnahme zufällige Zeitpunkte für Rundgänge ermitteln. Der letzte Rundgang muss aber um spätestens um 16:30 Uhr stattfinden.
Das bedeutet ich muss so lange den Zufallszeitpunkt ermitteln bis dieser <=16:30 Uhr ist.
Ich habe im Moment diesen Code:
Private Sub Zufallsgenerator()
Dim Bereich As Range
Dim zelle As Range
Set Bereich = Range("A3")
For Each zelle In Bereich
zelle.Value = Int((9 - 6 + 1) * Rnd + 6)
Next zelle
Dim Bereich2 As Range
Dim zelle2 As Range
Set Bereich2 = Range("B3")
For Each zelle2 In Bereich2
zelle2.Value = Int((60 * Rnd) + 1)
Next zelle2
end sub
Zunächst wird die Stunde und dann die Minute zufällig ermittelt, in einer Zellfunktion setzte ich das zu einer Uhrzeit per Verkettenfunktion zusammen -ich weiß das das bestimmt auch eleganter geht. In einer anderen Zelle habe ich eine Wennfunktion die entwerder "ok" oder "wiederholen" ausgibt. Ich möchte aber das so lange Zufallszeitpunkte ermittelt werden bis "ok" da steht. Wenn das klappt wäre ich total glücklich. ;)
Noch toller wärs wenn ich die Zufallszeitpunkte für mehrer Tage festlegen könnte mit einem klick. Praktisch, wenn der erste Zufallszeitpunk "ok" ist dann in die darunter liegende Zeile gleich den nächsten zeitpunkt ermittelt und so weiter (für 20 Tage)
Ich kann leider meine Excel nicht hochladen, weil ich auf der Arbeit bin, vielleicht hat ja trotzdem jemand eine Lösung (ich denke eine Schleife wäre das richtige, nur weiß ich nicht wie man das programmiert)
Danke schonmal
Inka
Antwort schreiben
Antwort 1 von gast42 vom 23.10.2021, 10:59 Options
einfachere Lösung:
Anzahl der Minuten vom frühesten bis zum letzten Rundgang
Darüber Zufallszahl laufen lassen
aus ermitteltem Wert die Uhrzeit berechnen
Vorteile: nur eine Zufallszahl, ermittelter Wert liegt immer im zulässigen Zeitraum
Antwort 2 von Inka2009 vom 23.10.2021, 11:57 Options
Hallo
Das hatte ich zunächst auch überlegt.
Ich kopier doch lieber mal den ganzen Code.
Private Sub Zufallsgenerator()
Dim Bereich As Range
Dim zelle As Range
Set Bereich = Range("A3")
For Each zelle In Bereich
zelle.Value = Int((9 - 6 + 1) * Rnd + 6)
Next zelle
Dim Bereich2 As Range
Dim zelle2 As Range
Set Bereich2 = Range("B3")
For Each zelle2 In Bereich2
zelle2.Value = Int((60 * Rnd) + 1)
Next zelle2
Dim Abstand1 As Range
Dim Abstandzelle1 As Range
Set Abstand1 = Range("G3:G3")
For Each Abstandzelle1 In Abstand1
Abstandzelle1.Value = Int((60 - 30 + 1) * Rnd + 30)
Next Abstandzelle1
Dim Abstand2 As Range
Dim Abstandzelle2 As Range
Set Abstand2 = Range("J3:J3")
For Each Abstandzelle2 In Abstand2
Abstandzelle2.Value = Int((60 - 30 + 1) * Rnd + 30)
Next Abstandzelle2
Dim Abstand3 As Range
Dim Abstandzelle3 As Range
Set Abstand3 = Range("M3:M3")
For Each Abstandzelle3 In Abstand3
Abstandzelle3.Value = Int((60 - 30 + 1) * Rnd + 30)
Next Abstandzelle3
Dim Abstand4 As Range
Dim Abstandzelle4 As Range
Set Abstand4 = Range("P3:P3")
For Each Abstandzelle4 In Abstand4
Abstandzelle4.Value = Int((60 - 30 + 1) * Rnd + 30)
Next Abstandzelle4
Dim Abstand5 As Range
Dim Abstandzelle5 As Range
Set Abstand5 = Range("S3:S3")
For Each Abstandzelle5 In Abstand5
Abstandzelle5.Value = Int((60 - 30 + 1) * Rnd + 30)
Next Abstandzelle5
Dim Abstand6 As Range
Dim Abstandzelle6 As Range
Set Abstand6 = Range("V3:V3")
For Each Abstandzelle6 In Abstand6
Abstandzelle6.Value = Int((60 - 30 + 1) * Rnd + 30)
Next Abstandzelle6
Dim Abstand7 As Range
Dim Abstandzelle7 As Range
Set Abstand7 = Range("Y3:Y3")
For Each Abstandzelle7 In Abstand7
Abstandzelle7.Value = Int((60 - 30 + 1) * Rnd + 30)
Next Abstandzelle7
Dim Abstand8 As Range
Dim Abstandzelle8 As Range
Set Abstand8 = Range("AB3:AB3")
For Each Abstandzelle8 In Abstand8
Abstandzelle8.Value = Int((60 - 30 + 1) * Rnd + 30)
Next Abstandzelle8
Dim Abstand9 As Range
Dim Abstandzelle9 As Range
Set Abstand9 = Range("AE3:AE3")
For Each Abstandzelle9 In Abstand9
Abstandzelle9.Value = Int((60 - 30 + 1) * Rnd + 30)
Next Abstandzelle9
Dim Abstand10 As Range
Dim Abstandzelle10 As Range
Set Abstand10 = Range("AH3:AH3")
For Each Abstandzelle10 In Abstand10
Abstandzelle10.Value = Int((60 - 30 + 1) * Rnd + 30)
Next Abstandzelle10
Dim Abstand11 As Range
Dim Abstandzelle11 As Range
Set Abstand11 = Range("AK3:AK3")
For Each Abstandzelle11 In Abstand11
Abstandzelle11.Value = Int((60 - 30 + 1) * Rnd + 30)
Next Abstandzelle11
End Sub
Ich muss nämlich einen Mindestabstand zwischen den Rundgängen haben der zwischen 30 und 60 Minuten liegt. In der Tabelle addier ich die Abstände auf den Startzeitpunkt.
Der Aufbau der tabelleist unngefähr so:
Startzeitpunkt!Abstand1!Rundgang1!Abstand2!Rundgang2...!Endzeitpunkt (fest=16:30)
Das heißt ich berechnte den Startzeitpunk (wie oben, daher liegt der auch zwischen 6 und 9 Uhr) und bilde daann per zufall die Abständer zwischen den Beobachtungen, das sich sind 11 insgesamt. Ingesamt dürfen die 11 Beopbachtungenaber nicht über 16:30 Uhr hinausgehen.
Ich hoffe damit kann jemand etwas anfangen.
;)
Antwort 3 von malSchauen vom 24.10.2021, 00:40 Options
Hi,
Mein Ansatz dafür:
in dieser BeispielmappemalSchauen, ob Du das für Dich verwenden kannst, und ob der Code ausreichend kommentiert ist, damit Du das für Deine Bedürfnisse anpassen kannst.
bye
malSchauen