Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1240to1244
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige