我正在尝试弄清楚如何仅引用命名公式的一个区域并将其作为数组返回。这样我就可以计算引用区域中的行数并最终将它们相加。我最终会将结果整合到一个相当复杂的其他公式中,这些公式会自动连接多个矩阵并对其进行排名。我正在尝试使用公式而不是 VBA 作为可移植性要求来执行此操作。有些人对运行其他人的代码有点厌倦......
不过,现在,我想出了一个简单的例子。假设在名称管理器中,我们有一个名为Letters
的公式,定义为:
=A1:A4,C1:C6
范围A1:A4
包含字母"A"到。D"和范围C1:C6
包含字母"E"到"J"。
如果我编写一个简单的INDEX
公式,我可以返回Letters
的第一个或第二个区域,如下所示:
=INDEX(Letters,,,1)
=INDEX(Letters,,,2)
我知道这是通过在公式中执行 F9 来工作的,它返回相应区域的预期字母数组({"A";"B";"C";"D"}
或{"E";"F";"G";"H";"I";"J"}
(。但是这样做会假设Letters
总会有两个领域。我想保持我的公式动态,以防我要添加另一个区域。我可以创建另一个名为Letters_Areas
的公式,并使其等于以下内容:
=ROW(INDEX(Sheet1!$A:$A,1):INDEX(Sheet1!$A:$A,AREAS(Letters)))
这将返回一个值为{1;2}
的数组(如果有更多区域,则返回更多(,我可以将其传递给IF
进行循环,如下所示:
=IF(Letters_Areas,INDEX(Letters,,,Letters_Areas)
但这行不通。它始终只返回Letters
中的第一个区域,因为IF
的第二个参数中的Letters_Areas
始终返回1
作为值,而不是数组的第一个值和第二个值。我想我在公式中的问题是:
=IF(Letters_Areas,INDEX(Letters,,,What_Do_I_Put_Here))
What_Do_I_Put_Here
像 VBA 中的For
循环一样计算IF
的每次迭代。从本质上讲,在这种情况下,我需要能够在IF
内For i = 1 to 2
中i
。
我知道失败是IF
第二个参数中的Letters_Areas
,因为我可以测试它。乍一看,你会这样做:
=IF(Letters_Areas,Letters_Areas)
这将返回预期的{1,2}
。但是,这是误导性的,因为您可以通过执行以下操作来找到真正的行为:
=IF(Letters_Areas,INDEX(Letters_Areas,Letters_Areas))
这总是返回 {1,1},它告诉我这是失败的部分。
公式的最终版本,减去我无法弄清楚的部分,应该看起来像这样:
=IF(Letters_Areas,ROWS(INDEX(Letters,,,What_Do_I_Put_Here)))
在我们的测试示例中,这将返回{4;6}
.再次,坚持不使用VBA。有什么想法吗?
您能否使用此公式来计算面积,假设您的区域始终从第 1 行开始,如您的示例所示:列(A1:Z1(-(SUM(IF(ISBLANK(A1:Z1(,1,0(((?该范围内的任何非空白单元格都将计为一个区域,并将给出正确的计数。我不确定这是否是你根据你的问题所寻求的。