Questa soluzione si ispira ad un precedente articolo a cui rimando per chi fosse curioso di approfondire: [excel] Come creare una password casuale di lunghezza arbitraria con un’unica formula
Il risultato che voglio ottenere sarà simile a questo:
Avendo una cella in input F2 indichiamo la lunghezza della password che desideriamo ottenere, nella cella sottostante una singola formula genera una password pseudo-casuale.
Prima di procedere oltre raccomando per password importanti l’uso di software più affidabile, con algoritmi di generazione di valori casuali superiori ad Excel, come per esempio KeePass.
Anzitutto voglio creare un set di caratteri da cui estrarre quelli della password. Immaginiamo di voler scrivere automaticamente una stringa contenente tutte le lettere maiuscole.
Come illustrato nell’articolo precedente partiamo dal presupposto di voler ricavare i caratteri da una tabella ASCII come la seguente:
Le lettere maiuscole vanno dal carattere 65 al carattere 90. Per ottenere l’intervallo di numeri desiderato usiamo:
1 |
=RIF.RIGA(INDIRETTO("65:90")) |
Questo produrrà una matrice come questa:
Se volessimo trasformare ciascun numero in un carattere dovremmo usare la funzione CARATT.UNI nel modo seguente:
1 |
=CARATT.UNI(RIF.RIGA(INDIRETTO("65:90"))) |
Il risultato sarà simile a questo:
Applichiamo ora CONCAT alla matrice così ottenuta e avremo tutti i caratteri in una singola riga.
1 |
=CONCAT(CARATT.UNI(RIF.RIGA(INDIRETTO("65:90")))) |
Ripetiamo l’operazione per gli intervalli 97:122 e 33:47 e concateniamo il tutto ai numeri da 0 a 9, nella seguente unica formula:
1 |
=CONCAT(RIF.RIGA(INDIRETTO("1:10"))-1)&CONCAT(CARATT.UNI(RIF.RIGA(INDIRETTO("65:90"))))&CONCAT(CARATT.UNI(RIF.RIGA(INDIRETTO("97:122"))))&CONCAT(CARATT.UNI(RIF.RIGA(INDIRETTO("33:47")))) |
Tutto questo produrrà una riga come la seguente:
La riga ha in tutto 77 caratteri. Adesso, dopo averla unita, vogliamo spezzarla di nuovo in ogni singolo carattere, usando, come nell’esercizio precedente, la funzione STRINGA.ESTRAI:
1 |
=STRINGA.ESTRAI(CONCAT(RIF.RIGA(INDIRETTO("1:10"))-1)&CONCAT(CARATT.UNI(RIF.RIGA(INDIRETTO("65:90"))))&CONCAT(CARATT.UNI(RIF.RIGA(INDIRETTO("97:122"))))&CONCAT(CARATT.UNI(RIF.RIGA(INDIRETTO("33:47"))));RIF.RIGA(INDIRETTO("1:77"));1) |
Infine usiamo INDICE sulla matrice così creata ed estraiamo per n volte un valore a caso tra 1 e 77. Concateniamo il tutto per ottenere una unica stringa di testo contenente la password.
1 |
=CONCAT(INDICE(STRINGA.ESTRAI(CONCAT(RIF.RIGA(INDIRETTO("1:10"))-1)&CONCAT(CARATT.UNI(RIF.RIGA(INDIRETTO("65:90"))))&CONCAT(CARATT.UNI(RIF.RIGA(INDIRETTO("97:122"))))&CONCAT(CARATT.UNI(RIF.RIGA(INDIRETTO("33:47"))));RIF.RIGA(INDIRETTO("1:77"));1);CASUALE.TRA(1;77+SE(RIF.RIGA(INDIRETTO("1:"&F2));0;0)))) |
Affinché la funzione CASUALE.TRA ricalcoli il valore per ogni singolo carattere desiderato, utilizziamo un piccolo trucchetto, inserendo una matrice all’interno della funzione CASUALE.TRA in questo modo:
1 |
=CASUALE.TRA(1;77+SE(RIF.RIGA(INDIRETTO("1:"&F2));0;0)) |
Grazie al SE sommo sempre 0, per qualunque valore generato da RIF.RIGA(INDIRETTO("1:"&F2))
che produrrà un vettore di dimensione n quanto è la lunghezza desiderata della password.