Domanda

Conosci un modo in Excel per " calcola " per formula un elenco di valori univoci?

Ad esempio: un intervallo contiene valori "red" , "blue" , "green" , < strong> "black" , "red , <=>
e voglio avere come risultato <=> , <=> , <=> , <=> + eventualmente altre 2 celle vuote.

Ho già trovato un modo per ottenere un elenco ordinato calcolato usando SMALL o LARGE combinato con INDEX, ma mi piacerebbe avere anche questo ordinamento calcolato, SENZA UTILIZZARE VBA.

È stato utile?

Soluzione

Questo è un vecchio, e ci sono alcune soluzioni là fuori, ma ho trovato una formula più breve e più semplice rispetto a qualsiasi altra che abbia mai incontrato, e potrebbe essere utile a chiunque passi.

Ho chiamato l'elenco dei colori Colors (A2: A7) e la formula di matrice inserita nella cella C2 è questa ( fisso ):

=IFERROR(INDEX(Colors,MATCH(SUM(COUNTIF(C$1:C1,Colors)),COUNTIF(Colors,"<"&Colors),0)),"")

Usa Ctrl+Shift+Enter per inserire la formula in C2 e copia C2 in C3: C7 .

Spiegazione con i dati di esempio {" rosso " ;; & Quot; & Blu quot ;; & Quot; & Rosso quot ;; & Quot; & Verde quot ;; & Quot; & Blu quot ;; &; & Quot nero quot;}:

  1. COUNTIF(Colors,"<"&Colors) restituisce un array (# 1) con il conteggio di valori più piccoli di ogni elemento nei dati {4; 1; 4; 3; 1; 0} (nero = 0 elementi più piccoli, blu = 1 oggetto, rosso = 4 articoli). Questo può essere tradotto in un valore di ordinamento per ciascun elemento.
  2. COUNTIF(C$1:C...,Colors) restituisce un array (# 2) con 1 per ogni elemento di dati che è già nel risultato ordinato. In C2 restituisce {0; 0; 0; 0; 0; 0} e in C3 {0; 0; 0; 0; 0; 1} perché & Quot; nero & Quot; è il primo nell'ordinamento e l'ultimo nei dati. In C4 {0; 1; 0; 0; 1; 1} indica & Quot; nero & Quot; e tutte le occorrenze di " blue " sono già presenti.
  3. SUM restituisce il k-es valore di ordinamento, contando tutte le occorrenze di valori più piccoli che sono già presenti (somma dell'array n. 2).
  4. MATCH trova il primo indice del k-esimo valore di ordinamento (indice nella matrice n. 1).
  5. IFERROR serve solo a nascondere l'errore #N/A nelle celle inferiori, quando l'elenco univoco ordinato è completo.

Per sapere quanti elementi unici hai, puoi utilizzare questa formula regolare :

=SUM(IF(FREQUENCY(COUNTIF(Colors,"<"&Colors),COUNTIF(Colors,"<"&Colors)),1))

Altri suggerimenti

Ok, ho due idee per te. Spero che uno di loro ti porti dove devi andare. Si noti che il primo ignora la richiesta di eseguire questa operazione come formula poiché tale soluzione non è carina. Ho pensato di assicurarmi che il modo semplice non funzionasse davvero per te; ^).

Utilizza il comando Filtro avanzato

  1. Seleziona l'elenco (o posiziona la tua selezione in qualsiasi punto all'interno dell'elenco e fai clic su OK se viene visualizzata la finestra di dialogo lamentandoti che Excel non sa se l'elenco contiene intestazioni o meno)
  2. Scegli Dati / Filtro avanzato
  3. Scegli " Filtra l'elenco, sul posto " oppure " Copia in un'altra posizione "
  4. Fai clic su " Solo record univoci "
  5. Fai clic su OK
  6. Hai finito. Viene creato un elenco univoco sul posto o in una nuova posizione. Nota che puoi registrare questa azione per creare uno script VBA a una riga per farlo che potrebbe quindi essere generalizzato per funzionare in altre situazioni per te (ad esempio senza i passaggi manuali sopra elencati).

Uso delle formule (nota che sto lavorando sulla soluzione Locksfree per finire con un elenco senza buchi)

Questa soluzione funzionerà con le seguenti avvertenze:

  • L'elenco deve essere ordinato (crescente o decrescente non importa). In realtà è abbastanza preciso in quanto il requisito è che tutti gli articoli simili devono essere contigui, ma l'ordinamento è il modo più semplice per raggiungere quello stato.
  • Sono necessarie tre nuove colonne (due nuove colonne per i calcoli e una nuova colonna per il nuovo elenco). La seconda e la terza colonna potrebbero essere combinate ma la lascerò come un esercizio al lettore.

    Ecco il riassunto della soluzione:

    1. Per ogni elemento nell'elenco, calcola il numero di duplicati sopra di esso.
    2. Per ogni posizione nell'elenco univoco, calcola l'indice dell'elemento univoco successivo.
    3. Infine, usa gli indici per creare un nuovo elenco con solo elementi unici.

    Ed ecco un esempio passo passo:

    1. Apri un nuovo foglio di calcolo
    2. In a1: a6 inserisci l'esempio fornito nella domanda originale (" rosso " ;, " blu " ;, " rosso " ;, " verde " ;, " blu " ;, " nero ")
    3. Ordina l'elenco: inserisci la selezione nell'elenco e scegli il comando di ordinamento.
    4. Nella colonna B, calcola i duplicati:
      1. In B1, inserisci " = IF (COUNTIF ($ A $ 1: A1, A1) = 1,0, COUNTIF (A1: $ A $ 6, A1)) " ;. Nota che il & Quot; $ & Quot; nella cella i riferimenti sono molto importanti in quanto renderà molto più semplice il passaggio successivo (popolare il resto della colonna). Il & Quot; $ & Quot; indica un riferimento assoluto in modo tale che quando il contenuto della cella viene copiato / incollato il riferimento non verrà aggiornato (al contrario di un riferimento relativo che verrà aggiornato).
      2. Usa smart copy per popolare il resto della colonna B: seleziona B1. Sposta il mouse sul quadrato nero nell'angolo in basso a destra della selezione. Fare clic e trascinare verso il basso fino alla fine dell'elenco (B6). Quando rilasci, la formula verrà copiata in B2: B6 con i relativi riferimenti aggiornati.
      3. Il valore di B1: B6 ora dovrebbe essere " 0,0,1,0,0,1 " ;. Si noti che il & Quot; 1 & Quot; le voci indicano duplicati.
    5. Nella colonna C, crea un indice di elementi unici:
      1. In C1, inserisci " = Row () " ;. Volete solo C1 = 1 ma l'uso di Row () significa che questa soluzione funzionerà anche se l'elenco non inizia nella riga 1.
      2. In C2, inserisci " = IF (C1 + 1 < = ROW ($ B $ 6), C1 + 1 + INDICE ($ B $ 1: $ B $ 6, C1 +1), C1 + 1) " ;. Il & Quot; if & Quot; viene utilizzato per interrompere la produzione di un #REF quando l'indice raggiunge la fine dell'elenco.
      3. Usa la copia intelligente per popolare C3: C6.
      4. Il valore di C1: C6 dovrebbe essere " 1,2,4,5,7,8 "
    6. Nella colonna D, crea il nuovo elenco univoco:
      1. In D1, inserisci " = IF (C1 < = ROW ($ A $ 6), INDICE ($ A $ 1: $ A $6, C1), & Quot; & Quot;) & Quot ;. E, & Quot; if & Quot; viene utilizzato per arrestare il caso #REF quando l'indice supera la fine dell'elenco.
      2. Usa la copia intelligente per popolare D2: D6.
      3. I valori di D1: D6 ora dovrebbero essere " nero ", " blu ", " verde " ; &, quot; quot rosso &;, quot &; quot &;, quot &; " ;.

    Spero che questo aiuti ....

        
  • Soluzione

    Ho creato una funzione in VBA per te, quindi puoi farlo ora in modo semplice.
    Crea un modulo di codice VBA (macro) come puoi vedere in questo tutorial .

    1. Premi Alt+F11
    2. Fai clic su Module in Insert.
    3. Incolla codice.
    4. Se Excel afferma che il formato del tuo file non è adatto alle macro, salvalo come Excel Macro-Enabled in Save As.

    Codice sorgente

    Function listUnique(rng As Range) As Variant
        Dim row As Range
        Dim elements() As String
        Dim elementSize As Integer
        Dim newElement As Boolean
        Dim i As Integer
        Dim distance As Integer
        Dim result As String
    
        elementSize = 0
        newElement = True
    
        For Each row In rng.Rows
            If row.Value <> "" Then
                newElement = True
                For i = 1 To elementSize Step 1
                    If elements(i - 1) = row.Value Then
                        newElement = False
                    End If
                Next i
                If newElement Then
                    elementSize = elementSize + 1
                    ReDim Preserve elements(elementSize - 1)
                    elements(elementSize - 1) = row.Value
                End If
            End If
        Next
    
        distance = Range(Application.Caller.Address).row - rng.row
    
        If distance < elementSize Then
            result = elements(distance)
            listUnique = result
        Else
            listUnique = ""
        End If
    End Function
    

    Uso

    Basta inserire =listUnique(range) in una cella. L'unico parametro è range che è un normale intervallo di Excel. Ad esempio: A$1:A$28 o H$8:H$30.

    Condizioni

    • <=> deve essere una colonna.
    • La prima cella in cui si chiama la funzione deve trovarsi nella stessa riga in cui inizia <=>.

    Esempio

    Caso normale

    1. Immettere i dati e chiamare la funzione.
      Inserisci i dati e chiama la funzione
    2. Coltivalo.
      Coltivalo
    3. & voil # 224 ;.
      Voilà

    Custodia per cella vuota

    Funziona in colonne che contengono celle vuote. Inoltre, la funzione non genera nulla (non errori) se si sovraccaricano le celle (chiamando la funzione) in luoghi in cui non dovrebbe esserci alcun output, come ho fatto nell'esempio precedente &; 2. Coltivalo & Quot; parte.

    Custodia per cella vuota

    Un modo rotatorio è caricare il foglio di calcolo di Excel in un foglio di calcolo di Google, utilizzare la funzione UNIQUE (intervallo) di Google - che fa esattamente quello che vuoi - e quindi salvare il foglio di calcolo di Google in formato Excel.

    Ammetto che questa non è una soluzione praticabile per gli utenti di Excel, ma questo approccio è utile per chiunque desideri la funzionalità ed è in grado di utilizzare un foglio di calcolo di Google.

    ha notato che si tratta di una domanda molto antica, ma le persone sembrano avere ancora problemi a utilizzare una formula per estrarre oggetti unici. ecco una soluzione che restituisce i valori stessi.

    Diciamo che hai " rosso " ;, " blue " ;, " rosso " ;, " verde < !> quot ;, " blu " ;, " nero " nella colonna A2: A7

    quindi inseriscilo in B2 come formula di matrice e copia in basso =IFERROR(INDEX(A$2:A$7;SMALL(IF(FREQUENCY(MATCH(A$2:A$7;A$2:A$7;0);ROW(INDIRECT("1:"&COUNTA(A$2:A$7))));ROW(INDIRECT("1:"&COUNTA(A$2:A$7)));"");ROW(A1)));"")

    allora dovrebbe assomigliare a questo; inserisci qui la descrizione dell'immagine

    Anche per ottenere un valore univoco ordinato, può essere fatto usando la formula. Questa è un'opzione che puoi usare:

    =INDEX($A$2:$A$18,MATCH(SUM(COUNTIF($A$2:$A$18,C$1:C1)),COUNTIF($A$2:$A$18,"<" &$A$2:$A$18),0))
    

    intervallo di dati: A2:A18

    formula nella cella C2

    Questa è una FORMULA DI ARRAY

    Prova questa formula nella B2 cella

    =IFERROR(INDEX($A$2:$A$7,MATCH(0,COUNTIF(B$1:$B1,$A$2:$A$7),0),1),"")
    

    Dopo aver fatto clic su F2 e premere Ctrl + Shift + Enter

     inserisci qui la descrizione dell'immagine

    È possibile utilizzare COUNTIF per ottenere il numero di occorrenze del valore nell'intervallo. Quindi, se il valore è in A3, l'intervallo è A1: A6, quindi nella colonna successiva usa un IF (EXACT (COUNTIF (A3: $ A $ 6, A3), 1), A3, & Quot; "). Per A4, sarebbe IF (EXACT (COUNTIF (A4: $ A $ 6, A3), 1), A4, & Quot; & Quot;)

    Questo ti darebbe una colonna in cui tutti i valori univoci sono senza duplicati

    Supponendo che la colonna A contenga i valori di cui desideri trovare un'unica istanza univoca e abbia una riga di intestazione che ho utilizzato la seguente formula. Se si desidera ridimensionarlo con un numero imprevedibile di righe, è possibile sostituire A772 (dove sono finiti i miei dati) con = ADDRESS (COUNTA (A: A), 1) .

    = SE (COUNTIF (A5: &; & $ A $ 772, A5) = 1, A5, quot quot;)

    Questo mostrerà il valore univoco nell'ULTIMA istanza di ciascun valore nella colonna e non assume alcun ordinamento. Sfrutta la mancanza di assoluti per avere essenzialmente un & Quot decrescente; finestra scorrevole & Quot; di dati da contare. Quando il countif nella finestra ridotta è uguale a 1, quella riga è l'ultima istanza di quel valore nella colonna.

    La soluzione di Drew Sherman è molto buona, ma l'elenco deve essere contiguo (suggerisce l'ordinamento manuale e questo non è accettabile per me). La soluzione di Guitarthrower è piuttosto lenta se il numero di articoli è elevato e non rispetta l'ordine dell'elenco originale: genera un elenco ordinato indipendentemente.

    Volevo l'ordine originale degli articoli (che erano ordinati in base alla data in un'altra colonna) e inoltre volevo escludere un articolo dall'elenco finale non solo se fosse duplicato, ma anche per una varietà di altri motivi .

    La mia soluzione è un miglioramento rispetto alla soluzione di Drew Sherman. Allo stesso modo, questa soluzione utilizza 2 colonne per i calcoli intermedi:

    Colonna A:

    L'elenco con duplicati e forse spazi vuoti che si desidera filtrare. Lo posizionerò nell'intervallo A11: A1100 come esempio, perché ho avuto problemi a spostare la soluzione di Drew Sherman in situazioni in cui non è iniziata nella prima riga.

    Colonna B:

    Questa formula genererà 0 se il valore in questa riga è valido (contiene un valore non duplicato). Si noti che è possibile aggiungere qualsiasi altra condizione di esclusione desiderata nel primo IF o come ancora un altro IF esterno.

    =IF(ISBLANK(A11);1;IF(COUNTIF($A$11:A11;A11)=1;0;COUNTIF($A11:A$1100;A11)))
    

    Utilizza la copia intelligente per popolare la colonna.

    Colonna C:

    Nella prima riga troveremo la prima riga valida:

    =MATCH(0;B11:B1100;0)
    

    Da quella posizione, cerchiamo il prossimo valore valido con la seguente formula:

    =C11+MATCH(0;OFFSET($B$11:$B$1100;C11;0);0)
    

    Inseriscilo nella seconda riga e usa la copia intelligente per riempire il resto della colonna. Questa formula produrrà un errore # N / D quando non ci sono più punti unici da puntare. Ne trarremo vantaggio nella prossima colonna.

    Colonna D:

    Ora non ci resta che ottenere i valori indicati dalla colonna C:

    =IFERROR(INDEX($A$11:$A$1100; C11); "")
    

    Usa la copia intelligente per popolare la colonna. Questo è l'elenco univoco di output.

    Puoi anche farlo in questo modo.

    Crea i seguenti intervalli denominati:

    nList = the list of original values
    nRow = ROW(nList)-ROW(OFFSET(nList,0,0,1,1))+1
    nUnique = IF(COUNTIF(OFFSET(nList,nRow,0),nList)=0,COUNTIF(nList, "<"&nList),"")
    

    Con questi 3 intervalli denominati è possibile generare l'elenco ordinato di valori univoci con la formula seguente. Sarà ordinato in ordine crescente.

    IFERROR(INDEX(nList,MATCH(SMALL(nUnique,ROW()-?),nUnique,0)),"")
    

    Dovrai sostituire il numero di riga della cella appena sopra il primo elemento dell'elenco univoco ordinato con '?' carattere.

    ad es. Se l'elenco ordinato univoco inizia nella cella B5, la formula sarà:

    IFERROR(INDEX(nList,MATCH(SMALL(nUnique,ROW()-4),nUnique,0)),"")
    

    Sono sorpreso che questa soluzione non sia ancora arrivata. Penso che sia uno dei più facili

    Dai un'intestazione ai tuoi dati e inseriscili in un intervallo con nome dinamico (ovvero se i tuoi dati sono in col A)

    =OFFSET($A$2,0,0,COUNTA($A:$A),1)
    

    E quindi crea una tabella pivot, rendendo l'origine il tuo intervallo denominato.

    Metti semplicemente l'intestazione nella sezione righe e avrai i valori univoci, ordina come preferisci con la funzione integrata.

    Ho incollato quello che uso nel mio file Excel sotto. Questo raccoglie valori univoci dall'intervallo L11:L300 e li popola dalla colonna V, V11 in poi. In questo caso ho questa formula in v11 e la trascino verso il basso per ottenere tutti i valori univoci.

    =INDEX(L$11:L$300,MATCH(0,COUNTIF(V$10:V10,L$11:L$300),0))
    

    o

    =INDEX(L$11:L$300,MATCH(,COUNTIF(V$10:V10,L$11:L$300),))
    

    questa è una formula di matrice

    Il ricorso a una tabella pivot potrebbe non essere considerato utilizzando solo le formule , ma sembra più pratico della maggior parte degli altri suggerimenti finora:

     esempio SO1429899

    Di recente ho riscontrato lo stesso problema e alla fine l'ho capito.

    Usando la tua lista, ecco un incolla dal mio Excel con la formula.

    Raccomando di scrivere la formula da qualche parte in mezzo all'elenco, come, ad esempio, nella cella C6 del mio esempio e quindi copiarla e incollarla su e giù per la colonna, la formula dovrebbe adattarsi automaticamente senza che sia necessario per ridigitare.

    L'unica cella che ha una formula unicamente diversa è nella prima riga.

    Uso dell'elenco (" rosso " ;, " blu " ;, " rosso " ;, " verde < !> quot ;, " blu " ;, " nero "); ecco il risultato: ( Non ho un livello abbastanza alto per pubblicare un'immagine, quindi spero che questa versione di txt abbia senso )

    • [Colonna A: Elenco originale]
    • [Colonna B: risultato elenco univoco]
    • [Colonna C: formula elenco univoco]

      1. rosso, rosso, =A3
      2. blu, blu, =IF(ISERROR(MATCH(A4,A$3:A3,0)),A4,"")
      3. rosso, =IF(ISERROR(MATCH(A5,A$3:A4,0)),A5,"")
      4. verde, verde, =IF(ISERROR(MATCH(A6,A$3:A5,0)),A6,"")
      5. blu,, =IF(ISERROR(MATCH(A7,A$3:A6,0)),A7,"")
      6. nero, nero, =IF(ISERROR(MATCH(A8,A$3:A7,0)),A8,"")

    Funziona solo se i valori sono in ordine, ovvero tutte le " rosse " sono insieme e tutte le " blue " sono insieme ecc. supponi che i tuoi dati siano nella colonna A a partire da A2 - (Non iniziare dalla riga 1) Nel B2 digitare 1 In b3 digitare = if (A2 = A3, B2, B2 + 1) Trascina verso il basso la formula fino alla fine dei tuoi dati Tutti & Quot; Red quot &; sarà 1, tutto " blu " sarà 2 tutto " verde " saranno 3 ecc.

    In C2 digitare 1, 2, 3 ecc. scendendo la colonna In D2 = OFFSET ($ A $ 1, MATCH (c2, $ B $ 2: $ B $ x, 0), 0) - dove x è l'ultima cella Trascina verso il basso, verranno visualizzati solo i valori univoci. - inserire un controllo errori

    Per una soluzione che funziona con valori in più righe e colonne, ho trovato molto utile la seguente formula, da http://www.get-digital-help.com/2009/03/16/unique-values-from-multiple -colonne-con-array-formule / Oscar su get-digital.help.com lo attraversa anche passo per passo e con un esempio visualizzato.

    1) Assegna all'intervallo di valori l'etichetta tbl_text

    2) Applicare la seguente formula di matrice con CTRL + MAIUSC + INVIO, in questo caso alla cella B13. Modifica $ B $ 12: B12 per fare riferimento alla cella sopra la cella in cui inserisci questa formula.

        =INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), MATCH(0, COUNTIF($B$12:B12, INDEX(tbl_text, MIN(IF(COUNTIF($B$12:B12, tbl_text)=0, ROW(tbl_text)-MIN(ROW(tbl_text))+1)), , 1)), 0), 1)
    

    3) Copia / trascina verso il basso fino a ottenere N / A.

    Se uno mette tutti i dati nelle stesse colonne e usa la seguente formula Formula di esempio: =IF(C105=C104,"Duplicate","Not a Duplicate")

    I passaggi

    1. Ordina i dati
    2. Aggiungi colonna per la formula
    3. Verifica se la cella è uguale alla cella sopra di essa
    4. Quindi filtra Not a Duplicate
    5. Facoltativo: copia i dati calcolati dalla colonna formula e incolla solo come valori (in questo modo se inizi a eliminare i dati, non inizi a ricevere errori
    6. NOTA / AVVERTENZA: funziona solo se si ordinano prima i dati

    Formula di esempio: <=>

    Soluzione VBScript ottimizzata

    Ho usato il codice di totymedli ma l'ho trovato impantanante quando ho usato intervalli di grandi dimensioni (come sottolineato da altri), quindi ho ottimizzato un po 'il suo codice. Se qualcuno è interessato a ottenere valori univoci utilizzando VBScript ma trova lento il codice di totymedli durante l'aggiornamento, prova questo:

        Function listUnique(rng As Range) As Variant
            Dim val As String
            Dim elements() As String
            Dim elementSize As Integer
            Dim newElement As Boolean
            Dim i As Integer
            Dim distance As Integer
            Dim allocationChunk As Integer
            Dim uniqueSize As Integer
            Dim r As Long
            Dim lLastRow  As Long
    
            lLastRow = rng.End(xlDown).row
    
            elementSize = 1
            unqueSize = 0
    
            distance = Range(Application.Caller.Address).row - rng.row
    
            If distance <> 0 Then
                If Cells(Range(Application.Caller.Address).row - 1, Range(Application.Caller.Address).Column).Value = "" Then
                    listUnique = ""
                    Exit Function
                End If
            End If
    
            For r = 1 To lLastRow
                val = rng.Cells(r)
                If val <> "" Then
                    newElement = True
                    For i = 1 To elementSize - 1 Step 1
                        If elements(i - 1) = val Then
                            newElement = False
                            Exit For
                        End If
                    Next i
                    If newElement Then
                        uniqueSize = uniqueSize + 1
                        If uniqueSize >= elementSize Then
                            elementSize = elementSize * 2
                            ReDim Preserve elements(elementSize - 1)
                        End If
                        elements(uniqueSize - 1) = val
                    End If
                End If
            Next
    
    
            If distance < uniqueSize Then
                listUnique = elements(distance)
            Else
                listUnique = ""
            End If
        End Function
    

    Seleziona la colonna con valori duplicati, quindi vai alla scheda Dati, quindi seleziona Strumenti di rimozione dei dati duplicati 1) & Quot; Continua con la selezione corrente & Quot; 2) Fare clic sul pulsante Rimuovi duplicato .... 3) Fare clic su & Quot; Seleziona tutto & Quot; pulsante 4) Fai clic su OK

    ora ottieni l'elenco di valori univoci.

    Autorizzato sotto: CC-BY-SA insieme a attribuzione
    Non affiliato a StackOverflow
    scroll top