Registriert seit: 21.10.2014
Version(en): 2013
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?
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
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 '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:1 Nutzer sagt Danke an schauan für diesen Beitrag 28
• Schülerin
Registriert seit: 21.10.2014
Version(en): 2013
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
Registriert seit: 14.04.2014
Version(en): 2003, 2007
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:1 Nutzer sagt Danke an atilla für diesen Beitrag 28
• Schülerin
Registriert seit: 21.10.2014
Version(en): 2013
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.
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
26.02.2016, 18:36
(Dieser Beitrag wurde zuletzt bearbeitet: 26.02.2016, 19:56 von schauan.)
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)
Registriert seit: 14.04.2014
Version(en): 2003, 2007
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
Registriert seit: 14.04.2014
Version(en): 2003, 2007
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
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
26.02.2016, 21:40
(Dieser Beitrag wurde zuletzt bearbeitet: 26.02.2016, 21:40 von schauan.)
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)
Registriert seit: 14.04.2014
Version(en): 2003, 2007
Hallo,
ah, Ok... "rekursiv" !!!!! :16:
Gruß Atilla
|