Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Generatore casuale di Password

Ultimo Aggiornamento: 13/01/2019 15:57
Post: 11
Registrato il: 11/12/2018
Città: RAVENNA
Età: 51
Utente Junior
Excel 2016
OFFLINE
09/01/2019 17:16

Buongiorno a tutti!
Chiedo ancora il vostro prezioso aiuto perché vorrei creare un foglio di excel che nella colonna B mi generi alla pressione di un tasto un numero "X" predefinito (esempio 100) di password univoche.

Ho trovato googolando questo codice VBA che genera 2000 password casuali;

Quello che però vorrei sarebbe:

- creare un pulsante che alla pressione mi generi ogni volta un numero prefissato di password (es. 100) che si vanno ad accodare a quelle generate in precedenza e ovviamente diverse da quelle generate in precedenza.
- password nella colonna B (anziché A)
- in colonna A una casella di spunta a fianco di ogni riga per fare il check di ogni password che eventualmente utilizzerei

Grazie anticipatamente per il vostro prezioso aiuto!

Andrea.

Ecco il codice:

Dim varChar, arrayChar() As String
Dim variabile As String
Dim controlla As Boolean
Dim numero As Integer
Dim numeroPassword, lunghezza as Integer
Sub GeneraPassword()
varChar = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9"
arrayChar = Split(varChar, ",")
numeroPassword = 2000
lunghezza = 10
numero = UBound(arrayChar)
For a = 1 To numeroPassword
trovato = False
Do While trovato = False
pwd = genera()
controll = controllo(variabile, a)
Debug.Print "pwd #" & a & ": " & variabile & " - " & "CTRL: " & controlla
If controlla = True Then
Cells(a, 1).Value = variabile
trovato = True
Else
Exit Sub
End If
Loop
Next a
End Sub
Function genera()
variabile = ""
For b = 0 To lunghezza
k = Int(Rnd() * numero)
variabile = variabile & arrayChar(k)
Next
End Function
Function controllo(password, termine)
controlla = True
For c = 1 To termine
If Cells(c, 1) = password Then
controlla = False
Exit For
End If
Next c
End Function

Post: 765
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
09/01/2019 22:58

Ecco alcune modifiche necessarie per realizzare la creazione di 100 passwords univoche in colonna B accodate ad eventuali già presenti.

Il pulsante d'avvio te lo puoi facilmente creare ed associarci la macro 'GeneraPassword'; mentre per la colonna A, secondo me, non servono caselle, basta anche una X.
Option Explicit

Dim varChar, arrayChar() As String
Dim variabile As String
Dim controlla As Boolean
Dim numero As Long
Dim numeroPassword As Long
Dim lunghezza As Long

Sub GeneraPassword()

    Dim a As Long
    Dim trovato As Boolean
    Dim pwd As Variant
    Dim controll As Boolean
    Dim ur As Long
    
    varChar = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9"
    arrayChar = Split(varChar, ",")
    numeroPassword = 100                            'passwords da generare
    lunghezza = 10
    numero = UBound(arrayChar)
    ur = Cells(Rows.Count, 2).End(xlUp).Row         'trova la prima riga libera in colonna B
    If ur = 1 Then ur = 0                           'se la colonna B è vuota predisponi per partire dalla riga 1
    For a = ur + 1 To ur + numeroPassword
        trovato = False
        Do While trovato = False
            pwd = genera()
            controll = controllo(variabile, a)
            'Debug.Print "pwd #" & a & ": " & variabile & " - " & "CTRL: " & controlla   '<= serve solo per verifica
            If controlla = True Then
                Cells(a, 2).Value = variabile       'riporta in colonna B la password univoca generata
                trovato = True
            Else
                Exit Sub
            End If
        Loop
    Next a
    
End Sub

Function genera()

    Dim b As Long
    Dim k As Long
    
    variabile = ""
    For b = 0 To lunghezza
        k = Int(Rnd() * numero)
        variabile = variabile & arrayChar(k)
    Next
    
End Function

Function controllo(password, termine)

    Dim c As Long
    
    controlla = True
    For c = 1 To termine
        If Cells(c, 2) = password Then              'confronta la nuova password con quelle già presenti in colonna B
            controlla = False
            Exit For
        End If
    Next c
    
End Function

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 11
Registrato il: 11/12/2018
Città: RAVENNA
Età: 51
Utente Junior
Excel 2016
OFFLINE
10/01/2019 14:24

Re:
rollis13, 09/01/2019 22.58:

Ecco alcune modifiche necessarie per realizzare la creazione di 100 passwords univoche in colonna B accodate ad eventuali già presenti.

Il pulsante d'avvio te lo puoi facilmente creare ed associarci la macro 'GeneraPassword'; mentre per la colonna A, secondo me, non servono caselle, basta anche una X.
Option Explicit

Dim varChar, arrayChar() As String
Dim variabile As String
Dim controlla As Boolean
Dim numero As Long
Dim numeroPassword As Long
Dim lunghezza As Long

