我正在尝试在 Calc 中处理一些数据。其中一个步骤涉及查找某个字符串是否属于某一列。我尝试使用 FIND 和 SEARCH 函数。两者的行为方式相同,但我没有得到正确的结果。
例如说我在 A 列中有以下字符串
NY
SF
LON
CAN
US
并尝试将以下公式放在 C 列中
=SEARCH("NY",A2)
结果是 - 单元格 C2 将有 1(这是正确的)但如果将相同的公式复制到 C 列中的其他单元格 - 它会给出“#VALUE!”错误,我无法找出原因?
有人有什么想法吗?
答案1
#VALUE!
如果搜索失败,则结果为默认结果(参见OpenOffice.org Calc 关于 SEARCH 函数的文档)。由于所有其他字符串均不包含“NY”,因此这是这些单元格的正确结果。
我猜你把结果“1”误认为是“布尔”结果,而搜索失败的结果应该是“0”。但事实并非如此。上述文件有一些涉及的例子系统号码和错误评估 SEARCH 函数的结果。
答案2
首先,如果您想在多行/列中搜索文本,您需要给出一个单元格范围,而不仅仅是一个单元格:A2:A6
,或者更好的是$A$2:$A$6
。
其次,当您将一个单元格公式复制粘贴或翻译到另一个单元格时,$ 将被视为常量坐标。假设您将公式放在 C2 中。复制到 C3 后将得到=SEARCH("NY",A3)
。如果您将其复制到 D2,则值将为=SEARCH("NY",B2)
。
从我在 Libre Office 帮助中读到的内容来看,FIND 和 SEARCH 函数会在另一个文本中搜索一个文本,我猜它与您给出的范围第一行中的值相匹配。因此这些函数并没有达到您的预期。
我做了一些研究(尝试了不同的东西),似乎最好的选择是使用MATCH
函数来检查某个值是否存在于某个单元格范围内,并OFFSET
打印该值而不是该范围内的索引。
=OFFSET($A$2; MATCH("SF";$A$2:$A$6; 0) - 1; 0)
答案3
正如@tohuwawohu 提到的,使用 ISERROR (ISERR) 函数。使用 SEARCH 时,如果在文本中找不到该值,则返回 #VALUE!。为了在您的逻辑中适应这种情况,请使用以下模式:
=IF(ISERR(SEARCH(<str_to_find>, <str_to_search_in>)), <NOT_FOUND_do_something>, <IS_FOUND_do_something_else>)
这种使用 ISERR 的模式可以应用于函数返回错误的许多其他情况。唯一的例外是 #N/A,此时必须使用 ISNA 函数。
答案4
虽然其他答案解释了为什么ISNUMBER
会出现这种情况,但似乎没有人给出现实世界的实际例子。
您可以使用ISNUMBER
并VALUE
携手投掷在使用 进行测试之前,将结果转换为数字ISNUMBER
。
例如,假设我们有一个像MDRLN4885B
A1 中的字符串,我们想知道最后一个字符是否是非数字,在本例中它是“B”。
=ISNUMBER(VALUE(RIGHT(A2, 1)))
这基本上会给你FALSE
(或者TRUE
如果它是一个数字),然后你可以使用它来评估IF
,例如。