Pagina 1 di 2 12 UltimaUltima
Risultati da 1 a 30 di 32

Discussione: Ricerca elementi in un database



  1. #1
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215

    Ricerca elementi in un database

    Buongiorno,
    vi propongo un esercizio che ho risolto in parte, ma mi piacerebbe ottimizzare. Qui potete scaricare il file:
    https://dl.dropboxusercontent.com/u/...staComuni.xlsm

    Nel caso specifico il database è composto da records i cui campi sono sono: Regione, Provincia, Comune, Codice_Catastale.

    Il foglio è implementato realizzando dei filtri dove selezionando a cascata il campo di ricerca (dalla regione fino al comune), il numero degli elementi filtrati si restringe fino a trovare l'elemento cercato.

    Aspetti da ottimizzare:
    1) ho dovuto inserire i filtri a cascata perché creando le liste uniche di elementi da assegnare alla convalida dati ho visto che la convalida dati va in crisi con il numero di elementi del campo province (non li visualizzava tutti perché in numero eccessivo); mi piacerebbe trovare un espediente per risolvere questa limitazione, questo consentirebbe nell'esempio di selezionare una provincia e di ottenere in automatico tutti comuni senza dover selezionare preliminarmente la regione.

    2) mi piacerebbe che gli elementi del menù a tendina della "convalida dati" si aggiornassero scrivendo dei caratteri nel relativo campo di filtraggio. Per esempio, scrivendo "ca" nel campo di ricerca della regione (cella A8098) e cliccando sul menu a tendina del filtro di convalida, mi consentisse di vedere in elenco le sole regioni calabria e campania e di selezionare la scelta desiderata.

    3)il filtro di elementi in una posizione specifica opera con il database collocato nello stesso foglio; mi piacerebbe invece trovare una soluzione che mi consentisse di tenere su un foglio il database e sull'altro gli elementi filtrati.

    Spero di essere stato sufficientemente chiaro e di non essere troppo esigente.

    Saluti e buon divertimento
    Giuseppe

  2. #2

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    4016
    Versione Office
    2013
    Likes ricevuti
    1225
    Likes dati
    923
    Ciao,
    al momento non ho la possibilità di scaricare il file (ho solo il cellulare)...
    Non capisco se è un quiz o un problema con un file che stai creando?!?!
    Comunque, le cose che chiedi di fare con il "convalida dati" non sono possibili, devi usare una "ComboBox" con relativo codice...

    "Sono le persone che nessuno immagina che possano fare certe cose, quelle che fanno cose che nessuno può immaginare."

  3. #3
    Direl2007
    Ospite L'avatar di Direl2007
    ciao ggratis, potresti produrre un Form con una Casella Combinata come suggerito da cromagno per fare la ricerca del tuo dato e mettere il risultato trovato nelle TextBox, con un paio di Pulsanti( uno per una nuova ricerca,ed uno di chiusura totale) che ne pensi?

  4. #4
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    Ciao Cromagno e Direl2007,
    grazie intanto per l'attenzione.
    ho visto che è aperta una discussione con un tema analogo dove è stata proposta una soluzione con i form, ma non vorrei allontanarmi dalla soluzione che ho proposto nel file che ho condiviso.
    Vorrei soltanto implementare i miglioramenti che ho elencato.
    ...cromagno, potrebbe aver ragione sul fatto che con la convalida dati alcuni dei miglioramenti che vorrei implementare non sono fattibili; speravo di trovare qualcuno che mi smontasse quella che era anche una mia convinzione.
    Come suggerito da cromagno, potrebbe essere una strada da seguire l'utilizzo della casella combinata (come Controllo Modulo o come controllo ActiveX); magari con le dimensioni della casella combinata bloccate alla dimensione della cella per nasconderla il più possibile.
    Non essendo un informatico, soffro un po' nella scrittura del codice, quindi se ne avete voglia proponete direttamente sul file condiviso i miglioramenti.

    PS: non è un quiz, ma avevo scritto questo file quasi per gioco, ascoltando uno dei tanti videotutorial di Gerardo (EM26 ed un altro sulle liste uniche EP64), quindi non ho un problema reale ma credo sia interessante riuscire a scrivere questa cosa.
    saluti
    Giuseppe

  5. #5
    L'avatar di Textomb
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Catania
    Età
    47
    Messaggi
    171
    Versione Office
    Excel 2016
    Likes ricevuti
    93
    Likes dati
    11
    Secondo me, si potrebbe fare anche senza scrivere codice.
    Hai provato con i filtri delle tabelle pivot?
    Ottieni più o meno lo stesso risultato che vorresti con la velocità tipica delle pivot (eccellente!!).
    Inoltre l'interfaccia diventa molto gradevole perchè fai tutto da un pannello frontale.
    Tempo fa avevo fatto una cosa del genere ottenendo risultati sorprendenti.
    Se riesco a trovare un pò di tempo, provo a convertire quella esperienza nel tuo file...:277:

  6. #6
    L'avatar di Textomb
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Catania
    Età
    47
    Messaggi
    171
    Versione Office
    Excel 2016
    Likes ricevuti
    93
    Likes dati
    11
    http://www.filedropper.com/listacomuni2
    Ecco, più o meno, quello che intendevo dire...

  7. #7
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    ciao Textomb,
    soluzione veramente interessante, me la studierò nei dettagli. Grazie.

    Per rimanere invece sulla strada delle combobox indicata da cromagno sperando non sia un problema riportare i link esterni, ma MikeVBA è un altro mentore dell'argomento macro Excel, riporto questi link

    http://mikevba.altervista.org/macro/mikevba062.htm

    dove lui ho visto da praticamente la soluzione alla strada indicata da cromagno, almeno per alcuni aspetti dell'ottimizzazione che volevo fare, non rimane che scrivere il codice...

    ho visto ci sono anche altri articoli utili sulle combobox riportati in questo indice
    http://mikevba.altervista.org/macro.php

    ...proverò a farlo, salvo qualcun altro incuriosito non lo faccia prima di me ;)

    saluti
    Giuseppe

  8. #8
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    ...una soluzione che si avvicina un po' a quello che cercavo.
    ...bello che nella ricerca è possibile utilizzare i caratteri speciali "?" e "*", il primo in sostituzione di un qualunque carattere e il secondo in sostituzione di una qualunque stringa. Funziona come i filtri automatici, ma copia i record filtrati in un'altra posizione.
    Di seguito il file ed il codice.


    Codice: 
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not (Application.Intersect(Target, ActiveSheet.Range("filtri")) Is Nothing) Then
    Call filtra
    End If
    End Sub
    Sub filtra()
    Dim r As Double, n As Double
    '    Application.ScreenUpdating = False
        'applico il filtro al database "database" secondo i criteri stabiliti da "filtri"; estraggo record unici
        With Range("filtri").Cells(Range("filtri").Rows.Count, 1).Offset(2, 0).CurrentRegion
            .ClearContents
            .Borders(xlDiagonalDown).LineStyle = xlNone
            .Borders(xlDiagonalUp).LineStyle = xlNone
            .Borders(xlEdgeLeft).LineStyle = xlNone
            .Borders(xlEdgeTop).LineStyle = xlNone
            .Borders(xlEdgeBottom).LineStyle = xlNone
            .Borders(xlEdgeRight).LineStyle = xlNone
            .Borders(xlInsideVertical).LineStyle = xlNone
            .Borders(xlInsideHorizontal).LineStyle = xlNone
        End With
            Range("database").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
                "filtri"), CopyToRange:=Range("filtri").Cells(Range("filtri").Rows.Count, 1).Offset(2, 0), Unique:=True
            Call liste_uniche
    '   Application.ScreenUpdating = True
    End Sub
    
    
    Sub liste_uniche()
        'creo le liste uniche da assegnare ai campi di ricerca dei filtri
        Dim elenco As Range, nome As Range
        Dim col As Collection
        Dim valore As Variant
        Dim lista As String
        
        Dim r As Double, n As Double
           
        'totale record (la prima riga rappresenta il nome dei campi quindi non va contata)
        n = Range("database").Rows.Count - 1
        'totale record filtrati
        r = Range("filtri").Cells(2, 1).Offset(2, 0).CurrentRegion.Rows.Count - 1
        For i = 1 To Range("filtri").Columns.Count
            Set col = Nothing
            Set elenco = Range(Range("filtri").Cells(2, i).Offset(2 + 1, 0), Range("filtri").Cells(2, i).Offset(2 + r, 0))
            Set col = New Collection
            On Error Resume Next
            For Each nome In elenco
                col.Add nome.Value, CStr(nome.Value)
            Next
            'due cicli per oridinare i valori della lista con il metodo bubble sort
            For j = 1 To col.Count - 1
                For k = j + 1 To col.Count
                    If col(j) > col(k) Then
                        'memorizza l'elemento minore
                       vTemp = col(k)
                        'rimuove l'elemento minore
                       col.Remove k
                       ' aggiunge l'elemento minore prima dell'elemento maggiore
                       col.Add vTemp, vTemp, j
                    End If
                Next k
            Next j
            'crea la lista degli elementi da assegare alla convalida
            lista = ""
            For Each valore In col
                    lista = lista & valore & ", "
            Next
            'assegna la lista di valori alla cella i-esima di filtro
                With Range("filtri").Cells(2, i).Validation
                        .Delete
                        .Add Type:=xlValidateList, Formula1:=lista
                        .ShowError = False
                End With
        Next i
    End Sub

  9. I seguenti utenti hanno dato un "Like"


  10. #9
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    potrebbe essere interessante integrare il codice anche con qualcosa del genere...
    https://www.youtube.com/watch?v=T3pM...uOP61_vqFHQnkg

    su youtube cercando "Create Searchable Dropdown List In Excel" si trovano i video in inglese di altre soluzioni
    se funziona vi riporto il link
    https://www.youtube.com/watch?v=Jr34...FHQnkg&index=2

  11. #10
    L'avatar di Baloon_50
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Milano - Italy
    Età
    67
    Messaggi
    3339
    Versione Office
    2013 PC
    Likes ricevuti
    483
    Likes dati
    49
    scusate se mi intrometto ma una soluzione del genere non ti va bene?
    http://www.forumexcel.it/forum/38-li...-cod-catastali

    A volte basta usare parole inutili come “grazie” e “per favore” per rendere la vita più bella.
    (ELKonigsburg)
    Dice il saggio : "se vuoi essere aiutato devi metter l'allegato"
    (Nick Carter - Ten)

  12. #11
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    Grazie Baloon_50,
    nessuna intromissione e grazie per aver condiviso il tuo lavoro.
    In un certo senso ho voluto "giocare" con la funzione filtro avanzato ed un po' di VBA, la tua soluzione se pur valida è un pochetto lontana da questa cosa. Poi "Giocando" e vedendo i lavori degli altri, compreso il tuo, si impara sempre qualcosa.

    Per esempio "giocando" con questa cosa e seguendo le indicazioni dei video relativi alle "Searchable dropdown list", ho imparato che quello che cercavo si può fare anche con la convalida dati, i video sono in inglese ma si capiscono. Quando ho lanciato la discussione non lo sapevo!

    La soluzione che ho scritto io con il vba gli si avvicina, ma il filtro parte dando l' "invio" e non con l'attivazione del menù a tendina; questo perché la sub filtra parte con l'evento worksheet_change del foglio di lavoro. In compenso è una soluzione più pulita nel foglio di lavoro rispetto a quella dei video.
    Bisognerebbe sapere intercettare l'evento di attivazione di uno dei menù a tendina dei filtri, e chiamare la sub filtra in corrispondenza di uno di questi eventi. Ma questo ora non lo so fare.

    E' anche una soluzione "flessibile" perché basta incollare il codice nel foglio vba in cui è presente la tabella dei valori da filtrare, definire le due variabili nome ("database" e "filtri") ed il gioco è fatto, qualunque sia la tabella dei valori. Puoi anche spostare l'area dei filtri "trascinandola" e il tutto continua a funzionare ;-).

    Ad ogni modo ho settato la discussione come risolta, perché tutto sommato mi sono accontentato, ma ben vengano altri contributi.

    Per quanto riguarda il limite legato alle tabelle troppo grandi che non fanno vedere tutti i valori, l'ho risolto spuntando, nella convalida dati, la visualizzazione del messaggio di errore quando si inseriscono dati non validi, cosa che permette anche l'uso dei caratteri speciali "?" e "*" e che in vba l'ho fatta con l'istruzione in grassetto:
    With Range("filtri").Cells(2, i).Validation
    .Delete
    .Add Type:=xlValidateList, Formula1:=lista
    .ShowError = False
    End With

    La questione del tenere la tabella dei valori in un foglio e filtrare i dati in un'altro, ci ho rinunciato ma credo che la funzione filtro avanzato lo permetta nelle ultime versioni di excel in quel caso il codice probabilmente dovrà essere rivisto.

    saluti e grazie

  13. #12
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215

    Convalida con valori ricercabili

    Rivedendo il video relativo alle "searchable drop down list", mi sono accorto che sia il video come il programma sono nella versione inglese, allora lo riscritto in italiano, quasi allo stesso modo ;-)
    saluti

  14. I seguenti utenti hanno dato un "Like"


  15. #13
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215

    Convalida con valori ricercabili e lista di valori unici

    Una piccola integrazione, sfruttando le formule di Gerardo, per avere valori unici nel menù a tendina...
    La soluzione con le formule comunque mi sembra molto macchinosa...

  16. #14
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215

    Tabella dati in un foglio e valori filtrati in un'altro - risolto

    ...ho risolto l'ultima delle tre domande iniziali, cioé filtrare i dati in un foglio diverso dal database; vi condivido la soluzione che ho trovato.
    Nel "foglio1" ho dato un nome al "database", nel "foglio2" ho dato un nome ai "filtri" ed ho scritto la macro per sfruttare gli eventi del "foglio2" poi ho leggermente modificato nel codice qualcosina.
    Se duplico il foglio, la macro continua a funzionare e posso fare tutte le ricerche che voglio ;)
    Codice: 
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not (Application.Intersect(Target, ActiveSheet.Range("filtri")) Is Nothing) Then
    Call filtra
    End If
    End Sub
    '-------------------------------------------------------------------------------------------------------------------
    Sub filtra()
    Dim r As Double, n As Double
    '    Application.ScreenUpdating = False
        'applico il filtro al "database" del foglio1 secondo i criteri stabiliti da "filtri"; estraggo record unici
        With Range("filtri").Cells(Range("filtri").Rows.Count, 1).Offset(2, 0).CurrentRegion
            .ClearContents
            .Borders(xlDiagonalDown).LineStyle = xlNone
            .Borders(xlDiagonalUp).LineStyle = xlNone
            .Borders(xlEdgeLeft).LineStyle = xlNone
            .Borders(xlEdgeTop).LineStyle = xlNone
            .Borders(xlEdgeBottom).LineStyle = xlNone
            .Borders(xlEdgeRight).LineStyle = xlNone
            .Borders(xlInsideVertical).LineStyle = xlNone
            .Borders(xlInsideHorizontal).LineStyle = xlNone
        End With
            Worksheets("foglio1").Range("database").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
                "filtri"), CopyToRange:=Range("filtri").Cells(Range("filtri").Rows.Count, 1).Offset(2, 0), Unique:=True
            '   Application.ScreenUpdating = True
            Call liste_uniche
    End Sub
    '-------------------------------------------------------------------------------------------------------------------
    Sub liste_uniche()
        'creo le liste uniche da assegnare ai campi di ricerca dei filtri
        Dim elenco As Range, nome As Range
        Dim col As Collection
        Dim valore As Variant
        Dim lista As String
        
        Dim r As Double
    
        'totale record filtrati
        r = Range("filtri").Cells(2, 1).Offset(2, 0).CurrentRegion.Rows.Count - 1
        For i = 1 To Range("filtri").Columns.Count
            Set col = Nothing
            Set elenco = Range(Range("filtri").Cells(2, i).Offset(2 + 1, 0), Range("filtri").Cells(2, i).Offset(2 + r, 0))
            Set col = New Collection
            On Error Resume Next
            For Each nome In elenco
                col.Add nome.Value, CStr(nome.Value)
            Next
            'due cicli per oridinare i valori della lista con il metodo bubble sort
            For j = 1 To col.Count - 1
                For k = j + 1 To col.Count
                    If col(j) > col(k) Then
                        'memorizza l'elemento minore
                       vTemp = col(k)
                        'rimuove l'elemento minore
                       col.Remove k
                       ' aggiunge l'elemento minore prima dell'elemento maggiore
                       col.Add vTemp, vTemp, j
                    End If
                Next k
            Next j
            'crea la lista degli elementi da assegare alla convalida
            lista = ""
            For Each valore In col
                    lista = lista & valore & ", "
            Next
            'assegna la lista di valori alla cella i-esima di filtro
                With Range("filtri").Cells(2, i).Validation
                        .Delete
                        .Add Type:=xlValidateList, Formula1:=lista
                        .ShowError = False
                End With
        Next i
    End Sub
    :208: :230: :43:
    File Allegati File Allegati

  17. I seguenti utenti hanno dato un "Like"


  18. #15
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215

    ...ma se si volessero filtrare i dati con più condizioni?

    Filtro con risultato somma di due o più condizioni O()
    A
    B
    C
    D
    E
    F
    G
    1
    ID
    Cognome
    Nome
    CAP
    PROV
    CITTA
    INDIRIZZO
    2
    >=ID20
    3
    Castoldi

    Oppure filtro con risultato somma di una condizioni E() e due o più condizione O()
    A
    B
    C
    D
    E
    F
    G
    H
    1
    ID
    ID
    Cognome
    Nome
    CAP
    PROV
    CITTA
    INDIRIZZO
    2
    >=ID20
    <=ID23
    3
    Castoldi

    allora il codice nel foglio2 va scritto così:
    Codice: 
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not (Application.Intersect(Target, ActiveSheet.Range("filtri")) Is Nothing) Then
    Call filtra
    End If
    End Sub
    
    
    Sub filtra()
    '    Application.ScreenUpdating = False
        'applico il filtro al "database" del foglio1 secondo i criteri stabiliti da "filtri"; estraggo record unici
        With Range("filtri").Cells(Range("filtri").Rows.Count, 1).Offset(2, 0).CurrentRegion
            .ClearContents
            .Borders(xlDiagonalDown).LineStyle = xlNone
            .Borders(xlDiagonalUp).LineStyle = xlNone
            .Borders(xlEdgeLeft).LineStyle = xlNone
            .Borders(xlEdgeTop).LineStyle = xlNone
            .Borders(xlEdgeBottom).LineStyle = xlNone
            .Borders(xlEdgeRight).LineStyle = xlNone
            .Borders(xlInsideVertical).LineStyle = xlNone
            .Borders(xlInsideHorizontal).LineStyle = xlNone
        End With
            Worksheets("foglio1").Range("database").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
                "filtri"), CopyToRange:=Range("filtri").Cells(Range("filtri").Rows.Count, 1).Offset(2, 0), Unique:=True
            '   Application.ScreenUpdating = True
            Call liste_uniche
    End Sub
    
    
    Sub liste_uniche()
        'creo le liste uniche da assegnare ai campi di ricerca dei filtri
        Dim elenco As Range, nome As Range
        Dim col As Collection
        Dim valore, vtemp As Variant
        Dim lista As String
        
        Dim r, i, j, k As Long
           
        'totale record filtrati
        r = Range("filtri").Cells(Range("filtri").Rows.Count, 1).Offset(2, 0).CurrentRegion.Rows.Count - 1
        For i = 1 To Range("filtri").Columns.Count
            Set col = Nothing
            Set elenco = Range(Range("filtri").Cells(Range("filtri").Rows.Count, i).Offset(2 + 1, 0), Range("filtri").Cells(Range("filtri").Rows.Count, i).Offset(2 + r, 0))
            Set col = New Collection
            On Error Resume Next
            For Each nome In elenco
                col.Add nome.Value, CStr(nome.Value)
            Next
            'due cicli per oridinare i valori della lista con il metodo bubble sort
            For j = 1 To col.Count - 1
                For k = j + 1 To col.Count
                    If col(j) > col(k) Then
                        'memorizza l'elemento minore
                       vtemp = col(k)
                        'rimuove l'elemento minore
                       col.Remove k
                       ' aggiunge l'elemento minore prima dell'elemento maggiore
                       col.Add vtemp, vtemp, j
                    End If
                Next k
            Next j
            'crea la lista degli elementi da assegare alla convalida
            lista = ""
            For Each valore In col
                    lista = lista & valore & ", "
            Next
            'assegna la lista di valori alla cella i-esima di filtro
                With Range(Range("filtri").Cells(2, i), Range("filtri").Cells(Range("filtri").Rows.Count, i)).Validation
                        .Delete
                        .Add Type:=xlValidateList, Formula1:=lista
                        .ShowError = False
                End With
        Next i
    End Sub
    Buon Natale :251: :211:

  19. I seguenti utenti hanno dato un "Like"


  20. #16
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    Ho segnato la discussione come irrisolta, perché se la colonna non contiene delle stringhe di testo, ma dei numeri, la lista dei valori unici da assegnare alla convalida dati del generico campo non è corretta! :280: mi aiutate a trovare il perché?

  21. #17
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    Credo di aver risolto, in rosso la correzione...
    Codice: 
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not (Application.Intersect(Target, ActiveSheet.Range("filtri")) Is Nothing) Then
    Call filtra
    End If
    End Sub
    
    
    Sub filtra()
    '    Application.ScreenUpdating = False
        'applico il filtro al "database" del foglio1 secondo i criteri stabiliti da "filtri"; estraggo record unici
        With Range("filtri").Cells(Range("filtri").Rows.Count, 1).Offset(2, 0).CurrentRegion
            .ClearContents
            .Borders(xlDiagonalDown).LineStyle = xlNone
            .Borders(xlDiagonalUp).LineStyle = xlNone
            .Borders(xlEdgeLeft).LineStyle = xlNone
            .Borders(xlEdgeTop).LineStyle = xlNone
            .Borders(xlEdgeBottom).LineStyle = xlNone
            .Borders(xlEdgeRight).LineStyle = xlNone
            .Borders(xlInsideVertical).LineStyle = xlNone
            .Borders(xlInsideHorizontal).LineStyle = xlNone
        End With
            Worksheets("foglio1").Range("database").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
                "filtri"), CopyToRange:=Range("filtri").Cells(Range("filtri").Rows.Count, 1).Offset(2, 0), Unique:=True
            '   Application.ScreenUpdating = True
            Call liste_uniche
    End Sub
    
    
    Sub liste_uniche()
        'creo le liste uniche da assegnare ai campi di ricerca dei filtri
        Dim elenco As Range, nome As Range
        Dim col As Collection
        Dim valore, vtemp As Variant
        Dim lista As String
        
        Dim r, i, j, k As Long
           
        'totale record filtrati
        r = Range("filtri").Cells(Range("filtri").Rows.Count, 1).Offset(2, 0).CurrentRegion.Rows.Count - 1
        For i = 1 To Range("filtri").Columns.Count
            Set col = Nothing
            Set elenco = Range(Range("filtri").Cells(Range("filtri").Rows.Count, i).Offset(2 + 1, 0), Range("filtri").Cells(Range("filtri").Rows.Count, i).Offset(2 + r, 0))
            Set col = New Collection
            On Error Resume Next
            For Each nome In elenco
                col.Add nome.Value, CStr(nome.Value)
            Next
            'due cicli per oridinare i valori della lista con il metodo bubble sort
            For j = 1 To col.Count - 1
                For k = j + 1 To col.Count
                    If col(j) > col(k) Then
                        'memorizza l'elemento minore
                       vtemp = col(k)
                        'rimuove l'elemento minore
                       col.Remove k
                       ' aggiunge l'elemento minore prima dell'elemento maggiore
                       col.Add vtemp, CStr(vtemp), CStr(col(j))
                    End If
                Next k
            Next j
            'crea la lista degli elementi da assegare alla convalida
            lista = ""
            For Each valore In col
                    lista = lista & valore & ", "
            Next
            'assegna la lista di valori alla cella i-esima di filtro
                With Range(Range("filtri").Cells(2, i), Range("filtri").Cells(Range("filtri").Rows.Count, i)).Validation
                        .Delete
                        .Add Type:=xlValidateList, Formula1:=lista
                        .ShowError = False
                End With
        Next i
    End Sub

  22. #18
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    Un saluto agli appassionati...
    Mi sono accorto che se un elemento è costituito da un numero con la virgola, nel comporre la stringa di elementi da assegnare alla convalida dati, interpreta la virgola dell'elemento con i decimali come se fosse la virgola di separazione tra elementi. Come potrei risolvere secondo voi?
    Saluti
    Codice: 
     
    For Each valore In col
                    lista = lista & valore & ", "
    Next

  23. #19

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1017
    Versione Office
    .
    Likes ricevuti
    366
    Likes dati
    0
    Ciao,

    Citazione Originariamente Scritto da ggratis Visualizza Messaggio
    Un saluto agli appassionati...
    Mi sono accorto che se un elemento è costituito da un numero con la virgola, nel comporre la stringa di elementi da assegnare alla convalida dati, interpreta la virgola dell'elemento con i decimali come se fosse la virgola di separazione tra elementi. Come potrei risolvere secondo voi?
    Saluti
    Codice: 
     
    For Each valore In col
                    lista = lista & valore & ", "
    Next
    Potresti allegare il file aggiornato così evito di usarne uno sbagliato (non ho seguito il thread ...).
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e 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)

  24. #20
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    Ciao,



    Potresti allegare il file aggiornato così evito di usarne uno sbagliato (non ho seguito il thread ...).
    Me ne sono accorto guardando il campo ore di questo file
    http://www.forumexcel.it/forum/attac...6&d=1451850367
    Grazie

  25. #21
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    Ciao,
    nessuna idea per risolvere questo problema? ...bisogna necessariamente utilizzare un foglio di appoggio da tenere nascosto, e assegnare alla convalida il relativo range di celle?
    saluti

  26. #22

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    4016
    Versione Office
    2013
    Likes ricevuti
    1225
    Likes dati
    923
    Citazione Originariamente Scritto da ggratis Visualizza Messaggio
    Ciao,
    nessuna idea per risolvere questo problema? ...bisogna necessariamente utilizzare un foglio di appoggio da tenere nascosto, e assegnare alla convalida il relativo range di celle?
    saluti
    Ciao,
    sinceramente anche io non avevo più seguito la discussione e mi trovo un pò in difficoltà a capire quale sia il problema.

    Tu parli di numeri con la virgola ma nell'ultimo file allegato non ve ne sono :171:
    Non potresti essere più specifico (senza dovermi leggere tutta la discussione e controllare gli allegati)?
    O ancora meglio, perchè non apri una nuova discussione per quello che riguarda solamente questo "problema"?!?
    Secondo me, molti (me compreso) si scoraggiano sin da subito sapendo di dover leggere tutta la discussione solo per capire di cosa stai parlando :227:

    "Sono le persone che nessuno immagina che possano fare certe cose, quelle che fanno cose che nessuno può immaginare."

  27. #23
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    Ciao cromagno,
    nell'ultimo file allegato il problema si pone nel creare la lista unica del campo ore sulle macchine in cui è settato come separatore decimale la virgola e non il punto (non avevo pensato a questa doppia situazione).
    Per fare un esempio più specifico, riposto il file inserendo nella cella "Foglio1!C2" il valore "via Col Vento, 45".
    Ora, se si seleziona il menù a discesa della cella "'report appuntamenti'!C2", invece del valore unico "via Col Vento, 45", compaiono nello specifico i valori "via Col Vento" e "45".
    Questo perché una volta creata la collection dei valori unici "col" (vedi il codice del post #17) sfruttando il ciclo
    Codice: 
    On Error Resume Next
    For Each nome In elenco
         col.Add nome.Value, CStr(nome.Value)
    Next
    quando poi creo la stringa dei valori unici "lista" con gli elementi della collection "col"
    Codice: 
    For Each valore In col
                    lista = lista & valore & ", "
    Next
    da assegnare alla convalida
    Codice: 
            'assegna la lista di valori alla cella i-esima di filtro
                With Range(Range("filtri").Cells(2, i), Range("filtri").Cells(Range("filtri").Rows.Count, i)).Validation
                        .Delete
                        .Add Type:=xlValidateList, Formula1:=lista
                        .ShowError = False
                End With
    se la variabile "valore" contiene la virgola "," mi crea il problema.

    Intanto spero di essere stato più chiaro, poi semplificando vedrò di aprire una nuova discussione specifica sull'argomento, come hai suggerito.

    grazie, ciao
    File Allegati File Allegati

  28. #24

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    4016
    Versione Office
    2013
    Likes ricevuti
    1225
    Likes dati
    923
    Ciao ggratis,
    le ho provate tutte...nomi definiti, Evaluate, chr(34), etc....
    ma senza avere un range "fisicamente nel foglio" (come hai detto) non son riuscito a non fargli vedere quella "virgola" (,) come un separatore.

    Spero che qualcuno riesca a darci una dritta :292:

    "Sono le persone che nessuno immagina che possano fare certe cose, quelle che fanno cose che nessuno può immaginare."

  29. #25

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    4016
    Versione Office
    2013
    Likes ricevuti
    1225
    Likes dati
    923
    Yesss,
    ritiro tutto...alla fine ci son riuscito (credo e spero).... :300:

    ho modificato le righe di codice "incriminate" in questo modo:

    Codice: 
    'crea la lista degli elementi da assegare alla convalida
            lista = ""
            For Each valore In col
                lista = lista & Chr(34) & valore & Chr(34) & ";"
            Next
            lista = Replace(Replace(lista & "#", ";#", ""), Chr(34), "")
            'assegna la lista di valori alla cella i-esima di filtro
                With Range(Range("filtri").Cells(2, i), Range("filtri").Cells(Range("filtri").Rows.Count, i)).Validation
                        .Delete
                        .Add Type:=xlValidateList, Formula1:=lista
                        .ShowError = False
                End With
    File Allegati File Allegati

    "Sono le persone che nessuno immagina che possano fare certe cose, quelle che fanno cose che nessuno può immaginare."

  30. #26
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    Ciao cromagno,
    intanto un ringraziamento doppio vista l'ora del tuo post.
    però in questo modo, il risultato che ottengo sulla mia macchina :292: è questo che riporto nelle foto...:62:


  31. #27

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    4016
    Versione Office
    2013
    Likes ricevuti
    1225
    Likes dati
    923
    Citazione Originariamente Scritto da ggratis Visualizza Messaggio
    Ciao cromagno,
    intanto un ringraziamento doppio vista l'ora del tuo post.
    però in questo modo, il risultato che ottengo sulla mia macchina :292: è questo che riporto nelle foto...:62:
    Cavolo...
    hai ragione.
    Riaprendo il file mi da lo stesso errore... ma giuro che stanotte funzionava :93::292:

    Scusa, proverò ancora... non me lo spiego (forse stanotte stavo sognando ad occhi aperti :277:).

    "Sono le persone che nessuno immagina che possano fare certe cose, quelle che fanno cose che nessuno può immaginare."

  32. #28
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    Giusto per chiudere la discussione, non avendo trovato una soluzione al problema della virgola che ho evidenziato nel post #23, allego una soluzione che risolve il problema utilizzando un foglio di appoggio "unici" per la costruzione delle liste uniche. Il foglio "unici" l'ho nascosto.
    A chi interessasse questo è il codice che ho scritto.
    Modulo1:
    Codice: 
    Sub filtra()
        'applico il filtro al "database"  secondo i criteri stabiliti da "filtri"; estraggo record unici
        With Range("filtri").Cells(Range("filtri").Rows.Count, 1).Offset(2, 0).CurrentRegion
            .ClearContents
            .Borders(xlDiagonalDown).LineStyle = xlNone
            .Borders(xlDiagonalUp).LineStyle = xlNone
            .Borders(xlEdgeLeft).LineStyle = xlNone
            .Borders(xlEdgeTop).LineStyle = xlNone
            .Borders(xlEdgeBottom).LineStyle = xlNone
            .Borders(xlEdgeRight).LineStyle = xlNone
            .Borders(xlInsideVertical).LineStyle = xlNone
            .Borders(xlInsideHorizontal).LineStyle = xlNone
        End With
            Range("database").AdvancedFilter Action:=xlFilterCopy, _
                CriteriaRange:=Range("filtri"), _
                CopyToRange:=Range("filtri").Cells(Range("filtri").Rows.Count, 1).Offset(2, 0), _
                Unique:=True
        Call liste_uniche
    End Sub
    
    
    Sub liste_uniche()
    'creo le liste dei valori unici che sono riportate nel foglio unici
    Dim elenco As Range
    Dim r As Long, i As Long
    With Worksheets("unici").Range("A1").CurrentRegion
            .ClearContents
            .Borders(xlDiagonalDown).LineStyle = xlNone
            .Borders(xlDiagonalUp).LineStyle = xlNone
            .Borders(xlEdgeLeft).LineStyle = xlNone
            .Borders(xlEdgeTop).LineStyle = xlNone
            .Borders(xlEdgeBottom).LineStyle = xlNone
            .Borders(xlEdgeRight).LineStyle = xlNone
            .Borders(xlInsideVertical).LineStyle = xlNone
            .Borders(xlInsideHorizontal).LineStyle = xlNone
    End With
    For i = 1 To Range("database").Columns.Count
        Set elenco = Range("filtri").Cells(Range("filtri").Rows.Count, 1).Offset(2, 0).CurrentRegion.Range(Cells(1, i), Cells(Range("filtri").Cells(Range("filtri").Rows.Count, 1).Offset(2, 0).CurrentRegion.Rows.Count, i))
        If elenco.Rows.Count > 1 Then
            elenco.AdvancedFilter Action:=xlFilterCopy, _
                CriteriaRange:="", _
                CopyToRange:=Worksheets("unici").Cells(1, i), _
                Unique:=True
        End If
    Next i
    Call ordina
    End Sub
    
    
    Sub ordina()
    'ordino le liste dei valori unici del foglio unici
    Dim rngCampo
    Dim wshCorrente As String
    wshCorrente = ActiveSheet.Name
    Worksheets("unici").Activate
    For i = 1 To Range("database").Columns.Count
            rngCampo = Worksheets("unici").Cells(1, i).Address
            Worksheets("unici").Range(Range(rngCampo), Range(rngCampo).End(xlDown)).Activate
            Worksheets("unici").Sort.SortFields.Clear
            Worksheets("unici").Sort.SortFields.Add Key:=Range(rngCampo), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortTextAsNumbers
            With Worksheets("unici").Sort
                    .SetRange Range(Range(rngCampo), Range(rngCampo).End(xlDown))
                    .Header = xlYes
                    .MatchCase = False
                    .Orientation = xlTopToBottom
                    .SortMethod = xlStroke
                    .Apply
            End With
    Next i
    Worksheets(wshCorrente).Activate
    Call convalida
    End Sub
    
    
    Sub convalida()
    'assegno ai campi di filtro dei fogli di ricerca i corrispondenti falori unici
    Dim i As Long
    Dim campo As Variant, c As Range
    Dim wshCorrente As String
    wshCorrente = ActiveSheet.Name
    For i = 1 To Range("filtri").Columns.Count Step 1
        campo = Range("filtri").Offset(0, i - 1).Value
        Worksheets("unici").Activate
        With Worksheets("unici").Range(Cells(1, 1), Cells(1, Range("database").Columns.Count))
            Set c = .Find(campo, LookIn:=xlValues, LookAt:=xlWhole)
            If Not c Is Nothing Then
                firstAddress = c.Address
                Do
                    Worksheets(wshCorrente).Activate
                    With Range(Range("filtri").Cells(2, i), Range("filtri").Cells(Range("filtri").Rows.Count, i)).Validation
                            .Delete
                            .Add Type:=xlValidateList, Formula1:="=unici!" & Range(c.Cells.Offset(1, 0), c.Cells.End(xlDown)).Address
                            .ShowError = False
                    End With
                Loop While Not c Is Nothing And c.Address <> firstAddress
            End If
        End With
    Next i
    End Sub
    le sub sono attivate da un evento _Change del foglio di ricerca.
    Sul foglio ricerca:
    Codice: 
    Private Sub Worksheet_Change(ByVal Target As Range)
            If Not (Application.Intersect(Target, ActiveSheet.Range("filtri")) Is Nothing) Then
            Application.ScreenUpdating = False
            Sheets("unici").Visible = True
            Call filtra
            Sheets("unici").Visible = False
            Application.ScreenUpdating = True
            End If
    End Sub
    Quando ci sono più fogli di ricerca passando da un foglio all'altro, per aggiornare le liste dei menù a tendina, va fatto scattare l'evento _change attivando una cella "filtri".
    File Allegati File Allegati

  33. #29

    L'avatar di cromagno
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Sardegna
    Età
    37
    Messaggi
    4016
    Versione Office
    2013
    Likes ricevuti
    1225
    Likes dati
    923
    Citazione Originariamente Scritto da ggratis Visualizza Messaggio
    Giusto per chiudere la discussione, non avendo trovato una soluzione al problema della virgola che ho evidenziato nel post #23, allego una soluzione che risolve il problema utilizzando un foglio di appoggio "unici" per la costruzione delle liste uniche. Il foglio "unici" l'ho nascosto.
    A chi interessasse questo è il codice che ho scritto.....
    Grazie della condivisione :246:
    Ho provato ancora a risolvere quel "problema" della virgola ma non ho cavato nessun ragno dal buco :240:

    "Sono le persone che nessuno immagina che possano fare certe cose, quelle che fanno cose che nessuno può immaginare."

  34. #30
    L'avatar di ggratis
    Clicca e Apri
    Data Registrazione
    Sep 2015
    Località
    Lecce - Pisa
    Età
    45
    Messaggi
    737
    Versione Office
    Excel 2010
    Likes ricevuti
    257
    Likes dati
    215
    Citazione Originariamente Scritto da cromagno Visualizza Messaggio
    Grazie della condivisione :246:
    Ho provato ancora a risolvere quel "problema" della virgola ma non ho cavato nessun ragno dal buco :240:
    Ciao Cromagno,
    grazie per i tentativi, io credo che, gestendo una stringa, se in vba non c'è un modo per distinguere il carattere "," dal separatore di argomenti (,) e che se questa cosa non possa essere letta dalla convalida, il problema con il metodo precedente non ha soluzione. In altri linguaggi questa doppia funzione della virgola è possibile" taggando" il carattere in un modo particolare; in vba questa possibilità non l`ho trovata.
    Saluti

Discussioni Simili

  1. [Risolto] Ricerca elementi tra due colonne
    Di gian_983 nel forum Domande su Excel in generale
    Risposte: 10
    Ultimo Messaggio: 06/01/17, 10:50
  2. [Risolto] Conteggiare elementi di un database presenti in un foglio diverso
    Di SpezzaKorna nel forum Domande su Excel in generale
    Risposte: 3
    Ultimo Messaggio: 22/12/16, 00:51
  3. [Risolto] Ricerca in database
    Di vittorio dit nel forum Domande su Excel in generale
    Risposte: 25
    Ultimo Messaggio: 06/11/16, 17:51
  4. Ricerca in un database del prezzo più basso
    Di Bicuccio nel forum Domande su Excel in generale
    Risposte: 12
    Ultimo Messaggio: 26/01/16, 11:35
  5. Ricerca all'interno di un database
    Di John nel forum Domande su Excel VBA e MACRO
    Risposte: 6
    Ultimo Messaggio: 07/10/15, 14:49

Tag per Questa Discussione

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •