Dernière cellule non vide d'une colonne

112

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

MichaelS
la source
Je me tournerais vers VBA pour cela.
David Heffernan

Réponses:

76

Cela fonctionne à la fois avec du texte et des nombres et ne se soucie pas s'il y a 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-Maj-Entrée après l'avoir tapé ou collé. Ce qui suit est pour la colonne A:

=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
Doug Glancy
la source
@ Jean-François, Désolé, je l'ai reconnu dans un commentaire hier soir mais je l'ai mis dans le message d'origine par erreur. Cela fonctionne dans XL 2007 et 2010. Merci.
Doug Glancy
Ne fonctionne pas pour moi dans Excel 2007. J'ai collé la formule exacte. J'ai une colonne (A), où les valeurs sont = ROW () jusqu'à 127ish, et la formule renvoie "1"
DontFretBrett
2
@DontFretBrett, assurez-vous de le saisir sous forme de formule matricielle avec Ctrl-Maj-Entrée comme spécifié dans la réponse.
Doug Glancy
@DougGlancy échoue de ma part. Je vous remercie!
DontFretBrett
1
La différence importante est que celle-ci renvoie une référence de cellule (elle peut donc être passée à par exemple CELL()ou OFFSET()), alors que la plus votée renvoie une valeur sans vous dire où elle se trouve.
GSerg
128

L'utilisation de 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)

Il vous offre les avantages suivants:

  • ce n'est pas une formule matricielle
  • ce n'est pas une formule volatile

