Notifications
Clear all

Como formar combinações?

4 Posts
2 Usuários
0 Reactions
1,279 Visualizações
(@anderdiniz)
Posts: 0
New Member
Topic starter
 

Preciso de um código em vba que faça todas as combinações possíveis:
Tenho 4 elementos:
MA, MD, FA, F5
Preciso saber todas as combinações possíveis
Por exemplo:
1MA2MD3FA4F5

Os números representam as posiçõe dos elementos
1 primeira posição (1MA) Elemento MsA na primeira posição
2 segunda posição (2MD) Elemento MD na segunda posição
3 terceira posição (3FA) Elemento FA na terceira posição
4 quarta posição (4F5) Elemento F5 na quarta posição
O 5 não é quinta posição. É parte integrante de um dos elementos.
Todos os elementos deverão ocupar a primeira, a segunda, a terceira e a quarta posições.
A mesma posição poderá repetir o mesmo elemento em linha diferente, desde que não gere combinação repetida de 4 elementos na mesma sequência.
Outros exemplos:
1MA2FA3F54MD
1MA2F53MD4FA
Cada combinação de 4 números e 4 elementos será uma linha de uma combobox.

Creio que estas seriam as combinações possíveis:

            Option Explicit



Private Sub UserForm_Initialize()
    Dim TEXTO As String
    Dim I, J As Integer
    Dim ELEMENTO(1 To 4) As String
    ELEMENTO(1) = "MA"
    ELEMENTO(2) = "MD"
    ELEMENTO(3) = "FA"
    ELEMENTO(4) = "F5"
    '  For J = 1 To 4
    '     For I = 1 To 4
    
    
    
    TEXTO = "1" & ELEMENTO(1) & "2" & ELEMENTO(2) & "3" & ELEMENTO(3) & "4" & ELEMENTO(4)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(1) & "2" & ELEMENTO(2) & "3" & ELEMENTO(4) & "4" & ELEMENTO(3)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(1) & "2" & ELEMENTO(3) & "3" & ELEMENTO(4) & "4" & ELEMENTO(2)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(1) & "2" & ELEMENTO(3) & "3" & ELEMENTO(2) & "4" & ELEMENTO(4)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(1) & "2" & ELEMENTO(4) & "3" & ELEMENTO(3) & "4" & ELEMENTO(2)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(1) & "2" & ELEMENTO(4) & "3" & ELEMENTO(2) & "4" & ELEMENTO(3)
    UserForm1.ComboBox1.AddItem (TEXTO)
    
    TEXTO = "1" & ELEMENTO(2) & "2" & ELEMENTO(1) & "3" & ELEMENTO(3) & "4" & ELEMENTO(4)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(2) & "2" & ELEMENTO(1) & "3" & ELEMENTO(4) & "4" & ELEMENTO(3)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(2) & "2" & ELEMENTO(3) & "3" & ELEMENTO(4) & "4" & ELEMENTO(1)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(2) & "2" & ELEMENTO(3) & "3" & ELEMENTO(1) & "4" & ELEMENTO(4)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(2) & "2" & ELEMENTO(4) & "3" & ELEMENTO(3) & "4" & ELEMENTO(1)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(2) & "2" & ELEMENTO(4) & "3" & ELEMENTO(1) & "4" & ELEMENTO(3)
    
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(3) & "2" & ELEMENTO(2) & "3" & ELEMENTO(1) & "4" & ELEMENTO(4)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(3) & "2" & ELEMENTO(2) & "3" & ELEMENTO(4) & "4" & ELEMENTO(1)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(3) & "2" & ELEMENTO(1) & "3" & ELEMENTO(4) & "4" & ELEMENTO(2)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(3) & "2" & ELEMENTO(1) & "3" & ELEMENTO(2) & "4" & ELEMENTO(4)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(3) & "2" & ELEMENTO(4) & "3" & ELEMENTO(1) & "4" & ELEMENTO(2)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(3) & "2" & ELEMENTO(4) & "3" & ELEMENTO(2) & "4" & ELEMENTO(1)
    UserForm1.ComboBox1.AddItem (TEXTO)
    
    TEXTO = "1" & ELEMENTO(4) & "2" & ELEMENTO(2) & "3" & ELEMENTO(3) & "4" & ELEMENTO(1)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(4) & "2" & ELEMENTO(2) & "3" & ELEMENTO(1) & "4" & ELEMENTO(3)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(4) & "2" & ELEMENTO(3) & "3" & ELEMENTO(1) & "4" & ELEMENTO(2)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(4) & "2" & ELEMENTO(3) & "3" & ELEMENTO(2) & "4" & ELEMENTO(1)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(4) & "2" & ELEMENTO(1) & "3" & ELEMENTO(3) & "4" & ELEMENTO(2)
    UserForm1.ComboBox1.AddItem (TEXTO)
    TEXTO = "1" & ELEMENTO(4) & "2" & ELEMENTO(1) & "3" & ELEMENTO(2) & "4" & ELEMENTO(3)
    UserForm1.ComboBox1.AddItem (TEXTO)
    
    
    
    ' Next I
    ' Next J
