› Excel e gli applicativi Microsoft Office › [VBA] Cerca con più parametri
-
AutoreArticoli
-
Salve a tutti,
Su di un file excel ho una macro collegata ad un button che mi ricerca la pratica su di una colonna (A), può succedere che ci sia un doppione della pratica, e a questo punto mi deve cercare se nella colonna (B) si scritto "no" e restituire solo i dati di quella riga, dove è presente il "no" e non se ci è scritto "si".
Parto da questo script già scritto in precedenza.
Private Sub CommandButton1_Click() Dim ulta As Long Dim area As Range Dim cella As Range With Sheets("Foglio1") ulta = .Range("A" & Rows.Count).End(xlUp).Row Set area = .Range("A3:A" & ulta) Set cella = area.Find(Me.TextBox1.Value, , xlValues, xlWhole) If Not cella Is Nothing Then riga = cella.Row Me.TextBox2.Value = UCase(cella.Offset(0, 1).Value) ' Esito Me.TextBox3.Value = UCase(cella.Offset(0, 2).Value) ' Scatolone Me.TextBox4.Value = UCase(cella.Offset(0, 3).Value) ' Stanza Me.Label9.Caption = UCase(cella.Offset(0, 4).Value) ' Stato Me.CommandButton4.Enabled = True Me.TextBox2.Enabled = True Me.TextBox3.Enabled = True Me.TextBox4.Enabled = True Else MsgBox "Nessun valore corrispondente al criterio di ricerca", vbExclamation, "ATTENZIONE" End If End With Set area = Nothing Set cella = Nothing End SubGrazie per l'aiuto
Ciao
Confermi che per quasiasi sia il numero di volte che compare una pratica esiste una soloa che contenga No in colonna B?
Ciao
Luca
Ciao
ho dovuto modificare la tua macro per testarla.
Usa l'esempio e modificala per tornare all'originale.
Fammi sapere se fa quanto chiedi.
Ciao Luca
Dim ulta As Long Dim area As Range Dim cella As Range Dim firstAddress As String With Sheets("Foglio1") ulta = .Range("A" & Rows.Count).End(xlUp).Row Set area = .Range("A3:A" & ulta) area.Select Set cella = area.Find(.Range("C1").Value, , xlValues, xlWhole) If Not cella Is Nothing Then firstAddress = cella.Address Do Until UCase(cella.Offset(0, 1).Text) = "NO" 'cella.Select Set cella = area.FindNext(cella) 'cella.Select If cella.Address = firstAddress Then Exit Do Loop MsgBox "Trvato" 'cella.Select Else MsgBox "Nessun valore corrispondente al criterio di ricerca", vbExclamation, "ATTENZIONE" End If End WithCiao Luca,
Grazie mille per la risposta
Ho sostituito con il tuo codice, ma purtroppo non funziona, ho modificato come sotto
' Il tuo codice Set cella = area.Find(.Range("C1").Value, , xlValues, xlWhole) 'La mia modifica Set cella = area.Find(.Range("B1").Value, , xlValues, xlWhole)Ma neanche così funziona.
Visualizzando con il debug si ferma su
If Not cella Is Nothing Thene mi restituisce a video
MsgBox "Nessun valore corrispondente al criterio di ricerca", vbExclamation, "ATTENZIONE"Però non è un errore di codice. Significa che non ha trovato il valore.
Il primo argomento del fine dovrebbe essere il tuo originale che puntava alla textbox se non ricordo male. Io avevo puntato ad una cella per fare delle prove.Find non fine con il cellulare e' un po' incasinato....
Ahahahahah apposto avevo notato ora! ^_^'
Allora l'ho fatto girare e con il debug ho notato che cerca il "no" ma poi nella form mi mette il risutato con il "si" che poi è il primo che trova.
Spero di essermi spiegato XD
Riposto il codice per completezza.
Private Sub CommandButton1_Click() Dim ulta As Long Dim area As Range Dim cella As Range Dim firstAddress As String With Sheets("Foglio1") ulta = .Range("A" & Rows.Count).End(xlUp).Row Set area = .Range("A3:A" & ulta) area.Select Set cella = area.Find(Me.TextBox1.Value, , xlValues, xlWhole) If Not cella Is Nothing Then firstAddress = cella.Address Do Until UCase(cella.Offset(0, 1).Text) = "no" Set cella = area.FindNext(cella) If cella.Address = firstAddress Then Exit Do Loop Me.TextBox2.Value = UCase(cella.Offset(0, 1).Value) ' Esito Me.TextBox3.Value = UCase(cella.Offset(0, 2).Value) ' Scatolone Me.TextBox4.Value = UCase(cella.Offset(0, 3).Value) ' Stanza Me.Label9.Caption = UCase(cella.Offset(0, 4).Value) ' Stato Me.CommandButton4.Enabled = True Me.TextBox2.Enabled = True Me.TextBox3.Enabled = True Me.TextBox4.Enabled = True Else MsgBox "Nessun valore corrispondente al criterio di ricerca", vbExclamation, "ATTENZIONE" End If End With Set area = Nothing Set cella = Nothing End SubGrazie ancora per la pazienza
Ho provato sostituendo
If cella.Address = firstAddress Then Exit Docon
If cella.Address <> firstAddress Then Exit DoSembra funzionare, ma è corretto?
Di passaggio noto un'anomalia:
Do Until UCase(cella.Offset(0, 1).Text) = "no"significa "esegui il loop a meno che il testo della prima cella a destra, RESO MAIUSCOLO, sia uguale a 'no' (MINUSCOLO!)".
Quindi mi sembra che il loop venga eseguito sempre, perchè "NO" è diverso da "no" 🙂
Perciò una possibile modifica da fare è la seguente, il che mi sembra dia poi un risultato corretto:
Do Until LCase(cella.Offset(0, 1).Text) = "no"Sono di nuovo a scrivervi, per un problema su questo script!
Non mi prende valori con la virgola ho numeri pratica multipli, esempio della 123456 può esistere la 123456,01 e 123456,02 così com'è lo script si blocca e non mi restituisce nulla, non sapendo come fare mi rimetto alla vostra sapienza! =)
Grazie in anticipo
si blocca e non mi restituisce nulla
Qual è l'errore che ricevi? in che punto del codice? alleghi un esempio?
Ciao
Per capirci tu scrivi 123456 e vuoi che ti trovi 123456,01 e anche 123456,02....?
Nell'istruzione di ricerca
Set cella = area.Find(Me.TextBox1.Value, , xlValues, xlWhole)L'ultimo parametro fa si che tu cerci per tutto il contenuto della cella e quindi i contenuti devono essere esattamente identici
Potresti eliminarlo oppure provare con
Set cella = area.Find(Me.TextBox1.Value & "*", , xlValues, xlWhole)Fosse così io userei xlPart invece che xlWhole.
Ma non sono certo che sia così, per questo chiedevo esempio 🙂
Eccolo allegato.
Nel Debug mi seleziona questo pezzo di codice
firstAddress = cella.AddressAllegati:
You must be logged in to view attached files.Ciao
Ci avevo pensato anche io però dipende da come sono i dati e che tipo di ricerca vuole fare.
concordo sull'esempio.
Ciao
Ciao,
Grazie per la risposta.
Nono io voglio cercare puntuale, tanto se ha lo ,01 o ,02 quella intera non esiste.
La butto lì, ma bisognerebbe vedere una riga dati reale, forse nella textbox metti il punto ma in Excel c'è una virgola nella cella. Non puoi cambiare separatore e mettere ad esempio un trattino?
Ecco un file d'esempio
Allegati:
You must be logged in to view attached files.Il problema nel codice relativo all'errore evidenziato è qui:
Dim firstAddress As Range1) perchè?
2) e come si corregge?
Per quanto riguarda la ricerca di numeri con virgola, il ragionamento invece è più complesso e magari lo faccio a parte.
nella textbox metti il punto ma in Excel c'è una virgola nella cella
Avevo ragione, un punto per me 🙂
Sostituisci
Set cella = area.Find(Me.TextBox1.Value, , xlValues, xlWhole)con
Set cella = area.Find(Replace(Me.TextBox1.Value, ",", "."), , xlValues, xlWhole)Poiché Excel utilizza il punto internamente come separatore decimale, quello che viene passato dalla textbox al find per la ricerca deve rispettare tale notazione. Anche se Excel visualizza un numero con virgola, "dentro" lo tratta come un testo col punto al posto della virgola. Quindi al find devi passare un valore che, se scritto con la virgola, deve ricevere invece un punto. Non preoccuparti che poi restituirà il valore giusto, con la virgola 🙂
Comunque il codice ha qualche errorino... sto cercando di aggiustarlo.
Inoltre non serve scrivere due volte lo stesso codice, quando intercetti il Keydown puoi richiamare lo stesso codice del commandbutton e sei a posto 🙂
Il codice che ripropongo è questo, se non ho frainteso le esigenze.
Private Sub CommandButton1_Click() Dim ulta As Long Dim area As Range Dim cella As Range Dim firstAddress As String TextBox2 = "" TextBox3 = "" TextBox4 = "" With Sheets("Foglio1") ulta = .Range("A" & Rows.Count).End(xlUp).Row Set area = .Range("A2:A" & ulta) Set cella = area.Find(Replace(TextBox1, ",", "."), , xlValues, xlWhole) If Not cella Is Nothing Then firstAddress = cella.Address Do Set cella = area.FindNext(cella) If cella Is Nothing Or LCase(cella.Offset(0, 1).Text) = "no" Then Exit Do Loop While firstAddress <> cella.Address If LCase(cella.Offset(0, 1).Text) = "no" Then TextBox2 = UCase(cella.Offset(0, 1)) ' Esito TextBox3 = UCase(cella.Offset(0, 2)) ' Scatolone TextBox4 = UCase(cella.Offset(0, 3)) ' Stanza Label9.Caption = UCase(cella.Offset(0, 4)) ' Stato CommandButton4.Enabled = True TextBox2.Enabled = True TextBox3.Enabled = True TextBox4.Enabled = True Else MsgBox "Nessun valore corrispondente al criterio di ricerca", vbExclamation, "ATTENZIONE" End If Else MsgBox "Nessun valore corrispondente al criterio di ricerca", vbExclamation, "ATTENZIONE" End If End With Set area = Nothing Set cella = Nothing End Sub Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then Call CommandButton1_Click End Sub -
AutoreArticoli
