Schreibbüro Richter

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