Excel如何返回满足特定条件的数组?

时间:2017-11-20 18:19:47

标签: arrays excel excel-formula

如果我的单元格范围A1:A6中的数据是:

Apple
Banana
Cherry
Grape
Orange
Watermelon

有没有办法返回一个数组(在一个单元格中,对于一个更大的公式的中间步骤),它返回上面的数组,只有满足某个条件的条目除外?

例如,如果我希望公式返回仅包含字母n的单元格的数组,则会返回:

Banana
Orange
Watermelon

有没有办法实现这个目标?

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

""
Banana
""
""
Orange
Watermelon

3 个答案:

答案 0 :(得分:2)

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

= 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. 的数组
  4. 最重要的是,MODE.MULT可能是最奇特但最有用的行为,MODE.MULT 完全忽略逻辑值(TRUE和{ {1}}值)在确定数据模式时,即使它们的出现频率也高于数据中的非逻辑值。

  5. 我们可以利用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 语句用于返回上面数组中的数字IF,否则返回TRUE。 (由于FALSE语句不包含“else”子句,IF是给定的默认值。)

    在此示例中,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 要求数据中的至少两个条目需要匹配才能返回值。

答案 1 :(得分: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

输入和输出

Input and Output

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

答案 2 :(得分:2)

尝试以下用户定义函数:

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