我使用以下功能
=DAYS360(A2, A35)
计算我的专栏中两个日期之间的差异。但是,该列一直在扩展,我目前必须在更新电子表格时手动更改“A35”。
有没有办法(在 Google 表格中)找到此列中的最后一个非空单元格,然后在上述函数中动态设置该参数?
我使用以下功能
=DAYS360(A2, A35)
计算我的专栏中两个日期之间的差异。但是,该列一直在扩展,我目前必须在更新电子表格时手动更改“A35”。
有没有办法(在 Google 表格中)找到此列中的最后一个非空单元格,然后在上述函数中动态设置该参数?
可能有一个更雄辩的方式,但这是我想出的方式:
查找列中最后一个填充单元格的函数是:
=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 ) ) ) ) ))
如果 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
所以col
参数INDEX
必须是 1 并且row
参数应该是COUNTA(B3:B)
。
PS:请为@bloodymurderlive 的答案投票,因为他先写了它,我只是在这里解释一下。
如果列仅通过连续添加的日期扩展,就像我的情况一样 - 我只使用 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)))
为了严格查找列中的最后一个非空单元格,这应该可以...
=LOOKUP(2^99, A2: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)
计算 A 列中的最新日期与单元格 A2 中的日期之间的差异。
=MAX(A2:A)-A2
为了找到最后一个非空行号(允许它们之间有空格),我在下面使用了搜索 column A
。
=ArrayFormula(IFNA(match(2,1/(A:A<>""))))
这可能有效:
=DAYS360(A2,INDEX(A2:A,COUNTA(A2:A)))
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
业余爱好者的做法是“=CONCATENATE("A",COUNTUNIQUE(A1:A9999))”,其中 A1 是列中的第一个单元格,而 A9999 在该列的下方比我预期的任何条目都要远。这个结果 A# 可以根据需要与 INDIRECT 函数一起使用。