Macro para gerar números aleatórios sem repetição

Olá Excelentes pessoas!

Recentemente auxiliei um leitor no desenvolvimento de uma macro que gerava números aleatórios sem repetição.

Gerar os números aleatórios não seria tarefa tão difícil. Até aí tudo bem. Poderíamos rapidamente obter a solução utilizando uma simples combinação de fórmulas diretamente digitadas nas células da planilha. Isto resolveria o problema?

Em parte sim. Mas, os números gerados poderiam ser repetidos. Não teria como controlar isso, pois seriam gerados aleatoriamente.

Então, através de um algorítimo simples, faremos a verificação de possíveis duplicidades decorrentes do processo randômico de extração de números. Utilizamos esta mesma técnica para realizar sorteios diversos e podemos adaptar para múltiplos casos e finalidades.

Vejamos, a seguir, como fazer o código VBA para a macro que realizará a geração dos números distintos e aleatórios.

Abra o ambiente de programação do VBA (ALT+F11)  e insira um Módulo, acessando o menu Inserir > Módulo.

O código abaixo deve estar num Módulo.

Sub GerarNumerosAleatoriosSemRepeticao()
Dim i                           As Integer
Dim j                           As Integer
Dim bRandomOk                   As Boolean
Dim valor_aleatorio             As Integer
Dim valor_maior                 As Integer
Dim total_numeros_gerados       As Integer
Dim total_numeros_para_gerar    As Integer
Dim iControleGerar              As Integer
Dim iColunaCelula               As Integer

    valor_maior = 60    'Informe o maior número que poderá ser gerado
    total_numeros_para_gerar = 20      'Informe a quantidade de números aleatórios que deseja gerar
    total_numeros_gerados = 0
    iLinhaCelulaInicial = 2     'Informe a linha da primeira célula que será escrito o número
    iColunaCelula = 2   'Informe a coluna. Exemplo: Coluna B = 2
    iControleGerar = total_numeros_para_gerar + iLinhaCelulaInicial - 1

    'Gera quantos números forem indicados na variável 'total_numeros_gerados'
    For i = iLinhaCelulaInicial To iControleGerar
        total_numeros_gerados = total_numeros_gerados + 1

        'Fica executando a geração de um novo número enquanto houver duplicidade
        Do
            'Utilize a condição abaixo para verificar se ainda existem números possíveis a serem gerados
            'Porque se i for maior que o valor limite, significa que todos os números já saíram. Então, sai do loop
            If valor_maior < total_numeros_gerados Then
                valor_aleatorio = 0
                bRandomOk = True
                Exit Do
            End If

            'Gera um novo número
            Randomize   'Sempre utilize esta função antes de chamar Rnd
            valor_aleatorio = Int((valor_maior * Rnd) + 1)
            bRandomOk = True

            'Verifica se já saiu este número
            For j = iLinhaCelulaInicial To i
                If Cells(j, iColunaCelula).Value = valor_aleatorio Then
                    bRandomOk = False
                    Exit For
                End If
            Next j

        Loop While bRandomOk = False

        'Escreve o número na célula
        Cells(i, iColunaCelula).Value = valor_aleatorio
    Next i

    MsgBox "Números Gerados", vbInformation

End Sub

Todos os números gerados serão únicos.

Você pode, a partir deste código, criar suas próprias funções como geração de senhas ou qualquer outro código genérico… Enfim, são inúmeras as possibilidades.

Se quiser, você também pode exibir o andamento do processo para ter informação de quanto falta para terminar a geração dos números ou pode, após utilizar a macro que aprendemos agora, usar a fórmula para colocar os números gerados em ordem crescente.

O link dos exemplos está no final da matéria, ok.

 

Espero que tenham gostado.

Comentem e compartilhem este artigo. Ajuda bastante!

Siga-nos no twitter e cadastre-se para receber as atualizações do site em seu email. Assim você fica sabendo de todas as novidades que lançarmos aqui no site.

 

Até a próxima.

Deixe um comentário