在另一个命名范围内引用命名范围内的特定行

Reference Specific Row in Named Range within another Named Range

我正在编写价差sheet 来跟踪小型企业的财务状况。他们经营着几个房间出租,文档的结构使得每个 sheet 拥有所有房间一年的预订价值。

本质上,每一行都定义了一个特定的日期,而每个房间都跨越几列(原因是他们不仅要跟踪房间是否被预订,还要记录客户和其他人的姓名备注),其中每日计算的收入(某些因素会改变每个房间将产生的每日房价)。

所以这一切都很好,而且我已经为一年中的每个月和每个房间创建了命名范围。

例如,行 6:36 表示一月,而列 C:I 表示房间 1。房间 2 将跨越 J:P,依此类推。

现在,在另一个 sheet 中,我想制作一个仪表板,列出每个房间每月的收入。这是一个非常简单的 table,有 12 行(每个月一行)和 10 列(每个房间 1 列),我计划在其中汇总所有收入。

所以我的问题是我无法找到一种方法来检索房间的命名范围的特定列 ('vertical named range'),这也被限制在一个月的命名范围内 ('horizontal named range').我读过有关使用 ARRAYFORMULA(INDEX(named_range, ,wished_column)) 的信息,但这仅适用于单个命名范围。我对这两个函数的了解是不存在的,我没有设法将它扩展到 2-named-range 版本...

(我的意思是我确实尝试了一些类似 ARRAYFORMULA(INDEX(January, , INDEX(Room1, , 3))) 的方法,但没有成功)

因此,由于 Dashboard 单元格与 Rooms 单元格之间没有一对一的关系,我目前唯一的解决方案是手动引用所有内容,你会明白这是低效且耗时的.. .

我的问题,很好,是:如何检索由 2 个(或更多)命名范围的交集产生的范围? 一旦得到结果范围,我知道使用 INDEX() 将非常容易。

"I've created named ranges for each month of the year, and for each room. For example, rows 6:36 will represent the month of January, while columns C:I will represent Room 1. Room 2 will span J:P and so forth."

我的建议是,如果为 C 列定义了 "January" 到任何内容(最后一个房间的最后一列),那么这就是您所需要的。

您没有向我们展示仪表板的布局。但假设您至少对每个房间产生的收入感兴趣。

=query({January},"select sum(Col3)   label sum(Col3)'' ")

在此图像中,名为 "January" 的范围突出显示 。请注意,它不包括 header。另请注意,它可以有很多列宽;在这个例子中,我只是组成了几列,但你的范围应该涵盖房间 1 到 n 的所有列。

语法:查询(数据,查询,[headers])

数据:该公式查询名为"January"的范围。该范围可以在同一 sheet 上,也可以在另一个 sheet 上(例如您的仪表板)。提醒:在此屏幕截图中,“我的 "January" 版本已突出显示。

查询人数:"select sum(Col3) label sum(Col3)'' "

查询总收入:"select count(Col2) label count(Col2)'' "

Col2 & Col4 = 房间#1 和房间#2 的人数。

Col3 & Col5 = 房间#1 和房间#2 的收入。
[headers]: 你可以忽略它们。

此公式仅提供查询的值;即使它包含 "label",标签也不会打印。

修改并调整这些公式以创建您的仪表板所需的其他信息。

定义命名范围 Base 为

A:Z

定义一个名为 Horizo​​ntal 的范围为

6:36

定义一个名为 Vertical 的范围为

C:I

那么垂直和水平范围的交集为:

index(Base,row(Horizontal),COLUMN(Vertical)):index(Base,row(Horizontal)+rows(Horizontal)-1,COLUMN(Vertical)+columns(Vertical)-1)

这可以通过在函数中使用它来验证,例如

=countblank(index(Base,row(Horizontal),COLUMN(Vertical)):index(Base,row(Horizontal)+rows(Horizontal)-1,COLUMN(Vertical)+columns(Vertical)-1))

在我的 sheet 中给出结果 7 * 31 = 217 因为我没有填写任何单元格。

此偏移版本为:

=countblank(offset(A1,row(Horizontal)-1,COLUMN(Vertical)-1):offset(A1,row(Horizontal)+rows(Horizontal)-2,COLUMN(Vertical)+columns(Vertical)-2))

