Creare modulo ricerca per tabella
Hai un problema con Excel? 
Creare modulo ricerca per tabella
di Alessio (utente non iscritto) data: 06/07/2015 23:32:03
Buonasera, vengo al dunque saltando i convenevoli. Ho un foglio in excel con una tabella a diverse colonne e righe con in verticale le voci, nome, data, acquirente, venditore, etc, in orizzontale ovviamente i clienti. Il problema è che devo creare un box di ricerca (tipo filtro) dove inserendo il nome o eventualmente un nome a caso mi restituisca il risultato selezionando tutto dalla tabella. Le righe potranno essere molte, parliamo di circa 1000 o più.
Come devo fare? da cosa devo partire? Mi sapreste dare una dritta?
Grazie
Alessio
di Vecchio Frac data: 07/07/2015 13:09:32
In ordine di complessità puoi partire dalla scheda Dati, pulsante Filtro, impostare il filtro sul campo desiderato quindi recuperare i record che ti interessano.
Avanzando un po' potresti anche guardare come funzionano le tabelle pivot.
Andando oltre, potresti implementare uno userform dove puoi selezionare il campo principale e applicare quindi un filtro sulla tabella, rilevando poi il set di righe filtrato.
di Alessio (utente non iscritto) data: 07/07/2015 22:04:47
Intanto grazie!
Diciamo che la prima opzione la conosco ma ho bisogno di qualcosa di più complesso.
La tabella pivot non so cosa sia, andrò ad informarmi.
Per lo Userform è quello che vorrei fare. Cioè tabella di 1000, 2000 o xxxx righe, inserisco nel campo del modulo userform un nome e questo mi cerca la parola all'interno di una colonna oppure di tutte le righe. Da cosa devo partire? Sono veramente a zero con vba.
di Alessio (utente non iscritto) data: 08/07/2015 22:50:14
Non voglio il codice già fatto ma qualcuno potrebbe farmi un esempio?
Purtroppo non ho occasione di lavorare con vba, ma solo con php, html, e linguaggi simili, qualcuno potrebbe postarmi una bozza di codice?
Almeno posso lavorarci, daltronde non ho il tempo utile per imparare come funziona e come si programma.
Grazie a chiunque abbia voglia di aiutarmi
di alfrimpa data: 08/07/2015 23:43:56
Ciao Alessio
Intanto comincia ad allegare un file di esempio privo di dati sensibili ma con la struttura uguale al tuo e mostra il risultato che vuoi ottenere.
Alfredo
di Alessio (utente non iscritto) data: 09/07/2015 15:31:41
Ciao, in allegato un semplice file Excel con solo 4 colonne e 4 righe.
Il.concetto è che nel userform che ho già creato ma che non so come popolare con il codice corretto dovrò inserire un nome, tipo caio o tizio e il risultato dovrebbe essere una o più righe dove è presente quel nome, nel caso fossero più di uno ci saranno più righe come risultato. Potrei anche fare sul foglio 1 l'elenco e sul foglio 2 il form.
di alfrimpa data: 09/07/2015 15:43:04
Nel file allegato non c'è nessuna userform. Dici di averla creata ma non c'è.
C'è un solo foglio con quattro nomi.
Rispiega meglio, con maggiori dettagli, il risultato che vuoi ottenere; che cosa ci vuoi fare con la userform? Quali dati devono essere visualizzati nei controlli posti sulla userform?
Ci sono diversi modi per "popolare" un controllo posto su una userform.
Allo stato si può andare avanti solo per ipotesi (ed io non saprei cosa inventarmi) e si perderebbe solo tempo.
Alfredo
di Alessio (utente non iscritto) data: 09/07/2015 21:06:14
Eccomi, hai ragione, speravo di essere chiaro nel file allegato, ma non era così.
Allora in allegato il file "esempio1" troviamo una tabella con 7 colonne e 10 righe, ovviamente sia le righe sia le colonne potrebbero aumenare in quanto i parametri da inserire cambiano, però le voci tramite le quali io farò la ricerca saranno diciamo due, acquirente e/o venditore. Il form dovrebbe apparire nella seconda scheda cliccando il pulsante CommandButton1, in questo form ho messo la possibilità di scegliere quale dei due campi adottare. Nel campo bianco invece dovrò inserire una parola e cliccando sul tasto cerca mi dovrà apparire o nella scheda 2, cioè quella del form, oppure nella prima la o le righe interessate dalla ricerca che ho fatto.
Quindi se il form dovesse esser messo nella scheda 1 potrei nascondere tutte le righe che non corrispondono, e visualizzare solo i risultati, mentre se la ricerca la facessi nella scheda 2 potrebbe semplicemente apparire il risultato lasciando intatta la tabella della scheda 1.
Spero di essere stato più chiaro, per ogni altro chiarimento resto a disposizione.
Grazie a tutti
Alessio
di alfrimpa data: 10/07/2015 11:38:24
Ciao Alessio
Premesso che della sottostante macro (inserita nella form) non capisco nulla (se l'hai scritta tu me la spieghi?) e che sul foglio "Tabella1" non esiste in campo "matricola" sostituirò "matricola" con "acquirente" e proverò a far fare la ricerca o su "acquirente" o su "venditore".
Alfredo
Private Sub Matricola_venditore_Click()
'Controlli se Matricola_Click() è valorizato ...
If (Matricola_Click().Value = vbChecked) Then ' Non ho mai visto un controllo definito così
Matricola.Caption = "OK"
'Range("L2:" & Cells(1, i).Address).Select 'Seleziono la colonna Matricola ' che cosa indica la varibile i?
ElseIf (Venditore_Click().Value = True) Then
Range("C2:" & Cells(1, i).Address).Select 'Altrimenti seleziono la colonna Venditore
End If
End Sub
|
di alfrimpa data: 10/07/2015 12:03:51
Ciao Alessio
Prova a guardare il file che ti ho allegato (Alessio.xlsm) ed eventualmente fai sapere.
Ovviamente, in presenza di un elenco più ampio su Tabella1 andranno variati anche i riferimenti nella macro.
Questo è solo un primo esempio (assai grezzo) che andrà modificato/migliorato.
Comunque credo che sarà per te un buon spunto di studio (conosci un po' di vba?)
Alfredo
Private Sub CommandButton1_Click()
If UserForm1.OptionButton1.Value = True Then
Worksheets("Tabella1").Range("a1").Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$G$10").AutoFilter Field:=3, Criteria1:= _
UserForm1.TextBox1.Value
Else
Worksheets("Tabella1").Range("a1").Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$G$10").AutoFilter Field:=5, Criteria1:= _
UserForm1.TextBox1.Value
End If
End Sub
Private Sub CommandButton2_Click()
UserForm1.Hide
End Sub
Private Sub CommandButton3_Click()
Worksheets("Tabella1").Range("a1").Select
Selection.AutoFilter
End Sub
|
di Alessio (utente non iscritto) data: 10/07/2015 12:44:50
Ciao Alfredo, intanto grazie. Il codice che c'era dentro il form non l'avevo scritto io ovviamente in quanto non ci capisco molto, come naturale l'ho preso e messo ma mi sono accorto poi che 1 non andava e 2 non era quello che cercavo. Purtroppo è rimasto scritto ma è da eliminare.
Quanto al tuo consiglio testerò il codice è lo adatteró, purtroppo di vba conosco poco, ma diciamo che la sintassi e un po' di logica mi sono abbastanza chiare.
Ho creato qualcosa per conto mio oggi, che posterò a breve per avere conferma che sia corretto.
Grazie x la pazienza.
Alessio
di Alessio (utente non iscritto) data: 10/07/2015 23:51:37
Ciao Alfredo, ho dato un occhio al tuo codice ed al file che mi hai allegato, posso dire che la strada è quella giusta, ci sono alcune correzzioni che dovrò fare. Intanto facendo dei test inserendo nella textbox il nome di un acquirente e selezionando la flag su acquirente non lo trova, mi sai dire se la funzione di ricerca vale anche per le parole diciamo "parziali"? Cioè se il record è pincopallino ed io cerco "pincop" lui me lo trova lo stesso?
Inoltre vorrei che ci fosse anche un tasto reset dove tolgo spunte e cancello il testo, credo che si possa fare inserendo questo codice CmdReset_Click() che allego sotto. sia quando esco sia quando clicco togli filtri.
Private Sub CmdReset_Click()
TextBox1.Text = ""
End Sub |
di alfrimpa data: 11/07/2015 10:12:53
Ciao Alessio
Più che una TextBox per te sarebbe più utile una ComboBox all'interno della quale tu scegli il nominativo; con le combobox nel momento in cui inizi a digitare delle lettere nella tendina vai immediatamente sul primo nome che contiene le lettere digitate.
Spero in giornata di allegare un esempio.
Alfredo
di Alessio (utente non iscritto) data: 11/07/2015 10:41:32
Grazie, alfredo sei sempre preciso. Andrò a vedere come fare, giusto per aggiungere qualche competenza in più su vba in attesa tempo permettendo di un tuo file di esempio.
Grazie
alessio
di alfrimpa data: 11/07/2015 15:31:30
Ciao Alessio
Come avevo promesso ti allego nuovo file (Alessio1.xlsm)
Nella Userform ho sostituito la textbox con una combobox
Tu non devi fare altro che scegliere "Venditore" o "Acquirente" ed automaticamente saranno caricati nella combo i dati della categoria prescelta (senza doppioni).
Ti ho messo anche un pulsante "Reset" per resettare appunto la combo ed i due optionbutton.
Qui sotto trovi tutte le macro associate al progetto.
Fammi sapere e se hai dubbi chiedi pure.
Alfredo
P.S. Preciso che il tutto funziona solo se stai sul foglio Tabella1 (se vuoi che funzioni ovunque va modificato il codice ed onestamente ora come ora non saprei come farlo).
Option Explicit
Private Sub CommandButton1_Click() <---- Macro per filtrare i dati associata al pulsante "Cerca"
If UserForm1.OptionButton1.Value = True Then
Worksheets("Tabella1").Range("a1").Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$G$10").AutoFilter Field:=3, Criteria1:= _
UserForm1.ComboBox1.Value
Else
Worksheets("Tabella1").Range("a1").Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$G$10").AutoFilter Field:=5, Criteria1:= _
UserForm1.ComboBox1.Value
End If
End Sub
Private Sub CommandButton2_Click() <---Macro associata al pulsante "Chiudi"
UserForm1.Hide
End Sub
Private Sub CommandButton3_Click() <---Macro associata al pulsante "Togli Filtri"
Worksheets("Tabella1").Range("a1").Select
Selection.AutoFilter
End Sub
Private Sub CommandButton4_Click() <--- Macro associata al pulsante "Reset"
With UserForm1
.ComboBox1.Value = ""
.OptionButton1.Value = False
.OptionButton2.Value = False
End With
End Sub
Private Sub OptionButton1_Click() <-- Macro associata al pulsante di opzione "Venditore"
Dim Elenco As New Collection
Dim Intervallo As Range
Dim Riga
Dim valori As Variant
Riga = Range("c" & Rows.Count).End(xlUp).Row
Set Intervallo = Range(Cells(2, 3), Cells(Riga, 1))
On Error Resume Next
For Riga = 1 To Intervallo.Rows.Count
Elenco.Add Intervallo(Riga, 3).Value, CStr(Intervallo(Riga, 3).Value)
Next
On Error GoTo 0
UserForm1.ComboBox1.Clear
For Each valori In Elenco
UserForm1.ComboBox1.AddItem valori
Next
End Sub
Private Sub OptionButton2_Click() <-- Macro associata al pulsante di opzione "Acquirente"
Dim Elenco As New Collection
Dim Intervallo As Range
Dim Riga
Dim valori As Variant
Riga = Range("e" & Rows.Count).End(xlUp).Row
Set Intervallo = Range(Cells(2, 3), Cells(Riga, 1))
On Error Resume Next
For Riga = 1 To Intervallo.Rows.Count
Elenco.Add Intervallo(Riga, 5).Value, CStr(Intervallo(Riga, 5).Value)
Next
On Error GoTo 0
UserForm1.ComboBox1.Clear
For Each valori In Elenco
UserForm1.ComboBox1.AddItem valori
Next
End Sub
|
di Alessio (utente non iscritto) data: 12/07/2015 16:37:29
Ciao Alfredo, intanto ti ringrazio veramente tanto, visto quello che hai fatto.
Ho visto il tuo codice e mi piace, i problemi che riscontro invece sono questi:
Nella combobox appaio correttamente i dati venditore o acquirente, il punto è che se clicco sulla freccia e mi appare giustamente l'elenco quando avrò 200, 500, o 1000 voci come si comporterà?
Ho corretto il codice inserendo il reset dei campi e dei filtri al chiudere del form in modo tale che quando esco mi rimane tutto pulito.
In ultimo una piccola nota di correzione, avevi invertito, le colonne venditore/acquirente (colonna 3 invertita con la 5) quindi non ci capivo nulla.
Corrette ed ora sembrano perfette.
di alfrimpa data: 12/07/2015 16:46:06
Ciao Alessio
Come dicevo in un precedente messaggio se nella combo hai mille voci e digiti la lettera "Z" il cursore nella combo si posizionerà sulla prima voce che inizia per "Z"; se digiti,"ze" si posizionerà sulla prima voce che comincia per "ze" e così via quindi dovresti trovare subito la voce che ti interessa anche con migliaia di nominativi.
Perdona gli errori commessi; mi erano completamente sfuggiti.
Alfredo
di Alessio (utente non iscritto) data: 12/07/2015 23:03:08
Ciao Alfredo, ti sono veramente grato, mi hai risolto moltissimi problemi e ho scoperto nuove cose da poter fare con excel/vba!
Un consiglio, ho scoperto oggi che l'elenco di voci saranno circa 4000 !! Il mio amico mi chiede: è meglio che ci sia un file unico con tutti i nominativi che poi verranno incrementati, oppure è meglio dividerli in 5, 6, 7, gruppi come lo sono ora e far fare le ricerche su ogni file? I gruppi sono per regione (lombardia, liguria, etc).
Grazie
Alessio
di alfrimpa data: 13/07/2015 09:40:24
Ciao Alessio
Innanzitutto ti ringrazio e sono contento che il mio piccolo lavoro abbia incontrato il tuo favore.
Come avrai capito con Excel/VBA solo il caffè non si riesce a fare (è un’iperbole ma non lontana dal vero) quindi i quattromila e più nominativi si possono gestire tranquillamente in Excel (anche se forse Access sarebbe strumento più adatto).
A questo punto, però, occorrerebbe un minimo di pianificazione cioè stendere su carta le linee guida di un piccolo progetto che riguarda l’applicazione (perché di questo si tratta) ed avere bene in mente la situazione dalla quale si parte, i passaggi che si vuole debbano essere eseguiti ed il risultato finale che si vuole raggiungere.
In pratica, si possono creare menù, maschere ed automatizzare il tutto senza neanche “vedere” fisicamente il foglio elettronico e gestendo tutto con il VBA.
Ovviamente ho estremizzato il discorso ma è giusto per farti capire.
Sul fatto se è meglio avere un unico file o file diversi distinti per regione direi che non ci sono differenze. Excel è perfettamente in grado di gestire 4000 record (in un foglio ci sono 1.068.000 righe) quindi dpende da te/voi decidere quale approccio seguire.
Io terrei tutto su un file ma in questo caso occorre inserire sul foglio Tabella1 un ulteriore campo “Regione” e magari anche “provincia” per restringere ulteriormente l’ambito delle scelte nella combo e modificare anche il codice attualmente funzionante.
Capirai bene che non è una cosa che si fa in quattro e quattr’otto anche perché le prove che si dovrebbero fare non sono poche.
Comunque, per quanto mi riguarda e nei limiti delle mie conoscenze, sono a disposizione.
Alfredo
P.S. Questa settimana sono in ferie (quindi senza pc) per cui non potrò dare un contributo concreto; ho comunque con me l’iPad per cui posso tranquillamente colloquiare con il forum.
di alfrimpa data: 13/07/2015 11:31:57
Ho cominciato a mettere in pratica delle idee che mi erano venute ma l'esito dei test non ha dato gli esiti sperati.
Dobbiamo aggiornarci a tra una settimana.
Alfredo
menu a tendina con checkbox
di Alessio (utente non iscritto) data: 26/07/2015 23:27:54
Rieccomi, allora ho avuto modo di avere in mano il file con le 4000 voci su cui lavorare, in linea di massima mi è bastato soltanto cambiare i riferimenti delle celle e delle colonne in modo tale che potessi far fare lo stessso lavoro ma con riferimenti diversi, e funziona. L'unica cosa al momento è che questa lista è dinamica quindi ho bisogno di rendere le celle dinamiche. Voi che dite mi basta inserire questo codice per renderle dinamiche?
ActiveSheet.Range("$A$1:$N$65536").AutoFilter Field:=4, Criteria1:= UserForm1.ComboBox1.Value |
di alfrimpa data: 27/07/2015 14:01:11
Ciao Alessio
Spero che a te i file funzionino correttamente perché a me, inspiegabilmente, non funziona più nulla.
Comunque prova con questa macro
Alfredo
Private Sub CommandButton1_Click()
Dim ur As Long
ur = Range("a" & Rows.Count).End(xlUp).Row
If UserForm1.OptionButton1.Value = True Then
Worksheets("Tabella1").Range("a1").Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$G$" & ur).AutoFilter Field:=3, Criteria1:= _
UserForm1.ComboBox1.Value
Else
Worksheets("Tabella1").Range("a1").Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$G$" & ur).AutoFilter Field:=5, Criteria1:= _
UserForm1.ComboBox1.Value
End If
End Sub |
di Alessio (utente non iscritto) data: 27/07/2015 22:41:11
Ciao Alfredo
la macro che mi hai scritto funziona perfettamente, ovviamente la riga inserita alla fine del foglio deve essere salvata altrimenti da errore il codice vba.
Posto il codice corretto per il tasto cerca con le correzioni fatte.
Inoltre diciamo che mi piacerebbe che nello spazio combobox quando inserisco la parola la ricerca venisse fatta su tutto il testo. Cioè se mi chiamo mario rossi e nel combobox inserisco "mario" lui mi suggerisce anche rossi e mi trova il record, ma se inserisco "rossi" non mi trova nulla.
C'è qualche funzone particolare? Cosa posso fare?
Nel codice ovviamente l'ultima colonna è la N ecco perchè non coincide con quello che hai postato tu.
Private Sub CommandButton1_Click()
Dim ur As Long
ur = Range("A" & Rows.Count).End(xlUp).Row
If UserForm1.OptionButton1.Value = True Then
Worksheets("a-zeta").Range("A1").Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$N$" & ur).AutoFilter Field:=4, Criteria1:= _
UserForm1.ComboBox1.Value
Else
Worksheets("a-zeta").Range("A1").Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$N$" & ur).AutoFilter Field:=10, Criteria1:= _
UserForm1.ComboBox1.Value
End If
End Sub |
di alfrimpa data: 27/07/2015 22:55:40
Ciao Alessio
Sono contento che tutto funzioni bene.
Quanto alla tua domanda, sebbene qui sul forum mi abbiano qualificato come "esperto" (bontà loro), sono tante ancora le cose che non so.
Occorrerebbe inserire alla voce Criteria1 un operatore tipo Like o qualcosa del genere ma ripeto bisognerebbe fare delle prove che in questo momento (essendo in vacanza) non posso fare (non ho il pc).
Speriamo che qualche altro utente ti venga in soccorso (anzi ti consiglio di aprire una discussione a parte chiedendo aiuto su questo specifico punto; così facendo avrai sicuramente maggiore visibilità).
Alfredo
di Alessio (utente non iscritto) data: 28/07/2015 00:42:48
Alfredo,
un grandissimo grazie per tutto. Grazie a te ho risolto il mio problema, ed ora con il consiglio del Like mi informerò.
Ti auguro buone vacanze le mie saranno a fine agosto.
Se passi da me (Milano) hai un caffè pagato.
Alessio
di alfrimpa data: 28/07/2015 08:57:00
È un po' difficile che passi da Milano (ci ho lavorato dal '74 al '76) visto che sono di Napoli.
Comunque mi basta la soddisfazione di averti aiutato e di non aver detto castronerie.
Alfredo
Vuoi Approfondire?