Problem:
Mit Doppelklammern gekennzeichneter ((Text)) soll von einem Makro in ein Textformularfeld umgewandelt werden. Der Text soll als Vorgabetext übernommen werden.
Beispiel:
Vorher: Adresse: ((Elbestr. 3, 12345 Ichwohnhier)) Alter: ((33))
Nachher: Adresse: [Elbestr. 3, 12345 Ichwohnhier] Alter: [33]
Datenflussplan:
For each „((„
Lösche „((„
strDummi$ = Text bis vor „))“
lösche Text einschließlich „))“
setze Textformularfeld, Vorgabetext = strDummi$
next
Kann mir jemand helfen ???
Moin,
schau Dir mal die Split-Funktion an. Der Datenfluss Programmablaufplan wird dann aber anders aussehen.
Gruß Ralf
Dir Ralf,
danke für den Tipp. Wie der Datenflussplan am Ende aussieht, soll mir wohl egal sein.
Nur leider kann ich mit der Split-Funktion nicht wirklich viel anfangen. Wie bekomme ich denn den Text überhaupt vom Dokument in das Textformularfeld? Vielleicht habe ich mich nicht gut ausgedrückt. Hier ein anderes Beispiel:
Brief: Liebe ((Bettina)), du hast ((zwei wunderschöne Augen)) und ((einen zuckersüßen Mund)).
Nun soll aus dem Brief ein Text mit Formularfeldern entstehen:
Liebe TEXTFORMULARFELD, du hast TEXTFORMULARFELD und TEXTFORMULARFELD.
Der Vorgabetext wird übernommen, also:
Liebe [Bettina], du hast [zwei wunderschöne Augen] und [einen zuckersüßen Mund].
Ich denke, dass entspricht in etwa meinem Datenflussplan. Ich weiß also nicht vorher, wie viele Formularfelder angelegt werden müssen. Anzahl und Vorgabetext ergibt sich erst aus dem Brief.
Gruß Hans-Jürgen
Moin, Hans-Jürgen,
da hatte ich wohl tatsächlich etwas gelesen, was da gar nicht stand 
Mein Einstieg in die Makro-Welt war der Makro-Rekorder. Damit zeichnest Du alles auf, was Du händisch machst, und lässt es auf Knopfdruck wieder rattern. Das liest sich anfangs nicht schön, aber der Mensch gewöhnt sich an allem (rättät dem Dativ!).
Du zeichnest also die Suche nach den Begrenzern (( und )) auf, das Markieren des Textes zwischen den Begrenzern, das Ersetzen der Begrenzer und des Textes.
Der nächste Schritt ist das Ändern des vom Rekorder erzeugten Codes. Und da wäre dann mein Split ins Spiel gkommen, den Du wahrscheinlich gar nicht brauchst.
Mit Textbausteinen hatte ich noch nie zu tun, das kann aber nicht das Problem sein, oder?
Gruß Ralf
Dir Ralf,
Danke für die Rückmail. Das mit dem Aufzeichnen klingt gut, hat aber einige Probleme:
- Woher weiß ich, ob es das letzte (( im Text ist? Es können ja beliebig viele Markierungen sein?
- Wie kann ich dann markieren UND zu )) springen? Das will Word nicht.
- Ist der Text dann irgendwie in der Zwischenablage - wie kommt er in die Makrovariable?
- Auch ein Formularfeld kann ich nicht einfügen, wenn der Makrorekorder aktiv ist!
Du siehst Probleme über Probleme. Ich denke das geht nur über eine Routine.
Liebe Grüße
Hans-Jürgen
Juhuuuu, ((hier)) ist die Lösung:
((hier)) wird durch ein Textformularfeld ersetzt mit dem Vorgabetext „hier“:
Option Explicit
Option Compare Text
Sub LösungDurchTextfelder()
Dim wdFeld As FormField
Dim strLösung As String
On Error GoTo ende
If ActiveDocument.ProtectionType = wdAllowOnlyFormFields Then
ActiveDocument.Unprotect
End If
’ heben den Schutz auf falls nötig
Selection.HomeKey wdStory
’ gehe zum Anfang des Dokuments
Do
Selection.Find.ClearFormatting
With Selection.Find
.Text = „((“
.Replacement.Text = „“
.Forward = True
End With
Selection.Find.Execute
Selection.Extend
With Selection.Find
.Text = „))“
.Replacement.Text = „“
.Forward = True
End With
Selection.Find.Execute
’ suche ((xxx)) und markiere
If Selection.Range „“ Then
strLösung = Selection.Range
strLösung = Replace(strLösung, „((“, „“)
strLösung = Replace(strLösung, „))“, „“)
Set wdFeld = Selection.FormFields.Add(Range:=Selection.Range, Type:=wdFieldFormTextInput)
wdFeld.TextInput.Default = strLösung
’ ersetze durch Textfeld
Selection.ExtendMode = False
Else
Exit Do
End If
Loop
ActiveDocument.Protect wdAllowOnlyFormFields, True ’ Schutz
Exit Sub
ende:
MsgBox Err.Description, vbInformation, „Fehler“
End Sub
Eine sehenswerte Lösung!
Moin,
war wohl gar nicht schlecht, dass ich nicht zum Antworten gekommen bin
))
Anmerkung am Rande: Mit den Tags pre und /pre bleiben die EInrückungen erhalten.
Gruß Ralf
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hallo Ralf,
du hast recht. Das war wohl mehr Code, als ich zu hoffen gewagt habe. Ich bin ja so froh, dass das Poblem gelöst ist. Jetzt komme ich weiter. Dank dir für den Tipp mit den
-Tags. Der ist super.
Hallo Reinhard,
auch Dir herzlichen Dank dass du mir geantwortet hast.
Weiterhin viel Spaß beim Programmieren.
Tschüßiiiiiiiiiiii
Hans-Jürgen