Private Sub CommandButton1_Click()
[COLOR=Green] '****by SPITNOLAN08 pour Cookii sur XLD
'****Date : 09/05/2008
'****http://www.excel-downloads.com/forum/96340-souci-de-tableur-avec-chiffre-aleatoire.html[/COLOR]
Dim Liste As String
Dim i As Integer, j As Integer, r As Integer, q As Integer, k As Integer, Nb As Integer, Lim As Integer
Dim TxDispo As Double
Dim TabloVide(1 To 14, 0 To 7) [COLOR=Green]'***La 1ère dim (0) gère le nombre de vides déjà placés dans la colonne correspondant, les dim (1 à 6) comptabilisent le nombre de vides déjà placés par portion de colonne, la dim (7) compte le nombre de valeurs déjà placées par colonne[/COLOR]
Dim TabloValRest(1 To 14, 0 To 1) [COLOR=Green]'***La 1ère dim gère le nombre de valeurs restant à placer dans la colonne correspondant, la 2ème dim comptabilise le nombre de lignes restant à parcourir[/COLOR]
Randomize [COLOR=Green]'***Initialise le générateur de nombre aléatoire[/COLOR]
Range("A1:N30").ClearContents
Nb = 0
For j = 1 To 14
Lim = IIf(j = 1, 14, 15) [COLOR=Green]'***Détermine le nombre de valeurs de chaque colonne[/COLOR]
Nb = Nb + Lim [COLOR=Green] '***Détermine la valeur la plus élevée pouvant être inscrite dans une colonne[/COLOR]
k = Lim + 1 [COLOR=Green] '***Initialise la variable de choix[/COLOR]
TabloValRest(j, 0) = Lim '[COLOR=Green]***Initialisation du nombre de valeurs maximales[/COLOR] pouvant être saisies par colonne
TabloValRest(j, 1) = 24 [COLOR=Green]'***Initialisation à 24 lignes potentielles du tableau à remplir[/COLOR]
For i = Nb To Nb - Lim + 1 Step -1
Liste = i & "." & Liste [COLOR=Green]'***Définit la liste des valeurs pouvant être prises dans une colonne[/COLOR]
Next
For i = 1 To 30
q = Int(i / 5) + 1 [COLOR=Green]'***Définit dans quelle portion de la colonne on se trouve[/COLOR]
r = i Mod 5 [COLOR=Green] '***Définit sur quelle ligne de la portion de colonne on se trouve[/COLOR]
If r <> 0 Then [COLOR=Green]'***Ne renseigne pas les lignes qui sont un multiple de 5[/COLOR]
vide = Int((4 * Rnd) + 1) [COLOR=Green] '***Détermination aléatoire des vides dans chaque portion[/COLOR]
TabloValRest(j, 1) = TabloValRest(j, 1) - 1 [COLOR=Green]'***Actualise le nombre de ligne restant à renseigner par colonne[/COLOR]
TxDispo = (TabloValRest(j, 1) - (7 - q)) / IIf(TabloValRest(j, 0) = 0, -1, TabloValRest(j, 0))[COLOR=Green] '***Détermine le taux de disponibilité des lignes restantes en fonction du nombre de valeurs. Si ce taux est <= à 1 la ligne ne peut être vide
'*** Le test suivant se décompose ainsi :
'*** (Part1.1 and Part1.2)
'*** Si Le tirage aléatoire de vide est égal à 1 et que le nombre total de vides de la colonne est inférieur à 9 alors ...
'*** (Part1.1 and Part 1.2) or Part 1.3
'*** Si ... ou La division du nombre de valeurs restant par le nombre de portions non encore remplies est inférieure à 1
'*** ce qui signifie qu'il reste au maximum une valeur par portion à placer
'*** Les conditions précédentes visent à placer des blancs
'*** ((Part1.1 and Part 1.2) or Part 1.3) and Part 1.4
'*** Cette dernière condition limite le placement de blanc. En effet si TxDispo >= 1 alors il faut obligatoirement une valeur dans la case actuelle.[/COLOR]
If ((vide = 1 And TabloVide(j, 0) < 9 And TabloVide(j, q) < 3) Or TabloValRest(j, 0) / (7 - q) < 1) And TxDispo > 1 Then
TabloVide(j, 0) = TabloVide(j, 0) + 1
TabloVide(j, q) = TabloVide(j, q) + 1
Else
If TabloVide(j, 7) < Lim And (r < 4 Or TabloVide(j, q) > 0) Then
TabloVide(j, 7) = TabloVide(j, 7) + 1
TabloValRest(j, 0) = TabloValRest(j, 0) - 1
k = k - 1
MyValue = Int((k * Rnd) + 1)[COLOR=Green] '***Détermination aléatoire des valeurs parmi la liste autorisée[/COLOR]
Tablo = Split(Liste, ".")
Cells(i, j) = Tablo(MyValue - 1) [COLOR=Green]'***Transforme la liste en tableau à une dimension[/COLOR]
Liste = Replace(Liste, Tablo(MyValue - 1) & ".", "", 1, 1) [COLOR=Green]'***Met à jour la liste des valeurs autorisées[/COLOR]
End If
End If
End If
Next i
Next j
End Sub