【问题标题】:How do I use Excel's "=SUMPRODUCT(--ISNUMBER(SEARCH..." function to exclude 'complicated compounded' results?如何使用 Excel 的“=SUMPRODUCT(--ISNUMBER(SEARCH...”) 函数排除“复杂复合”结果?
【发布时间】:2016-10-09 21:54:00
【问题描述】:

我正在尝试验证产品描述列表,以突出显示在描述中使用产品颜色的任何实例。

我有一个颜色列表...

Example:
Blue
Red
Green
Yellow
Purple
etc.

我正在使用以下公式来检测是否使用了其中一种颜色:

=IF(SUMPRODUCT(--ISNUMBER(SEARCH(Table1[Colors],A1)))>0,"Cannot include a colour","")

Table1[Colours] 包含我的彩色文本字符串列表,A1 包含我的第一个产品描述。

Dave Bruns @ ExcelJet 有一个很棒的 read 供任何想要使用 SUMPRODUCT/ISNUMBER/SEARCH 组合的人使用。

如果产品描述包含我的Table1[Colours] 列表中指定的颜色,则公式会生成"Cannot include a colour" 以提醒用户这是不允许的。

示例: “Garmin Forerunner 10 Running Sportswatch 绿色

我面临的第一个问题是我当前的公式procs 当产品描述包含一个包含颜色的复合词时......

示例: "黑色莓果 Z10 智能手机"

这不准确地使描述无效,因为本文中的字符串"Black" 没有用于描述产品的颜色。

正如标题所示,我的主要问题在于智取“复杂的复合”词......

...我的Table1[Colours] 列表不仅包含基本的主要颜色、次要颜色和三次颜色,还包含更奇特的颜色,例如珊瑚色、紫红色和棕褐色。

当产品描述包含“站立”之类的词时,这会导致复杂化。

为什么您可能会想到这个问题?支架包含我的一种异国情调的颜色“Tan”

S--d

不幸的是,这也导致我的公式为proc。 (很烦吧?)

我正在寻找的解决方案是对我现有公式 =IF(SUMPRODUCT(--ISNUMBER(SEARCH(Table1[Colors],A1)))>0,"Cannot include a colour","") 的补充,它通过可接受单词的计数器列表(例如 Table2[Exceptions] 或通配符搜索以匹配没有前缀或后缀的确切颜色(此选项必须允许由/ 分隔的双色的可能性,例如“黑色/红色”,所以通配符与某些标点符号例外?)

...只是有点可怕和不便。

感谢任何建议。

谢谢J先生

【问题讨论】:

  • 颜色...它们总是在最后吗?就像“Garmin Forerunner 10 Running Sportswatch Green

标签: excel colors excel-formula wildcard formula


【解决方案1】:

您需要搜索单词边界。如果您将space 添加到颜色的开头和结尾,以及描述的开头和结尾,这应该取决于您的数据。所以你的公式的搜索部分可以写成:

SEARCH(" " &Table1[Colors]& " "," "&A1&" ")

或者,对于您的整个公式:

=IF(SUMPRODUCT(--ISNUMBER(SEARCH(" "&Table1[Colors]&" "," "&A1&" ")))>0,"Cannot include a colour","")

如果您有连字符的颜色,例如:blue-green,或者像Cherry3 这样的颜色,您需要在表格中单独列出它们。

编辑:由于您的评论表明情况更为复杂,我建议使用用户定义函数 (UDF) 以方便维护。

下面的 UDF 可以接受 findtext 范围、单个字符串或由多个字符串组成的数组常量。如果使用数组常量,则必须使用分号; 而不是逗号作为分隔符。

使用示例:

=IF(reMatch(Table1[Colors],A1),"Cannot include a colour","")

代码使用正则表达式标记作为字边界。单词边界是集合[0-9A-Za-z_] 中的字符与不在该集合中的任何字符相邻的点,或者靠近字符串的开头或结尾的点。这应该涵盖您所有的 IF 函数示例等等。

Option Explicit
Function reMatch(FindText As Variant, WithinText As String) As Boolean
'FindText could be a Range, an array constant, or a single item
'If FindText is an array constant, separate elements by semicolons, not commas
    Dim RE As Object
    Dim I As Long
    Dim C As Range
    Dim vFind As Variant

reMatch = False
Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .IgnoreCase = True

    vFind = FindText  'will create array if FindText is a range
    If IsArray(vFind) Then
        For I = 1 To UBound(vFind)
            .Pattern = "\b" & vFind(I, 1) & "\b"
            If .Test(WithinText) = True Then
                reMatch = True
                Exit Function
            End If
        Next I
    Else
        .Pattern = "\b" & vFind & "\b"
        If .Test(WithinText) = True Then _
            reMatch = True
    End If
End With

End Function

编辑: 如所写,FindText 可以是一个单元格范围;但是,该范围必须是单列垂直范围。如果是水平范围,函数将返回#VALUE! 错误。如有必要,可以修改 UDF 以通过测试 vFind 并确保它是 2D 数组来处理该问题。这也将允许使用带有逗号分隔符的数组常量(附加代码是在下面第一行和最后一行代码之间看到的代码。

...
vFind = FindText  'will create array if FindText is a range

'make sure vFind is 2D (if array)
On Error Resume Next
    J = UBound(vFind, 2)
    If Err.Number <> 0 Then vFind = WorksheetFunction.Transpose(vFind)
On Error GoTo 0

If IsArray(vFind) Then
...

【讨论】:

  • 用空格连接 SEARCH findtext 和 insidetext 效果非常好!我刚刚用更多嵌套的 IF 扩展了我的 IF,以考虑标点符号的可能性。下面的公式涵盖(黑色)、黑色/红色和(黑色/红色)。粗鲁,但它有效。如果我遇到任何其他实例,我将添加额外的嵌套 IF。谢谢@Ron
  • 公式供参考:=IF(SUMPRODUCT(--ISNUMBER(SEARCH(" "&amp;Table1[Color name]&amp;" "," "&amp;A1&amp;" ")))&gt;0,"Cannot include colour",IF(SUMPRODUCT(--ISNUMBER(SEARCH("/"&amp;Table1[Color name]&amp;"/","/"&amp;A1&amp;"/")))&gt;0,"Cannot include colour",IF(SUMPRODUCT(--ISNUMBER(SEARCH("("&amp;Table1[Color name],A1)))&gt;0,"Cannot include colour",IF(SUMPRODUCT(--ISNUMBER(SEARCH(Table1[Color name]&amp;")",A1)))&gt;0,"Cannot include colour",""))))
  • @Mr.J 我建议使用正则表达式的 VBA 解决方案,而不是这样复杂的公式。我将编辑我的答案来演示。
  • 这是完美的,而且更容易管理。再次感谢您的帮助!
  • @AndreTerra 它是对如何将范围读入 VBA 数组的改编。基本上v = myRange 将创建一个基于一个的二维数组,其中第一个维度表示行,第二个维度表示列。受到您的评论的启发,我应该补充一点,所写的 UDF 仅适用于垂直范围数组(我应该对此进行注释,但我没有这样做)。但它可以修改为适用于水平范围(甚至多行和多列)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 2019-04-23
相关资源
最近更新 更多