使用Excel来增加标题的命名范围
这是一个前面的问题 – Excel命名的范围,使增量标题和子标题 。
上下文:我有一个Excel数据工作表具有headers
, sub headers
和sub-sub headers
来分割工作表的部分。 为了使标题的编号自动化(如下图所示),我正在Header3
为报头,子报头和子子报头使用称为Header1
, Header2
和Header3
公式化命名范围。
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() ) ) ) )
请注意我已经打破了多条线的可读性公式。
用法:很简单,我可以在单元格A1
和A20
调用=Header1
,头文件会自动递增。 与B4
=Header2
相同。
我的问题:使用Header2
的公式,它增加到1.9
但是之后的下一个增量点是2.0
,我希望它是1.10
,如上图所示。 这怎么能实现? 另外,如何实现sub-sub headers
(在上面的图像中标记为Further Sub Header
)? 理想情况下,我希望sub-sub标题也遵循1.1.10
的惯例。
Sub-Header公式允许多达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() ) ) ) )
子小标题公式
=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() ) ) ) )
对于魔术部分,将数值格式应用于0.00.00
C
列
免费的答案,命名范围公式的一般forms,返回一个标题值依赖于它input的列。
使用单个命名范围公式,如Header
它会返回一个标题如下
- 列A:标题(格式
0
) - 列B:子标题(格式为
0.00
) - 列C:子子标题(格式(
0.00.00
) - 列D:子 – 子 – 子标题(格式:
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))))
考虑一个相当简单的用户定义函数(又名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
授予该工作簿将必须是macros或二进制的,但我很乐意交易,让圆形参考整天坐在我的状态栏。
随着分层模式的次要限制,你可以把UDF放在你想要的任何单元格中。 请注意,UDF返回的所有引用都是文本string。