【问题标题】:Excel - Search Cell for String From List, WITH Case Sensitivity AND WildcardsExcel - 从列表中搜索字符串,区分大小写和通配符
【发布时间】:2021-08-30 18:20:03
【问题描述】:

我一直在努力完成这项工作。我可以在网上找到一些不同的公式,但一直无法得到我需要的东西。

所以,我有一个单元格列表,每个单元格都包含一个单词,比如说单元格 A1:A10。在单元格 B1 中,我有一个文本字符串。我想在单元格 B1 中搜索 A1:A10 列表中的任何单词,但我需要它来搜索区分大小写,并且还允许使用通配符(所以我只能得到整个单词匹配)。这怎么可能?

这是一个随机的例子来解释我的逻辑: 假设单元格 B1 包含字符串“Abc Xyz”。在 A1:A10 列表中,有字符串“Ab”和“Bc”。我希望此搜索返回 false,因为在 B1 中未找到列表中的整个单词。但是如果将“Abc”或“Xyz”添加到列表中,则搜索将返回真,因为找到了整个单词。到目前为止,我发现:

  1. FIND 函数区分大小写,因此它不会与“Bc”进行匹配,这很好,但会与“Ab”匹配。所以用“Ab”当我想要一个假的时候我得到一个真。而且它不能使用通配符,请看下一条评论。
  2. SEARCH 函数不区分大小写,所以它会找到“Bc”,所以当我想要一个假时我得到一个真。但是它允许我使用通配符,所以我可以搜索“Ab~”,所以它只在搜索词之后查找一个空格,这在我需要时给了我“Ab”错误。我可能语法错误,但搜索范围是 A1:A10&"~"。
  3. EXACT 函数不起作用,因为“Abc”和“Xyz”与“Abc Xyz”不完全匹配。所以当我想要一个真时,我得到一个假。
  4. MATCH 函数不起作用,因为“Abc Xyz”永远不会出现在单个单元格的 A1:A10 列表中。

非常感谢您能提供的任何帮助。几个小时以来一直在为此绞尽脑汁。

(编辑:简而言之,我正在寻找一种从搜索词列表中仅搜索全字匹配且区分大小写的方法。)

【问题讨论】:

  • 您可以使用 VBA 解决方案吗?
  • @Kevin - 没必要见下文...
  • @k.cummins - 你确定 xlookup 不适合你吗?
  • @JB-007 - Xlookup 可能有效,但我不确定如何。我需要知道单元格 B1 中存在的每个全字是否在列表 A1:A10 中列为全字,包括区分大小写。这就像我需要对 B1 中的每个单词进行精确匹配,而不是整个 B1 单元格。那可能吗?对不起,如果我把事情复杂化了。这可能是我在 Excel 中尝试过的最困难的事情之一,而且我不是专家。
  • @JB-007 好的,我看到了 xlookup 的有用性以及它如何导致解决方案。基本上,单元格 B1 的内容是否存在于 A1:A10 中。但这会检查整个 B1 单元格......我将如何使用它来检查 B1 中的每个单词?

标签: excel search excel-formula office365 case-sensitive


【解决方案1】:

原始答案 - 基于 OR 逻辑

我可能没有完全理解这个问题,所以如果这不正确,请提前道歉。看到 JB 的回答会产生更多疑问,但这里是:

=OR(ISNUMBER(FIND(TRANSPOSE(FILTERXML("<main><sub>"&SUBSTITUTE(B1," ","</sub><sub>")&"</sub></main>","//sub")),
                  A1:A10 ) ) )

我将测试集扩展到 16 个以评估不同的场景。 B1 包含“Abc Xyz”,该列表包含一个半随机名称列表,其中包含“Ab”、“Xy”、“Abc”等,以及空白。混合用于测试。

需要:Excel 365、Excel 2019、Excel 2016 或 Excel 2013

基于 AND 逻辑的新答案

这更复杂(至少据我所知),因为它不能简单地将数组的所有结果 OR 为单个结果。应用 AND 将在所有情况下导致 FALSE,因此我们需要创建一个数组,该数组的列有效地按列进行 OR 运算,然后将这些结果按行进行 AND 运算。这个公式可以做到:

