Problema Indiceconfronta



  • Problema Indice+confronta
    di TommyLB (utente non iscritto) data: 12/09/2013 10:15:57

    Ciao a tutti.
    Mi trovo davanti due tabelle del genere seguente:



    marco giallo
    luca rosso
    antonio verde
    andrea giallo
    giovanni giallo
    camillo rosso
    tommaso verde
    enrico porpora


    x giallo
    x rosso
    x nero
    x verde
    (porpora)<-questa la tengo nascosta, non serve che si veda

    Con in X =INDICE(A:B;CONFRONTA(D1;B:B;0);1) , in modo che mi dia come risultato il primo nome dall'alto associato ad un particolare colore. In pratica, nella tabella due, avrò l'elenco dei colori con associati (in x) i nomi delle persone più inalto nella tabella per ciascun colore.

    Problema:
    Dovendo mantenere identica la classificazione della tabella 1, si da il caso che rosso e porpora abbiano nomi diversi ma siano la stessa cosa (porpora sarebbe una variante di rosso) per i miei scopi: questo significa che nella tabella 2 comparirà solo il nome del primo tra rosso e porpora (ciò significa che se il primo è associato a porpora, non ci sarà nessun ''miglior'' rosso).
    In pratica vorrei che se la tabella 1 fosse così:

    marco giallo
    luca rosso
    antonio verde
    andrea giallo
    giovanni giallo
    camillo rosso
    tommaso verde
    enrico porpora

    La due sarebbe così:

    x giallo
    luca rosso
    x nero
    x verde

    Ma se la 1 fosse così

    enrico porpora
    marco giallo
    luca rosso
    antonio verde
    andrea giallo
    giovanni giallo
    camillo rosso
    tommaso verde

    La due sarebbe così:

    x giallo
    enrico porpora
    x nero
    x verde

    In ogni caso, se nella tabella 1 non avessi inserito nulla, la tabella 2 sarebbe comunque così:
    x giallo
    x rosso
    x nero
    x verde


    Si può fare?
    Se non si può, come posso aggirare in maniera elegante il mio problema?

    Grazie mille per le risposte.



  • di Vecchio Frac data: 12/09/2013 10:45:25

    In pratica tu vuoi il dato associato a un colore.
    Non ha importanza quale colore scrivi, viene sempre restituito il primo valore trovato.
    E' logico però che nella tabella dei colori devi scrivere anche porpora altrimenti questo dato non verrà mai cercato. Tu volevi che automagicamente venisse modificato in tabella due il valore "rosso" in "porpora" se in tabella uno esiste un porpora prima di un rosso? bè, lasciati dire che non ha molto senso così ^_^
    Io ti propongo questa semplice function personalizzata, da inserire in un modulo e da richiamare al posto di INDICE e CONFRONTA:
    =corrispondente(D1)
    da trascinare per tutta la tabella colori.
     
    Option Explicit
    
    Function corrispondente(s As String) As String
    Dim c As Range
        
        Set c = [B:B].Find(s, LookAt:=xlWhole)
        If c Is Nothing Then
            corrispondente = "Not found"
            Exit Function
        End If
        
        corrispondente = c.Offset(, -1)
        
    End Function






  • di TommyLB (utente non iscritto) data: 12/09/2013 10:53:09

    Non so usare VBA purtroppo.

    Non ho capito come inserire e dove la funzione da te proposta.

    Da quanto ho capito, devo mantenere il colore porpora nell'elenco (ma posso renderlo invisibile senza problemi), ma posso accanto a rosso far comparire il nome associato più alto tra rosso e porpora, giusto?

    Non potresti spiegare come fare passo a passo, 4 dubbies?

    Grazie mille



  • di Vecchio Frac data: 12/09/2013 11:08:13

    In attesa di un qualche esperto di formule ^_^
    Nel tuo file Excel:
    - Alt-F11 attiva l'editor di codice
    - menu Inserisci > Modulo
    - copia e incolla il codice che ti ho scritto
    - ritorna al foglio di lavoro (premi di nuovo Alt-F11, oppure Alt-F4 per chiudere l'editor)

    E' tutto. Adesso puoi utilizzare questo codice come fosse una normale formula, quindi puoi scrivere il nome della Function in una cella premettendo il segno di uguale; la Function si aspetta un parametro che corrisponde alla cella che contiene un colore; non fa altro che cercare quel colore in colonna B e restituire il nome della prima corrispondenza trovata. Se la tabella colori è in D, in C1 scrivi
    =corrispondente(D1)
    e trascina verso il basso.
    Se un colore non è rinvenuto ti esce la scritta Not Found (che puoi modificare a piacimento).





  • di TommyLB (utente non iscritto) data: 12/09/2013 11:36:28

    Ovviamente non mi gira :D
    La colonna A (il nome della persona con associato il colore):
    foglio1!$B$3:foglio1!$B$100
    La colonna B (il colore associato alla persona):
    foglio1!$C$3:foglio1!$C$100
    La colonna C (le persone prime nell'elenco):
    foglio2!$B$9:foglio2!$B$27
    La colonna D (i colori):
    foglio2!$C$9:foglio2!$C$27

    nel dettaglio, nel foglio2 il colore c10 ha come derivato c27, c19 ha come derivato c26 e c20 ha come derivato c25. (Nell'esempio di prima, porpora sarebbe il derivato di rosso).
    Mettendo in b9 la formula =corrispondente(c9), pur appurato che i fattori per cui compaia esistono (esiste un nome associato al colore c9), mi da errore.

    Sotto riporto quello che ho scritto in VBA. Dove ho sbagliato?



     
    Option Explicit
    
    Function corrispondente(s As String) As String
    Dim c As Range
        
        Set c = [foglio1!$C$3:foglio1!$C$100].Find(s, LookAt:=xlWhole)
        If c Is Nothing Then
            corrispondente = 0
            Exit Function
        End If
        
        corrispondente = c.Offset(, -1)
        
    End Function