Explication:

  • (A:A<>"") renvoie le tableau {TRUE,TRUE,..,FALSE,..}
  • 1/(A:A<>"")modifie ce tableau en {1,1,..,#DIV/0!,..}.
  • Puisque LOOKUPs'attend à un tableau trié dans l' ordre croissant , et en tenant compte du fait que si la LOOKUPfonction ne peut pas trouver une correspondance exacte, elle choisit la plus grande valeur dans lookup_range(dans notre cas {1,1,..,#DIV/0!,..}) qui est inférieure ou égale à la valeur (dans notre cas 2), La formule trouve le dernier 1dans le tableau et renvoie la valeur correspondante de result_range(troisième paramètre - A:A).

Petite remarque également - la formule ci-dessus ne prend pas en compte les cellules avec des erreurs (vous ne pouvez la voir que si la dernière cellule non vide contient une erreur). Si vous souhaitez les prendre en compte, utilisez:

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

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

entrez la description de l'image ici

Dmitry Pavliv
la source
merci pour l'explication et belle photo. Encore quelques questions restent ouvertes: 1. La documentation de LOOKUPdit que le dernier argument result_vectorest facultatif. Cependant si je l'omets, j'obtiens un résultat très étrange que je ne comprends pas.
Honza Zidek
2. La documentation dit "Si la LOOKUPfonction ne trouve pas le lookup_value, la fonction correspond à la plus grande valeur lookup_vectorqui est inférieure ou égale à lookup_value." Si j'utilise =LOOKUP(2,A:A<>"",A:A)sans générer l' #DIV/0!erreur par 1/..., il semble qu'elle renvoie une valeur au milieu de le vecteur. Je n'ai pas trouvé quelle est la fonctionnalité exacte dans ce cas.
Honza Zidek
1
Très belle explication. Ayant récemment réduit les minutes de calcul en déplaçant les formules des formules matricielles vers les versions non matricielles, je suis toujours partant pour une logique qui fonctionne sans nécessiter de formules matricielles.
tobriand
1
@Enissay, oui, celui-ci renverra le numéro de ligne =LOOKUP(2,1/(A:A<>""),ROW(A:A))mais l'ajout d'une ROWfonction ajoutera un effet de «volatilité» - la formule sera recalculée à chaque fois qu'une cellule de la feuille de travail sera modifiée
Dmitry Pavliv
1
Héy. Merci d'avoir publié ceci. Juste curieux, j'ai trouvé exactement les mêmes formules et à peu près le même libellé sur exceljet.net/formula/get-value-of-last-non-empty-cell . Est-ce aussi vous ou quelqu'un d'autre? Il n'y a pas de lien évident.
Solomon Rutzky
24

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

Patrick Honorez
la source
9
Cela ne fonctionnera pas s'il y a des cellules avec des valeurs non numériques (utilisez à la COUNTAplace de COUNT). Sans parler des cellules vides.
Jean-François Corbett
3
Cela devrait être au sommet. c'est simple et ne repose pas sur des détails obscurs de fonctions rares.
Tmdean
9
Il ne doit pas être en haut car il est faux lorsque les résultats comportent des blancs incorporés.
Myrddin Emrys
17

Inspiré par l'excellente piste 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

Cela peut être utilisé en outre en conjonction avec la fonction d'index pour définir efficacement des plages nommées dynamiques, mais c'est quelque chose pour un autre article car cela n'est pas lié à la question immédiate abordée ici.

J'ai testé les méthodes ci-dessus avec Excel 2010, à la fois "nativement" 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 l'un des Ctrl + Maj + Entrée. En tirant parti du fonctionnement de sumproduct dans Excel, nous pouvons maîtriser la nécessité d'effectuer des opérations de tableau, mais nous le faisons sans formule matricielle. J'espère que quelqu'un pourra apprécier autant que moi la beauté, la simplicité et l'élégance de ces solutions sumproduct proposées. Je n'atteste cependant pas l'efficacité de la mémoire des solutions ci-dessus. Juste qu'ils sont simples, beaux, contribuent à l'objectif visé et sont suffisamment flexibles pour étendre leur utilisation à d'autres fins :)

J'espère que cela t'aides!

Bonne chance!

Santiago
la source
1
Pour savoir pourquoi utiliser des formules non matricielles, voir cette réponse ci-dessous .
sancho.s ReinstateMonicaCellio
17

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 devraient vraiment jamais être utilisés.

  • Les fonctions de baie ont beaucoup de surcharge et peuvent également avoir des problèmes de performances, elles ne doivent donc être utilisées qu'en dernier recours.

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

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

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

  • toute référence à la dernière ligne ou colonne possible (la 65536e 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 mixte: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))

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

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

MATCH a la plus faible surcharge et est non volatile, donc si vous travaillez avec beaucoup de données, c'est le meilleur à utiliser.

W5ALIVE
la source
C'est une bonne réponse (+1), mais il y a encore quelques failles que cette méthode peut manquer. Par exemple, s'il y a des cellules avec des valeurs logiques ( TRUE/ FALSE), elles ne seront pas détectées. Malgré le fait que cette réponse ne soit pas à toute épreuve, je pense toujours que cette réponse a le moins d'impact sur les performances.
ImaginaryHuman072889
2
Match renvoie un index, pas la valeur de la cellule. Vous pouvez utiliser la fonction index pour obtenir la valeur. De plus, vous devriez probablement inclure quelque chose sur ce que [RANGE] est censé être. J'ai sélectionné la colonne entière en utilisant "N: N". Voici un exemple qui a fonctionné pour moi: =INDEX(N:N,MATCH(1E+306,N:N,1))
swimfar
10

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

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

Sachez qu'Excel 2003 ne peut pas appliquer une formule matricielle à une colonne entière. Faire ainsi cède #NUM!; des résultats imprévisibles peuvent survenir! (MODIFIER : informations contradictoires de Microsoft: la même chose peut être vraie ou non à propos d'Excel 2007; le problème a peut- être été résolu en 2010. )

C'est pourquoi j'applique la formule matricielle à la plage A1:A65535et donne un traitement spécial à la dernière cellule, qui se trouve A65536dans Excel 2003. Je ne peux pas simplement dire A:Aou même A1:A65536lorsque cette dernière revient automatiquement A:A.

Si vous êtes absolument sûr que le champ A65536est vide, vous pouvez ignorer la IFpartie:

=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 le cas échéant.

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

Jean-François Corbett
la source
Pour ROW au lieu de la colonne, cela a fonctionné pour moi=INDEX(19:19,COUNTA(19:19))
Serj Sagan
8

Une solution alternative sans formules matricielles, peut-être plus robuste que celle d' une réponse précédente avec une (allusion à une) solution sans formules matricielles , est

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

Voyez 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 non matricielle sont données dans:

  1. Une page officielle de Microsoft (recherchez "Inconvénients de l'utilisation de formules matricielles").
    Les formules matricielles peuvent sembler magiques, mais elles présentent également certains 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.
    • D'autres utilisateurs peuvent ne pas comprendre vos formules. Les formules matricielles sont relativement peu documentées, donc si d'autres personnes doivent modifier vos classeurs, vous devez soit éviter les formules matricielles, soit vous assurer 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 .

sancho.s Réintégrer MonicaCellio
la source
Je ne peux pas faire fonctionner cela avec la colonne D. J'ai remplacé toutes les Aoccurrences par un D. Qu'est-ce que je fais mal?
Marc 2377 du
5

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.

Sharif Lotfi
la source
2

=INDEX(A:A, COUNTA(A:A), 1)pris d' ici

HattrickNZ
la source
2

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

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

liharvi
la source
Veuillez utiliser des blocs de code lorsque vous fournissez un extrait de code dans vos réponses.
β.εηοιτ.βε
Je pense que ces formules nous donneront la première cellule non vide, pas la dernière cellule non vide.
Baodad
2

J'ai essayé toutes les versions non volatiles mais aucune version donnée ci-dessus n'a fonctionné .. excel 2003/2007update. Cela peut certainement être fait dans Excel 2003. Pas sous forme de tableau ni de formule standard. Soit j'obtiens juste une erreur vide, 0 ou #value. 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 volitile que je ne l'utilise qu'en dernier recours

distant
la source
0

Placez ce code dans un module VBA. Sauver. Sous Fonctions, Recherche définie par l'utilisateur pour Cette fonction.

Function LastNonBlankCell(Range As Excel.Range) As Variant
    Application.Volatile
    LastNonBlankCell = Range.End(xlDown).Value
End Function
Mac vd Wsthuizen
la source
2
Ce n'est pas nécessairement la dernière cellule vide, juste la cellule vide SUIVANT commençant en haut.
Portland Runner
La question concerne une formule, pas VBA
Patrick Honorez
0

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))
Adel
la source
0

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

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

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

