首页 > 解决方案 > If 数组中的索引

问题描述

我试图弄清楚如何仅引用命名公式的一个区域并将其作为数组返回。这样我就可以计算引用区域中的行数并最终将它们相加。我最终将把这个结果整合到一个非常复杂的其他公式中,这些公式会自动连接和排列多个矩阵。我正在尝试使用公式而不是 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}(如果有更多区域,则返回更多),我可以将它传递给一个IFto 循环,如下所示:

=IF(Letters_Areas,INDEX(Letters,,,Letters_Areas)

但这不起作用。它总是只返回第一个区域,Letters因为Letters_Areas在第二个参数中IF总是返回1值,而不是数组的第一个和第二个值。我想我在公式中的问题是:

=IF(Letters_Areas,INDEX(Letters,,,What_Do_I_Put_Here))

在VBA 中,循环的What_Do_I_Put_Here每次迭代都会计数。从本质上讲,在这种情况下,我需要能够进入我的.IFForiFor i = 1 to 2IF

我知道失败是Letters_Areas在第二个参数中,IF因为我可以测试它。乍一看,你会这样做:

=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。有任何想法吗?

标签: excelexcel-formula

解决方案


假设您的区域始终从第 1 行开始,如您的示例所示:COLUMNS(A1:Z1)-(SUM(IF(ISBLANK(A1:Z1),1,0))),您能否使用此公式计算区域?该范围内的任何非空白单元格都将计为一个区域并给出正确的计数。根据您的问题,我不确定这是否是您所寻求的。


推荐阅读