Ultima cella non vuota in una colonna


Risposte:


76

Funziona sia con testo che con numeri e non si preoccupa se ci sono celle vuote, cioè restituirà l'ultima cella non vuota.

Deve essere inserito in un array , il che significa che premi Ctrl-Maiusc-Invio dopo averlo digitato o incollato. Quanto segue è per la colonna A:

=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))

@ Jean-François, scusa, l'ho riconosciuto in un commento ieri sera ma l'ho inserito nel post originale per errore. Funziona in XL 2007 e 2010. Grazie.
Doug Glancy

Non funziona per me in Excel 2007. Ho incollato la formula esatta. Ho una colonna (A), dove i valori sono = ROW () fino a 127ish, e la formula restituisce "1"
DontFretBrett

2
@DontFretBrett, assicurati di inserirlo come formula di matrice con Ctrl-Maiusc-Invio come specificato nella risposta.
Doug Glancy

@DougGlancy fallisce da parte mia. Grazie!
DontFretBrett

1
La differenza importante è che questo restituisce un riferimento di cella (quindi può essere passato ad es. CELL()O OFFSET()), mentre quello più votato restituisce un valore senza dirti dove si trova.
GSerg

128

Usare la seguente semplice formula è molto più veloce

=LOOKUP(2,1/(A:A<>""),A:A)

Per Excel 2003:

=LOOKUP(2,1/(A1:A65535<>""),A1:A65535)

Ti offre i seguenti vantaggi:

  • non è una formula di matrice
  • non è una formula volatile

Spiegazione:

  • (A:A<>"") restituisce array {TRUE,TRUE,..,FALSE,..}
  • 1/(A:A<>"")modifica questo array in {1,1,..,#DIV/0!,..}.
  • Poiché si LOOKUPaspetta un array ordinato in ordine crescente , e tenendo conto che se la LOOKUPfunzione non riesce a trovare una corrispondenza esatta, sceglie il valore più grande nel lookup_range(nel nostro caso {1,1,..,#DIV/0!,..}) che è minore o uguale al valore (nel nostro caso 2), formula trova l'ultimo 1nella matrice e restituisce il valore corrispondente da result_range(terzo parametro - A:A).

Anche una piccola nota : la formula sopra non tiene conto delle celle con errori (puoi vederlo solo se l'ultima cella non vuota ha un errore). Se vuoi tenerne conto, usa:

=LOOKUP(2,1/(NOT(ISBLANK(A:A))),A:A)

l'immagine sotto mostra la differenza:

inserisci qui la descrizione dell'immagine


grazie per la spiegazione e la bella foto. Ancora alcune domande rimangono aperte: 1. La documentazione di LOOKUPdice che l'ultimo argomento result_vectorè facoltativo. Tuttavia se lo ometto, ottengo un risultato molto strano che non capisco.
Honza Zidek

2. La documentazione dice "Se la LOOKUPfunzione non riesce a trovare lookup_value, la funzione corrisponde al valore più grande lookup_vectorche è minore o uguale a lookup_value." Se uso =LOOKUP(2,A:A<>"",A:A)senza generare l' #DIV/0!errore da 1/..., sembra che restituisca un valore nel mezzo di il vettore. Non ho trovato qual è la funzionalità esatta in questo caso.
Honza Zidek

1
Spiegazione molto bella. Avendo recentemente ridotto i minuti di calcolo spostando le formule da formule di matrice a versioni non di matrice, sono sempre pronto per una logica che funzioni senza richiedere formule di matrice.
tobriand

1
@Enissay, sì, questa restituirà il numero di riga =LOOKUP(2,1/(A:A<>""),ROW(A:A))ma l'aggiunta della ROWfunzione aggiungerà l'effetto "volatilità" - la formula verrà ricalcolata ogni volta che viene modificata una cella del foglio di lavoro
Dmitry Pavliv,

1
Ehilà. Grazie per aver postato questo. Solo curioso, ho trovato le stesse identiche formule e quasi la stessa formulazione su exceljet.net/formula/get-value-of-last-non-empty-cell . Sei anche tu o qualcun altro? Non esiste una connessione evidente.
Solomon Rutzky

24

Ecco un'altra opzione: =OFFSET($A$1;COUNTA(A:A)-1;0)


9
Questo non funzionerà se ci sono celle con valori non numerici (usa COUNTAinvece di COUNT). Per non parlare delle celle vuote.
Jean-François Corbett

3
Questo dovrebbe essere in cima. è semplice e non si basa su dettagli oscuri di funzioni non comuni.
Tmdean

9
Non dovrebbe essere in alto perché è sbagliato quando i risultati hanno spazi vuoti incorporati.
Myrddin Emrys

17

Ispirato dal grande vantaggio dato dalla risposta di Doug Glancy, ho escogitato un modo per fare la stessa cosa senza la necessità di una formula di matrice. Non chiedermi perché, ma sono desideroso di evitare l'uso di formule di matrice se possibile (non per un motivo particolare, è solo il mio stile).

Ecco qui:

=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))

Per trovare l'ultima riga non vuota utilizzando la colonna A come colonna di riferimento

=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))

