excel - 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}
(如果有更多区域,则返回更多),我可以将它传递给一个IF
to 循环,如下所示:
=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
每次迭代都会计数。从本质上讲,在这种情况下,我需要能够进入我的.IF
For
i
For i = 1 to 2
IF
我知道失败是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。有任何想法吗?
解决方案
假设您的区域始终从第 1 行开始,如您的示例所示:COLUMNS(A1:Z1)-(SUM(IF(ISBLANK(A1:Z1),1,0))),您能否使用此公式计算区域?该范围内的任何非空白单元格都将计为一个区域并给出正确的计数。根据您的问题,我不确定这是否是您所寻求的。
推荐阅读
- reactjs - 如何在 data-grid material-ui 中使用延迟加载
- java - jcifs.smb.SmbException:连接失败:0.0.0.0<00>/192.168.43.103 jcifs.util.transport.TransportException java.net.SocketException
- javascript - 停止点击事件触发
- r - 如何从一个图中的多列创建点图?
- android - MapBox 中 PathOverlay 的替代方案是什么?
- flutter - 如何在颤振测试中模拟 onDoubleTap
- python - 如何使用 Pandas/Python 在特定列中的每个项目行上使用函数
- selenium - 使用 JS Executor 不会发生页面滚动
- android - 为什么我的应用程序能够在较新的设备上运行,但不能在较旧的设备上运行(向后兼容 build.gradle 问题)?
- c++ - 将静态数组复制到动态数组c ++