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:

  • Usare i riferimenti precisi dell'area : Set zona = ActiveSheet.Range("A1:A500")

  • Usare il riferimento a tutta una colonna: Set zona = ActiveSheet.Range("A:A")

  • Usare il riferimento alla cella iniziale della Colonna (A nell'esempio) e alla cella finale (con End) dell'area :  Set zona = Range(Cells(1, 1), Cells.End(xlDown))

  • Usare il riferimento a tutta l'area che contiene dati sfruttando la proprietà UsedRange del foglio di lavoro : Set zona = ActiveSheet.UsedRange

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:

  • ricercare una data

  • ricercare un valore numerico

  • ricercare del testo

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")
If dimmi = "" Then Exit Sub
'per uscire se non si scrive niente nella inputbox
If IsNumeric(rng.Value) And Left(rng.Text, 2) = Val(dimmi) Then

 

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:

Sub popop() 'nome macro

'dichiarazione della variabile "rng" di tipo Range
Dim rng As Range

'assegnazione alla variabile "dimmi" del valore reperito con la inputbox

dimmi = InputBox("Scrivi l'iniziale da cercare")
If dimmi = "" Then Exit Sub  
'per uscire se non si scrive niente nella inputbox

'per ogni rng (Range o cella) nella zona del foglio di lavoro che contiene dati
For Each rng In ActiveSheet.UsedRange

'se il valore della cella (rng) NON è un numero e la prima lettera è uguale a "dimmi"
If IsNumeric(rng.Value) = False And Left(rng.Text, 1) = dimmi Then

'si da il messaggio del rif. alla cella e del nome ivi contenuto
MsgBox "La cella che cerchi è " & rng.Address & " col valore: " & rng.Value

End If

'si continua il ciclo fino alla fine dell' UsedRange
Next rng
End Sub

e questa con la selezione della cella ad ogni chiave trovata:

Sub popup()
Dim rng As Range
dimmi = InputBox("Scrivi l'iniziale da cercare")
If dimmi = "" Then Exit Sub
For Each rng In ActiveSheet.UsedRange
If IsNumeric(rng.Value) = False And Left(rng.Text, 1) = dimmi Then
rng.Select 
 'questa seleziona la cella e la evidenzia
MsgBox "La cella che cerchi è " & rng.Address & " col valore: " & rng.Value
End If
Next rng
End Sub

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")

Sub pipup()
Dim rng As Range
dimmi = InputBox("Scrivi l'iniziale da cercare")
If dimmi = "" Then Exit Sub
For Each rng In ActiveSheet.UsedRange
If IsNumeric(rng.Value) = False And Left(rng.Text, 1) = dimmi Then
rng.Select 
 'questa seleziona la cella e la evidenzia

Dim irisp As Integer 'Imposto la msgbox e relativa domanda con SI/NO
irisp = MsgBox("Cella " & rng.Address & " a nome " & rng.Value & " Vuoi fermarti ?", vbYesNo)
' irisp è tutta una riga
If irisp = vbYes Then
'se rispondo Si allora

Exit For  'esco dal ciclo e quindi dalla routine
End If
End If
Next rng


End Sub

 

Buon lavoro.


prelevato sul sito http://ennius.interfree.it