【问题标题】:Excel how to return an array that meets a certain condition?Excel如何返回满足一定条件的数组?
【发布时间】:2018-05-04 01:30:57
【问题描述】:

如果我在单元格范围A1:A6 中有数据:

Apple
Banana
Cherry
Grape
Orange
Watermelon

有没有办法返回一个数组(在单个单元格中,用于更大公式的中间步骤),除了那些满足特定条件的条目之外,它返回上述数组?

例如,如果我想要一个公式返回仅包含字母 n 的单元格的数组,它将返回:

Banana
Orange
Watermelon

有没有办法做到这一点?

注意我确实不想要返回一个相同大小的数组,只是有空白条目,即我不想要:

""
Banana
""
""
Orange
Watermelon

【问题讨论】:

  • 为什么投反对票?问题是如何在单个单元格中返回此结果,这是一个复杂的解决方案,并且没有发布在我可以在 SO 上找到的其他任何地方。
  • 虽然我会问它有点不同,因为 TEXTJOIN 的简单数组形式会将结果放在一个单元格中。你想要的是创建一个数组,然后可以在其他数组类型公式中使用,排除所有没有n。
  • @ScottCraner 抱歉,我应该澄清一下我使用的 Excel 2010 没有 TEXTJOIN。
  • 你需要把它,你需要在你的问题中说明它需要重现一个可以在另一个公式中使用的数组。它不会将数组输出到一个单元格中。你的公式把这个:imgur.com/a/mF8iY 放在一个单元格中。你的问题太抽象了。
  • 是的,我现在按 F9 可以做到这一点,但这又不是你问的。请记住,本网站的普通访问者不知道这个问题背后的历史,并会尝试回答他们所理解的实际问题,正如您从得到的答案中看到的那样。我们无法进入您的脑海,因此您必须尽可能具体。如果我不知道这个问题背后的历史,我会用 TEXTJOIN 回答,因为它会将 Banana,Orange,Watermelon 放在一个单元格中,但不能用于数组公式。

标签: arrays excel excel-formula


【解决方案1】:

是的。

这是数组公式(为便于阅读添加了换行符):

= INDEX(A1:A6,N(IF({1},MODE.MULT(IF(ISNUMBER(SEARCH("n",A1:A6)),
  (ROW(A1:A6)-ROW(A1)+1)*{1,1})))))

注意,这是一个数组公式,这意味着您必须在输入公式后按 Ctrl+Shift+Enter 而不是仅按 输入。


这个公式有一些特别奇怪的地方,所以如果你有兴趣,我想我会解释下面的内容。我在下面解释的一些内容可能很明显,但我只是说得透彻。

要从基于单个索引的列表中返回结果,请使用:

= INDEX(A1:A6,2)

这将返回Banana。

要从基于 多个 索引的列表中返回结果,您可以考虑使用以下内容:

= INDEX(A1:A6,{2;5;6})

理想情况下,这将返回 {Banana;Orange;Watermelon}。

但是,这不会返回一个数组。基于a recent question that I asked,给出了一个非常聪明的解决方法:

= INDEX(A1:A6,N(IF({1},{2;5;6})))

这将返回{Banana;Orange;Watermelon} 的期望结果。

我认为这是解释的第 1 部分。


第2部分的解释是以下如何返回{2;5;6}:

= MODE.MULT(IF(ISNUMBER(SEARCH("n",A1:A6)),(ROW(A1:A6)-ROW(A1)+1)*{1,1}))

