Permutations d'une chaine de chiffres

bonjour

existe t il une fonction en vba qui permettre de calculer toutes les permutations d'une chaine de chiffres

j'ai écri le bout de code suivant qui marche a tout les coups mais c'est un peu lourd

ex :pour N = 1123 j'obtiens bien 12 possibilités de permutations

soit 1123 1132 1213 ...etc

Option Base 1
Sub plus_Bouton1_Cliquer()
Dim t() As Variant
Dim nombre As String
nombre = InputBox("saisir une chaine numerique")

c = 1
j = 0
Do
ReDim Preserve t(1 To c)
If InStr(classe(nombre), j) = 0 Then
 t(c) = j
 c = c + 1
End If
j = j + 1
Loop Until j = 9

For i = classe(Val(nombre)) To StrReverse(classe(Val(nombre)))
n = 0
 For k = 1 To UBound(t)
  If InStr(i, t(k)) = 0 Then
   n = n + 1
  End If
 Next
 If n = UBound(t) Then
   If InStr(w, i) = 0 Then

       If Val(classe(CStr(i))) = classe(Val(nombre)) Then
         w = w & " " & i
         compteur = compteur + 1
       End If
   End If
 End If
Next
msgbox w & Chr(10) & "il apparait: " & compteur & " élements dans ce resultat"    ' sur cette ligne le resultat

End Sub

Function nbr_fois(n As Integer) As Integer

w = ""
For i = 1 To Len(n)
p = 0
   If InStr(w, Mid(n, i, 1)) = 0 Then
     For j = i To Len(n)
       If Mid(n, i, 1) = Mid(n, j, 1) Then
       p = p + 1
       End If
     Next
       q = q & Chr(10) & " la valeur  " & Mid(n, i, 1) & " apparait  " & p & " fois"
         w = w & Mid(n, i, 1)
   End If
Next
   nbr_fois = q

End Function

Function classe(n As String) As String
For i = 1 To Len(n) - 1
 For j = i + 1 To Len(n)
  If Val(Mid(n, i, 1)) > Val(Mid(n, j, 1)) Then
   a = Val(Mid(n, i, 1))
   b = Val(Mid(n, j, 1))
   Mid(n, j, 1) = a
   Mid(n, i, 1) = b
  End If
 Next
Next
classe = n
End Function

Merci pour vos réponses

me suis avancé un peu vie car dès que la chaine contient un "0" il n'est meme pas pri en compte ...bon je vais revoir tout ca

Bonjour,

C'était un sympathique casse-tête

Puisque tu utilises apparemment le pack de fonctions du site, voici une solution qui semble fonctionner et qui utilise les fonctions du pack array_add et array_duplicates_delete (n'oublie pas d'ajouter la référence dans ton classeur).

Sub exemple()

    c = "081123" 'Chaîne d'exemple
    n = Len(c)
    t = Array(c)

    For i = 1 To n 'Caractère 1
        nb = UBound(t)
        For ii = 1 To n 'Caractère 2
            For b = 0 To nb
                If i <> ii Then
                    c1 = Mid(t(b), i, 1)
                    c2 = Mid(t(b), ii, 1)
                    If c1 <> c2 Then
                        ci = IIf(i > ii, c1, c2) 'Position 1
                        ca = IIf(i < ii, c1, c2) 'Position 2
                        mi = Application.Min(i, ii)
                        ma = Application.Max(i, ii)
                        array_add t, Mid(t(b), 1, mi - 1) & ci & Mid(t(b), mi + 1, ma - mi - 1) & ca & Mid(t(b), ma + 1, n - ma)
                    End If
                End If
            Next
        Next
        array_duplicates_delete t
    Next

    'array_debug t 'Décommente pour afficher le (début du) tableau

    MsgBox "Nombre = " & UBound(t) + 1

End Sub

Cordialement,

Un grand merci Sébastien, je vais regarder ça de pré et voir plus en détail les fonctions du pack, merci !

Rechercher des sujets similaires à "permutations chaine chiffres"