FAQ 0029: Wie oft kommt ein bestimmter Text in meinem String vor?
von Helge Rex
Frage
Zeichen für Zeichen
Man kann die Zeichen des Strings nacheinander durchlaufen und die Vorkommen zählen.
Dim lngCount As Long Dim lngLen As Long lngCount = 0 For lngLen = 1 To Len(MeinString) - Len(SuchText) + 1 If (UCase$(Mid$(MeinString, lngLen, Len(SuchText))) = _ UCase$(SuchText)) Then lngCount = lngCount + 1 End If Next lngLen Debug.Print SuchText & " kommt " & CStr(lngCount) & " mal vor."
Dieser Code hat den Vorteil, daß er auch unter VB5 oder Office97 läuft. Nachteilig ist, daß der Code langsam ist.
Als Array handhaben
Mit Split() kann man den Text zerlegen und die Obergrenze als Anzahl verwenden.
Die Obergrenze erhält man mit der Funktion UBound(). Auffällig ist, daß die Untergrenze ignoriert wird. Das kann man machen, weil LBound() hierbei 0 zurückgibt.
Dim lngCount As Long lngCount = UBound(Split(MeinString, SuchText, , vbTextCompare)) Debug.Print SuchText & " kommt " & CStr(lngLen) & " mal vor."
Dieser Code ist deutlich schneller als der erste Code, funktioniert aber erst ab VB6 bzw. Office2000.
Zu beachten ist, daß der Code ein falsches Ergebnis liefert, wenn Option Base auf etwas anderes als 0 gesetzt wird, da Split immer ein Datenfeld zurückgibt, welches bei 0 beginnt.
Suchtext entfernen
Mit Replace$() kann man den Suchtext aus dem Original entfernen. Die geänderte Länge gibt dann die Häufigkeit des Suchtextes an.
Dim lngCount As Long lngCount = (Len(MeinString) - Len(Replace$(MeinString, SuchText, _ vbNullString, , , vbTextCompare))) \ Len(SuchText) Debug.Print SuchText & " kommt " & CStr(lngLen) & " mal vor."
Dieser Code ist ebenfalls deutlich schneller als der erste Code, funktioniert aber ebenfalls erst ab VB6 bzw. Office2000.
Positionen zählen
Der folgende Code zeigt, wie man die Position des Suchtextes ermittelt und die Anzahl entsprechend erhöht.
' Beispiel von pks Function CountCharFromString(sSource As String, sSearch As String, _ CompareMethod As VbCompareMethod) As Long Dim i As Long, j As Long Dim k As Long, z As Long i = 1 k = Len(sSearch) Do j = InStr(i, sSource, sSearch, CompareMethod) If j = 0 Then Exit Do End If z = z + 1 i = j + k Loop CountCharFromString = z End Function
Hinweise
Anmerkung von Eckhart Wörner:
Die verschiedenen Methoden funktionieren nicht immer gleich. Wird als MeinString beispielsweise "aaa" genommen und als SuchText "aa", so liefern die Methoden 2 und 3 als Häufigkeit "1", die Methoden 1 und 4 jedoch als Häufigkeit "2".
Anmerkung von Florian Rittmeier:
Wer auf Geschwindigkeit steht oder nicht VB6 sein Eigen nennt, der sollte sich auch FAQ 0049: Ersatz für einige Stringfunktionen ansehen.
Ihre Meinung
Falls Sie Fragen zu dieser FAQ haben, Ihre Erfahrung mit anderen Nutzern austauschen möchten oder auf eine Ergänzung hinweisen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.