MODE.MULT 是一个函数,它返回一组出现频率最高的数据。但是,有一些警告:

  1. 数据必须至少出现两次才能由MODE.MULT 返回。如果没有重复数据,则会返回错误。例如,MODE.MULT({1;2;3}) 将返回错误,因为数组 {1;2;3} 中没有重复数据。另一个例子:MODE.MULT({1;1;2} 将返回1,因为1 最常出现在数据中。

  2. 如果在出现最多的数据方面存在“平局”,MODE.MULT 将返回一个包含所有关联条目的数组。例如MODE.MULT({1;1;2;2}) 将返回{1;2} 的数组。

  3. 在确定时,MODE.MULT、MODE.MULT 最重要,可能也是最奇特但也最有用的行为完全忽略 逻辑值(TRUE 和 FALSE 值)数据的模式,即使它们比数据中的非逻辑值出现的频率更高。

我们可以利用MODE.MULT 的这些属性来获得所需的数组。

ISNUMBER(SEARCH("n",A1:A6)) 返回一个包含TRUE/FALSE 值的数组,其中数据包含n。像这样的:

FALSE
TRUE
FALSE
FALSE
TRUE
TRUE

(ROW(A1:A6)-ROW(A1)+1) 返回一个从 1 开始的数组,并以 1 递增到原始数组的大小:

1
2
3
4
5
6

(ROW(A1:A6)-ROW(A1)+1)*{1,1} 实际上只是复制此列:

1  1
2  2
3  3
4  4
5  5
6  6

如果TRUE,则IF 语句用于返回上面数组中的数字,否则FALSE。 (由于IF 语句不包含“else”子句,FALSE 是给定的默认值。)

在本例中,IF 语句将返回:

FALSE  FALSE
2      2
FALSE  FALSE
FALSE  FALSE
5      5
6      6

采用上述公式的MODE.MULT 将返回{2;5;6},因为如上所述,MODE.MULT 在考虑模式时会方便地忽略上面数组中的FALSE 值。

有必要考虑MODE.MULT内部的上述数组,而不是简单地考虑:

FALSE
2
FALSE
FALSE
5
6

因为如前所述,MODE.MULT 要求至少数据中的两个条目需要匹配才能返回值。

【讨论】:

  • @Tom - 看起来这是一个预先准备好的问题,还是 OP 试图为社区回答的问题? (大约在同一分钟被问和回答,所以我认为这是一个人为的问题/答案?)
  • @Tom,是的,它在问和回答自己的问题。这是基于最近的发现,我认为解决方案相当模糊,所以我想将它发布给社区。​​span>
  • @Tom 这种方法没有任何问题。这是我们可以指导其他人的事情,因为他们有同样的问题。在过去的几天里,这个确切的问题已被问过两次。这是我们可以使用其他公式的一个很好的基础。
  • 你不需要重复 {1,1} 数组 - 这个较短的版本适合我 - =INDEX(A1:A6,N(IF(1,MODE.MULT(IF(ISNUMBER(SEARCH("n",A1:A6)),(ROW(A1:A6)-ROW(A1)+1)*{1,1})))))
  • 没问题 - 我知道 XOR LX 开发和/或扩展了其中一些技术 - 他的网站上有很多好东西 excelxor.com
【解决方案2】:
=INDEX($A$2:$A$7,MATCH(1,(COUNTIF($C$1:C1,$A$2:$A$7)=0)*(FIND("n",$A$2:$A$7)>0),0))

这是一个数组公式,因此需要使用 Ctrl+Shift+Enter

输入

输入和输出

  • INDEX 返回一个范围内的元素
  • MATCH 允许我们找到要返回的行的位置
  • COUNTIF 是为了确保我们只在结果中选择唯一值
  • FIND 仅返回字符串中存在 n 的行

【讨论】:

  • 谢谢。澄清一下,问题是如何在单个单元格中返回这个数组(作为另一个更大公式的中间步骤)。
【解决方案3】:

试试下面的用户定义函数:

Public Function ContainsN(rng As Range) As String
    Dim r As Range
    ContainsN = ""
    For Each r In rng
        If InStr(1, UCase(r.Value), "N") > 0 Then ContainsN = ContainsN & Chr(10) & r.Value
    Next r
    ContainsN = Mid(ContainsN, 2)
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多