Cerca.Vert su qualsiasi cella - Simulazione della funzione, in vba. - pagina vista: volte Una recente domanda è alla base di questo articolo: "disponendo di una tabella database, come poter ottenere i dati correlati ad una determinata chiave di ricerca presente nella tabella, digitando la chiave in una qualsiasi cella di un qualsiasi foglio nella stessa cartella ?". Per meglio capire, posta una tabella come questa sotto:
si vuole che digitando in una qualsiasi cella (ovviamente al di fuori della tabella) di un qualsiasi foglio, una chiave di ricerca, ad esempio "p06", nelle celle a lato compaiano i dati correlati a "p06", quindi Roma, Lazio, Centro, Italia. Ora, al di là delle motivazioni personali del "pellegrino" che ha posto la domanda, è evidente che l'esercizio diventa interessante in rapporto ad altri possibili utilizzi: si pensi ad esempio ad un elenco di articoli di magazzino, elenco che comprenderà un codice articolo (univoco), alla descrizione articolo, all'unità di misura di vendita, all'aliquota iva, al prezzo unitario di vendita, ed altro, e alla necessità di ottenere tutti i dati correlati ad un codice articolo, da digitare in una cella di una griglia di emissione DDT oppure di fatturazione, in modo da ottenere automaticamente tutti i dati che interessano la fatturazione, correlati al codice digitato; ma di esempi ne potremmo riempire una pagina. E comunque il concetto è quello di poter liberamente usare una qualsiasi cella dove digitare una chiave di ricerca, ed ottenere nelle celle a lato, i dati correlati. Si tratta in definitiva di una operazione ottenibile con la classica Funzione CERCA.VERT, solo che perchè la cosa funzioni, è necessario predisporre nelle celle interessate a ricevere i dati correlati ad un determinato dato cercato, appunto, tante funzioni =CERCA.VERT(argomenti), in altrettante celle, per quanti saranno i dati correlati da ottenere. Il che vorrebbe dire, per poter usare una qualsiasi cella dove scrivere la chiave di ricerca, predisporre a caso tante funzioni CERCA.VERT() quante sono le celle di un foglio, e questo per ogni foglio; una cosa impensabile e impossibile da realizzare per una serie di ovvie motivazioni. E' però possibile usando istruzioni vba, ottenere la risposta alla domanda posta, e senza ammattire eccessivamente. Vediamo come procedere:
Fatte queste premesse, diventa facile impostare le istruzioni necessarie, vediamole: intanto sfruttiamo l'evento Workbook_SheetChange, ad inizio routine inseriamo un controllo errori, necessario per evitare di bloccare l'esecuzione del codice nel caso si selezionino più celle contemporaneamente, ad esempio per cancellare il loro contenuto; questo tipo di azione crea un errore sull'istruzione If x = "" Then Exit Sub in quanto x è riferito ad una sola cella (la cella Target). Nell'esempio ho simulato che la tabella dati sia sul Foglio 1, quindi usiamo il riconoscimento dei fogli tramite il loro nome: se saremo sul Foglio1 (lo stesso della tabella) usciremo dalla routine impedendo l'esecuzione delle istruzioni:
Va da se che se in una cella qualsiasi digiteremo un dato non corrispondente ad una chiave di ricerca, attiveremo comunque le istruzioni, ma non otterremo dati correlati. Unica controindicazione: se disporremo di tabelle dati molto estese, poichè ad ogni digitazione in qualsiasi cella di qualsiasi foglio, visto che comunque causiamo un cambiamento (Change), attiviamo comunque le istruzioni, che su elenchi molto lunghi potranno richiedere anche molto tempo di esecuzione ciclo. Possibili soluzioni saranno quelle, ad esempio, di attivare le istruzioni solo se saremo su un determinato foglio, oppure anzichè usare il Workbook_SheetChange potremo usare il WorkSheet_Change del foglio in cui ci interessa siano attive le istruzioni. Altra considerazione è che potremo non solo "prendere" dati correlati specifici usando opportunamente lo Scarto (Offset), ma anche destinare i dati correlati in celle non contigue rispetto alla cella Target, sempre impostando il giusto Scarto (Offset). Se invece di una chiave univoca, avremo più valori uguali nella stessa colonna dove svolgiamo la ricerca, per restare in esempio, due o più "p06", avremo bisogno di decidere se la chiave di ricerca trovata tra le simili, è quella che desideriamo; possiamo inserire l' istruzione di farci porre una domanda di confermare o meno il gruppo trovato, e quindi la modifica sarà:
Buon Lavoro. prelevato sul sito www.ennius.altervista.org |