cerca veloce



  • cerca veloce
    di totygno71 data: 10/07/2015 15:19:12

    Allora in colonna "B" ho una lista di cognomi

    apredo la form inizio a digitare nella textbox il cognome che mi serve, dal 2 carattere in po ad ogni digitazione dovrebbe caricarmi nella listbox sotto tutti i cognomi che iniziano con le lettere digitate nella tex box
    Quindi se digito AD nella textbox nella list box dovrei avere
    1. ADAM (5) AAC
    2. ADAMI (1) AAA
    3. ADAMINI (1) AAB
    4. ADERHOLT (1) AAC

    Se digito ALB
    1.ALBANO (1) AAC
    2.ALBAREDA (1) AAA
    3.ALBERGONI (3) AAB
    4.ALBERTALLI (2) AAC
    5.ALBERTI (9) AAA
    6.ALBERTINI (2) AAB
    7.ALBERTONI (2) AAC
    8.ALBEVERIO (1) AAA
    9.ALBISETTI (2) AAB


    Spero di essere stato spiegato...
    Allego il file di esempio....

    PS Cerco il metodo più veloce per caricare la listbox ad ogni evento change della texbox1

    Grazie



  • di Vecchio Frac data: 10/07/2015 15:32:09

    Ho già realizzato una cosa simile (con Access).
    Mo' cerco il file e ti dico come ho fatto io :o)





  • di totygno71 data: 10/07/2015 15:38:31

    Grazie Franz...
    Tieni conto che ho una ciofeca di PC ^_^



  • di Vecchio Frac data: 10/07/2015 15:38:38

    Dunque sì, concettualmente è semplice e la realizzazione veloce (inoltre il risultato è così rapido che non si nota quasi neanche il tempo di attesa).
    La differenza tra i due sistemi è naturalmente che Access fornisce i dati in tabella su cui si può realizzare direttamente la query "SELECT ... FROM table WHERE campo LIKE filtro" (e poi si associa al RowSource del ListBox il risultato del recordset).
    Un'idea carina potrebbe essere di creare un recordset disconnesso in memoria con ADO e poi riprodurre lo scenario come se si lavorasse su un database.
    Altrimenti non saprei: un filtro avanzato da cui il listbox pesca l'origine dati?





  • di totygno71 data: 10/07/2015 15:43:19

    Mi sono dimenticato di dirti che le listbox sulla userform sono 2 ed ognuna di essa fa riferimento ad un elenco di cognomi su due fogli differenti circa 3000 su ogni foglio...
    Listbox1 pesca dal foglio1
    listbox2 pesca da foglio2



  • di Vecchio Frac data: 10/07/2015 15:59:31

    Facciamo una cosa un po' strana... prova questo codice :)
    Non ho visto prima il tuo ultimo post... ma facciamo un passo alla volta sul primo esempio che hai fatto.
     
    Option Explicit
    
    Private Sub UserForm_Initialize()
        ListBox1.RowSource = ""
        Range("A1").AutoFilter
    End Sub
    
    Private Sub TextBox1_Change()
    Dim rng1 As Range
        On Error GoTo clear_list
        ListBox1.Clear
        Range("a1").CurrentRegion.AutoFilter field:=2, Criteria1:=TextBox1 & "*"
        Set rng1 = Range(Split(Range("a1").CurrentRegion.SpecialCells(xlCellTypeVisible).Address, ",")(1))
        ListBox1.List = rng1.Columns(2).Value
        Exit Sub
        
    clear_list:
        ListBox1.Clear
        Resume Next
        
    End Sub
    
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        Range("A1").AutoFilter
    End Sub
    






  • di Vecchio Frac data: 10/07/2015 16:28:27

    Una sbavatura da correggere:
    - nell'Initialize : aggiungi ListBox1.ColumnCount = 3
    - nel Textbox1_change: modifica ListBox1.List = rng1.Value





  • di Vecchio Frac data: 10/07/2015 16:37:02

    Oppure, cosa che mi piace di più per evitare quel fastidioso problema e avere solo una colonna (per cui puoi togliere la modifica al columncount nell'initialize).
     
    'al posto di
    'ListBox1.List = rng1.Columns(2).Value
    'tutto il blocco seguente:
    
        If rng1.Columns(1).Cells.Count = 1 Then
            ListBox1.AddItem rng1.Columns(2).Value
        Else
            ListBox1.List = rng1.Columns(2).Value
        End If






  • di totygno71 data: 10/07/2015 16:57:36

    Io mi stavo orientando con il FindNext...
    Secondo te è proponibile?

    Volevo evitare il filtro avanzato se possibile...

    Il tuo suggerimento comunque lo testo lunedì perchè è un file di lavoro... e poi ti dico...

    Intanto mi speghi perhè hai previsto On Error GoTo clear_list?



  • di Vecchio Frac data: 10/07/2015 19:37:57

    Per non star lì a controllare che il range filtrato sia o no valorizzato, in caso di errore (accade anche quando non c'è in tabella un valore digitato nella textbox) cancello la listbox e buon proseguimento di serata :)





  • di totygno71 data: 10/07/2015 21:32:35

    Ok Sorry avevo letto frettolosamente il codice e non riuscivo a capire perchè lo avevi inserito lì...

    E sulla mia idea di usare un findnext?



  • di Vecchio Frac data: 10/07/2015 22:08:44

    No, se devi ciclare un array tanto vale buttare tutta la tabella dentro un array e fare le ricerche in memoria, è più veloce. Ma in questo preciso momento non saprei buttare giù uno scenario decente. Magari Find / FindNext lavorano altrettanto bene visto che si parla comunque di poche migliaia di record.





  • di totygno71 data: 10/07/2015 22:42:11

    Forse banale ma mi sto incartando nel find/find next usando man mano i caratteri inseriti textbox
    lookat:= xlpart non fa per me... perchè troverebbe anche i caratteri in mezzo al testo o anche alla fine ed io ho bisogno a partire dalle iniziali del cognome ^_^
    Mi dai una dritta per usare find/findnext in questo contesto?



  • di scossa data: 10/07/2015 23:24:27

    cit. totygno71: " perchè troverebbe anche i caratteri in mezzo al testo o anche alla fine ed io ho bisogno a partire dalle iniziali del cognome"

    Usa il carattere jolly *:
    ....Find(What:="ga*" ....


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di totygno71 data: 11/07/2015 06:44:47

    @Scossa
    A volte per raggiungere un obiettivo si cerca la strada più contorta quando lo stesso è dietro l'angolo...
    Lunedì provo entrambe le strade....
    filtro avanzato e find/findnext
    Intanto grazie Scossa grazie Franz!
    PS Lo so Franz che nel tuo codice l'asterisco era già previsto... :(

     
    Range("a1").CurrentRegion.AutoFilter field:=2, Criteria1:=TextBox1 & "*"