我正在制作甘特图,我需要一个公式来检查前任相关任务的最大日期
我需要检查前任和 wbs 链接的日期并找到最大或最小日期。
因为我无法检查用逗号分隔的多个前任引用,所以我收到错误
我如何才能通过参考检查多个前置结束日期并找到前一个完成后开始任务的最大日期。
答案1
感谢上述“FlexYourData”:当涉及整数和小数时,效果会略有增强。
=IF(NOT(ISBLANK([@Prdcsr])),IFNA(MAX(XLOOKUP(SplitCSV([@Prdcsr]),[Seq],[Tg Dt])),MAX(XLOOKUP(INT(SplitCSV([@Prdcsr])),[Seq],[Tg Dt]))),"")
@Prdcsr= 前置任务列单元格(查找值)
[顺序]= 任务顺序列
[玻璃化转变温度]= 目标日期列
如果涉及小数(作为子任务),则 int() 部分将不起作用。因此使用这个。
答案2
将 AGGREGATE 与 ISNUMBER(SEARCH()) 结合使用
=IFERROR(AGGREGATE(14,7,$F$2:$F$18/ISNUMBER(SEARCH(","&$A$2:$A$18&",",","&C3&",")),1),"")
或者这个数组公式创建一个数字数组并使用 INDEX/MATCH 返回日期数组的最大值。
=IFERROR(MAX(INDEX(F:F,MATCH(FILTERXML("<a><b>"&SUBSTITUTE(C3,",","</b><b>")&"</b></a>","//b"),A:A,0))),"")
不同之处在于,第一个函数每次使用时都会迭代整列数据两次。第二个函数只迭代目标单元格中的数字,但根据版本的不同,可能需要每次使用 Ctrl-Shift-Enter 退出编辑模式才能工作。
答案3
之前我写了一个公式,但是这里有一个错误,它在依赖项编号 9 之后不起作用
=IF($F15="完成到开始 (FS)",MAX(IF(ISNUMBER(SEARCH($B$13:$B$382,$G15)),$K$13:$K$382,999))+1,TODAY())
答案4
您可以创建一个非常简单的 VBA 函数将逗号分隔的值拆分为一个数组,然后使用工作表函数获取所需的内容。
我创建了一个名为 SplitCSV 的函数,它如下所示:
Public Function SplitCSV(ByRef csv As String) As String()
SplitCSV = Split(csv, ",")
End Function
您只需将模块添加到 VBA 编辑器并将其粘贴到那里即可。
获取前置列表中所有项目的最大结束日期的函数是这样的(上图中第 9 行的示例公式):
=MAX(XLOOKUP(INT(SplitCSV(B9)),$A$2:$A$18,$D$2:$D$18))
具体来说,使用 VBA Split() 函数后,SplitCSV 采用逗号分隔的前导项并返回每个项目的数组。
我们将返回的数组(一个字符串数组)包装在 INT 函数中,以将每个项目转换为整数(整数)。
然后将该整数数组作为查找值传递给 XLOOKUP,它将搜索 A 列中的每个项目并从 D 列返回结束日期。
这样,XLOOKUP 将返回一个日期数组 - 每个前一个的结束日期。
用 MAX 包装整个内容可确保我们获得单个日期 - 日期数组中的最大日期。