我正在创建一个电子表格应用程序,要求用户填写输入表的不同部分。要将这些部分分成逻辑方式,我使用标题和子标题,如下所示:
如果我有很多标题,那么在对标题进行编号时会有大量的手动工作。我已经尝试通过创建Header1
命名范围来自动化该过程,该范围等同于下图中的灰色标题。因此,在A2
和A11
单元格中,公式为=Header1
。 Header1
命名范围中的公式为:
IF(COUNTA(INDIRECT(CONCATENATE("$A$1",":",ADDRESS(ROW()-1,COLUMN()))))=0,0,INDEX(INDIRECT(CONCATENATE("$A$1",":",ADDRESS(ROW()-1,COLUMN()))),MATCH(ROW(INDIRECT(ADDRESS(ROW()-1,COLUMN()))),INDIRECT(CONCATENATE("$A$1",":",ADDRESS(ROW()-1,COLUMN()))),TRUE)))+1
基本上,公式计算A列中的所有值并添加1。换句话说,无论您使用哪个工作表(因此使用Header1
),每次在单元格中调用INDIRECT
时,它都会很好地递增。唯一的硬编码是A1
的起始单元格,我在其中放置了0,因此它检测到从1开始。
我的问题是 - 与我使用命名范围实现递增标头的方式类似,如何为子标头执行此操作?我上面的图片显示了我想要达到的效果(即2.1
,2.2
)但是我希望通过简单地在单元格中放置=Header2
的公式来实现这一点。 / p>
编辑 - 我已经达到了这个公式:
=SUM(INDIRECT(CONCATENATE("$A$1",":",ADDRESS(ROW()-1,COLUMN()-1)))) & "." & MAX(1,COUNTA(INDEX(INDIRECT(CONCATENATE("$B$1",":",ADDRESS(ROW()-1,COLUMN()))),MATCH(SUM(INDIRECT(CONCATENATE("$A$1",":",ADDRESS(ROW()-1,COLUMN()))))-1,INDIRECT(CONCATENATE("$A$1",":",ADDRESS(ROW()-1,COLUMN()-1))),FALSE)):INDIRECT(ADDRESS(ROW()-1,COLUMN()))))
...在单元格中作为公式放置时有效,但在命名范围内使用时无效。奇!
答案 0 :(得分:2)
使用Defined Names
来保存公式的好主意。但是你的公式很不稳定。
建议在工作簿级别(范围)创建两个已定义的名称,如下所示:
使用以下公式命名为_Hdr
(根据需要更改):
=IF( COLUMN() <> 1, "", 1
+ MAX( INDEX(!$A:$A, 1 ) : INDEX(!$A:$A, - 1 + ROW() ) ) )
使用以下公式命名为_Sub
(根据需要更改):
=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() ) ) ) )
如果子项小于10,则使用0.1
;如果更高但小于100,则使用0.01
(根据需要进行调整)
编辑: 将!
添加到公式中的列范围,以确保引用会自动更新为相应的{{1}使用公式的地方。
上面的公式分为几行以方便阅读和理解,然后在创建名称时输入一行。
还建议隐藏Sheet
(即Define Names
),以避免公式意外更改。
使用以上名称:
Visible = False
和_Hdr
列_Sub
和1
。 2
个数字,并添加MAX
或1
以生成下一个数字。0.1
)。INDIRECT
函数生成所需的范围。