我有一个Excel工作表(称为Sheet1),其中包含如下所示的数据行:
Unit | Names | Begin_Date | End_Date
-----------------------------------
A | Jones | 1/1/2016 | 1/4/2018
A | Frank | 2/11/2018 |
B | Adam | 3/5/2011 |
C | Jane | 6/9/2012 | 7/14/2016
C | John | 7/28/2016 | 9/22/2017
C | Joe | 12/31/2017 | 1/1/2019
C | Joe | 1/2/2019 |
我正在尝试将其格式化为以单位为列标题和日期为行的格式。这个想法是,在开始日期和结束日期之间的每一天,该人的姓名都应该在适当的单元格中。如果在同一单位内一个人的结束日期与下一个人的开始日期之间有间隔,则该公式将列出“空缺”。假定每个单元在该单元的第一个“开始日期”之前都是空缺的,结束日期为空白表示该人仍在使用该单元。理想情况下,在Sheet2上完整的数据集应如下所示:
Date | A | B | C |
-------------------------------------
3/5/2011 | Vacant | Adam | Vacant
3/6/2011 | Vacant | Adam | Vacant
...
6/9/2012 | Vacant | Adam | Jane
...
1/1/2016 | Jones | Adam | Jane
...
7/14/2016 | Jones | Adam | Jane
7/15/2016 | Jones | Adam | Vacant
7/16/2016 | Jones | Adam | Vacant
...
7/28/2016 | Jones | Adam | John
...
1/4/2018 | Jones | Adam | Joe
1/5/2018 | Vacant | Adam | Joe
等
到目前为止,我拥有的公式会填充第一个值,即该单元中居住的第一个人,或者如果没有人,则它在Sheet2上列出“空缺”。但是,我不确定如何扩展它以寻找下一个人。我已经在A列中列出了所有日期,并在第1行中列出了所有唯一的单位名称。任何帮助或建议都将不胜感激!
= iferror(if(index(Sheet1!Names,match(1,(Sheet2!A $ 2 = Sheet1!Begin_Date)**(Sheet2!$ A3 = Sheet1!End_Date),0))= Index(Sheet1!Names, match($ A2,ArrayFormula(min(Sheet1!Unit = B $ 2,Sheet1!Begin_Date))),“空置”,Index(Sheet1!Names,match($ A2,ArrayFormula(min(Sheet1!Unit = B $ 2,Sheet1! Begin_Date))),Index(Sheet1!Names,match($ A2,ArrayFormula(min(Sheet1!Unit = B $ 2,Sheet1!Begin_Date)))
答案 0 :(得分:0)
这使用了聚合,并且基本上是一个数组公式,但是不必输入 Ctrl Shift Enter
=IF($F2="","",IFERROR(INDEX($B:$B,AGGREGATE(15,6,ROW($A$2:$A$10)/
(($A$2:$A$10=G$1)*($F2>=$C$2:$C$10)*(($F2<=$D$2:$D$10)+($D$2:$D$10=""))),1)),"Vacant"))
Aggregate(15,6 ... 1)唤醒其中的数组的最小值,而忽略任何错误值。该数组由行2-10除以行上的条件。使用*(与)和+(或)来设置条件(与您一样)。如果条件为假,则会导致被零除,从而产生错误,因此仅考虑满足条件的行。
您也可以使用此
=IF($F2="","",IFERROR(INDEX($B$2:$B$10,MATCH(1,
($A$2:$A$10=G$1)*($F2>=$C$2:$C$10)*(($F2<=$D$2:$D$10)+($D$2:$D$10="")),0)),"Vacant"))
输入为数组公式。