1

好的,这是一个一直困扰我一段时间的问题,我真的认为我已经破解了它,但是......

考虑以下工作表:

电子表格

Data 单元格只包含数字 1,Sum 单元格包含显示的公式。这一切都有效。

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

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

第一个 ADDRESS 函数给出当前列的第一个单元格的地址,第二个 ADDRESS 函数给出当前单元格上方的单元格。这些与 : 连接并传递给 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 结束的范围。如果当前单元格正上方的单元格是空白的,那么这会创建一个循环引用,但这很好。

正如我所说,所有这些都可以正常工作,直到顶部块中的一个数据单元引用底部块的结果。例如,如果 CellB1有公式=B10.

现在,如果这是在没有动态范围的情况下完成的,这将不是循环引用,而是因为动态范围必须计算上面的所有单元格以排除它们,所以会弹出循环引用。

这是一个特殊的问题,因为我们有一个电子表格,它以下面发生的事情的摘要开头。现在可以通过打开迭代来修复它,但这会让我们面临其他问题。它也可以在代码中实现,但我不想为此启用宏。

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

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

4

2 回答 2

0

为什么不使用OFFSET

[C6]  =SUM(OFFSET(C5;1-B6;0;B6;1))
于 2013-08-23T08:37:05.660 回答
0

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

如果您的数据从左侧开始(我已插入 ColumnA 为小计提供“分组规则”)并且您应用小计,则结果可能如右侧:

SO18395841 示例

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

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

请注意,我想“你的方式”也可以实现同样的效果——而不是=B10 使用=B8+B9.

于 2013-08-23T07:47:25.697 回答