Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple string search with InStr in VBA

Tags:

excel

vba

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.

'Checking whether name is starts with Mr./Mrs./Ms./Dr. or not
If Not FindString(LCase(Me.gname.Value), LCase("Mr")) Then
    MsgBox "Consumer Name Starts with Mr./Mrs./Ms./Dr. Check Consumer Name"
    Cancel = True
    Exit Sub
End If

'Here is the Find String function i created
Function FindString(strCheck As String, strFind As String) As Boolean
    Dim intPos As Integer

    intPos = 0
    intPos = InStr(strCheck, strFind)
    FindString = intPos > 0
End Function
like image 937
Vishwabandhu Kumar Avatar asked Jul 26 '14 15:07

Vishwabandhu Kumar


2 Answers

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
like image 126
Jagadish Dabbiru Avatar answered Nov 14 '22 22:11

Jagadish Dabbiru


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
like image 22
Alex K. Avatar answered Nov 14 '22 22:11

Alex K.