【问题标题】:Dynamic, multi-level, numbered list using Excel formula使用 Excel 公式的动态、多级、编号列表
【发布时间】:2017-10-07 09:06:57
【问题描述】:

伙计们,

我已经设法仅使用 excel 公式创建了一个动态的、多级的、编号的列表。这工作正常,我想我会分享结果。我唯一的问题是,如果有人想接受这个并尝试简化它。我似乎无法上传示例表(第一次发布)。

编辑 我正在使用一个名为 tbOOA 的表,它有 2 列,选择级别和结果。要使用公式,请复制下面不以 > 开头的编码部分的每一行,并将其复制到一个(长)论坛中。

想要的结果: 结果 1

输出 1.1

活动 1.1.1

活动 1.1.2

输出 1.2

活动 1.2.1

结果 2

输出 2.1

活动 2.1.1 等

>The formula explained:
>First choose if it is an Outcome, Output or Activity. If blank, then nothing
=IF([@[Choose Level]]="","",

>If it is an Outcome, put the word "Outcome" into column C
IF([@[Choose Level]]="Outcome", "Outcome " &

>and concatenate it with a count of the number of "Outcome" already chosen, limited from the header of the table, until this row
COUNTIF(tbOOA[[#Headers],[Choose Level]]:[@[Choose Level]], [@[Choose Level]]),

>Else, if "Output" is chosen, put the word "Output"
IF([@[Choose Level]]="Output", "Output "&

>and concatenate it with the number of "Outcome" from the table header to this line
COUNTIF(tbOOA[[#Headers],[Choose Level]]:[@[Choose Level]],"Outcome")

>and concatentate it with a dot and then
&"."&

>(This was the difficult part of the formula)
>count how many instances of "Output" there are between the last (most recent) instance of "Outcome" and the current row
COUNTIF(INDIRECT(ADDRESS(SUMPRODUCT(MAX(ROW(tbOOA[[#Headers],[Choose Level]]:[@[Choose Level]])*(tbOOA[[#Headers],[Choose Level]]:[@[Choose Level]]="Outcome"))),COLUMN([@[Choose Level]]))&":"&ADDRESS(ROW([@[Choose Level]]),COLUMN(([@[Choose Level]]))),TRUE),"Output"),

>Else, it must be an "Activity", so put "Activity" 
"Activity " &

>and concatenate with the number of "Outcome" from table header to this row, and dot
COUNTIF(tbOOA[[#Headers],[Choose Level]]:[@[Choose Level]],"Outcome")&"."&

>and count how many instances of "Output" between the last "Outcome" and this line
COUNTIF(INDIRECT(ADDRESS(SUMPRODUCT(MAX(ROW(tbOOA[[#Headers],[Choose Level]]:[@[Choose Level]])*(tbOOA[[#Headers],[Choose Level]]:[@[Choose Level]]="Outcome"))),COLUMN([@[Choose Level]]))&":"&ADDRESS(ROW([@[Choose Level]]),COLUMN(([@[Choose Level]]))),TRUE),"Output")&"."&

>and finally, count how many instances of "Activity" since the last "Output"
ROW([@[Choose Level]])-SUMPRODUCT(MAX(ROW(tbOOA[[#Headers],[Choose Level]]:[@[Choose Level]])*(tbOOA[[#Headers],[Choose Level]]:[@[Choose Level]]="Output"))))))

【问题讨论】:

  • ChooseLevel 列中可能有哪些条目?
  • “结果”、“输出”和“活动”
  • 除非我把“结果”放在表格的第一个单元格中,否则我到处都会出错。我可以将其他两个值放在第一个值以下的单元格中,但不能放在第一个值中。你能澄清一下吗?
  • 同意。这是一个小错误。但从逻辑上讲,从商业角度来看,结果永远是第一位的。我可以在其中添加一个额外的错误处理 IF 语句。
  • ChooseLevel 列中的条目顺序有哪些限制?例如,如果前三个单元格是“Outcome”、“Activity”、“Activity”,我会得到“Outcome1”、“Activity1.0.3”、“Activity1.0.4”。对吗?

标签: excel dynamic multi-level numbered-list


【解决方案1】:

我可以把它缩小到你的一半左右。

数组公式**:

=CHOOSE(MIN(ROWS(INDEX([ChooseLevel],1):[@ChooseLevel]),4),"Outcome1","Output1.1","Activity1.1.1",[@ChooseLevel]&COUNTIF(INDEX([ChooseLevel],1):[@ChooseLevel],"Outcome")&IF([@ChooseLevel]="Outcome","",SUBSTITUTE("."&COUNTIF([@ChooseLevel]:INDEX([ChooseLevel],MATCH(1,0/(INDEX([ChooseLevel],1):[@ChooseLevel]="Outcome"))),"Output")&"."&COUNTIF([@ChooseLevel]:INDEX([ChooseLevel],MATCH(1,0/(INDEX([ChooseLevel],1):[@ChooseLevel]="Output"))),"Activity"),".0","")))

问候

**数组公式的输入方式与“标准”公式不同。不是只按 ENTER,而是先按住 CTRL 和 SHIFT,然后再按 ENTER。如果操作正确,您会注意到 Excel 在公式周围放置了大括号 {}(尽管不要尝试自己手动插入)。

【讨论】:

  • 上述答案中的小错误,我将其包装在一个 IF 语句中以删除编号,即使没有选择结果、输出或活动。 IF([@ChooseLevel]="","", 我还放入了一个错误处理列,如果不遵循业务逻辑,则返回一条消息。这按预期工作。我没有遇到 CHOOSE 公式之前,我会调查的。非常感谢您在这个问题上的努力。
猜你喜欢
  • 2017-10-15
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 2018-07-05
  • 2017-05-31
  • 1970-01-01
相关资源
最近更新 更多