Trovare un dato (vettore) in una tabella, con restituzione di un dato correlato. La ricerca di dati è uno degli "sport" preferiti dagli Excelnauti. La varietà delle necessità delle ricerche è tale, che è impensabile esemplificarli tutti. Stasera una richiesta mi fornisce lo spunto per esaminare un metodo di ricerca che può essere semplice da capire e al tempo stesso adattabile, con poche modifiche, in modo che i concetti usati siano sfruttabili da chiunque. Se vogliamo, l'esempio che faremo, richiama a grandi linee il comportamento delle funzioni CERCA.VERT e CERCA.ORIZ unite insieme: ognuna di queste funzioni, ricerca un dato (vettore) in un elenco di dati su più colonne o righe, restituendo il valore che si troverà sulla stessa riga, o colonna, del vettore trovato, ma in una colonna o riga scelta in precedenza. L'esempio:
La procedura è semplice: selezioniamo sul foglio1 la cella con il valore da cercare, attiviamo la macro che avremo associato ad un pulsante, indichiamo con una variabile il valore della cella da cercare (X), iniziamo un ciclo di ricerca di X nella zona Foglio2 , Range B1:Z100, trovato il valore, selezioniamo la cella, ci spostiamo a inizio riga, selezioniamo quindi la cella stessa riga ma della colonna A, e restituiamo il valore della cella ora attiva, con una MessageBox. Ovviamente potremmo restituire detto valore in qualunque cella lo volessimo, con un semplice: Range("tuacella").Value = ActiveCell.Value Questa la procedura:
E' evidente che potrete avere in "restituzione" qualunque valore di qualsiasi colonna. Uno dei problemi delle ricerche è che spesso non sappiamo dove si troverà il valore che cerchiamo, e risulta problematico quindi fornire richieste di dati correlati, visto che Excel lo può fare solo se gli si danno delle coordinate precise. Impossibile quindi impostare a priori istruzioni che dicano "restituisci il valore che si trova due colonne a destra o 3 colonne a sinistra", visto che non sapremo quale sarà la colonna in cui esisterà il valore cercato. L'istruzione Cells(ActiveCell.Row, 1).Select invece ci permette di determinare con esattezza di quale colonna, stessa riga, vorremo il valore restituito, modificando il numero presente nell'istruzione; se avessimo voluto in valore che si trovava nella colonna C avremmo dovuto scrivere: Cells(ActiveCell.Row, 3).Select Se il valore cercato (X) non è presente nella zona ricerca (Range("B1:Z100")), la routine non porterà risultato e quindi nessun messaggio. Se invece saranno presenti più valori X, verrà riportato il valore associato alla prima riga dove sarà presente il primo valore X, poi il successivo, fino all'ultimo dove il ciclo però si fermerà, e solo l'ultimo sarà visualizzato, o memorizzato nel caso si usi una cella per la destinazione del valore correlato, a meno che non si usi un'istruzione che a partire dalla cella di destinazione prevista, non cerchi una cella in una riga libera; in questo caso saranno registrati tanti valori X correlati quanti saranno i valori X trovati.
Buon lavoro. |