Diligenciar un campo en formulario con una cifra numérica aleatoria de 12 cifras dentro de un rango y que no se repita.

Agradezco la ayuda en el mejoramiento del presente código que he encontrado, pero que no se agregarle la función de condicionarlo a un rango especifico entre dos cifras y verificar que no este repetido.

El código lo implemento en un formulario con un campo llamado "Código", a través de un comando en el evento al dar clic

----------------------------------------------------------------------

Dim bytNumCaracter As Byte
Dim bytContador As Byte
Dim strClave As String

bytNumCaracter = 12

For bytContador = 1 To bytNumCaracter
Randomize Timer
strClave = strClave & Int(Rnd(1) * 10)
Next

Me.CodigoValidacion = strClave

-----------------------------------------------------------------------

2 Respuestas

Respuesta
2

Le complemento con esta función.

Public Function GenerarNumeros(ByVal desde As Double, ByVal hasta As Double, ByVal cantidad As Integer)
 On Error GoTo hay_error
    Dim i As Integer
    Dim num As String
    Dim rs As DAO.Recordset
    'Retiro la numeracion
    CurrentDb.Execute "DELETE FROM tblNrosAleatorios"
    Set rs = CurrentDb.OpenRecordset("tblNrosAleatorios", dbOpenDynaset)
    Do While i < cantidad
        num = Format(Int((hasta - desde + 1) * Rnd() + desde), String(12, "0"))
        If DCount("*", "tblNrosAleatorios", "Numero='" & num & "'") = 0 Then
            rs.AddNew
            rs("Numero") = num
            rs.Update
            i = i + 1
        End If
    Loop
    rs.Close
    If Err.Number = 0 Then
       MsgBox "Numeros aleatorios generados OK", vbInformation, "Le informo"
    End If
hay_error_exit:
   Exit Function
hay_error:
    MsgBox "Ocurrió el error " & Err.Number & vbCrLf & Err.Description, vbCritical, "Error..."
    Resume hay_error_exit
End Function

Ventana de inmediato:

?GenerarNumeros(100000000000 ,999999999999,10)

Resultado en la tabla

?GenerarNumeros(1000 ,9999,10)

Resultado

La función se puede modificar para pasar como parámetro el número de dígitos.

Observe que la tabla tiene 10 registros de acuerdo con el segundo parámetro y sin números repetidos. Si quiere el ejemplo lo puede solicitar a [email protected]

Le dejo una función más completa

Public Function GenerarNumeros(ByVal cantidad As Integer, cifras As Integer)
Dim i As Integer
Dim num As String
Dim rs As DAO.Recordset
Dim desde As Double
Dim hasta As Double
Dim nrodigitos As Integer
'Función para generar números aleatorios
'Elaborado por:
'               EDUARDO PÉREZ FERNÁNDEZ
'Fecha        : 07/02/2023
desde = 1 'Valor fijo
hasta = (10 ^ cifras) - 1 'Valor fijo según el número de cifras
'Retiro la numeración
CurrentDb.Execute "DELETE FROM tblNrosAleatorios"
Set rs = CurrentDb.OpenRecordset("tblNrosAleatorios", dbOpenDynaset)
Do While i < cantidad
    num = Format(Int((hasta - desde + 1) * Rnd() + desde), String(cifras, "0"))
    If DCount("*", "tblNrosAleatorios", "Numero='" & num & "'") = 0 Then
        rs.AddNew
        rs("Numero") = num
        rs.Update
        i = i + 1
    End If
Loop
rs.Close
    If Err.Number = 0 Then
       MsgBox "Numeros aleatorios generados OK", vbInformation, "Le informo"
    End If
hay_error_exit:
   Exit Function
hay_error:
    MsgBox "Ocurrió el error " & Err.Number & vbCrLf & Err.Description, vbCritical, "Error..."
    Resume hay_error_exit
End Function

Más fácil, requiere 2 párametros, la cantidad de números y el número de cifras

Ejemplo de llamada: Para generar 10 números y un tamaño de 12 dígitos llame la función de esta forma:

¿
? GenerarNumeros(10,12)
Respuesta
2

Pedir que un numero aleatorio no se repita es un tanto extraño (no existiría aleatoriedad), si no se desea conservar (porque en ese conjunto estaría duplicado) se vuelve a solicitar otro y se repite el bucle hasta que se logra uno que cumpla los requisitos.

Por cierto, si yo desease un aleatorio de doce cifras lo generaría directamente con la función RND:

En la ventana de inmediato:

límite_inferior=100000000000
límite_superior=999999999999
?Int((límite_superior - límite_inferior + 1) * Rnd + límite_inferior)
360606217384
621566754579
580081617832
734992760419

Una vez obtenido el numero la misma función DCount resuelve el problema de que no se duplique:

Do
NumRND = Int((999999999999 - 100000000000 + 1) * Rnd + 100000000000)
If DCount("*","[la tabla],"[el_campo] =" & NumRND) = 0 Then
[el_campo]= NumRND 
Exit Do
End If
Loop

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas