跟踪Excel中的任务依赖性

时间:2017-08-24 11:30:26

标签: excel excel-vba excel-formula excel-2010 excel-2007 vba

我的Excel工作表中有两个标签。

标签1 :包含多个功能区域中所有依赖关系的列表。列是功能区域,依赖关系描述,依赖关系ID,计划结束日期,目标结束日期。

标签2 :包含具有以下列的任务列表:

功能区域,可交付名称,可交付物描述,目标日期,预计日期,依赖关系ID

E.g。

Functional Area Dependencies  Plan end date  Target End date
   F1            D1            8/22           8/22
   F1            D2            8/23           8/23
   F2            D3            8/24           8/24
   F2            D4            8/25           8/25

Functional Area Deliverable Dependencies Target Date  Projected Date
   F1                de1       D1, D2        8/20           
   F1                de2       D1            8/20           
   F2                de3       D3, D4        8/20           
   F2                de4       D3            8/20           

依赖项ID将包含与选项卡1中给定可交付项相关联的所有ID。我想要的帮助是一种方法,可以找出如果我的任何依赖项与给定的可交付项相关联的日期超过了我的目标日期可交付成果,我的预计日期应该填充到所有依赖项中的最新日期。因此,在上面的示例中,de1的预计日期应填充为8/23,d2的预计日期应为8/22。请指教。谢谢。

1 个答案:

答案 0 :(得分:1)

你需要三件才能让它发挥作用。第一个是这个公式(我们在Tab2上开始工作):

=TRIM(SUBSTITUTE(MID(SUBSTITUTE("," & C2&REPT(" ",6),",",REPT(",",255)),1*255,255),",",""))

单元格C2包含依赖项列表,例如D1,D2

注意公式中的1 * 255位 - 如果将1更改为2,则此公式为您提供依赖项列表中的第二项,然后是第三项,等等。

现在我们有三个公式可以为您提供第一,第二或第三依赖:

=TRIM(SUBSTITUTE(MID(SUBSTITUTE("," & C2&REPT(" ",6),",",REPT(",",255)),1*255,255),",",""))

=TRIM(SUBSTITUTE(MID(SUBSTITUTE("," & C2&REPT(" ",6),",",REPT(",",255)),2*255,255),",",""))

=TRIM(SUBSTITUTE(MID(SUBSTITUTE("," & C2&REPT(" ",6),",",REPT(",",255)),3*255,255),",",""))

我们将采用每个公式并将其包装在vlookup中 - 这将从Tab1中查找目标结束日期:

=VLOOKUP(TRIM(SUBSTITUTE(MID(SUBSTITUTE("," & C2&REPT(" ",6),",",REPT(",",255)),1*255,255),",","")),Tab1!$B$2:$D$100,3,FALSE)

在此公式中,假设要查找的数据位于Tab1!$B$2:$D$100,我假设目标结束日期位于第三列。请注意,这也假定依赖列是B列。

这个公式将为我提供第一个依赖项的目标结束日期。

我们几乎已准备好将它们包装到一个函数中,但在我们这样做之前,我们希望防范vlookup错误:

=IFERROR(VLOOKUP(TRIM(SUBSTITUTE(MID(SUBSTITUTE("," & C2&REPT(" ",6),",",REPT(",",255)),1*255,255),",","")),'Tab1'!$B$2:$D$100,3,FALSE),0)

现在我们可以使用Max函数组合所有三个函数,这将为我们提供最大的(最新的)日期:

=MAX(IFERROR(VLOOKUP(TRIM(SUBSTITUTE(MID(SUBSTITUTE("," & C2&REPT(" ",6),",",REPT(",",255)),1*255,255),",","")),'Tab1'!$B$2:$D$100,3,FALSE),0),IFERROR(VLOOKUP(TRIM(SUBSTITUTE(MID(SUBSTITUTE("," & C2&REPT(" ",6),",",REPT(",",255)),2*255,255),",","")),'Tab1'!$B$2:$D$100,3,FALSE),0),IFERROR(VLOOKUP(TRIM(SUBSTITUTE(MID(SUBSTITUTE("," & C2&REPT(" ",6),",",REPT(",",255)),3*255,255),",","")),'Tab1'!$B$2:$D$100,3,FALSE),0))