Excel如何返回符合一定条件的数组?

如果我有单元格区域A1:A6数据,它是:

 Apple Banana Cherry Grape Orange Watermelon 

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

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

 Banana Orange Watermelon 

有没有办法做到这一点?

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

 "" Banana "" "" Orange Watermelon 

 =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 + Enterinput

input和输出

输入和输出

  • INDEX返回一个范围内的元素
  • MATCH允许我们find要返回的行的位置
  • COUNTIF是为了确保我们只在结果中select唯一的值
  • FIND只返回string中存在n

尝试以下用户定义的function:

 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 

是。

这里是数组公式(为了可读性而添加换行符):

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

请注意,这是一个数组公式,这意味着您必须在input公式之后按Ctrl + Shift + Enter而不是Enter


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

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

 = INDEX(A1:A6,2) 

这将返回Banana

要从一个基于多个索引的列表返回结果,你会想用这样的东西:

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

这将理想返回{Banana;Orange;Watermelon}

但是,这不会返回一个数组。 根据我问的一个最近的问题 ,给出了一个非常聪明的解决这个问题的方法:

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

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

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


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

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

MODE.MULT是一个返回最频繁出现的集合中的数据的函数。 有几个警告,但是:

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

  2. 如果在数据出现最多的时候出现“tie”, MODE.MULT返回一个所有绑定条目的数组。 例如, MODE.MULT({1;1;2;2})将返回一个{1;2}的数组。

  3. 最重要的是,也许是MODE.MULT最独特但也是最有用的行为, MODE.MULT在确定数据模式时完全忽略了逻辑值( TRUEFALSE值), 即使它们比非逻辑数据中的值。

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

ISNUMBER(SEARCH("n",A1:A6))返回数组中包含nTRUE/FALSE值。 像这样的东西:

 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 。 (由于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要求数据中至less有两个条目需要匹配才能返回一个值。