Dispatching sous VBA
Bonjour le Forum,
Je suis nul en VBA, merci de m'aider quant à mon besoin ci-dessous.
J'ai un tableau avec la plage D9: M100.
Dans la cellule S8 il y a une valeur numérique
Dans la cellule S9 il y a une valeur numérique
Dans la cellule S10 il y a une valeur numérique
Je veux distribuer aléatoirement (avec un bouton VBA) les nombres de 01 jusqu'à le nombre dans la cellule S9 dans la plage D9: M100 selon les conditions suivantes:
1- Distribution aléatoire dans la plage D9:M100 de 01 au numéro de la cellule S9 et ne répétant pas le même numéro dans la même ligne, et remplacez le nombre répété par un autre numéro
2- Le nombre de colonnes dans lesquelles la répartition est autorisée est égal au nombre de la cellule S10
3- Le nombre de lignes dans lesquelles la répartition est autorisée est égal au nombre de la cellule S8
4- Le nombre de colonnes saisi dans la cellule S10 ne dépasse pas le nombre saisie dans S9, si le contraire un message d'erreur s'affiche
4 - La répartition s'effectue uniquement dans les cellules vides de la plage D9:M100
5 - Le même numéro soit répété seulement deux fois et pas plus dans chaque colonne selon la valeur de S9 (par exemple : si la valeur de S9 est égale à 7, alors tous les nombres doivent être répétés deux fois aléatoirement dans chaque colonne , en tenant compte de la première condition, qui est de ne pas répéter les nombres en lignes)
6 - Permettre qu'un seul chiffre soit répété deux fois dans deux lignes différentes (par exemple, si le chiffre 3 est répété, par exemple, dans la ligne 10 et répété dans la ligne 15, cela est autorisé, mais si un autre chiffre, comme le chiffre 7, est répété dans ces deux lignes, cela ne peut pas être autorisé).
7 - Remplacez les cellules contenant des lettres par des cellules contenant des chiffres en fin de colonne (selon les conditions mentionnées précédemment, à l'exception de la condition du nombre de lignes).
Un fichier test en pièce jointe
Cordialement.
bonjour,
je ne comprends pas cette phrase.
5 - Le même numéro soit répété seulement deux fois et pas plus dans chaque colonne selon la valeur de S9 (par exemple : si la valeur de S9 est égale à 7, alors tous les nombres doivent être répétés deux fois aléatoirement dans chaque colonne, en tenant compte de la première condition, qui est de ne pas répéter les nombres en lignes)
Quel est le lien entre S9 qui contient 7 et tous les nombres doivent être répétés 2 fois aléatoirement ? Que doit-il se passer si S9 contient 8 ou 3 ou ... ?
ni celle-ci
7 - Remplacez les cellules contenant des lettres par des cellules contenant des chiffres en fin de colonne (selon les conditions mentionnées précédemment, à l'exception de la condition du nombre de lignes).
peux-tu mettre un exemple pour illustrer chacune de tes 7 contraintes ?
Bonjour h2so4,
Pour la condition 05 j'ai donné un exemple avec le numéro 07, je vais vous éclairasse le principe:
Si la valeur de s9 est égale à un nombre donné, alors tous les nombres de 01 à s9 doivent être répétés une seule fois de manière aléatoire dans chaque colonne et non répétés horizontalement dans les lignes.
Et pour la 07 -ème conditions après une vérification minutieuse, ca va nous donner des contrainte et ce n'est pas possible d'être réaliser (On peut l'ignorer)
En pièce jointe exemple .
Cordialement
Quelqu'un peut m'aider s'ils vous plait.
Merci.
bonjour, un essai
Bonjour BsAlv,
Merci pour votre support.
Ca marche pas, on a des cellules vides lors de dispatching.
Cordialement
6 - Permettre qu'un seul chiffre soit répété deux fois dans deux lignes différentes (par exemple, si le chiffre 3 est répété, par exemple, dans la ligne 10 et répété dans la ligne 15, cela est autorisé, mais si un autre chiffre, comme le chiffre 7, est répété dans ces deux lignes, cela ne peut pas être autorisé).Avec 9 chiffres, on sait créer 36 paires et donc remplir au maximum 36 cellules. Savez-vous ajouter une cellule dans ma solution qui ne enfreint pas règle 6 ? Oubien, je n'ai pas compris ce règle ...
Dans ma solution, j'avais 35 des 36 combinaisons, donc il me manque encore 1.
Bonjour BsAlv,
J'ai trouvé ce code qui peut faire le nécessaire mais vu que je suis nul en VBA j'ai pas pu ajouté la condition de ne répéter les chiffre dans la même ligne, pouvez-vous ajouter cette condition au code s'il vous plait:
Sub Marco()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim X&, Y&, i&, R&, cnt&
For Each C In Range("d9:m100")
If C.Value = [s1] Or C.Value = [s2] Or C.Value = [s3] Then GoTo 1
C.ClearContents
1 Next
For i = 4 To [S10] + 3
cnt = Application.CountA(Range(Cells(9, i), Cells(100, i)))
For R = 9 To [s8] + 8 + cnt
If Not (IsEmpty(Cells(R, i))) Then GoTo 2
Randomize
3 X = Int(([S9]) * Rnd + 1)
Cells(R, i) = X
Y = WorksheetFunction.CountIf(Range(Cells(9, i), Cells(R, i)), X)
If Y > 2 Then GoTo 3
2 Next R
Next i
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Merci
Cordialement
re, oui, mais ce n'était pas une réponse à ma question
Sub Marco()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim X&, Y&, i&, R&, cnt&
For Each c In Range("d9:m100").Cells
If IsNumeric(c.Value) Then c.ClearContents
Next
For i = 4 To [S10] + 3
cnt = Application.CountA(Range(Cells(9, i), Cells(100, i)))
For R = 9 To [s8] + 8 + cnt
If Not (IsEmpty(Cells(R, i))) Then GoTo 2
Randomize
3 X = Int(([S9]) * Rnd + 1)
Cells(R, i) = X
cnt2 = cnt2 + 1
If cnt2 > 1000 Then MsgBox "deadlock": GoTo 4
Y = WorksheetFunction.CountIf(Range(Cells(9, i), Cells(R, i)), X)
Z = WorksheetFunction.CountIf(Range(Cells(R, 4), Cells(R, 4 + [s8] + 8)), X) '<<<<< condition ligne
If Y > 2 Or Z > 1 Then GoTo 3
2 Next R
Next i
4 Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True
End SubBonjour BsAlv,
Dans 06 condition, chaque numéro de 01 jusqu'à S9 soit répéter en deux dans chaque colonne.
Ex: on a les chiffres de 01 au 08, donc dans chaque colonne on a: deux 1 et deux 2 et deux 3 …. etc. d'une façon aléatoire
NB: quand je lance votre code toujours un message s'affiche "deadlock" sans faire le dispatching.
Merci.
Cordialement.