Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

instr instrrev - xtes Auftreten eines Strings

Forumthread: instr instrrev - xtes Auftreten eines Strings

instr instrrev - xtes Auftreten eines Strings
Peter
Guten Tag
Ich kenne die Funktionen instr und instrrev
Damit kann ich in einem String von links resp. von rechts ein bestimmter String (z.B. " ") lokalisieren.
Mit diesen Funktionen lokalisiere ich immer das erste Vorkommen von links oder von rechts. Gibt es eine Lösung (und wie lautet sie), damit ich beispielsweise das dritte Auftreten eines Strings von links resp. rechts lokalisieren kann?
Gruss, Peter
Anzeige
Lösung per UDF
02.12.2011 16:46:09
NoNet
Hallo Peter,
direkt kann man das leider nicht mit in den vorhandenen Funktionen angeben.
Ich empfehle Dir, dafür eine kleine UserDefindedFunction (UDF) zu erstellen, mit der Du das lösen kannst.
Hier ein kleines Beispiel :
Public Function InstrN(strText As String, strZ As String, Optional lngN As Long)
'Aufruf: MsgBox INSTRN("Das ist ein kleines Beispiel"," ",3) '=> ergibt 12
Dim lngI As Long, lngS As Long
If IsMissing(lngN) Then
InstrN = InStr(strText, strZ)
Else
If UBound(Split(strText, strZ)) 
Gruß, NoNet
Anzeige
UDF-Grundlagenforschung : IFMISSING()
02.12.2011 16:52:08
NoNet
Hey Peter,
das kommt davon, wenn man nicht täglich UDFs mit variablen Parametern erstellt :
IFMISSING() funktioniert nur mit Variablen vom Typ VARIANT (und nicht wie von mir im ersten Code-Beispiel verwendet mit LONG !)
Hier also der korrigierte Code :
Public Function InstrN(strText As String, strZ As String, Optional varN)
'Aufruf: MsgBox INSTRN("Das ist ein kleines Beispiel"," ",3) '=> ergibt 12
'Variante: MsgBox INSTRN("Das ist ein kleines Beispiel"," ") '=> ergibt 4 (1.Auftreten)
Dim lngI As Long, lngS As Long
If IsMissing(varN) Then
InstrN = InStr(strText, strZ)
Else
If UBound(Split(strText, strZ)) 
Salut, NoNet
Anzeige
AW: UDF-Grundlagenforschung : IFMISSING()
02.12.2011 17:44:27
Peter
Hallo NoNet
Vielen Dank für den Code. Ich dachte schon, jetzt fehle nur noch die Auswertung von der rechten Seite her ...
Doch wenn ich die Ergebnisse richtig interpretiere, stimmt etwas noch nicht:
vgl. hochgeladene Datei:
Auf Zeile 7 ist das Ergebnis der UDF 6, der String hat jedoch nur 5 Stellen.
Auf Zeile 10 ist das Ergebnis der UDF 25, der String hat jedoch nur 25 Stellen.
Oder habe ich etwas falsch verstanden?
Gruss, Peter
https://www.herber.de/bbs/user/77797.xlsm
Anzeige
AW: UDF-Grundlagenforschung : IFMISSING()
03.12.2011 10:39:29
Peter
Hallo NoNet
Ich will dich ja nicht drängen, wäre jedoch super, wenn du meine hochgeladene Datei mal anschauen könntest. Da stimmt mit dem Code etwas noch nicht. Manchmal wir eine Stelle mit dem gesuchten String ausgegeben, die gar nicht exisitiert (Länge = x; zurückgegebene Zahl x + 1).
Vielen Dank und Gruss, Peter
Anzeige
AW: UDF-Grundlagenforschung : IFMISSING()
03.12.2011 12:44:44
Gerd
Hallo Peter,
ich würde das so prüfen:
Public Function InstrN(strText As String, strZ As String, Optional varN)
'Aufruf: MsgBox INSTRN("Das ist ein kleines Beispiel"," ",3) '=> ergibt 12
'Variante: MsgBox INSTRN("Das ist ein kleines Beispiel"," ") '=> ergibt 4 (1.Auftreten)
Dim lngI As Long, lngS As Long
If IsMissing(varN) Then
InstrN = InStr(strText, strZ)
Else
If Len(strText) - Len(Replace(strText, strZ, "")) 
'Falls es kein n.Auftreten des Suchbegriffs gibt: Ergebnis auf 0 setzen
InstrN = 0
Else
For lngI = 0 To varN - 1
lngS = lngS + Len(Split(strText, strZ)(lngI)) + Len(strZ)
Next
InstrN = lngS
End If
End If
End Function
Gruß Gerd
Anzeige
AW: UDF-Grundlagenforschung : IFMISSING()
03.12.2011 13:40:28
Peter
Hallo Gerd
Das ist super - stimmt jetzt! Vielen Dank. Hättest du allenfalls Lust, das ganze noch mit InstrRev (also Abfrage x-te Position von rechts) zu machen? Leider blicke ich den Code nach Else nicht durch.
Public Function InstrRevN(strText As String, strZ As String, Optional varN)
...
...
If IsMissing(varN) Then
InstrRevN= InStrRev(strText, strZ)
Else
?
Gruss, Peter
Anzeige
AW: UDF-Grundlagenforschung : IFMISSING()
03.12.2011 14:02:54
Gerd
Hallo Peter,
soooviel Lust habe ich dazu nicht. Drehe den String u. den Suchtext mit einem zusätzlichen Parameter um.
Für meinen Teil ist es damit genug.
Public Function InstrN(strText As String, strZ As String, Optional varN, Optional  _
blnVonHinten = False)
'Aufruf: MsgBox INSTRN("Das ist ein kleines Beispiel"," ",3) '=> ergibt 12
'Variante: MsgBox INSTRN("Das ist ein kleines Beispiel"," ") '=> ergibt 4 (1.Auftreten)
Dim lngI As Long, lngS As Long
If blnVonHinten Then strText = StrReverse(strText): strZ = StrReverse(strZ)
If IsMissing(varN) Then
InstrN = InStr(strText, strZ)
Else
If Len(strText) - Len(Replace(strText, strZ, "")) 
Gruß Gerd
Anzeige
AW: UDF-Grundlagenforschung : IFMISSING()
03.12.2011 17:15:17
Peter
Hallo Gerd
StrReverse kannte ich nicht. Das ist ja hier sehr hilfreich. Ich wollte nicht die Suche der Position von Links und Rechts in die gleiche Funktion implementieren, sondern einfach zwei separate UDFs (instrN und instrRevN).
Mit der Kenntnis von StrReverse konnte ich jetzt in InstrRevN mit den zwei zusätzlichen Zeilen
strText = StrReverse(strText)
strZ = StrReverse(strZ)
dieses Ziel erreichen.
Vielen Dank und Gruss
Peter
Public Function InstrRevN(strText As String, strZ As String, Optional varN)
'Aufruf: MsgBox INSTRN("Das ist ein kleines Beispiel"," ",3) '=> ergibt 12
'Variante: MsgBox INSTRN("Das ist ein kleines Beispiel"," ") '=> ergibt 4 (1.Auftreten)
Dim lngI As Long, lngS As Long
strText = StrReverse(strText)
strZ = StrReverse(strZ)
.....
....
Anzeige
IFMISSING() ?
02.12.2011 21:35:50
Rudi
Hallo NoNet,
IFMISSING kenn ich (und mein VBA) nicht.
If IsMissing(Variable) hingegen schon.
Ist das neu in 2010?
Gruß
Rudi
@Rudi: IFKleinkariert() ;-)
02.12.2011 22:08:41
NoNet
Hey Rudi,
Du musst aber auch wirklich zu genau hinschauen !
Mein Excel 2010 kennt auch IFMISSING() und IFKLEINKARIERT() - aber beides nur als UDF :-P
Salut, NoNet
Anzeige
AW: instr instrrev - xtes Auftreten eines Strings
02.12.2011 17:03:40
CitizenX
Hi,
wenn ich dich richtig verstanden habe ,
hier mal 2 Möglichkeiten die Positionen des Suchstrings aufzulisten:
Option Explicit
Sub searchText()
Dim myString As String, strIndex As String
Dim Regex As Object, myItems, n
Set Regex = CreateObject("vbscript.regexp")
myString = "das Haus ist im Haus vom Haus"
With Regex
.Global = True
.Pattern = "Haus"
Set myItems = .Execute(myString)
End With
For Each n In myItems
strIndex = strIndex & n.firstindex & vbNewLine
Next
If myItems.Count > 0 Then MsgBox "Suchtext kommt im Text an den Stellen " & vbNewLine &  _
strIndex & "vor"
Set Regex = Nothing
End Sub
Sub searchText2()
Dim inText, n, strIndex As String
Dim myString As String, mySearch As String, myItems, lenTemp As Byte
mySearch = "Haus"
myString = "das Haus ist im Haus vom Haus"
myItems = Split(myString, mySearch)
For n = LBound(myItems) To UBound(myItems) - 1
strIndex = strIndex & Len(myItems(n)) + lenTemp & vbNewLine
lenTemp = lenTemp + Len(myItems(n)) + Len(mySearch)
Next
If UBound(myItems) > 0 Then MsgBox "Suchtext kommt im Text an den Stellen " & vbNewLine &  _
strIndex & "vor"
End Sub

