› Sviluppare funzionalita su Microsoft Office con VBA › Macro per impedire modifiche a celle già valorizzate
-
AutoreArticoli
-
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 SubPrivate 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 IfEnd 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
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?
Hai ragione, grazie mille: ti allego il file esempio
Paolo
Allegati:
You must be logged in to view attached files.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
Avevo intuit il tuo guggerimento, ma non sapevo da dove partire!
Ora funziona perfettamente, grazie mille!!!
Problema risolto, gentilissimo
Paolo
Bene! ma rimango comunque perplesso sulla scelta di non lasciare all'utente la possibilità di correggere (modificare o cancellare) quanto inserito 🙂
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.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.
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
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
Scusami Ho preferito “lockedCells” al tuo “xlUnlockedCells”
provo subito la tua ultima modifica e, umilmente, ti ringrazio
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:(
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
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.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
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).
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
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 anticipoAllegati:
You must be logged in to view attached files.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.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
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.
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.
-
AutoreArticoli