Wie kann ich zufällige Zahlen erzeugen (und in VBA verarbeiten)?
Funktionen für Zufallszahlen bzw. Möglichkeiten, sie errechnen zu lassen, gab es ja schon vor Excel 365. Seit dieser Excelversion gibt es nun auch ZUFALLSMATRIX (), die den Umgang damit etwas vereinfacht. Statt mit Rnd() und * Obergrenze und + Obergrenze zu rechnen, notiert man diese Anforderungen einfach als Parameter in der Funktion selbst. Eine Beschreibung im Detail gibt es bei Microsoft: ZUFALLSMATRIX-Funktion.
Bei dieser Funktion ist man nicht nur auf Zahlen beschränkt, die als solche aussehen, sondern es können auch zufällige Datumsangaben und Uhrzeiten erstellt werden:
- ZUFALLSMATRIX(15;1;"1.1.2020";"15.06.2020";WAHR)
- ZUFALLSMATRIX(15;1;"08:00";"16:00")
Zwei Dinge müssen hier jedoch beachtet werden:
Der letzte Parameter [ganze_zahl] muss bei Uhrzeiten weggelassen oder auf FALSCH bzw. 0 gesetzt werden, da die reinen Zahlen bei Uhrzeiten immer zwischen 0 und 1 sind.
Wie bei allen Arrayformeln nimmt Excel dabei keine Formate mit. Datumsangaben und Zeiten müssen also i. d. R. im Ergebnis neu formatiert werden. Hilfreich kann da der Pinsel Format übertragen sein.
Das Sortieren der Zahlen geht einfach, indem die Funktion SORTIEREN() verwendet wird:
=SORTIEREN(ZUFALLSMATRIX(15;1;"1.1.2020";"15.06.2020";1))
Verwendung in VBA
In VBA wird ein Array durch Nutzung der Funktion so erzeugt, wie es bei der reinen Formel ist. Beispiele:
- arr = Application.WorksheetFunction.RandArray(10, 1, CDate("1.1.2020"), CDate("15.06.2020"))
- arr = Application.WorksheetFunction.RandArray(10, 1, CDate("08:00"), CDate("16:00"))
Die Verarbeitung des Ergebnisarrays erfolgt so, wie es bei SEQUENZ() beschrieben ist. Die einzelnen Daten liegen also in Zeilen vor; bei einer Spalte ist dies der Ubound. Also muss auch auf die erste Spalte zugegriffen werden:
For intI = 1 To UBound(arr) MsgBox intI & ": " & Format(arr(intI, 1), "DD:MM.YYYY") Next
Im Beispiel ist auch schon zu sehen, dass etwaige Ausgaben formatiert werden müssen.
Werden mehrere Spalten erzeugt, muss das beim Zugreifen auf die Arrayelemente beachtet werden:
For intI = 1 To UBound(arr) MsgBox intI & ": " & Format(arr(intI, 1), "hh:nn") & vbTab & Format(arr(intI, 2), "hh:nn") Next
Wie bei der Formellösung kann der Array auch sortiert werden:
arr = Application.WorksheetFunction.Sort(arr)
Auch hier muss natürlich beachtet werden, dass die Daten zweispaltig sein können, wenn der zweite Parameter in der Funktion entsprechend gesetzt ist. Nach der zweiten Spalte würde dann so sortiert:
arr = Application.WorksheetFunction.Sort(arr, 2)
Ob das Sinn macht, ist allerdings eine andere Frage.