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