这是对上一个问题的跟进 - Excel named ranges to make incrementing headers and sub headers。
上下文:我有一个Excel数据工作表,其中包含headers
,sub headers
和sub-sub headers
来划分工作表的各个部分。为了使标题自动编号(如下图所示),我使用名为Header1
,Header2
和Header3
的公式命名范围作为标题,子标题和子标题-sub标题分别。
Header1
的公式为:
=IF( COLUMN() <> 1, "", 1 + MAX( INDEX(!$A:$A, 1 ) :
INDEX(!$A:$A, - 1 + ROW() ) ) )
和Header2
的公式为:
=IF( COLUMN() <> 2, "", 0.1 + IF( MAX( INDEX(!$A:$A, 1 ) : INDEX(!$A:$A, - 1
+ ROW() ) ) > MAX( INDEX(!$B:$B, 1 ) : INDEX(!$B:$B, - 1 + ROW() ) ),
MAX( INDEX(!$A:$A, 1 ) : INDEX(!$A:$A, - 1 + ROW() ) ),
MAX( INDEX(!$B:$B, 1 ) : INDEX(!$B:$B, - 1 + ROW() ) ) ) )
请注意,为了便于阅读,我已将公式分为多行。
用法:很简单,我可以在单元格=Header1
和A1
中调用A20
,标题会自动递增。与=Header2
中的B4
相同。
我的问题:使用Header2
的公式,它会递增到1.9
但是之后的下一个增量点是2.0
,我希望它如上图所示1.10
。怎么能实现这一目标?此外,如何实现sub-sub headers
(在上图中标记为Further Sub Header
)?理想情况下,我希望子子标题也遵循1.1.10
的惯例。
答案 0 :(得分:1)
考虑一个相当简单的用户定义函数(又名 UDF )来完成此任务。
Function hdr_LVL()
Application.Volatile
Dim sLVL As String, tmp As String
With Application.Caller
If .Row = 1 Then
sLVL = "1"
ElseIf .Column = 1 Then
sLVL = CStr(Application.CountIf(.Parent.Cells(1, .Column).Resize(.Row - 1, 1), "*") + 1)
Else
tmp = Application.Index(.Parent.Columns(.Column - 1), _
Application.Match("žžž", .Parent.Cells(1, .Column - 1).Cells.Resize(.Row - 1, 1)))
sLVL = tmp & Chr(46) & Application.CountIf(.Parent.Cells(1, .Column).Resize(.Row - 1, 1), _
tmp & Chr(42)) + 1
End If
End With
hdr_LVL = sLVL
End Function
当然,工作簿必须是启用宏的或二进制的,但我很乐意将其与循环引用整天放在我的状态栏中进行交换。
在分层模式之后有一些小的限制,你可以将UDF放在你想要的任何单元格中。请注意,UDF返回的所有引用都是文本字符串。
答案 1 :(得分:1)
子标题公式允许最多99个级别:
=IF( COLUMN() <> 2, "", 0.01 +
IF( MAX( INDEX(!$A:$A, 1 ) : INDEX(!$A:$A, - 1 + ROW() ) ) > MAX( INDEX(!$B:$B, 1 ) : INDEX(!$B:$B, - 1 + ROW() ) ),
MAX( INDEX(!$A:$A, 1 ) : INDEX(!$A:$A, - 1 + ROW() ) ),
MAX( INDEX(!$B:$B, 1 ) : INDEX(!$B:$B, - 1 + ROW() ) ) ) )
子Sub Header公式
=IF( COLUMN() <> 3, "", 0.0001 +
IF( MAX( INDEX(!$B:$B, 1 ) : INDEX(!$B:$B, - 1 + ROW() ) ) > MAX( INDEX(!$C:$C, 1 ) : INDEX(!$C:$C, - 1 + ROW() ) ),
MAX( INDEX(!$B:$B, 1 ) : INDEX(!$B:$B, - 1 + ROW() ) ),
MAX( INDEX(!$C:$C, 1 ) : INDEX(!$C:$C, - 1 + ROW() ) ) ) )
对于神奇的部分,将数字格式应用于C
0.00.00
列
免费回答,命名范围公式的一般形式,返回根据其输入的列的标题值。
使用单个命名范围公式,例如Header
它将返回如下标题
0
)0.00
)0.00.00
)0.00.00.00
)根据需要格式化多个列,如上所示
=IF(COLUMN()=1, MAX( INDEX(!$A:$A, 1 ) : INDEX(!$A:$A, - 1 + ROW() )) + 1,
IF( MAX(INDEX(!$1:$1,COLUMN()-1):INDEX(!$A:$A, ROW()-1)) > MAX(INDEX(!$1:$1,COLUMN()):INDEX(!$A:$A, ROW()-1)),
MAX(INDEX(!$1:$1,COLUMN()-1):INDEX(!$A:$A, ROW()-1)) + 1/10^(2*(COLUMN()-2)),
MAX(INDEX(!$1:$1,COLUMN()) :INDEX(!$A:$A, ROW()-1)) + 1/10^(2*(COLUMN()-1))))