如果我的单元格范围A1:A6
中的数据是:
Apple
Banana
Cherry
Grape
Orange
Watermelon
有没有办法返回一个数组(在一个单元格中,对于一个更大的公式的中间步骤),它返回上面的数组,只有满足某个条件的条目除外?
例如,如果我希望公式返回仅包含字母n
的单元格的数组,则会返回:
Banana
Orange
Watermelon
有没有办法实现这个目标?
注意我不想要返回一个大小相同的数组,只有空白条目,即我不想要:
""
Banana
""
""
Orange
Watermelon
答案 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
是一个函数,它返回最常出现的集合中的数据。但是有几点需要注意:
数据必须至少出现两次才能由MODE.MULT
返回。如果没有重复数据,则会返回错误。例如,MODE.MULT({1;2;3})
会返回错误,因为数组{1;2;3}
中没有重复数据。另一个例子:MODE.MULT({1;1;2}
会返回1
,因为1
最常出现在数据中。
如果数据最多出现“绑定”,MODE.MULT
将返回所有绑定条目的数组。例如,MODE.MULT({1;1;2;2})
将返回{1;2}
。
最重要的是,MODE.MULT
可能是最奇特但最有用的行为,MODE.MULT
完全忽略逻辑值(TRUE
和{ {1}}值)在确定数据模式时,即使它们的出现频率也高于数据中的非逻辑值。
我们可以利用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
输入和输出
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