Googleスプレッドシートの列の空でない最後のセルを取得する


140

私は次の機能を使用します

=DAYS360(A2, A35)

列の2つの日付の差を計算します。ただし、列が拡大するため、スプレッドシートを更新するときに、現在「A35」を手動で変更する必要があります。

(Googleスプレッドシートで)この列の最後の空でないセルを見つけてから、上記の関数でそのパラメーターを動的に設定する方法はありますか?


回答:


172

もっと雄弁な方法があるかもしれませんが、これは私が思いついた方法です:

列の最後に入力されたセルを見つける関数は次のとおりです。

=INDEX( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ; ROWS( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ) )

したがって、これを現在の関数と組み合わせると、次のようになります。

=DAYS360(A2,INDEX( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ; ROWS( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ) ))

1
魅力的に機能している限り、この場合の雄弁さについてはあまり気になりません-サムに感謝します!
MichaelS

4
ISBLANKを使用するのではなく、空の文字列と比較してしまいました。これは、空に見えるセル(たとえば、「=」のような空白を返す数式を非空白として扱うためです。したがって、 '= index(filter(A:A、A:A <> "")、rows(filter(A:A、A:A <> ""))) '
circlepi314

また、数式のためにISBLANKにも問題がありました。ただし、= INDEX(FILTER(F3:F; F3:F <> ""))を使用します。ROWS(FILTER(F3:F; F3:F <> ""))は、式の解析エラーになります。何が間違っているのでしょうか?
klor

質問。A:Aの代わりにimportrange()がある場合、同じimportrange()を4回実行せずにこれをどのように書き換えることができますか?
Ruby

4
Doug Bradshawによる、空白も処理するわずかに簡略化した回答:(=INDEX(FILTER(A1:A,NOT(ISBLANK(A1:A))),COUNTA(A1:A))開始行A1を変更できます)完全な説明:stackoverflow.com/a/27623407/539149
Zack Morris

82

最後の空でないあなたが使用することができ、細胞を見つけるために、INDEXそしてMATCH、このような機能を:

=DAYS360(A2; INDEX(A:A; MATCH(99^99;A:A; 1)))

これは少し速くて簡単だと思います。


1
これはもっと簡単で、私はこれをテストしました。よく働く。
Ciaran 2014

24
メソッドは、値が数値の場合にのみ最後のセルを検索するように見えますが、私のメソッドも文字列型の場合は最後の行を検索します。元々の質問は日付に関するものだったので、これでうまくいきますが、記事がまだ注目を集めているので、違いに注目する価値があります。それはすべてあなたのニーズに依存します。数だけ必要な場合は、この方法をお勧めします。
Sam Plus Plus 14

1
これは、列がソートされていることを前提としています
Andrej Adamenko

次のように行うこともできます=DAYS360(A2;VLOOKUP(99^99;A:A;1))
vstepaniuk

56

A2:Aが連続して日付を含む場合、INDEX(A2:A、COUNT(A2:A))は最後の日付を返します。最終的な式は

=DAYS360(A2,INDEX(A2:A,COUNT(A2:A)))

9
個人的にはこれが受け入れられる答えだと思います。簡潔でシンプル。
SwampThingTom

4
これが最も正確な答えです。上記の@Poulの答えはこの場合に機能しますが、実際のデータを含む実際の最後のセルを見つけたかったので、データが正しいかどうかに関係なく取得できます。
チャッククランチ2017年

4
これは完璧です。第二に、それが受け入れられた答えであるべきであるという動き。
しり

37

私のお気に入りは:

=INDEX(A2:A,COUNTA(A2:A),1)

したがって、OPの必要性:

=DAYS360(A2,INDEX(A2:A,COUNTA(A2:A),1))

...上記のポールを投稿した「MAX」は、最後の日付が常に最新である場合に見た目がよりきれいですが。
Eric

1
彼は+1ではなく、1を意味していました
Newbrict

1
これは質問の答えにはなりません。最後の値が選択されますが、空でない最後の値は選択されません。
NateS

17

私の場合のように連続して追加された日付によってのみ列が拡張された場合-私は最後の日付を取得するためにMAX関数のみを使用しました。

最終的な式は次のようになります。

=DAYS360(A2; MAX(A2:A)) 

3
天才!シンプルで効果的。
Asu

14

質問はすでに回答されていますが、それを行う雄弁な方法があります。

Use just the column name to denote last non-empty row of that column.

例えば:

データが入ってA1:A100おり、列Aにさらにデータを追加できるようにしたい場合は、次のようにすることができます。A1:A105さらに、A1:A1234後で、この範囲を使用できます。

A1:A

サンプル

したがって、範囲内の空でない最後の値を取得するには、2つの関数を使用します。

  • COUNTA
  • INDEX

答えは=INDEX(B3:B,COUNTA(B3:B))です。

ここに説明があります:

COUNTA(range) 範囲内の値の数を返します。これを使用して行数を取得できます。

INDEX(range, row, col)位置の範囲の値を返すrowcolcol=1指定されていない場合)

