Recientemente alguien me ha preguntado cómo generar una contraseña completamente aleatoria en Excel. Se me ha ocurrido un script relativamente sencillo que utiliza las funciones RND para generar números aleatorios y CHR para convertir esos números en letras (o cualquier otro caracter)
Para hacerlo más sencillo, consideraremos simplemente las letras mayúsculas y las minúsculas (sin contar la Ñ, que está por otro lado del campo de caracteres)
Lo primero que haremos será definir la longitud de la cadena que utilizaremos como contraseña. En el ejemplo lo tengo puesto como un valor fijo (en este caso 8), pero se podría leer de cualquier celda que sirva para modificar el parámetro. En nuestro caso es el valor máximo del ciclo FOR
Dim a As Long Dim pass As String pass = "" For a = 1 To 8 'Código Next
Una vez definido el ciclo que generará cada una de las letras de la contraseña, que almacenaré en la variable pass, vamos a meternos con el meollo del asunto.
Lo primero es saber qué valores necesito obtener. Como quiero letras A-Z y a-z, sé que los rangos que necesito son los siguientes:
A-Z : 65-90
a-z : 97-122
En ambos casos, incluidos los extremos.
Al ser dos rangos diferentes de valores, y como son iguales, les voy a asignar una probabilidad igual para que se dé cada uno. Esto lo hago con la función RND. Como sabrás, RND devuelve un valor aleatorio (o más bien pseudoaleatorio) que estará entre 0 y 1. Simplemente asignaré el rango de mayúsculas si el valor devuelto por RND es mayor que 0,5, y minúsculas si es al contrario.
Sería algo así como:
Dim a As Long Dim pass As String Dim upper As Boolean Dim min As Long Dim max As Long pass = "" For a = 1 To 8 upper = (Rnd > 0.5) If upper Then min = 65 max = 90 Else min = 97 max = 122 End If 'Código Next
¿Y para qué defino los valores mínimo y máximo?
Porque hay una manera de conseguir que la función RND devuelva un valor entre el mínimo y el máximo. Sería así:
Int((max – min + 1) * Rnd+ min)
Esta fórmula nos devolverá un valor entero aleatorio entre min y max. Si lo convertimos en un carácter con la función CHR y lo colocamos en su sitio, ya tenemos la variable pass con la contraseña:
Dim a As Long Dim pass As String Dim upper As Boolean Dim min As Long Dim max As Long pass = "" For a = 1 To 8 upper = (Rnd > 0.5) If upper Then min = 65 max = 90 Else min = 97 max = 122 End If pass = pass + Chr(Int((max - min + 1) * Rnd + min)) Next
Ya solo nos queda hacer lo que tengamos que hacer con el valor obtenido. Podemos imprimirlo en el panel de Inmediato:
debug.print pass
O podemos colocarlo en alguna celda:
cells(3,5).value = pass
O, como prometíamos con el nombre que le hemos dado, podemos proteger una hoja frente a ediciones indeseadas… Siempre que me prometas que tendrás cuidado. Una vez protegida de esta manera, una hoja no podrá ser desprotegida (al menos fácilmente). Esto se hace con el código siguiente:
[sociallocker]Activesheet.protect pass[/sociallocker]
Un saludo