Protezione dei nostri lavori

Ultima modifica: 29-05-2016

Spesso ci capita che, noi amanti di Excel e del suo VBA, nel nostro posto di lavoro, per lavorare meglio, ci divertiamo a costruire ed elaborare fogli di calcolo più o meno complessi.

La frustrazione più grande è quando ci accorgiamo che, a nostra insaputa, qualche collega ci metta su le mani e, non conoscendo la struttura del nostro lavoro, ci rovina mesi e mesi di lavoro.

Potremmo anche usare password più o meno segrete, più o meno complesse. Ma ci può sempre essere un Pinco Pallino che abbia uno dei tanti programmi sprotettori ed entri lo stesso nella nostra cartella di lavoro.

Potremmo anche nascondere il nostro file in qualche cartella recondita del disco fisso, ma basta eseguire una banale ricerca ed il nostro file è trovato.

Potremmo scrivere del codice per tentare di ottenere da questo un aiuto contro manipolazioni altrui, basterebbe che il Pinco Pallino sappia che per inibire il VBA basta eseguire il comando "Disattiva Macro" all'apertura del file e con le macro disattivate rovinarci il lavoro.

 

Forse ho trovato il rimedio!!! Preparazione del lavoro:

Perchè tutto questo? E' presto detto. Quando vogliamo lavorare col nostro file non apriamo direttamente quello, ma andremo ad aprire il nuovo file che andrà ad eseguire queste operazioni:

Ma passiamo al VBA.

 

Il procedimento sembra un po' macchinoso, ma alla fine potremo dormire sonni più tranquilli. Qualcuno potrà anche obiettare: "Ma se qualcuno usa Disattiva Macro può entrare lo stesso in VBA e scoprire tutto". Ho pensato a rendere la vita difficile anche a questo tipo di ficcanaso.

Infatti entrando in ambiente VBA si potrebbero scoprire il nome del nuovo file e la password.

Ma ho provveduto a "codificare (crittografare)" alcune variabili. In che senso? Alle variabili più significative, quelle della password e del nome del file (se abbiamo pazienza anche dell'intero percorso del file) assegneremo i valori prelevando i codici dei relativi caratteri dalla tabella Ascii (avete presente la tabella dei codici Ascii che ho copiato nell'articolo "Suggerimenti (aggiornabile)" i codici ascii di questo sito - Codici Ascii -?) o prelevandoli tramite la piccola utility nello stesso articolo i codici ascii - Trovare il codice Ascii di un carattere -.

Ebbene proviamo ad usarla per questo lavoro.

In una mia prova ho usato questo:

 

m i c h e l e     
109 105 99 104 101 108 101     
                  
m a t r i c i        
109 97 116 114 105 99 105 32      
                     
c o n   d a t i      
99 111 110 32 100 97 116 105 32    
                     
e s t e r n i . x l s
101 115 116 101 114 110 105 46 120 108 115

 

 

Ho usato "michele" come password e "matrici con dati esterni.xls" come nome di file.

Le caselle contrassegnate di giallo rappresentano il carattere spazio (codice Ascii 32).

Voi potete usare quel che volete.

 

Iniziamo la scrittura del codice nel modulo ThisWorkbook ed usiamo l'evento Workbook_Open perchè la routine deve essere attivata all'apertura del file.

In questa procedura andrò a scrivere il mio codice.

 

Quindi ecco il codice che ho usato per attuare il mio scopo:

Private Sub Workbook_Open()
'pongo in una matrice i codici relativi alla stringa che deve servire come confronto
'con la password inserita (in questo caso i codici rappresentano i caratteri
'contenuti in "michele")

Dim iCode
iCode = Array(109, 105, 99, 104, 101, 108, 101)
'pongo nella variabile "b" i codici Ascii trasformati in caratteri
b = ""
For i = LBound(iCode) To UBound(iCode)
b = b & Chr(iCode(i))
Next
'pongo in una matrice i codici relativi alla stringa che deve servire come confronto
'con la password inserita (in questo caso i codici rappresentano i caratteri
'contenuti in "matrici con dati esterni.xls"

iCode = Array(109, 97, 116, 114, 105, 99, 105, 32, 99, 111, 110, 32, 100, 97, 116, 105, 32, 101, 115, 116, 101, 114, 110, 105, 46, 120, 108, 115)
'pongo nella variabile "d" i codici Ascii trasformati in caratteri
d = ""
For i = LBound(iCode) To UBound(iCode)
d = d & Chr(iCode(i))
Next
'rilevo il nome del file attivo
c = ActiveWorkbook.Name
'ricevo dalla InputBox la password
a = InputBox("Inserire il codice di accesso")
On Error Resume Next
'confronto la password inserita tramite la InputBox con quella preparata tramite
'il primo gruppo di codici Ascii

If a = b Then
'se la password inserita tramite la InputBox è giusta apro il file il cui nome
'preparato tramite il secondo gruppo di codici Ascii è contenuto
'nella variabile "d"
'ovviamente chi usa questa routine dovrà cambiare la parte di stringa evidenziata

Workbooks.Open Filename:= _
"D:\Michele\attivita\filesXLS\" & d
End If
'per rendere più emblematica la situazione nel caso il file non venga trovato
'si può omettere il sottostante blocco di istruzioni che è evidenziato

If Err <> 0 Then
MsgBox "Impossibile aprire il file "
End If
On Error GoTo 0
'in ogni caso il file chiamante verrà senz'altro chiuso
Workbooks(c).Close
End Sub

Il codice può sembrare a prima vista relativamente chiuso. In realtà, tolte le righe remmate (dopo l'apice e colorate di verde) non è eccessivo e di facile comprensione.

 

Tuttavia occorre dare qualche avvertimento.

Una volta scritta questa routine, come è stato precedentemente detto, nel modulo ThisWorkbook ed utilizzando l'evento Workbook_Open, sembra inaccessibile anche allo stesso autore in quanto qualsiasi operazione si vada a compiere, giusta o sbagliata che sia, la cartella viene chiusa.

L'unico modo per accedere al codice per un eventuale cambiamento e/o correzione dello stesso è quello di scegliere di disabilitare le macro alla presentazione della finestra di diatogo "Avviso di protezione".

 

Vi auguro buon divertimento