Tableau de permutations de chiffre sans répétition
bonjour,
je voudrais savoir comment faire pour réaliser un tableau de permutations de chiffre sans répétition.
le but est simple!
a partir d'un nombre a 4 chiffres je voudrais que le tableau me calcule le nombre de possibilités différentes (toujours en utilisant les 4 chiffres a chaque fois mais dans un ordre différents.
je met le tableau en model.
merci d avance
cdlt
nicolas.
Bonjour,
Le nombre de possibilité répond à la formule suivante :
= PERMUTATION(4;4)
Etablir la liste des possibilité ne répond à aucune technique particulière :
Il faudrait faire une macro probablement plus chiante à écrire que de faire cette liste manuellement...
A+
bonjour,
il faudrait juste quond me montre comment faire le début de la macro et je ferai moi même!
cdlt
nicolas
Sans vouloir t'offenser, c'est un peu comme si tu demandais à apprendre le russe ou le chinois...
Pour apprendre à macroter, voir en haut de cette page la rubrique cours VBA ou cliquer sur ce lien
Voici une macro vraiment faite à l'arrache (car je n'ai pas trop de temps...) qui te liste ça.
Option Explicit
Sub galopin()
'Cette routine génére les nombres de
'1 à k dans un ordre aléatoire
Dim tablo(4), i%, ii%, j%, k%, x%
Application.ScreenUpdating = False
Randomize
k = 4
'ReDim tablo(1 To k)
For ii = 1 To 1000
For i = 1 To k
tablo(i) = i
Next
'mélange
For i = k To 1 Step -1
x = Int(((i) * Rnd) + 1)
j = tablo(x)
tablo(x) = tablo(i)
tablo(i) = j
Next
For i = 1 To 4
Cells(ii, i) = tablo(i)
Next
Cells(ii, 5) = tablo(1) & tablo(2) & tablo(3) & tablo(4)
Next
'Tri
With ActiveWorkbook.Worksheets("Feuil1").Sort
.SortFields.Clear
.SortFields.Add Key:=Range("E1"), Order:=xlAscending
.SetRange Range("A1:E1000")
.Header = xlNo
.Apply
End With
'Suppression des doublons
For i = 1000 To 2 Step -1
If Cells(i - 1, 5) = Cells(i, 5) Then Rows(i).Delete
Next
Columns(5).Delete
End SubRemarque : En fait la macro fait 1000 tirages puis élimine les doublons
Je l'ai testé 10 fois et à chaque fois j'ai obtenu les 24 possibilités.
Si par hasard ça ne marche pas du premier coup , lancer la macro une autre fois... (ou mettre 2000 au lieu de 1000 !)
Nota : Si tu veux améliorer la chose, au lieu d'afficher puis de concaténer les tirages en colonne 5 tu pourrais les charger dans un Dictionnary ce qui éliminerait les doublons d'office. Et quand ton Dictionnaire serait complet YORAIPUKA afficher le Dico en splitant...
A+
La même en moins bourrin (Avec Dictionary)
Sub galopin()
Dim tablo(4), i%, ii%, j%, k%, x%, Y As Boolean
k = 4
Application.ScreenUpdating = False
Set Dico = CreateObject("scripting.Dictionary")
Randomize
Do While Not Y
For i = 1 To k
tablo(i) = i
Next
For i = k To 1 Step -1
x = Int(((i) * Rnd) + 1)
j = tablo(x)
tablo(x) = tablo(i)
tablo(i) = j
Next
Dico(tablo(1) & tablo(2) & tablo(3) & tablo(4)) = ""
Erase tablo
Y = Dico.Count = 24
Debug.Print Dico.Count
Loop
[E1].Resize(Dico.Count, 1) = Application.Transpose(Dico.keys)
For i = 1 To 24
Cells(i, 1) = CInt(Mid(Cells(i, 5), 1, 1))
Cells(i, 2) = CInt(Mid(Cells(i, 5), 2, 1))
Cells(i, 3) = CInt(Mid(Cells(i, 5), 3, 1))
Cells(i, 4) = CInt(Mid(Cells(i, 5), 4, 1))
Next
[E1].Sort Key1:=[E1], Order1:=xlAscending, Header:=xlNo
Columns(5).Delete
End SubA+
houla la!!!
merci de ton aide mais je suis débutant et comme tu dit c est du chinois pour moi tout ca!!!;)
ça me semble bcp trop complexe le machin!
merci comme même pour tes explication galopin01.
salut,
nicolas
Bonjour,
Pour le fun, une autre version avec procédure récursive
Sub Permutation()
' donne toutes les permutations sans doublon de la chaîne de caractères qui se trouve en A1
texte = Worksheets(1).Range("A1")
' résultats en colonne à partir de la cellule A2
res = "A2"
If Len(Text) > 9 Then MsgBox "pas plus de neuf caractères": Exit Sub
For i = Len(texte) To 1 Step -1
ntext = ntext & Mid(texte, i, 1)
Next i
Worksheets(1).Rows("2:" & Worksheets(1).UsedRange.Rows.Count + 1).Delete
Set sol = Nothing
perm ntext, sol
Worksheets(1).Range(res).Resize(sol.Count, 1) = Application.Transpose(sol.keys)
End Sub
Sub perm(texte, ByRef dict, Optional ByRef permutext = Empty)
If dict Is Nothing Then Set dict = CreateObject("Scripting.Dictionary")
If permutext = "" Then permutext = texte
For i = 1 To Len(texte)
c1 = Left(texte, 1)
nouveautexte = ""
Mid(permutext, Len(texte), 1) = Mid(texte, i, 1)
For j = 2 To Len(texte)
If j = i Then
nouveautexte = nouveautexte & c1
Else
nouveautexte = nouveautexte & Mid(texte, j, 1)
End If
Next j
If Len(nouveautexte) > 1 Then
perm nouveautexte, dict, permutext
Else
Mid(permutext, 1, 1) = nouveautexte
If dict.exists(permutext) Then Else dict.Add permutext, 0
End If
Next i
End Submerci de vos réponse.. mais je pipe rien!!!
c est possible d'incorporer ça a mon tableau svp!
merci d'avance.
salut
nico.
Bonjour,
Clic droit sur l'onglet de la feuille + Visualiser le code
Coller la macro suivante :
Sub galopin()
Dim tablo(4), i%, ii%, j%, k%, x%, Y As Boolean
k = 4
Application.ScreenUpdating = False
Set Dico = CreateObject("scripting.Dictionary")
Randomize
Do While Not Y
For i = 1 To k
tablo(i) = i
Next
For i = k To 1 Step -1
x = Int(((i) * Rnd) + 1)
j = tablo(x)
tablo(x) = tablo(i)
tablo(i) = j
Next
Dico(tablo(1) & tablo(2) & tablo(3) & tablo(4)) = ""
Erase tablo
Y = Dico.Count = 24
'Debug.Print Dico.Count
Loop
[L6].Resize(Dico.Count, 1) = Application.Transpose(Dico.keys)
For i = 6 To 29
Cells(i, 8) = CInt(Mid(Cells(i, 12), 1, 1))
Cells(i, 9) = CInt(Mid(Cells(i, 12), 2, 1))
Cells(i, 10) = CInt(Mid(Cells(i, 12), 3, 1))
Cells(i, 11) = CInt(Mid(Cells(i, 12), 4, 1))
Next
[H6:L29].Sort Key1:=[L6], Order1:=xlAscending, Header:=xlNo
Columns(12).Delete
End SubAppuyer sur la touche F5
C'est tout.
A+
Un grand merci à vous deux pour vos réponses ça marche!
A la demande d'un autre internaute je donne le code pour 6 éléments :
Sub permut6()
Dim tablo(6), i%, ii%, j%, k%, x%, Dico, Y As Boolean
k = 6
Application.ScreenUpdating = False
Set Dico = CreateObject("scripting.Dictionary")
Randomize
Do While Not Y
For i = 1 To k
tablo(i) = i
Next
For i = k To 1 Step -1
x = Int(((i) * Rnd) + 1)
j = tablo(x)
tablo(x) = tablo(i)
tablo(i) = j
Next
Dico(tablo(1) & tablo(2) & tablo(3) & tablo(4) & tablo(5) & tablo(6)) = ""
Erase tablo
Y = Dico.Count = 720
Debug.Print Dico.Count
Loop
[G1].Resize(Dico.Count, 1) = Application.Transpose(Dico.keys)
For i = 1 To 720
Cells(i, 1) = CInt(Mid(Cells(i, 7), 1, 1))
Cells(i, 2) = CInt(Mid(Cells(i, 7), 2, 1))
Cells(i, 3) = CInt(Mid(Cells(i, 7), 3, 1))
Cells(i, 4) = CInt(Mid(Cells(i, 7), 4, 1))
Cells(i, 5) = CInt(Mid(Cells(i, 7), 5, 1))
Cells(i, 6) = CInt(Mid(Cells(i, 7), 6, 1))
Next
[G1].Sort Key1:=[G1], Order1:=xlAscending, Header:=xlNo
Columns(7).Delete
End SubA+
Nota : Avec une présentation un peu différente voir aussi l'excellente proposition de H2So4 qui peut traiter jusqu'à 9 caractères !(alphanumériques) sans aucune modification de la macro...
Sur le modèle de H2So4 une autre macro qui peut traiter également jusqu'à 9 caractères alphanumériques sans modification :
à mettre dans un module standart (Module1)
Dim Dico
Sub AppelCombi()
Dim TexteCombi As String, Tablo
TexteCombi = Application.InputBox(prompt:="Entrez un string (9 caractères alphanumériques maximum)")
If Len(TexteCombi) > 9 Then Exit Sub
Range("A:A").ClearContents
Set Dico = CreateObject("Scripting.Dictionary")
Call Combi("", TexteCombi)
Tablo = Dico.keys
[A1].Resize(UBound(Tablo) - 1) = Application.Transpose(Tablo)
End Sub
Sub Combi(Prefixe As String, Texte As String)
Dim i As Long
If Len(Texte) <= 1 Then
Dico(Prefixe & Texte) = Prefixe & Texte
Else
For i = 1 To Len(Texte)
Call Combi(Prefixe & Mid(Texte, i, 1), Left(Texte, i - 1) & Right(Texte, Len(Texte) - i))
Next i
End If
End Sub