Risposte:
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))))
CELL()
O OFFSET()
), mentre quello più votato restituisce un valore senza dirti dove si trova.
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:
Spiegazione:
(A:A<>"")
restituisce array {TRUE,TRUE,..,FALSE,..}
1/(A:A<>"")
modifica questo array in {1,1,..,#DIV/0!,..}
.LOOKUP
aspetta un array ordinato in ordine crescente , e tenendo conto che se la LOOKUP
funzione 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 1
nella 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:
LOOKUP
dice che l'ultimo argomento result_vector
è facoltativo. Tuttavia se lo ometto, ottengo un risultato molto strano che non capisco.
LOOKUP
funzione non riesce a trovare lookup_value
, la funzione corrisponde al valore più grande lookup_vector
che è 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.
=LOOKUP(2,1/(A:A<>""),ROW(A:A))
ma l'aggiunta della ROW
funzione aggiungerà l'effetto "volatilità" - la formula verrà ricalcolata ogni volta che viene modificata una cella del foglio di lavoro
Ecco un'altra opzione: =OFFSET($A$1;COUNTA(A:A)-1;0)
COUNTA
invece di COUNT
). Per non parlare delle celle vuote.
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!
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.
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.
=INDEX(N:N,MATCH(1E+306,N:N,1))
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:A65535
e do un trattamento speciale all'ultima cella, che è A65536
in Excel 2003. Non posso solo dire A:A
o anche A1:A65536
se quest'ultima torna automaticamente a A:A
.
Se sei assolutamente sicuro che A65536
sia vuoto, puoi saltare la IF
parte:
=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))
.
=INDEX(19:19,COUNTA(19:19))
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:
Una pagina Microsoft ufficiale (cercare "Svantaggi dell'utilizzo di formule di matrice").
Le formule di matrice possono sembrare magiche, ma presentano anche alcuni svantaggi:
A
occorrenze con un file D
. Che cosa sto facendo di sbagliato?
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.
=INDEX(A:A, COUNTA(A:A), 1)
preso da qui
=MATCH("*";A1:A10;-1)
per i dati testuali
=MATCH(0;A1:A10;-1)
per i dati numerici
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
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
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))
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
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.
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!
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.
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))))
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)