Sviluppare funzionalita su Microsoft Office con VBA Macro per impedire modifiche a celle già valorizzate

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

    Paolosanta
    Partecipante

      Buongiorno a tutti, sto tentando di usare una macro per impedire la modifica accidentale delle celle "non vuote"

      La prima strada che ho pensato e' di bloccare tutte le celle non appena vengono scritte la prima volta. Questo codice, rattoppato e scopiazzato un pò (sono un principiante e nuovo del forum) funziona ma dà errore se, per qualsiasi motivo, seleziono più di 1 cella

      Private Sub Worksheet_Activate()
      Cells.Select
      Selection.Locked = False
      ActiveSheet.Protect
      Cells.Select
      Selection.Locked = False
      Selection.FormulaHidden = False
      End Sub

      Private Sub Worksheet_SelectionChange(ByVal Target As Range)

      If Not Intersect(Target, Range("A1:T9010")) Is Nothing Then

      ActiveSheet.Unprotect

      If Target.Value <> "" Then
      Selection.Locked = True
      Selection.FormulaHidden = False
      ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
      End If
      End If

      End Sub

      non so dove correggere il bug. 

       

      l'altra strada che avevo pensato era di far comparire un messaggio se un utente prova a scrivere su una cella "non vuota" 

      "Sei sicuro di voler modificare?" sei "Si" lo permette, altrimenti "NO"

       

      Mi sapete aiutare? 

       

      Grazie mille!

       

      Paolo

      #13376 Score: 0 | Risposta

      vecchio frac
      Senior Moderator
        238 pts

        Come prima cosa, nelle routine che modificano la selezione è praticamente obbligatorio disabilitare gli eventi e riattivarli all'uscita, pena potenziali problemi di ricorsione ed esaurimento della memoria:

        Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Application.EnableEvents = False
        .
        .
        .
        Application.EnableEvents = True
        End Sub

        Per evitare l'errore delle celle multiple puoi testare il numero di Target.Count e se è > 1 uscire dalla routine (o ridurla a una cella con .Resize).

        Sulla strada di intercettare la modifica, devi passare dall'evento _Change e testare quivi se il Target è non vuoto. 

        In ogni caso:

        - c'è un pulsantino per formattare bene il codice nei post: {;}

        - potresti allegare un file di esempio su cui fare prove

        - in caso di errore nell'inserimento come fai? non permetti più all'utente di correggere quanto inserito?

        #13377 Score: 0 | Risposta

        Paolosanta
        Partecipante

          Hai ragione, grazie mille: ti allego il file esempio 

           

          Paolo

           

           

          Allegati:
          You must be logged in to view attached files.
          #13381 Score: 0 | Risposta

          vecchio frac
          Senior Moderator
            238 pts

            Perchè non hai implementato il test sul Target.Count?

            Private Sub Worksheet_SelectionChange(ByVal Target As Range)
                Application.EnableEvents = False
               
                If Not Intersect(Target, Range("A1:T9010")) Is Nothing Then
                    If Target.Cells.Count > 1 Then Set Target = Target.Cells(1): Target.Select
                    ActiveSheet.Unprotect
            
                    If Target.Value <> "" Then
                        Selection.Locked = True
                        Selection.FormulaHidden = False
                        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
                    End If
                End If
                Application.EnableEvents = True
            End Sub
            

             

            #13399 Score: 0 | Risposta

            Paolosanta
            Partecipante

              Avevo intuit il tuo guggerimento, ma non sapevo da dove partire!  

              Ora funziona perfettamente, grazie mille!!!

               

              Problema risolto, gentilissimo

               

               

              Paolo

               

               

               

              #13406 Score: 0 | Risposta

              vecchio frac
              Senior Moderator
                238 pts

                Bene! ma rimango comunque perplesso sulla scelta di non lasciare all'utente la possibilità di correggere (modificare o cancellare) quanto inserito 🙂

                #13926 Score: 0 | Risposta

                Paolosanta
                Partecipante

                  Ciao vecchio frac, ancora io, di nuovo qui con dei dubbi. Ti allego un secondo file, su qui ho la stessa necessità: bloccare le celle per impedirne una modifica accidentale. Non capisco perchè la Macro non funzioni anche in questo foglio. In particolare, dopo il primo inserimento in una cella vuota, mi blocca tutto il foglio, celle vuote comprese. Sull'altro file di esempio funzionava correttamente:(

                   

                   

                  Grazie mille

                   

                  Paolo

                   

                  Allegati:
                  You must be logged in to view attached files.
                  #13931 Score: 0 | Risposta

                  vecchio frac
                  Senior Moderator
                    238 pts

                    Alcune celle risultano bloccate, altre sbloccate anche se sono piene e viceversa, quindi secondo me si genera un po' di confusione al codice.

                    Comunque risolvi così il problema che lamenti:

                                ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
                                ActiveSheet.EnableSelection = xlUnlockedCells
                    

                    Devi dire a Excel che dopo la protezione deve comunque abilitare la selezione delle celle sbloccate.

                    #13938 Score: 0 | Risposta

                    Paolosanta
                    Partecipante

                      Grazie mille. Per il mio scopo e altri usi futuri ho preferito

                       

                      ActiveSheet.EnableSelection = xlUnlockedCells

                      sembra funzionare tutto correttamente tranne se si selezionano tutte le celle del foglio (mi dà errore di "overflow") bloccando la routine della macro

                       

                      Paolo

                      #13939 Score: 0 | Risposta

                      vecchio frac
                      Senior Moderator
                        238 pts

                        Paolosanta ha scritto:

                        ho preferito

                        Preferito a cosa? le due istruzioni devono stare insieme 😀

                        Strano che si inchiodi, poichè il controllo sul numero di celle c'è... prova a togliere l'if e a forzare la compressione della selezione a una cella:

                        Private Sub Worksheet_SelectionChange(ByVal Target As Range)
                            Application.EnableEvents = False
                           
                            If Not Intersect(Target, Range("A1:T9010")) Is Nothing Then
                                Set Target = Target.Cells(1)
                                ActiveSheet.Unprotect
                        
                                If Target.Value <> "" Then
                                    Selection.Locked = True
                                    Selection.FormulaHidden = False
                                    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
                                    ActiveSheet.EnableSelection = xlUnlockedCells
                                End If
                            End If
                            Application.EnableEvents = True
                        End Sub
                        #13940 Score: 0 | Risposta

                        Paolosanta
                        Partecipante

                          Scusami Ho preferito “lockedCells” al tuo “xlUnlockedCells”

                           

                          provo subito la tua ultima modifica e, umilmente, ti ringrazio

                           

                           

                          #13941 Score: 0 | Risposta

                          Paolosanta
                          Partecipante

                            Con questa modifica ahimè, se punto una cella vuota e seleziono, trascinando il cursore, altre celle anche piene, mi permette di cancellare tutto il contenuto, anche di quelle protette:(

                            #13942 Score: 0 | Risposta

                            vecchio frac
                            Senior Moderator
                              238 pts

                              Ho commesso un errore per la fretta!!! In effetti nella prima versione era giusto! devi riselezionare la prima cella del target:

                              Set Target = Target.Cells(1): Target.Select
                              #13946 Score: 0 | Risposta

                              Paolosanta
                              Partecipante

                                Funziona, bravissimo.

                                Ti chiedo l'ultma cosa, se riesci altrimenti mi faccio bastare questa soluzione:

                                Ho notato che se ho più fogli, il passaggio da un foglio all'altro mi da errore di runtime.

                                 

                                Ti allego un file di esempio

                                Grazie infinite

                                 

                                Paolo

                                Allegati:
                                You must be logged in to view attached files.
                                #13948 Score: 0 | Risposta

                                vecchio frac
                                Senior Moderator
                                  238 pts

                                  E' scritto un po' male il codice che intercetta l'attivazione del foglio. Io lo scriverei così:

                                  Private Sub Worksheet_Activate()
                                      ActiveSheet.Unprotect
                                      Cells.Locked = False
                                      Cells.FormulaHidden = False
                                      ActiveSheet.Protect
                                  End Sub
                                  #13949 Score: 1 | Risposta

                                  vecchio frac
                                  Senior Moderator
                                    238 pts

                                    Comunque ti raccomando di inserire Option Explicit in testa a tutti i moduli che scrivi (puoi anche dire a Excel di farlo in automatico, Editor >> Strumenti > Opzioni > Dichiarazione di variabili obbligatoria.).

                                    Inoltre nel file postato noto che scrivi le medesime istruzioni per tutti i fogli coinvolti, allora ti chiedo perchè non fai la codifica a livello di ThisWorkbook intercettando opportunamente gli eventi  SheetSelectionChange e SheetActivate. Scriveresti il codice una volta sola, faresti meno errori e soprattutto faresti una sola volta modifiche che interessano più fogli (se aggiungi un foglio attualmente devi replicare il codice esistente).

                                    #13950 Score: 0 | Risposta

                                    Paolosanta
                                    Partecipante

                                      Tutto molto chiaro, probabilmente hai capito quante lacune ho ma grazie alle tue dritte non solo funziona il mio file, ma ora mi sono più chiari determintati passaggi logici!

                                       

                                      GRAZIE, definitivamente RISOLTO

                                       

                                      Paolo

                                      #22841 Score: 0 | Risposta

                                      maxdema
                                      Partecipante

                                        Buongiorno, ho visto il file allegato. Io ho provato ma da comunque la possibilità di eliminare righe e colonne e sovrascrivere ciò che esiste già. Io ho una necessità un po' diversa. Ho creato un file per prenotare delle aule.
                                        Se l'utente prenota un'aula (selezione di celle vuote) non può essere prenotata da un altro utente che entra dopo sul file. Però ci deve essere la possibilità (password?) di modificare o cancellare ciò che è stato prenotato.
                                        Può aiutarmi? grazie in anticipo

                                        Allegati:
                                        You must be logged in to view attached files.
                                        #22843 Score: 0 | Risposta

                                        Ciao, in allegato vedi la macro che impedisce le modifiche di celle già valorizzate (ho messo il codice solo nel foglio "aula magna").

                                         

                                        Può essere una soluzione?

                                         

                                        Paolo

                                        Allegati:
                                        You must be logged in to view attached files.
                                        #43470 Score: 0 | Risposta

                                        AURORA

                                          Buongiorno, sto cercando di scrivere una macro con VBA per il mio file excel...vorrei che tutte le celle vuote, una volta riempite con valori non possano essere modificabili se non con password, come se fossero protette solo se contengono valori...

                                          Spero sia comprensibile, grazie a chiunque cercherà di aiutarmi 

                                          #43472 Score: 0 | Risposta

                                          Aldo Ercolini
                                          Partecipante
                                            15 pts

                                            Aurora perdonami ma non si puo' scrivere una richiesta in una discussione di un'altro utente, oltretutto molto vecchia, anche se coerente con l'oggetto della discussione stessa.

                                            Devi aprire una nuova discussione, a meno che Francesco non possa farlo per te spostando questi post.

                                            #43478 Score: 0 | Risposta

                                            vecchio frac
                                            Senior Moderator
                                              238 pts

                                              Aldo Ercolini ha scritto:

                                              a meno che Francesco non possa farlo per te spostando questi post.

                                              Ho visto che è già stata aperta una nuova discussione. Confermo comunque che non ho strumenti Forum che permettano di spostare i post.

                                            Login Registrati
                                            Stai vedendo 22 articoli - dal 1 a 22 (di 22 totali)
                                            Rispondi a: Macro per impedire modifiche a celle già valorizzate
                                            Gli allegati sono permessi solo ad utenti REGISTRATI
                                            Le tue informazioni: