【问题标题】:Reference Specific Row in Named Range within another Named Range在另一个命名范围内引用命名范围中的特定行
【发布时间】:2018-10-05 09:12:18
【问题描述】:

我正在编写一个电子表格来跟踪一家小型企业的财务状况。他们经营着几间出租房间,文件的结构是这样设计的,每张纸上都有一年的所有房间的预订量。

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

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

例如,行 6:36 将代表一月份,而列 C:I 将代表房间 1。房间 2 将跨越 J:P 等等。

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

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

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

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

我的问题,很好,是:我怎样才能检索到 2 个(或更多)命名范围的交集结果的范围?一旦我得到了结果范围,我知道使用 INDEX() 会很容易。

【问题讨论】:

    标签: google-sheets named-ranges


    【解决方案1】:

    将命名范围 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))
    

    在我的工作表中给出结果 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 范围内对此进行了测试,结果符合预期。

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

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

    备注

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

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

    虽然在 Excel 中您有 Intersect Operator(单个空格),所以根本不需要使用索引或偏移公式,例如上面的第一个例子就是:

    =COUNTBLANK(Vertical Horizontal)
    

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

    【讨论】:

    • 非常感谢您的回答,这看起来与我一直在努力实现的目标完全一样!我还没有尝试过 :) 但是我很好奇你为什么使用 Base 命名范围。是否只是指定要考虑的已用单元格的整个区域?
    • 是的,完全正确。索引只能用于精确定位现有范围内的单元格、行或列。不过,我本可以使用 Offset ..我想我的部分想法是戴上我的 Excel 帽子,在可能的情况下避免使用 offset。
    • 已在我的答案中添加了第一个公式的偏移版本。
    • 这个解决方案非常适合我,非常感谢您的辛勤工作!已将您的答案选为已接受并交付赏金 :)
    • @TomSharpe 恭喜。逻辑和技巧的非凡努力。提到“所以前面的公式变为”之后的等式中有一个错字似乎很无礼。公式应为:=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)))
    【解决方案2】:

    “我为一年中的每个月创建了命名范围,并且为每个 房间。例如,行 6:36 表示一月份, 而列 C:I 将代表房间 1。房间 2 将跨越 J:P 等等 第四次。”

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

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

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

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

    语法:QUERY(data, query, [headers])

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

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

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

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

    Col3 & Col5 = Room#1 和 Room#2 的收入。
    [标题]:您可以忽略它们。

    这个公式只提供查询的值;即使它包含“标签”,标签也不会打印。

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

    【讨论】:

    • 感谢您的回答。我确实注意到了,但是您没有为每个房间(列)分配命名范围。您当前的解决方案有效,但不适用于自动填充,如果我单击并将公式拖动到相邻单元格(因为引用只会增加 1,而一个房间当前跨越 7 列)。我更新了我的问题,提供了更多关于我拥有什么以及我正在尝试做什么的说明。
    • 点了。关于如何构建公式有几个选项。最坏的情况,我想编辑 10 个公式不会超过 5 分钟。
    • 但是,没有任何更简单的方法可以让一个范围与两个命名范围相交吗?然后使用 INDEX() 会超级简单
    • 这是您在此电子表格的生命周期中要做的一次。大概您进行了广泛研究,以寻找垂直和水平命名范围相交的示例,但找不到任何现有的解决方案。所以这个问题是最后的手段吗?但是在我们讨论这个问题的时间里,您可能已经复制和编辑了公式,您的电子表格就会启动并运行。有句话叫“完美是善的敌人”。如果您愿意,请坚持“完美”的解决方案,但与此同时,反思您的研究告诉您的内容。
    • 不,你假设我会这样做一次是错误的;我将为客户的所有站点执行此操作,并且稍后还将向仪表板添加其他统计跟踪。除了我的问题清楚地提到named range within named range,所以虽然我很感激你到目前为止的帮助,但你目前的答案不是我想要做的(或者没有明确证明我想要达到的目标是不可能的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多