Ottenere valori univoci in Excel utilizzando solo le formule
-
07-07-2019 - |
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.
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;}:
-
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. -
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. -
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). -
MATCH
trova il primo indice del k-esimo valore di ordinamento (indice nella matrice n. 1). -
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
- 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)
- Scegli Dati / Filtro avanzato
- Scegli " Filtra l'elenco, sul posto " oppure " Copia in un'altra posizione "
- Fai clic su " Solo record univoci "
- Fai clic su OK
- 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:
Ecco il riassunto della soluzione:
- Per ogni elemento nell'elenco, calcola il numero di duplicati sopra di esso.
- Per ogni posizione nell'elenco univoco, calcola l'indice dell'elemento univoco successivo.
- Infine, usa gli indici per creare un nuovo elenco con solo elementi unici.
Ed ecco un esempio passo passo:
- Apri un nuovo foglio di calcolo
- In a1: a6 inserisci l'esempio fornito nella domanda originale (" rosso " ;, " blu " ;, " rosso " ;, " verde " ;, " blu " ;, " nero ")
- Ordina l'elenco: inserisci la selezione nell'elenco e scegli il comando di ordinamento.
- Nella colonna B, calcola i duplicati:
- 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).
- 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.
- 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.
- Nella colonna C, crea un indice di elementi unici:
- 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.
- 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.
- Usa la copia intelligente per popolare C3: C6.
- Il valore di C1: C6 dovrebbe essere " 1,2,4,5,7,8 "
- Nella colonna D, crea il nuovo elenco univoco:
- 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.
- Usa la copia intelligente per popolare D2: D6.
- 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 .
- Premi Alt+F11
- Fai clic su
Module
inInsert
. - Incolla codice.
- Se Excel afferma che il formato del tuo file non è adatto alle macro, salvalo come
Excel Macro-Enabled
inSave 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
- Immettere i dati e chiamare la funzione.
- Coltivalo.
- & voil # 224 ;.
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.
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;
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
È 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
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]
- rosso, rosso,
=A3
- blu, blu,
=IF(ISERROR(MATCH(A4,A$3:A3,0)),A4,"")
- rosso,
=IF(ISERROR(MATCH(A5,A$3:A4,0)),A5,"")
- verde, verde,
=IF(ISERROR(MATCH(A6,A$3:A5,0)),A6,"")
- blu,,
=IF(ISERROR(MATCH(A7,A$3:A6,0)),A7,"")
- nero, nero,
=IF(ISERROR(MATCH(A8,A$3:A7,0)),A8,"")
- rosso, rosso,
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
- Ordina i dati
- Aggiungi colonna per la formula
- Verifica se la cella è uguale alla cella sopra di essa
- Quindi filtra
Not a Duplicate
- 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
- 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.