将命名范围 Base 定义为
A:Z
定义一个名为 Horizontal 的范围
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!错误。