我正在使用Office 2016
。我想创建一个循环遍历文档中每个标题的宏,然后使用标题文本(根据需要修改)作为书签名称在标题位置创建书签。大多数标题都采用X.X.X.X
格式,例如"3.3.4.1. sometexthere"
。
我仍然是使用VBA
的初学者,但经过大量的Google搜索后,我设法调整了一些几乎可行的Frankenstein代码:
Sub HeadingsToBookmarks()
Dim heading As Range
Set heading = ActiveDocument.Range(Start:=0, End:=0)
Do
Dim current As Long
current = heading.Start
Set heading = heading.GoTo(What:=wdGoToHeading, Which:=wdGoToNext)
If heading.Start = current Then
Exit Do
End If
ActiveDocument.Bookmarks.Add MakeValidBMName(heading.Paragraphs(1).Range.Text), Range:=heading.Paragraphs(1).Range
Loop
End Sub
Function MakeValidBMName(strIn As String)
Dim pFirstChr As String
Dim i As Long
Dim tempStr As String
strIn = Trim(strIn)
pFirstChr = Left(strIn, 1)
If Not pFirstChr Like "[A-Za-z]" Then
strIn = "Section_" & strIn
End If
For i = 1 To Len(strIn)
Select Case Asc(Mid$(strIn, i, 1))
Case 49 To 58, 65 To 90, 97 To 122
tempStr = tempStr & Mid$(strIn, i, 1)
Case Else
tempStr = tempStr & "_"
End Select
Next i
tempStr = Replace(tempStr, " ", " ")
tempStr = Replace(tempStr, ":", "")
If Right(tempStr, 1) = "_" Then
tempStr = Left(tempStr, Len(tempStr) - 1)
End If
MakeValidBMName = tempStr
End Function
这段代码几乎可以使用,并在某些标题上做出适当的书签,但不是全部。任何人都可以帮我弄清楚我需要解决的问题,或者就如何清理这些代码提出其他建议?
编辑:更多信息:上面的代码转换了我正在测试它的文档中的前5个左右的标题,以及散布的其他几个标题。执行实际转换的代码的后半部分似乎工作正常 - 问题位于循环每个标题的部分中。后半部分将不可用的字符转换为符合书签名称要求的字符,并将“Section_”添加到以数字开头的书签/标题的开头(因为书签不允许以数字开头)。
我的目标是能够超链接到文档中包含来自不同word文档标题的所有部分。据我所知,标准目录创建者仅允许在同一文档中构建链接。我知道当word保存为PDF时,它可以将标题转换为书签;我希望能够做同样的事情,但保留文字的文字格式。
遗憾的是我不能使用内置的编号。我正在使用已经创建的文档并具有一组特定格式。答案 0 :(得分:1)
此代码对我有用:
Sub HeadingsToBookmarks()
Dim heading As Range
Set heading = ActiveDocument.Range(Start:=0, End:=0)
Do
Dim current As Long
current = heading.Start
Set heading = heading.GoTo(What:=wdGoToHeading, Which:=wdGoToNext)
If heading.Start = current Then
Exit Do
End If
'This is the part I changed: ListFormat.ListString
ActiveDocument.Bookmarks.Add MakeValidBMName(heading.Paragraphs(1).Range.ListFormat.ListString), Range:=heading.Paragraphs(1).Range
Loop
End Sub
答案 1 :(得分:0)
您尚未说明为何需要书签,或文档的未来用户如何使用/访问书签。
MS Word具有许多内置功能,可用作书签。最好的方法是使用样式。内置的heading
样式允许一些原生导航功能(Word自己的隐藏书签)。此外,不要重新发明轮子 - 使用内置编号。
这需要一些文档规范。标题仅用于标题,正文文本用于非标题文本。
这些好处使这门学科变得有价值。您可以轻松创建使用标题(甚至某些自定义样式)的目录,并在导航窗格中显示标题。保存为PDF时,可以将标题用作PDF中的书签(显示在阅读器导航栏上)。
请注意,我所描述的内容甚至没有触及VBA。
如果您为标题使用设置样式,并且您希望做的比本机更多,那么您可以简单地:
Loop through all paragraphs in the document
See if that paragraph is set to your heading style
Place a bookmark (valid bookmark name!) over that paragraph
我已将实际编码留给您,但我认为您会发现根据上面的伪代码很容易做到。我的伪代码循环不是查找段落的唯一方法,但它最容易可视化。
使用上面的简化方法和内置编号后,您会发现可以修改ValidBMName
函数 - 简化它。但是,如上所述,根据您想要书签的原因,您可以完全避免使用VBA。