Organizar combinaçõ...
 
Notifications
Clear all

Organizar combinações.

4 Posts
2 Usuários
0 Reactions
3,749 Visualizações
(@puretna)
Posts: 11
Active Member
Topic starter
 

Boa noite !

Tenho uma array de 4 elementos e desejava organiza-los de 2 em 2 em combinações sem repetições. Adaptei uma fórmula achada na net, que usa analise combinatória, e ficou como disposto no arranjo a1:b6. Porém gostaria de que ficasse como no range a9:b16 onde cada elemento da matriz aparecesse uma única vez no primeiro grupo de combinação, e assim até o final das combinações inéditas possíveis Isso seria possível ?

Desde já agradeço.

 
Postado : 04/02/2014 9:10 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Não entendi muito bem, mas, pra 4 elementos, uma macro que faz o que vc mostrou no modelo pode ser assim:

Sub combinatoria_GT()
Application.ScreenUpdating = False

Dim Elementos(4)
Dim i As Integer, j As Integer
Dim Lin As Integer, x As Integer

Elementos(1) = "a"
Elementos(2) = "b"
Elementos(3) = "c"
Elementos(4) = "d"

Lin = 1
x = 1

For i = 1 To 4
    For j = 1 To 4
        If j > i Then
            Cells(Lin, "A") = Elementos(i)
            Cells(Lin, "B") = Elementos(j)
            Lin = Lin + 2
        End If
        If Lin / 3 = Int(Lin / 3) Then Lin = Lin + 1
        Do Until IsEmpty(Cells(Lin, "A"))
            Lin = Lin + 1
        Loop
    Next j
    x = x + 1
    Lin = x
Next i

Application.ScreenUpdating = True
End Sub
 
Postado : 04/02/2014 10:23 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Não sei se era isso mesmo, mas, resolvi brincar um pouquinho enquanto o sono não vem:

Sub combinatoria_GT()
Application.ScreenUpdating = False

Dim Q As Integer

Q = InputBox("Digite a quantidade de elementos.")

Dim Elementos(26)
Dim i As Integer, j As Integer
Dim Lin As Integer, x As Integer, y As Integer

For x = 1 To Q
    Elementos(x) = Chr(x + 96)
Next x
x = Q

Lin = 1
y = 1

For i = 1 To x
    For j = 1 To x
        If j > i Then
            Cells(Lin, "A") = Elementos(i)
            Cells(Lin, "B") = Elementos(j)
            Lin = Lin + 2
        End If
        Do Until IsEmpty(Cells(Lin, "A")) And Lin / 3 <> Int(Lin / 3)
            Lin = Lin + 1
        Loop
    Next j
    y = y + 1
    Lin = y
Next i

Application.ScreenUpdating = True
End Sub
 
Postado : 04/02/2014 10:37 pm
(@puretna)
Posts: 11
Active Member
Topic starter
 

Valeu gtsalikis ! o caminho é esse mesmo, mas eu mesmo expliquei errado na planilha. :D Vai anexo uma nova. Se fossem 8 elementos,por exemplo, seriam 4 combinações, sem repetições, de 2 em 2 por loop, vamos assim dizer, de forma que em cada loop os elementos da array não se repetissem.

 
Postado : 05/02/2014 12:21 am