Macro per proteggere foglio Calc con Password fissa

Comunità di Libreoffice, buonasera!
E la mia prima uscita… e ringrazio chiunque deciderà di darmi una mano.
Ho trovato risposte a tanti problemi in questa “Ask”… e risolto problemi.
Per l’ennesima volta ho cercato, ma questa volta non riesco proprio a trovare niente;
Vorrei a questo punto soltanto una conferma che NON c’è soluzione al problema, oppure un rovescio alla facenda.
Ho un foglio di Calc, formattato, con formule per calcolo, e diavolerie varie.
Vorrei semplicemente creare una macro da attribuire poi a un tasto, che mi protegga il foglio da modifiche accidentali o involontarie che sia. La cosa che mi scoccia, è che devo ogni volta riinserire la password. (NON mi interessa in nessun modo l’inviolabilità… è solo per evitare problemi di basso livello)
Come faccio quindi a implementare nel codice di base della macro una password fissa (tipo 123456), che quando la lancio mi protegge il foglio? Ovviamente la stessa password servirà per sbloccare il foglio.
Questo il codice che si crea registrando la macro:

REM ***** BASIC *****

sub Blocca
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService(“com.sun.star.frame.DispatchHelper”)

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = “Protect”
args1(0).Value = true

dispatcher.executeDispatch(document, “.uno:Protect”, “”, 0, args1())

end sub

Ho tentato in vari modi di implementare il codice, e il post diventerebbe lungo parecchio se li elencassi tutti. (anche perche ricevo sempre messaggi di errore di sintassi e altre robe…)
Possibile che non si riesca a in questo intento?
Grazie davvero a chiunque mi darà risposta…!!

Prova

ThisComponent.protect(CONTRASENA)

e
ThisComponent.unProtect(CONTRASENA)

1 Like

Ho provato come suggerito da Elmau (che ringrazio per la risposta):

REM ***** BASIC *****

sub Blocca
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.protect (123456)
dispatcher = createUnoService(“com.sun.star.frame.DispatchHelper”)

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = “Protect”
args1(0).Value = true

dispatcher.executeDispatch(document, “.uno:Protect”, “”, 0, args1())

end sub

Purtroppo non funziona… mi da il seguente errore:
Accesso all’oggetto non possibile.
Utilizzo non valido di un oggetto.

Altre possibili soluzioni?

e’ sbagliato

La password è una stringa di testo, quindi va tra virgolette.

ThisComponent.protect("123456")

Ciao Elmau… grazie ancora della tua pazienza.

Allora ho provato come dici, quindi:

REM ***** BASIC *****

sub BloccaMag
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.protect(“123456”)
dispatcher = createUnoService(“com.sun.star.frame.DispatchHelper”)

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = “Protect”
args1(0).Value = true

dispatcher.executeDispatch(document, “.uno:Protect”, “”, 0, args1())

end sub

Purtroppo ricevo ancora lo stesso errore di prima… :pensive:
E davvero frustrante… Boh non capisco perche sia cosi complicato.

Cancella tutto… Tutto e basta mettere questa linea, solo questa linea.

ThisComponent.protect("123456")

Protect
ThisComponent.getCurrentController.getActiveSheet().Protect("123456")

Unprotect
ThisComponent.getCurrentController.getActiveSheet().unProtect("123456")

1 Like

Un grazie a Elmau e schiavinatto per la pazienza.

Procedo per ordine, ho provato le 2 soluzioni, ma ho ottenuto un primo risultato
solo così: (Altrimenti viene fuori l’errore : Errore di Sintassi - Atteso Sub)

REM ***** BASIC *****

sub BloccaMag

ThisComponent.getCurrentController.getActiveSheet().Protect(“123456”)

end sub

Il foglio adesso è PROTETTO! E anche la “struttura del foglio elettronico”.

Ora però mi si crea 1 altro problema, che deriva dal fatto che non ero stato chiaro IO
nelle mie necessità:
Mi servirebbe che le celle che ho dichiarato come “Protette” non possano essere
selezionabili (perche in questo modo quando inserisco dati in una cella non protetta
in una riga, al premere invio, mi salta alla prossima non protetta… ed è esattamente
quello di cui ho bisogno…oltre a l’imissione accidentale ovviamente)
A questo avrei bisogno di 1 soluzione.

Segnalo poi, solo a titolo di studio: (userò la “unProtect” per aggirare il problema)
La macro protegge foglio e struttura…
Non avevo specificato, sempre nelle mie necessità, che lanciando 1 seconda macro
(registrata) volevo che fosse in questo caso inserita la password manualmente.
La cosa funziona… parzialmente però; ovvero si sblocca il foglio (inserendo
manualmente la password della macro di blocco) ma la “struttura del foglio” invece
rimane bloccata. E provando ad inserire la password, ottengo l’errore
“Password errrata”.
Si potrebbe risolvere anche questo?

Grazie infinite a tutti!

Lasciare le celle di riempimento non protette.
Le formule e i dati fissi sono protetti.

Per verificare se hai fatto bene, premi Crtl+F8, lo sfondo delle celle protette è grigio, le celle non protette sono bianche.



Se proteggi manualmente la prima volta e deseleziona [] Seleziona celle protette. La macro di protezione una volta eseguita ripeterà le selezioni precedentemente effettuate in questo file.

In questo modo è possibile navigare solo nelle celle non protette..

1 Like

Ciao schiavinatto,

allora confermo tutto quello che è stato detto:
La macro funziona, e ripeto: blocca la pagina e la struttura del foglio elettronico

sub BloccaXxx
ThisComponent.getCurrentController.getActiveSheet().Protect(“123456”)
end sub
PERO’ ATTENZIONE:
per non incorrere in problemi come mi è capitato a me, SI DEVE usare la macro di sblocco:
sub SbloccaXxx
ThisComponent.getCurrentController.getActiveSheet().UnProtect(“123456”)
end sub
Perche se sbloccate la PAGINA inserendo la password manualmente e fate un salva dopo aver
fatto modifiche e rilanciato la macro di blocco… beh non sarete piu in grado di sbloccare la STRUTTURA DEL FOGLIO ELETTRONICO.
Se vi serve come a me, di sbloccare il foglio protetto inserendo manualmente la password (sempre tramite una macro, certo)
BISOGNA PRIMA proteggere la struttura del foglio elettronico con una password diversa, da tenere al sicuro, e poi potrete lanciare la macro che a quanto pare non sovrascrive la 1a password. Mi viene in mente mentre scrivo, che forse inserendo la stessa password della macro, anche nella protezione struttura(facendolo comunque PRIMA), si può forse evitare di avere 2 password. Ma non ho provato.

Per quanto riguarda le celle, confermo che la navigazione è possibile solo nelle celle non protette, esattamente come serviva a me.

Ancora grazie del tuo preziosissimo aiuto!

1 Like