我有一张纸,其中保存了所有项目和资源的详细信息。我需要知道项目之间是否有空闲资源。 假设一个团队中有x个人,我需要知道在项目之间有人可用的持续时间以及下一个项目何时开始。
示例: 表1:项目和资源的详细信息
<table>
<tr>
<td>Name</td>
<td>Project</td>
<td>Start Date</td>
<td>End Date</td>
</tr>
<tr>
<td>A</td>
<td>X</td>
<td>01 Jan 2019</td>
<td>31 Mar 2019</td>
</tr>
<tr>
<td>B</td>
<td>Y</td>
<td>05 Jan 2019</td>
<td>01 May 2019</td>
</tr>
<tr>
<td>A</td>
<td>Z</td>
<td>15 Apr 2019</td>
<td>01 Sep 2019</td>
</tr>
</table>
在上述情况下,人A有两个项目X和Z,中间有15天的时间。我想要一张如下表。
表2:
<table>
<tr>
<td>Name</td>
<td>Current Project</td>
<td>End Date</td>
<td>Next Project</td>
<td>Start Date</td>
<td>Duration</td>
</tr>
<tr>
<td>A</td>
<td>X</td>
<td>31 Mar 2019</td>
<td>Z</td>
<td>15 Apr 2019</td>
<td>15</td>
</tr>
<tr>
<td>B</td>
<td>Y</td>
<td>01 May 2019</td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
如果未分配下一个项目,则下一个项目,开始日期和持续时间可以为空。 我不想为此编写VBA,我只想使用函数来实现这一点。有可能吗?
答案 0 :(得分:0)
我已将您的数据转换为Excel表(使用 Ctrl + T 键盘快捷键)并使用了以下公式:
E2:=IF(MAX(([Name]=[@Name])*([Start Date]>[@[End Date]])*[Start Date])>0,MAX(([Name]=[@Name])*([Start Date]>[@[End Date]])*[Start Date]),"")
F2:=IF(ISNUMBER([@[Next Project Start Date]]),[@[Next Project Start Date]]-[@[End Date]],"")
请注意,E2中的公式是一个数组输入的公式:您必须使用 Ctrl + Shift + E < / p>
答案 1 :(得分:0)
我认为不需要获得第三个项目。首先,您应该获得唯一的名称(列A
)。可以像this一样完成此操作,也可以使用unique()
函数(对于Google Sheet)来完成。假设输入范围为Sheet1!A2:A9
,则在Sheet2
上,您可以通过在A
输入以下数组公式来获得名字(在这种情况下为A2
):
{=IFERROR(INDEX(Sheet1!$A$2:$A$9, MATCH(0,COUNTIF($A$1:A1, Sheet1!$A$2:$A$9), 0)),"")}
现在在G
中添加一个辅助列Sheet2
。在G2
上,输入以下公式以获取与名字(A
)匹配的当前行索引:
=MATCH($A2, Sheet1!$A$2:$A$9, 0)
添加另一个帮助者列H
。您可以像这样(在A
上)获得名字(H2
)的下一个匹配行索引:
=MATCH($A2, OFFSET(Sheet1!$A$2:$A$9, $G2, 0, 8), 0)+$G2
请注意,8
是Sheet1!$A$2:$A$9
的硬编码高度。如果输入范围发生变化,您也应该更改该值。
现在,您可以获得这样的当前项目名称(在B2
上):
=INDEX(Sheet1!$B$2:$B$9, $G2)
以及下一个项目名称(在D2
上):
=INDEX(Sheet1!$B$2:$B$9, $H2)
当前项目结束日期(在C2
上):
=INDEX(Sheet1!$D$2:$D$9, $G2)
下一个项目开始日期(在E2
上):
=INDEX(Sheet1!$C$2:$C$9, $H2)
然后持续时间很短(在F2
上):
=E2-C2
然后复制2:2
并粘贴到3:9
上。完成。
示例文件为here。我已将ifError()
的每个单元格包裹在文件中。