Ho aggiunto qualche cosina:
- fondamentale, la disabilitazione degli eventi, visto che nel codice si sposta il controllo su altre celle, richiami di nuovo l'evento che stai gestendo, causando inefficienze;
Avevo notato questa cosa, ma non sapevo come impedirla, mi stava facendo impazzire che ogni volta che spostavo ricominciava il ciclo come se fosse in un loop.
- nel caso di selezione multipla, che avevi correttamente intercettato, ridimensiona il Target per permettere al codice gli ulteriori controlli;
Questo da una parte è un problema, perché non so cosa voglia fare l'utente con selezione multipla, magari vuole cambiare il colore di una colonna e non posso impedirlo solo perché nel mezzo c'è una riga "bloccata". Infatti con il tuo suggerimento questa eventualità viene impedita.
- mantenendo la tua idea di spostare il controllo attivo su una cella esterna ai perimetri individuati, ora lo sposta sul regime fiscale se non passa il primo controllo, altrimenti sul tipo di invio se è il secondo controllo a non verificarsi;
In effetti è più intuitivo in questo modo, almeno l'utente capisce meglio il perché del blocco e volendo è già posizionato per eliminarlo.
If Not Intersect(Target, [CelleProtetteEsterne]) Is Nothing Then
Ottimo, non sapevo che i "nomi" si potessero richiamare così facilmente. Molto meno incasinato di quello che avevo fatto io.
VBA non lo usavo da più di 15 anni ma in generale non è che abbia mai programmato più di tanto.
L'unico problema che resta è quello del punto 2. Devo per forza di cose lasciare selezionare più celle (anche se questo poi consentirebbe l'inserimento dati).
Non ci sarebbe un modo per stabilire una "convalida dati" via VBA?
Del tipo: voglio scrivere un valore in una cella dell'intervallo bloccabile, verifico che quella cella che sta cambiando effettivamente sia bloccata dal parametro e dunque impedisco (o cancello) l'inserimento del nuovo valore (lanciando sempre l'avvertimento).
In questo modo, anche in caso di selezione multipla, se il controllo avviene su ogni cella il cui valore sia stato modificato, le celle "bloccate" reagirebbero azzerando la cella, mentre le altre no.