我想做一个自动摘要编号。我们唯一能做的就是给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.
如果您的级别标记在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)
是Tab。SUMPRODUCT
将其作为数组公式运行,查找值为“A”且行为<=当前行: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
Row,其中A列=“A”,行<=当前行。所以,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)
)