Public Function InStrRev07( _ ByRef Check As String, _ ByRef Match As String, _ Optional Start As Long, _ Optional Compare As VbCompareMethod = vbBinaryCompare _ ) As Long ' By Guy Gervais, ggervais@videotron.ca, 22 Nov 2001 Dim SAchk As SAFEARRAY1D Dim iChk() As Integer Dim iLChk As Long Dim SAmat As SAFEARRAY1D Dim iMat() As Integer Dim iLMat As Long Dim i As Long Dim j As Long Dim m As Long Dim t As Long iLChk = Len(Check) If iLChk = 0 Then Exit Function iLMat = Len(Match) If iLMat = 0 Then If Start <= iLChk Then InStrRev07 = Start Exit Function End If With SAchk .cDims = 1 .cbElements = 2& .cElements = iLChk .fFeatures = FADF_AUTO Or FADF_FIXEDSIZE .pvData = StrPtr(Check) End With CopyMemory ByVal VarPtrArray(iChk), VarPtr(SAchk), 4 With SAmat .cDims = 1 .cbElements = 2& .cElements = iLMat .fFeatures = FADF_AUTO Or FADF_FIXEDSIZE .pvData = StrPtr(Match) End With CopyMemory ByVal VarPtrArray(iMat), VarPtr(SAmat), 4 If Start = 0 Then Start = iLChk If Compare Then For i = 0 To UBound(iMat) Select Case iMat(i) Case 97 To 122, 224 To 246, 248 To 254 iMat(i) = iMat(i) And 223& End Select Next Select Case iLMat Case 1 For i = Start - 1 To 0 Step -1 Select Case iChk(i) Case 97 To 122, 224 To 246, 248 To 254 m = (iChk(i) And 223&) = iMat(0) Case Else m = (iChk(i) = iMat(0)) End Select If m Then InStrRev07 = i + 1 Exit For End If Next Case Else For i = Start - (UBound(iMat) + 1) To 0 Step -1 Select Case iChk(i) Case 97 To 122, 224 To 246, 248 To 254 m = (iChk(i) And 223&) = iMat(0) Case Else m = (iChk(i) = iMat(0)) End Select If m Then For j = 1 To UBound(iMat) t = i + j Select Case iChk(t) Case 97 To 122, 224 To 246, 248 To 254 m = (iChk(t) And 223&) = iMat(j) Case Else m = (iChk(t) = iMat(j)) End Select If m = 0 Then Exit For Next If m Then InStrRev07 = i + 1 Exit For End If End If Next End Select Else ' Binary compare Select Case iLMat Case 1 For i = Start - 1 To 0 Step -1 If iChk(i) = iMat(0) Then InStrRev07 = i + 1 Exit For End If Next Case 2 For i = Start - 2 To 0 Step -1 If iChk(i) = iMat(0) Then If iChk(i + 1) = iMat(1) Then InStrRev07 = i + 1 Exit For End If End If Next Case 3 For i = Start - 3 To 0 Step -1 If iChk(i) = iMat(0) Then If iChk(i + 1) = iMat(1) Then If iChk(i + 2) = iMat(2) Then InStrRev07 = i + 1 Exit For End If End If End If Next Case Else For i = Start - UBound(iMat) To 0 Step -1 If iChk(i) = iMat(0) Then m = 1 For j = 1 To UBound(iMat) If iChk(i + j) <> iMat(j) Then m = 0 Exit For End If Next If m Then InStrRev07 = i + 1 Exit For End If End If Next End Select End If SAchk.pvData = 0 SAmat.pvData = 0 End Function