命名范围以获取当前单元格上方的单元格块 – 重写以避免循环引用

好的,这是一个唠叨我一阵子的问题,虽然我已经破解了,但是…

考虑下面的工作表:

电子表格

Data单元只包含数字1,Sum单元包含所示的公式。 这一切工作。

它使用了以下名称(解释):

RangeAboveAll =INDIRECT(CONCATENATE(ADDRESS(1,COLUMN()),":",ADDRESS(ROW()-1,COLUMN()))) 

第一个ADDRESS函数给出当前列的第一个单元格的地址,第二个ADDRESS函数给出当前单元格的上面的单元格。 它们与a:CONCATENATE相交,并传递给INDIRECT函数将其转换为范围引用。 请注意,如果在顶行中使用,则会发生错误,因为它应该如此。

 BlankRowAbove =IFERROR(SMALL(IF(ISBLANK(RangeAboveAll),ROW(RangeAboveAll),""), COUNTIF(RangeAboveAll,"")),0) 

IF函数创build一个与RangeAboveAll相对应的列表,如果该单元格是ISBLANK,则列号为0,否则为0。 然后用COUNTIFparameter passing给SMALL函数,计数空白单元的数量; 因此,SMALL返回最后一个空白单元格的列号。 然后将其封装在一个IFERROR中,以处理没有空白单元格的情况。

 RangeAboveBlock =INDIRECT(CONCATENATE(ADDRESS(1+BlankRowAbove,COLUMN()),":", ADDRESS(ROW()-1,COLUMN()))) 

使用与RangeAboveAll名称相同的技术,这将获取最后一个空白单元格的列(如果没有一个,则为0),并返回从当前单元格之下的1开始1到结束1的范围。 如果当前单元格上方的单元格是空白的,则会创build一个循环引用,但这没问题。

正如我所说,所有这些工作正常,直到顶部块中的一个数据单元指向底部块的结果。 例如,如果单元格B1具有公式=B10

现在,如果没有dynamic范围的话,这不是一个循环引用,但是因为dynamic范围必须计算上面所有的单元格来排除它们,所以会popup循环引用。

这是一个特殊的问题,因为我们有一个电子表格,以下面的内容摘要开始。 现在可以通过开启迭代来解决,但是这给我们打开了其他问题。 它也可以在代码中实现,但我不想只为此启用macros。

任何人都可以看到一种方法来build立这种避免这个问题的命名范围?

对于背景信息,这是一个特定的问题(用户错误),这是试图克服。 如果在B13中有一个静态公式say =SUBTOTAL(B7:B12,9) ,并且您在B7或B12之下插入一行,则此新行将超出总和范围。 由于我们使用这个电子表格作为模板,为许多不同的项目准备build设工作的索赔,每个子项中每个项目都有不同数量的行,使一个行项目价值数万美元是一个问题。

可能不适合,但我需要更多的空间,而不是在评论!

如果您的数据从左侧开始(我已经插入了ColumnA来为小计提供“分组规则”),您可以应用小计,结果可以如右图所示:

SO18395841的例子

C2的相关部分(即B2向右移一列)确实包含了一个涉及它下面单元格的公式(具体来说,B10是什么,即B8和B9的总和)。

使用小计,没有迭代打开没有生成循环引用。 (公式自动调整为=SUM(C8:C9)

请注意,我想你们的方式可以达到同样的效果 – 而不是=B10使用=B8+B9

为什么不使用OFFSET

 [C6] =SUM(OFFSET(C5;1-B6;0;B6;1))