› Sviluppare funzionalita su Microsoft Office con VBA › Workbook in sola lettura
-
AutoreArticoli
-
Visto il silenzio, rompiamo il ghiaccio 🙂
Come annullereste le modifiche fatte da un utente a un foglio di lavoro Excel ? 🙂
Ciao @vecchio frac
in maniera "brutale" chiudendo il file senza salvarlo!!!!!!
Ciao,
Mario

Ma nonostante le istruzioni chiare, l'utente malvagio (u-fetente) o quello stupido (u-tonto), salvano
Che si fa?
Vale anche per chi ha il 2010 ?
Certo, nessun Excel verrà maltrattato o discriminato in alcuna sessione 🙂
ciao a tutti
Come annullereste le modifiche fatte da un utente a un foglio di lavoro Excel ?
secondo me questa è una cosa diversa rispetto al titolo della discussione e per il momento non ho soluzione,
ma per l'altra domanda la mia risposta è la seguente:
all'apertura di Excel da menù Recenti > selezionare il percorso del file da aprire > selezionare il file >
dalla finestra di dialogo dalle opzioni Apri a tendina > "Apri in sola lettura"
Forse non è la più "performante", ma è sicuramente la più "semplice ed immediata",
o no?!?!?!?
Frank
Coinvolgo anche Supermario che ha postato il suo intervento in un'altra discussione, citando la funzionalità di recupero di salvataggio che Office 2016 consente. Non è a questo che mi riferisco, io vorrei una soluzione da adottare via programmazione.
Così rispondo anche a patel: sì, lato codice vale per qualsiasi versione.
Quanto a Frank, il titolo della discussione forse è fuorviante ma non così tanto; lo scopo è avere il modo di bloccare le modifiche indesiderate dopo che l'utente le ha fatte (realizzando così una specie di Workbook read only), ma senza coinvolgere gli strumenti di Excel: il povero programmatore ha ricevuto dal cliente la consegna di realizzare questo obiettivo solo via codice.
Nota: non c'è alcun cliente, non c'è alcun povero programmatore... è solo una sfida di pensiero laterale, un giochino che vi propongo (se ricordate, con me ne avete già subiti in passato... ricordate le "sfide del mese"?). E chiaramente io ho già in testa una soluzione (due in verità, ma la seconda è più sofisticata e la proporrò come corollario).
Su, provate a pensare cosa fareste voi (ipotizzate di avere un modello di file da distribuire e non volete che l'utente sporchi il file). Niente blocchi di cella, niente protezioni, niente recupero di salvataggi, niente apertura in sola lettura. Puro e semplice VBA 😉
ciao a tutti
edit:
si potrebbe creare una variabile Public as integer che si aggiorna contando ogni variazione sui fogli del file e prima del Before_Close, con un For Next o un Do Loop ripetere l'istruzione Application.Undo
tante volte quanto il valore del contatore, togliendola ovviamente dal Before_Save.
Provo più tardi... ora devo uscire.
veniamo all'annullare ogni modifica effettuata. Allego piccolo file
che ne dite di questa proposta:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Application.Undo End SubAllegati:
You must be logged in to view attached files.Bravo Frank ci stiamo avvicinando alla mia idea 🙂
Non è ancora quello che pensavo ma la strada è corretta 👍
edit:
si potrebbe creare una variabile Public as integer che si aggiorna contando ogni variazione sui fogli del file e prima del Before_Close, con un For Next o un Do Loop ripetere l'istruzione Application.Undo
tante volte quanto il valore del contatore, togliendola ovviamente dal Before_Save.
Provo più tardi... ora devo uscire.
e così,
ti piace di più???
Benvenuto nell' UCAS 😀
Approvo il fatto di guardare agli eventi Workbook_BeforeClose e Workbook_BeforeSave.
Lascia stare Undo 😉 Guarda gli argomenti di quei due eventi.
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim Risposta As VbMsgBoxResult Risposta = MsgBox("Il file sara salvato senza le modifiche apportate", vbYesNo + vbQuestion, "Chiudi File?") If Risposta = vbYes Then With Application ActiveWorkbook.Close savechanges:=False End With Else Cancel = True End If End SubQual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Salve a tutti e ben ritrovati
Rientro solo adesso e mi sono letto tutto quanto.
Non credo che la soluzione di @albatros54 sia pertinente. @vecchio frac ha detto che l'utente "sprovveduto o tonto" ha salvato. Con la soluzione proposta non si salvano le variazioni.
Dopo pranzo (la moglie sbraita...) andrò a ripassarmi gli argomenti di Workbook_BeforeClose e Workbook_BeforeSave.
Ciao,
Mario
Salve a tutti e ben ritrovati
Ciao Supermario! Comunque albatros c'è andato un pochetto più vicino 🙂
Non voglio dire niente di più... sarebbe come darvi in pasto la mia soluzione più semplice (beninteso, non è l'unica e non è la migliore, infatti ne ho un'altra pronta).
Non far sbraitare la moglie, altrimenti rischi di saltare il pranzo 😉
lo scopo è avere il modo di bloccare le modifiche indesiderate dopo che l'utente le ha fatte
non ha scritto
@vecchio frac ha detto che l'utente "sprovveduto o tonto" ha salvato.

</
/>Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Su su non pignoleggiate 😀
In effetti desidero impedire che l'utente salvi 😉 ops... ho detto troppo
Option Explicit Public SalvaOK As Boolean Sub Salva() SalvaOK = False End SubScusate se mi intrometto
ma io così non salvo nulla
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Cancel = Not SalvaOK End SubScusate se mi intrometto
Che bello, un partecipante diverso dai soliti
La sub Salva: la crei ma non la richiami da nessuna parte? E comunque, non ne hai bisogno
La strada è giusta, ma manca un pizzico ancora 🙂
Un saluto a tutti.
E se "l'utente malvagio (u-fetente) o quello stupido (u-tonto)" non 'vuole' attivare le macro (già la Microsoft è sulla strada buona con gli ultimi aggiornamenti
) ?Ciao rollis13,
se l'utente non attiva le macro allora non ha certamente bisogno del magnifico prodotto che gli hai confezionato in risposta a una sua specifica esigenza
Lo scenario è questo: un cliente ti commissiona un progettino piccolo e tu produci il capolavoro dell'arte, che mischia sapientemente codice e formule. Naturalmente per funzionare ha bisogno dell'attivazione delle macro, lo spieghi all'utente cliente con dovizia di particolari e lui forse capisce forse no ma acconsente, tanto è un documento da fonte sicura eccetera eccetera
anche perchè altrimenti non funzionerebbe e a lui non servirebbe.Comunque era solo un esempio didattico, per giocare un po' insieme 😛 niente di serio anche se ovviamente qualche fondo di interesse ce lo dovrebbe avere.
Su Microsoft e le macro, ho sentito anche io la notizia ma non credo affatto che lo scripting VBA verrà mai eliminato davvero. Piuttosto sarei orientato a studiare meglio il linguaggio Go, l'obiettivo è più sui documenti condivisi che sulle soluzioni desktop.
Possiamo sfruttare sull'evento "Workbook_BeforeSave" l'username dell'applicazione per salvare il file.
Nel momento che voglio salvare il file, senza salvare le modifiche che ho fatto-volontariamento o involontareamente- controllo l'username dell'applicazione, con queste poche righe di codice.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If Application.UserName <> "Albatros" Then Cancel = True End If End SubQual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Possiamo sfruttare sull'evento "Workbook_BeforeSave" l'username dell'applicazione per salvare il file.
Bene. Questo primo passo è corretto anche se io non implementerei alcun controllo sul nome dell'utente che utilizza l'applicazione.
Se il progettista ha bisogno di modificare il file e poi salvarlo, deve disabilitare questo evento, e sa come fare.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Cancel = True End SubUnito a questo però io suggerisco anche di impostare l'evento di chiusura, come secondo e ultimo passo della procedura, per impedire del tutto a Excel il salvataggio.
Private Sub Workbook_BeforeClose(Cancel As Boolean) Saved = True End SubAdesso sono sicuro che viene impedito il salvataggio anche se l'utente lo chiede, e che il file è considerato già salvato (e non viene risalvato).
In unione a questo meccanismo ce n'è un altro, più carino e sofisticato, che prevede la rimozione completa del pulsante di salvataggio, intervenendo direttamente sulla ribbon in fase di avvio di Excel 🙂
Se il progettista ha bisogno di modificare il file e poi salvarlo, deve disabilitare questo evento, e sa come fare.
Intendi dare nella finestra immediata il comando
Application.EnableEvents = False
Intendi dare nella finestra immediata il comando
Oh sì, certo. Qualunque modo va bene.
Potresti anche essere più definitivo modificando il nome dell'evento:
Private Sub xWorkbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)Io di solito faccio così (in questo modo non perdo il contenuto del codice e mi assicuro che non venga eseguito).
Comunque per non annoiarvi più chiudo questa discussione e metto Risolto, sperando che vi siate divertiti con me.
Ah, allego un file per i più curiosi o per chi ha tempo... dentro ci sono un paio di righe di spiegazione sul medesimo file 😀
Allegati:
You must be logged in to view attached files. -
AutoreArticoli
