我使用以下函数
=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 ) ) ) ) ))
=INDEX(FILTER(A1:A,NOT(ISBLANK(A1:A))),COUNTA(A1:A))
(可以更改起始行 A1)。完整描述请参考:https://dev59.com/Q2855IYBdhLWcg3wvXHd#27623407 - Zack Morris=DAYS360(A2;VLOOKUP(99^99;A:A;1))
。 - vstepaniuk=DAYS360(A2,INDEX(A2:A,COUNT(A2:A)))
;
而不是 ,
。 - Rubén虽然问题已经得到回答,但还有一种简洁明了的方法。
Use just the column name to denote last non-empty row of that column.
例如:
如果您的数据位于A1:A100
,并且您希望能够向A列添加更多数据,比如说它可能会是A1:A105
或者甚至是A1:A1234
,那么您可以使用这个范围:A1:A
要获取范围内最后一个非空值,我们将使用两个函数:
答案是=INDEX(B3:B,COUNTA(B3:B))
。
以下是解释:
COUNTA(range)
:返回区域中的值数,我们可以使用它来获取行数的计数。
INDEX(range, row, col)
:返回由row
和column
偏移指定的单元格内容。如果省略了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
的第一列,因此INDEX
的col
参数必须为1,row
参数应为COUNTA(B3:B)
。A1:A
中最后一个非空单元格的方法,但是这种方法并不能给出列A中最后一个非空单元格的值。 - Atul我最喜欢的是:
=INDEX(A2:A,COUNTA(A2:A),1)
因此,针对OP的需求:
=DAYS360(A2,INDEX(A2:A,COUNTA(A2:A),1))
如果列只是通过连续添加日期来扩展,就像我的情况一样 - 我只使用了MAX函数来获取最后日期。
最终的公式将是:
=DAYS360(A2; MAX(A2:A))
这对我有用。获取Google表格中列A的最后一个值:
=index(A:A,max(row(A:A)*(A: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语句(这两行都需要放置工作表和列才能从实际列中获取实际值),并将变量替换为以下内容:
return sheet.getRange(column + final).getValue();
和
return sheet.getRange(column + lastRow).getValue();
这个脚本的一个好处是,您可以选择是否包括求值为 "" 的等式。 如果没有添加参数,将计算等于 "" 的方程,但如果指定工作表和列,则现在将计算它们。 此外,如果您愿意使用脚本的变体,那么有很多灵活性。
可能有点过头了,但所有可能性都考虑到了。
这似乎是我找到的最简单的解决方法,可以检索出不断扩展的列中的最后一个值:
=INDEX(A:A,COUNTA(A:A),1)
=LOOKUP(2^99, A2:A)
LOOKUP(max(C2:C30)+1, C2:C30)
,因此在大多数情况下都可以使用,不需要比这更复杂的 ERR!和 REF! - DotDotJames