Per trovare l'ultima colonna non vuota utilizzando la riga 1 come riga di riferimento

Questo può essere ulteriormente utilizzato insieme alla funzione di indice per definire in modo efficiente intervalli denominati dinamici, ma questo è qualcosa per un altro post poiché non è correlato alla domanda immediata qui affrontata.

Ho testato i metodi di cui sopra con Excel 2010, sia "nativamente" che in "Modalità compatibilità" (per le versioni precedenti di Excel) e funzionano. Di nuovo, con questi non è necessario eseguire nessuno dei tasti Ctrl + Maiusc + Invio. Sfruttando il modo in cui funziona sumproduct in Excel, possiamo comprendere la necessità di eseguire operazioni con array, ma lo facciamo senza una formula-array. Spero che qualcuno là fuori possa apprezzare la bellezza, la semplicità e l'eleganza di queste soluzioni di sumproduct proposte tanto quanto me. Tuttavia, non attesto l'efficienza della memoria delle soluzioni di cui sopra. Solo che sono semplici, hanno un bell'aspetto, aiutano lo scopo previsto e sono abbastanza flessibili da estendere il loro utilizzo ad altri scopi :)

Spero che questo ti aiuti!

Ti auguro il meglio!


1
Per quanto riguarda il motivo per cui si utilizzano formule non di matrice, vedere questa risposta di seguito .
sancho.s ReinstateMonicaCellio

17

So che questa domanda è vecchia, ma non sono soddisfatto delle risposte fornite.

  • CERCA, CERCA.VERT e CERCA.ORIZZ presentano problemi di prestazioni e in realtà non dovrebbero mai essere utilizzati.

  • Le funzioni array hanno un sovraccarico elevato e possono anche avere problemi di prestazioni, quindi dovrebbero essere utilizzate solo come ultima risorsa.

  • COUNT e COUNTA incontrano problemi se i dati non sono contigui non vuoti, ovvero hai spazi vuoti e quindi i dati di nuovo nell'intervallo in questione

  • INDIRETTO è volatile, quindi dovrebbe essere usato solo come ultima risorsa

  • OFFSET è volatile, quindi dovrebbe essere utilizzato solo come ultima risorsa

  • qualsiasi riferimento all'ultima riga o colonna possibile (la riga 65536esima in Excel 2003, ad esempio) non è affidabile e comporta un sovraccarico aggiuntivo

Questo è quello che uso

  • quando il tipo di dati è misto: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))

  • quando si sa che i dati contengono solo numeri: =MATCH(1E+306,[RANGE],1)

  • quando si sa che i dati contengono solo testo: =MATCH("*",[RANGE],-1)

MATCH ha l'overhead più basso ed è non volatile, quindi se stai lavorando con molti dati questo è il migliore da usare.


Questa è una buona risposta (+1), ma ci sono ancora alcune scappatoie che questo metodo può perdere. Ad esempio, se sono presenti celle con valori logici ( TRUE/ FALSE), non verranno rilevate. Nonostante il fatto che questa risposta non sia a prova di proiettile, penso comunque che questa risposta abbia il minimo impatto sulle prestazioni.
ImaginaryHuman072889

2
Match restituisce un indice, non il valore della cella. È possibile utilizzare la funzione index per ottenere il valore. Inoltre, dovresti probabilmente includere qualcosa su ciò che dovrebbe essere [RANGE]. Ho selezionato l'intera colonna utilizzando "N: N". Ecco un esempio che ha funzionato per me: =INDEX(N:N,MATCH(1E+306,N:N,1))
swimfar

10

Funziona in Excel 2003 (e versioni successive con modifiche minori, vedi sotto). Premi Ctrl + Maiusc + Invio (non solo Invio) per inserirlo come formula di matrice.

=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)

