Hola a todos!:
Esta semana he recibido varias consultas y como siempre, me gustaría compartir con vosotros alguna de ellas.
En concreto, me pedían una macro que pudiese generar números aleatorios entre un rango establecido y que fuesen únicos, sin duplicados.
Bien, sobre este tema hay varias macros que se pueden encontrar por la red (incluso usando solo fórmulas), pero he querido dedicarle un poco de tiempo y desarrollar un código distinto y que creo que es más sencillo de comprender.
Como el lector quería que a través de la hoja Excel pudiera indicar la cantidad de números a generar y también el tramo entre los que obtener los números, lo adapté a sus necesidades.
Utilizaremos la «Hoja1» e indicaremos los siguientes campos donde vamos a generar 5 números aleatorios y únicos entre el 1 el 50 (ambos inclusive):
Ahora, para poder generar la información, debemos pegar este código en un módulo estándar de nuestros editor de VBA:
Option Explicit
Sub OBTENER_NUMEROS_ALEATORIOS_UNICOS()
'Declaramos variables
Dim oDic As Object, palabra As Variant
Dim Micelda As String, matrix1 As Variant, matrix2 As Variant
Dim sCadena As String, i As Integer, unicos As String
Dim j As Integer, nNum As Double, fin As Integer
With Sheets("Hoja1")
'eliminamos información generada en la consulta anterior.
fin = .Range("A2", .Range("A" & .Rows.Count).End(xlUp)).Rows.Count
.Range("A2:A" & 2 + fin).ClearContents
'Creamos objeto diccionario
Set oDic = CreateObject("scripting.dictionary")
'Ejecutamos loop hasta el total de números que queremos obtener
Do Until j = .Cells(2, 6)
'generamos aleatorios entre 1 y 50
nNum = Application.WorksheetFunction.RandBetween(.Cells(4, 6), .Cells(4, 7))
'componemos string con los números que vamos generando
Micelda = Micelda & " " & nNum
matrix1 = Split(Micelda, " ")
'Eliminamos números repetidos
For i = 0 To UBound(matrix1)
If Not oDic.Exists(matrix1(i)) Then oDic.Add matrix1(i), matrix1(i)
Next i
'Creamos una nueva cadena sin duplicados y seguimos el loop
unicos = Join(oDic.Keys, " ")
sCadena = Trim(unicos)
matrix2 = Split(sCadena, " ")
'contamos los números aleatorios únicos que vamos generando
j = UBound(matrix2) + 1
Loop
'Pasamos los datos a la hoja1
matrix2 = Split(sCadena, " ")
For j = 0 To UBound(matrix2)
.Cells(j + 2, 1) = matrix2(j)
Next j
End With
'Vaciamos variable de objeto
Set oDic = Nothing
End Sub
El resultados que vamos a obtener es el siguiente:
La macro genera correctamente la cantidad de números que hemos indicado y entre el rango establecido. Básicamente, lo que hacemos es ir componiendo una cadena de texto con los números que se van generando aleatoriamente y a la vez con el objeto dictionary eliminando los duplicados hasta llegar a la cantidad especificada en la hoja Excel.
El loop se ejecutará tantas veces como sea necesario para llegar al valor que hemos indicado.
Esta aplicación resulta muy interesante y puede ser útil para multitud de tareas, desde un generador para obtener números de la lotería, primitiva, euromillones, etc hasta para tareas de encriptado.
Por cierto, si la usáis para jugar a loterías y os toca, acordaos de mi : )
Como siempre, os dejo la hoja con el ejemplo:
Descarga el archivo de ejemplo pulsando en: OBTENER NÚMEROS ALEATORIOS SIN DUPLICADOS
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Buena!
Siempre sufría con eso de los números aleatorio.
Soy nuevo en wordpress, pero vi tu blog y acá ya tienes un seguidor.
Muchas gracias!. Me alegro que haya sido de utilidad. Saludos yrvinnl
Muchas gracias yrvinnl, me alegro que haya resultado útil el post. Saludos.
Necesitaba una macro que generara números aleatorios únicos, gracias me será de mucha utilidad….
No hay de qué, espero que sea de utilidad. Saludos, Mario.
por favor necesito saber si puedo que no se genere en la columna A , sino en cualquier otra columna, e intentado todo pero no me cambia
Hola Andrés:
En la última parte del código:
.Cells(j + 2,1 ) = matrix2(j)
Donde pone el 1 se refiere a la columna, en este caso la primera. si lo cambias te pasará los datos a la columna que indiques.
Saludos
Gracias, excelente aplicacion.
Gracias por el aporte.
Mi pregunta es si se podrían ir generando columnas si que se repitieran los números entre columnas y filas. Gracias