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")
in questo caso arrCheck va dichiarato Variant (vedi il codice) e LBound è 1 non 0.
Cosa che ho fatto anche per diffRow.
[CelleProtetteEsterne].Rows(cellCheck.Row - diffRow(1)).Select '... seleziona la riga del range esterno da svuotare
Selection.ClearContents '... ed elimina il contenuto
...
Ora che riguardo il codice, una prima micro-ottimizzazione potrebbe essere fatta sulle righe in rosso. Non ha senso selezionare per cancellare. Potrei usare la proprietà ClearContents direttamente.
Esattamente, già rettificato.
Non è entra in nessun ciclo quando inserisco una nuova colonna, ma le migliaia di righe nuove verranno confrontante tutte nell'intersect e non posso impedirlo.
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.
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.
Questo il codice:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim strMsg As String, arrCheck, strTitle As String, diffRow, cellCheck As Range 'Dichiaro le variabili
Application.EnableEvents = False 'Disabilita gli eventi
'Controlla se la modifica interessa una cella del range più ampio
If Not Intersect(Target, [CelleProtetteEsterne]) Is Nothing Then
Set Target = Intersect(Target, [CelleProtetteEsterne])
'Inizializzazione delle variabili
strMsg = "La cella selezionata non prevede l'inserimento dati!" & Chr(10) & "Modificare il "
strTitle = "Attenzione"
arrCheck = Array("REGIME FISCALE", "TIPO INVIO")
' assegna i delta
diffRow = Array([CelleProtetteInterne].Rows(1).Row - 1, [CelleProtetteEsterne].Rows(1).Row - 1, [ControlloRF].Rows(1).Row - 1)
For Each cellCheck In Target
If Cells(cellCheck.Row, [ControlloRF].Column).Value = [BloccoRF] Then 'Se il "REGIME FISCALE" non consente modifiche ...
If Not cellCheck.Value = "" Then '... e viene immesso un qualsiasi valore
cellCheck.ClearContents '... elimina quanto inserito
Cells(cellCheck.Row, [ControlloRF].Column).Select '... sposta la selezione su "REGIME FISCALE"
MsgBox strMsg & arrCheck(1), vbExclamation, strTitle '... e avverte l'utente
End If
ElseIf Not Intersect(Target, [CelleProtetteInterne]) Is Nothing Then 'Altrimenti controlla il range interno
If Cells(cellCheck.Row, [ControlloTI].Column).Value = [BloccoTI].Value Then 'Se il "TIPO INVIO" non consente modifiche ...
If Not cellCheck.Value = "" Then '... e viene immesso un qualsiasi valore
cellCheck.ClearContents '... elimina quanto inserito
Cells(cellCheck.Row, [ControlloTI].Column).Select '... sposta la selezione su "TIPO INVIO"
MsgBox strMsg & arrCheck(2), vbExclamation, strTitle '... e avverte l'utente
End If
End If
ElseIf Not Intersect(Target, [ControlloTI]) Is Nothing Then 'Altrimenti controlla se la cella selezionata è "TIPO INVIO" ...
If cellCheck.Value = [BloccoTI].Value Then '... se viene inserito il valore bloccante
[CelleProtetteInterne].Rows(cellCheck.Row - diffRow(1)).ClearContents ' elimina il contenuto
Cells(cellCheck.Row, [ControlloTI].Column).Select '... poi torna sulla cella tipo invio
End If
End If
Next cellCheck
ElseIf Not Intersect(Target, [ControlloRF]) Is Nothing Then 'Controlla se la cella selezionata è "REGIME FISCALE"
For Each cellCheck In Target
If cellCheck.Value = [BloccoRF].Value Then '... se viene inserito il valore bloccante
[CelleProtetteEsterne].Rows(cellCheck.Row - diffRow(2)).ClearContents 'elimina il contenuto
Cells(cellCheck.Row, [ControlloRF].Column).Select '... poi torna sulla cella tipo invio
End If
Next cellCheck
ElseIf Not Intersect(Target, [ControlloID]) Is Nothing Then '... Altrimenti
For Each cellCheck In Target
If [ControlloRF].Rows(cellCheck.Row - diffRow(3)).Value = [BloccoRF].Value Then '... se viene inserito il valore bloccante
[CelleProtetteEsterne].Rows(cellCheck.Row - diffRow(3)).ClearContents ' elimina il contenuto
Cells(cellCheck.Row, [ControlloRF].Column).Select '... poi torna sulla cella tipo invio
End If
Next cellCheck
End If
Application.EnableEvents = True 'Riattiva gli eventi
End Sub
Ciao.