none
Gerando combinações de números aleatórios sem repetição e condicional RRS feed

  • Pergunta

  • Boa Tarde;

    Estou tentando gerar combinações de números aleatório, usando EXCEL VBA, dentro de um certo limite, combinação de 6 em 6 para um grupo de 60 números, sem repetições e com condicional - A condição seria: a soma dos 6 números gerados deve ser igual a 21, por exemplo. O usuário deve ter janelas para informar a quantidade de linhas, colunas e a soma dos números.

    Por favor, alguém pode me ajudar?

    Aceito adaptação do código listado abaixo;

    Obrigado desde já!

    A resposta que mais próximo chegou ao que relato acima fora a listada logo abaixo. 

    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 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 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 Then 'aqui se a linha for zero, Set wks = ThisWorkbook.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 r = r + 1 wks.Cells(r, "A").Resize(1, lPermutações) = Split(s, "|") 'Se quiser visualizar o resultado na Janela de Verificação imediata, use: 'Debug.Print s

    If r = 1048576 Then 'se a linha for igual a ultima linha do excel 2007 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

    sábado, 27 de dezembro de 2014 18:40