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

时间:2016-06-09 09:57:13

标签: excel colors excel-formula wildcard formula

我正在尝试验证产品说明列表,以突出显示产品颜色在其说明中使用过的所有情况。

我有一份颜色列表......

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跑步运动表绿色

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

实施例: “黑色浆果Z10智能手机”

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

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

...我的Table1[Colours]列表不仅包含基本的Primary,Secondary和Tertiary颜色,还有更多异国情调的颜色,如Coral,Fuchsia和Tan。

当产品说明包含“Stand”之类的单词时,这会导致复杂化。

为什么这可能是您在想的问题? Stand包含我异国情调的颜色'Tan'

S-的 -d

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

我正在寻找的解决方案是我现有公式=IF(SUMPRODUCT(--ISNUMBER(SEARCH(Table1[Colors],A1)))>0,"Cannot include a colour","")的补充,它通过可接受单词的计数器列表(例如Table2[Exceptions])或者/来计算可能出现的“复杂化合物”。通过野外梳理搜索匹配确切的颜色,没有前缀或后缀(此选项必须允许双色分隔 where REGEXP_LIKE(data, ALL(input1,input2)) 的可能性,例如“黑/红”,所以带有一定标点符号的野性梳理异常?)

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

感谢任何建议。

谢谢,J先生

1 个答案:

答案 0 :(得分:2)

您需要搜索单词边界。如果您在颜色的开头和结尾添加space,也可以在说明的开头和结尾添加SEARCH(" " &Table1[Colors]& " "," "&A1&" ") ,这取决于您的数据。因此,公式的搜索部分可以是:

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

或者,对于整个公式:

blue-green

如果您使用带连字符的颜色,例如:Cherry3或颜色为findtext,则需要在表格中单独列出。

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

以下UDF可以接受;范围,单个字符串或由多个字符串组成的数组常量。如果使用数组常量,则必须使用分号=IF(reMatch(Table1[Colors],A1),"Cannot include a colour","") 而不是逗号作为分隔符。

用法示例:

[0-9A-Za-z_]

代码使用Word边界的正则表达式标记。单词边界是集合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!可以是一系列单元格;但是,该范围必须是单列垂直范围。如果是水平范围,该函数将返回... 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 ... 错误。如有必要,可以修改UDF以通过测试vFind并确保它是2D数组来处理它。这也可以使用带逗号分隔符的数组常量(附加代码可以在下面的第一行代码和最后一行代码之间看到。

self.sortInfo = ko.observable();
self.sortOnServer = ko.observable(false);
self.sortInfo.subscribe(function (data) {
     self.sortOnServer(!self.sortOnServer());
     if (!self.sortOnServer()) return;
     paginationInfo.SortColumnName = self.sortInfo().column.field;
     if (self.sortInfo().direction === 'desc') {
         paginationInfo.DescendingSort = true;
     } else {
         paginationInfo.DescendingSort = false;
     }
     showLoading();
     self.getPagedDataAsync(self.pagingOptions.pageSize(), self.pagingOptions.currentPage(), self.filterOptions.filterText());
});

self.gridOptions = {
        data: self.results,
        enablePaging: true,
        pagingOptions: self.pagingOptions,
        filterOptions: self.filterOptions,
        columnDefs: self.columns,
        displaySelectionCheckbox: false,
        rowHeight: 20,
        selectWithCheckboxOnly: true,
        jqueryUIDraggable: true,
        useExternalSorting: true,
        sortInfo: self.sortInfo
    };