Combinação de númer...
 
Notifications
Clear all

Combinação de números

12 Posts
3 Usuários
0 Reactions
1,480 Visualizações
(@aelric)
Posts: 7
Active Member
Topic starter
 

Boa Tarde Pessoal,

sou leigo no assunto então peço uma ajudinha.

Tenho a seguinte macro

Option Explicit

'C(n, p) = n! / ((n-p)! * p!)
'lPermutações a ser definido, seria o 'p' da fórmula acima
Const lPermutações As Long = 6
Dim r As Long
Dim wkb As Workbook
Dim wks As Worksheet
Dim intGrupo As Integer
Dim x As Byte 'apenas um contador para o laço
Dim v(1 To 60)

Sub Teste()

    Dim lElementos As Long
    
    'Popula vetor de elementos
    For x = 1 To 60    'coloquei em um laço pro código ficar mais limpo
        v(x) = CStr(x)
    Next x
   
    intGrupo = 0  'inicia o numero do grupo

    'C(n, p) = n! / ((n-p)! * p!)
    'lElementos seria o 'n' da fórmula acima
    lElementos = UBound(v) - LBound(v) + 1
    
    'Contador de linhas para uso no Excel:
    r = 0
    
    'Limpa Planilha ativa
    Cells.Delete
    
    'Inicia recursão:
    Combinação lElementos, lPermutações, 1
    'aqui salva o último wbk aberto após fazer todas as permutações
    wkb.SaveAs ThisWorkbook.Path & "perm" & intGrupo & ".xlsx"
    wkb.Close

    
End Sub

Sub Combinação(n As Long, p As Long, k As Long, Optional s As String)
    
    
    If p > n - k + 1 Then Exit Sub
    
    If p = 0 Then
        'Para visualizar o resultado de uma combinação no Excel:
        
        If r = 0 And wkb Is Nothing Then    'aqui se a linha for zero,
            
            Set wkb = Workbooks.Add
            Set wks = wkb.Sheets.Add 'adicionar uma nova guia
            intGrupo = intGrupo + 1  'incrementar o numero do grupo
            wks.Name = "grupo " & intGrupo  'renomear a guia pelo nome do grupo
            
        End If
        
        
        If funVerificaPermitacao(s) Then
          
          r = r + 1
          wks.Cells(r, "A").Resize(1, lPermutações) = Split(s, "|")
          
        Else
          'Debug.Print s 'Apenas para verificar as condicoes que não entravam
        End If
        
        'Se quiser visualizar o resultado na Janela de Verificação imediata, use:
        'Debug.Print s
        If r = 1000000 Then 'se a linha for igual a cem mil, salvar o wbk
            
            wkb.SaveAs ThisWorkbook.Path & "perm" & intGrupo & ".xlsx"
            wkb.Close
            Set wkb = Nothing
            r = 0  'resetar o numero da linha
            
        End If
        
        Exit Sub
        
    End If
    
    'Recorre novamente:
    Combinação n, p - 1, k + 1, s & v(k) & "|"
    'Recorre novamente a partir do elemento anterior:
    Combinação n, p, k + 1, s
    
End Sub
Function funVerificaPermitacao(strSequencia As String) As Boolean
  
  funVerificaPermitacao = False
  
  Dim arrValores() As String
  Dim bytValor As Byte
  Dim intDiferenca As Integer
  
  Dim intSoma As Integer
  Dim blnEstaEmSequencia As Boolean
  
  Dim bytTotalPar As Byte
  Dim bytTotalImpar As Byte
  
  arrValores = Split(strSequencia, "|")
  
  
  intSoma = 0
  bytTotalPar = 0
  bytTotalImpar = 0
  
  blnEstaEmSequencia = False
  
  For bytValor = 0 To 5
    
    intSoma = intSoma + arrValores(bytValor)
    
    If bytValor < 5 Then
      
      intDiferenca = CInt(arrValores(bytValor + 1)) - CInt(arrValores(bytValor))
      
      If intDiferenca = 1 Then
        blnEstaEmSequencia = True
      End If
      
    End If
    
    If arrValores(bytValor) Mod 2 = 0 Then
      bytTotalPar = bytTotalPar + 1
    Else
      bytTotalImpar = bytTotalImpar + 1
    End If
    
  Next bytValor
  
  
  
  '2- Fizesse um teste pra ver se estes números estão em sequência,
  'admitindo-se apenas combinações que tenham 2 números em sequência
  '(tipo 1,2,5,17,25,32 ou 5,11,25,26,48,52), caso contrário a combinação fosse descartada;
  If blnEstaEmSequencia = True Then
    
    
    '3- As combinações aproveitadas no passo anterior passarem por um novo teste.
    'Somente as sequências cuja soma estejam no intervalo entre 107 e 266 são guardadas,
    'as demais excluidas (ex. 5,11,25,26,48,52 => 5+11+25+26+48+52=167 guardar, 1,2,5,17,25,32 => 1+2+5+17+25+32=82 descarta);
    If intSoma >= 107 And intSoma <= 266 Then
      
      '4-  As combinações aproveitadas no passo anterior passarem por um novo teste.
      'Somente as sequências contenham 3 pares e 3 impares, ou 2 pares e 4 impares,
      'ou ainda 4 pares e 2 impares são guardadas (ex. 5,11,25,26,48,52, são 3 pares e 3 impares);
      If bytTotalPar > 1 And bytTotalImpar > 1 Then
    
        funVerificaPermitacao = True 'se passar por todas as verificações, então retorna verdadeiro
    
      End If
    End If
    
  
  End If
      

