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

Skw*_*ggs 2 google-sheets named-ranges

我正在编写电子表格,以跟踪小型企业的财务状况。他们经营着几个要出租的房间,文件的结构也很合理,因此每张纸都可以预订一年的所有房间。

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

例

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

例如,第6:36行将代表一月,而C:I列将代表会议室1。会议室2将跨越J:P,依此类推。

现在,在另一张纸上,我想制作一个仪表板,其中列出了每个房间每月的收入。这是一个非常简单的表,有12行(每月一个)和10列(每个房间一个),我打算在其中汇总所有收入。

仪表板

所以我的问题是我找不到一种方法来检索房间的命名范围的特定列(“垂直命名范围”),该列也限制在一个月的命名范围内(“水平命名范围”) 。我已经阅读过有关使用的信息,ARRAYFORMULA(INDEX(named_range, ,wished_column))但这仅适用于单个命名范围。我对这两个功能的了解不存在,因此我没有设法将其扩展到2个命名范围的版本...

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

因此,由于从仪表板单元到“房间”单元之间没有一对一的关系,所以我目前唯一的解决方案是手动引用所有内容,您将了解这是效率低下且耗时的...

我的问题,精细,是:我怎样才能检索到一定范围的2个(或以上)命名区域交集的结果吗?一旦有了该结果范围,便知道使用INDEX()非常容易。

Tom*_*rpe 5

将命名范围Base定义为

A:Z
Run Code Online (Sandbox Code Playgroud)

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

6:36
Run Code Online (Sandbox Code Playgroud)

将名为Vertical的范围定义为

C:I
Run Code Online (Sandbox Code Playgroud)

然后,垂直范围和水平范围的交点为:

index(Base,row(Horizontal),COLUMN(Vertical)):index(Base,row(Horizontal)+rows(Horizontal)-1,COLUMN(Vertical)+columns(Vertical)-1)
Run Code Online (Sandbox Code Playgroud)

可以通过在函数中使用它来验证

=countblank(index(Base,row(Horizontal),COLUMN(Vertical)):index(Base,row(Horizontal)+rows(Horizontal)-1,COLUMN(Vertical)+columns(Vertical)-1))
Run Code Online (Sandbox Code Playgroud)

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

的偏移版本为:

=countblank(offset(A1,row(Horizontal)-1,COLUMN(Vertical)-1):offset(A1,row(Horizontal)+rows(Horizontal)-2,COLUMN(Vertical)+columns(Vertical)-2))
Run Code Online (Sandbox Code Playgroud)

或更简单地说:

=countblank(offset(A1,row(Horizontal)-1,COLUMN(Vertical)-1,rows(Horizontal),COLUMNS(Vertical)))
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明


部分重叠

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

在此处输入图片说明

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

max(start1,start2) to min(end1,end2)
Run Code Online (Sandbox Code Playgroud)

所以以前的公式变成

=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)))
Run Code Online (Sandbox Code Playgroud)

偏移版本是

=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)))
Run Code Online (Sandbox Code Playgroud)

我已经在范围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")
Run Code Online (Sandbox Code Playgroud)

Google表格中最好的方法也许是返回到Offset调用的完整版本OFFSET(cell_reference,offset_rows,offset_columns,[height],[width])。尽管时间很长,但它会返回#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)))
))
Run Code Online (Sandbox Code Playgroud)

笔记

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

我也在Excel中测试了上述内容(如前所述,最好使用索引版本)。在这种情况下,Base将设置为$ 1:$ 1048576。