如果单元格包含1个或多个关键字,请更改其他单元格的值

时间:2011-03-22 15:58:27

标签: excel excel-vba conditional-formatting vba

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

例如:

Bob davids
mowing the lawn
tipping cows

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

davids
work

播放关键字列表:

mowing
cows

因为主列填充了这些文本字符串,我希望它们自动检查每个关键字列表以查看这些单词是否存在,并且当它找到匹配时,将列表的标题(工作/播放)放入旁边的单元格。

我知道这在VBA中是可行的,甚至可以在SelectionChange函数中“动态”执行。但是,如果没有VBA,例如条件格式化,这可能会这样做吗?

2 个答案:

答案 0 :(得分: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的情况一样,如果您使用有限的数据集执行某些操作,则可能不关心这一点。但是它可以打败尝试使用这种公式作为一般“应用程序”的一部分,该应用程序的用户不知道花哨的数组技巧或究竟是什么'FIND'。 (你可以通过在你的搜索词之后放一个空格等来解决这个问题,但是如果你把它交给其他人,这就是更加神秘的巫毒等待被破坏。)但是,对于快速而肮脏的扫描,它很好

答案 1 :(得分:1)

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

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

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

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

B1B5中的结果应显示为空白,而B2B3B4B5中的结果应为空白“众议院宠物”。

如果关键字列表太大,请小心。我也成功地使用了这个短名单(正如问题所暗示的那样),但如果时间过长,你输入所有可能性的空间有限 - 更不用说公式中的风险错误了。

我无法让我的阵列工作 - 感谢上面的帖子我现在也要试试我的长列表。

PS。不记得我在OR ISERROR数组中做了什么,但是你提供的这个数组在我的80个关键字列表中运行得非常好。谢谢!