192

我使用以下功能

=DAYS360(A2, A35)

计算我的专栏中两个日期之间的差异。但是,该列一直在扩展,我目前必须在更新电子表格时手动更改“A35”。

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

4

19 回答 19

224

可能有一个更雄辩的方式,但这是我想出的方式:

查找列中最后一个填充单元格的函数是:

=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 ) ) ) ) ))
于 2011-11-17T01:54:39.530 回答
96

要找到最后一个非空单元格,您可以使用INDEX如下MATCH功能:

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

我认为这更快更容易。

于 2014-09-09T08:13:20.490 回答
67

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

=DAYS360(A2,INDEX(A2:A,COUNT(A2:A)))
于 2016-03-25T22:37:30.613 回答
48

我最喜欢的是:

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

因此,对于 OP 的需要:

=DAYS360(A2,INDEX(A2:A,COUNTA(A2:A),1))
于 2017-03-31T13:09:44.147 回答
42

虽然这个问题已经回答了,但是有一个雄辩的方法可以做到这一点。

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

例如:

如果您的数据在其中,A1:A100并且您希望能够向 A 列添加更多数据,可以说可以是A1:A105甚至A1:A1234稍后,您可以使用此范围:

A1:A

样本

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

  • 康塔
  • 指数

答案是=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:BB3:B因此,我们将首先计算范围内有多少值COUNTA(B3:B)。在左侧,它会产生,8因为有 8 个值,而它会9在右侧产生。我们也知道最后一个值在范围的第一列,B3:B所以col参数INDEX必须是 1 并且row参数应该是COUNTA(B3:B)

PS:请为@bloodymurderlive 的答案投票,因为他先写了它,我只是在这里解释一下。

于 2017-01-24T22:44:29.303 回答
19

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

最终公式将是:

=DAYS360(A2; MAX(A2:A)) 
于 2016-08-01T23:01:26.570 回答
13

这是另一个:

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

此脚本的一个好处是您可以选择是否要包含计算结果为“”的方程。如果没有添加参数,则计算为 "" 的方程将被计算在内,但如果您指定工作表和列,它们现在将被计算在内。此外,如果您愿意使用脚本的变体,还有很大的灵活性。

可能是矫枉过正,但一切皆有可能。

于 2018-01-12T16:08:47.737 回答
12

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

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

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

于 2020-01-15T12:17:14.120 回答
10

这似乎是我发现的最简单的解决方案,用于检索不断扩展的列中的最后一个值:

=INDEX(A:A,COUNTA(A:A),1)
于 2020-01-08T01:12:58.047 回答
6

这个获得最后一个值的公式怎么样:

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

这将是您原始任务的最终公式:

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

假设您的初始日期在 G10。

于 2015-04-22T20:37:50.487 回答
5

我走了一条不同的路线。因为我知道我将一个一个地添加到行/列中,所以我通过首先计算具有数据的字段来找出最后一行。我将用一个专栏来证明这一点:

=COUNT(A5:A34)

所以,假设返回 21。A5 向下 4 行,所以我需要从第 4 行向下获取第 21 个位置。我可以使用 inderect 来做到这一点,如下所示:

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

它正在查找包含数据的行数,并返回一个我用作索引修饰符的数字。

于 2019-01-23T06:35:05.210 回答
4

连续:

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

对于一列:

=ARRAYFORMULA(INDIRECT(ADDRESS(1, MAX(IF(1:1<>"", COLUMN(1:1), )), 4)))
于 2019-07-13T03:04:15.343 回答
2

为了严格查找列中的最后一个非空单元格,这应该可以...

=LOOKUP(2^99, A2:A)
于 2021-12-26T05:10:59.317 回答
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)
于 2019-12-06T11:52:07.283 回答
1

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

=MAX(A2:A)-A2
于 2019-01-11T14:37:34.170 回答
1

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

=ArrayFormula(IFNA(match(2,1/(A:A<>""))))
于 2019-12-05T14:03:15.793 回答
0

这可能有效:

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

于 2021-12-15T17:57:38.300 回答
0

Ben Collins 是一位 Google 表格专家,他在他的网站上免费提供了许多提示,还提供课程。他有一篇关于动态范围名称的免费文章,我将其用作我的许多项目的基础。

https://www.benlcollins.com/formula-examples/dynamic-named-ranges/

免责声明,引用 Ben 的网站对我没有任何好处。

这是我使用动态范围的一个项目的屏幕截图:

在此处输入图像描述

单元格 D3 具有上面显示的这个公式,除了这是一个数组公式:

=ArrayFormula(MAX(IF(L2s!A2:A1009<>"",ROW(2:1011))))

单元格 D4 具有以下公式:

="L2s!A2:E"&D3
于 2021-04-08T21:59:04.050 回答
0

业余爱好者的做法是“=CONCATENATE("A",COUNTUNIQUE(A1:A9999))”,其中 A1 是列中的第一个单元格,而 A9999 在该列的下方比我预期的任何条目都要远。这个结果 A# 可以根据需要与 INDIRECT 函数一起使用。

于 2016-05-20T21:03:03.540 回答