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