TAM136 | man_coef a écrit :
Bonjour!
Je suis bloqué pour la réalisation d'une macro.
J'aimerai pouvoir générer toutes les combinaisons possibles d'une suite.
Exemple :
Si on a la suite A-B, le résultat est :
A-B / B-A
Si on a la suite A-B-C, le résultat est :
A-B-C / B-C-A / C-B-A / C-A-B / A-C-B / B-A-C
Je ne suis pas très calé en maths, mais je crois que le nombre de possibilités est une factorielle : Nbr_arguments!
J'ai fait une macro qui fonctionne jusqu'à 4 éléments. Au dela de 4, cela ne fonctionne plus (toutes les possibilités ne sont pas présentées). Je trouve vraiment que cet algorithme est compliqué et je crois que je ne suis pas en mesure de l'inventer. Avez-vous un algorithme qui effectue ce genre d'opérations? Je vous remercie de vous être penchés quelques secondes sur mon message et je vous remercie d'avance si vous avez des choses à me proposer.
Bon courage! ;-)
|
Salut,
Il me semble bien que la macro suivante a été postée sur ce forum:
Code :
- Public Sub CreationChemin()
- Dim intI1 As Integer, intI2 As Integer, intI3 As Integer
- Dim intI4 As Integer, intI5 As Integer, intI6 As Integer, intN As Integer
- Dim strTab As String
- Dim sngChrono As Single
-
- strTab = UCase(InputBox("Saisissez les éléments : ", "Saisie", "ABCDEF" ))
-
- sngChrono = Timer
-
- intI1 = 1
- Do Until Cells(1, intI1).Value = ""
- intI1 = intI1 + 1
- Loop
- Cells(1, intI1).Select
-
- intN = Len(strTab)
- ActiveCell.Value = strTab
- ActiveCell.Offset(1, 0).FormulaR1C1 = "=counta(R4C:R65536C)"
- ActiveCell.Offset(3, 0).Select
-
- For intI1 = 1 To intN
- For intI2 = 1 To intN
- If intI2 <> intI1 Then
- For intI3 = 1 To intN
- If intI3 <> intI1 And intI3 <> intI2 Then
- If Len(strTab) = 3 Then
- ActiveCell.Value = Mid(strTab, intI1, 1) & Mid(strTab, intI2, 1) & Mid(strTab, intI3, 1)
- ActiveCell.Offset(1, 0).Select
- Else
- For intI4 = 1 To intN
- If intI4 <> intI1 And intI4 <> intI2 And intI4 <> intI3 Then
- If Len(strTab) > 4 Then
- For intI5 = 1 To intN
- If intI5 <> intI1 And intI5 <> intI2 And intI5 <> intI3 And intI5 <> intI4 Then
- If Len(strTab) > 5 Then
- For intI6 = 1 To intN
- If intI6 <> intI1 And intI6 <> intI2 And intI6 <> intI3 And intI6 <> intI4 And intI6 <> intI5 Then
- ActiveCell.Value = Mid(strTab, intI1, 1) & Mid(strTab, intI2, 1) & Mid(strTab, intI3, 1) _
- & Mid(strTab, intI4, 1) & Mid(strTab, intI5, 1) & Mid(strTab, intI6, 1)
- ActiveCell.Offset(1, 0).Select
- End If
- Next
- Else
- ActiveCell.Value = Mid(strTab, intI1, 1) & Mid(strTab, intI2, 1) & Mid(strTab, intI3, 1) _
- & Mid(strTab, intI4, 1) & Mid(strTab, intI5, 1)
- ActiveCell.Offset(1, 0).Select
- End If
- End If
- Next
- Else
- ActiveCell.Value = Mid(strTab, intI1, 1) & Mid(strTab, intI2, 1) & Mid(strTab, intI3, 1) & Mid(strTab, intI4, 1)
- ActiveCell.Offset(1, 0).Select
- End If
- End If
- Next
- End If
- End If
- Next
- End If
- Next
- Next
-
- Cells(3, ActiveCell.Column).Value = (Timer - sngChrono)
- End Sub
|
|