例:

INDEX(A1:C5,1,1) = A1
INDEX(A1:C5,1) = A1 # implicitly states that col = 1
INDEX(A1:C5,1,2) = A2
INDEX(A1:C5,2,1) = B1
INDEX(A1:C5,2,2) = B2
INDEX(A1:C5,3,1) = C1
INDEX(A1:C5,3,2) = C2

上の画像の場合、範囲はになりますB3:B。したがってB3:BCOUNTA(B3:B)最初に範囲内にある値の数を数えます。左側8では、8つの値があるため生成さ9れますが、右側で生成されます。最後の値が範囲の1列目にあることもわかっているB3:Bため、のcolパラメーターはINDEX1で、rowパラメーターはでなければなりませんCOUNTA(B3:B)

PS:@bloodymurderliveの回答を最初に書いてから、賛成投票をお願いします。ここで説明します。


1
私はこれが好きですが、最後のアイテムではなく最後から2番目のアイテムが返されることがあるという問題を見てきました。
Eric Smalling 2017年

1
@EricSmallingは、すべての行の最後に改行が1つあり、コピーして貼り付けると、空でないセルと見なされる可能性があるために発生します。この問題を明らかにするサンプルスプレッドシートはありますか?
ラマザンポラット2017年

最もスマートなソリューションのようです!
MemLeak

動かない。ところで、どこから見積もりを入手しましたか?私はそれをグーグルシートのドキュメントから考えました。
Atul

1
@RamazanPolat:OPが求めている の列の最後の非空のセルを見つけるために、(Googleシートで)道を A1:A私に列Aの最後の非空のセルの値を与えるものではありません
アトゥール

8

ここに別のものがあります:

=indirect("A"&max(arrayformula(if(A:A<>"",row(A:A),""))))

最終的な方程式は次のとおりです。

=DAYS360(A2,indirect("A"&max(arrayformula(if(A:A<>"",row(A:A),"")))))

ここでの他の方程式は機能しますが、行番号を簡単に取得できるので、この式が気に入っています。行番号は次のようになります。

=max(arrayformula(if(A:A<>"",row(A:A),"")))

私はもともとスプレッドシートの問題を解決するためにこれだけを見つけようとしましたが、最後のエントリの行番号を示すだけの有用なものを見つけることができなかったので、これが誰かにとって役立つことを願っています。

また、これには、任意のタイプのデータに対して任意の順序で機能するという追加の利点があり、コンテンツを含む行の間に空白行を置くことができ、「」と評価される数式を持つセルはカウントされません。繰り返し値も処理できます。全体としては、ここでmax((G:G <> "")* row(G:G))を使用する方程式に非常に似ていますが、それが目的の場合は行番号を少し簡単に引き出します。

または、スクリプトをシートに配置したい場合は、これを頻繁に実行する予定であれば、自分で簡単に作成できます。ここにそのスクリプトがあります:

function lastRow(sheet,column) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  if (column == null) {
    if (sheet != null) {
       var sheet = ss.getSheetByName(sheet);
    } else {
      var sheet = ss.getActiveSheet();
    }
    return sheet.getLastRow();
  } else {
    var sheet = ss.getSheetByName(sheet);
    var lastRow = sheet.getLastRow();
    var array = sheet.getRange(column + 1 + ':' + column + lastRow).getValues();
    for (i=0;i<array.length;i++) {
      if (array[i] != '') {       
        var final = i + 1;
      }
    }
    if (final != null) {
      return final;
    } else {
      return 0;
    }
  }
}

ここで、現在編集しているシートと同じシートの最後の行が必要な場合は、次のように入力できます。

=LASTROW()

または、そのシートの特定の列、または別のシートの特定の列の最後の行が必要な場合は、以下を実行できます。

=LASTROW("Sheet1","A")

そして一般的に特定のシートの最後の行について:

=LASTROW("Sheet1")

