列の最後の空でないセル


回答:


76

これはテキストと数値の両方で機能し、空白のセルがあるかどうかは関係ありません。つまり、最後の空白でないセルが返されます。

配列で入力する必要があります。つまり、入力または貼り付けた後にCtrl-Shift-Enter押します。以下は列Aの場合です。

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

@Jean-François、申し訳ありませんが、昨晩のコメントでそれを認めましたが、誤って元の投稿に入れました。XL 2007および2010では機能します。ありがとうございます。
Doug Glancy、2011年

Excel 2007では機能しません。正確な数式を貼り付けました。列(A)があり、値は127ishまで= ROW()であり、式は "1"を返します
DontFretBrett

2
@DontFretBrett、回答で指定されているように、Ctrl-Shift-Enterを使用して配列数式として入力してください。
Doug Glancy 2013年

@DougGlancyは私の側で失敗します。ありがとうございました!
DontFretBrett 2013年

1
重要な違いは、これはセル参照を返すので(たとえば、CELL()またはに渡すことができるOFFSET())、一方、より投票されたものは、どこにあるかを知らせずに値を返すということです。
GSerg 2017年

128

次の簡単な数式を使用すると、はるかに速くなります

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

Excel 2003の場合:

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

次の利点があります。

  • それはだ、配列ではない
  • それは揮発性の式ではありません

説明:

  • (A:A<>"") 配列を返します {TRUE,TRUE,..,FALSE,..}
  • 1/(A:A<>"")この配列をに変更し{1,1,..,#DIV/0!,..}ます。
  • 以来LOOKUPを期待は、ソートされたアレイを昇順順序を、そして場合ことを考慮LOOKUP機能は完全一致を見つけることができない、それは最大の値を選択したlookup_range(我々の場合{1,1,..,#DIV/0!,..}未満または値に等しい(我々の場合です)2、)数式は1配列の最後を検索し、result_range(3番目のパラメーター- A:A)から対応する値を返します。

また、少し注意してください -上記の式はエラーのあるセルを考慮していません(空でない最後のセルにエラーがある場合にのみ表示されます)。それらを考慮に入れる場合は、次を使用します。

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

下の画像は違いを示しています:

enter image description here


説明と素敵な写真をありがとう。それでもいくつかの質問は未解決のままです:1. LOOKUP最後の引数result_vectorはオプションであると言うドキュメント。ただし、省略した場合、非常に奇妙な結果になってしまい、理解できません。
Honza Zidek 2014年

2.ドキュメントには、「LOOKUP関数がを見つけられない場合、関数はそのlookup_valuelookup_vector以下の最大値に一致しますlookup_value.=LOOKUP(2,A:A<>"",A:A)という#DIV/0!エラーを生成せずに使用する1/...と、途中で何らかの値が返されるようですベクトル。この場合の正確な機能はわかりません。
Honza Zidek 2014年

1
とてもいい説明。最近、数式を配列数式から非配列バージョンに移動することにより、数分の計算を削減したので、配列数式を必要とせずに機能するロジックを常に利用できます。
tobriand 14

1
@エニッセイ、はい、これは行番号を返します=LOOKUP(2,1/(A:A<>""),ROW(A:A))が、ROW関数を追加すると「ボラティリティ」の効果が追加されます
Dmitry Pavliv

1
ちょっと、そこ。これを投稿してくれてありがとう。ちょうど興味深いことに私はexceljet.net/formula/get-value-of-last-non-empty-cellでまったく同じ式とほぼ同じ表現を見つけました。それはあなたや他の誰かですか?明確な関係はありません。
ソロモンルツキー2016年

24

ここに別のオプションがあります: =OFFSET($A$1;COUNTA(A:A)-1;0)


9
これは、非数値のセルがある場合は機能しません(のCOUNTA代わりに使用してくださいCOUNT)。空白セルは言うまでもありません。
ジャン=フランソワ・コルベット

3
これが一番上になるはずです。それは簡単で、珍しい機能のあいまいな詳細に依存しません。
Tmdean 2015年

9
結果に空白が埋め込まれている場合は間違っているため、先頭にしないでください。
Myrddin Emrys、2015

17

Doug Glancyの回答による素晴らしいリードに触発されて、配列式を必要とせずに同じことを行う方法を思いつきました。理由を聞かないでください。ただし、可能な場合は配列数式の使用をできるだけ避けたいと思っています(特定の理由ではなく、それが私のスタイルです)。

ここにあります:

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

列Aを参照列として使用して、空でない最後の行を見つけるため

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

行1を参照行として使用して、空でない最後の列を見つけるため

これは、インデックス関数と組み合わせてさらに利用して、動的な名前付き範囲を効率的に定義できますが、これは、ここで取り上げられている当面の質問とは関係がないため、別の投稿では役立ちます。

上記の方法をExcel 2010で「ネイティブ」と「互換モード」の両方でテストしました(古いバージョンのExcelの場合)。この場合も、Ctrl + Shift + Enterキーを押す必要はありません。Excelでsumproductが機能する方法を活用することで、配列演算を実行する必要性を回避できますが、配列式を使用せずに実行できます。私がそうであるように、これらの提案されたsumproductソリューションの美しさ、シンプルさ、そして優雅さを誰かが高く評価してくれることを願っています。ただし、上記のソリューションのメモリ効率は保証しません。それらが単純で、美しく見え、意図された目的を助け、他の目的にそれらの使用を拡張するのに十分な柔軟性があるというだけです:)

お役に立てれば!

ではごきげんよう!


1
配列以外の数式を使用する理由については、以下の回答をご覧ください。
sancho.s ReinstateMonicaCellio 2014

17

私はこの質問が古いことを知っていますが、提供された回答に満足していません。

  • LOOKUP、VLOOKUP、およびHLOOKUPにはパフォーマンスの問題があるため、実際には使用しないでください。

  • 配列関数には多くのオーバーヘッドがあり、パフォーマンスの問題も発生する可能性があるため、最後の手段としてのみ使用してください。

  • COUNTとCOUNTAは、データが連続して非空白でない場合、つまり、空白スペースがあり、その後、問題の範囲にあるデータがある場合、問題が発生します。

  • INDIRECTは揮発性であるため、最後の手段としてのみ使用する必要があります

  • OFFSETは揮発性であるため、最後の手段としてのみ使用してください。

  • 可能な最後の行または列(たとえば、Excel 2003では65536番目の行)への参照は堅牢ではなく、余分なオーバーヘッドが発生します。

これは私が使うものです

  • データ型が混在している場合: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))

  • データに数値のみが含まれていることがわかっている場合: =MATCH(1E+306,[RANGE],1)

  • データにテキストのみが含まれていることがわかっている場合: =MATCH("*",[RANGE],-1)

