如何以编程方式更改 Word 书签的文本

How to change programmatically the text of a Word Bookmark

我需要处理 Word 文档并更改书签(的文本)。

我将我的 Word 文档导出为平面 xml 格式以帮助建立文档的结构 - 这是一个片段

<w:bookmarkStart w:id="0" w:name="CustomerName"/>
<w:r w:rsidRPr="001E4487">
    <w:rPr>
        <w:rFonts w:ascii="MyTypeRegular" 
              w:hAnsi="MyTypeRegular" 
              w:cs="MyType V2 Regular"/>
        <w:szCs w:val="22"/>
    </w:rPr>
    <w:t>[CustomerName]</w:t>
</w:r>
<w:bookmarkEnd w:id="0"/>

我需要更改的位是 <w:t>[CustomerName]</w:t> 然后应该变成 <w:t>Some Punter</w:t>

所以在我的VBA中我希望能够做这样的事情...

  Dim bkm As Bookmark
  For Each bkm In ActiveDocument.Bookmarks
    bkm.Text = "Some Punter"
  Next bkm

只有BookMark没有Text属性

如何访问方括号中的那个小数据项?

单词书签没有文本 属性,但它的范围 属性 有。

使用bkm.Range.Text = "Some Punter"

请注意,更改文本后,书签将从 Word 文档中删除。为了保留书签你需要做的:

    Dim bkm As Bookmark
    Dim bkmName As String
    Dim bkmRng As Range
    Dim NewText As String

    NewText = "Some Punter"

    For Each bkm In ActiveDocument.Bookmarks
        Set bkmRng = bkm.Range
        bkmName = bkm.Name
        bkm.Range.Text = NewText
        bkmRng.End = bkmRng.Start + Len(NewText)
        Bookmarks.Add(Name:=bkmName, Range:=bkmRng)
    Next bkm

希望对您有所帮助。

我有一个不完美但不那么复杂的解决方法:使用 ActiveX 文本框代替书签,使用 ActiveX 标签代替 cross-reference。然后为文本框创建更改事件(或 LostFocus 事件):LabelName.Caption = TextboxName.Text。可以根据需要格式化。可能需要使用 Font> Advanced > Position > Raised 对齐控件外的文本。这可能并非在所有情况下都可以接受,但通常可以接受。不需要更新字段。