“不包含”的函数(InStr()= 0)

时间:2019-07-08 20:15:42

标签: excel vba

我正在使用从用户Mathieu Guindon收获的功能,该功能允许快速检查单元格中是否包含任何字符串集,而不必使用[Authorize(Roles = "admin")] public class CmsControllerBase : Controller { } 等。该部分的效果很好,但是我现在需要对其进行修改,以创建另一个函数,该函数检查单元格中是否也没有包含任何字符串集,并且我无法获取它来返回所需的结果。

我放入了一系列虚拟变量,以检查代码是否按预期工作,似乎问题是当我要求新函数(InStr() Or InStr() Or)搜索多个字符串时-再次, DoesNotContainAny功能运行完美。

ContainsAny

在此先感谢您可以传授的智慧或见识!

ColF         ColG      Returned      Correct
H54          H54          False        False  
H54                        True         True  
L20, H54     H54          False        False  
B18          B18          False        False  
             B18           True         True  
L20, B18     B18           True        False    <-- issue

1 个答案:

答案 0 :(得分:0)

DoesNotContainAny是一个令人困惑的名称。可能尚不清楚立即确定的内容:一个字符串只有一些选项,但不是全部,或者一个字符串完全没有任何选项。

negative sense命名的函数就是这样。

使用积极意义,对于前一种情况,您可以调用该函数LacksSome(),对于后一种情况,您可以调用ContainsNone()。 然后,您会注意到LacksSome()仍然是负名称,并且您将设计一个相反的函数ContainsAll(),该函数最终被完全肯定地命名,并且您将其称为Not ContainsAll()表示“至少缺少一个”。

要实施ContainsAll(),您会注意到,您可以通过更改一行并添加另一行来轻松地从现有ContainsAny()中获取它:

' Former ContainsAny
Public Function ContainsAll(ByVal data As String, ByVal caseSensitive As Boolean, ParamArray searchterms() As Variant) As Boolean
    Dim k As Integer
    Dim found As Boolean

    found = True  ' Added
    For k = LBound(searchterms) To UBound(searchterms)
        found = Contains(data, CStr(searchterms(k)), caseSensitive)
        If Not found Then Exit For  ' Changed
    Next
    ContainsAny = found
End Function

关于实现ContainsNone()的过程,您会注意到“不包含”表示“不包含任何”,并且您已经拥有ContainsAny(),因此您可以调用{ {1}}。