使用Excel来增加标题的命名范围

这是一个前面的问题 – Excel命名的范围,使增量标题和子标题 。

上下文:我有一个Excel数据工作表具有headerssub headerssub-sub headers来分割工作表的部分。 为了使标题的编号自动化(如下图所示),我正在Header3为报头,子报头和子子报头使用称为Header1Header2Header3公式化命名范围。

headered Excel工作表的图像

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() ) ) ) ) 

请注意我已经打破了多条线的可读性公式。

用法:很简单,我可以在单元格A1A20调用=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或二进制的,但我很乐意交易,让圆形参考整天坐在我的状态栏。

hdr_lvl

随着分层模式的次要限制,你可以把UDF放在你想要的任何单元格中。 请注意,UDF返回的所有引用都是文本string。