2011-11-14 451 views
54

我用下面的函数获取一列中的最后一个非空单元格在谷歌表

=DAYS360(A2, A35) 

计算在我的专栏两个日期之间的差异。然而,这个专栏不断扩展,我现在必须在更新电子表格时手动更改'A35'。

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

+2

相似问题:http://stackoverflow.com/questions/4169914/selecting-the-last-value-of-a-column/13356890 –

回答

79

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

功能找到一列中的最后一个人口稠密的细胞是:

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

在这种情况下,我并不是很在乎口才,只要它工作起来就像一个魅力(它的确如此) - 非常感谢Sam! – MichaelS

+2

我最终与空字符串进行比较,而不是使用ISBLANK,它处理一些空单元格(例如空白返回的公式,例如=“”,因为非空白。因此:'= index(filter(A:A,A: A <>“”),rows(filter(A:A,A:A <>“”)))' – circlepi314

41

要找到可以使用INDEXMATCH功能,这样最后一个非空单元格:

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

我觉得这样更快更简单一些。

+0

这更简单了,我测试过了,效果很好 – Ciaran

+12

你的方法似乎只找到最后一个单元格if该值是一个数字,我的方法将找到最后一行,如果它也是字符串类型的。 最初的问题是关于日期,所以这将工作,但看到作为文章仍然受到关注,值得注意的区别。这一切都取决于你的需求,如果你只是需要一个号码,我推荐这种方式。 –

+2

这是另一个变种http://stackoverflow.com/a/13871043/44620 –

2

什么这个公式得到的最后一个值:

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

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

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

假设您最初的日期是G10。

23

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

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

我个人认为日应该是被接受的答案。简洁而简单。 – SwampThingTom

+0

这是最准确的答案。虽然@Poul上面的答案适用于这种情况,但我想用实际数据找到实际的最后一个单元格,并且无论数据是否按顺序都可以得到它。 –

-1

业余做它是这样的“= CONCATENATE(” A“ COUNTUNIQUE(A1:A9999))”,其中A1是在列中的第一单元,和A9999是越往下该专栏比我曾预料会有任何条目。由此产生的A#可以根据需要与INDIRECT功能一起使用。

+0

对不起。这仅适用于列中的所有条目都是唯一的。 –

+0

虽然我很欣赏你对StackOverflow,Conrad的贡献,但你的答案有一些问题。首先,他没有指定日期是唯一的,所以你应该使用count()而不是countunique()。其次,使用indirect()和concatenate可以复制index()的现有功能,如其他答案中所见。第三,而不是A1:A9999,为什么不使用A1:A? –

10

如果该列仅在连续添加日期 (如我的情况)下展开 - 我只使用MAX函数获取最后日期。

最终的公式是:

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

天才!简单而有效。 – Asu

3

虽然问题已经回答了,有一个雄辩的方式来做到这一点。

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

例如:

如果你的数据在A1:A100并希望能够更多的数据添加到A列,说这可能是A1:A105甚至A1:A1234以后,你可以使用这个范围:

A1:A 
+0

我喜欢这个,但是看到了它有时会返回倒数第二项而不是最后一项的问题。 –

+0

@EricSmalling可能发生的原因是您在所有行的末尾添加了一个换行符,并且在复制粘贴时可能会将其视为非空单元格。你有任何样本电子表格暴露这个问题吗? –

5

我最喜欢的是:

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

因此,对于OP的需要:

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

......尽管最后一个日期总是最新的情况下,上面贴出Poul的“MAX”更清晰。 –

+0

最后加上',1'没有意义吗? –

0

这里的另一个问题:

=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))的公式非常相似,但是如果这是您之后的操作,则可以更轻松地拉出行号。

或者,如果你想在你的工作表上放置一个脚本,你可以使自己容易,如果你打算这么做。下面是scirpt:

=LASTROW() 

,或者如果你想:

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("Sheet1","A") 

和特定纸张一般的最后一行:

=LASTROW("Sheet1") 

然后获得实际的数据,您既可以使用间接的:

=INDIRECT("A"&LASTROW()) 

,或者你可以在最后两条线(最后两个修改上面的脚本,因为你将不得不把两个片材和柱获得与实际的列中的实际值),并与替换变量如下:

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

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

此脚本的一个好处是,您可以选择是否要包含评估为“”的方程式。如果未添加任何参数,则评估为“”的方程式将被计算在内,但是如果您指定了一个表格和一列,则它们将被计数。而且,如果您愿意使用脚本的变体,则会有很大的灵活性。

可能过度杀伤,但一切皆有可能。

相关问题