Générer toutes les permutations possibles à partir des valeurs d'entrée


3

Veuillez noter que ma question est différente de la copie suggérée . La copie suggérée ne montre pas toutes les variations possibles en fonction du nombre d'options. Par conséquent, une entrée de 3 peut avoir une variation de 1, 2 et 3 des entrées. La copie suggérée fournit toujours 3 entrées par variation.

De plus, ma question demande également des variantes pour montrer toutes les commandes possibles des entrées. La copie suggérée affiche toujours la colonne A à l'extrême gauche de la sortie, la colonne b au milieu de la sortie et la colonne c à gauche de la sortie.

Par conséquent, le duplicata suggéré ne répond pas à ma question.


Question originale

Comment puis-je créer une formule qui prend un nombre quelconque de valeurs d'entrée données, puis génère une valeur de sortie avec toutes les combinaisons possibles permutations en fonction des valeurs d'entrée données.

Par exemple, si les valeurs d'entrée sont les suivantes

One
Two

La sortie générée devrait ressembler à ceci

One
OneTwo
Two
TwoOne

Voici à quoi cela devrait ressembler si 3 valeurs sont données:

entrez la description de l'image ici

Est-ce que quelqu'un sait comment faire cela dans Excel?

J'aimerais pouvoir saisir un nombre quelconque de valeurs d'entrée, qui seront un mot, une phrase, un nombre, des lettres ou une combinaison de toutes ces permutations.

J'ai donné cette possibilité d' essayer https://www.ozgrid.com/forum/forum/help-forums/excel-vba-macros/146983-all-possible-combinaisons-de-single-colonne mais cela ne semble pas fonctionner .

Dans la colonne A, si je tape (un mot par ligne):

One
Two
Three

Dans la colonne B, la VBA me donne (dans une seule cellule):

one,two,three

Cela ne me donne pas toutes les combinaisons possibles , mais change simplement ce que j'ai tapé verticalement dans une colonne et affiche les résultats horizontalement.


1
@ cybernetic.nomad On dirait que l'affiche veut toutes les permutations associées à chaque combinaison
Gary's Student

ORDER est important. dans la question liée, l'ordre n'est pas important.
Transférer Ed

2
Comme il existe un nombre fini de rangées (1 048 576) à exceller, vous ne serez limité qu'à 9 entrées si vous souhaitez que toutes les permutations soient écrites dans une seule colonne. Si mes calculs sont exacts, vous examinerez 986 409 permutations. 10 entrées donneraient 9 864 100, ce qui dépasse le nombre de lignes disponibles.
Transférer Ed

1
Je regarderais des boucles imbriquées dans VBA. Commencez par écrire toutes les entrées simples, puis répétez le processus en commençant par la première entrée, et parcourez les lettres restantes, puis passez à l'entrée suivante et parcourez les lettres restantes jusqu'à ce que toutes les 2 combinaisons soient écrites. continue juste à répéter le modèle et finalement tout sera écrit.
Transmettre Ed

1
Voici une capture d'écran dans le cas où il sonne une cloche pour une idée avec des fonctions Excel ou fonctions complémentaires personnes peuvent se familiariser avec: i.imgur.com/zTh37v6.png Peut-être il y a un PowerShell qui peut le faire, si je connaissais J'essaierais quelque chose mais cela devrait être facile avec une requête de type relation ou une jointure des données dans un objet table ou quelque chose à part si cela est applicable avec certaines de ces fonctionnalités.
Pimp Juice IT le

Réponses:


4

Le script VBA suivant a créé pour moi cette feuille de calcul:

entrez la description de l'image ici

Voici le script:

Option Explicit

Sub PermutationsN()
Dim vElements As Variant, vresult As Variant
Dim lRow As Long, i As Long

vElements = Application.Transpose(Range("A1", Range("A1").End(xlDown)))
Columns("B:Z").Clear

For i = 1 To UBound(vElements)
    ReDim vresult(1 To i)
    Call PermutationsNPR(vElements, i, vresult, lRow, 1)
Next i
End Sub

Sub PermutationsNPR(vElements As Variant, p As Long, vresult As Variant, lRow As Long, iIndex As Integer)
Dim i As Long, unique As Variant

For i = 1 To UBound(vElements)
    vresult(iIndex) = vElements(i)
    If iIndex = p Then
        unique = UniqueArray(vresult)
        If (UBound(vresult) = UBound(unique)) Then
            lRow = lRow + 1
            Cells(lRow, 3).Value = Join(unique)
        End If
    Else
        Call PermutationsNPR(vElements, p, vresult, lRow, iIndex + 1)
    End If
Next i
End Sub


Function UniqueArray(todoarray As Variant) As Variant
  Dim arr As New Collection, a
  Dim i As Long
  On Error Resume Next
  For Each a In todoarray
     arr.Add a, a
  Next
  ReDim returnVal(1 To arr.count)
  For i = 1 To arr.count
     returnVal(i) = arr(i)
  Next
  UniqueArray = returnVal
End Function

La macro fonctionnera pour n’importe quel nombre d’éléments de la colonne A, dans les limites définies par Excel.


Très beau script Harry +1. J'ai testé et confirmé que cela fait exactement ce qui est demandé. Vous devez avoir travaillé dur pour l'argent sur celui-ci monsieur, bon travail !!
Pimp Juice IT le

2

considérons cet exemple Données de colonne A: - Nombres (en-tête) un deux trois quatre cinq données de colonne B: - OutPut (en-tête)

coller cette formule dans B2: -

=IFERROR(IF(INDEX(OFFSET($A$1,1,0,COUNTA($A$2:$A$20)),ROUNDUP(ROWS($A$1:A1)/COUNTA($A$2:$A$20),))=INDEX(OFFSET($A$1,1,0,COUNTA($A$2:$A$20)),MOD(ROWS($A$1:A1)-1,COUNTA($A$2:$A$20))+1),INDEX(OFFSET($A$1,1,0,COUNTA($A$2:$A$20)),ROUNDUP(ROWS($A$1:A1)/COUNTA($A$2:$A$20),)),INDEX(OFFSET($A$1,1,0,COUNTA($A$2:$A$20)),ROUNDUP(ROWS($A$1:A1)/COUNTA($A$2:$A$20),))&INDEX(OFFSET($A$1,1,0,COUNTA($A$2:$A$20)),MOD(ROWS($A$1:A1)-1,COUNTA($A$2:$A$20))+1)),"")

cette fonction fonctionne dans la colonne "Nombres" contenant des données allant jusqu’à A20.

permutationexcelimage


Votre formule ne donne que les permutations pour les termes pris un et deux à la fois, pas toutes les permutations. Il est possible de faire ce genre de formule pour un nombre spécifique de termes, bien que cela devienne rapidement insensé. Même à trois entrées, la formule est scandaleuse. Voir le commentaire de Forward Ed sur le fait que 9 entrées correspondent à la limite de lignes d'Excel, ce qui vous indique que si votre formule contient jusqu'à 19 entrées, elle ne remplit pas ce qui était demandé dans la question.
fixer1234
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.