2011-11-14 484 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(); 

此腳本的一個好處是,您可以選擇是否要包含評估爲「」的方程式。如果未添加任何參數,則評估爲「」的方程式將被計算在內,但是如果您指定了一個表格和一列,則它們將被計數。而且,如果您願意使用腳本的變體,則會有很大的靈活性。

可能過度殺傷,但一切皆有可能。

相關問題