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

Excel 命名范围以获取当前单元格上方的单元格块-重写以避免循环引用,excel,excel-formula,Excel,Excel Formula,好吧,这是一个困扰我一段时间的问题,我真的认为我已经解决了,但是 考虑以下工作表: 数据单元格只包含数字1,求和单元格包含所示的公式。这一切都有效 它使用以下名称(附说明): 第一个地址函数给出当前列的第一个单元格的地址,第二个地址函数给出当前单元格上方的单元格的地址。它们用:连接,并传递给间接函数,将其转换为范围引用。请注意,如果在顶行中使用,这将给出一个错误,这是应该的 BlankRowAbove =IFERROR(SMALL(IF(ISBLANK(RangeAboveAll),ROW(R

好吧,这是一个困扰我一段时间的问题,我真的认为我已经解决了,但是

考虑以下工作表:

数据单元格只包含数字1,求和单元格包含所示的公式。这一切都有效

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

第一个地址函数给出当前列的第一个单元格的地址,第二个地址函数给出当前单元格上方的单元格的地址。它们用:连接,并传递给间接函数,将其转换为范围引用。请注意,如果在顶行中使用,这将给出一个错误,这是应该的

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

RangeAboveBlock
=INDIRECT(CONCATENATE(ADDRESS(1+BlankRowAbove,COLUMN()),":",
ADDRESS(ROW()-1,COLUMN())))
使用与RangeOverall名称相同的技术,这将获取最后一个空白单元格的列(如果没有,则为0),并返回从该单元格下方1开始到当前单元格上方1结束的范围。如果当前单元格正上方的单元格为空,则会创建一个循环引用,但这很好

正如我所说的,在顶部块中的一个数据单元引用底部块的结果之前,所有这些都可以正常工作。例如,如果单元格
B1
具有公式
=B10

如果在没有动态范围的情况下执行此操作,这将不是循环引用,但因为动态范围必须计算上面的所有单元格以排除它们,因此循环引用会弹出

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

有人能找到一种方法来构建这种命名范围,从而避免这个问题吗


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

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

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

相关部分是C2(即B2向右移动了一列)确实包含一个公式,表示其下方的单元格(具体而言,是B10,即B8和B9之和)

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


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

为什么不使用
偏移量呢

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

谢谢@pnuts-这个总和只是作为一个例子,它同样可以使用小计,同样的问题也会出现。我将编辑这个问题,以显示我的确切意思。我的Excel(2010年英语)使用
作为公式参数分隔符。我假设“RangeUpperBlock”相对于
C6
,将是
C1:C5
。当然,如果我们只是对
1
s求和,
=C6
就合适了。我们缺少@Dale_M.的一些澄清。。。
[C6]  =SUM(OFFSET(C5;1-B6;0;B6;1))