问题描述
我正在尝试制定计划。我有一张桌子,我想变成这样:
ID | 父 ID | 开始日期 | 持续时间 | 结束日期 |
---|---|---|---|---|
1 | 01/01/2021 | 10 | 11/01/2021 | |
2 | 1 | 06/05/2021 | 2 | 08/05/2021 |
3 | 2 | 08/05/2021 | 1 | 09/05/2021 |
4 | 3 | 09/05/2021 | 5 | 14/05/2021 |
5 | 2,3,4 | 14/05/2021 | 4 | 18/05/2021 |
开始日期将基于父 ID 与任务 ID 的匹配,因此任务 2 在任务 1 之后,任务 2 在任务 3 之后,等等。我还希望能够针对可能发生的多个任务进行测试同时,因此任务 5 可以在任务 2、3 或 4 之后开始,以最后一个结束。
我为开始日期计算编写了这个 UDF。
Option Explicit
Function LastPredecessor(PreList As String,TaskList As Range,TaskDueDate As Range)
Dim ID
Dim Dates
Dim nPres,i As Integer
On Error Resume Next
Pres = Split(PreList,",")
nPres = UBound(Pres)
ReDim Dates(0 To nPres,0)
For i = 0 To nPres
Dates(i,0) = IDX_Match(CInt(Pres(i)),TaskList,TaskDueDate)
Next
LastPredecessor = WorksheetFunction.Max(Dates)
End Function
Function IDX_Match(LookupVal,MatchRange As Range,LookupRange As Range,Optional MatchType As Integer = 0)
IDX_Match = WorksheetFunction.Index(LookupRange.Value2,WorksheetFunction.Match(LookupVal,MatchRange.Value2,MatchType))
End Function
=LastPredecessor([@Parent ID],[ID],[结束日期])
如果结束日期与开始日期无关,则效果很好,但是一旦我尝试更新结束日期,并添加开始日期 + 持续时间作为结束日期的计算,就会产生循环错误。
>我确定我做错了一些非常简单的事情,但很高兴知道我需要做什么来解决这个问题。
编辑:
感谢@Toddleson,以下是稍微修改的版本
Function LastPredecessor(PreList As String,EndDates As Range,IDColumn As Range) As Date
Dim Preds() As String,PredDates() As Long
Preds = Split(PreList,")
ReDim PredDates(UBound(Preds))
For i = LBound(Preds) To UBound(Preds)
PredDates(i) = IDColumn(WorksheetFunction.Match(CInt(Preds(i)),IDColumn,0)).Offset(0,EndDates.Column - IDColumn.Column).Value2
Next i
LastPredecessor = Application.WorksheetFunction.Max(PredDates)
End Function