我有一個表格,它收集了許多不同玩家的每日總分讀數。由于是通過表格手動收集,因此可能有一些玩家每天會添加不止一次閱讀,也可能一天或更長時間根本沒有任何閱讀。結構是非常基本的 3 列(Date、Player、Total)。
我正在尋找一個ArrayFormula會自動填寫特定玩家每日得分的第 4 列。這可以通過一個公式來實作,該公式找到特定玩家的倒數第二個讀數并將其從其上次/當前讀數中減去。
| 日期 | 播放器 | 全部的 | 日常的 |
|---|---|---|---|
| 17/10/2021 | 玩家 001 | 1500 | 1500 |
| 2021 年 10月 17日 | 玩家 007 | 700 | 700 |
| 2021 年 10月 19 日 | 玩家 003 | 700 | 700 |
| 19/10/2021 | 玩家 005 | 100 | 100 |
| 19/10/2021 | 玩家 004 | 1100 | 1100 |
| 19/10/2021 | 玩家 006 | 300 | 300 |
| 19/10/2021 | 玩家 002 | 900 | 900 |
| 20 /10/2021 | 玩家 006 | 900 | 600 |
| 20 /10/2021 | 玩家 006 | 1600 | 700 |
| 20/10/2021 | 玩家 002 | 1100 | 200 |
| 20/10/2021 | 玩家 005 | 600 | 500 |
| 20/10/2021 | 玩家 009 | 200 | 200 |
| 21/10/2021 | 玩家 001 | 1600 | 100 |
| 21/10/2021 | 玩家 003 | 1000 | 300 |
我找到了一個非常有趣的解決方案,但由于它基于INDIRECT它無法使用ArrayFormula:
uj5u.com熱心網友回復:
我將提供一個試探性的解決方案,我知道如果無法看到一些實際資料和預期結果,撰寫這樣的公式總是很困難的。
假設您的資料在 A2:C 中(標題在 A1:C1 中)。在其他為空的 Col D 的 D2 中嘗試以下公式:
=ArrayFormula(IF(A2:A="",,C2:C - (VLOOKUP(B2:B&(A2:A-1), SORT({ {"", 0}; {B2:B&A2:A, C2:C} }), 2, TRUE) * (VLOOKUP(B2:B&(A2:A-1), SORT({ {"", 0}; {B2:B&A2:A, B2:B} }), 2, TRUE) = B2:B))))
要查找每個玩家的倒數第二個得分,請VLOOKUP在SORT包含 A.) {null, 0} on top of B.) {a concatenation of每行的玩家和日期,分數}。
由于 ,可以使用SORT最后一個引數TRUE,這意味著如果沒有找到與 player-and-“yesterday” 的完全匹配,則將回傳最接近的先前匹配。該* VLOOKUP(...)是有,以確保前面的比賽是同一人(因為每個人的最早日期之前的字母條目將成為別人的最后日期,除第一人按字母順序,誰將會退回給{NULL,0} )。
但是,如果您的作業表在您的資料下方始終至少有一個空白行,您可以稍微簡化一下:
=ArrayFormula(IF(A2:A="",,C2:C - (VLOOKUP(B2:B&(A2:A-1), SORT({B2:B&A2:A, C2:C}), 2, TRUE) * (VLOOKUP(B2:B&(A2:A-1), SORT({B2:B&A2:A, B2:B}), 2, TRUE) = B2:B))))
這是因為按字母順序排列的人的第一個日期的反彈會為所有空白行找到 {null, null},這相當于 {null, 0},所有這些都SORT將比您的所有資料更早被ed。所以我們不需要將它包含在虛擬陣列設定中。
如果結果不符合預期,請與預期結果共享一組最小的現實資料。
附錄(根據 OP 的附加評論):
如果玩家每天可以輸入多個分數,您可以使用以下公式版本。
如果您不確定您的資料下方總是至少有一個空白行:
=ArrayFormula(IF(A2:A="",,C2:C - (VLOOKUP(B2:B&TEXT(ROW(B2:B)-1,"0000"), SORT({ {"", 0}; {B2:B&TEXT(ROW(B2:B),"0000"), C2:C} }), 2, TRUE) * (VLOOKUP(B2:B&TEXT(ROW(B2:B)-1,"0000"), SORT({ {"", 0}; {B2:B&TEXT(ROW(B2:B),"0000"), B2:B} }), 2, TRUE) = B2:B))))
如果你是相信你將永遠有您的以下資料的至少一個空白行:
=ArrayFormula(IF(A2:A="",,C2:C - (VLOOKUP(B2:B&TEXT(ROW(B2:B)-1,"0000"), SORT( {B2:B&TEXT(ROW(B2:B),"0000"), C2:C} ), 2, TRUE) * (VLOOKUP(B2:B&TEXT(ROW(B2:B)-1,"0000"), SORT( {B2:B&TEXT(ROW(B2:B),"0000"), B2:B} ), 2, TRUE) = B2:B))))
以上兩個都替換了日期的行號。然后,他們假設您的資料將始終按照它們實時出現的順序輸入,而不是隨機輸入(即,您不會在較晚日期的分數之后輸入較早日期的分數)。如果您可能會亂序輸入,這也可以控制;但我這里沒有這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/335180.html
