Ricerca di tre valori (numeri, date o testo).    (30/04/03)

Ancora un esempio scaturito da una richiesta: controllare se esistono tre valori su una stessa riga di una tabella, e se trovati selezionare (restituire) un'altro valore.

La richiesta: "Se io però volessi trovare in una tabella una combinazione di numeri, esempio:12-54-33 in questa sequenza, cioè in maniera tale che il 12 sia nella colonna B, il 54 nella colonna C e il 33 nella colonna D, contemporaneamente (non uno alla volta) in maniera tale da evidenziare poi a parte in quale giorno si è verificata (o non si è verificata.....non necessariamente la combinazione deve essere presente) come posso fare?"

Vorrei provare a ragionare con la testa del pellegrino neofita, che pur trovando sul sito molti esempi di come trovare un dato, si trova a chiedersi: "Ok, come si trova un dato l'ho capito, ma se i dati da trovare sono due, o tre, come faccio?"

Allora vediamo: intanto devo trovare in quale modo poter dire al codice quali sono i numeri che voglio trovare. Poi devo trovare cosa dire al codice perchè mi evidenzi la cella con la data se mi trova i tre numeri.

mi rispondo al primo quesito: posso usare tre celle del foglio di lavoro, dove scrivere i numeri, e poi usare i riferimenti a queste celle da usare come vettori per eseguire la ricerca; oppure, forse è meglio, usare tre InputBox, ognuna delle quali memorizzerà con l'assegnazione ad una variabile (vettore) il valore che immetterò nella InputBox. Mi sembra l'idea giusta.

Ricapitoliamo: come trovare un dato l'ho capito: devo identificare un range di celle nella colonna che uso per la ricerca, applico un ciclo For Each...Next per controllare tutte le celle del range, i tre valori a questo punto me li ritrovo con le InputBox, ma non ho ancora presente come far leggere i valori nelle celle accanto ad ogni cella controllata dal ciclo. Aspetta un pò, da qualche parte ho letto che con Offset posso "mirare" ad altre celle. Ottimo, ora so cosa scrivere per controllare anche le altre celle, ma come le lego insieme le istruzioni? Vediamo un pò: io nel linguaggio parlato dico: vorrei che se il valore nella cella X e il valore nella cella Y e il valore nella cella Z; uso quindi l'operatore "e" per unire insieme le condizioni....vuoi vedere che anche il codice accetta questo sistema? (Solo che il codice ragiona in inglese e il concatenatore "E" si scrive "And"). A questo punto mi rispondo al secondo quesito, usando ancora Offset, per identificare la cella con la data. Mettiamoci al lavoro................

Il pellegrino ennius a questo punto presenta la soluzione. Vediamo una tabella d'esempio:

Nella colonna A le celle con le date, che vorremo evidenziate se la ricerca di tre valori nelle colonne B-C-D saranno uguali ai valori immessi nelle inputbox. Per variare l'esempio, cercheremo due numeri ed un testo, così capiamo come diversificare l'assegnazione del "tipo" di dati assegnato ad ogni variabile.

Sub cerca()

'con CL dimensioniamo una variabile di tipo Object (CL identificherà gli oggetti (celle) 'presenti nel Range assegnato)
Dim CL As Object

'assegnazione alle variabili "uno" "due" e "tre" che diventano vettori dei valori che introdurremo 'nelle rispettive InputBox
uno = InputBox("inserisci il primo numero")
due = InputBox("inserisci il secondo numero")
tre = InputBox("inserisci il terzo numero")
'si inizia il ciclo For Each, che vuol dire: per ogni CL (cella nel Range B1:B100)
For Each CL In Range("B1:B100")

'esegui questo controllo: SE il valore della cella in quel momento identificata dal ciclo è uguale 'al vettore "uno" E la cella immediatamente a destra (Offset(0, 1)) è uguale al vettore "due" E la 'cella, due celle a destra (Offset(0, 2)) è uguale al vettore "tre", Allora (Then)...Da notare che per i vettori "uno e "due", trattandosi di numeri, è necessario dichiarare il tipo di dati usando 'Val, mentre per il terzo vettore che sarà testo, dichiariamo CStr (stringa). La riga sotto è tutta 'una riga, anche se per necessità di spazio la vedete su due righe.
If CL.Value = Val(uno) And CL.Offset(0, 1).Value = Val(due) And CL.Offset(0, 2).Value = CStr(tre) Then

'con l'istruzione sotto, se vengono riscontrati i tre valori uguali ai vettori, si seleziona con Offset 'la cella, stessa riga, immediatamente a sinistra della cella (CL).
CL.Offset(0, -1).Select
End If
Next
End Sub

 

Buon lavoro.



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