Proteggere e/o Limitare la durata nell'uso di una cartella Excel.

In generale con "protezione" possiamo intervenire per proteggere un foglio di lavoro o tutta la cartella. Le modalità per l'utilizzo di queste "protezioni" sono note e comunque facilmente leggibili e apprendibili dai vari menù. Abbiamo poi la possibilità di proteggere anche il codice in vba (macro) attraverso l'editor di visual basic, scegliendo dal menù dell'editor, "Strumenti/Proprietà di VBA Project... e nella finestra che appare, scegliere "protezione", spuntando la casella "proteggi progetto dalla visualizzazione", e assegnando una password. Fatto questo è necessario salvare e chiudere la cartella : alla riapertura, se vorremo accedere al codice, dovremo digitare la password. Tutti questi metodi sono comunque inservibili se ci vogliono forzare le protezioni : esistono in commercio dei programmi che hanno il preciso compito di individuare e fornirci le password usate a protezione di fogli, cartelle e progetto vba, rendendo quindi inutili i nostri sforzi per proteggerci il lavoro. Per fortuna la maggior parte degli utenti di Excel rientra nell'utenza standard (non fraintendetemi), cioè di coloro che, per uso casareccio o di ufficio, usano excel senza malizia e senza sentirsi degli pseudoHacker. Le protezioni, per questi "onesti cittadini", servono e funzionano egregiamente.

E' possibile peraltro munire i nostri lavori di "protezioni" personalizzate, oltre a quelle standard fornite da Excel, protezioni impostate tramite istruzioni in codice vba, che possono essere molto articolate e prevedere anche "scadenze" o "durate". Sarebbe in questo modo possibile distribuire dei lavori in versione "Trial" che se, non confermati, scadranno e non sarà possibile utilizzarli. Si può scegliere una scadenza a data oppure per numero di volte. Vediamo entrambi i casi, facendo prima alcune considerazioni. Non esiste una protezione inviolabile per gli "smanettoni", esistono solo protezioni valide per "pellegrini" "non smanettoni" (la maggioranza, per fortuna.)

  1. Excel quando apre un file che contiene macro, mostra sempre una finestra che chiede se vogliamo "Attivare" o "Disattivare" le macro (questo solo se NON abbiamo scelto in "Protezione/Macro" "Bassa protezione", in questo caso i file vengono aperti senza nessuna richiesta e con l'attivazione delle macro).

  2. Disattivare le macro ci consente di poter scorrere i fogli, di scoprire i fogli eventualmente nascosti, di girare in lungo e in largo, compreso l'accesso al codice, di poter modificare o eliminare istruzioni e/o dati presenti nei fogli (quei dati che vedremo più avanti, e che servirebbero a limitare l'uso del nostro programma). Al tempo stesso però, non sarà possibile attivare le istruzioni di nessuna macro e quindi non potremo gestire il lavoro se impostato con delle macro.

  3. Ci spostiamo tra i fogli perchè possiamo selezionare le "linguette" dei fogli (le WorksTab). Se le "linguette" non fossero visibili non potremo mai usarle e quindi spostarci. Esiste un istruzione, CHE SI ATTIVA anche se disabilitiamo le macro, e che consente appunto di non far vedere le "linguette", e senza linguette, non si va da nessuna parte, neanche quindi sul foglio dove avremo inserito le nostre istruzioni "segrete". Per poterci spostare tra i fogli, useremo dei pulsanti, associati a delle macro. Ma se disabilitiamo le macro, non ci potremo spostare, giusto? E quindi continuiamo a proteggerci. Sarà poi sufficiente NON prevedere un pulsante che porti al nostro foglio "segreto", e chiunque, anche abilitando le macro, non potrà mai accedervi. A questo punto, sarà sconsigliato "nascondere" il foglio "segreto", proprio perchè dal menù "Formato/Foglio" sarebbe possibile usare "Scopri foglio" che è un'azione che selezionerebbe il foglio così scoperto, mettendolo in primo piano, mostrando a tutti ciò che vogliamo invece tenere nascosto.

  4. Ma non basta: infatti, pur predisponendo all'apertura della cartella (evento Workbook_Open) l'istruzione ActiveWindow.DisplayWorkbookTabs = False e non consentendo l'attivazione delle macro, esiste la possibilità di selezionare dal Menù Strumenti/Opzioni, finestra "Visualizza", la voce "Schede" mettendo un segno di spunta: questa è l'opzione che mostra/nasconde le WorkbookTabs, cioè le "Schede". Apparirebbero quindi le famose "linguette", e allora addio ad una nostra protezione: i fogli saranno selezionabili e consultabili.   

