我使用下面的函数

=DAYS360(A2, A35)

计算我列中两个日期的差值。然而,列一直在扩大,我目前必须手动更改“A35”,因为我更新了我的电子表格。

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


也许还有更有说服力的方法,但这是我想到的方法:

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

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

要找到最后一个非空单元格,可以使用INDEX和MATCH函数,如下所示:

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

我觉得这样更快更简单。


那么下面这个求最后一个值的公式呢:

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

这就是你最初任务的最终公式:

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

假设您的初始日期是G10。


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

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

业余爱好者的方法是“=CONCATENATE(“A”,COUNTUNIQUE(A1:A9999))”,其中A1是列中的第一个单元格,A9999比我期望的任何条目都要低。这个生成的a#可以根据需要与INDIRECT函数一起使用。


如果列仅按连续添加的日期展开 就像在我的情况下-我只是使用MAX函数来获取最后的日期。

最终公式为:

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

虽然这个问题已经有了答案,但还是有一种很有说服力的方法。

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

下面是解释:

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

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

例子:

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范围的第一列,所以INDEX的col参数必须是1,行参数应该是COUNTA(B3:B)。

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


我最喜欢:

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

所以,对于OP的需求:

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

这是另一个:

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

and

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

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

可能有点过分,但都有可能。


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

=MAX(A2:A)-A2

我走了一条不同的路。因为我知道我将逐个向行/列添加一些东西,所以我通过首先计算有数据的字段来找出最后一行。我将用一列来演示这一点:

=COUNT(A5:A34)

假设它返回了21。A5在第4行,所以我需要从第4行开始算第21个位置。我可以用间接的方法来做到这一点,像这样:

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

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


对于一行:

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

对于列:

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

为了找到最后一个非空行号(允许行号之间有空格),我使用下面的方法搜索列A。

=ArrayFormula(IFNA(match(2,1/(A:A<>""))))

这将给出最后一个单元格的内容:

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

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

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

这对我很有用。获取谷歌表中A列的最后一个值:

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

(如果有空白行,它也会跳过空白行)


Ben Collins是谷歌床单专家,他的网站上有很多免费的建议,还提供课程。他有一篇关于动态范围名称的免费文章,我在许多项目中都使用了这篇文章作为基础。

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

免责声明,我没有获得任何参考本的网站。

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

单元格D3的公式如上所示,但这是一个数组公式:

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

单元格D4的公式如下:

="L2s!A2:E"&D3

这可能有用:

= DAYS360 (A2,指数(A2:, COUNTA (A2: A)))


对于严格地查找列中的最后一个非空单元格,这应该工作…

=LOOKUP(2^99, A2:A)

在一列任意的非空值中选择最后一个,忽略标题单元格(A1):

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

通过LAMBDA和REDUCE函数的引入,我们现在可以在一次遍历单元格中计算行号(上面的几个解决方案过滤了两次范围),而不依赖于神奇的文本或数值。

=lambda(rng, 
   REDUCE(0, rng, lambda(maxrow, cell, if(isblank(cell),maxrow,row(cell)) ) )
)(A:A)

它可以很好地打包成一个命名函数的用法,如

=LAST_ROWNUM(A:A)

它适用于具有穿插空格的列、多列范围(因为REDUCE在行优先的范围内迭代)和部分列(如A20:A),仍然返回实际的行号(而不是范围内的偏移量)。

然后可以将其与Index组合以返回值

=DAYS360(A2, Index(A1, LAST_ROWNUM(A:A)))

(事实上,我怀疑OPs日期值是单调的(即使中间有空格),他可以侥幸逃脱

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

上面的解决方案是依赖于“连续”的日期——这是否意味着“没有空白”或“没有缺失日期”我不确定——但这两种规定都是不必要的。)