首先使用上面的地址单元

我在Excel中创build预算,因此我有一些类别和子类别。 与其各自的父类别相比,子类别是由1个单元格指定的。 子类别当然可以有自己的子类别。

在我的“类别树”旁边的列中,我想打印“类别path”。

假设我有以下类别的树: 类别树

我现在想把“类别path”打印在它旁边,就像这样: 在这里输入图像描述

我想我可以用父类别的类别path(如果有)和当前行的类别名称组成类别path。 由于子类别可以有自己的子类别,因此我不知道当前行中的类别名称存储在哪个列中。 要获取当前行的类别名称,我使用以下公式(在此网站(德语)上find ):

{=INDEX(A7:F7;MATCH(TRUE;A7:F7<>"";0))} 

我知道没有五级以上的级别,所以我可以省去“硬代码”,例如第7行的范围A7:F7,并且通过上述公式得到“副业”。

现在出现棘手的部分(至less对我来说)和我问这个问题的原因:我需要获得父类别的行,以便我可以使用父级的类别path来组成子类别的类别path。 在这种情况下,它会

 {=H4&" > "&INDEX(A7:F7;MATCH(TRUE;A7:F7<>"";0))} 

我不知道如何dynamic计算父类别path的地址。 从另一个德国网站,我得到了一个正确的方向,并将返回父行类“工资和薪金”行的公式:

 {=MAX((A1:A7<>"")*ROW(A1:A7))} 

但只有当公式中的matrix是恒定的。 它不适用于dynamic计算的matrix。 在“Side job”的情况下,dynamicmatrix的范围是从A1A7 ,因为A是类别名称左边的列, 1是第一行(以及我想要search的行), 7是当前行。 这个matrix的dynamic部分是A7

为了组成matrix( DYNAMIC_MATRIX ),我使用这个公式:

 {=INDIRECT(ADDRESS(1;CATEGORY_COLUMN-1)&":"&ADDRESS(ROW();CATEGORY_COLUMN-1))} 

其中CATEGORY_COLUMN是我的第一个包装在COLUMN()公式:

 {=COLUMN(INDEX(A7:F7;MATCH(TRUE;A7:F7<>"";0)))} 

不幸的是, MAX(...公式在与DYNAMIC_MATRIX一起使用时会返回一个错误:

 {=MAX((DYNAMIC_MATRIX<>"")*ROW(DYNAMIC_MATRIX))} 

为了绕过错误,我用NOT(ISBLANK(DYNAMIC_MATRIX))replace了DYNAMIC_MATRIX<>""

 {=MAX(NOT(ISBLANK(DYNAMIC_MATRIX))*ROW(DYNAMIC_MATRIX))} 

现在,公式看起来像没有占位符:

 {=MAX(NOT(ISBLANK(INDIRECT(ADDRESS(1;COLUMN(INDEX(A7:F7;MATCH(TRUE;A7:F7<>"";0)))-1)&":"&ADDRESS(ROW();COLUMN(INDEX(A7:F7;MATCH(TRUE;A7:F7<>"";0)))-1))))*ROW(INDIRECT(ADDRESS(1;COLUMN(INDEX(A7:F7;MATCH(TRUE;A7:F7<>"";0)))-1)&":"&ADDRESS(ROW();COLUMN(INDEX(A7:F7;MATCH(TRUE;A7:F7<>"";0)))-1))))} 

我的公式是返回当前行而不是父类别的行(即,例如,“副作业”它返回7而不是4 )。

我不知道为什么:(

总之,整个公式应该做到以下几点:
如果它是当前行的子类别,则打印parent category's path > subcategory name 。 如果父类别存储在A列中(因此除了“收入”组标题除外),父类别的path应该是Income > category name )。

如果有人想回答我的问题,只关注“获取父类别的path”部分,这对我来说是绝对足够的:)

谢谢,
马塞尔

这是一个答案,将出去在问题中要求的5个级别。

基于一个公式在这里 。

 =LOOKUP(2,1/($A$2:A2<>""),$A$2:A2) & IF(COUNTA($B2:$D2)>0,">" & LOOKUP(2,1/($B$2:B2<>""),$B$2:B2) & IF(COUNTA($C2:$D2)>0,">" & LOOKUP(2,1/($C$2:C2<>""),$C$2:C2) & IF(COUNTA($D2:$D2)>0,">" & LOOKUP(2,1/($D$2:D2<>""),$D$2:D2) & IF(COUNTA($E2:$E2)>0,">" & LOOKUP(2,1/($F$2:F2<>""),$F$2:F2),""),""),""),"") 

注意,只要你在什么时候缩进以及什么时候没有数据pipe理的麻烦(这个数据存储格式已经不是很好),就把收入放在它自己的专栏里。

在这里输入图像说明

一个更好的结构在我看来是所有的类别填充(更像一个数据库),然后如果你想你可以使用数据透视表等,以更容易地分析数据。