Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
Buonasera Vladimiro,
Partendo dal presupposto che non ha tanto senso "rimuovere" e "rimettere" la protezione ad un foglio ad ogni "Change", considererei l'opzioni di creare un pulsante con una macro che ti tolga e rimetta la protezione.
Il problema qui sta nel fatto che l'evento change viene richiamato in modo ricorsivo e quindi "toglie e rimette" la protezione di continuo, inoltre viene chiamato anche inutilmente, perché se la cella non e' B7 non ha senso togliere e rimettere la protezione come hai scritto nel codice, in quanto l'evento change viene chiamato solo da celle che sono cambiabili e quindi non protette, presuppongo che nel tuo foglio sia proprio la cella B7 una di esse.
Inoltre puoi disattivare il refresh dello schermo e i calcoli fino ad operazione completata per velocizzare maggiormente
Questa e' la correzione che puoi apportare:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sPassword As String
Dim i As Integer
'Controlliamo che la cella modificata sia proprio B7 utilizzando un trucco di vba,
'controlliamo che l'intersezione dei range non sia nulla, ovvero, come per gli insiemi
'che il "target" sia compreso nel Range in cui lo cerchiamo
'usando la negazione IF NOT IS NOTHING evitiamo di incorrere in un accesso ad un valore nullo e quindi ad un errore
If Not Intersect(Range("B7"), Target) Is Nothing Then
'Controlliamo che in B7 ci sia effettivamente un valore numerico
If IsNumeric(Range("B7")) And Not IsEmpty(Range("B7")) Then
sPassword = "MiaPassword"
ActiveSheet.Unprotect Password:=sPassword
'Disabilitiamo aggiornamento dello schermo e calcoli per velocizzare la procedura e Disabilitiamo gli eventi per evitare che venga richiamato in modo ricorsivo l'evento change
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'Iteriamo per 9 volte e utilizziamo la variabile di iterazione "i" sia come riferimento
'all'offset della riga in cui scriveremo, sia per aggiungere al valore di B7 proprio i
For i = 1 To 9
'scriviamo in "offset" righe rispetto a b7 il valore che c'e' in B7 + i
Range("B7").Offset(i) = Range("B7") + i
Next i
'Riabilitiamo gli eventi, il refresh dello schermo e i calcoli
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
ActiveSheet.Protect Password:=sPassword
End If
End If
End Sub
Saluti,
Daniele