web-dev-qa-db-fra.com

Dernière cellule non vide dans une colonne

Est-ce que quelqu'un connaît la formule pour trouver la valeur de la dernière cellule non vide d'une colonne, dans Microsoft Excel?

101
MichaelS

Cela fonctionne à la fois avec du texte et des chiffres et ne s’inquiète pas s’il ya des cellules vides, c’est-à-dire qu’il renverra la dernière cellule non vide.

Il doit être entré dans un tableau, ce qui signifie que vous appuyez sur Ctrl-Shft-Enter après que vous avez tapé ou collé dedans.

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

La formule simple suivante est beaucoup plus rapide

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

Pour Excel 2003:

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

Cela vous donne les avantages suivants:

  • c'est la formule not array
  • c'est pas volatile formule

Explication:

  • (A:A<>"") renvoie le tableau {TRUE,TRUE,..,FALSE,..} 
  • 1/(A:A<>"") modifie ce tableau en {1,1,..,#DIV/0!,..}
  • Puisque LOOKUP expects trié tableau dans croissant ordre, et en tenant compte du fait que si la fonction LOOKUP ne peut pas trouver une correspondance exacte, elle choisit la plus grande valeur dans le lookup_range ( Dans notre cas, {1,1,..,#DIV/0!,..}) inférieur ou égal à la valeur (dans notre cas, 2), la formule trouve le dernier 1 dans le tableau et renvoie la valeur correspondante à partir de result_range (troisième paramètre - A:A). 

Aussi petite note - la formule ci-dessus ne prend pas en compte les cellules avec des erreurs (vous pouvez la voir uniquement si la dernière cellule non vide contient une erreur). Si vous voulez les prendre en compte, utilisez:

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

l'image ci-dessous montre la différence:

enter image description here

118
Dmitry Pavliv

Voici une autre option: =OFFSET($A$1;COUNTA(A:A)-1;0)

23
Patrick Honorez

Inspiré par la grande avance donnée par la réponse de Doug Glancy, j'ai trouvé un moyen de faire la même chose sans avoir besoin d'une formule matricielle. Ne me demandez pas pourquoi, mais je tiens à éviter si possible l'utilisation de formules matricielles (pas pour une raison particulière, c'est juste mon style). 

C'est ici: 

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

Pour rechercher la dernière ligne non vide en utilisant la colonne A comme colonne de référence

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

Pour rechercher la dernière colonne non vide en utilisant la ligne 1 comme ligne de référence

Ceci peut être utilisé davantage en conjonction avec la fonction index pour définir efficacement des plages nommées dynamiques, mais cela convient à une autre publication car cela n’est pas lié à la question immédiate qui est traitée ici. 

J'ai testé les méthodes ci-dessus avec Excel 2010, à la fois de manière "native" et en "mode de compatibilité" (pour les anciennes versions d'Excel) et elles fonctionnent. Encore une fois, avec ceux-ci, vous n'avez pas besoin de faire Ctrl + Maj + Entrée. En exploitant le fonctionnement de sumproduct dans Excel, nous pouvons comprendre le besoin de mener des opérations de tableau, mais nous le faisons sans formule de tableau. J'espère que quelqu'un pourra apprécier autant que moi la beauté, la simplicité et l'élégance de ces solutions proposées. Je n'atteste cependant pas l'efficacité de la mémoire des solutions ci-dessus. Simplement qu'ils sont simples, beaux, aident le but recherché et sont assez flexibles pour étendre leur utilisation à d'autres buts :)

J'espère que cela t'aides!

Bonne chance!

14
Santiago

Cela fonctionne dans Excel 2003 (et plus tard avec une modification mineure, voir ci-dessous). Appuyez sur Ctrl + Maj + Entrée (pas seulement Entrée) pour entrer ceci sous forme de formule matricielle.

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

Sachez qu'Excel 2003 est incapable d'appliquer une formule matricielle à une colonne entière. Cela donne #NUM!; des résultats imprévisibles peuvent survenir! (EDIT: informations contradictoires provenant de Microsoft: identiques peuvent ou peuvent ne pas être vraisemblables à propos d'Excel 2007; le problème peut a été corrigé en 2010 .) 

C'est pourquoi j'applique la formule matricielle à la plage A1:A65535 et donne un traitement spécial à la dernière cellule, qui est A65536 dans Excel 2003. Je ne peux pas simplement dire A:A ou même A1:A65536 car cette dernière revient automatiquement à A:A.

Si vous êtes absolument certain que A65536 est vide, vous pouvez ignorer la partie IF:

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

Notez que si vous utilisez Excel 2007 ou 2010, le dernier numéro de ligne est 1048576 et non 65536, donc ajustez ce qui précède comme il convient. 

S'il n'y a pas de cellules vides au milieu de vos données, j'utiliserais simplement la formule plus simple, =INDEX(A:A,COUNTA(A:A)).

10

Je sais que cette question est ancienne, mais je ne suis pas satisfait des réponses fournies.

  • LOOKUP, VLOOKUP et HLOOKUP ont des problèmes de performances et ne doivent en aucun cas être utilisés. 

  • Les fonctions de tableau entraînent beaucoup de frais généraux et peuvent également avoir des problèmes de performances. Par conséquent, elles ne doivent être utilisées qu'en dernier recours. 

  • COUNT et COUNTA rencontrent des problèmes si les données ne sont pas non vides de manière contiguë, c’est-à-dire que vous avez des espaces et des données à nouveau dans la plage en question

  • INDIRECT est volatile, il ne doit donc être utilisé qu'en dernier recours

  • OFFSET est volatile, il ne doit donc être utilisé qu'en dernier recours

  • toute référence à la dernière ligne ou colonne possible (la 65536ème ligne dans Excel 2003, par exemple) n'est pas robuste et entraîne une surcharge supplémentaire

C'est ce que j'utilise

  • lorsque le type de données est mélangé: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))

  • quand on sait que les données ne contiennent que des chiffres: =MATCH(1E+306,[RANGE],1)

  • quand on sait que les données ne contiennent que du texte: =MATCH("*",[RANGE],-1)

MATCH a le temps système le plus bas et est non volatile. Par conséquent, si vous travaillez avec beaucoup de données, il est préférable de l'utiliser.

10
W5ALIVE

Une solution alternative sans formules de tableau, éventuellement plus robuste que celle de une réponse précédente avec un (indice à une) solution sans formules de tableau , est

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

Voir cette réponse à titre d'exemple . Félicitations à Brad et barry houdini , qui ont aidé à résoudre cette question .

Les raisons possibles pour préférer une formule sans tableau sont données dans:

  1. Une page Microsoft officielle (recherchez "Inconvénients de l’utilisation de formules matricielles") .
    Les formules de tableau peuvent sembler magiques, mais elles ont aussi quelques inconvénients:

    • Vous pouvez parfois oublier d’appuyer sur CTRL + MAJ + ENTRÉE. N'oubliez pas d'appuyer sur cette combinaison de touches chaque fois que vous entrez ou modifiez une formule matricielle.
    • Les autres utilisateurs peuvent ne pas comprendre vos formules. Les formules de tableau sont relativement peu documentées. Par conséquent, si d'autres personnes doivent modifier vos classeurs, évitez les formules de tableau ou assurez-vous que ces utilisateurs comprennent comment les modifier.
    • En fonction de la vitesse de traitement et de la mémoire de votre ordinateur, les formules de grand tableau peuvent ralentir les calculs.
  2. Array Formula Heresy .

7
sancho.s

=INDEX(A:A, COUNTA(A:A), 1) extrait de ici

2
HattrickNZ

=MATCH("*";A1:A10;-1) pour les données textuelles

=MATCH(0;A1:A10;-1) pour les données numériques

2
liharvi

J'ai essayé toutes les versions non-volatiles mais aucune des versions données ci-dessus n'a fonctionné. Excel 2003/2007update. Cela peut sûrement être fait dans Excel 2003. Pas sous forme de tableau ni de formule standard… .. Je ne reçois qu'une erreur vide, 0 ou une valeur. J'ai donc recours aux méthodes volatiles .. Cela a fonctionné .. 

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