End Sub

Mas eu quero montar através de laço de repetição / recursividade.

 
Postado : 25/11/2017 5:23 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Veja se auxilia

Sub letraspermutadas()
Dim MyTxt(1 To 4) As String
Dim a As Integer, b As Integer, c As Integer, d As Integer

MyTxt(1) = "MA"
MyTxt(2) = "MD"
MyTxt(3) = "FA"
MyTxt(4) = "F5"

conta = 1
For a = 1 To 4
    For b = 1 To 4
        For c = 1 To 4
            For d = 1 To 4
                If IsInArray(MyTxt(a), Array(MyTxt(b), MyTxt(c), MyTxt(d))) Or _
                   IsInArray(MyTxt(b), Array(MyTxt(a), MyTxt(c), MyTxt(d))) Or _
                   IsInArray(MyTxt(c), Array(MyTxt(a), MyTxt(b), MyTxt(d))) Or _
                   IsInArray(MyTxt(d), Array(MyTxt(a), MyTxt(b), MyTxt(c))) Then GoTo ali
                Cells(conta, 1) = "1" & MyTxt(a) & "2" & MyTxt(b) & "3" & MyTxt(c) & "4" & MyTxt(d)
                conta = conta + 1
ali:
            Next
        Next
    Next
Next
End Sub

Obs.: Está "escrevendo"na planilha, deve adaptar ao seu form.

 
Postado : 26/11/2017 7:49 am
(@anderdiniz)
Posts: 0
New Member
Topic starter
 
Option Explicit



Sub letraspermutadas()
Dim conta, a, b, c, d As Integer
Dim MyTxt(1 To 4) As String
Dim MinhaLista(1 To 24) As String
MyTxt(1) = "MA"
MyTxt(2) = "MD"
MyTxt(3) = "FA"
MyTxt(4) = "F5"

conta = 1
For a = 1 To 4
    For b = 1 To 4
        For c = 1 To 4
            For d = 1 To 4
                If IsInArray(MyTxt(a), Array(MyTxt(b), MyTxt(c), MyTxt(d))) Or _
                   IsInArray(MyTxt(b), Array(MyTxt(a), MyTxt(c), MyTxt(d))) Or _
                   IsInArray(MyTxt(c), Array(MyTxt(a), MyTxt(b), MyTxt(d))) Or _
                   IsInArray(MyTxt(d), Array(MyTxt(a), MyTxt(b), MyTxt(c))) Then GoTo ali
               MinhaLista(conta) = "1" & MyTxt(a) & "2" & MyTxt(b) & "3" & MyTxt(c) & "4" & MyTxt(d)
                conta = conta + 1
ali:
            Next
        Next
    Next
Next
ComboBox1.List = MinhaLista
End Sub

Private Sub UserForm_Initialize()
Call letraspermutadas

End Sub

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  IsInArray = UBound(Filter(arr, stringToBeFound)) > -1
End Function
 
Postado : 26/11/2017 7:54 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Não entendi, a proposta foi baseada na sua solicitação, qualquer alteração altera consideravelmente a rotina

 
Postado : 26/11/2017 8:02 am