Alle Fundstellen in einem String in einem neuen String ausgeben
#1
Hallo Excel-Profis,

habe folgendes Problem. Aus einem gegebenen String sollen  für ein gegebenes Zeichen alle Positionen berechnet und zusammenfassend
in einem neuen String ausgegeben werden. Suche ich also z.B. in einem Satz nach Leerzeichen und finde diese an den Positionen 4, 10, 15
soll das Ergebnis so aussehen:

Code:
debug.print "Fundstellen : " & zStringErgebnis
'mit zStringErgebnis = "4,10,15"
Wie macht man so etwas am besten?
Top
#2
Hallo Schülerin,

schaue Dir mal die Funktion mid$ an.
Du kannst in einer For-Schleife mit mid$ jedes Zeichen einzeln prüfen.
Wenn Du einen Treffer hast, baust Du den String mit den Treffernummern weiter, indem Du an den vorhandenen String die Zahl (Schleifenzähler) und ein Komma anfügst.

Hier mal die Kommentare zum programmieren Wink

'Schleife ueber alle Zeichen
'Wenn Suchstring gefunden, dann
'Trefferstring um Trefferzahl und Komma erweitern
'Ende Wenn Suchstring gefunden, dann
'Ende Schleife ueber alle Zeichen
'Komma am Ende entfernen
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
[-] Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:
  • Schülerin
Top
#3
Hallo Andre,
danke für Deine Hilfe. Ich habe die Aufgabe mal so gelöst. Wenn jemand noch anderen und alternativen Code für diese Aufgabe hat bitte hier posten.

Code:
Sub String_in_String()
Dim strString As String, strSuch As String, strErgebnis As String, intA As Integer
strString = "Das Clever-Excel Forum gibt viele super Tipps"
strSuch = " "

For intA = 1 To Len(strString)
If Mid(strString, intA, 1) = strSuch Then strErgebnis = strErgebnis & intA & ","
Next

Debug.Print Mid(strErgebnis, 1, Len(strErgebnis) - 1)

End Sub
Top
#4
Hallo,

eine Alternative für diesen Fall:


Code:
Sub String_in_String()
  Dim strString As String, strErgebnis As String, intA As Integer
  Dim dblS As Double
  Dim varStrg
  strString = "Das Clever-Excel Forum gibt viele super Tipps"

  varStrg = Split(strString)  'bei der Split Funktion wird ohne Angabe von delimiter das Leerstellenzeichen (" ") als Trennzeichen verwendet
 
  For intA = LBound(varStrg) To UBound(varStrg) - 1
    strErgebnis = strErgebnis & dblS + Len(varStrg(intA)) + 1 & ","
    dblS = dblS + Len(varStrg(intA)) + 1
  Next intA
 
  Debug.Print Mid(strErgebnis, 1, Len(strErgebnis) - 1)
 
End Sub
Gruß Atilla
[-] Folgende(r) 1 Nutzer sagt Danke an atilla für diesen Beitrag:
  • Schülerin
Top
#5
Hallo liebe  VBA-Sportler,

was ich noch bräuchte wäre die Rekursivlösung für das Finden aller Fundstellen, dessen Ergebnis dann anschließend  in einem String ausgegeben werden soll.
Top
#6
Hallöchen,

reicht Dir wieder die Theorie?
Bei einer rekursiven Lösung könntest Du z.B. eine Funktion erstellen, die immer nur den nächsten Treffer liefert und sich dann selbst aufruft, um dne nächsten Treffer zu ermitteln.
In dem Zusammenhang ist dann auch die Theorie zur Parameterübergabe an eine Funktion interessant. Man kann Variable byval und byref übergeben. byval enthält den Wert, byref eine Referenz auf die Variable. Dadurch behält die Variable im ersten Fall im aufrufenden Makro ihren Inhalt bei, im zweiten Fall wird der Inhalt geändert. Statt byref könnte man ggf. auch eine globale Variable verwenden, die dann auch nicht übergeben werden braucht.

Im Prinzip geht es so (ungetestet):

Code:
Dim Treffer$

Sub Test()
Treffer = SearchLetter(1,"A", "Abra Kadabra")
MsgBox Treffer
End Sub

Function SearchLetter(iAbWann as integer, strLetter as String, strText as String)
'Suchtext in Text ab Position iAbWann finden
ibwann = instr(iabwann, strletter, strtext)
'Wenn gefunden, dann
if iabwann > 0 And iAbWann <= Len(strText) then  
  'Treffer-String mit Trefferposition erweitern
  Treffer = Treffer & iabwann & ","
  'Funktion erneut aufrufen
  SearchLetter iabwann+1, strletter, strtext
'Ende Wenn gefunden, dann
End If
End Function
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#7
Hallo Andre,

ich verstehe die Aufgabe und Dein Lösungsweg nicht.

Wenn Deine Lösung funktionieren würde (sind Fehler enthalten "Exit Function"; kein "End"), dann würde das herauskommen, was sie bisher schon mit Ihrer Lösung hat.
Oder was soll bei Dir als Ergebnis raus kommen?
Gruß Atilla
Top
#8
Hallo zusammen,

das wäre für mich eine Lösung, so wie ich es verstehe:


Code:
Sub String_in_String()
 Dim i As Long
 Dim strString As String, strErgebnis As String, intA As Integer
 Dim strgNeu
 Dim dblS As Double
 Dim varStrg
 strString = "Das Clever-Excel Forum gibt viele super Tipps"

 varStrg = Split(strString)  'bei der Split Funktion wird ohne Angabe von delimiter das Leerstellenzeichen (" ") als Trennzeichen verwendet

 For intA = LBound(varStrg) To UBound(varStrg) - 1
   strErgebnis = strErgebnis & dblS + Len(varStrg(intA)) + 1 & ","
   dblS = dblS + Len(varStrg(intA)) + 1
 Next intA

 Debug.Print Mid(strErgebnis, 1, Len(strErgebnis) - 1)
 
 '##################################################################
 'Rekursiv
 strString = "Nun suche ich mir Buchstaben aus diesem Text"
 varStrg = Split(Mid(strErgebnis, 1, Len(strErgebnis) - 1), ",")
 For i = LBound(varStrg) To UBound(varStrg)
 strgNeu = strgNeu & Mid(strString, varStrg(i), 1)
 Next i
Debug.Print strgNeu
End Sub
Gruß Atilla
Top
#9
Hallöchen,

hier ist noch mal der korrigierte und getestete Code. Die Funktion SearchLetter ruft sich so lange "rekursiv" auf, bis der String durchsucht ist.
Soll keine Unterscheidung zwischen Groß- und Kleinschreibung stattfinden, könnte man den Code entsprechend erweitern.
Ebenso kann man das letzte Komma entfernen, die Meldung erweitern und auch eine Fehlmeldung generieren, wenn kein Treffer kommt....

Code:
Public Treffer$

Sub test()
Treffer = ""
SearchLetter 1, "a", "Abra Kadabra"
MsgBox Treffer
End Sub

Function SearchLetter(iAbWann As Integer, strLetter As String, strText As String)
'Suchtext in Text ab Position iAbWann finden
iAbWann = InStr(iAbWann, strText, strLetter)
'Wenn gefunden, dann
If iAbWann > 0 And iAbWann <= Len(strText) Then
 'Treffer-String mit Trefferposition erweitern
 Treffer = Treffer & iAbWann & ","
 'Funktion erneut aufrufen
 SearchLetter iAbWann + 1, strLetter, strText
'Ende Wenn gefunden, dann
End If
End Function
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#10
Hallo,

ah, Ok... "rekursiv" !!!!! :16:
Gruß Atilla
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste