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