次に、実際のデータを取得するには、間接的に使用することができます。

=INDIRECT("A"&LASTROW())

または、最後の2つの戻り行(実際の列から実際の値を取得するためにシートと列の両方を配置する必要があるため、最後の2行)で上記のスクリプトを変更し、変数を次のように置き換えることができます。

return sheet.getRange(column + final).getValue();

そして

return sheet.getRange(column + lastRow).getValue();

このスクリプトの1つの利点は、 ""と評価される方程式を含めるかどうかを選択できることです。引数が追加されていない場合、「」と評価される方程式がカウントされますが、シートと列を指定すると、それらがカウントされるようになります。また、スクリプトのバリエーションを使用する場合は、柔軟性が非常に高くなります。

おそらくやり過ぎですが、すべて可能です。


1
「不明な関数LASTROW」
Berit Larsen

質問の見出しに実際に回答するには+100にする必要があります。最終行の値ではなく、最終行
Norbert van Nobelen

6

最後の値を取得するためのこの式はどうですか?

=index(G:G;max((G:G<>"")*row(G:G)))

そして、これはあなたの元のタスクの最終的な公式になるでしょう:

=DAYS360(G10;index(G:G;max((G:G<>"")*row(G:G))))

最初の日付がG10であるとします。


5

別のルートに行きました。行/列に1つずつ追加することを知っているので、最初にデータのあるフィールドを数えることで最後の行を見つけます。列でこれを示します。

=COUNT(A5:A34)

つまり、21が返されたとしましょう。A5は4行下なので、4行目から21番目の位置を取得する必要があります。私はこれを次のように無差別に使用できます:

=INDIRECT("A"&COUNT(A5:A34)+4)

データのある行の量を見つけて、インデックス修飾子として使用している数値を返します。


1
空のセルは存在できないことに注意してください。また、COUNTAはより多くのシナリオに対応する必要があります
Z. Khullah

4

行の場合:

=ARRAYFORMULA(INDIRECT("A"&MAX(IF(A:A<>"", ROW(A:A), ))))

列の場合:

=ARRAYFORMULA(INDIRECT(ADDRESS(1, MAX(IF(1:1<>"", COLUMN(1:1), )), 4)))

1
すばらしい答えです。ありがとうございました。
Nick

2

これは、拡大し続ける列の最後の値を取得するために私が見つけた最も単純なソリューションのようです:

=INDEX(A:A,COUNTA(A:A),1)

2

これでうまくいきます。Googleシートの列Aの最後の値を取得します。

=index(A:A,max(row(A:A)*(A:A<>"")))

(また、間に空白行がある場合はスキップします)



1

これにより、最後のセルの内容が得られます。

=indirect("A"&max(ARRAYFORMULA(row(a:a)*--(a:a<>""))))

これにより、最後のセルのアドレスが得られます。

="A"&max(ARRAYFORMULA(row(a:a)*--(a:a<>"")))

これにより、最後のセルの行が表示されます。

=max(ARRAYFORMULA(row(a:a)*--(a:a<>"")))

多分あなたはスクリプトを好むでしょう。このスクリプトは、他の誰かが上に投稿した巨大なスクリプトよりもはるかに短いです。

スクリプトエディターに移動して、このスクリプトを保存します。

function getLastRow(range){
  while(range.length>0 && range[range.length-1][0]=='') range.pop();
  return range.length;
}

これを行うには、セルにこれを入力するだけです。

=getLastRow(A:A)

0

アマチュアが行う方法は "= CONCATENATE(" A "、COUNTUNIQUE(A1:A9999))"です。ここで、A1は列の最初のセルで、A9999はエントリがあると予想するよりもその列のはるか下にあります。この結果のA#は、必要に応じてINDIRECT関数で使用できます。


ごめんなさい。これは、列のすべてのエントリが一意である場合にのみ機能します。
コンラッドリンデス2016年

1
StackOverflow、Conradへの貢献に感謝しますが、回答にはいくつかの問題があります。まず、彼は日付が一意であることを指定しなかったので、countunique()の代わりにcount()を使用する必要があります。次に、他の回答でわかるように、indirect()とconcatenateを使用すると、index()の既存の機能が複製されます。3番目に、A1:A9999の代わりに、なぜA1:Aを使用しないのですか?
sondra.kinsey

0

空でない最後の行番号を見つけるために(それらの間の空白を許可)、以下を使用して列を検索しましたA

=ArrayFormula(IFNA(match(2,1/(A:A<>""))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.