› Excel e gli applicativi Microsoft Office › VBA: ricerca valore
-
AutoreArticoli
-
Buonasera a tutti,
Questo codice cerca, in base al testo inserito nella InputBox, nella colonna 2 il nome corrispondete. Se lo trova, aggiunge "OK" nella riga corrispondente della colonna 3
Come faccio a fare in modo che la ricerca vada a buon fine anche se digito solo una parte del nome?
ES: il nome completo indicato in colonna 2, riga 3 è: Sig. Mario Rossi. Vorrei fare in modo che mi trovi questa cella anche se digito Rossi (o Mario Rossi)
Sub cerca() Dim x As String Dim i As Integer Dim k As Boolean k = False x = InputBox("INSERISCI IL NOME CHE VUOI CERCARE") For i = 1 To 600 If Cells(i, 2) = x Then Cells(i, 3) = "OK" k = True End If Next If k = False Then MsgBox ("NOME NON TROVATO") End If End SubCiao
puoi mettere sia davanti che dietro un asterisco!
Mi spiego. Dalla InputBox ti viene fuori, per esempio, "ros" che è assunto dalla variabile x;
scrivi x= "*" & x & "*"
In questo modo ti troverà qualsiasi stringa contenga "ros" e cioè Mario Rossi ovvero Rossi Mario ovvero Rossi Italo ovvero Carlo Rossetti.
Come vedi non credo sia quello che vuoi. Devi anche tener presente, e gestire, un eventuale click su OK della InputBox SENZA che sia stato inserito alcunchè. La variabile in uscita non è vuota. bensì "**"
Ciao,
Mario
Grazie della risposta
Modificando il codice aggiungendo i 2 asterischi, il cerca adesso mi da sempre come messaggio "NOME NON TROVATO" (sia digitando una parte del nome sia digitando il nome per intero
If Cells(i, 2) = "*" & x & "*" Then Cells(i, 3) = "OK"Cosa sto sbagliando?
Grazie della pazienza
Mi rispondo da solo: dovevo mettere LIKE
If Cells(i, 2) Like "*" & x & "*" Then Cells(i, 3) = "OK"Ultima cosa: perchè non mi consideri le maiuscole e le minuscole nella ricerca come devo fare?
Grazie
Ecco, stavo per farlo notare io.
Attenzione nell'usare il confronto secco con l'uguale, che bisogna stare attenti a maiuscole e minuscole.
O riduci tutto in minuscolo (o maiuscolo), così il confronto è pari o usi StrComp con l'opzione vbTextCompare.
Mi pare che Like sia case sensitive quindi fa differenza tra lettere maiuscole e minuscole.
Devi anche tener presente, e gestire, un eventuale click su OK della InputBox SENZA che sia stato inserito alcunchè. La variabile in uscita non è vuota. bensì "**"
Un'ultima domanda: come faccio a gestire la variabile d'uscita "**"?
Perchè il click su OK senza che venga inserito nessun dato dà il risultato che su ogni riga viene aggiunto OK
Ragioniamo un po':
- a quale variabile è associato il risultato dell'inputbox?
- proviamo tutti i casi: che valore assume questa variabile se inserisci un valore qualsiasi? e se inserisci uno spazio vuoto? se fai Ok senza inserire niente? se premi Annulla? (per verificare tutto questo metti un msgbox dopo l'inputbox che ti mostri il valore della variabile associata all'inputbox)
- finalmente puoi rispondere: come fai a gestire il caso che la variabile di uscita non contenga un valore valido?
Mi hai fatto riflettere che, se metto una lettera a caso, il codice con il LIKE
If Cells(i, 2) Like "*" & x & "*" ThenCells(i, 3) = "OK"va a mettere OK a tuttte le celle che contengono quella lettera. Quindi non va bene
Tornerò al mio codice originario
If Cells(i, 2) = x ThenCells(i, 3) = "OK"spiegando all'utente che deve mettere nell'input box il contenuto esatto della cella che deve ricercare
L'unica cosa che mi rimane da gestire è il fatto che l'utente prema invio senza mettere nessun input
angra wrote:L'unica cosa che mi rimane da gestire è il fatto che l'utente prema invio senza mettere nessun input
In x hai il valore di ritorno dell'inputbox.
Quando premi Invio senza inserire niente che valore ha la variabile x?
Fai la prova piazzando un msgbox "-->" & x & "<--" dopo l'inputbox e vedi cosa succede.
Esattamente!! cosa ne concludi? che valore ha "x" ? (le due frecce contrapposte servivano a dimostrarti che... non c'è niente in mezzo).
Quindi: che istruzione devi inserire per gestire una variabile vuota?
<em class="bbp-the-quote-cite">vecchio frac wrote:</em>Esattamente!! cosa ne concludi? che valore ha "x" ? (le due frecce contrapposte servivano a dimostrarti che... non c'è niente in mezzo).
Nellla mia limitatissima conoscenza del VBA, inserirei questa funzione
If x = isNull ThenMsgBox ("NOME NON TROVATO")Ci sei quasi, nel senso che è giusto che devi testare se la variabile x equivale a qualcosa... ma non utilizzi il "qualcosa" corretto 🙂 e forse ti ho messo fuori strada io (parlando di variabile "vuota")
Nel senso che devi verificare non se la variabile sia null (che ha un significato preciso: cioè non contiene alcun valore, e per di più solo i Variant possono essere null) ma che sia una stringa vuota, cioè un tipo di dati stringa senza alcun valore.
If x = "" Then MsgBox "Nome non trovato"A questo ti aggiungo per completezza che IsNull è una funzione con parametro quindi il test andrebbe eventualmente fatto così:
If IsNull(x) Then ...e inoltre che quando confronti valori di stringa vuoti è meglio sincerarsi che la variabile da confrontare sia davvero vuota e che non contenga eventuali spazi; la forma definitiva e corretta del tuo test è quindi questa:
If Trim(x) = "" Then MsgBox "Nome non trovato"Spero di non averti incasinato ulteriormente le cose 🙂
Ho aggiunto
If x = "" Then MsgBox "Nome non trovato"al mio codice, ma una volta premuto invio senza inseire niente, il meassage box viene ripetuto per 600 volteInoltre nelle righe vuote (cioè in cui nella colonna 2 non è scritto alcun dato), viene aggiunto OK nel corrispondente campo della colonna 3
Questo il mio codice:
Sub cerca() Dim x As String Dim i As Integer Dim k As Boolean k = False x = InputBox("INSERISCI IL NOME CHE VUOI CERCARE") For i = 1 To 600 If x = "" Then MsgBox "Nome non trovato" If UCase(Cells(i, 2)) = UCase(x) Then Cells(i, 3) = "OK" Cells.Find(What:=inpt, After:=ActiveCell, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Activate k = True End If Next If k = False Then MsgBox ("NOME NON TROVATO") End If End Subil controllo deve essere fatto prima del ciclo for
Sub cerca() Dim x As String Dim i As Integer Dim k As Boolean k = False x = InputBox("INSERISCI IL NOME CHE VUOI CERCARE") If x = "" Then MsgBox "Nome non inserito": Exit Sub For i = 1 To 600 If UCase(Cells(i, 2)) = UCase(x) Then Cells(i, 3) = "OK" Cells.Find(What:=inpt, After:=ActiveCell, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Activate k = True End If Next If k = False Then MsgBox ("NOME NON TROVATO") End If End Sub<em class="bbp-the-quote-cite">patel wrote:</em>il controllo deve essere fatto prima del ciclo for
Perfetto. Grazie ad entrambi per il supporto
patel wrote:il controllo deve essere fatto prima del ciclo for
Se ci pensi, è abbastanza logico che sia così.
Devo inserire un valore, se è corretto posso andare avanti, altrimenti mi fermo e segnalo l'errore, prima di iniziare il lavoro lungo che si basa su quel valore.
-
AutoreArticoli

