3

我有一列包含一些字符串描述。

例如:

鲍勃·戴维斯
修剪草坪
给奶牛小费

此外,我将在不同的工作表或列上有一个关键字列表,例如工作关键字列表 1:

大卫
工作

播放关键字列表:

割草
奶牛

因此,当主列填充了这些文本字符串时,我希望它们自动检查每个关键字列表以查看这些单词是否存在,当找到匹配项时,将列表的标题(工作/游戏)放在下一个单元格中给它。

我知道这在 VBA 中是可能的,甚至可以在SelectionChange函数中“即时”完成。但这是否可以在没有 VBA(例如条件格式)的情况下实现?

4

2 回答 2

9

这很容易用公式来完成,只要你不太关心可能不正确地找到单词的一部分。不过暂时忽略这个警告。首先,这是一个公式,它会告诉您是否在源字符串中的任何位置找到了多个字符串中的任何一个:

=OR(NOT(ISERROR(FIND(<array of strings to look for>,<string to look in>))))

这需要作为数组公式输入才能工作。您可以使用 Ctrl-Shift-Enter 输入它。要了解它的工作原理,请考虑 Excel 在评估真实示例时所做的工作:

=OR(NOT(ISERROR(FIND({"a","b","c"},"q b q"))))

'FIND' 查找一个字符串在另一个字符串中的位置。当使用第一个参数的数组调用时,它将返回一个位置数组(或 #VALUE!如果未找到搜索字符串)。您可以通过输入该公式然后在其中的表达式上使用 F9 键来跟踪评估:

=OR(NOT(ISERROR({#VALUE!,3,#VALUE!})))
=OR(NOT({TRUE,FALSE,TRUE}))
=OR({FALSE,TRUE,FALSE})
=TRUE

因此,对于您的示例,假设您要在 $B$6:$B$8 中搜索您的字符串,在 $D$2:$D$3 中搜索您的工作字符串,在 $E$2:$E$3 中搜索您的播放字符串。你可以把公式

=OR(NOT(ISERROR(FIND(D$2:D$3,$B6))))

在单元格 D6 中,将其作为数组公式输入,然后将其拖过区域 D6:E8 以查找 B 中的哪些字符串在其中起作用或播放单词。然后,您可以使用这些结果来驱动进一步的公式或条件格式。

但是,如上所述,您会注意到正在搜索的字符串中的任何子字符串都会被找到,所以

=OR(NOT(ISERROR(FIND({"a","b","c"},"bad"))))

将评估为 TRUE。(如果你的有趣列表包含“id”,“davids”中的“id”将匹配。)

与 Excel 的常见情况一样,如果您使用有限的数据集做一些您理解的事情,您可能不会关心这一点。但它可能会挫败将这种公式用作一般“应用程序”的一部分的尝试,该应用程序的用户不知道花哨的数组技巧或确切的“查找”做什么。(你可以通过在搜索词之后放置一个空格等来解决这个问题,但如果你把它交给其他人,那就是更神秘的巫术等待被打破。)不过,对于快速而肮脏的扫描,这很好.

于 2011-03-22T23:01:02.980 回答
1

我已经为少数人提出了另一种方法。正如所暗示的那样,这很快就会变得很麻烦。

在A栏输入以下内容:1:马牛猪鸡2:狗猫鸟3:鱼猫4:马猫老鼠5:猿人海豚6:狗猫花栗鼠

在单元格 B1 中输入以下内容(并复制到 B2:B6):

=if(sum(iserror(find("cat",A1)),iserror(find("dog",A1)),iserror(find("fish",A1)),iserror(find("bird",A1)))<4,"House pet","")

B1和中的结果B5应显示为空白,而 、 、 和 中的结果应显示B2B3B4家庭B5宠物”。

如果关键字列表太大,请小心。我也成功地将其用于短列表(如问题中所暗示的那样),但是如果它太长,您输入所有可能性的空间有限 - 更不用说公式中的风险错误了。

我无法让我的数组工作 - 感谢上面的帖子,我现在也要去尝试一下,以获得更长的列表。

附言。不记得我对OR ISERROR数组做了什么,但是您提供的这个数组非常适合我的 80 个关键字列表。谢谢!

于 2013-03-13T01:48:37.330 回答