【发布时间】:2015-04-12 04:50:28
【问题描述】:
这是一个令人头疼的问题: 我正在尝试以编程方式为文档中的现有标题创建隐藏书签,以便我可以在文档中的其他位置创建指向这些书签的超链接。 (我想使用超链接而不是交叉引用,所以我可以为链接指定我自己的“显示文本”,而使用交叉引用是不可能的)。
我希望我的书签以它们相关的标题命名,并带有自定义前缀。 示例:
- 样式:标题1
- 标题文字:入口和走廊
- 书签名称:_Hd1_Entrance_&_Hallway
我指定了一个自定义前缀,以使每个书签的样式独一无二,因此我可以在文档中拥有 2 个匹配的标题,只要它们具有不同的标题样式。 (例如:_Hd1_Entrance_&_Hallway 和 _Hd3_Entrance_&_Hallway)
问题是:如果我的标题包含特殊字符,如“&”,我会收到“错误的书签名称”错误,据我所知,这已记录在网络上。我只能使用有限的字符集。
那么,如果我使用 Word 自己的对话框手动创建一个超链接,选择一个“放置在此文档中”,例如“入口和走廊”之类的标题,Word 管理这个没有问题怎么办?创建 Hlink 后,我现在可以在 Word 的“书签”对话框中看到与此 Hlink 关联的隐藏书签 - 并且非常高兴地将其命名为“_Entrance _&_Hallway”。这让我很困惑!
有人解释一下吗?我真的很想能够利用同样的功能,但无法理解如何。任何帮助都非常有价值! 谢谢,
Sub ScratchPad_Bookmarks()
Dim doc As Document
Dim rng As Range
Dim sHdName As String
Dim sBmName As String
Set doc = ActiveDocument
'Insert a heading at start of document
sHdName = "Entrance & Hallway"
doc.Range.InsertBefore sHdName & vbCr
doc.Paragraphs(1).Range.Style = doc.Styles("Heading 1")
'Find the above heading in the active document
Set rng = doc.Range
With rng.Find
.ClearFormatting
.Text = sHdName
.Style = "Heading 1"
If Not .Execute Then
'Heading not found, so quit
Exit Sub
End If
End With
'rng has collapsed to the found heading, so create a bookmark
'rng.Select 'debug
sBmName = Replace(rng.Text, " ", "_")
rng.Collapse wdCollapseStart
rng.Bookmarks.Add sBmName
'sBmName contains '&' so this throws a Runtime error:
'5828: Bad Bookmark Name (as expected)
End Sub
上述方法无效。但是,自己测试手动操作很容易。只需创建一个包含 '&' 字符的标题,并将其样式设置为 Heading 1。 在下一段中,使用 Word 自己的对话框插入超链接。选择 Place In This Doc 并选择您刚刚创建的标题。应该不是问题。 现在打开 Word 的书签对话框,启用 隐藏书签 视图,瞧:一个带有“&”字符的隐藏书签。 (Wd 2010)说什么?!
【问题讨论】:
-
您确定将
&正确包含在字符串中吗?您能否向我们展示您尝试定义书签的代码行? -
对上述内容表示歉意。即使是简单的指令也会引发运行时错误——例如:r.Bookmarks.Add "This & That"。这与预期的一样。我已经确认我的字符串明确包含“&”——这实际上是我想要的。即:我的标题必须使用 & 而不是“and”。
-
阅读官方documentation,我可以阅读书签名称应该是一个字;我担心这就是原因。
-
附言。我对VBA for Word的知识很差,你可能想等待别人的回答;但我清楚地阅读了“书签的名称。名称不能超过一个单词。”在文档中。
-
我相信使用下划线而不是空格可以克服这个问题,这就是 Word 实现多字书签的方式,就像上面的示例一样。不过还是谢谢你。