Excel公式:如果单元格包含子字符串"这个" AND不包含子串"那"

时间:2016-11-08 23:15:00

标签: excel excel-vba vba

我试图编写一个函数,其中一列包含一个子字符串,但不包含另一个子字符串。

在下面的示例中,如果我的行包含"某些项目"我希望我的函数返回1。并且不包含"开销"。

row| example strings             | desired return value
0  |some project,other project   | 1
1  |some project                 | 1
2  |overhead                     | 0
3  |some project, overhead       | 0
4  |some project, other, boo     | 1

我试图先用精确的字符串来制定它,例如:

=IF(AND((E3="some project"),NOT(E3="overhead")),1,0)

但这只能为第1行和第2行提供正确的结果,因为它只对字符串执行精确的运算而不是在子字符串上进行匹配。

3 个答案:

答案 0 :(得分:3)

你需要的是某种子串函数。我认为FIND可能有效。查看此页面:https://exceljet.net/excel-functions/excel-find-function

您的功能如下: =IF(AND(ISERROR(FIND("some project", E3))=FALSE,ISERROR(FIND("overhead",E3))),1,0)

编辑:上述功能在测试后有效

这里的棘手部分是FIND返回字符串的起始位置,如果失败则返回#VALUE,我相信你可以使用ISERROR()函数。这绝不是一个美丽的解决方案。我会尝试利用后面的代码并写下这是VBA,因为我确信在VBA中有一个正确的substring函数。

答案 1 :(得分:3)

如果您可以插入一些VBA代码,那么您可以使用如下自定义函数:

=StrContains(E3, "some project", "overhead")

如果E3中的值包含这两个子串中的,则会返回True。此功能主要依赖于VBA的Instr function,其中

功能代码:

Public Function StrContains(ByRef cl As Excel.Range, ParamArray strings() As Variant)
'Function returns TRUE if the range contains ALL of the passed substring items
' uses ParamArray to allow varying number of substring items
' Ex:
' =StrContains(A1, "something", "else", "foo")
'
Dim val$
Dim s
Dim i As Integer
Dim ret As Boolean
Dim length As Integer

length = UBound(strings) + 1
val = cl.Value2

For Each s In strings
    If InStr(1,val, s) <> 0 Then
        i = i + 1
    End If
Next

ret = (i = length)
StrContains = ret
End Function

您可以相对轻松地修改它以区分大小写,或者可选地接受部分匹配等。以下是对这两个概念的扩展:

=StrContains(E3, False, True, "some project", "overhead")

功能代码:

Public Function StrContains(ByRef cl As Excel.Range, MatchCase As Boolean, MatchAll as Boolean, ParamArray strings() As Variant)
'MatchAll is matching switch, use True to require ALL matching items, or False to allow for fewer.
'MatchCase is the Case-sensitive switch, use False to ignore case.
' uses ParamArray to allow varying number of substring items
' Ex:
' =StrContains(A1, "something", "else", "foo")
'
Dim val$
Dim s
Dim i As Integer
Dim ret As Boolean
Dim length As Integer

length = UBound(strings) + 1
val = cl.Value2

If Not MatchCase Then
    val = LCase(val)
    For i = lBound(strings) to UBound(strings)
        strings(i) = lcase(strings(i))
    Next
Next


For Each s In strings
    If InStr(val, s) <> 0 Then
        i = i + 1
    End If
Next

ret = (i = IIF(MatchAll, length, 1))
StrContains = ret
End Function

答案 2 :(得分:2)

您实际上可以使用SEARCH功能,如下所示:

=IF(ISNUMBER(SEARCH("some project",B2)),NOT(ISNUMBER(SEARCH("overhead",B2)))*1,0)

<强>考虑

  • https://youtu.be/imsr8NrIAMs功能:返回一个数字或错误(这就是我使用ISNUMBER的原因,你实际上也可以使用SEARCH)。此功能不区分大小写。对于区分大小写,您可以使用ISERROR,在上一个公式中,=IF(ISNUMBER(FIND("some project",B2)),NOT(ISNUMBER(FIND("overhead",B2)))*1,0)
  • FIND function:返回FALSE或TRUE。我只是将TRUE或FALSE乘以1,将结果转换为1或0.

希望帮助