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

231

我使用以下函数

=DAYS360(A2, A35)

我想计算我的一列中两个日期之间的差异。然而,这一列是不断扩展的,因此每次更新电子表格时,我都必须手动更改"A35"。

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


2
类似问题:https://dev59.com/Q2855IYBdhLWcg3wvXHd#13356890 - Jon Schneider
22个回答

257

可能有更优雅的方法,但这是我想到的方法:

查找列中最后一个有数据的单元格的函数为:

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

9
我最终选择与空字符串进行比较,而不是使用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() 函数,如何在不重复 4 次 importrange() 的情况下重写它? - Irina Rapoport
7
以下是Doug Bradshaw提供的稍微简化了一些的答案,同时还可以处理空白格子: =INDEX(FILTER(A1:A,NOT(ISBLANK(A1:A))),COUNTA(A1:A)) (可以更改起始行 A1)。完整描述请参考:https://dev59.com/Q2855IYBdhLWcg3wvXHd#27623407 - Zack Morris
太棒了!完美运行了! - Ahmed Mahmoud
显示剩余2条评论

105
要找到最后一个非空单元格,您可以使用以下方式的 INDEXMATCH 函数:
=DAYS360(A2; INDEX(A:A; MATCH(99^99;A:A; 1)))

我认为这样会更快、更容易。


36
你的方法只能找到最后一个数值单元格,而我的方法可以找到最后一个字符串类型的行。原问题是关于日期的,所以这个方法可以使用,但既然文章仍然受到关注,值得注意不同之处。这完全取决于你的需求。如果你只需要一个数字,我建议使用这种方式。 - Sam Plus Plus
3
假定该列已排序。 - Andrej Adamenko
2
也可以写成=DAYS360(A2;VLOOKUP(99^99;A:A;1)) - vstepaniuk
适用于日期列(我的日期是有序的),效果很好。 - automorphic

81
如果A2:A包含相邻的日期,则INDEX(A2:A,COUNT(A2:A))将返回最后一个日期。最终公式为:
=DAYS360(A2,INDEX(A2:A,COUNT(A2:A)))

5
这是最精确的答案。虽然上面@Poul的回答适用于这种情况,但我想找到实际包含数据的最后一个单元格,并且无论数据是否按顺序排列,此方法都可以解决。 - Chuck Claunch
1
太好了!简单而且正是我在寻找的。 - André Henrique
1
它对我不起作用... 它显示公式分析错误。 - Rodrigo Laguna
1
@Rodrigo 尝试使用 ; 而不是 , - Rubén
1
我曾经遇到过类似的问题,但是处理的是单词而不是数字,所以分享一下,使用“counta”而不是“count”可以解决这个问题。 - Steve Midgley

69

虽然问题已经得到回答,但还有一种简洁明了的方法。

Use just the column name to denote last non-empty row of that column.
例如: 如果您的数据位于A1:A100,并且您希望能够向A列添加更多数据,比如说它可能会是A1:A105或者甚至是A1:A1234,那么您可以使用这个范围:
A1:A

示例

要获取范围内最后一个非空值,我们将使用两个函数:

  • COUNTA
  • INDEX

答案是=INDEX(B3:B,COUNTA(B3:B))

以下是解释:

COUNTA(range):返回区域中的值数,我们可以使用它来获取行数的计数。

INDEX(range, row, col):返回由rowcolumn偏移指定的单元格内容。如果省略了column,则返回整行。

示例:

INDEX(A1:C5,1,1) = A1
INDEX(A1:C5,1) = A1,B1,C1 # Whole row since the column is not specified
INDEX(A1:C5,1,2) = B1
INDEX(A1:C5,1,3) = C1
INDEX(A1:C5,2,1) = A2
INDEX(A1:C5,2,2) = B2
INDEX(A1:C5,2,3) = C2
INDEX(A1:C5,3,1) = A3
INDEX(A1:C5,3,2) = B3
INDEX(A1:C5,3,3) = C3
对于上面的图片,我们的范围将是B3:B。所以我们将首先通过COUNTA(B3:B)计算出范围B3:B中有多少个值。在左侧,它将产生8,因为有8个值,而在右侧它将产生9。我们还知道最后一个值在范围B3:B的第一列,因此INDEXcol参数必须为1,row参数应为COUNTA(B3:B)
PS:请给@bloodymurderlive的答案点赞,因为他首先写了这个答案,我只是在这里解释。

2
我喜欢这个,但是有时候会出现问题,返回倒数第二个项目而不是最后一个。 - Eric Smalling
1
@EricSmalling 这可能是因为你在所有行的末尾都有一个额外的换行符,当你复制粘贴时,它可能被视为非空单元格。你有没有任何展示这个问题的样本电子表格? - ramazan polat
它不起作用。顺便问一下,你从哪里得到这个引用的?我以为它来自于Google表格文档。 - Atul
1
@RamazanPolat:OP正在询问在Google表格中找到列A1:A中最后一个非空单元格的方法,但是这种方法并不能给出列A中最后一个非空单元格的值。 - Atul
1
看起来最后一个参数1是不必要的。 - Alpha Huang
关于Eric Smalling的评论,我认为如果初始范围中有一个空白单元格,这种方法将给出倒数第二个项目,因为COUNTA不计算空白单元格。 - undefined

53

我最喜欢的是:

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

因此,针对OP的需求:

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

尽管Poul上面发布的“MAX”在最后一个日期始终是最新的情况下看起来更加简洁。 - Eric Smalling
1
他的意思是+1而不是,1。 - Newbrict
2
这并没有回答问题 - 它选择了最后一个值,但不是最后一个非空值。 - NateS

21

如果列只是通过连续添加日期来扩展,就像我的情况一样 - 我只使用了MAX函数来获取最后日期。

最终的公式将是:

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

17

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

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

(如果有的话),它还会跳过其中所有的空行。


16

这是另一个:

=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语句(这两行都需要放置工作表和列才能从实际列中获取实际值),并将变量替换为以下内容:

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

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

这个脚本的一个好处是,您可以选择是否包括求值为 "" 的等式。 如果没有添加参数,将计算等于 "" 的方程,但如果指定工作表和列,则现在将计算它们。 此外,如果您愿意使用脚本的变体,那么有很多灵活性。

可能有点过头了,但所有可能性都考虑到了。


1
未知函数 LASTROW - Berit Larsen
1
应该为+100,因为实际上回答了问题标题:最后一行,而不是最后一行的值。 - Norbert
谢谢!这帮助我弄清楚了如何在数据中使公式适用于最后一个实际想要查找的值下面的所有条目,因此它们在技术上并不是空白...但这起作用了。 :) - Keara
谢谢!已经生效了! - Ali Adhami
对我来说是完美的解决方案 - 在第一组数据和最后一行之间有空白行,所以这个方法非常有效。非常感谢! - Josh

13

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

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

2
这段代码运行良好,非常干净,但如果您想获取包含未知数量空单元格的行中最后一个非空单元格,则需要使用Atul的答案(https://dev59.com/LGsz5IYBdhLWcg3wFUG_#59751284)。 - Albin

8
严格查找列中最后一个非空单元格,可以使用以下方法...
=LOOKUP(2^99, A2:A)

1
完美!谢谢!!已更改为 LOOKUP(max(C2:C30)+1, C2:C30),因此在大多数情况下都可以使用,不需要比这更复杂的 ERR!和 REF! - DotDotJames
@DotDotJames 不错! - user14915635

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接