Hallo Markus und viele Grüsse nach Bern,
alles ist gut und wir machen hier schon noch weiter. Wir müssen vielleicht langsamer vorgehen (und trotzdem auch ansagen: Wenn das immer wieder im Nirwana endet, dann hat es eben doch keinen Sinn; manche können programmieren (sie haben "die Denke" dafür) und andere tolle Bilder malen oder singen (ich kann weder singen noch malen - mit "Singen" könnte man mich höchstens im Krieg als Massenvernichtungswaffe einsetzen).
Eine Aufgabe:
Suche mit Instr das erste Vorkommen von "<" und lass Dir das ausgeben. suche das erste ">" und lass Dir das auch ausgeben. Jetzt hast Du zwei Positions für Anfang und Ende Deines gesuchten Teilstrings. Statt der Ausgabebox kannst Du Dir ja nun auch diese Werte in Variablen übernehmen:
Ein Beispielcode, den Du unbedingt Zeile für Zeile nachvollziehen und i nder DesignerHelp nachvollziehen solltest (für mich ist das jetzt Deine Nagelprobe!):
Dim strGiven As String
Dim intFirstDelimiterStart As Integer
Dim intFirstDelimiterEnd As Integer
Dim strPlaceHolder As String
strGiven = "Das ist <mein> Texttext"
intFirstDelimiterStart = Instr (strGiven, "<")
intFirstDelimiterEnd = Instr (strGiven, ">")
Messagebox Cstr (intFirstDelimiterStart) & Chr$ (10) & Cstr (intFirstDelimiterEnd),, strGiven
strPlaceHolder = Mid$ (strGiven, intFirstDelimiterStart + 1, intFirstDelimiterEnd - intFirstDelimiterStart - 1)
Messagebox strPlaceHolder
Beschreibe, was hier warum passiert. Dann kannst Du auch verstehen, was da im erstenSchritt abgeht (in Deinem Lernprozess). Und beachte bitte ungedingt: Das ist der ANFANG. Das hilft Dir nicht bei
"<Salutation> <FirstName> <"LastName>, wir übersenden Ihnen hiermit wie angefordert unseren Geschäftbericht für das Quartal <LastYby4>/<Year>"
Aber das ist schon mal ein Anfang, den Du erst begreifen musst. Wenn *das" sicher klappt, können wir uns an dne nächsten Schritt wagen. Sowie einer von uns dafür Zeit hat, aber das dürfte klar sein.
Bernhard
Ich möchte Dich ungern verwirren, aber ich würde da etwas anders herangehen. Sollte in dem Text eine Klammer als Text stehen, fällst Du auf die Nase. Beispiel:
Dies ist ein Text mit > und <Wert>
Instr (text, ">") liefert Dir, wenn ich mich nicht verzählt habe, 23
Instr (text, "<") liefert 29
Mid$ (strGiven, intFirstDelimiterStart + 1, intFirstDelimiterEnd - intFirstDelimiterStart - 1) ergibt dann
Mid$ (text, 29+1, 23-29-1) -> Mid $ (text, 30, -7)
Einfacher ist es m.E., den Text über die öffnende Klammer in ein Array zu verwandeln. Dazu gibt es die Function Split
Beispieltext: Dies ist ein Text mit > und <Wert1> und < und <Wert2> bla bla
Diesen Text zerlegst Du nun in ein Array, indem Du ihn über die öffnende Klammer splittest (Function Split).
Das Array durchläufts Du dann Element für Element und ersetzt den Inhalt durch den Teil , der links von der schließenden Klammer steht. Gibt es keine schließende Klammer, wird das Element dadurch leer.
Abschließend killst Du mit Fulltrim die leeren Elemente des Arrays. Zur Ausgabe (Msgbox) wandelst Du das Array wieder in einen Text um, das muss aber nicht zwingend in Deiner Routine sein, denn dort wirst Du mit dem Array weiterarbeiten.
Jetzt gibt es noch eine Kleinigkeit zu beachten. Es könnten falsche Klammern im Text vor dem ersten und/oder hinter dem letzten korrekten Wert eingetragen sein. Um das auszuschließen, würde ich vor und nach den Text eine Markierung anbringen, die normalerweise nicht in dem Text vorkommt, und nach dem Aufteilen des Strings und Ermitteln der Elemente das erste Element entfernen, wenn der Inhalt mit der Markierung beginnt. Ebenfalls löschst Du das letzte Element, wenn es mit der Markierung endet.
Anbei der funktionierende Code
Sub Initialize
'Const teststring = "Dies ist ein Text mit > und <Wert1> und < und <Wert2> bla bla"
Const teststring = "> und <<Wert1>> und << und <<Wert2<x>"
Const markierung = "###"
Dim meintext As String
meintext = markierung & teststring & markierung
Dim tmparray As Variant
tmparray = Split (meintext, "<")
ForAll ta In tmparray
ta = StrLeft (ta, ">")
End ForAll
If Left (tmparray (0), Len (markierung)) = markierung Then
tmparray (0) = ""
End If
If Right (tmparray (UBound (tmparray)), Len (markierung)) = markierung Then
tmparray (UBound (tmparray)) = ""
End If
tmparray = FullTrim (tmparray)
MsgBox Join (tmparray, Chr (10))
End Sub