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

时间:2018-10-05 09:12:19

标签: google-sheets named-ranges

我正在编写电子表格,以跟踪小型企业的财务状况。他们经营着几个要出租的房间,文件的结构也要这样制作,以便每张纸都可以保留一年的所有房间的预订额。

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

Example

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

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

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

Dashboard

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

(我是说我确实尝试过类似ARRAYFORMULA(INDEX(January, , INDEX(Room1, , 3)))的方法,但这没用)

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

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

2 个答案:

答案 0 :(得分:3)

将命名范围“ Base”定义为

A:Z

将名为“水平”的范围定义为

6:36

将名为“垂直”的范围定义为

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))

在工作表中给出结果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具有两个完全重叠的范围的情况下效果很好:

enter image description here


部分重叠

假设您有两个这样部分重叠的范围:

enter image description here

您可以在标准重叠公式上使用变体形式(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表格中最好的方法是返回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)))
))

注释

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

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

答案 1 :(得分:2)

  

”“我已经为每年的每个月以及每个月创建了命名范围   房间。例如,第6:36行代表一月,   而C:I栏代表1号会议室。2号会议室跨越J:P,依此类推   来。”

我的建议是,如果将C列定义为“ January”(任意)(最后一个房间的最后一列),那么这就是您所需要的。

您尚未显示仪表盘的布局。但是,让我们假设至少您对每个房间产生的收入感兴趣。

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

在此图像中,称为“一月”的范围被突出显示。请注意,它不包含标题。还要注意,它可以有很多列宽。在此示例中,我仅构成了几列,但您的范围应涵盖1到n房间的所有列。

screenshot

语法:QUERY(数据,查询,[标题])

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

查询人数统计:“选择总和(Col3)标签总和(Col3)”“

查询收入总额:“选择计数(Col2)标签计数(Col2)”“

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

Col3和Col5 =分别为1号房间和2号房间的收入。
[标题] :您可以忽略它们。

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

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