Ricapitoliamo le operazioni da fare:

  • munire l'accesso al codice vba di una password

  • disabilitare le "linguette" dei fogli

  • predisporre i pulsanti per spostarci sui fogli permessi

(per attivare la protezione del codice e disabilitare le linguette occorre salvare, chiudere e riaprire il foglio, resteranno poi sempre attivi) vediamo le istruzioni da compilare:

Nell'evento WorkBook_Open(), per disabilitare le linguette su tutti i fogli:

ActiveWindow.DisplayWorkbookTabs = False 

In un Modulo nell'editor di vb, creare le macro per spostarsi tra i fogli:

Sub apriuno()
Sheets(1).Select
End Sub

Sub apridue()
Sheets(2).Select
End Sub

preparare tante macro per quanti saranno i fogli su cui navigare, TRANNE quella che porterebbe al foglio che vorremo come "segreto". In ogni foglio predisporremo tanti pulsanti per quanti saranno i fogli, in modo che da qualunque foglio si possa andare su qualunque altro foglio. Ogni pulsante sarà associato alla macro di pertinenza.

A questo punto ci troveremo in questa condizione: se abilitiamo le macro, andremo solo sui fogli di cui esistono i pulsanti, se NON abilitiamo le macro, non andremo da nessuna parte e le linguette non saranno comunque visibili. Per accedere al codice avremo bisogno di una password : la protezione è in atto.

Ed ora vediamo i due sistemi per la "Prova a Scadenza" del nostro lavoro.

  • Prova a tempo 1.  Si basa sulla registrazione della data di primo accesso, e dopo un periodo stabilito (normalmente 15 o 30 giorni), non sarà più possibile l'uso del lavoro.

Useremo il nostro foglio "nascosto" per queste registrazioni, e predisporremo le opportune istruzioni, sempre sfruttando l'evento WorkBook_Open(). Supponiamo di usare il foglio3. Avremo bisogno di un contatore che abiliti l'attivazione della registrazione della data di prima apertura (A1 e A2), metteremo in C1 la data che otterremo con la funzione =OGGI(), faremo copiare via codice solo la data e non la funzione, in D1,  e in E1 metteremo la data + il tempo in giorni destinato al periodo di prova. (Abbiamo bisogno che questa operazione sia fatta una volta sola, per questo usiamo un contatore), avremo poi bisogno di un'istruzione che controlli se la data odierna (in C1) sarà maggiore della data posta in E1 (limite massimo di prova) o minore della data posta in D1 (limite di inizio prova) che faremo invece aggiornare ad ogni chiusura cartella. Se qualcuno, da pannello di controllo, regolasse la data a un certo giorno antecedente, provocherebbe la chiusura della cartella così come avverrà se superata la data di termine prova. Vediamo le istruzioni e le spiegazioni:

Foglio3, cella A1 inserire zero (0) - cella C1 inserire =OGGI()

Private Sub Workbook_Open()

'si disabilitano le linguette
ActiveWindow.DisplayWorkbookTabs = False

'si inizializza il contatore incrementando A2 di 1 rispetto a A1 (che è zero)
Sheets(3).Range("A2") = Sheets(3).Range("A1") + 1

'si rende A1 uguale a A2 (ora A1 è uguale a 1)
Sheets(3).Range("A1") = Sheets(3).Range("A2")
 

'si controlla se A1 è uguale a 1 (e quindi solo in questo caso si eseguono queste istruz.)
If Sheets(3).Range("A1").Value = 1 Then

'allora si copia la data di C1 (oggi) in D1
Sheets(3).Range("D1") = Sheets(3).Range("C1")

'e si incrementa la data C1 del valore scelto (15) in E1
Sheets(3).Range("E1") = Sheets(3).Range("C1") + 15
End If


'ora inizia il controllo sulle date: se la data di oggi è maggiore di quella scritta in E1
If Sheets(3).Range("C1").Value > Sheets(3).Range("E1") Then

'allora si chiude l'applicazione e quindi anche Excel
Application.Quit
End If