Tenere presente che Excel 2003 non è in grado di applicare una formula di matrice a un'intera colonna. In questo modo si ottiene #NUM!; possono verificarsi risultati imprevedibili! (EDIT : informazioni in conflitto da Microsoft: lo stesso può o non può essere vero per Excel 2007; il problema potrebbe essere stato risolto nel 2010. )

Ecco perché applico la formula di matrice all'intervallo A1:A65535e do un trattamento speciale all'ultima cella, che è A65536in Excel 2003. Non posso solo dire A:Ao anche A1:A65536se quest'ultima torna automaticamente a A:A.

Se sei assolutamente sicuro che A65536sia vuoto, puoi saltare la IFparte:

=INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535))))

Tieni presente che se stai utilizzando Excel 2007 o 2010, il numero dell'ultima riga è 1048576 e non 65536, quindi regola quanto sopra come appropriato.

Se non ci sono celle vuote nel mezzo dei vostri dati, quindi vorrei solo uso la formula più semplice, =INDEX(A:A,COUNTA(A:A)).


Per ROW invece della colonna, questo ha funzionato per me=INDEX(19:19,COUNTA(19:19))
Serj Sagan

8

Una soluzione alternativa senza formule di matrice, possibilmente più robusta di quella di una risposta precedente con una soluzione (suggerimento a) senza formule di matrice , è

=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))

Vedi questa risposta come un esempio. Complimenti a Brad e Barry Houdini , che hanno contribuito a risolvere questa domanda .

Possibili ragioni per preferire una formula non array sono fornite in:

  1. Una pagina Microsoft ufficiale (cercare "Svantaggi dell'utilizzo di formule di matrice").
    Le formule di matrice possono sembrare magiche, ma presentano anche alcuni svantaggi:

    • Occasionalmente potresti dimenticare di premere CTRL + MAIUSC + INVIO. Ricordarsi di premere questa combinazione di tasti ogni volta che si immette o si modifica una formula di matrice.
    • Altri utenti potrebbero non capire le tue formule. Le formule di matrice sono relativamente non documentate, quindi se altre persone hanno bisogno di modificare le tue cartelle di lavoro, dovresti evitare le formule di matrice o assicurarti che gli utenti capiscano come modificarle.
    • A seconda della velocità di elaborazione e della memoria del computer, le formule di array di grandi dimensioni possono rallentare i calcoli.
  2. Array Formula Heresy .


Non riesco a farlo funzionare con la colonna D. Ho sostituito tutte le Aoccorrenze con un file D. Che cosa sto facendo di sbagliato?
Marc 2377

5

se cerchi nella colonna (A) usa:

=INDIRECT("A" & SUMPRODUCT(MAX((A:A<>"")*(ROW(A:A)))))

se il tuo intervallo è A1: A10 puoi usare:

=INDIRECT("A" & SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10)))))

in questa formula:

SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10))))

restituisce l'ultimo numero di riga non vuoto e indiretto () restituisce il valore della cella.



2

=MATCH("*";A1:A10;-1) per i dati testuali

=MATCH(0;A1:A10;-1) per i dati numerici


Utilizza i blocchi di codice quando fornisci lo snippet di codice nelle tue risposte.
β.εηοιτ.βε

Penso che queste formule ci daranno la prima cella non vuota, non l'ultima cella non vuota.
Baodad

2

Ho provato tutte le versioni non volatili ma nessuna delle versioni sopra indicate ha funzionato .. excel 2003/2007update. Sicuramente questo può essere fatto in Excel 2003. Non come un array né come formula standard. Ricevo solo un errore vuoto, 0 o #value. Quindi ricorro ai metodi volatili .. Questo ha funzionato ..

= CERCA (2,1 / (T4: T369 <> ""), T4: T369)

@ Julian Kroné .. Utilizzo di ";" invece di "," NON funziona! Penso che tu stia usando Libre Office e non MS Excel? LOOKUP è così fastidiosamente volitivo che lo uso solo come ultima risorsa


0

Inserisci questo codice in un modulo VBA. Salva. Sotto funzioni, cercare Definito dall'utente per Questa funzione.

Function LastNonBlankCell(Range As Excel.Range) As Variant
    Application.Volatile
    LastNonBlankCell = Range.End(xlDown).Value
End Function

2
Questa non è necessariamente l'ULTIMA cella vuota, ma solo la PROSSIMA cella vuota che inizia dall'alto.
Portland Runner

La domanda riguarda una formula, non VBA
Patrick Honorez

0

per i dati testuali:

