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

时间:2013-08-23 06:03:25

标签: excel excel-formula

好吧,这是一个一直困扰我的问题,我真的虽然已经破解了它,但是......

考虑以下工作表:

Spreadsheet

数据单元格只包含数字1,而Sum单元格包含显示的公式。一切正常。

它使用以下名称(附带说明):

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

第一个ADDRESS函数给出当前列的第一个单元格的地址,第二个ADDRESS函数给出当前单元格上方的单元格。这些是带有a的CONCATENATEd,并传递给INDIRECT函数以将其转换为范围引用。请注意,如果在顶行使用,则会出现错误。

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

IF函数创建一个与RangeAboveAll对应的列表,如果是单元格ISBLANK则为列号,如果不是则为0。然后使用COUNTIF参数将其传递给SMALL函数,该参数计算空白单元格的数量;因此,SMALL返回最后一个空白单元格的列号。然后将其包装在IFERROR中以处理没有空白单元格的情况。

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

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

正如我所说的,所有这一切都很好,但是顶部块中的一个数据单元指的是底部块的结果。例如,如果单元格B1具有公式=B10

现在如果在没有动态范围的情况下进行此操作,这将不是循环引用,但由于动态范围必须计算上述所有单元格以简单地排除它们,因此弹出圆形引用。

这是一个特别的问题,因为我们有一个电子表格,其中首先概述了下面发生的事情。现在可以通过启用迭代来修复它,但这使我们对其他问题持开放态度。它也可以用代码实现,但我不想只为此启用宏。

任何人都可以看到构建这类命名范围的方法来避免这个问题吗?

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

2 个答案:

答案 0 :(得分:0)

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

如果您的数据从左侧开始(我已插入ColumnA以提供'分组规则'对于小计)并且您应用小计,结果可以如右图所示:

SO18395841 example

相关部分是C2(即B2向右移动一列)确实包含一个指代其下方的细胞的公式(具体地说,什么是B10,即是B8和B9的总和)。

在未启用迭代的情况下使用小计尚未生成循环引用。 (公式自动调整为=SUM(C8:C9)

请注意,我想可以实现同样的目标'你的方式' - 而不是=B10使用=B8+B9

答案 1 :(得分:0)

为什么不使用OFFSET

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