Sub GeneraPassword()

    Dim a As Long
    Dim trovato As Boolean
    Dim pwd As Variant
    Dim controll As Boolean
    Dim ur As Long
    
    varChar = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9"
    arrayChar = Split(varChar, ",")
    numeroPassword = 100                            'passwords da generare
    lunghezza = 10
    numero = UBound(arrayChar)
    ur = Cells(Rows.Count, 2).End(xlUp).Row         'trova la prima riga libera in colonna B
    If ur = 1 Then ur = 0                           'se la colonna B è vuota predisponi per partire dalla riga 1
    For a = ur + 1 To ur + numeroPassword
        trovato = False
        Do While trovato = False
            pwd = genera()
            controll = controllo(variabile, a)
            'Debug.Print "pwd #" & a & ": " & variabile & " - " & "CTRL: " & controlla   '<= serve solo per verifica
            If controlla = True Then
                Cells(a, 2).Value = variabile       'riporta in colonna B la password univoca generata
                trovato = True
            Else
                Exit Sub
            End If
        Loop
    Next a
    
End Sub

Function genera()

    Dim b As Long
    Dim k As Long
    
    variabile = ""
    For b = 0 To lunghezza
        k = Int(Rnd() * numero)
        variabile = variabile & arrayChar(k)
    Next
    
End Function

Function controllo(password, termine)

    Dim c As Long
    
    controlla = True
    For c = 1 To termine
        If Cells(c, 2) = password Then              'confronta la nuova password con quelle già presenti in colonna B
            controlla = False
            Exit For
        End If
    Next c
    
End Function




Perfetto!! L'ho provato e funziona benissimo!! Grazie!!

Nella colonna A inserendo la lettera X mi evidenzia il codice riscattato della relativa colonna B e mi aggiorna il conteggio dei codici riscattati nella cella G1

Nel testarlo ho capito però lo devo ottimizzare per evitare errori/cancellazioni involontarie di codici distribuiti....
Vorrei fare in modo che una volta che i codici sono stati creati nel foglio CODICI mi venissero copiati anche nel foglio ARCHIVIA_CODICI, onde evitare che involontariamente cancelli qualche codice e salvando la cartella di lavoro poi non riesca a recuperarlo.

E' possibile quindi aggiornare la Macro in modo che ogni volta che mi crea i 100 codici nuovi me li vada anche a copiare nel foglio ARCHIVIA_CODICI in modo che ho sempre un backup nel caso di cancellazione accidentale?

Allego il file creato.

Grazie ancora! Mi hai risolto un bel problema per me!!!
Post: 766
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
10/01/2019 22:51

Secondo me, senza crearti altri fogli di backup, ti basta proteggere la colonna B.
Seleziona l'intero foglio e nella formattazione delle celle togli la Protezione, ora selezione la colonna B e rimetti la Protezione nella formattazione (eventualmente anche per la cella G2) e poi attiva la protezione del Foglio, non serve mettere una password e lascia la spunta solo su 'Seleziona celle sbloccate'.
Nella macro aggiungi la gestione della protezione giusto il tempo per scrivere nelle celle in colonna B, così:
Sub GeneraPassword()
 
    Dim a As Long
    Dim trovato As Boolean
    Dim pwd As Variant
    Dim controll As Boolean
    Dim ur As Long
     
    varChar = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9"
    arrayChar = Split(varChar, ",")
    numeroPassword = 100                        'passwords da generare
    lunghezza = 16
    numero = UBound(arrayChar)
    ur = Cells(Rows.Count, 2).End(xlUp).Row     'trova la prima riga libera in colonna B
    If ur = 1 Then ur = 0                       'se la colonna B è vuota predisponi per partire dalla riga 1
    ActiveSheet.Unprotect                       '<= (nuova) togli protezione
    For a = ur + 1 To ur + numeroPassword
        trovato = False
        Do While trovato = False
            pwd = genera()
            controll = controllo(variabile, a)
            'Debug.Print "pwd #" & a & ": " & variabile & " - " & "CTRL: " & controlla   '<= serve solo per verifica
            If controlla = True Then
                Cells(a, 2).Value = variabile   'riporta in colonna B la password univoca generata
                trovato = True
            'Else                               '<= queste non servono (neanche prima servivano)
            '     Exit Sub                      '<= sono solo residui della macro originale
            End If
        Loop
    Next a
    MsgBox "Finito, create altre 100 password."
    ActiveSheet.Protect                         '<= (nuova) rimetti protezione
 
End Sub

[Modificato da rollis13 10/01/2019 22:58]

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 12
Registrato il: 11/12/2018
Città: RAVENNA
Età: 51
Utente Junior
Excel 2016
OFFLINE
11/01/2019 18:05

Re:
rollis13, 10/01/2019 22.51:

