Metodo Intersect.  (intersezione) Aggiornato il 21/05/06 -  pagina vista: volte

Questo metodo restituisce un "oggetto" Range che rappresenta l'intersezione rettangolare di due o più Range e serve a determinare se due aree di un foglio di lavoro hanno delle celle in comune, cioè si sovrappongono, o meglio, si intersecano.

Ma nell'uso pratico, lo usiamo per identificare una o più celle, sulle quali intervenire per istruire condizioni particolari, come per esempio, per istruire "formattazioni condizionali" e/o comunque "personalizzate", oppure per escludere delle aree dall'esecuzione di istruzioni che interessano tutto un foglio.

Come lo usiamo? valutiamo se una cella o un intervallo di celle appartengono o meno ad un determinato Intervallo, (in combinazione con Is Nothing). e impostiamo istruzioni condizionali (If...Then..End If) per l'esecuzione di istruzioni.

Giusto per capire, prendiamo due aree: A1:C4 (gialla) e B3:E6 (verdine):  le celle rosse B3:C4 rappresentano l'area (Range) di intersezione.

  A B C D E F
1            
2            
3            
4            
5            
6            

Come "lavora" il metodo Intersect? È necessario specificare almeno due oggetti Range, come argomenti, e la sintassi è la seguente:

Intersect(Arg1, Arg2, ...) dove Arg1, Arg2, ecc. specificano gli intervalli di intersezione e va precisato che per "intervallo" si può intendere anche una sola cella, o anche una stessa cella che ci interesserà monitorare.

Un esempio: vogliamo che ad ogni cambiamento in una determinata cella, p.es. la A1, si attivi una determinata istruzione. Sceglieremo quindi l'evento Worksheet_Change, che si genera appunto ad ogni cambiamento in una qualsiasi cella del foglio di lavoro, ma come istruire la condizione da verificare? Se usiamo un'istruzione tipo questa:

  • Private Sub Worksheet_Change(ByVal Target As Range)
    If Range("A1").Value <> "" Then
     'ecc.ecc  (se la cella A1 è diversa da vuoto..)

ma non va molto bene perchè è sufficiente che in A1 ci sia un qualsiasi valore, perchè ad ogni cambiamento in altre celle, verrà riscontrata vera la condizione prevista per la A1, e quindi si attiveranno le istruzioni anche se in quei casi non ce ne sarà bisogno. Oppure usare condizioni impostate su corrispondenze a valori numerici, date o testo, perchè si verificherebbe comunque quanto appena detto.

Avremo bisogno di un'istruzione che identifichi in modo preciso la nostra cella, ed agisca SOLO se la modifica interesserà SOLO questa cella, lasciando tranquilla l'esecuzione delle istruzioni se le celle che verranno modificate nei contenuti saranno altre.

Vediamo come, usando Intersect : visto che il metodo Intersect richiede che vengano citati due "Range" di celle, useremo l'argomento Target della funzione Worksheet_Change, come primo argomento di Intersect (con Target si identifica la cella che in quel momento ha subito la modifica, cioè la A1, e con Range("A1") identifichiamo il secondo argomento); appare evidente che i due argomenti si intersecano (infatti sono la stessa cella); a questo punto usando Is Nothing, creiamo una condizione di verifica, che può essere "tradotta" in questo modo:

  • se l'intersezione tra la cella modificata (Target) e la cella A1 non si verifica (Is Nothing), allora si esce dalla routine e anche dalle istruzioni, Altrimenti (Else)....seguiranno le istruzioni di cosa fare

  • Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    If Intersect(Target, Range("A1")) Is Nothing Then
    Exit Sub

    Else  (ecc.ecc)

