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.