Das letzte Vorkommen einer Zeichenfolge in einem String

15.12.2006
Es gibt zahlreiche Situationen, in denen es nicht nur wichtig ist, zu ermitteln, ob eine Teilzeichenfolge in einer Zeichenkette vorkommt, sondern auch, wo sein letztes Vorkommen in der Zeichenkette beginnt. Das ist gar nicht so einfach, zumindest dann nicht, wenn der Code auch in Access 97 noch funktionieren soll.

Auf den ersten Blick scheint es recht simpel, das letzte Vorkommen einer Zeichenfolge in einer anderen zu finden. Sie drehen die Zeichenkette einfach mit der strReverse-Funktion um und ermitteln dann das erste Vorkommen. Dann müssen Sie noch die ermittelte Position von der Länge der Zeichenkette abziehen und haben die Position des Vorkommens in der Originalzeichenkette.

Leider funktioniert das so nicht. Es gibt dabei gleich mehrere Probleme.

Die Funktion zur Problemlösung

Um das Problem zu lösen, müssen Sie sich also eine eigene Funktion schreiben. Sie benötigt zwei Parameter. Der erste bestimmt die zu durchsuchende Zeichenkette und der zweite die zu suchende Zeichenkette.

Innerhalb der Funktion rufen Sie zunächst die InStr-Funktion auf und ermitteln so das erste Vorkommen der gesuchten Teilzeichenfolge. Liefert die Funktion einen Wert größer als 0, wird die While-Schleife betreten, die so lange läuft, bis die gesuchte Zeichenfolge nicht mehr gefunden wird.

Mit der Suche wird dabei immer nach der letzten Fundstelle begonnen. Um aber das zuletzt ermittelte Vorkommen auch aus der Funktion zurückgeben zu können, wird vor einer neuen Suche mit der Instr-Funktion der alte Wert der Variablen lngPos in der Variablen lngPosAlt gespeichert.

Rufen Sie die Funktion dann beispielsweise mit Debug.Print letztesVorkommen("C:\test\testalswkd. mdb", "\") auf, gibt diese den Wert 8 zurück, weil das "/" an Position 8.

Function letztesVorkommen(strText As String, strTZ As String) As Long
Dim lngPos As Long
Dim lngPosAlt As Long
lngPos = InStr(1, strText, strTZ)
Do While (lngPos > 0)
lngPosAlt = lngPos
lngPos = InStr(lngPos + Len(strTZ), strText, strTZ)
Loop
letztesVorkommen = lngPosAlt
End Function