Ho preparato una piccola applicazione per spiegare meglio il concetto: In A4 usiamo Convalida/Elenco per ottenere un riepilogo di una lista di "gruppi di articoli (Tabella Gruppo)". Vogliamo che, selezionando in A4 un "gruppo di articoli", si carichi una ListBox con i "sottogruppi articoli (Tabella Subgruppo)" relativi al gruppo selezionato. (ovviamente avremo una tabella di "sottogruppi" in cui gli articoli sono riportati insieme al gruppo di appartenenza. Sotto un immagine in cui le tabelle, la ListBox (ActiveX), e Convalida appaiono insieme per meglio capire:

Ricapitoliamo: vogliamo che selezionando un "gruppo" in A4 (e quindi generando l'evento Change sul Foglio di lavoro), si attivino le istruzioni che servono a "caricare" la ListBox con il sottogruppo che appartiene al gruppo selezionato. Queste le istruzioni che si attiveranno solo quando si modifica il valore nella cella A4:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Intersect(Target, Range("A4")) Is Nothing Then
Exit Sub

Else
ListBox1.Clear 
'si pulisce la Listbox1
Dim Cel As Object 
'si dichiara Cel come "Oggetto"
For Each Cel In Range("F5:F16")  
'per ogni cella (Cel) nel range F5:F16
If Cel.Value = [A4].Value Then  
'se il valore di Cel è uguale al valore in A4, allora
ListBox1.AddItem Cel.Offset(0, 1).Value
'si aggiunge alla Listbox il valore della cella, a 'destra di una colonna rispetto alla cella (Cel) in quel momento controllata
End If
Next
'si continua fino alla fine del range F5:F16

End If
End Sub

E' evidente che la Listbox si popolerà solo con un "cambiamento" nella cella A4, a meno che non si preveda, all'apertura della cartella di lavoro, cioè con l'evento Workbook_Open, di inserire solo le istruzioni per popolare la ListBox, modificando l'istruzione che mira alla ListBox1, con anteporre il nome del Foglio sul quale si trova la ListBox stessa,così:

Private Sub Workbook_Open()
Sheets(1).ListBox1.Clear
Dim Cel As Object
For Each Cel In Range("sbgr")
If Cel.Value = [a4].Value Then
Sheets(1).ListBox1.AddItem Cel.Offset(0, 1).Value
End If
Next
End Sub

Ogni cambiamento o modifica di valori in tutte le altre celle diverse da A4, grazie all'uso del metodo Intersect, NON attiveranno le istruzioni.

Un altro esempio che sfrutta il metodo Intersect, e che limita l'esecuzione di un' istruzione solo su una cella/e, o colonna o riga, (cioè ad un'area definita) può essere questo: proteggere un'area da scrittura, in questo caso proteggeremo la colonna C:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Intersect(Target, Columns(3)) Is Nothing Then
ActiveSheet.Unprotect
'sproteggiamo il foglio se la cella selezionata non è nella C
Exit Sub

Else

ActiveSheet.Protect 'e proteggiamo il foglio attivo
End If
End Sub

oppure se vorremo intervenire se la cella Target appartiene a più di un intervallo, in modo da destinare le stesse istruzioni a più aree su un foglio, basterà separare con una virgola ( , ) due o più intervalli assegnati, come in questa istruzione:

  • If Intersect(Target, Range("A6:C10,F1:G10")) Is Nothing Then   'se la cella target non apparterrà al range A6:C10 oppure al range F1:G10....segue cosa fare

mentre diversa sarà la costruzione di istruzioni differenziate su aree diverse del foglio; in una situazione del genere, dovremo sfruttare sempre l'evento Change del Worksheet (abbiamo 1 solo evento Change per ogni foglio), ma dovremo differenziare il controllo per sapere su quale intervallo applicare istruzioni diverse; per fare questo dovremo eliminare l'istruzione Exit Sub che ci farebbe uscire dalla routine se NON ci troviamo nella prima INTERSEZIONE (Intersect Is Nothing) prevista; potremo inserire un rinvio (GoTo) alla seconda istruzione che verificherà se la cella Target sia pertinente al secondo intervallo, usando un rinvio ad un indice riga; esempio:

  • Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     If Intersect(Target, Range("J6:U10")) Is Nothing Then   'primo intervallo su cui verificare se la cella Target rientra, se non rientra, allora
     GoTo 10 'sostituiamo Exit Sub con GoTo 10, e andremo alla riga 10:
     End If
     If ActiveCell <> "" Then
     ActiveCell.Interior.ColorIndex = 3
     Else
     ActiveCell.Cells.Value = "X"
     End If
     10:   'indice riga
     If Intersect(Target, Range("B6:D10")) Is Nothing Then 'ora si verifica se Target è compreso in questo intervallo, se non è compreso usciamo
     Exit Sub   'con exit sub;  altrimenti continuano le istruzioni
     End If
     If ActiveCell <> "" Then
     ActiveCell.Interior.ColorIndex = 2
     Else
     ActiveCell.Cells.Value = "O"
     End If
     End Sub

Come si nota nella routine sopra, al variare degli intervalli, variano le istruzioni.

 

Buon lavoro.

prelevato sul sito www.ennius.altervista.org