Visto l'ottimo confronto, facciamo un po' di didattica
strCheck(0) = "REGIME FISCALE"
strCheck(1) = "TIPO INVIO"
Si può evitare caricando l'intero array:
arrCheck = Array("REGIME FISCALE", "TIPO INVIO")
Si, effettivamente si può inizializzare tutto in riga, è sempre un refuso del fatto che inizialmente non avevo un array. Ma questo non credo comporti vantaggi prestazionali.
in questo caso arrCheck va dichiarato Variant (vedi il codice) e LBound è 1 non 0.
Cosa che ho fatto anche per diffRow.
Questa cosa non l'ho capita invece, perchè variant anzichè il tipo specifico che allocherebbe meno spazio in memoria?
Verranno confrontate, ma sempre una sola volta, quello che succede in realtà è che il Target che riceve, nel caso di righe o colonne intere, sarà esplorato dal ciclo For Next:
For Each cellCheck In Target
ma anche questo può essere impedito se dopo il controllo dell'intersezione iniziale riassegni il Target:
Set Target = Intersect(Target, [CelleProtetteEsterne])
circoscrivendolo alle sole celle di interesse.
Effettivamente questa è una grande soluzione, restringo il ciclo for alle sole celle di mio interesse.
L'unica cosa che non posso evitare sarà sempre il controllo iniziale, ma forse già così si dimezzano i tempi (verifico subito)
Per quanto detto, io eviterei il riposizionamento, es:
Cells(cellCheck.Row, [ControlloRF].Column).Select '... sposta la selezione su "REGIME FISCALE"
in caso di Target multiplo lo faresti ogni volta, cosciente di questa cosa valuta tu. Puoi mettere ad esempio un controllo sul Count e farlo solo per il primo o l'ultimo.
Qui bisogna vedere quale delle due istruzioni è più veloce, un riposizionamento continuo o una verifica sul count continuo per poi riposizionare solo l'ultima volta. Magari si trova una soluzione più efficiente.
EDIT:
Perfetto!
Il restringimento del range ha velocizzato il codice, rendendo il tutto istantaneo. Ho creato una seconda variabile minTarget as Range di appoggio per non variare il Target passato nell'evento
Inoltre ho applicato qualche altro piccolo cambiamento logico che avrebbe potuto dare problemi. Ovvero, non aveva senso innestare i controlli sulle colonne ID e REGIME FISCALE come ELSE di quello principale, questo perchè in caso di inserimento nuova riga, in realtà l'evento toccherebbe tutte le colonne simultaneamente ed io devo verificare cosa comporta per ogni colonna.
Quindi ho separato le ultime due istruzioni di controllo in verifiche a se stanti.