MATCHはオーバーヘッドが最も低く、不揮発性であるため、大量のデータを扱う場合はこれが最適です。


これは良い答え(+1)ですが、この方法では見逃してしまう抜け穴がまだいくつかあります。たとえば、論理値(TRUE/ FALSE)のセルがある場合、それらは検出されません。この回答は完全なものではありませんが、パフォーマンスへの影響が最も少ないと思います。
ImaginaryHuman072889

2
一致は、セルの値ではなくインデックスを返します。インデックス関数を使用して値を取得できます。また、[RANGE]がどうあるべきかについて、おそらく何かを含める必要があります。「N:N」を使用して列全体を選択しました。ここでは私のために働いた例がある: =INDEX(N:N,MATCH(1E+306,N:N,1))
swimfar

10

これはExcel 2003で機能します(後でマイナー編集を行います。以下を参照)。これを配列数式として入力するには、EnterキーだけでなくCtrl + Shift + Enterキーを押します。

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

Excel 2003では、配列数式を列全体に適用できないことに注意してください。そうすることにより#NUM!、予期しない結果が発生する可能性があります!(EDIT:マイクロソフトからの情報競合:同じ月をないかもしれません Excel 2007の程度真で、問題があり、2010年に修正されています

私は範囲に配列数式を適用する理由ですそれA1:A65535とある最後のセルに特別な治療を与えるA65536エクセル2003年には、単に言うことはできません。A:Aでも、またはA1:A65536後者は自動的に戻りますようA:A

完全にA65536空白であると確信している場合は、そのIF部分をスキップできます。

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

Excel 2007または2010を使用している場合、最後の行番号は65536ではなく1048576であるため、上記を適切に調整してください。

データの真ん中に空白のセルがない場合は、単純な数式を使用し=INDEX(A:A,COUNTA(A:A))ます。


列ではなくROWの場合、これは私にとっては=INDEX(19:19,COUNTA(19:19))
うまくいっ

8

おそらく配列数式のない代替ソリューション、より堅牢に比べて配列数式を含まない溶液(へのヒント)と前回の答えは、です

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

例としてこの答えを見てください。称賛ブラッドバリー・フーディーニ解決を助け、この質問を

配列以外の数式を推奨する考えられる理由を以下に示します。

  1. Microsoftの公式ページ(「配列数式を使用することの欠点」を探してください)。
    配列数式は不思議に思えるかもしれませんが、いくつかの欠点もあります。

    • Ctrl + Shift + Enterキーを押すのを忘れることがあります。配列数式を入力または編集するときは、必ずこのキーの組み合わせを押してください。
    • 他のユーザーはあなたの数式を理解していない可能性があります。配列数式は比較的文書化されていないため、他のユーザーがワークブックを変更する必要がある場合は、配列数式を回避するか、それらのユーザーがそれらを変更する方法を確実に理解する必要があります。
    • コンピュータの処理速度とメモリによっては、配列数式が大きいと計算が遅くなることがあります。
  2. 配列数式の異端


