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.)
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).
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.
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.
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.
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 |