web-dev-qa-db-ja.com

列内の最後の空でないセル

Microsoft Excelで、列の最後の空でないセルの値を見つける式を知っている人はいますか?

105
MichaelS

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

配列を入力する必要があります、つまりCtrl-Shft-Enterを押した後あなたが入力またはペーストすることを意味します。以下は列Aの場合です。

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

次の簡単な式を使用すると、はるかに高速です

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

Excel 2003の場合:

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

次の利点があります:

  • それはnot array式です
  • それはnot volatile式です

説明:

  • (A:A<>"")は配列{TRUE,TRUE,..,FALSE,..}を返します
  • 1/(A:A<>"")はこの配列を{1,1,..,#DIV/0!,..}に変更します。
  • LOOKUP は、sorted配列をascending順序で期待し、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

122
Dmitry Pavliv

これは別のオプションです:=OFFSET($A$1;COUNTA(A:A)-1;0)

24
Patrick Honorez

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

ここにあります:

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

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

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

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

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

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

お役に立てれば!

ではごきげんよう!

16
Santiago

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

  • 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はオーバーヘッドが最も少なく、不揮発性なので、大量のデータを扱う場合はこれを使用するのが最善です。

12
W5ALIVE

これはExcel 2003で動作します(後でマイナー編集を加えます。下記参照)。これを配列式として入力するには、Ctrl + Shift + Enterキー(Enterキーだけではありません)を押します。

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

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

そのため、配列式をA1:A65535の範囲に適用し、最後のセル(Excel 2003ではA65536)に特別な扱いをします。後者は自動的にA:Aに戻るため、A1:A65536またはA:Aとさえ言うことはできません。

A65536が空白であることが確実であれば、IFの部分を飛ばすことができます。

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

Excel 2007またはExcel 2010を使用している場合、最後の行番号は65536ではなく1048576です。したがって、上記の値を適宜調整してください。

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

配列式を使用しない場合の代替ソリューション、おそらく---よりも堅牢な配列式を使用しない(ヒントへの)解決策を含む 、です

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

例として この答え を参照してください。 Brad and barry houdini 、解決を手助けしてくれた人は この質問

非配列式を好む理由として考えられるのは以下のとおりです。

  1. マイクロソフトの公式ページ (「配列式を使用することのデメリット」を参照)。
    配列の式は不思議に思えるかもしれませんが、いくつかの欠点もあります。

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

7
sancho.s

列(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()はセル値を返します。

4
Sharif Lotfi

=INDEX(A:A, COUNTA(A:A), 1)ここ から取られます

2
HattrickNZ

テキストデータの場合は=MATCH("*";A1:A10;-1)

数値データの場合は=MATCH(0;A1:A10;-1)

2
liharvi

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

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

@JulianKroné.. ";"を使用"、"の代わりには機能しません。 MSエクセルではなくLibre Officeを使っていると思いますか? LOOKUPはとてもうるさいので私は最後の手段としてそれを使用します

1
remote one

テキストデータの場合:

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

数値データの場合:

EQUIV(0;A1:A10;-1)

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

値を取得したい場合は、テキストで絶対セル参照を構築した後にINDIRECTを介してアクセスしてください。

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

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
FocusWiz

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

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

HLOOKUPを使った

A1には日付があります。 A2:A8は異なる時期に捕らえられた予報を持っています、私は最新を望んでいます

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

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

0
Chris

あなたが配列を使うことを恐れていないのであれば、以下は問題を解決するための非常に簡単な式です。

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

これが配列数式だから、Ctrl + Shift + Enterキーを押す必要があります。

0
Bits_of_guy

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

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

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

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

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

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

0
Tassos Mallis

この公式は私のオフィス2010で働いていました:

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

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

0
Wahed

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

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

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

慢性の爪歯

0

マイクロソフトオフィス2013の場合

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

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

「最後」の空でない行:

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