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

Nic*_*ckG 3 excel vba conditional-formatting excel-vba

我有一个包含一些字符串描述的列.

例如:

Bob davids
mowing the lawn
tipping cows

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

davids
work

播放关键字列表:

mowing
cows

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

我知道这在VBA中是可行的,甚至可以在SelectionChange功能中"动态" 执行.但这可能没有VBA,如条件格式吗?

jto*_*lle 9

只要您不太关心可能不正确地找到部分单词,这对于公式来说就很容易了.忽略那个警告一会儿.首先,这是一个公式,它将告诉您是否在源字符串中的任何位置找到了几个字符串:

=OR(NOT(ISERROR(FIND(<array of strings to look for>,<string to look in>))))
Run Code Online (Sandbox Code Playgroud)

这需要作为数组公式输入才能工作.您可以使用Ctrl-Shift-Enter输入它.要了解它是如何工作的,请考虑Excel在评估实例时的作用:

=OR(NOT(ISERROR(FIND({"a","b","c"},"q b q"))))
Run Code Online (Sandbox Code Playgroud)

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

=OR(NOT(ISERROR({#VALUE!,3,#VALUE!})))
=OR(NOT({TRUE,FALSE,TRUE}))
=OR({FALSE,TRUE,FALSE})
=TRUE
Run Code Online (Sandbox Code Playgroud)

所以,对于你的例子,假设你想要你的字符串你想要搜索$ B $ 6:$ B $ 8,你的工作字符串是$ D $ 2:$ D $ 3,你的游戏字符串是$ E $ 2:$ E $ 3.你可以把公式

=OR(NOT(ISERROR(FIND(D$2:D$3,$B6))))
Run Code Online (Sandbox Code Playgroud)

在单元格D6中,将其作为数组公式输入,然后将其拖动到范围D6:E8中,以查找B中哪些字符串有效或在其中播放单词.然后,您可以使用这些结果来驱动更多公式或条件格式.

但是,如上所述,您将注意到要搜索的字符串中的任何子字符串都将被找到,因此

=OR(NOT(ISERROR(FIND({"a","b","c"},"bad"))))
Run Code Online (Sandbox Code Playgroud)

将评估为TRUE.(如果您的有趣列表包含"id",则"davids"中的"id"将匹配.)

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