Grüße
Steffen
Anzeige
AW: instr instrrev - xtes Auftreten eines Strings
02.12.2011 17:50:06
Peter
Hallo Steffen
Vielen Dank für die Lösung.
Ich habe mal mit einem anderen String getestet - meines Erachtens wird die Stelle von "x" um eine Position verschoben geliefert.
Oder darf ich nicht mit etwas anderem als einem Leerschlag probieren?
Gruss, Peter
;
Anzeige
Anzeige

Infobox / Tutorial

Strings in Excel VBA: Das x-te Auftreten eines Strings finden


Schritt-für-Schritt-Anleitung

Um das x-te Auftreten eines Strings in Excel VBA zu finden, kannst du eine User Defined Function (UDF) erstellen. Hier sind die Schritte:

  1. Öffne den Visual Basic for Applications (VBA) Editor in Excel (Alt + F11).

  2. Füge ein neues Modul hinzu (Rechtsklick auf „VBAProject“ > Einfügen > Modul).

  3. Kopiere den folgenden Code in das Modul:

    Public Function InstrN(strText As String, strZ As String, Optional varN)
        Dim lngI As Long, lngS As Long
        If IsMissing(varN) Then
            InstrN = InStr(strText, strZ)
        Else
            If Len(strText) - Len(Replace(strText, strZ, "")) < varN Then
                InstrN = 0
            Else
                For lngI = 0 To varN - 1
                    lngS = lngS + Len(Split(strText, strZ)(lngI)) + Len(strZ)
                Next
                InstrN = lngS
            End If
        End If
    End Function
  4. Speichere die Funktion und schließe den VBA-Editor.

  5. Du kannst die UDF jetzt in deinen Excel-Formeln verwenden, z.B. =InstrN("Das ist ein Beispiel", " ", 3).