@ Julian Kroné .. Utilisation de ";" au lieu de "," ne fonctionne pas! Je pense que vous utilisez Libre Office et non MS Excel? LOOKUP est tellement ennuyeux que je l’utilise en dernier recours.

1
remote one

si vous recherchez dans la colonne (A), utilisez:

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

si votre plage est A1: A10, vous pouvez utiliser:

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

dans cette formule:

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

renvoie le dernier numéro de ligne non vide et indirect () renvoie la valeur de la cellule.

1
Sharif Lotfi

pour les données textuelles: 

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

pour les données numériques: 

EQUIV(0;A1:A10;-1)

Cela vous donne l'indice relatif de la dernière cellule non vide de la plage sélectionnée (ici A1: A10).

Si vous voulez obtenir la valeur, accédez-y via INDIRECT après avoir construit - textuellement - la référence de cellule absolue, par exemple: 

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

Je pense que la réponse de W5ALIVE est la plus proche de ce que j'utilise pour trouver la dernière ligne de données d'une colonne. En supposant que je recherche la dernière ligne avec les données de la colonne A, toutefois, j'utiliserais ce qui suit pour la recherche plus générique:

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

Le premier MATCH trouvera la dernière cellule de texte et le second MATCH trouvera la dernière cellule numérique. La fonction IFERROR renvoie zéro si le premier MATCH trouve toutes les cellules numériques ou si la seconde correspondance trouve toutes les cellules de texte.

Fondamentalement, il s’agit d’une légère variation de la solution mixte de texte et de chiffres de W5ALIVE. 

En testant le timing, cela a été significativement plus rapide que les variations équivalentes de LOOKUP.

Pour renvoyer la valeur réelle de cette dernière cellule, je préfère utiliser le référencement de cellule indirect comme ceci:

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

La méthode proposée par sancho.s est peut-être une option plus propre, mais je modifierais la partie qui trouve le numéro de ligne comme suit:

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

la seule différence étant que ", 1" renvoie la première valeur, tandis que ", 0" renvoie la totalité du tableau de valeurs (dont une n'est pas nécessaire). J'ai toujours tendance à préférer adresser la cellule à la fonction d'index, autrement dit, renvoyer la valeur de la cellule avec:

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

Grand fil!

0
FocusWiz

Placez ce code dans un module VBA. Sauvegarder. Sous Fonctions, Défini par l'utilisateur, recherchez Cette fonction.

Function LastNonBlankCell(Range As Excel.Range) As Variant
    Application.Volatile
    LastNonBlankCell = Range.End(xlDown).Value
End Function
0
Mac vd Wsthuizen

J'ai utilisé HLOOKUP

A1 a une date; A2:A8 a des prévisions saisies à différents moments, je veux les dernières

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

Ceci utilise une formule hlookup standard avec le tableau de référence défini par le nombre d'entrées.

0
Chris

Si vous n’avez pas peur d’utiliser des tableaux, voici une formule très simple pour résoudre le problème:

= SOMME (SI (A: A <> "", 1,0))

Vous devez appuyer sur CTRL + MAJ + ENTRÉE car il s'agit d'une formule matricielle.

0
Bits_of_guy

Si vous savez qu'il n'y aura pas de cellules vides entre les deux, voici le moyen le plus rapide. 

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

Il ne compte que les cellules non vides et fait référence à la cellule appropriée.

Il peut également être utilisé pour une plage spécifique.

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

Cela renvoie la dernière cellule non vide de la plage O4: O34.

0
Tassos Mallis

Cette formule a fonctionné avec moi pour office 2010:

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

A1: la première cellule A100: fait référence à la dernière cellule en comparant

0
Wahed

J'ai eu le même problème aussi. Cette formule fonctionne aussi bien: -

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

14 étant le numéro de la première ligne des lignes que vous souhaitez compter.

Griffe chronique

0
Chronic Clawtooth

Pour Microsoft Office 2013

"Dernier avant un" d'une ligne non vide:

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

"Dernière" ligne non vide:

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