excel 基于里程碑/任务/子任务创建动态编号列表

fd3cxomn  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(201)

我想创建一个基于公式的数字列表取决于行项目是否被分类为里程碑,任务或子任务。
手动输出如下所示:
公式需要足够动态,以处理存在多个任务(但没有子任务)的情况,或者创建了大量子任务并创建了新任务的情况。示例如下
我尝试了以下方法,试图说明值大于10时的情况:

=IF(B10="milestone",IF(A9<10,LEFT(A9)+1,LEFT(A9,2)+1),IF(B10="Task",IF(B9="Milestone",A9+0.1,IF(B9="subtask",IF(LEFT(A9,1)<=9,A9+0.1,LEFT(A9,4)+0.1),A9+0.1)),IF(B10="subtask",IF(B9="subTask",IF(NUMBERVALUE(LEFT(A9,1))<=9,LEFT(A9,4)&RIGHT(A9,1)+1,0),A9&"."&1))))

我也试过:

=IF(B39="milestone",IF(A38<10,LEFT(A38)+1,LEFT(A38,2)+1),IF(B39="Task",IF(B38="Milestone",A38+0.1,IF(B38="subtask",IF(LEFT(A38,1)<=9,A38+0.1,LEFT(A38,4)+0.1),A38+0.1)),IF(B39="subtask",IF(B38="Task",IF(A38<=9,LEFT(A38,4)&"."&1,LEFT(A38,5)&"."&1),LEFT(A38,5)&RIGHT(A38,1)+1))))

在这两种情况下,我都遇到了a #Value!错误。

a14dhokn

a14dhokn1#

使用Office 365 Excel,我们可以使用TEXTSPLIT和TEXTJOIN进行拆分和重新组合。使用BYCOL,我们可以更改我们想要的内容:

=LET(
    tp,B2,
    ref,A1,
    clms,MATCH(tp,{"Milestone","Task","Subtask"},0),
    TEXTJOIN(".",TRUE,BYCOL(SEQUENCE(,clms),LAMBDA(a,IFERROR(INDEX(TEXTSPLIT(ref,"."),0,a)+0,0)+IF(a=clms,1,0)))))

请注意,这是指它上面的行,因此它至少需要从第2行开始。

eufgjt7s

eufgjt7s2#

下面是一个数组公式,它基于名为A的输入范围溢出整个输出:

=LET(A,A1:A10, types,{"Milestone","Task","Subtask"}, seq,{1,2,3},
 tri,N({1;2;3}>=seq), n,SCAN("0.0.0",A,LAMBDA(ac,aa,LET(x,TEXTSPLIT(ac,"."), 
  idx, XMATCH(aa, types), TEXTJOIN(".",,x * INDEX(tri,idx,) + N(seq=idx))))), 
 SUBSTITUTE(n,".0",""))

下面是输出:

我们在每次迭代中对每个级别进行累加和,取最后一个累加器值按列拆分(x)。为了正确地进行加法和重置计数器,我们使用以下计算:

x * INDEX(tri,idx,) + N(seq=idx)

其中idx表示在types中找到的层的索引位置。名称tri是下单位三角矩阵。
最后,我们通过SUBSTITUTE删除零计数。小心,如果您不遵守水平的顺序,则会得到错误的结果。例如,如果在Milestone之后放置Substack而不是Task。如果您保留零计数,则可以防止这种情况。但是这样的话输出结果就不是你想要的了。我建议你添加一个条件格式规则来突出这种情况。
对于m级别的一般情况,可以使用以下公式并相应地更新types

=LET(A,A1:A10, m,3, types,{"Milestone","Task","Subtask"}, seq,SEQUENCE(,m),
 tri,N(TOCOL(seq)>=seq), n,SCAN("0.0.0",A,LAMBDA(ac,aa,LET(x,TEXTSPLIT(ac,"."), 
  idx, XMATCH(aa, types), TEXTJOIN(".",,x * INDEX(tri,idx,) + N(seq=idx))))), 
 SUBSTITUTE(n,".0",""))

相关问题