【问题标题】:Search cell for list of characters在单元格中搜索字符列表
【发布时间】:2016-03-21 02:06:11
【问题描述】:

我有一个单元格列出了任意数量的字符,例如abc。如何使用 Excel 公式检测给定的其他单元格是否包含一个或多个这些字符?

在下面的示例中,其中包含 a、b 或 c 的单词返回 TRUE,而没有返回 FALSE 的单词。这就是所需的输出。

我知道如何检测一个字符的存在:

=NOT(ISERROR(SEARCH("a",B4)))

而且,如果我确定我有 3 个字符,我可以像这样组合其中的三个 ISERROR 语句:

 =NOT(AND(ISERROR(SEARCH("a",B4)),ISERROR(SEARCH("b",B4)),ISERROR(SEARCH("c",B4))))

但是对于单元格 A4 中给出的任意长的字符列表,您将如何执行此操作?

请注意,我不是在寻找 VBA 解决方案;我已经可以做到了。

【问题讨论】:

  • 不是一个完整的解决方案,但可能会提供一个新的思路:=OR(IFERROR(SEARCH({"a","b","c"},B4)>0,{FALSE,FALSE,FALSE})) 作为数组公式。现在只需要一种将字符串拆分为字符数组的方法...
  • 对。你的和较短的 =NOT(AND(ISERROR(SEARCH({"a","b","c"},B4)))) 一样
  • @chrisneilsen:现在明白了。见答案。感谢您带路!

标签: excel excel-formula


【解决方案1】:

试试这个公式:

=NOT(AND(ISERROR(SEARCH(MID($A$4,
COLUMN(INDEX($1:$1,1):INDEX($1:$1,LEN($A$4))),1),$B4))))

基本上是 OP 发布的公式的改进版本,它消除了使用 volatile OFFSET 函数

【讨论】:

  • 正是...我确实担心使用 volatile OFFSET。我不知道如何用INDEX 替换它,但就是这样。
【解决方案2】:

知道了!

=NOT(AND(ISERROR(SEARCH(MID($A$4,
    COLUMN($A$1:OFFSET($A$1,0,LEN($A$4)-1))-COLUMN($A$1)+1,1),$B4))))

或稍微缩短一点:

=NOT(AND(ISERROR(SEARCH(MID($A$4,
    COLUMN(OFFSET($A$1,0,0,1,LEN($A$4)))-COLUMN($A$1)+1,1),$B4))))

使用 Ctrl-Shift-Enter 作为数组公式输入,然后向下复制。

这部分

COLUMN($A$1:OFFSET($A$1,0,LEN($A$4)-1))-COLUMN($A$1)+1

只是返回数组 {1, 2, 3, ..., number or chars to search} 的技巧。在此示例中,{1,2,3,4,5}。最后一点

-COLUMN($A$1)+1

是为了确保如果有人在 A 列之前插入列,这仍然有效(否则数组将不再从 1 开始)。在 A 之前添加 4 列时示例仍然有效:

@EEM 建议在字符串中硬编码$A$1 单元格引用并使用INDIRECT,而不是最后一位,这样无论插入任何列,单元格引用都保持固定。生成的公式有点长,但也可以正常工作:

=NOT(AND(ISERROR(SEARCH(MID($C$4,
     COLUMN(INDIRECT("$a$1"):OFFSET(INDIRECT("$a$1"),0,LEN($C$4)-1)),1),$D4))))

【讨论】:

  • 所谓的trick应该是:COLUMN($A$1:OFFSET($A$1,0,LEN(A$4)-1))。这部分是多余的-COLUMN($A$1)+1,事实上它返回零。
  • @EEM:当然它现在返回零,但是当有人在 A 列之前插入一列时会发生什么?它搞砸了你的公式。事实上,我就是这么开始的(如果需要,请查看编辑摘要),然后意识到问题所在,所以我将其修复为现在的样子。
  • 好的,我明白了您的论点,但情况确实如此:如果插入四列而不是一列,您会怎么做?希望现在您应该意识到您的解决方案并没有解决您的问题。建议使用INDIRECT,顺便说一句还是不需要多余的部分...
  • @EEM:嗯,实际上,它也可以工作when 4 columns are inserted。这就是重点。希望到现在为止,您应该意识到在断言解决方案不起作用之前测试解决方案是一件好事。
  • @JeanFrançoisCorbett 以某种方式道歉,我仍在考虑固定的“$A$1”,没有意识到它会随着插入而移动\更改,你是对的,我之前“总是”测试一切,但是那个否定“总是”的时间然后就变成了失败(墨菲定律)......点了。回到公式:这种形式使最后一部分变得多余:COLUMN(OFFSET($1:$1,0,0,1,LEN($D$4))),通过对整行进行插入和删除列不会影响对行的引用。这就是我想的......
【解决方案3】:

这不是很漂亮,但是如果您知道输入字符串的最大长度,我有一个解决方案:

In Column H numbered list from 1 to [Max Length]

In G1 I entered =MID($A$4,H1,1) and copied down

In I1 I entered =IF(H1<=LEN($A$4),H1,"") and copied down

这些可以复制到输入字段的最大长度

然后是C列中的公式

{=IF(SUM(IFERROR(SEARCH(OFFSET($G$1,0,0,COUNT($I:$I),1),B4),0))>0,"TRUE","FALSE")} 

作为范围公式输入(ctrl+shift+enter)

H 列中的数字与 Mid 函数一起使用,以单独拆分字母。 主函数中的偏移量使用 I 列中的数字计数来确定要在 G 列中查看的 Range 的大小。

这可以稍微整理一下,但我认为当它像这样拆分时更容易看到我的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    相关资源
    最近更新 更多