如何使用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 ...