Multiple string search with InStr in VBA

前端 未结 3 1642
耶瑟儿~
耶瑟儿~ 2021-01-18 18:11

I am checking whether a Name textbox starts with Mr. Mrs. Ms. etc.

I created a function but I am not able to compare more than one string.

Here is my code.

相关标签:
3条回答
  • 2021-01-18 18:40

    Pass strFind as group of strings seperated by a delimiter ex:-

    FindString(LCase(Me.gname.Value), LCase("Mr;Mrs;Ms;Dr"))
    

    Now split them and compare using a loop.

    Arr = Split(strFind,";")
    Flag = 0
    
    For Each str in Arr    
      If InStr(strCheck, str) > 0 Then
      Flag = 1    
      End If
    Next
    If Flag = 1 Then
      FindString = True
    Else
      FindString = False
    End If
    
    0 讨论(0)
  • 2021-01-18 18:42

    Pass a list of tokens to search for using a ParamArray and loop each looking for a match.

    You can use vbTextCompare to enforce case sensitivity.

    Remember that starts with is different from contains.

    '// you can pass as many prefixes as you like
    If StringStarts(Me.gname.Value, "Mr", "Mrs", "Dr", "Supreme Commander", "Capt.") Then
        MsgBox "Consumer Name Starts with Mr./Mrs./Ms./Dr. Check Consumer Name"
    
    ... 
    
    Function StringStarts(strCheck As String, ParamArray anyOf()) As Boolean
        Dim item As Long
        For item = 0 To UBound(anyOf)
            If InStr(1, strCheck, anyOf(item), vbTextCompare) = 1 Then
                StringStarts = True
                Exit Function
            End If
        Next
    End Function
    

    Or better with a RegEx to allow optional . and not match Mruku

    StringStarts(Me.gname.Value, "Mr|Mrs|Ms|Dr")
    
    ...
    
    Function StringStarts(strCheck As String, options As String) As Boolean
        With CreateObject("VBScript.RegExp")
            .IgnoreCase = True
            .Pattern = "^(" & options & ")\.*\b"
    
            StringStarts = .Test(strCheck)
        End With
    End Function
    
    0 讨论(0)
  • 2021-01-18 18:52

    This is my version of @AlexK great answer. While it solved the OP's original problem I wanted to share a more generalized answer for others to benefit from.

    Here is how I used the Function:

    Public Sub InString_Test()
    
    Dim WS As Worksheet
    Set WS = ThisWorkbook.Sheets("Sheet1")
    
    Dim rcell As Range, rng As Range
    Set rng = WS.Range("A1:A" & WS.UsedRange.Rows.Count)
    For Each rcell In rng.Cells
    
    If InStrFunc(Range(rcell.Address), "TEST", "CAT") Then
       MsgBox "String Found in " & rcell.Address
    End If
    
    Next rcell
    
    End Sub
    
    Function InStrFunc(strCheck As String, ParamArray anyOf()) As Boolean
        Dim item As Long
        For item = 0 To UBound(anyOf)
            If InStr(1, strCheck, anyOf(item), vbTextCompare) <> 0 Then
                InStrFunc = True
                Exit Function
            End If
        Next
    End Function
    
    0 讨论(0)
提交回复
热议问题