如何使用 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”而不是数字
我正在尝试验证产品描述列表,以突出显示在其描述中使用了产品颜色的任何实例。
我有一个颜色列表...
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”而不是数字