或更简单地说:

=countblank(offset(A1,row(Horizontal)-1,COLUMN(Vertical)-1,rows(Horizontal),COLUMNS(Vertical)))

所以这在 OP 的情况下效果很好,你有两个完全重叠的范围,如下所示:


部分重叠

假设您有两个部分重叠的范围,如下所示:

您可以使用标准 重叠公式 的变体(This 是与日期范围一起使用的早期参考之一)

max(start1,start2) to min(end1,end2)

所以之前的公式就变成了

=countblank(index(Base,max(row(index(Partial1,1,1)),row(index(Partial2,1,1))),max(COLUMN(index(Partial1,1,1)),column(index(Partial2,1,1)))):
index(Base,min(row(index(Partial1,1,1))+rows(Partial1)-1,row(index(Partial2,1,1))+rows(Partial2)-1),min(COLUMN(index(Partial1,1,1))+columns(Partial1)-1,column(index(Partial2,1,1))+columns(Partial2)-1)))

偏移版本为

=countblank(offset(A1,max(row(offset(Partial1,0,0)),row(offset(Partial2,0,0)))-1,max(COLUMN(offset(Partial1,0,0)),column(offset(Partial2,0,0)))-1):
offset(A1,min(row(offset(Partial1,0,0))+rows(Partial1)-2,row(offset(Partial2,0,0))+rows(Partial2)-2),min(COLUMN(offset(Partial1,0,0))+columns(Partial1)-2,column(offset(Partial2,0,0))+columns(Partial2)-2)))

我已经在范围 C2:F10 和 D3:G11 上进行了测试,得到了预期的结果 24。

但是,如果没有重叠,这仍然可以得出非零结果,因此需要在公式中添加合适的测试:

=if(and(max(row(index(Partial1,1,1)),row(index(Partial2,1,1)))<=min(row(index(Partial1,1,1))+rows(Partial1)-1,row(index(Partial2,1,1))+rows(Partial2)-1),
max(column(index(Partial1,1,1)),column(index(Partial2,1,1)))<=min(column(index(Partial1,1,1))+columns(Partial1)-1,column(index(Partial2,1,1))+columns(Partial2)-1)),"Overlap","No overlap")

也许 Google Sheets 中最好的方法是回到完整版本的 Offset 调用 OFFSET(cell_reference, offset_rows, offset_columns, [height ], [宽度]) 。虽然这很长,但它会 return 一个#Value!如果没有重叠则出错:

=Countblank(offset(A1,
max(row(offset(Partial1,0,0)),row(offset(Partial2,0,0)))-1,
max(COLUMN(offset(Partial1,0,0)),column(offset(Partial2,0,0)))-1,
min(row(offset(Partial1,0,0))+rows(Partial1),row(offset(Partial2,0,0))+rows(Partial2))-max(row(offset(Partial1,0,0)),row(offset(Partial2,0,0))),
min(COLUMN(offset(Partial1,0,0))+columns(Partial1),column(offset(Partial2,0,0))+columns(Partial2))-max(COLUMN(offset(Partial1,0,0)),column(offset(Partial2,0,0)))
))

备注

为什么我必须在第二个公式中引入更多的索引(索引?)才能使其生效?因为如果您在数组上下文中使用带有范围的行函数,您会得到一个行号数组,这不是我想要的。碰巧的是,在第一个公式中,您 而不是 在数组上下文中使用它,因此您只需获得给定范围的第一行和第一列就可以了。在第二个公式中,Max 和 Min 尝试评估数组中的所有行,这给出了错误的答案,所以我使用 Index(range,1,1) 强制它只查看每个行的左上角范围。另一件事是索引和偏移量 return 都是引用,因此使用构造 Index(...):Index(...) 或 Offset(...):Offset(.. .) 来定义一个新的范围。

我还在 Excel 中测试了上述内容(如前所述,索引版本更可取)。在这种情况下,Base 将设置为 $1:$1048576.

尽管在 Excel 中您有 Intersect Operator(单个 space),因此完全没有必要使用索引或偏移公式,例如上面的第一个例子就是:

=COUNTBLANK(Vertical Horizontal)

如果没有重叠,则公式 return 为 #NULL!错误。