=LET( list, A1:A10,
      testString, B1,
       testArray, IFERROR( FIND( TRANSPOSE( FILTERXML( "<main><sub>" & SUBSTITUTE( testString, " ", "</sub><sub>" ) & "</sub></main>", "//sub" ) ),
                           list ),  0 ),
       ones, SIGN( SEQUENCE( 1, ROWS( testArray ) ) ),
       AND( MMULT( ones, testArray ) ) )

list 是您的单词范围(在 A1:A10 中),testString 是您要在示例中的 B1 中测试的字符串。您可以在这里并排查看这两种方法,其中“abc Xyz”作为 B1 中的测试用例。

需要:Excel 365

【讨论】:

  • 您好 - 请参阅修订后的 soln(我的初始方法失败,因为它只会匹配初始记录 - 例如,如果在数据列表的第 3 行中,使用列表长度 2 的查找将不会返回正确的值 - 这是多亏了xlookup,情况不再如此)...我也探索了VB soln,但发现'='运算符的强度不足以确保区分大小写...。
  • @JB-007 我仍然不确定我是否在关注。 OP 中的语句 “假设单元格 B1 包含字符串“Abc Xyz”。” 让我相信当 B1 包含“Abc Xyz”时,如果“Abc”或“Xyz”在列表 A1:A10 中,但如果它们仅包含“abc”或“xyz”或“Ab”或“Bc”,则不在列表中。顺便说一句 - 你以前的帖子有一些聪明的部分。
  • 您好 Mark 和 JB,感谢您的快速回复。马克的解决方案是我所追求的!对此进行测试让我意识到我需要修改一些东西......我需要匹配单元格 B1 内的所有完整单词,因此 A 列中需要同时存在“Abc”和“Xyz”才能给出一个真实的结果。你将如何修改它来做到这一点?非常感谢!
  • OP 寻找全字匹配 "只搜索全字匹配,区分大小写,*" - 所以如果寻找 ABC 和 xyz 那么 ABC_xyz 应该返回 false 但 ABC *或 xyz(但不是两者)应该返回真正的响应...感谢您对旧解决方案的赞美,但就像我说的,如果第 3 行中的 ABC 会失败...这个更简洁...
  • 任何关于FILTERXML() 的内容都是赏心悦目!
【解决方案2】:

Here/截图参考:

假定 Excel 的 Office 365 兼容版本

=XLOOKUP(F2:F3,B2:B5,C2:C5,"",0,1)

如果没有 Office 365,那么 vlookup 也应该可以工作...

【讨论】:

    【解决方案3】:

    Kudo 提出了一个写得很好的问题以及您对该问题进行的大量研究。

    只有 10 个左右的单元格,您可以使用 TEXTJOIN() 创建一个字符串,我们可以在有效的 xml 字符串中使用父母文本属性。试试:

    D1中的公式:

    =ISERROR(FILTERXML("<t>"&TEXTJOIN(",",0,,A1:A3,"<s>")&SUBSTITUTE(B1," ","</s><s>")&"</s></t>","//s[not(contains(../text(),concat(',',.,',')))]"))
    
    • "&lt;t&gt;"&amp;TEXTJOIN(",",0,,A1:A3,"&lt;s&gt;")&amp;SUBSTITUTE(B1," ","&lt;/s&gt;&lt;s&gt;")&amp;"&lt;/s&gt;&lt;/t&gt;":创建一个有效的 XML 字符串。对于给定的示例,这将返回:&lt;t&gt;,Xyz,Bc,Abc,&lt;s&gt;Abc&lt;/s&gt;&lt;s&gt;Xyz&lt;/s&gt;&lt;/t&gt;
    • "//s[not(contains(../text(),concat(',',.,',')))]":现在让我们在FILTERXML() 中使用一个有效的xpath 表达式来返回一个节点数组,当每个单独的节点用逗号连接时,父节点的文本属性不会包含这个文本。
    • ISERROR():如果FILTERXML() 不能返回任何节点(因此给出错误),则返回TRUE 的部分或如果有任何节点通过给定的XPATH 语法验证,则返回FALSE

    如果您确实对FILTERXML() 感兴趣,并且想知道如何从给定字符串返回数组,那么this 可能是一个有趣的读物。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多