Excel:在数组中sorting效果
我目前正在使用这个expression式来检查一个单元格是否至less包含一组string中的一个:
AB 1 abcd =ISNUMBER(SEARCH({"a","x"},A1))
B1会在这里返回true。 但是,如果我改变数组的顺序如下,它返回false:
AB 1 abcd =ISNUMBER(SEARCH({"x","a"},A1))
这是为什么? 有没有更好的方法来做到这一点比使用一堆OR()的更优雅?
为了完整起见,对“原因是什么? 即为什么结果似乎对花括号中的string的顺序敏感的是公式
=ISNUMBER(SEARCH({"a","x"},A1))
只看第一个string“a”,因为没有任何东西像数组公式那样操作,并且遍历所有值“a”,“x”等。
通常的过程是将函数包装在一个像SUM这样的聚合函数中。 如果你这样做,你还必须添加减号,使ISNUMBER中的TRUE / FALSE值为1和0,并进一步包装在SUMPRODUCT中或作为数组公式运行:
=SUMPRODUCT(SUM(--ISNUMBER(SEARCH({"a","x"},A1))))
即使如此,它提供了一个数字结果,这不是你真正想要的。
@Dick Reichel的想法因此更好地给你:
=OR(ISNUMBER(SEARCH({"a","x"},A1)))
工作非常好,顺便说一句,不需要input数组公式。
假设我们在A1中有文本,并且C列中还有一个子string列表。 这些可以是单个或多个字符子string。 我们将Name – KeyStrings分配给列C中的单元格列表
我们想知道A1中是否存在任何子串。
在B1中input以下内容:
=NOT(LEN(TRIM(SUBSTITUTE(A1,INDEX(KeyStrings,SUMPRODUCT(ROW(KeyStrings)*ISNUMBER(SEARCH(KeyStrings,A1)))),"")))=LEN(A1))
如果列C中的任何子string可以在A1中find,那么该公式将报告为True
我认为,因为你已经把一个大括号,它表示一个数组search。 (我不是数组的专家,所以以下是一个有教养的猜测)。
在第一个例子中,Excel正在做的是在位置1find“a”,所以它将第一个返回给ISNUMBER
函数,它是TRUE
。 (基本上,比较“a”和位于abcd的位置是1,没有find/?查找“x”。返回1为“a”,对于ISNUMBER
函数为TRUE
)
在第二个代码中,“x”与来自abcd的a进行比较,abcd返回一个非数字值(并且没有find/查找[?]“a”),因此它是FALSE
。
PS:
我的意思是Excel没有find/查找[?]第二个或其上的任何元素,似乎是基于如何编码数组和公式。在大括号中,逗号分隔“列”和分号单独的“行”。 所以你在一个search函数中input一个2列/ 1行数组。 虽然没有什么不对,但是SEARCH
函数本身可能不会被编码去查找数组中除位置[1,1]之外的任何元素。 有人更好地通知searchfunction的内部工作应该证实这个答案。 (如果这是一个完全错误的教育猜测,我不介意把它关掉)