これをD列で使用することはできません。すべてのA出現箇所をに置き換えましたD。何が悪いのですか?
Marc.2377

5

列(A)で検索する場合:

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

範囲がA1:A10の場合、以下を使用できます。

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

この式では:

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

空白でない最後の行番号を返し、indirect()はセル値を返します。



2

=MATCH("*";A1:A10;-1) テキストデータ用

=MATCH(0;A1:A10;-1) 数値データ用


回答にコードスニペットを提供する場合は、コードブロックを使用してください。
β.εηοιτ.βε

これらの式は、最後の空でないセルではなく、最初の空でないセルを与えると思います。
Baodad

2

私はすべての非揮発性バージョンを試してみましたが、上記の1つのバージョンが機能していませんでした。Excel2003/2007のアップデート。確かに、これはExcel 2003で実行できます。配列や標準の数式としてではありません。空白、0、または#valueエラーのみが表示されます。だから私は揮発性の方法に頼る..これはうまくいった..

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

@JulianKroné.. ";"の使用 「、」の代わりに機能しません!MS ExcelではなくLibre Officeを使用していると思いますか?LOOKUPは非常に煩わしいので、最後の手段としてのみ使用します。


0

このコードをVBAモジュールに配置します。保存する。関数の下で、ユーザー定義はこの関数を探します。

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

2
これは必ずしも最後の空白セルではなく、先頭から始まる次の空白セルです。
ポートランドランナー

問題はVBAではなく、数式に関するものです
Patrick Honorez '28

0

テキストデータの場合:

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

数値データの場合:

EQUIV(0;A1:A10;-1)

これにより、選択した範囲(ここではA1:A10)の最後の空でないセルの相対インデックスが得られます。

値を取得したい場合は、-textally-絶対セル参照を構築した後、INDIRECTを介してアクセスします。例:

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

0

私も同じ問題を抱えていました。この式も同様にうまく機能します:-

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

14は、カウントする行の最初の行の行番号です。

慢性のクロートゥース


0

HLOOKUPを使用しました

A1日付があります。 A2:A8さまざまな時期に予測を取得しているため、最新の

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

これは、エントリの数によって定義されたルックアップ配列を持つ標準のhlookup式を使用します。


0

間に空のセルがないことがわかっている場合は、これが最も速い方法です。

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

空でないセルを数え、適切なセルを参照するだけです。

特定の範囲にも使用できます。

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

これは、範囲O4:O34の最後の空でないセルを返します。


0

Microsoft Office 2013の場合

空でない行の「最後の1つ」:

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

「最後の」空でない行:

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

0

この式はOffice 2010で私と一緒に機能しました:

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

A1:最初のセルA100:比較で最後のセルを参照


0

W5ALIVEからの応答は、列のデータの最後の行を見つけるために使用するものに最も近いと思います。ただし、列Aのデータが含まれる最後の行を探しているとすると、より一般的なルックアップには次を使用します。

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

最初のMATCHは最後のテキストセルを見つけ、2番目のMATCHは最後の数値セルを見つけます。最初のMATCHがすべての数値セルを見つけた場合、または2番目の一致がすべてのテキストセルを見つけた場合、IFERROR関数はゼロを返します。

基本的に、これはW5ALIVEのテキストと数値の混合ソリューションのわずかなバリエーションです。

タイミングのテストでは、これは同等のLOOKUPバリエーションよりも大幅に高速でした。

最後のセルの実際の値を返すには、次のような間接的なセル参照を使用することをお勧めします。

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

sancho.sによって提供される方法はおそらくよりクリーンなオプションですが、行番号を見つける部分をこれに変更します。

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

唯一の違いは、「、1」が最初の値を返すのに対し、「、0」は値の配列全体を返すことです(1つを除くすべてが不要です)。私はまだセルをインデックス関数にアドレスすることを好む傾向があります。つまり、次のようにしてセル値を返します:

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

素晴らしいスレッド!


0

配列を使用することを恐れていない場合は、問題を解決するための非常に単純な式を次に示します。

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

これは配列数式であるため、CTRL + SHIFT + ENTERを押す必要があります。


-1

私のために働く簡単なもの:

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

-1

さて、私は質問者と同じ問題があり、両方のトップアンサーを試しました。ただし、数式エラーのみが発生します。「、」を「;」に交換する必要があることがわかりました。数式が機能するようにします。XL 2007を使用しています。

例:

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

または

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

-3

バージョン追跡(番号の先頭に文字vを追加)の場合、これはXcelsius(SAPダッシュボード)でうまく機能することがわかりました

="v"&MAX(A2:A500)

1
厳密な昇順に依存しているため、一般性が不十分のようです。
Nathan Tuggy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.