获取Google表格中列中的最后一个非空单元格


139

我使用以下功能

=DAYS360(A2, A35)

计算我的栏中两个日期之间的差额。但是,此列在不断扩大,我现在必须在更新电子表格时手动更改“ A35”。

有没有一种方法(在Google表格中)可以找到此列中的最后一个非空单元格,然后在上述函数中动态设置该参数?


Answers:


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
只要能发挥出魅力,我就不会对口才感到烦恼-非常感谢Sam!
MichaelS 2011年

4
最后,我与空字符串进行了比较,而不是使用ISBLANK进行了比较,该规则将一些看似空的单元格(例如,像=“”这样的空白返回公式视为非空白。因此:'= index(filter(A:A,A:A <>“”),rows(filter(A:A,A:A <>“”)))''
circlepi314 '16

由于公式问题,我在ISBLANK上也遇到了问题。但是使用= INDEX(FILTER(F3:F; F3:F <>“”))); ROWS(FILTER(F3:F; F3:F <>“”))导致公式解析错误。知道有什么问题吗?
klor

题。如果有一个importrange()而不是A:A,那么如何在不执行相同的importrange()4次的情况下将其重写?
红宝石

4
道格·布拉德肖=INDEX(FILTER(A1:A,NOT(ISBLANK(A1:A))),COUNTA(A1:A))(Doug Bradshaw)提出的略有简化的答案(也可以解决空白问题):(可以更改起始行A1)完整说明:stackoverflow.com/a/27623407/539149
Zack Morris

82

为了找到可以使用的最后一个非空单元格INDEXMATCH功能如下:

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

我认为这会更快,更轻松。


1
这比较简单,我已经对此进行了测试。效果很好。
西亚兰2014年

24
您的方法似乎仅在值是数字的情况下找到最后一个单元格,而我的方法也将在字符串类型的情况下找到最后一行。最初的问题是关于日期的,所以这可以解决问题,但是由于文章仍然受到关注,因此值得注意这一区别。这完全取决于您的需求。如果您只需要一个电话号码,我建议您采用这种方式。
Sam Plus Plus

1
假定列已排序
Andrej Adamenko '19

也可以通过=DAYS360(A2;VLOOKUP(99^99;A:A;1))
vstepaniuk

55

如果A2:A连续包含日期,则INDEX(A2:A,COUNT(A2:A))将返回最后一个日期。最终公式是

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

9
我个人认为这应该是公认的答案。简洁明了。
SwampThingTom '16

4
这是最精确的答案。虽然上述@Poul的答案适用于这种情况,但我想查找包含实际数据的实际最后一个单元格,无论数据是否有序,都可以获取此数据。
Chuck Claunch

4
太棒了。其次,它应该是公认的答案。
shiri

37

我最喜欢的是:

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

因此,对于OP的需求:

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

...尽管在最后日期始终是最新日期的情况下,上面发布的“最大” Poul看上去更干净。
埃里克·史莫林

1
他的意思是+1不,1
纽布里奇

1
这不会回答问题-它会选择最后一个值,但不会选择最后一个非空值。
NateS,

17

如果在我的情况下,该列仅通过连续添加的日期进行扩展-我仅使用MAX函数来获取最后一个日期。

最终公式将是:

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

3
天才!简单有效。
阿苏

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(B3:B,COUNTA(B3:B))

这里是解释:

COUNTA(range) 返回范围内的值数,我们可以使用它来获取行数。

INDEX(range, row, col)返回位于row和的范围内的值colcol=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在左侧产生,而在右侧将产生。我们还知道最后一个值在范围的第一列中,B3:B因此的col参数INDEX必须为1,row参数应该为COUNTA(B3:B)

PS:请给予好评@ bloodymurderlive的答案,因为他第一次写的,我只是解释在这里。


1
我喜欢这样,但是遇到了有时会返回倒数第二个而不是最后一个的问题。
埃里克·史莫林

1
@EricSmalling可能会发生,因为在所有行的末尾都有一个额外的换行符,并且在复制粘贴时,它可能被视为非空单元格。您是否有任何样本电子表格暴露了此问题?
拉玛赞·波拉特

看起来是最聪明的解决方案!
MemLeak

没用 您从哪里获得btw的报价?我认为它来自Google工作表文档。
Atul

1
@RamazanPolat:OP正在要求 方法(在Google表格中)在列 A1:A查找最后一个非空单元格并没有给我在A 中最后一个非空单元格的值
Atul

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())

或者您可以在最后两行返回行处修改上面的脚本(由于必须将工作表和列都放进去才能从实际列中获得实际值,所以需要最后两行),并用以下内容替换变量:

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

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

该脚本的一个好处是,您可以选择是否要包含计算结果为“”的方程式。如果未添加任何参数,将计算计算为“”的方程式,但是如果指定工作表和列,则现在将对其进行计数。另外,如果您愿意使用脚本的变体,那么它具有很大的灵活性。

可能过大了,但是所有可能。


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

我走了一条不同的路线。因为我知道我将一个一行一个地添加到某行/列中,所以我首先通过对具有数据的字段进行计数来找出最后一行。我将在专栏中进行演示:

=COUNT(A5:A34)

因此,假设返回的21。A5向下4行,因此我需要从第四行开始获得21的位置。我可以使用inderect来做到这一点,就像这样:

=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
极好的答案。谢谢。
尼克,

2

这似乎是我找到的最简单的解决方案,它在不断扩展的列中检索最后一个值:

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

2

这对我有用。获取Google表格中A列的最后一个值:

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

(如果有的话,它也会跳过中间的空白行)


1

计算A列中的最新日期与单元格A2中的日期之间的差异。

=MAX(A2:A)-A2

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函数一起使用。


抱歉。仅当列中的所有条目都是唯一的时,此方法才有效。
康拉德·林德斯

1
尽管我感谢您为StackOverflow所做的贡献,康拉德(Conrad),但您的答案有些问题。首先,他没有指定日期是唯一的,因此您应该使用count()而不是countunique()。其次,使用indirect()和concatenate可以复制index()的现有功能,如其他答案所示。第三,为什么不使用A1:A而不是A1:A9999?
sondra.kinsey '17

0

为了找到最后一个非空行号(允许在它们之间留有空格),我在下面使用它来搜索column A

=ArrayFormula(IFNA(match(2,1/(A:A<>""))))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.