Griffe chronique

Griffe chronique
la source
0

J'ai utilisé HLOOKUP

A1a une date; A2:A8a des prévisions capturées à des moments différents, je veux les dernières

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

Cela utilise une formule hlookup standard avec le tableau de recherche défini par le nombre d'entrées.

Chris
la source
0

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

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

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

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

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

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

Tassos Mallis
la source
0

Pour Microsoft Office 2013

"Last but one" 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)
aprodan
la source
0

Cette formule a fonctionné avec moi pour le bureau 2010:

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

A1: la première cellule A100: se référer à la dernière cellule en comparant

Wahed
la source
0

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 dans une colonne. En supposant que je recherche la dernière ligne avec des données dans la colonne A, 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 nombre de W5ALIVE.

Lors du test du timing, cela a été significativement plus rapide que les variantes LOOKUP équivalentes.

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 le ", 1" renvoie la première valeur tandis que le ", 0" renvoie le tableau entier de valeurs (dont toutes sauf une ne sont pas nécessaires). J'ai toujours tendance à préférer adresser la cellule à la fonction d'index là-bas, en d'autres termes, renvoyer la valeur de la cellule avec:

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

Super fil!

FocusWiz
la source
0

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.

Bits_of_guy
la source
-1

Un simple qui fonctionne pour moi:

=F7-INDEX(A:A,COUNT(A:A))
nemo
la source
-1

D'accord, j'ai donc eu le même problème que le demandeur et j'ai essayé les deux principales réponses. Mais seulement obtenir des erreurs de formule. Il s'est avéré que j'avais besoin d'échanger le "," contre ";" pour que les formules fonctionnent. J'utilise XL 2007.

Exemple:

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

ou

=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))
Julian Kroné
la source
-3

Pour le suivi de version (en ajoutant la lettre v au début du numéro), j'ai trouvé que celui-ci fonctionnait bien dans Xcelsius (SAP Dashboards)

="v"&MAX(A2:A500)
Monsieur B
la source
1
Semble insuffisamment général, car il repose sur un ordre strictement ascendant.
Nathan Tuggy