VBA Tipp: Position des x-ten Vorkommens zurückgeben

Aus DBWiki
Wechseln zu: Navigation, Suche

Anforderung

Ich möchte die Position des wievielten Auftretens einer Zeichenfolge innerhalb einer anderen Zeichenfolge ermitteln, und als Wert vom Typ Variant (Long) zurückgeben. Unterschiede zwischen Groß- und Kleinschreibung können optional als Argument angegeben werden.

Die Access-Funktion InStr() gibt einen Wert vom Typ Variant (Long) zurück, der die Position des ersten Auftretens einer Zeichenfolge innerhalb einer anderen Zeichenfolge ausgibt. Im ersten optionalen Argument kann die Position festgelegt werden, an der die Suche beginnt, wovon die Lösung Gebrauch macht.

Lösung

Die Funktion wird in einem allgemeinen VBA-Modul hinterlegt.

Public Function InStrPos(String1 As Variant, _
                         String2 As Variant, _
                         Optional ByVal Occurence As Long = 1, _
                         Optional ByVal Compare As VbCompareMethod _
                                        = vbTextCompare) As Variant
 
   'Eingabe:
   '  String1     Variant   Zeichenfolge, die untersucht wird
   '  String2     Variant   Zeichenfolge, die gesucht wird
   '  Occurence   Long      (optional) Position des wievielten Vorkommens,
   '                        das ausgegeben werden soll
   '                        Standard = 1
   '                        Bei Werten < 1, wird Occurence auf 1 gesetzt
   '  Compare     Enum/Long (optional) Verwendete Vergleiohsmethode
   '                        Standard = vbTextCompare (Groß- und Kleinschreibung
   '                        werden gleich behandelt)
   '
   'Rückgabe:
   '  Funktionswert         Position des ersten Zeichens von String2
   '                        0 bei keinem Treffer
   '                        Null, falls String1 oder String2 Null ist
 
   'Quelle: http://www.dbwiki.net/
 
 
   Dim i      As Long
   Dim length As Long
   Dim pos    As Long
 
   If IsNull(String1 + String2) Then InStrPos = Null: Exit Function
 
   If Occurence < 1 Then Occurence = 1
   length = Len(String2)
   pos = InStr(String1, String2, Compare)
   Do While pos > 0
      i = i + 1
      If i = Occurence Then Exit Do
      pos = InStr(pos + length, String1, String2, Compare)
   Loop
 
   InStrPos = pos
 
End Function

Aufruf

   'Suche das dritte Vorkommen der Zeichenfolge 'i'
   Debug.Print InStrPos("Ich bin ein Suchtext", "i", 3) 'ergibt 10
 
   'Suche das zweite Vorkommen der Zeichenfolge 'text'
   Debug.Print InStrPos("Ich bin ein Suchtext", "text", 2) 'ergibt 0
Wiki hinweis.png

Anmerkung:

Zur Zeit ist die Funktion so ausgelegt, dass bei einer Suche nach xx in xxxx Treffer 1 die Position 1 und Treffer 2 die Position 3 ausgibt. Wer möchte, dass Position 1, 2 und 3 als Suchtreffer gezählt werden, der lege für length den Wert 1 fest oder erweitere die Funktion um ein Argument mit einem Boolean-Flag, das zur Unterscheidung bei der Suche herangezogen werden kann und lege length entsprechend fest.


Weblinks