Secondo me, senza crearti altri fogli di backup, ti basta proteggere la colonna B.
Seleziona l'intero foglio e nella formattazione delle celle togli la Protezione, ora selezione la colonna B e rimetti la Protezione nella formattazione (eventualmente anche per la cella G2) e poi attiva la protezione del Foglio, non serve mettere una password e lascia la spunta solo su 'Seleziona celle sbloccate'.
Nella macro aggiungi la gestione della protezione giusto il tempo per scrivere nelle celle in colonna B, così:
Sub GeneraPassword()
 
    Dim a As Long
    Dim trovato As Boolean
    Dim pwd As Variant
    Dim controll As Boolean
    Dim ur As Long
     
    varChar = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9"
    arrayChar = Split(varChar, ",")
    numeroPassword = 100                        'passwords da generare
    lunghezza = 16
    numero = UBound(arrayChar)
    ur = Cells(Rows.Count, 2).End(xlUp).Row     'trova la prima riga libera in colonna B
    If ur = 1 Then ur = 0                       'se la colonna B è vuota predisponi per partire dalla riga 1
    ActiveSheet.Unprotect                       '<= (nuova) togli protezione
    For a = ur + 1 To ur + numeroPassword
        trovato = False
        Do While trovato = False
            pwd = genera()
            controll = controllo(variabile, a)
            'Debug.Print "pwd #" & a & ": " & variabile & " - " & "CTRL: " & controlla   '<= serve solo per verifica
            If controlla = True Then
                Cells(a, 2).Value = variabile   'riporta in colonna B la password univoca generata
                trovato = True
            'Else                               '<= queste non servono (neanche prima servivano)
            '     Exit Sub                      '<= sono solo residui della macro originale
            End If
        Loop
    Next a
    MsgBox "Finito, create altre 100 password."
    ActiveSheet.Protect                         '<= (nuova) rimetti protezione
 
End Sub




Grandissimo! Provato ed è perfetto!!!
Se volessi fare partire la generazione dei codici (sempre 500) dalla RIGA 2 o 3 perché magari sulla riga 1 voglio metterci le descrizioni delle relative colonne e poi impostare lo scorrimento automatico a partire dalla riga 2 o 3 in modo che queste siano sempre visibili, come devo modificare la stringa di codice?
Grazie ancora per la tua pazienza e soprattutto disponibilità!!
Ciaoooooo
Post: 767
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
11/01/2019 22:03

Questa è la riga di codice che ti calcola l'ultima cella occupata nella colonna B:

ur = Cells(Rows.Count, 2).End(xlUp).Row

Se hai messo dei titoli nelle prime due celle la prima password verrà messa automaticamente nella prima cella libera, ovvero la terza.

Per bloccare lo scorrimento delle righe e/o delle colonne non serve il vba, basta utilizzare le normali risorse di Excel, ovvero, la funzione Blocca Riquadri che si trova nel menu Visualizza ... ma sai usare Excel ? o ti sei imbarcato in un progetto che va oltre le tue conoscenze. Si impara ad utilizzare il vba solo dopo aver conosciuto almeno le fondamentali di Excel.
[Modificato da rollis13 11/01/2019 22:06]

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 13
Registrato il: 11/12/2018
Città: RAVENNA
Età: 51
Utente Junior
Excel 2016
OFFLINE
11/01/2019 22:13

Re:
rollis13, 11/01/2019 22.03:

Questa è la riga di codice che ti calcola l'ultima cella occupata nella colonna B:

ur = Cells(Rows.Count, 2).End(xlUp).Row

Se hai messo dei titoli nelle prime due celle la prima password verrà messa automaticamente nella prima cella libera, ovvero la terza.

Per bloccare lo scorrimento delle righe e/o delle colonne non serve il vba, basta utilizzare le normali risorse di Excel, ovvero, la funzione Blocca Riquadri che si trova nel menu Visualizza ... ma sai usare Excel ? o ti sei imbarcato in un progetto che va oltre le tue conoscenze. Si impara ad utilizzare il vba solo dopo aver conosciuto almeno le fondamentali di Excel.



Grazie rollis13 per il prezioso aiuto!
ti chiedo scusa ma forse mi sono spiegato male nel post precedente.. conosco bene la funzione blocca riquadri ed infatti avevo intenzione di utilizzare quella per fissare la riga 1 con le descrizioni delle relative colonne.
Quello di cui avevo bisogno appunto era solo della stringa aggiornata per far partire la generazione dei codici dalla riga 2 proprio perché pensavo di occupare la 1 con i titoli (originariamente non previsti).
Diciamo che VBA non lo conosco affatto e per questo ho chiesto aiuto mentre con le normali funzioni me la cavo discretamente.. 😀
Grazie ancora di tutto!!
Post: 768
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
11/01/2019 23:48

Grazie del riscontro positivo 👍.

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 2.101
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
13/01/2019 12:28

Ciao
forse mi è sfuggito qualcosa della discussione, pertanto prego l'amico Rollis di correggermi:

For b = 0 To lunghezza

genera, salvo errori, un carattere in più rispetto alla lunghezza della psw voluta....

saluti



Domenico
Win 10 - Excel 2016
Post: 772
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Senior
Excel 2016-32bit Win11
OFFLINE
13/01/2019 15:57

@dodo47, è certo, hai perfettamente ragione. Non c'avevo neanche fatto caso; davo per certo che quella parte della macro fosse funzionante e già collaudata 😮.

A questo punto per rimettere tutto in carreggiata sarà sufficiente che l'utente cambi la riga in:

For b = 0 To lunghezza - 1

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 21:41. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com