Réponses:
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))))
CELL()
ou OFFSET()
), alors que la plus votée renvoie une valeur sans vous dire où elle se trouve.
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:
Explication:
(A:A<>"")
renvoie le tableau {TRUE,TRUE,..,FALSE,..}
1/(A:A<>"")
modifie ce tableau en {1,1,..,#DIV/0!,..}
.LOOKUP
s'attend à un tableau trié dans l' ordre croissant , et en tenant compte du fait que si la LOOKUP
fonction 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 1
dans 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:
LOOKUP
dit que le dernier argument result_vector
est facultatif. Cependant si je l'omets, j'obtiens un résultat très étrange que je ne comprends pas.
LOOKUP
fonction ne trouve pas le lookup_value
, la fonction correspond à la plus grande valeur lookup_vector
qui 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.
=LOOKUP(2,1/(A:A<>""),ROW(A:A))
mais l'ajout d'une ROW
fonction ajoutera un effet de «volatilité» - la formule sera recalculée à chaque fois qu'une cellule de la feuille de travail sera modifiée
Voici une autre option: =OFFSET($A$1;COUNTA(A:A)-1;0)
COUNTA
place de COUNT
). Sans parler des cellules vides.
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!
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.
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.
=INDEX(N:N,MATCH(1E+306,N:N,1))
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:A65535
et donne un traitement spécial à la dernière cellule, qui se trouve A65536
dans Excel 2003. Je ne peux pas simplement dire A:A
ou même A1:A65536
lorsque cette dernière revient automatiquement A:A
.
Si vous êtes absolument sûr que le champ A65536
est vide, vous pouvez ignorer la IF
partie:
=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))
.
=INDEX(19:19,COUNTA(19:19))
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:
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:
A
occurrences par un D
. Qu'est-ce que je fais mal?
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.
=INDEX(A:A, COUNTA(A:A), 1)
pris d' ici
=MATCH("*";A1:A10;-1)
pour les données textuelles
=MATCH(0;A1:A10;-1)
pour les données numériques
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
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
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))
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
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.
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!
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.
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))))
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)