Ricerca di un dato in un elenco o tabella. (21/05/03) Ricercare dati, valori o altre informazioni all'interno dei fogli di lavoro, sembra sia uno tra gli sport preferiti dagli Excelnauti. Nel paragrafo precedente abbiamo visto delle procedure adatte a questo scopo, ma il buon Excel col suo vba, ha il gran pregio di consentirci di seguire percorsi diversi per raggiungere lo stesso scopo. Questa pagina si occuperà di mostrare alcune di queste altre procedure, esemplificando anche gli obiettivi che intendiamo ottenere come risultato di una ricerca.. Per prima cosa, in una ricerca, bisogna indicare in quale zona o area eseguirla. Vediamo alcuni sistemi di identificazione di un area:
Stabilita l'area, il passo successivo sarà quello di definire cosa vogliamo cercare. In questo caso, esemplificare il "cosa cercare" diventa ardua impresa visto la molteplicità nelle necessità che ogni utente potrà avere. Ci limiteremo ad alcuni esempi che comunque serviranno a capire. Imposteremo tre classiche ricerche:
Precisiamo intanto che le procedure usate, sono tutte impostate in modo che nel caso venga trovata la chiave di ricerca, si venga avvisati con un messaggio riportante i riferimenti alla cella, e la routine proseguirà poi segnalandoci ogni indirizzo di cella che corrisponderà alla chiave cercata. In questo modo, su lunghi elenchi, potremo annotare tutti i riferimenti per poi visualizzarli , oppure aggiungere una semplice istruzione perchè per ogni chiave trovata, venga selezionata la relativa cella. Per ognuna delle ricerche su esposte, puntualiziamo spiegazioni e facciamo qualche esempio, vediamo una prima riga di istruzione: ricerca su date: l'istruzione significa: se il valore cercato (rng.Value) è una data (IsDate) e la prima lettera a sinistra (Left(rng.Text, 1)) del valore trovato è uguale a # (cancelletto), allora... (segue istruzione di cosa fare). Questa istruzione è utile quando si imposta, per necessità visive, una larghezza di colonna inferiore alla lunghezza del dato presente in una cella; in questo caso Excel, avrete notato, non cancella i dati, ma mostra una serie di #, tanti quante sono le lettere che compongono il valore. If IsDate(rng.Value) And Left(rng.Text, 1) = "#" Then ancora su date, ma nel caso in cui si voglio trovare tutte le date di una decade (da 01 a 09 e useremo lo zero come chiave di ricerca) (da 10 a 19 e useremo 1 come chiave di ricerca) (da 20 a 29 e useremo 2 come chiave di ricerca) oppure 3 per i fine mese. If IsDate(rng.Value) And Left(rng.Text, 1) = 1 Then 'opp.= 0, opp. = 2, opp. = 3 (usando numeri come chiave di ricerca, NON vanno messi tra doppi apici) ricerca su numeri: anche in questo caso l'istruzione si basa sulla ricerca di un valore (IsNumeric), numerico in questo caso, e come chiave di ricerca sfrutteremo (Left(rng.Text, 1)) che vuol dire: il primo valore a sinistra del numero, per cui potremo trovare per esempio, tutti i valori che cominciano con 5. Ovviamente la ricerca dipende dal numero che useremo come chiave di ricerca. Se anzichè cercare solo i valori che iniziano per un determinato numero, volessimo cercare tutti i valori che iniziano per una coppia di numeri (per esempio: 25..) dovremmo variare il secondo argomento della funzione Left, sostituendolo con 2 (es: Left(rng.Text, 2)): If IsNumeric(rng.Value) And Left(rng.Text, 1) = 5 Then 'solo il primo a sinistra = 5 If IsNumeric(rng.Value) And Left(rng.Text, 2) = 25 Then 'con i primi due a sinistra = 25 Come vedete queste istruzioni, e le successive, oltre a poterle variare nel modo di stabilire una chiave di ricerca, sono facili da capire. Se poi qualcuno volesse rendere la chiave di ricerca come variabile (negli esempi i valori sono costanti, cioè inseriti nel codice), può usare una cella da destinare all'inserimento della chiave di ricerca, oppure usare una InputBox, e poi usare questi riferimenti nell'uguaglianza (uguale a), esempio: la cella E1 dove scrivere ciò che vorremo cercare, e l'istruzione diventa: If IsNumeric(rng.Value) And Left(rng.Text, 2) = Range("E1").Value Then oppure con una InputBox :
dimmi = InputBox("Scrivi la coppia di numeri")
Ultimo esempio: ricerca su testo: in queste istruzioni, simili alle altre come impostazione, la chiave di ricerca andrà posizionata tra doppi apici, e potremo eseguire ricerche con lettera alfabetica (es: = "a" opp. = "b", opp = "t") oppure per insiemi di lettere (es: = "ca" opp: = "bar", ecc.ecc) ricordandosi di modificare il numero dei caratteri che la funzione Left dovrà estrarre (Left(rng.Text, 1) opp Left(rng.Text, 2) opp Left(rng.Text, 3) ecc..Varieremo anche la prima condizione da verificare, dicendo: se il valore da cercare NON è numerico e.... usando questa istruzione: IsNumeric(rng.Value) = False, in questo modo: If IsNumeric(rng.Value) = False And Left(rng.Text, 1) = "a" Then Sarà possibile anche in questo caso rendere variabile la chiave di ricerca usando una cella oppure una InputBox, in questo caso le modifiche sono uguali a quelle già scritte sopra. Unica precisazione: poichè le ricerche su testo sono "CaseSensitive" (sensibili a maiuscole/minuscole, la "a" è diversa dalla "A") useremo questa semplice istruzione da inserire nella sezione "Generale - Dichiarazioni" del modulo che ospiterà la nostra macro: Option Compare Text Questo ci consentirà di trovare il testo comunque si sia scritta la nostra chiave di ricerca. Ed ora vediamo come comporre le routine: questa sotto ricercherà un dato (scegliamo il metodo UsedRange come identificazione area, e una inputbox per reperire il dato da cercare) e basiamo la ricerca sul testo, prima lettera del valore che sarà nelle celle. Questa routine avviserà in sequenza ogni riferimento ad ogni cella che corrisponderà alla chiave, ma non si fermerà, selezionandola. La successiva routine è simile a questa, ma si fermerà, selezionandola, ad ogni cella trovata:
e questa con la selezione della cella ad ogni chiave trovata:
Se vorremo creare una routine che ci consenta di fermarci ed uscire quando avremo trovato il valore che ci interessa, dovremo inserire un istruzione che ci ponga la domanda se ci vogliamo fermare. Se risponderemo SI usciremo dal ciclo, altrimenti il ciclo continuerà. Questa la routine (simile all'ultima presente nel paragrafo precedente : "Ricerca di un dato")
Buon lavoro.
|