我想做一个自动摘要编号。我们唯一能做的就是给A(标题)编号,但字幕应该自动编号。如果title = 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
答案 0 :(得分:3)
如果您的级别标记在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
让我们分解为步骤:
REPT(CHAR(9), CODE(A1)-65)
其中Char(9)
是标签。接下来,我们要计算我们有多少“A”。我们可以使用SUMPRODUCT
将其作为数组公式运行,查找值为“A”且行为&lt; =当前行:SUMPRODUCT(--(A:A="A")*--(ROW(A:A)<=ROW(A1)))
的单元格。之后推了一个点,你就有了你的标题号。
接下来,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”,行&lt; =当前行。所以,MAX(--ROW(A:A)*--(A:A="A")*--(ROW(A:A)<=ROW(A1)))
。
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
和全站,以获取
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”重复相同的操作,然后最后添加一个Tab(CHAR(9)
)和B列中的值。
(例如,如果您想要,在行的开头或数字和图块之间,只需要4个空格或6个连字符或7个点而不是标签,只需替换第一个或最后一个CHAR(9)
)