EQUIV("";A1:A10;-1)

per i dati numerici:

EQUIV(0;A1:A10;-1)

Questo ti dà l'indice relativo dell'ultima cella non vuota nell'intervallo selezionato (qui A1: A10).

Se vuoi ottenere il valore, accedilo tramite INDIRETTO dopo aver costruito -testualmente- il riferimento di cella assoluto, ad esempio:

INDIRECT("A" & (nb_line_where_your_data_start + EQUIV(...) - 1))

0

Anch'io ho avuto lo stesso problema. Anche questa formula funziona altrettanto bene: -

=INDIRECT(CONCATENATE("$G$",(14+(COUNTA($G$14:$G$65535)-1))))

14 è il numero di riga della prima riga delle righe che vuoi contare.

Artiglio cronico


0

Ho usato CERCA

A1ha una data; A2:A8ha previsioni acquisite in momenti diversi, voglio le ultime

=Hlookup(a1,a1:a8,count(a2:a8)+1)

Utilizza una formula hlookup standard con la matrice di ricerca definita dal numero di voci.


0

Se sai che non ci saranno celle vuote in mezzo, il modo più veloce è questo.

=INDIRECT("O"&(COUNT(O:O,"<>""")))

Conta solo le celle non vuote e fa riferimento alla cella appropriata.

Può essere utilizzato anche per una gamma specifica.

=INDIRECT("O"&(COUNT(O4:O34,"<>""")+3))

Restituisce l'ultima cella non vuota nell'intervallo O4: O34.


0

Per Microsoft Office 2013

"Last but one" di una riga non vuota:

=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-2,0)

"Ultima" riga non vuota:

=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-1,0)

0

Questa formula ha funzionato con me per Office 2010:

= CERCA (2; 1 / (A1: A100 <> ""); A1: A100)

A1: la prima cella A100: fare riferimento all'ultima cella nel confronto


0

Penso che la risposta di W5ALIVE sia la più vicina a quella che uso per trovare l'ultima riga di dati in una colonna. Supponendo che io stia cercando l'ultima riga con i dati nella colonna A, tuttavia, utilizzerei quanto segue per la ricerca più generica:

=MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0))

La prima MATCH troverà l'ultima cella di testo e la seconda MATCH troverà l'ultima cella numerica. La funzione SE.ERRORE restituisce zero se la prima CONFRONTA trova tutte le celle numeriche o se la seconda corrispondenza trova tutte le celle di testo.

Fondamentalmente questa è una leggera variazione della soluzione mista di testo e numero di W5ALIVE.

Nel testare i tempi, questo è stato significativamente più veloce rispetto alle varianti di RICERCA equivalenti.

Per restituire il valore effettivo di quest'ultima cella, preferisco utilizzare riferimenti di cella indiretti in questo modo:

=INDIRECT("A"&MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0)))

Il metodo offerto da sancho.s è forse un'opzione più pulita, ma modificherei la parte che trova il numero di riga in questo:

=INDEX(MAX((A:A<>"")*(ROW(A:A))),1)

l'unica differenza è che ", 1" restituisce il primo valore mentre ", 0" restituisce l'intero array di valori (tutti tranne uno non sono necessari). Tendo ancora a preferire indirizzare la cella alla funzione index lì, in altre parole, restituendo il valore della cella con:

=INDIRECT("A"&INDEX(MAX((A:A<>"")*(ROW(A:A))),1))

Grande filo!


0

Se non hai paura di usare gli array, la seguente è una formula molto semplice per risolvere il problema:

= SUM (IF (A: A <> "", 1,0))

È necessario premere CTRL + MAIUSC + INVIO perché si tratta di una formula di matrice.


-1

Uno semplice che funziona per me:

=F7-INDEX(A:A,COUNT(A:A))

-1

Ok, quindi ho avuto lo stesso problema del richiedente e ho provato entrambe le risposte migliori. Ma ottenendo solo errori di formula. Si è scoperto che avevo bisogno di scambiare i caratteri "," con ";" affinché le formule funzionino. Sto usando XL 2007.

Esempio:

=LOOKUP(2;1/(A:A<>"");A:A)

o

=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))

-3

Per il monitoraggio della versione (aggiungendo la lettera v all'inizio del numero), ho trovato che questo funziona bene in Xcelsius (SAP Dashboards)

="v"&MAX(A2:A500)

1
Sembra insufficientemente generale, poiché si basa su un ordine rigorosamente crescente.
Nathan Tuggy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.