Excel 中的自动编号与层次结构

Automatic numbering in Excel with hierarchy

我想做一个自动摘要编号。我们唯一能做的就是给 A(标题)编号,但字幕应该自动编号。如标题=1,副标题1.1,下方1.1.1等。

假设标题是 A,B 和 C 是字幕。

模式应该是这样的

1.A

1.1 B

1.2 B

2.A

2.1 B

2.1.1 C

所以我尝试了这个:

What I get

What we want

What we want

如果您的级别标记为 A 列中的 "A" / "B" / "C" 和 B 列中的标题,那么您可以使用以下(复杂的)代码:

=REPT(CHAR(9), CODE(A1)-65) & SUMPRODUCT(--(A:A="A")*--(ROW(A:A)<=ROW(A1))) & "." & IF(CODE(A1)>65,SUMPRODUCT(--(A:A="B")*--(ROW(A:A)<=ROW(A1))*--(ROW(A:A)>=MAX(--ROW(A:A)*--(A:A="A")*--(ROW(A:A)<=ROW(A1))))) & ".","") & IF(CODE(A1)>66,SUMPRODUCT(--(A:A="C")*--(ROW(A:A)<=ROW(A1))*--(ROW(A:A)>=MAX(--ROW(A:A)*--(A:A="B")*--(ROW(A:A)<=ROW(A1))))) & ".","") & CHAR(9) & B1

让我们把它分解成几个步骤:

  1. 从制表符开始缩进标题(0 表示 "A",1 表示 "B",2 表示 "C"):REPT(CHAR(9), CODE(A1)-65) 其中 Char(9) 是一个选项卡
  2. 接下来,我们要统计我们有多少"A"。我们可以使用 SUMPRODUCT 到 运行 作为数组公式,查找值为 "A" 且行 <= 当前行:SUMPRODUCT(--(A:A="A")*--(ROW(A:A)<=ROW(A1))) 的单元格。在那之后推一个点,你就有了你的航向号。

  3. 接下来,IF A 列是 "B" 或更晚的字母表(IF(CODE(A1)>65,因为 CODE("A")=65,CODE("B")=66 等)那么我们要计算自上次 "A" 以来有多少 "B"。这与我们上一个查询非常相似,但我们需要 ROW(A:A)>=LAST_A。但是,什么是 LAST_A?好吧,我们想要 MAX 行,其中 A 列 = "A" 且行 <= 当前行。所以,MAX(--ROW(A:A)*--(A:A="A")*--(ROW(A:A)<=ROW(A1))).

  4. 这给出 SUMPRODUCT(--(A:A="B")*--(ROW(A:A)<=ROW(A1))*--(ROW(A:A)>=MAX(--ROW(A:A)*--(A:A="A")*--(ROW(A:A)<=ROW(A1)))))

现在,我们需要添加 IF 和 full-stop,得到

If(Code(A1)>65,SUMPRODUCT(--(A:A="B")*--(ROW(A:A)<=ROW(A1))*--(Row(A:A)>=MAX(--ROW(A:A)*--(A:A="A")*--(ROW(A:A)<=ROW(A1))))) & ".","")

对自上次 "B" 以来的所有 "C" 重复相同的操作,然后最后添加一个制表符 (CHAR(9)) 和 B 列中的值。

(例如,如果您想要 4 个空格或 6 个连字符或 7 个点而不是行首或数字与拼贴之间的制表符,只需替换第一个或最后一个 CHAR(9)

{编辑} 示例:

又快又脏。

只需手动输入第一部分。
然后在下面插入:

=IF(A3="down",B2&"1.",IF(A3="up",LEFT(B2,LEN(B2)-4)&MID(B2,LEN(B2)-3,1)+1&".",LEFT(B2,LEN(B2)-2)&MID(B2,LEN(B2)-1,1)+1&"."))

当您写下“down”时,它会加上“1”。在上面字符串的末尾。
当你写“up”时,它会删除最后 2 个字符,并将 1 添加到上面字符串的最后一个字符。
如果你什么都不写,它会在最后一个字符上加 1。

错误:如果部分大于 9,“向上”将不起作用。