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. Besonders schwer wiegt jedoch, dass die Namen der Textfelder in ein und derselben Dokumentvorlage variieren, wenn die Vorlage in verschiedenen Word-Versionen genutzt wird.
In der Praxis kann es vorkommen, dass ein Nutzer (aus welchem Grund auch immer) eines der (benannten) Textfelder entfernt. Die Folge ist 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 Exit Function Else fktTextfeldVorhanden = True End If End If End Function