In genere quando mi consultano per avere una valutazione di un processo e trovo una situazione come questa (l' utente non e' autorizzato a correggere dati introdotti) io commino 5 frustate a chi ha avuto questa bella idea; e mi pagano pure.
Cio' detto (detto invano, immagino):
-ho creat un nuovo file
-ho impostato tutte le celle "non bloccate e non nascoste"
-ho inserito la tua (vedi nota **) Private Sub Worksheet_Change all' interno del Foglio1
-ho protetto Foglio1
Tutte le celle risultano liberamente compilabili
Compilando a caso celle non in C5:C1000 la situazione non cambia
Compilata la cella C6 la Private Sub Worksheet_Change e' intervenuta inserendo la data in V6 e una formula in A6, e bloccando le celle A6, B6, C6, V6; le altre celle di riga sono sempre liberamente compilabili
Compilata la cella C10 il comportamento e' ancora come descritto per C6.
Nota** ho eliminato un End If e il successivo If, poiche' superflui.
C'e' tuttavia un comportamento potenzialmente pericoloso, legato all' eventuale Copia /Incolla di blocchi di piu' celle nell' intervallo C5:C1000: in questo caso il test
IsNumeric(Target.Value) risulta Falso e inibisce l' intervento della Private Sub Worksheet_Change; che pero' interviene se si cancellano "singolarmente" le celle incollate, con blocco delle colonne A, B, C, V (sulla riga cancellata).
Ho pertanto inserito un Foglio2 su cui ho variato il codice della Private Sub Worksheet_Change:
a) per gestire la modifica contemporanea di piu' celle in C5:C1000
b) per evitare che la macro si attivi su celle vuote (anche se dovrebbe essere superfluo dopo la modifica del punto a)
Il codice della Sub Worksheet_Change di Foglio2 e:
- Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range, Cella As Range
'
Set KeyCells = Range("c5:c1000")
'
For Each Cella In Target
If Not Application.Intersect(KeyCells, Cella) Is Nothing _
And Cells(Cella.Row, "V") = "" And IsNumeric(Cella.Value) And Cella.Value <> "" Then
ActiveSheet.Unprotect
With Cells(Cella.Row, "V")
.Value = Int(Now)
.Locked = True
End With
Cells(Cella.Row, "c").Locked = True
Cells(Cella.Row, "b").Locked = True
'End If
'If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing _
And Cells(Target.Row, "a") = "" And IsNumeric(Target.Value) Then
' ActiveSheet.Unprotect
With Cells(Cella.Row, "a")
.FormulaR1C1 = _
"=CONCATENATE(YEAR(RC[21]),""_"",MONTH(RC[21]),""_"",RC[1],""_"",RC[2])"
.Locked = True
End With
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End If
Next Cella
End Sub
Ho eliminato Bloccato e Nascosto, e ho protetto il foglio.
Ho compilato liberamente le celle A2:A4 con valori numerici. Poi ho copiato questo blocco e l' ho incollato in C4:C6; le date sono state inserite in V5:V6, le formule in A5:A6; le celle A5, B5, C5, V5 e A6, B6, C6, V6 sono bloccate e le altre sono liberamente compilabili.
Un file di esempio, allineato a quanto descritto, e' disponibile qui:
https://www.dropbox.com/s/ahddok349d014 ... .xlsm?dl=0Insomma io non vedo quel blocco a caso di cui tu parlavi; anche con la macro originale a venire bloccate erano sempre le celle della riga su cui si variava la cella C.
Se hai sempre un esito diverso allora descrivi i passi che fai per consentirmi di venirti dietro.
Ciao