doppioni combobox



  • doppioni combobox
    di Salvo (utente non iscritto) data: 22/10/2013 11:28:55

    Salve a tutti, ho un file in excell lunghissimo nella colonna G è presente un elenco che va da G2 a G100, adesso ho creato una userform ed all'interno ho messo una combobox e nella rowsource (della combobox) ho inserito il range G2:G100 fin qui nessun problema, adesso però ho notato che alcune voci si ripetono esempio nel range ci sono più voci uguali (bottiglia,bicchieri...) è giustamente nella combobox si vede "piatti,bottiglia,bottiglia,bottiglia,bottiglia,forchette,bicchieri,bicchieri,tovaglioli...." come posso fare a far si che non vengano visualizzati i doppioni presenti nel range e quindi un semplice elenco tipo "piatti,bottiglia,forchette,bicchieri,tovaglioli....."

    Grazie Salvatore



  • di gaetanopr data: 22/10/2013 13:28:54

    Ciao salvo ti allego un esempio di come popolare una combobox tramite una collection,in modo da eliminare i doppi, che prende i dati dalla colonna G fino all'ultima riga compilata



  • di Salvo (utente non iscritto) data: 22/10/2013 13:49:29

    Ei grazie il file è PERFETTO sei un grande!!!!!!, senti potresti "insegnarmi" dove devo andare a modificare se volessi che il range di ricerca nel foglio excel fosse un altro? (cioè invece che nella colonna G fosse un altro tipo intervallo C10 : C90). e se a sto punto esiste un modo per metterli in ordine alfabetico?

    Grazie anticipatamente Salvatore




  • di Vecchio Frac data: 22/10/2013 13:57:23

    Con Excel 2007, un trucco molto figo è questo ^_^

    Per l'ordinamento puoi effettuare un Sort prima di assegnare al combobox.
     
    Private Sub UserForm_Activate()
        [G2:G100].RemoveDuplicates Columns:=Array(1), Header:=xlNo    
        ComboBox1.RowSource = "G2:G100"
    End Sub






  • di gaetanopr (utente non iscritto) data: 22/10/2013 13:58:45

    Ciao Salvo
    Uriga = Worksheets("Foglio1").Cells(Rows.Count, "G").End(xlUp).Row
    invece di G indichi un'altra colonna.
    For i = 2 To Uriga
    invece di 2 indichi il numero di riga da dove iniziare.
    Per quanto riguarda l'ordinamento, prova a fare da solo, prima di aprire l'userform ordina i dati in maniera crescente, magari puoi registrarti una macro che richiami all'inizio.
    esempio dopo
    Dim Uriga As Long, i As Long
    Call macroregistrataordinamento

    Prova da solo sicuramente ci riuscirai, ELSE siamo qua
     
    Private Sub UserForm_Activate()
      Dim Arr As Collection
      Dim Uriga As Long, i As Long
      
      Set Arr = New Collection
      
      Uriga = Worksheets("Foglio1").Cells(Rows.Count, "G").End(xlUp).Row
      On Error Resume Next
      For i = 2 To Uriga
        With Worksheets("Foglio1").Cells(i, "G")
          Arr.Add .Value, .Text
          If Err.Number = 0 Then
            Me.ComboBox1.AddItem .Text
          Else
            Err.Clear
          End If
        End With
      Next i
      Set Arr = Nothing
    End Sub
    



  • di mb data: 22/10/2013 14:25:22

    ciao a tutti e buon pomeriggio
    gentilissimo gaetanopr nella tua sub gentilmente mi potresti spiegare dove viene evitato l'inserimento dei doppioni
    in quella di v.f è più facile x me che conosco pochissimo vba capire che con la
    RemoveDuplicates
    toglie i duplicati ma nella tua mi sfugge il "particolare"
    grazie come sempre a te e a tutti per la disponibilità
    p.s c'è la possibilità con il fasto F1 di avere una spiegazione su come funziona
    Arr.Add .Value, .Text

    ri....grazie



  • di Salvo (utente non iscritto) data: 22/10/2013 14:41:13

    Grazie gaetanopr ho utilizzato il registratore di cacro e ho messo il codice datomi adesso è in ordine alfabetico, ed ho capito anche come fare il riferimento per cambiare il range

    Vecchio Frac son interessatissimo anche a capire bene quel codice che mi hai gentilmente fornito, dove dovrei inserirlo all'apertura della form o direttamente nella combobox?

    grazie a tutti Salvatore



  • di gaetanopr data: 22/10/2013 14:51:46

    Per capire come inserire i dati non ripetuti bisogna introdurre l'uso delle collection(collezioni)
    La Collection ha due tipi di indice, uno numerico quindi 0,1,2,3 e uno di tipo stringa(Foglio1, Foglio2)
    Premessa entrambi devono essere univoci

    Se avessi scritto
    Arr.Add .Value
    avrei aggiunto alla collection i valori e vba avrebbe provveduto a inserire l'indice univoco, in questo caso numerico con la conseguenza di prelevare tutti i dati anche i doppi
    invece
    Arr.Add .Value , .Text
    il secondo argomendo indica proprio l'indice che è una stringa uguale al valore aggiunto, quindi appena vado ad aggiungere un duplicato e vado ad assegnare un indice stringa già presente il programma va in errore e non memorizza il duplicato
    In soccorso ci viene la gestione degli errori in modo da proseguire senza interruzioni
    In questo caso l'errore specifico è 457, quindi tramite if then diciamo se errore 0 aggiungi al combo altrimenti non aggiungere.


    esempio con INDICE NUMERICO
    valore indice
    sedia - indice(0)
    sedia - indice(1)indice non duplicato con due elementi doppi

    con INDICE STRINGA
    sedia - indice(sedia)
    sedia - indice(sedia)indice duplicato non ammesso

    Spero che sia stato chiaro, io purtroppo con le spiegazioni sono negato



  • di Vecchio Frac data: 22/10/2013 15:04:00

    cit. "Spero che sia stato chiaro, io purtroppo con le spiegazioni sono negato"
    ---> Invece direi che ti sei spiegato bene ^_^ anche perchè l'argomento è complesso e meriterebbe degli approfondimenti.

    Preciso solo che dei due parametri di una Collection, il primo è obbligatorio, il secondo è opzionale (Item e Key rispettivamente):
    "Arr.Add .Value" -_> sarebbe sufficiente ma per gli scopi della function è importante che ci sia anche il secondo perchè la partita si gioca sul fatto che nella Collection non possono esserci elementi con Key uguale, si genera errore, l'errore viene intercettato e gestito come ha spiegato gaetanopr.

    Per certi scopi più flessibili si usa un Dictionary.

    cit. "son interessatissimo anche a capire bene quel codice che mi hai gentilmente fornito, dove dovrei inserirlo all'apertura della form o direttamente nella combobox?"
    ---> Quel codice sostituisce interamente l'evento UserForm_Initialize (vedi la firma della procedura?) e quindi va inserito nel foglio codice dell'userform. Purtroppo questo comando non è disponibile per versioni di Excel inferiori alla 2007 e bisogna arrangiarsi con trucchi simili a quelli di Gaetano.





  • di mb data: 22/10/2013 15:09:05

    Che dire sentiti ringraziamenti ai professori
    alla prossima



  • di Vecchio Frac data: 22/10/2013 15:09:11

    Esempio con un Dictionary (grazie "nick r" ^_^) che come vedi espone l'utilissimo metodo Exists che etsta l'esistenza di una chiave nel dizionario.
     
    Function NoDuple_Dic(arr()) As Variant()
    'by "nick r"
    Dim Dic As Object
    Dim t
    
    'passando una matrice, restituisce un vettore
    'con i soli valori non duplicati
    'utilizza un dictionary
    
        Set Dic = CreateObject("Scripting.Dictionary")
        For Each t In arr
            If Dic.Exists(t) = False Then Dic.Add t, 0
        Next
        NoDuple_Dic = Dic.keys
    End Function






  • di Vecchio Frac data: 22/10/2013 15:10:27

    Edit.
    cit. "etsta "
    ---> "testa" (come quella che non ho)


    cit. "ringraziamenti ai professori"
    ---> LOL ^_^





  • di Fabrizio (utente non iscritto) data: 26/11/2013 16:45:30

    Salve Ragazzi riprendo questa discussione perchè ho un problema. Sto creando un programma in VBA che legge i dati dalle varie colonne del foglio excel e popolata i dati di diverse combobox.
    Il problema è che sono riuscito a fare la lettura dinamicamente a ordinare i valori ma non riesco a rimuovere i duplicati. Ho provato ad modificare il programma prendendo spunto dalle vostre risposte ma non ci sono riuscito:

    Il codice che ho implementato è il seguente:

    Grazie in anticipo.
     
     Dim UltimaRiga
     UltimaRiga = ws.Range("E3").End(Microsoft.Office.Interop.Excel.XlDirection.xlDown).Row
    
     For index As Integer = 3 To UltimaRiga
    
                ComboBox1.Items.Add(ws.Cells(index, 8).value)
                ComboBox1.Items.Add(ws.Cells(index, 8).value)
                ComboBox2.Items.Add(ws.Cells(index, 5).value)
                ComboBox3.Items.Add(ws.Cells(index, 6).value)
                ComboBox4.Items.Add(ws.Cells(index, 7).value)
                ComboBox5.Items.Add(ws.Cells(index, 9).value)
    
                ComboBox1.Sorted = True
                ComboBox2.Sorted = True
                ComboBox3.Sorted = True
                ComboBox4.Sorted = True
                ComboBox5.Sorted = True
     Next index
    
    



  • di fabrizio (utente non iscritto) data: 26/11/2013 20:00:34

    Non capisco se dopo aver fatto la lettura con il codice riportato sopra, dopo posso fare un ciclo che mi elimina tutti i duplicanti scorrendo tutti gli elementi della combobox. qualcosa del tipo
     
    Dim i As Long
    
    For i = Combo1.ListCount - 1 to 1 Step -1
      If Combo1.List(i) = Combo1.List(i - 1) Then ' add UCase$ or LCase$ if you care about case
        Combo1.RemoveItem i
      End If
    Next i



  • di UltraSurf data: 26/11/2013 21:40:23

    Scusate ragazzi c'è qualche problema? Forse dovrei aprire una nuova discussione?



  • di Vecchio Frac data: 26/11/2013 21:49:02

    Se UltraSurf è Fabrizio:
    non c'è nessun problema nel collegarsi a una discussione precedente. La problematica è analoga a quella della discussione originale. Forse però il tuo quesito meritava dignità di discussione autonoma ^_^
    In ogni caso se non hai ancora ricevuto risposte, porta pazienza e qualcuno risponderà certamente.
    Io per esempio stavo pensando che forse serve impostare diversamente l'approccio al riempimento delle combo, controllando nel contempo i doppioni.
    Se hai un file di esempio da allegare forse è meglio.






  • di UltraSurf data: 26/11/2013 21:58:16

    Ciao Franc e grazie per la risposta. Si Fabrizio è UltraSurf


    Per quanto riguarda il file da allegare prova a spiegarlo io ed eventualmente se ci sono problemi allego il file per fare più chiarezza.
    Considerate che ho una colonna intera ad esempio "A" o "B" dove ci sono inseriti dei nomi (marco, fabrizio,fabio,giuseppe,marco,fabio ecc) e devo importare questi dati in una combobox ordinandoli e rimuovendo i duplicati. ora sono riuscito a fare le prime due cose con il codice che ho postato ma per rimuovere i duplicati non ho implementato nulla che funzioni.

    Ho pensato ora ma se provo ad importare tutti i dati delle varie celle in un vettore e poi ordinare e eliminare i duplicati e popolare la mia combobox??

    Grazie per eventuali risposte/suggerimenti



  • di Vecchio Frac data: 26/11/2013 22:12:09

    Ma la function che ho postato io, NoDuple_Dic() che riceve un vettore in ingresso, l'hai provata?

     
    Option Explicit
    
    Sub test()
    Dim v As Variant, r As Range, arr() As Variant, i As Integer
    Dim f As Variant
        
        Set r = [a1:a10]
        ReDim arr(r.Count)
        For Each v In r
            arr(i) = v
            i = i + 1
        Next
        f = NoDuple_Dic(arr)
        
        For Each v In f
            Debug.Print v
        Next
    End Sub
    
    
    Function NoDuple_Dic(arr()) As Variant()
    'by "nick r"
    Dim Dic As Object
    Dim t
    
    'passando una matrice, restituisce un vettore
    'con i soli valori non duplicati
    'utilizza un dictionary
    
        Set Dic = CreateObject("Scripting.Dictionary")
        For Each t In arr
            If Dic.Exists(t) = False Then Dic.Add t, 0
        Next
        NoDuple_Dic = Dic.keys
    End Function