Hallo ex13,
das Bild widerspricht deinen bisherigen Angaben. Was soll sich wie widerholen? In der Ausgangsfrage war
die Bedingung, dass keine Zahl doppelt vorkommen darf. Mein Makro ist so aufgebaut, dass mit jeder
Ausführung 14 freie Felder gefüllt werden. Wenn du es also ein zweites Mal ausführst, kommt jede Zahl 2x
vor usw. bis alle Felder gefüllt sind.
Die Reihensortierung im Bild ist anders als von dir beschrieben. Die Reihen, die (nur) keine 0er, 10er, 20er
usw. haben dürfen, stehen nicht wie beschrieben direkt hintereinander. Dadurch kann der Code natürlich
viel einfacher aufgebaut werden. Hab diesen jetzt mal deinem Bild angepasst. Versuch's mal damit:
Sub ZahlenVerteilen()
Werte = Array(2, 6, 8, 12, 16, 20, 26, 28, 30, 32, 34, 40, 42, 44)
Set Zielbereich = Range("B4:D21")
If Zielbereich.Cells.Count < UBound(Werte) Then
MsgBox "Zielbereich ist zu klein um alle Werte zu verteilen"
Exit Sub
End If
Randomize Timer
For w = 0 To UBound(Werte)
startzeit = Timer
Do
setzen = True
z = Int(Rnd * Zielbereich.Rows.Count) + 1 'Zeile berechnen
s = Int(Rnd * Zielbereich.Columns.Count) + 1 'Spalte Berechnen
If Application.WorksheetFunction.Count(Zielbereich) _
= Zielbereich.Count Then Exit Sub 'Prüfung ob noch freie Zellen vorh.
Select Case z
Case 1 To 5 'nicht 0-9 bzw. 0-9|10-19, 0-9|20-29 usw.
If Int(Werte(w) / 10) = 0 Or Int(Werte(w) / 10) = z - 1 Then setzen = False
Case 6 To 9 'nicht 10-19 bzw. 10-19|20-29, 10-19|30-39 usw.
If Int(Werte(w) / 10) = 1 Or Int(Werte(w) / 10) = z - 5 Then setzen = False
Case 10 To 12 'nicht 20-29 bzw. 20-29|30-39, 20-29|40-45
If Int(Werte(w) / 10) = 2 Or Int(Werte(w) / 10) = z - 8 Then setzen = False
Case 13 To 14 'nicht 30-39 bzw. 30-39|40-45
If Int(Werte(w) / 10) = 3 Or Int(Werte(w) / 10) = z - 10 Then setzen = False
Case 15 'nicht 40-45
If Int(Werte(w) / 10) = 4 Then setzen = False
End Select
If Timer >= startzeit + 5 Then Timeout = True
'wenn keine der verfügbaren freien Zellen für die Zahl in Frage kommt.
Loop Until Zielbereich.Cells(z, s) = "" And setzen = True Or Timeout
Zielbereich(z, s) = Werte(w)
Next w
End Sub
Du kannst die Bedingungen auch leicht selbst anpassen. Die Logik im Code sagt: wenn in
die x-te Zeile im Zielbereich ausgewählt wurde, prüfe ob das 10tel des aktuellen Wertes dort
reingeschrieben werden darf. Wenn nicht wird die Variable setzen auf False gesetzt.
Gruß Mr. K.