Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

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?
Antworten 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
Antworten 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
Antworten 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
Antworten 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.
Antworten 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)
Antworten 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
Antworten 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
Antworten 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)
Antworten Top
#10
Hallo,

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


Gehe zu:


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