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.
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:
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:
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:
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ì:
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:
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:
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:
Come si nota nella routine sopra, al variare degli intervalli, variano le istruzioni.
Buon lavoro. prelevato sul sito www.ennius.altervista.org |