如何使用 Excel 的“=SUMPRODUCT(--ISNUMBER(SEARCH...”函数排除 'complicated compounded' 结果?

How do I use Excel's "=SUMPRODUCT(--ISNUMBER(SEARCH..." function to exclude 'complicated compounded' results?

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

我有一个颜色列表...

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 为任何想要使用 SUMPRODUCT/ISNUMBER/SEARCH 组合的人提供了很棒的 read)

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

例子: "Garmin Forerunner 10 Running Sportswatch Green"

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

例子: "黑色berry Z10 智能手机"

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

如标​​题所示,我的主要问题在于智取 'complicated compound' 单词...

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

当产品描述包含 "Stand".

这样的词时,这会导致复杂化

为什么您可能会想到这个问题?展台包含我的一种异国情调的颜色 'Tan'

S-棕褐色-d

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

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

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

如有任何建议,我们将不胜感激。

谢谢J先生

您需要搜索单词 boundaries。如果您将 space 添加到颜色的开头和结尾,以及描述的开头和结尾,那么根据您的数据应该可以解决问题。所以你的公式的搜索部分可以是:

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

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

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

如果您有带连字符的颜色,例如:blue-green,或类似 Cherry3 的颜色,您需要在 table.

中单独列出它们

编辑:正如您的评论所暗示的情况要复杂得多,我建议使用用户定义函数 (UDF) 以便于维护。

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

用法示例:

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

该代码使用 Regex 标记作为词边界。单词边界是集合 [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 可以是一系列单元格;但是,该范围必须是单列垂直范围。如果是水平范围,函数将return #VALUE! 错误。如有必要,可以修改 UDF 以通过测试 vFind 并确保它是一个二维数组来处理该问题。这也将允许使用带有逗号分隔符的数组常量(附加代码是在下面第一行和最后一行代码之间看到的代码。

...
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
...
=SUMPRODUCT(  ($G:$G9 >= $E4) *  ($G:$G9 <= $F4 ) * (EXACT($E165,$F:$F9)))

最好使用“EXACT”而不是数字