End Function

Gostaria de poder inserir os numeros que serão gerados e poder definir o numero de combinações. ex:
combinar o conjunto (1, 2 ,3 4, 5 , 6 ,7 9,10, 12 , 34, 34)
em grupos de 7

dentro dos criterios que ja tem na macro

teria como me ajudar a arrumar essa macro?

 
Postado : 15/09/2016 12:42 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite aelric

Seja bem-vindo ao fórum!

Para facilitar a tua participação no fórum, sugiro tomar conhecimento do conteúdo dos links abaixo:
viewtopic.php?f=7&t=203
viewtopic.php?f=7&t=7903
viewtopic.php?f=7&t=3841
viewtopic.php?f=7&t=16757
viewtopic.php?f=7&t=12600
viewtopic.php?f=7&t=3371

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 15/09/2016 5:22 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa noite aelric,

Poste um arquivo (com esses códigos dentro), e um exemplo do que você espera de resultado. Será sempre grupos de 7?

Também de uma olhada nesse tópico: viewtopic.php?f=10&t=21464&start=20
No caso desse tópico também foi a montagem de uma combinatória.

att,

 
Postado : 15/09/2016 6:46 pm
(@aelric)
Posts: 7
Active Member
Topic starter
 

Bom dia!

Eu gostaria de poder escolher se são 6 , 7, 8 , etc e tbm quais numeros ele dever combinar e por fim fazer os testes que ja tem na macro pra filtrar os resultados naqueles parametros.

Ex

1-pergunta o tamanho dos agrupamento ou combinações? ex: 3
2-pergunta o conjunto de numeros a serem agrupados? ex: 1,2,3,4
3- resultados : 1, 2 , 3
1,2,4
2,3,4
3,4,1

4- esses são filtrados segundo os criterios (ex:nao pode ter 2 pares em cada grupo)
5- resultado filtrado apresentado em cada celula do excel: (1,2,3) e (3,4,1)

Simplificadamente é isso.

O programa faz isso, mas eu nao consigo inserir os parametros iniciais.

 
Postado : 16/09/2016 7:31 am
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Boa noite aelric,

Esse programa já faz a as ações 3,4 e 5. Mas não a 1 e 2, ou seja você não consegue escolher os parâmetro iniciais?

Disponibilize o arquivo, assim fica mais fácil adaptar seu código.

 
Postado : 19/09/2016 4:33 pm
(@aelric)
Posts: 7
Active Member
Topic starter
 

Isso mesmo. Qual arq devo disponibilizar?

 
Postado : 19/09/2016 5:00 pm
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

Aelric,

Disponibilize o arquivo que tem a macro.

 
Postado : 20/09/2016 5:50 pm
(@aelric)
Posts: 7
Active Member
Topic starter
 

segue o arquivo

 
Postado : 21/09/2016 8:38 am
(@aelric)
Posts: 7
Active Member
Topic starter
 

Alguma ideia pessoal?

 
Postado : 27/09/2016 11:58 am
(@aelric)
Posts: 7
Active Member
Topic starter
 

Olá?????
Alguém pode ajudar???

 
Postado : 25/10/2016 10:27 am
brunoxro
(@brunoxro)
Posts: 698
Honorable Member
 

aelric,

Sinceramente não entendi nada do seu código. Você que montou esse código? Está completo?

 
Postado : 05/11/2016 12:20 pm
(@aelric)
Posts: 7
Active Member
Topic starter
 

Não fui eu que montei. Mas ele funciona dentro dos paremetros ja colocados. Eu queria melhora-lo conforme falei.

 
Postado : 07/11/2016 7:14 am