【发布时间】:2011-12-28 07:10:27
【问题描述】:
我使用如下函数
=DAYS360(A2, A35)
计算我的专栏中两个日期之间的差异。但是,该列一直在扩展,我目前必须在更新电子表格时手动更改“A35”。
有没有办法(在 Google 表格中)找到此列中的最后一个非空单元格,然后在上述函数中动态设置该参数?
【问题讨论】:
标签: google-sheets worksheet-function google-sheets-formula
我使用如下函数
=DAYS360(A2, A35)
计算我的专栏中两个日期之间的差异。但是,该列一直在扩展,我目前必须在更新电子表格时手动更改“A35”。
有没有办法(在 Google 表格中)找到此列中的最后一个非空单元格,然后在上述函数中动态设置该参数?
【问题讨论】:
标签: google-sheets worksheet-function google-sheets-formula
可能有更雄辩的方式,但这是我想出的方式:
查找列中最后填充的单元格的函数是:
=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(FILTER(A1:A,NOT(ISBLANK(A1:A))),COUNTA(A1:A))(可以更改起始行 A1)完整描述:stackoverflow.com/a/27623407/539149
如果 A2:A 连续包含日期,则 INDEX(A2:A,COUNT(A2:A)) 将返回最后一个日期。最终公式为
=DAYS360(A2,INDEX(A2:A,COUNT(A2:A)))
【讨论】:
我最喜欢的是:
=INDEX(A2:A,COUNTA(A2:A),1)
所以,对于 OP 的需要:
=DAYS360(A2,INDEX(A2:A,COUNTA(A2:A),1))
【讨论】:
虽然这个问题已经回答了,但是有一个雄辩的方法可以做到。
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) 返回位置范围内的值 row 和 col(col=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:B 到COUNTA(B3:B) 范围内有多少值。在左侧,它将产生 8,因为有 8 个值,而在右侧将产生 9。我们还知道最后一个值在B3:B 范围的第一列,因此INDEX 的col 参数必须为1,row 参数应为COUNTA(B3:B)。
PS:请点赞@bloodymurderlive 的answer,因为是他先写的,我这里只是解释一下。
【讨论】:
A1:A 没有给我最后一个非空单元格A列中的值
如果列仅按连续添加的日期扩展 就我而言 - 我只使用 MAX 函数来获取最后日期。
最终公式为:
=DAYS360(A2; MAX(A2:A))
【讨论】:
这是另一个:
=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();
此脚本的一个好处是您可以选择是否要包含计算结果为“”的方程式。如果没有添加参数,则计算为 "" 的方程将被计算在内,但如果您指定工作表和列,它们现在将被计算在内。此外,如果您愿意使用脚本的变体,还有很大的灵活性。
可能有点矫枉过正,但一切皆有可能。
【讨论】:
这对我有用。获取 Google 工作表中 A 列的最后一个值:
=index(A:A,max(row(A:A)*(A:A<>"")))
(如果有的话,它也会跳过中间的空白行)
【讨论】:
这似乎是我找到的最简单的解决方案,用于检索不断扩展的列中的最后一个值:
=INDEX(A:A,COUNTA(A:A),1)
【讨论】:
这个获取最后一个值的公式怎么样:
=index(G:G;max((G:G<>"")*row(G:G)))
这将是您最初任务的最终公式:
=DAYS360(G10;index(G:G;max((G:G<>"")*row(G:G))))
假设您的初始日期在 G10。
【讨论】:
我走了一条不同的路。因为我知道我将一个一个地添加到行/列中,所以我通过首先计算具有数据的字段来找出最后一行。我将用一个专栏来证明这一点:
=COUNT(A5:A34)
所以,假设返回 21。A5 向下 4 行,所以我需要从第 4 行向下获取第 21 位。我可以使用 inderect 来做到这一点,如下所示:
=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 列中的最新日期与单元格 A2 中的日期之间的差异。
=MAX(A2:A)-A2
【讨论】:
为了找到最后一个非空行号(它们之间允许有空格),我在下面使用了搜索列 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)
【讨论】:
为了严格查找列中的最后一个非空单元格,这应该可以工作...
=LOOKUP(2^99, A2:A)
【讨论】:
业余爱好者的做法是“=CONCATENATE("A",COUNTUNIQUE(A1:A9999))”,其中 A1 是列中的第一个单元格,而 A9999 比我预期的更远任何条目。这个结果 A# 可以根据需要与 INDIRECT 函数一起使用。
【讨论】:
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
【讨论】:
这可能有效:
=DAYS360(A2,INDEX(A2:A,COUNTA(A2:A)))
【讨论】: