Ordinare un elenco con duplicati su Microsoft Excel è possibile in diversi modi. In particolare, questa procedura può essere utile per mettere in ordine gli articoli più venduti con nome e relativo ammontare, i migliori alunni, i prodotti più costosi o quelli sui quali si fa il maggiore margine.
Se vuoi, puoi scaricare il file che riassume l'articolo con i diversi metodi proposti cliccando sul pulsante.
In questo articolo consideriamo il caso con valori duplicati che è leggermente più complesso ma puoi consultare questo articolo se l'elenco che stai utilizzando ha unicamente valori univoci. Nello stesso articolo è spiegato come ricavare l’ordine numerico utilizzando le funzioni INDICE, CONFRONTA, GRANDE e RIF.RIGA.
I problemi nascono quando utilizziamo dei duplicati dato che la combinazione INDICE CONFRONTA purtroppo restituisce sempre e solo il primo riferimento. In questo caso, Anthony è più in alto rispetto a Markkanen e quindi viene ripetuto due volte anzichè darci la classifica corretta. Questo è un problema fastidioso che si ripete spesso quando si lavora con prodotti simili, pensiamo ad esempio a prodotti venduti assieme con lo stesso costo e nelle stesse quantità. In questo caso, entrambi hanno lo stesso numero di punti (332,25).
Bisogna stare molto attenti dato che la procedura di prima ordinare i punti per poi trovare il giocatore può creare dei problemi - per fortuna, con le ultime versioni di 365 il procedimento sarà quasi immediato e senza possibilità di errore.
Ordinare elenco con duplicati Excel: soluzione con Excel 365
Le nuove funzioni disponibili con l'arrivo dei dynamic array (in questo caso utilizzeremo DATI.ORDINA, DATI.ORDINA.PER e FILTRO) hanno semplificato in maniera evidente le formule necessarie per ordinare dei dati con dei valori duplicati.
Assumiamo che la tabella di partenza si chiami TBL e presenti queste tre colonne:
- Giocatore + squadra
- Divisione
- Punti
Se volessimo ordinare i giocatori per numeri di punti ci basterebbe utilizzare questa formula:
=DATI.ORDINA(TBL;3;-1)
La formula prende tutto il riferimento della tabella, dato che TBL comprende le tre colonne. Ordina poi il risultato per la terza colonna, quella dei punti (3) e li inserisce in ordine decrescente (-1).
Un'alternativa è rappresentata da un'altra formula, leggermente diversa:
=DATI.ORDINA.PER(TBL;TBL[PUNTI];-1)
In questo caso la logica è molto simile. Prendiamo l'intera tabella TBL per poi ordinare per la terza colonna (TBL_PUNTI) in ordine decrescente (-1).
Volessimo ordinare soltanto una sezione della tabella, ad esempio restituendo unicamente i giocatori di una certa divisione che è inserita nella cella U2, potremmo fare così:
=DATI.ORDINA(FILTRO(TBL;TBL[DIV]=U2;"");3;-1)
In questi casi aiuta guardare prima alla parte con FILTRO:
=FILTRO(TBL;TBL[DIV]=U2;"")
Stiamo filtrando la tabella TBL di partenza per ottenere esclusivamente i valori per la colonna DIV che siano uguali alla cella U2 (EAST o WEST).
A questo punto l'array non fa altro che effettuare l'operazione vista in precedenza: prende i valori che corrispondono alla nostra condizione per poi metterli in ordine per la terza colonna (3, sempre i punti) in ordine decrescente (-1).
Chiaramente le condizioni potrebbero essere molto più complesse ma andrebbero sempre inserite dalla funzione FILTRO.
Ordinare elenco con duplicati Excel: soluzione con array
Se non abbiamo una delle ultime versioni di Excel possiamo comunque sistemare tutto con una mix più complesso, che richiede l'utilizzo degli array (pre-365). Gli array devono essere inseriti con CTRL + SHIFT + ENTER per funzionare, se non vedi le parentesi graffe significa che l'array non è stato inserito e quindi la formula non funzionerà. Spesso non vengono utilizzati dato che risultano complicati per collaboratori poco esperti che inseriscono la formula solo con ENTER e vedono solo degli errori anzichè i valori.
Formula generale:
INDICE([intervallo_valori_testuali];PICCOLO(SE([intervallo_valori_numerici]=[valore_numerico];RIF.RIGA([numero_di_valori]));CONTA.SE([intervallo_valori_numerici_decrescente_progressivo];[valore_numerico])))
Facciamo un po' di ordine.
INDICE considera i valori testuali del primo elenco, PICCOLO ci aiuta a orientarci sul foglio (partirà dall'alto) mentre SE considera l'intervallo dei valori numerici del primo elenco, il valore numerico è quello del nuovo elenco in ordine. RIF.RIGA considera i numeri da 1 a n, contando i possibili valori dell'elenco (in questo caso 6) mentre CONTA.SE considera progressivamente l'intervallo di valori in ordine fino al valore che ci interessa, aiutandoci poichè definisce se prendere il primo o il secondo valore testuale riferito allo stesso numero
Formula pratica:
{=INDICE($B$3:$B$8;PICCOLO(SE($C$3:$C$8=F12;RIF.RIGA($1:$6));CONTA.SE($F$12:F12;F12)))}
La formula deve essere trascinata dalla cella E12 in giù, in modo da considerare gli altri riferimenti riga (selezionando quindi il secondo valore più grande, il terzo e così via). Nel punto che prima dava due volte lo stesso nome (Anthony e nuovamente Anthony), vediamo come invece vi siano due valori distinti (Anthony e Markkanen). Vediamo che Anthony viene prima di Markannen solo perchè è il valore più in alto nella tabella di riferimento.
Ordinare elenco con duplicati Excel: INDICE e AGGREGA
Un po' tortuoso, ma efficace, è anche l'utilizzo della funzione AGGREGA. Questa funzione è presente da Excel 2010 e permette di creare numerose operazioni quali somme e ricerche di dati tramite una sintassi molto particolare. Per dettagli a riguardo, ecco la pagina ufficiale di Microsoft sulla funzione stessa. Il vantaggio è indubbiamente che questa formula funziona con ENTER, quindi non necessita di essere inserita come un array. Fra i due metodi, questo è quello preferibile.
Formula pratica:
INDICE($B$3:$B$8;AGGREGA(15;6;(RIF.RIGA($1:$6))/($C$3:$C$8=I12);CONTA.SE($I$12:I12;I12)))
Analizzando le funzioni utilizzate, INDICE è uguale a prima e considera l'elenco dei nomi. Con AGGREGA(15;6 stiamo segnalando che stiamo cercando il valore più piccolo (come posizione) di un certo elenco. Abbiamo 6 valori, quindi inseriamo RIF.RIGA($1:$6). Potremmo inserire anche $200, non fa differenza. Questo è il riferimento che deve essere uguale almeno al numero di evidenze dell'INDICE che utilizziamo. Inserire però /($C$3:$C$8=I12) sta restringendo il campo dell'intervallo unicamente ai valori che sono pari al valore della cella I12, proprio per gestire correttamente i duplicati. CONTA.SE($I$12:I12;I12) è un modo per indicare la progressione dell'intervallo, permettendoci di evitare duplicati. La prima volta che la formula incontrerà 332,25 ci indicherà Anthony, la seconda Markkanen proprio come ci aspettiamo.
Ordinare elenco con duplicati Excel: condizioni multiple
Le cose si complicano quando consideriamo condizioni multiple. In questo caso dobbiamo anche modificare la procedura per trovare i valori più grandi in assoluto, dato che quella fatta in precedenza non è sufficiente. Dato che sono tutti giocatori NBA, facciamo un esempio con le due diverse conference: i giocatori sono stati divisi anche per WEST e EAST, come vediamo nella colonna L. Nella cella O10 abbiamo inserito EAST per spiegare a Excel che ci interessano unicamente i giocatori di quella conference. I giocatori WEST devono essere ignorati per la nostra classifica.
Formula pratica:
{=SE.ERRORE(GRANDE(SE($L$3:$L$8=$O$10;$M$3:$M$8);RIF.RIGA(A1));"")}
Anche in questo caso è consigliabile inserire la formula con CTRL+SHIFT+ENTER per far apparire le parentesi graffe. Sulle ultime versioni di Excel (ad esempio 365) non dovrebbe essere fondamentale e la formula funzionerà comunque, ma per questioni di compatibilità suggerisco di inserire comunque la formula con CTRL+SHIFT+ENTER (o CSE).
In questo caso stiamo utilizzando SE.ERRORE per restituire un valore vuoto se ci sono errori nell'elenco, mentre la funzione GRANDE ha la condizione di dover considerare unicamente i valori dell'intervallo sulla colonna L unicamente SE nella colonna O, sulla stessa riga, troviamo O10 (cioè EAST). RIF.RIGA viene utilizzato per metterli in ordine dal più grande al più piccolo.
Ora è il momento di recuperare i dati testuali che ci interessano. Pure in questo caso dovremo modificare la formula con INDICE e AGGREGA per aggiungere una ulteriore condizione.
Formula pratica:
=SE.ERRORE(INDICE($K$3:$K$8;
AGGREGA(15;6;
(RIF.RIGA($1:$6))/
(($M$3:$M$8=M12)*($L$3:$L$8=$O$10));
CONTA.SE($M$12:M12;M12)));"")
In questo caso, la parte focale è quella dopo il RIF.RIGA. Come vediamo, non solo la formula deve tenere conto della condizione ($M$3:$M$8=M12) che rappresenta i numeri (essendo M12 pari a 400,75), ma anche della condizione ($L$3:$L$8=$O$10) che segnala l'appartenenza dei singoli giocatori nella EAST Conference. La formula è corretta dato che restituisce Markkanen anzichè Anthony, benchè entrambi i giocatori abbiano lo stesso punteggio - infatti Markkanen è nella EAST Conference, a differenza di Anthony che è nella WEST.
Solo un dettaglio finale: per inserire la conference, è sufficiente un semplice INDICE CONFRONTA o CERCA.VERT.
Sono un formatore e consulente esperto nell’uso e nell’insegnamento di Microsoft Excel.
Negli ultimi 3 anni ho tenuto corsi presso realtà in multinazionali come Aruba, Bridor, IMI Orton, Primadonna e SISAL, oltre a PMI e startup di diverso genere.
Realizzo corsi di formazione Excel dedicati per aziende, supporto professionisti 1:1 a distanza con call mirate e collaboro con aziende offrendo servizi di consulenza quali creazione di business plan, dashboard di vendita e non solo.
Vuoi saperne di più? Prenota una call gratuita di 15′!
Spettacolo !!!
Addirittura! Bene, mi fa piacere ti sia stato utile!
Sei un grande! MI HAI CAMBIATO LA VITA!
Ciao, scusa la mia ignoranza: utilizzando l'array, quando seleziono J15:J22 per copiare la formula non mi si aggiornano i riferimenti delle celle. Non riesco a capire dove sbaglio.
Grazie
Ciao Paolo,
prova inserendo dalla prima cella e trascinando in giù, comunque non funziona? Ricordati che il primo è bloccato con il $!
A presto e buona giornata
Marco
CIAO MARCO IL TUO MODO DI SPIEGARE E' ASSOLUTAMENTE EFFICACE. QUANDO LEGGO QUI SEMBRA TUTTO PIù CHIARO.
VOLEVO EFFETTUARE UN ULTERIORE PASSAGGIO A PARTIRE DA QUESTA SOLUZIONE, E POPOLANDO UNA TABELLA CON TUTTE LE INFORMAZIONI NECESSARIE, ORDINARE QUESTI DATI ALTROVE SULLA BASE DI DUE O PIU' CRITERI E NON SOLTANTO UNO.
Ciao Christian,
prima di tutto grazie per i complimenti e la fiducia!
Spero di aver capito bene la tua domanda, che mi ha dato l'ispirazione per ampliare l'articolo - in fondo trovi un esempio nel quale ci siano ulteriori condizioni per ordinare i risultati finali aggiungendo una condizione di partenza.
A presto
Marco
Grazieeee funziona!!! Complimenti per la spiegazione chiarissima!!!
è la prima volta che copiando una funzione da internet e portandola sul mio file va tutto come dovrebbe XD
Ciao Clemente,
grazie mille per il tuo riscontro e per il tuo entusiasmo, fa sempre piacere sapere di essere stati utili!
A presto e buona giornata,
Marco
Buongiorno Marco,
io avrei questo caso:
In un database devo cercare i prodotti che hanno lo stesso "codice modello" (ma colore articolo differente) per fare un controllo sui prezzi (devo verificare che i prezzi siano uguali anche nel caso in cui il colore sia diverso).
Pensavo di evidenziare i valori duplicati con la formattazione condizionale, poi applicare un filtro per visualizzare solo i prodotti con "codice modello" uguale e poi fare un controllo manuale.
Mi è capitato però che su decine di migliaia di prodotti Excel si impalli quando applico il filtro... c'è qualche altro metodo più automatizzato che consiglieresti?
Grazie mille!
Ciao Luke,
grazie per la domanda, davvero interessante - così su due piedi penserei a procedere così (ma non sapendo il tuo livello di partenza mi perdonerai se ti sembrerà arabo):
1 - Metti i dati di origine in tabella e recupera i dati con Power Query (sempre dentro Excel)
2 - Separa le colonne (se avessi "20124 - BLU" devi trovare 20124 in una cella e BLU in un'altra)
3 - Carica nuovamente la tabella
A questo punto io utilizzerei la funzione FILTRO per estrarre un riferimento univoco (mi auguro tu abbia un SKU o simili) in modo da avere i singoli riferimenti (=FILTRO(colonna_SKU;colonna_codici="codice_che_mi_interessa").
Ad esempio =FILTRO(colonna_SKU;colonna_codici=2024), l'importante è che tu abbia un riferimento univoco altrimenti verrebbe complesso.
Una volta fatto questo, poi con CERCA.X / CERCA.VERT recupererei i singoli dati di prezzo a partire dal tuo SKU. Dovresti farlo con un array questo (se hai FILTRO nella cella B2, la formula sarebbe =CERCA.X(B2#....)), poi ti basterebbe verificare se il valore che trovi nel tuo db è uguale a quello dell'anagrafica e avresti già ben chiaro quali sarebbero da cambiare / modificare.
Di quante righe stiamo parlando? Nel caso, potresti anche sezionare il db da Power Query se non hai un computer particolarmente performante. Il tuo spunto è interessante ma occhio perchè la formattazione condizionale diventa molto pesante quando sono tante righe, non so quanto ti convenga.
Giusto un ultimo dettaglio - occhio che la mia soluzione vale solo per Excel 365, su altre versioni purtroppo è un po' più rognosa come procedura. Come indicato sul sito, se volessi vederlo insieme puoi richiedere un'ora di 1:1 qui!
Spero di esserti stato utile!
A presto,
Marco
Ciao Marco e grazie per la risposta.
Nel mio caso diciamo che non esiste un'anagrafica da cui reperire il prezzo corretto: è necessario un controllo "manuale" di ogni prodotto (a volte anche proprio per stabilire un prezzo).
Sarei però già soddisfatto se potessi estrarre dal database, che è molto corposo, tutti i prodotti con "codice modello" uguale (e relativi prezzi) per poi controllarne il prezzo uno a uno.
Premetto che nell'intero DB la presenza di codici modelli uguali è una situazione poco frequente.
Ah, dimenticavo, un riferimento univoco tipo SKU per fortuna ce l'ho 😉
Ciao Luke,
allora confermo quanto detto in precedenza, hai provato con la funzione FILTRO oppure con Power Query a lavorare un po' la base di partenza?
Molto bene se hai un riferimento univoco!
A presto,
Marco
Ciao, molto utile! Avrei una domanda, ma se devo ordinare più elementi sulla base di diverse condizioni (magari tutte numeriche), come posso strutturare la formula. Ad esempio se dovessi fare una classifica di uno sport qualsiasi e a parità di punteggio totale dovessi mettere prima chi ha più reti fatte o meno gol subiti o altro come devo procedere???
Grazie mille e buon lavoro!
Ciao Mauro,
grazie per la tua domanda!
Ho aggiornato la guida inserendo anche le possibilità offerte da Excel 365 - in questo caso ti basterebbe inserire delle condizioni con DATI.ORDINA e FILTRO per ottenere il risultato esattamente come lo desideri.
Senza queste formule il procedimento diventa veramente complicato, praticamente dovresti aggiungere ulteriori condizioni agli array pre-365 e le formule sarebbero dei mostri.
Anche se non hai 365, la versione di Excel online è gratuita quindi puoi utilizzare quella nel frattempo.
Spero di esserti stato utile!
A presto,
Marco
Buon pomeriggio,
ho un file excel con delle date riportate in colonna.
Vorrei individuare la data più volte ripetuta.
Ciao Martino Marco,
grazie per la domanda - diciamo che hai diverse strade:
- Creando una pivot, puoi contare le singole date e scoprire quella più presente > qui trovi una guida dedicata https://www.marcofilocamo.it/creare-tabella-pivot-excel/
- Con 365, puoi farlo con una sola formula (forse un po' eccessiva, ho considerato che avessi la colonna B con le date):
=LET(range;B:B;
date;UNICI(range);
count;CONTA.SE(range;date);
FILTRO(date;count=MAX(count);""))
In questo modo avrai esclusivamente le date più presenti in assoluto! Ti consiglierei comunque di utilizzare una tabella per evitare di effettuare calcoli troppo pesanti, anzichè usare l'intera colonna.
Spero di esserti stato utile!
A presto,
Marco