6 febrero, 2025

CREAR CADENA ALFANUMÉRICA SIN DUPLICADOS CON UNA FUNCIÓN

Hola a todos:

Hoy me gustaría tratar otra vez el tema de las cadenas alfanuméricas sin duplicados, es decir con caracteres únicos, no repetidos.

Esto es un tema que ya he publicado varias veces en esta web, en concreto hoy voy a tratar sobre este post: GENERAR CADENA DE CARACTERES ALFANUMÉRICOS ALEATORIOS SIN DUPLICADOS

A nivel teórico no vamos a crear nada nuevo, pero sí a nivel práctico, dado que vamos a pasar el proceso que en el post os mostraba con una macro (y su botón de ejecución) a ser realizado con una función.

Podéis consultar la macro accediendo al post que os he dejado y aquí os voy a dejar el mismo código pero modificado para ser una función:

Option Explicit
Function CADENA_UNICOS(ByVal LARGO As Long, MIN As Long, MAX As Long)
'Declaramos variables
Dim oDic As Object
Dim Micelda As String, matrix1 As Variant, matrix2 As Variant
Dim sCadena As String, i As Long, unicos As String
Dim j As Long, nNum As Double
Dim nLetU As String, nLetL As String, nItem As Variant, nCombo As Integer
With Sheets("Hoja1")
'Creamos objeto diccionario
Set oDic = CreateObject("scripting.dictionary")
'Ejecutamos loop hasta el total de números y letras que queremos obtener
Do Until j = LARGO
'generamos aleatorios entre lo que indiquemos
nNum = Application.WorksheetFunction.RandBetween(MIN, MAX)
'generamos aleatorio de letras mayúsculas
nLetU = Chr((Application.WorksheetFunction.RandBetween(65, 90)))
'generamos aleatorio de letras minúsculas
nLetL = LCase(Chr((Application.WorksheetFunction.RandBetween(65, 90))))
'determinamos aleatoriamente qué elemento seleccionamos para pasar a la cadena
nCombo = Application.WorksheetFunction.RandBetween(1, 3)
If nCombo = 1 Then
nItem = nNum
ElseIf nCombo = 2 Then
nItem = nLetU
ElseIf nCombo = 3 Then
nItem = nLetL
End If
'componemos string con los números y letras que vamos generando
Micelda = Micelda & " " & nItem
matrix1 = Split(Micelda, " ")
'Eliminamos números y letras 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 y letras aleatorios únicos que vamos generando
j = UBound(matrix2) + 1
Loop
'Pasamos los datos a la función
CADENA_UNICOS = sCadena
End With
'Vaciamos variable de objeto
Set oDic = Nothing
End Function

Es prácticamente igual a la macro, pero hay que tener en cuenta los parámetros, que ahora los vamos a seleccionar directamente desde la función.

Sus parámetros son (sin comillas):

LARGO: es la longitud que deseamos dar a nuestra cadena.
MIN y MAX: se trata del rango mínimo y máximo con el que se generará la función aleatorio.entre.

En este caso, queremos un largo de 10 caracteres (no cuentan los blancos),  y números entre el 1 y el 9:

CREAR CADENA ALFANUMÉRICA SIN DUPLICADOS CON UNA FUNCIÓN

Y de esta forma tenemos el resultado de la función en una celda y según lo especificado.

Un dato importante, si el número que indicamos en el argumento «LARGO» es mucho mayor a MAX, es posible que la función no responda, dado que se puede producir que estemos buscando una cadena de números aleatorios más alta de los que podemos generar según los parámetros.

Por ejemplo, si estuviésemos trabajando solo con una cadena numérica y especificásemos un largo de 10 y usar números de 1 a 9, la aplicación se bloqueará en un bucle sin fin. En esta macro, esto no se produce con esa claridad, dado que introducimos letras, y por lo tanto no se puede realizar un control. Por ello, tratad de indicar el argumento MAX mayor que LARGO.

Los números o caracteres aleatorios están separados por un espacio, que no se cuenta pero sirve como separador. Si necesitáis eliminar este espacio, solo tenéis que sustituir:

CADENA_UNICOS = sCadena

por esto:

CADENA_UNICOS = Replace(sCadena, " ", "")

Como siempre, os dejo el ejemplo:

Descarga el archivo de ejemplo pulsando en: CREAR CADENA ALFANUMÉRICA SIN DUPLICADOS CON UNA FUNCIÓN

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Comparte este post

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