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

Login Registrati
Stai vedendo 17 articoli - dal 1 a 17 (di 17 totali)
  • Autore
    Articoli
  • #13375 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 Risposta

      vecchio frac
      Senior Moderator
      • Sfida #1
        136 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 Risposta

        Paolosanta
        Partecipante

          Hai ragione, grazie mille: ti allego il file esempio 

           

          Paolo

           

           

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

          vecchio frac
          Senior Moderator
          • Sfida #1
            136 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 Risposta

            Paolosanta
            Partecipante

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

              Ora funziona perfettamente, grazie mille!!!

               

              Problema risolto, gentilissimo

               

               

              Paolo

               

               

               

              #13406 Risposta

              vecchio frac
              Senior Moderator
              • Sfida #1
                136 pts

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

                #13926 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 Risposta

                  vecchio frac
                  Senior Moderator
                  • Sfida #1
                    136 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 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 Risposta

                      vecchio frac
                      Senior Moderator
                      • Sfida #1
                        136 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 Risposta

                        Paolosanta
                        Partecipante

                          Scusami Ho preferito “lockedCells” al tuo “xlUnlockedCells”

                           

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

                           

                           

                          #13941 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 Risposta

                            vecchio frac
                            Senior Moderator
                            • Sfida #1
                              136 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 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 Risposta

                                vecchio frac
                                Senior Moderator
                                • Sfida #1
                                  136 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 Risposta

                                  vecchio frac
                                  Senior Moderator
                                  • Sfida #1
                                    136 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 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

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



                                    vecchio frac - 1943 risposte

                                    albatros54
                                    albatros54 - 615 risposte

                                    patel
                                    patel - 463 risposte

                                    Marius44
                                    Marius44 - 394 risposte

                                    Luca73
                                    Luca73 - 358 risposte