回答:
これはテキストと数値の両方で機能し、空白のセルがあるかどうかは関係ありません。つまり、最後の空白でないセルが返されます。
配列で入力する必要があります。つまり、入力または貼り付けた後にCtrl-Shift-Enterを押します。以下は列Aの場合です。
=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
次の簡単な数式を使用すると、はるかに速くなります
=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)
下の画像は違いを示しています:
LOOKUP
最後の引数result_vector
はオプションであると言うドキュメント。ただし、省略した場合、非常に奇妙な結果になってしまい、理解できません。
LOOKUP
関数がを見つけられない場合、関数はそのlookup_value
値lookup_vector
以下の最大値に一致しますlookup_value.
」=LOOKUP(2,A:A<>"",A:A)
という#DIV/0!
エラーを生成せずに使用する1/...
と、途中で何らかの値が返されるようですベクトル。この場合の正確な機能はわかりません。
=LOOKUP(2,1/(A:A<>""),ROW(A:A))
が、ROW
関数を追加すると「ボラティリティ」の効果が追加されます
ここに別のオプションがあります: =OFFSET($A$1;COUNTA(A:A)-1;0)
COUNTA
代わりに使用してくださいCOUNT
)。空白セルは言うまでもありません。
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ソリューションの美しさ、シンプルさ、そして優雅さを誰かが高く評価してくれることを願っています。ただし、上記のソリューションのメモリ効率は保証しません。それらが単純で、美しく見え、意図された目的を助け、他の目的にそれらの使用を拡張するのに十分な柔軟性があるというだけです:)
お役に立てれば!
ではごきげんよう!
私はこの質問が古いことを知っていますが、提供された回答に満足していません。
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はオーバーヘッドが最も低く、不揮発性であるため、大量のデータを扱う場合はこれが最適です。
TRUE
/ FALSE
)のセルがある場合、それらは検出されません。この回答は完全なものではありませんが、パフォーマンスへの影響が最も少ないと思います。
=INDEX(N:N,MATCH(1E+306,N:N,1))
これは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))
ます。
=INDEX(19:19,COUNTA(19:19))
おそらく配列数式のない代替ソリューション、より堅牢に比べて配列数式を含まない溶液(へのヒント)と前回の答えは、です
=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))
例としてこの答えを見てください。称賛ブラッドとバリー・フーディーニ解決を助け、この質問を。
配列以外の数式を推奨する考えられる理由を以下に示します。
Microsoftの公式ページ(「配列数式を使用することの欠点」を探してください)。
配列数式は不思議に思えるかもしれませんが、いくつかの欠点もあります。
A
出現箇所をに置き換えましたD
。何が悪いのですか?
=MATCH("*";A1:A10;-1)
テキストデータ用
=MATCH(0;A1:A10;-1)
数値データ用
私はすべての非揮発性バージョンを試してみましたが、上記の1つのバージョンが機能していませんでした。Excel2003/2007のアップデート。確かに、これはExcel 2003で実行できます。配列や標準の数式としてではありません。空白、0、または#valueエラーのみが表示されます。だから私は揮発性の方法に頼る..これはうまくいった..
= LOOKUP(2,1 /(T4:T369 <> "")、T4:T369)
@JulianKroné.. ";"の使用 「、」の代わりに機能しません!MS ExcelではなくLibre Officeを使用していると思いますか?LOOKUPは非常に煩わしいので、最後の手段としてのみ使用します。
このコードをVBAモジュールに配置します。保存する。関数の下で、ユーザー定義はこの関数を探します。
Function LastNonBlankCell(Range As Excel.Range) As Variant
Application.Volatile
LastNonBlankCell = Range.End(xlDown).Value
End Function
私も同じ問題を抱えていました。この式も同様にうまく機能します:-
=INDIRECT(CONCATENATE("$G$",(14+(COUNTA($G$14:$G$65535)-1))))
14は、カウントする行の最初の行の行番号です。
慢性のクロートゥース
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))
素晴らしいスレッド!
配列を使用することを恐れていない場合は、問題を解決するための非常に単純な式を次に示します。
= SUM(IF(A:A <> ""、1,0))
これは配列数式であるため、CTRL + SHIFT + ENTERを押す必要があります。
バージョン追跡(番号の先頭に文字vを追加)の場合、これはXcelsius(SAPダッシュボード)でうまく機能することがわかりました
="v"&MAX(A2:A500)