Häufige Fehler und Lösungen

  • Problem: Die Funktion gibt eine falsche Position zurück.

    • Lösung: Stelle sicher, dass der Parameter varN die Anzahl der Vorkommen des Strings korrekt angibt. Wenn der String weniger Vorkommen hat, gibt die Funktion 0 zurück.
  • Problem: Die Funktion funktioniert nicht mit Leerzeichen.

    • Lösung: Überprüfe, ob du den richtigen Suchbegriff verwendest. Die Funktion ist case-sensitive und unterscheidet zwischen Groß- und Kleinschreibung.

Alternative Methoden

Eine weitere Möglichkeit, das x-te Auftreten eines Strings zu finden, ist die Verwendung von Regular Expressions. Hier ist ein Beispiel:

Sub searchText()
    Dim myString As String, strIndex As String
    Dim Regex As Object, myItems, n
    Set Regex = CreateObject("vbscript.regexp")
    myString = "das Haus ist im Haus vom Haus"
    With Regex
        .Global = True
        .Pattern = "Haus"
        Set myItems = .Execute(myString)
    End With
    For Each n In myItems
        strIndex = strIndex & n.firstindex & vbNewLine
    Next
    If myItems.Count > 0 Then MsgBox "Suchtext kommt an den Stellen " & vbNewLine & strIndex & "vor"
    Set Regex = Nothing
End Sub

Praktische Beispiele

  1. UDF zum Finden des 3. Auftretens eines Leerzeichens:

    MsgBox InstrN("Das ist ein Test", " ", 3) ' Gibt die Position des 3. Leerzeichens zurück
  2. UDF für das Finden des 2. Vorkommens eines bestimmten Wortes:

    MsgBox InstrN("Das Haus ist groß. Das Haus ist schön.", "Haus", 2) ' Gibt die Position des 2. Vorkommens von "Haus" zurück

Tipps für Profis

  • Verwende die Funktion InStrRev, um das x-te Vorkommen eines Strings von rechts zu finden. Dies kann besonders nützlich sein, wenn du das letzte Vorkommen eines Suchbegriffs ermitteln möchtest.
  • Kombiniere InstrN mit StrReverse, um die Suche zu vereinfachen. Dies funktioniert gut in Kombination mit der InstrN-Funktion.
Public Function InstrRevN(strText As String, strZ As String, Optional varN)
    strText = StrReverse(strText)
    strZ = StrReverse(strZ)
    InstrRevN = InstrN(strText, strZ, varN)
End Function

FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen Instr und InstrRev? Instr sucht von links nach dem ersten Vorkommen, während InstrRev von rechts sucht.

2. Wie kann ich die UDF in Excel verwenden? Du kannst die UDF in einer Zelle wie jede andere Excel-Funktion verwenden, z.B. =InstrN(A1, "Text", 2).

3. Funktioniert das auch in Excel 2010? Ja, die Funktionen sind mit allen modernen Versionen von Excel, einschließlich Excel 2010, kompatibel.

4. Was tun, wenn die Funktion nicht das erwartete Ergebnis liefert? Überprüfe die Eingaben auf genaue Übereinstimmung und stelle sicher, dass die Anzahl der Vorkommen, die du suchst, existiert.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige