Vuoi assegnare numeri consecutivi in colonna A partendo dai valori della colonna E (anche se ripetuti), lasciando vuote le righe dove E è vuota o 0 e bloccando la sequenza a 30 elementi? Qui trovi la soluzione pronta all’uso, compatibile e spiegata passo‑passo.
Scenario e obiettivo
Hai un elenco di chiavi o etichette in E5:E34. Ogni volta che compare un nuovo valore in E, vuoi assegnargli un numero progressivo (1, 2, 3, …). Se lo stesso valore si ripete in righe successive, deve ricevere lo stesso numero della prima occorrenza. Se E è vuota o contiene 0, la cella corrispondente in A deve rimanere vuota. Facoltativamente, vuoi anche limitare la numerazione a 30 gruppi.
Preparazione del foglio
- Intesta le colonne nella riga 4 (ad esempio A4 = “Gruppo”, E4 = “Valore”).
- Inserisci i dati (o le formule che li producono) nell’intervallo E5:E34.
- Applicherai la formula a partire da A5 e la copierai fino a A34.
- È importante bloccare con
$
i riferimenti all’area “sopra la riga corrente” (ad es.$E$4:$E4
,$A$4:$A4
), così la ricerca e il conteggio coinvolgono solo le righe precedenti.
Formula base: numerazione dinamica con duplicati
La seguente formula assegna numeri progressivi alle occorrenze nuove in colonna E e ripete lo stesso numero per i duplicati già apparsi più in alto. Le celle restano vuote se E è vuota.
=IF($E5="", "",
IF(COUNTIF($E$4:$E4, $E5)>0,
XLOOKUP($E5, $E$4:$E4, $A$4:$A4),
MAX($A$4:$A4)+1))
Come applicarla: inserisci la formula in A5 e copia in basso fino a A34.
Come funziona, riga per riga
IF($E5="", "")
– Se la cella della colonna E, nella stessa riga, è vuota, anche A resta vuota.COUNTIF($E$4:$E4, $E5)>0
– Verifica se il valore corrente di E è già apparso in una riga precedente.XLOOKUP($E5, $E$4:$E4, $A$4:$A4)
– Se sì, recupera il numero già assegnato alla prima occorrenza del valore.MAX($A$4:$A4)+1
– Se è un valore nuovo, prende il massimo fin qui assegnato e aggiunge 1, generando la nuova etichetta numerica.
Perché è robusta
- Compatibilità: metodo riga‑per‑riga, non richiede funzioni complesse di matrice dinamica.
- Stabilità: i duplicati ereditano il numero dalla prima occorrenza “sopra”.
- Chiarezza: nessuna colonna di supporto obbligatoria.
Ignorare gli zeri
Se vuoi che anche gli zeri si considerino “da ignorare” (come vuoto), usa una delle due varianti in base alla natura dei dati in E.
Valori digitati a mano in colonna E
=IF($E5=0, "",
IF(COUNTIF($E$4:$E4, $E5)>0,
XLOOKUP($E5, $E$4:$E4, $A$4:$A4),
MAX($A$4:$A4)+1))
Colonna E ottenuta da formule (può restituire stringa vuota “” o 0)
=IF(OR($E5={"",0}), "",
IF(COUNTIF($E$4:$E4, $E5)>0,
XLOOKUP($E5, $E$4:$E4, $A$4:$A4),
MAX($A$4:$A4)+1))
Questa versione copre entrambe le evenienze: la tua formula in E potrebbe restituire ""
(stringa vuota) o 0
. In entrambi i casi, A rimane vuota.
Limitare la numerazione a 30
Se vuoi bloccare la numerazione a 30 gruppi (cioè non assegnare numeri oltre 30), avvolgi la logica in LET
come segue:
=LET(
n, IF(COUNTIF($E$4:$E4,$E5)>0,
XLOOKUP($E5,$E$4:$E4,$A$4:$A4),
MAX($A$4:$A4)+1),
IF(OR($E5={"",0}, n>30), "", n))
Come funziona: calcola il numero candidato n
; poi, se E
è vuota/0 oppure se n
eccede 30, restituisce vuoto; altrimenti restituisce n
. Puoi cambiare 30
con qualunque altro limite.
Versioni precedenti senza XLOOKUP
Se non hai XLOOKUP
, puoi sostituirlo con INDEX/MATCH
mantenendo intatta la logica:
=IF($E5="", "",
IF(COUNTIF($E$4:$E4, $E5)>0,
INDEX($A$4:$A4, MATCH($E5, $E$4:$E4, 0)),
MAX($A$4:$A4)+1))
La numerazione resta identica: si cerca il valore in $E$4:$E4
e si prende il corrispondente numero da $A$4:$A4
.
Approccio alternativo con funzioni dinamiche (Excel 365)
Se usi una versione moderna (Microsoft 365) e ti va bene usare formule di matrice dinamica, puoi “mappare” ogni valore unico di E a una posizione nell’elenco degli unici, ottenendo il numero di gruppo con XMATCH
. Questo rende i numeri indipendenti dall’ordine delle righe (cioè 1 corrisponde al primo valore unico in E, 2 al secondo, ecc.).
=LET(
rng, $E$5:$E$34,
unici, FILTER(UNIQUE(rng), (rng<>"")*(rng<>0)),
IF(OR($E5={"",0}), "", XMATCH($E5, unici))
)
Nota: questa impostazione assegna i numeri in base all’ordine degli elementi unici, non necessariamente alla prima occorrenza “sopra”. Se desideri la compatibilità massima e il comportamento “a scorrimento riga‑per‑riga”, resta sulla soluzione precedente.
Esempio completo di utilizzo
Supponi di avere in E5:E14 i seguenti valori:
Riga | E (Valore) | A (Risultato atteso) |
---|---|---|
5 | Arancio | 1 |
6 | Mela | 2 |
7 | Arancio | 1 |
8 | ||
9 | Pera | 3 |
10 | 0 | |
11 | Mela | 2 |
12 | Banana | 4 |
13 | Banana | 4 |
14 | Uva | 5 |
Con la formula “ignora 0”, ottieni in A i numeri 1,2,1, vuoto, 3, vuoto, 2, 4, 4, 5, come atteso.
Consigli pratici e personalizzazioni
- Riga di intestazione: usare
$A$4
come tetto superiore è comodo perchéMAX($A$4:$A4)
ritorna 0 quando sopra non c’è nulla di numerico. Assicurati cheA4
sia vuota o 0. - Inizio da numeri diversi: per iniziare da 100, sostituisci
MAX(...)+1
conIF(MAX($A$4:$A4)=0, 100, MAX($A$4:$A4)+1)
. - Sensibilità a maiuscole/minuscole:
COUNTIF
non distingue il case. Se “ABC” e “abc” devono essere considerati diversi, devi passare a strategie più avanzate (ad es. colonne d’appoggio conEXACT
/IDENTICO
). - Valori “zero” scritti come testo: se talvolta 0 è digitato come
"0"
(testo), puoi trattarlo come zero numerico conIF(OR($E5="", $E5=0, $E5="0"), "", ...)
. - Spazi indesiderati: per ignorare stringhe fatte solo di spazi, usa
TRIM
:IF(TRIM($E5)="", "", ...)
. - Prestazioni: evita riferimenti a colonne intere nei
MAX
/COUNTIF
. Limita sempre l’intervallo alla parte “sopra” la riga corrente (come negli esempi). - Bloccare veramente i numeri: se vuoi “congelare” i risultati, alla fine copia la colonna A e incolla come valori.
Varianti avanzate con riferimenti dinamici “sopra riga”
Se vuoi che la formula resti valida anche se in futuro estendi l’elenco oltre la riga 34, puoi calcolare gli intervalli “fino alla riga precedente” con INDEX
e LET
:
=LET(
prevE, $E$5:INDEX($E:$E, ROW()-1),
prevA, $A$5:INDEX($A:$A, ROW()-1),
IF(OR($E5={"",0}), "",
IF(COUNTIF(prevE, $E5)>0,
XLOOKUP($E5, prevE, prevA),
MAX(prevA)+1)))
Così la formula è indipendente dai riferimenti a riga 4 e si adatta automaticamente man mano che aggiungi righe.
Domande frequenti
Cosa succede se ordino i dati?
Le formule riga‑per‑riga assegnano i numeri in base alla prima occorrenza sopra. Se riordini le righe, i numeri si ricalcolano coerentemente con il nuovo ordine. Se desideri numeri stabili per ogni valore indipendentemente dall’ordine, valuta l’approccio con UNIQUE
/XMATCH
mostrato sopra.
Posso usarla dentro una Tabella di Excel?
Sì, ma per riferirti “solo alle righe precedenti” è più semplice mantenere i riferimenti classici (A5, E5, ecc.). In alternativa, la variante con INDEX
e ROW()
crea un intervallo precedente che funziona bene anche nelle Tabelle.
Come gestisco errori in E (es. #N/A)?
Se un errore in E deve essere trattato come vuoto, avvolgi il controllo in IFERROR
: IF(IFERROR($E5,"")="", "", ...)
.
La numerazione si ferma a 30 ma ho più di 30 gruppi
Puoi aumentare il limite nella formula LET(... n>30 ...)
oppure rimuovere del tutto il controllo di soglia se non ti serve.
Traduzione delle funzioni per Excel in italiano
Se il tuo Excel usa i nomi funzione in italiano, ecco la mappatura più utile:
Inglese | Italiano |
---|---|
IF | SE |
COUNTIF | CONTA.SE |
XLOOKUP | CERCA.X |
INDEX | INDICE |
MATCH | CONFRONTA |
MAX | MAX |
LET | LET |
UNIQUE | UNICI |
FILTER | FILTRO |
XMATCH | CONFRONTA.X |
TRIM | ANNULLA.SPAZI |
IFERROR | SE.ERRORE |
EXACT | IDENTICO |
Di seguito le versioni localizzate delle formule principali (ricorda che in italiano gli argomenti sono separati da ;).
Base (salta celle vuote)
=SE($E5=""; "";
SE(CONTA.SE($E$4:$E4; $E5)>0;
CERCA.X($E5; $E$4:$E4; $A$4:$A4);
MAX($A$4:$A4)+1))
Ignora anche 0
=SE(O($E5="";$E5=0); "";
SE(CONTA.SE($E$4:$E4; $E5)>0;
CERCA.X($E5; $E$4:$E4; $A$4:$A4);
MAX($A$4:$A4)+1))
Limite a 30
=LET(
n; SE(CONTA.SE($E$4:$E4; $E5)>0;
CERCA.X($E5; $E$4:$E4; $A$4:$A4);
MAX($A$4:$A4)+1);
SE(O($E5="";$E5=0; n>30); ""; n))
Risoluzione dei problemi comuni
- La prima riga numerata non parte da 1: verifica che
$A$4
sia vuota (o 0) e che non ci siano numeri nelle righe sopra. - Duplicati non riconosciuti: potrebbero esserci spazi o differenze di formattazione (es. “Mela ” con spazio finale). Usa
TRIM/ANNULLA.SPAZI
oUPPER
/MAIUSC
su E. - Lo zero viene numerato: passa alla variante con
OR($E5={"",0})
/O($E5="";$E5=0)
. - Ho più di 30 gruppi: modifica la soglia
n>30
oppure rimuovila. - Uso Excel 2016/2019: preferisci la versione
INDEX/MATCH
al posto diXLOOKUP
.
Bozza di procedura rapida
- In A5 incolla la formula base (o la variante che ignora 0).
- Copia in basso fino ad A34.
- Se necessario, applica la versione con
LET
per limitare a 30. - Controlla che
E
non contenga spazi o “0” testuali non voluti. - Quando soddisfatto, valuta l’incolla come valori per “congelare” i numeri.
Perché questa soluzione è ideale per la maggior parte dei casi
Con una singola formula riga‑per‑riga ottieni una mappatura stabile tra valori (E) e gruppi numerici (A), evitando colonne d’appoggio e mantenendo compatibilità con più versioni di Excel. Le estensioni per ignorare 0 e per fissare un tetto di 30 coprono gli scenari tipici in contesti produttivi (report, pivot di raggruppamento, filtri). Se hai Microsoft 365, la variante con UNIQUE
/XMATCH
offre anche una numerazione indipendente dall’ordinamento.
Formula “pronta e definitiva” consigliata (ignora vuoto e 0, numerazione riga‑per‑riga, compatibile, con tetto a 30 modificabile):
=LET(
n, IF(COUNTIF($E$4:$E4,$E5)>0,
XLOOKUP($E5,$E$4:$E4,$A$4:$A4),
MAX($A$4:$A4)+1),
IF(OR($E5={"",0}, n>30), "", n))
Se non ti serve il tetto, elimina la condizione n>30
dal secondo IF
/SE
.
Suggerimento finale: se in futuro dovrai espandere l’intervallo oltre A34/E34, passa alla variante “avanzata” con INDEX
nei riferimenti “precedenti” così la formula si adatterà automaticamente, o racchiudi tutto in un Nome definito per riutilizzarlo rapidamente in altri fogli.