如何使用Excel的“= SUMPRODUCT( – ISNUMBER(SEARCH …)”函数来排除“复杂的复合”结果?

我试图validation产品说明列表,以突出显示产品颜色在其描述中使用的任何实例。

我有一个颜色列表…

Example: Blue Red Green Yellow Purple etc. 

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

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

其中Table1[Colours]包含我的颜色文本string列表, A1包含我的第一个产品说明。

Dave Bruns @ ExcelJet对任何想要使用SUMPRODUCT / ISNUMBER / SEARCH组合的人都有很好的阅读 。

如果产品说明包含在我的Table1[Colours]列表中指定的Table1[Colours]则公式将生成"Cannot include a colour"以提醒用户这是不允许的。

例如:“Garmin先行者10运行运动表绿色

我面临的第一个问题是,当我的当前公式处理产品说明包含复合词包含颜色…

例如:“ 黑莓 Z10智能手机”

这不正确地使描述无效,因为本文中的string"Black"不被用于描述产品的颜色。

正如标题所示,我的主要问题在于取代复杂的复杂词汇。

…我的Table1[Colours]列表不仅仅包含基本的主颜色,次颜色和第三色,还包括珊瑚,紫红色和棕褐色等更具异国情调的颜色。

当产品描述包含“Stand”这样的词时,会导致复杂化。

为什么这是你可能想到的问题? 立场包含我的一个奇特的颜色“谭”

S- Tan- d

不幸的是,这也导致我的公式处理 。 (讨厌的权利?)

我正在寻找的解决scheme是对现有公式的补充=IF(SUMPRODUCT(--ISNUMBER(SEARCH(Table1[Colors],A1)))>0,"Cannot include a colour","")可能出现的“复杂化合物”可以通过可接受单词的计数器列表(例如表Table2[Exceptions]或通过野外梳理search以匹配没有前缀或后缀的确切颜色(该选项将不得不考虑一个双色,用/例如“黑/红”隔开,所以用一些标点符号例外来进行拼接)?

…这一切都有点可怕和不方便。

任何意见表示赞赏。

谢谢J先生

你需要search单词边界。 如果你在颜色的开头和结尾添加一个space ,并且在你的描述的开始和结尾添加一个space ,那么应该根据你的数据去做。 所以你的公式的search部分可以读取:

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

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

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

如果您有连字符的颜色,例如: blue-green或像Cherry3的颜色,则需要在表格中分别列出它们。

编辑 :作为您的评论表明一个更复杂的情况,我会build议用户定义function(UDF)易于维护。

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

用法示例:

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

该代码使用Word边界的正则expression式令牌。 单词边界是集合[0-9A-Za-z_]中的字符与该集合中不包含的任何字符相邻的点,或者与string的开头或结尾相邻的点。 这应该涵盖所有你的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来通过testingvFind来处理,并确保它是一个二维数组。 这也可以使用逗号分隔符的数组常量( 附加代码是在下面的代码的第一行和最后一行之间看到的)。

 ... 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 ...