'se la data di oggi è inferiore alla data registrata in D1 (che corrisponde alla prima esecuzione del programma (nel caso che qualche "astuto" retroceda la data in pannello di controllo)(legata anche all'istruzione posta in WorkBook_BeforeClose)
If Sheets(3).Range("C1").Value < Sheets(3).Range("D1") Then

'allora si chiude l'applicazione e quindi anche Excel
Application.Quit
End If
End Sub

 

E queste le istruzioni in chiusura della cartella:


Private Sub Workbook_BeforeClose(Cancel As Boolean)

'questo controllo aggiorna la data che si troverà in D1, e che serve di controllo alla routine precedente, riducendo i giorni (all'indietro) di prova: se la data di oggi è superiore alla data presente in D1, D1 viene aggiornato con la data di oggi. Se il solito "astuto" metterà indietro la data, scatta la chiusura dell'applicazione.
If Sheets(3).Range("C1") > Sheets(3).Range("D1") Then
Sheets(3).Range("D1") = Sheets(3).Range("C1")
End If

'questa istruzione garantisce che in uscita venga comunque salvata la cartella con le registrazioni sulle date e sul contatore.
ThisWorkbook.Save

End Sub

Volendo è possibile munire l'istruzione di un messaggio che avvisa quanti giorni mancano alla scadenza. (usando la fuzione DateDiff).

 

  • Prova a tempo 2.   Si basa sulla registrazione di una data da noi impostata, e da un numero x di giorni concessi come giorni di prova o valutazione. Faremo leggere con una variabile la data del giorno in cui si sta consultando la cartella, e se la data attuale sarà maggiore rispetto alla data preimpostata + il numero di giorni concessi come prova, chiudiamo la cartella. Per questa operazione sceglieremo l'evento WorkBook_Open. Chiaramente dovremo proteggere il progetto VBA con password, in modo che non sia tanto facile accedervi per cancellare o modificare l'istruzione. Altro aspetto da considerare è che il lavoro dovrà contenere altre macro per poter svolgere il programma previsto; in questo modo, visto che disabilitando le macro in apertura di cartella sarà possibile accedere ai vari fogli, non sarà comunque possibile lavorarci se sono previste macro per lavorarci. Questa la routine:

Private Sub Workbook_Open()
giorno = #9/20/2004# 
'con la variabile "giorno" scriveremo la data dalla quale contare i 'giorni concessi come prova; la data va scritta tra cancelletti, provvede il compilatore a 'trasformarla in formato data inglese (è stata digitato 20/09/2004)
oggi = Date 
'con la variabile "oggi" prendiamo la data in cui apriamo la cartella, e ora si 'controlla se la data di oggi è uguale o maggiore rispetto a "giorno" più 30 giorni (60/90, 'quello che stabilirete voi)
If oggi >= giorno + 30 Then 
'se siamo oltre il periodo di prova, allora
ThisWorkbook.Close 
'chiudiamo la cartella
End If
End Sub

 

 

  • Prova a numero di aperture. Si basa sul conteggio di quante volte viene aperta la cartella del nostro lavoro. Risulta più semplice da impostare rispetto alla precedente (questione di opinioni) e anche qui useremo un contatore che inizializzeremo partendo da zero (A1), e decideremo il numero di aperture consentite. Come sopra sfruttiamo il foglio3 con le celle A1 e A2, la durata sarà di 15 aperture. (non ripeto le istruzioni già fornite nella precedente routine)

Private Sub Workbook_Open()
ActiveWindow.DisplayWorkbookTabs = False


Worksheets(3).Range("A2") = Worksheets(3).Range("A1") + 1
Worksheets(3).Range("A1") = Worksheets(3).Range("A2")

'sotto: con X prendiamo il numero di volte rimaste, con una semplice sottrazione
X = 15 - Worksheets(3).Range("A2").Value

If Worksheets(3).Range("A2").Value >= 15 Then
Application.Quit
Else

'avvisiamo con un messaggio che riporta il numero di prove restanti
MsgBox "Hai ancora " & X & " prove da fare"
End If
End Sub

 

e questa l'istruzione in chiusura cartella :


Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Save
End Sub


Alcuni consigli: si possono inserire quanti fogli vorremo, per usare un foglio come "segreto"; non è detto che le celle usate per le protezioni siano necessariamente sul foglio3, potrebbero stare sul dodicesimo di venti fogli, per esempio. Non scordarsi dei pulsanti per la selezione dei fogli.

 

Buon lavoro.
prelevato sul sito http://ennius.interfree.it