我目前正在使用此表达式来检查单元格是否包含一组字符串中的至少一个:
A B
1 abcd =ISNUMBER(SEARCH({"a","x"},A1))
B1将在此处返回true。但是,如果我按如下方式更改数组的顺序,则返回false:
A B
1 abcd =ISNUMBER(SEARCH({"x","a"},A1))
为什么?有没有比使用一堆OR()更优雅的方法呢?
答案 0 :(得分:2)
假设我们在 A1 中有文字,我们在列 C 中也有一个子字符串列表。这些可以是单个或多个字符子串。我们将名称 - KeyStrings 分配到列 C
列中的单元格列表我们想知道 A1 中是否存在任何子字符串。
在 B1 :
中输入以下内容=NOT(LEN(TRIM(SUBSTITUTE(A1,INDEX(KeyStrings,SUMPRODUCT(ROW(KeyStrings)*ISNUMBER(SEARCH(KeyStrings,A1)))),"")))=LEN(A1))
如果可以在 A1
中找到 C 列中的任何子字符串,则公式将报告 True答案 1 :(得分:1)
为了完整起见,回答原始问题"为什么会这样?"也就是说为什么结果似乎对大括号中字符串的顺序敏感就是公式
=ISNUMBER(SEARCH({"a","x"},A1))
仅查看第一个字符串" a"因为没有任何东西可以让它像数组公式那样运作并逐步完成所有的值" a"," x"等
通常的过程是将函数包装在像SUM这样的聚合函数中。如果你这样做,你还必须添加减号以使ISNUMBER中的TRUE / FALSE值表现为1和0并进一步换行SUMPRODUCT或将其作为数组公式输入以使其工作: -
=SUMPRODUCT(SUM(--ISNUMBER(SEARCH({"a","x"},A1))))
即使这样,它也会给出一个不是你想要的数字结果。
因此,@ Dirk Reichel的想法会让你更好: -=OR(ISNUMBER(SEARCH({"a","x"},A1)))
非常好用,顺便说一下,不需要输入数组公式。
答案 2 :(得分:0)
我认为既然你在那里放了一个花括号,它表示一个数组搜索。 (我不是数组专家,所以以下是一个有根据的猜测。)
Excel正在做的是在第一个例子中,它在位置1中找到“a”,因此它返回no 1到ISNUMBER
函数,即TRUE
。 (基本上,将“a”与位于第1位的abcd中的a进行比较,并且找不到/寻找[?]“x”。对于“a”,返回1,{{1}为TRUE
功能)
在第二个代码中,将“x”与来自abcd的a进行比较,abcd返回一个非数字值(并且找不到/查找[?]“a”),因此它是ISNUMBER
PS:
我的意思是Excel没有查找/查找[?]第二个或其中的任何元素,似乎是基于数组和公式的编码方式。在大括号中,逗号分隔“列”和分号分隔“行”。因此,您在搜索功能中输入2列/ 1行数组。虽然没有任何问题,但FALSE
函数本身可能无法编码以查找数组中除位置[1,1]之外的任何元素。有人更好地了解SEARCH功能的内部工作原理应该确认这个答案。 (如果这是一个完全错误的教育猜测,我不介意把它取下来)