30 noviembre, 2023

OBTENER NÚMEROS ALEATORIOS SIN DUPLICADOS

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):

OBTENER NUMEROS ALEATORIOS SIN DUPLICADOS

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:

OBTENER NUMEROS ALEATORIOS SIN DUPLICADOS1

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.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Comparte este post

10 comentarios en «OBTENER NÚMEROS ALEATORIOS SIN DUPLICADOS»

    1. 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

  1. 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

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies