我正在尝试验证产品说明列表,以突出显示产品颜色在其说明中使用过的所有情况。
我有一份颜色列表......
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先生
答案 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
};