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

时间:2015-12-06 16:48:03

标签: excel excel-formula

这是对上一个问题的跟进 - Excel named ranges to make incrementing headers and sub headers

上下文:我有一个Excel数据工作表,其中包含headerssub headerssub-sub headers来划分工作表的各个部分。为了使标题自动编号(如下图所示),我使用名为Header1Header2Header3的公式命名范围作为标题,子标题和子标题-sub标题分别。

Image of headered Excel worksheet

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

请注意,为了便于阅读,我已将公式分为多行。

用法:很简单,我可以在单元格=Header1A1中调用A20,标题会自动递增。与=Header2中的B4相同。

我的问题:使用Header2的公式,它会递增到1.9但是之后的下一个增量点是2.0,我希望它如上图所示1.10。怎么能实现这一目标?此外,如何实现sub-sub headers(在上图中标记为Further Sub Header)?理想情况下,我希望子子标题也遵循1.1.10的惯例。

2 个答案:

答案 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

当然,工作簿必须是启用宏的或二进制的,但我很乐意将其与循环引用整天放在我的状态栏中进行交换。

hdr_lvl

在分层模式之后有一些小的限制,你可以将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

它将返回如下标题

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