Existenz eines benannten Textfeldes prüfen
Namen von Textfeldern (Shapes) in Word
Das Befüllen von Textfeldern (Shapes) mit VBA in Word lässt sich erleichtern, indem die Textfelder mit aussagekräftigen Namen versehen werden, denn die Default-Namen von Word (»Text Box 1«, »Text Box 2« usw.) sind nicht sonderlich hilfreich. Zudem erfolgt die Zählung eher zufällig. Ungünstig ist, dass die Namen der Textfelder in ein und derselben Dokumentvorlage variieren, wenn die Vorlage in verschiedenen Word-Versionen genutzt wird. In einigen Word-Versionen gibt es eine Zählung in den Kopfzeilen und eine im Hauptteil des Dokuments, sodass ein Name sogar mehrfach vorkommen kann.
Ein Textfeld (Shape) mit VBA einen Namen geben
Ein in Word ausgewähltes (markiertes) Shape bzw. ein Textfeld, in dem der Cursor gerade steht, kann man mit VBA einfach benennen und den Namen auch auslesen:
Sub TextfeldBenennen()
Dim strName As String
strName = "Neuer Testname"
If Selection.StoryType = wdTextFrameStory Then
If Selection.ShapeRange.Count > 0 Then
Selection.ShapeRange(1).Name = strName
MsgBox Selection.ShapeRange(1).Name
End If
Else
MsgBox "Es ist kein Textfeld ausgewählt."
End If
End Sub
Existenz eines Textfeldes in Word mit VBA anhand des Namens prüfen
In der Praxis kann es vorkommen, dass ein Nutzer (aus welchem Grund auch immer) eines der (benannten) Textfelder entfernt. Greift man per VBA anhand des Namens auf das Textfeld zu, resultiert ein Laufzeitfehler. Word bietet für Shapes keine Funktion zur Existenzprüfung (wie etwa bei Bookmarks). Mit der folgenden Funktion lässt sich die Existenz eines bestimmten Textfeldes im Dokument prüfen. Falls das Textfeld nicht vorhanden ist, wird False zurückgegeben.
Public Function fktExistiertTextfeld(ByVal strTF As String) As Boolean
' testet, ob ein übergebenes Textfeld im Dokument enthalten ist
' © Schreibbüro Nora Richter
Dim oStory As Word.Range
fktExistiertTextfeld = False
For Each oStory In ActiveDocument.StoryRanges
If fktTextfeldVorhanden(strTF, oStory) Then
fktExistiertTextfeld = True
Exit For
End If
If oStory.StoryType <> wdMainTextStory Then
Do While Not (oStory.NextStoryRange Is Nothing)
Set oStory = oStory.NextStoryRange
If fktTextfeldVorhanden(strTF, oStory) Then
fktExistiertTextfeld = True
Exit Do
Exit For
End If
Loop
End If
Next oStory
Set oStory = Nothing
End Function
Function fktTextfeldVorhanden(ByVal strShape As String, ByVal rngStory As Range) As Boolean
' testet, ob ein bestimmtes Textfeld im übergebenen StoryRange des Dokuments enthalten ist
' © Schreibbüro Nora Richter
Dim strShapeText As String
fktTextfeldVorhanden = False
strShapeText = ""
On Error Resume Next
If rngStory.ShapeRange.Count > 0 Then
strShapeText = rngStory.ShapeRange(strShape).TextFrame.TextRange.Text
' falls das Textfeld nicht vorhanden ist, tritt ein Laufzeitfehler auf,
' der abgefangen und "genutzt" wird
If Err.Number <> 0 Then
Err.Clear
Exit Function
Else
fktTextfeldVorhanden = True
End If
End If
On Error GoTo 0
End Function