Sviluppare funzionalita su Microsoft Office con VBA Workbook in sola lettura

Login Registrati
Stai vedendo 25 articoli - dal 1 a 25 (di 25 totali)
  • Autore
    Articoli
  • #34958 Score: 0 | Risposta

    vecchio frac
    Senior Moderator
      272 pts

      Visto il silenzio, rompiamo il ghiaccio 🙂

      Come annullereste le modifiche fatte da un utente a un foglio di lavoro Excel ? 🙂

      #34959 Score: 0 | Risposta

      Marius44
      Moderatore
        58 pts

        Ciao @vecchio frac

        in maniera "brutale" chiudendo il file senza salvarlo!!!!!!  

        Ciao,

        Mario

        #34961 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          272 pts

          Ma nonostante le istruzioni chiare, l'utente malvagio (u-fetente) o quello stupido (u-tonto), salvano   

          Che si fa?

          #34964 Score: 0 | Risposta

          patel
          Moderatore
            51 pts

            Vale anche per chi ha il 2010 ?

            #34966 Score: 0 | Risposta

            vecchio frac
            Senior Moderator
              272 pts

              patel ha scritto:

              Vale anche per chi ha il 2010 ?

              Certo, nessun Excel verrà maltrattato o discriminato in alcuna sessione 🙂

              #34968 Score: 0 | Risposta

              tanimon
              Partecipante
                16 pts

                ciao a tutti   

                vecchio frac ha scritto:

                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

                 

                #34971 Score: 0 | Risposta

                vecchio frac
                Senior Moderator
                  272 pts

                  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 😉

                  #34972 Score: 0 | Risposta

                  tanimon
                  Partecipante
                    16 pts

                    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 Sub
                    
                    Allegati:
                    You must be logged in to view attached files.
                    #34974 Score: 0 | Risposta

                    vecchio frac
                    Senior Moderator
                      272 pts

                      Bravo Frank ci stiamo avvicinando alla mia idea 🙂

                      Non è ancora quello che pensavo ma la strada è corretta 👍

                      #34975 Score: 0 | Risposta

                      tanimon
                      Partecipante
                        16 pts

                        tanimon ha scritto:

                        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ù???

                        #34976 Score: 0 | Risposta

                        vecchio frac
                        Senior Moderator
                          272 pts

                          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.

                          #34978 Score: 0 | Risposta

                          albatros54
                          Moderatore
                            89 pts
                            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 Sub

                             

                            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 )
                            #34979 Score: 0 | Risposta

                            Marius44
                            Moderatore
                              58 pts

                              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

                              #34980 Score: 0 | Risposta

                              vecchio frac
                              Senior Moderator
                                272 pts

                                Marius44 ha scritto:

                                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 😉

                                #34985 Score: 0 | Risposta

                                albatros54
                                Moderatore
                                  89 pts

                                  vecchio frac ha scritto:

                                  lo scopo è avere il modo di bloccare le modifiche indesiderate dopo che l'utente le ha fatte

                                  non ha scritto

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

                                   

                                  #34986 Score: 0 | Risposta

                                  vecchio frac
                                  Senior Moderator
                                    272 pts

                                    Su su non pignoleggiate 😀

                                    In effetti desidero impedire che l'utente salvi 😉 ops... ho detto troppo   

                                    #34998 Score: 0 | Risposta

                                    Oscar
                                    Partecipante
                                      45 pts
                                      Option Explicit
                                      Public SalvaOK As Boolean
                                      Sub Salva()
                                         SalvaOK = False
                                      End Sub

                                      Scusate se mi intrometto  

                                      ma io così non salvo nulla

                                      Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
                                          Cancel = Not SalvaOK
                                      End Sub
                                      #34999 Score: 0 | Risposta

                                      vecchio frac
                                      Senior Moderator
                                        272 pts

                                        Oscar ha scritto:

                                        Scusate 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 🙂

                                         

                                        #35001 Score: 0 | Risposta

                                        rollis13
                                        Partecipante
                                          8 pts

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

                                          #35002 Score: 0 | Risposta

                                          vecchio frac
                                          Senior Moderator
                                            272 pts

                                            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.

                                             

                                            #35003 Score: 0 | Risposta

                                            albatros54
                                            Moderatore
                                              89 pts

                                              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 Sub
                                              

                                               

                                              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 )
                                              #35004 Score: 0 | Risposta

                                              vecchio frac
                                              Senior Moderator
                                                272 pts

                                                albatros54 ha scritto:

                                                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 Sub

                                                Unito 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 Sub

                                                Adesso 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 🙂

                                                #35005 Score: 0 | Risposta

                                                patel
                                                Moderatore
                                                  51 pts

                                                  vecchio frac ha scritto:

                                                  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

                                                  #35007 Score: 0 | Risposta

                                                  vecchio frac
                                                  Senior Moderator
                                                    272 pts

                                                    patel ha scritto:

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

                                                    #35010 Score: 0 | Risposta

                                                    vecchio frac
                                                    Senior Moderator
                                                      272 pts

                                                      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.
                                                    Login Registrati
                                                    Stai vedendo 25 articoli - dal 1 a 25 (di 25 totali)
                                                    Rispondi a: Workbook in sola lettura
                                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                                    Le tue informazioni: