Die Community zu .NET und Classic VB.
Menü

FAQ 0029: Wie oft kommt ein bestimmter Text in meinem String vor?

 von 

Frage 

Wie oft kommt ein bestimmter Text in meinem String vor?

Die hier gezeigten Quelltexte stammen von pks und Helge Rex.

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."

Listing 1: Sequentiell Zeichen zählen

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."

Listing 2: Obergrenze des mittels Split erzeugten Feldes ermitteln

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."

Listing 3: Suchtext mit Replace entfernen

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

Listing 4: Position ermitteln

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.