VBA-Word: Ausgewähltes Textfeld ermitteln

Hallo Experten,

Ich habe ein Word-Dokument mit mehreren Textfeldern. Nun möchte ich per VBA ermittel, welches der Textfelder gerade den Focus hat.
Ob überhaupt gerade ein Textfeld ausgewählt ist sagt mit - zumindest eingeschränkt - folgende Eigenschaft:

 objWord.Selection.Information(wdFrameIsSelected) 

(objWord => eigentlich greife ich mit VB6 auf ein Word-Objekt zu und arbeite nicht direkt mit VBA…)

Ich suche aber nach einer Möglichkeit herauszufinden, welches Textfeld gerade ausgewählt ist. Noch lieber wäre mir etwas wie Textfeld1_GotFocus, das scheint aber erst recht nicht zu gehen…

Hoffe jemand kann mir weiter helfen.

Grüße,

Phil

hallo Phil

du arbeitest mit textboxen? selber schuld - die sind ja nicht gerade berühmt dafür, die dokumente stabiler zu machen…

aber wenn es unbedingt sein muss - in vba würde ich es so machen:

Sub textboxtest()
Dim Box As Shape

For Each Box In ActiveDocument.Shapes
 If Box.Type = msoTextBox Then
 If Selection.Range.InRange(Box.TextFrame.TextRange) Then
 MsgBox "bin drinnen in dieser box..." & Box.Name
 End If
 End If
Next
End Sub

lg
erwin

Hallo Erwin,

erst mal Danke für deine Hilfe!

du arbeitest mit textboxen? selber schuld - die sind ja nicht
gerade berühmt dafür, die dokumente stabiler zu machen…

Ja, langsam bringen mich die Dinger auch noch zur Verzweiflung aber es hat sich Anfangs eben Angeboten und da war ich mir der ganzen Tücken noch nicht bewusst.

If Selection.Range.InRange(Box.TextFrame.TextRange)

Sowas in der Art hatte ich auch schon, nur leider überprüfte der Code nur den Text in dem Textfeld. Es kann aber vorkommen, dass in mehreren (oder allen) Textfeldern das selbe steht. Man müsste das Textfeld also anhand seines Namen oder Index identifizieren. Leider wird scheinbar nichts in der Richtung in ‚Selection‘ übergeben.

lg Phil

hallo phil

If Selection.Range.InRange(Box.TextFrame.TextRange)

Sowas in der Art hatte ich auch schon, nur leider überprüfte
der Code nur den Text in dem Textfeld. Es kann aber vorkommen,
dass in mehreren (oder allen) Textfeldern das selbe steht. Man
müsste das Textfeld also anhand seines Namen oder Index
identifizieren. Leider wird scheinbar nichts in der Richtung
in ‚Selection‘ übergeben.

???
ich verstehe dein problem nicht ganz. ursprünglich hast du geschrieben, dass du automatisiert feststellen willst, in welcher textbox der cursor gerade steht. mein makro geht zuerst alle shapes im dokument durch. wenn es eine textbox ist, prüft es ob der aktuelle cursor in der textbox drinnen ist. wenn auch das der fall ist, hast du eine eindeutige referenz auf die textbox in der variable „Box“. für das beispiel habe ich mal nur den namen der textbox ausgegeben - du kannst aber auch alles andere damit machen. welcher text in der textbox drinnensteht, ist völlig irrelevant: die ranges in word-objekten geben nur textpositionen an, die textinhalte werden indirekt über die positionen ermittelt. mein makro funktioniert also zuverlässig, auch wenn in allen 20 textboxen haargenau der selbe inhalt drinnen ist.

hier mal das makro nochmal als funktion, damit das klarer wird:

Function getActiveTextbox() As Shape
Dim Box As Shape

Set getActiveTextbox = Nothing

For Each Box In ActiveDocument.Shapes
 If Box.Type = msoTextBox Then
 If Selection.Range.InRange(Box.TextFrame.TextRange) Then
 Set getActiveTextbox = Box
 End If
 End If
Next
End Function

diese funktion liefert nun eine eindeutige referenz auf genau die eine textbox zurück.

dass dann dein programm möglicherweise mit der textbox nichts mehr anfangen kann, weil die boxen alle gleich sind und du sie nicht unterscheiden kannst, ist ein anderes problem. aber das hättest du auf jeden fall - auch wenn word eine entsprechende funktion anbieten würde.

ist nun alles klar oder habe ich was falsch verstanden?

lg
erwin

2 Like

Hallo Erwin

Sorry!!! Tut mir wirklich leid!

Klappt einwandfrei - Tausend Dank!!! Hatte schon öfters Probleme mit Ranges im zusammenhang mit Textfeldern. Dachte das klappt in Textfeldern irgendwie nicht richtig. Wahrscheinlich hat mich der Begriff Text Range durcheinander gebracht… Verstehe allerdings auch nicht wieso folgende Code-Zeile nich funktioniert:

If objWord.ActiveDocument.Shapes("txt1").TextFrame.TextRange = objWord.Selection.Range Then

(Wenn man im Debugger mit dem Cursor über den Ausdruck fährt wird der Text in dem Range angezeigt, das hat mich vermutlich auf die Falsche Fährte gebracht…)

Naja, jedenfalls funktioniert es jetzt. Vielen Dank noch mal für deine Bemühungen!

Liebe Grüße

Phil