VBA Word Dokumenttext als Textformularfeld wandeln

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 :frowning:

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 :smile:))

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