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
是一个返回最频繁出现的集合中的数据的函数。 有几个警告,但是:
-
数据必须至less出现两次才能被
MODE.MULT
返回。 如果没有重复的数据,它将返回一个错误。 例如,MODE.MULT({1;2;3})
将返回一个错误,因为数组{1;2;3}
没有重复的数据。 另一个例子:MODE.MULT({1;1;2}
会返回1
因为1
在数据中最常出现。 -
如果在数据出现最多的时候出现“tie”,
MODE.MULT
返回一个所有绑定条目的数组。 例如,MODE.MULT({1;1;2;2})
将返回一个{1;2}
的数组。 -
最重要的是,也许是
MODE.MULT
最独特但也是最有用的行为,MODE.MULT
在确定数据模式时完全忽略了逻辑值(TRUE
和FALSE
值), 即使它们比非逻辑数据中的值。
我们可以利用MODE.MULT
这些属性来获得所需的数组。
ISNUMBER(SEARCH("n",A1:A6))
返回数组中包含n
的TRUE/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有两个条目需要匹配才能返回一个值。