将标题转换为Word中的书签

问题描述 投票:1回答:1

我正在使用Office 2016。我想创建一个循环遍历文档中每个标题的宏,然后使用标题文本(根据需要修改)作为书签名称在标题位置创建书签。大多数标题都是X.X.X.X格式,例如"3.3.4.1. sometexthere"

我仍然是一个使用VBA的初学者,但经过大量的谷歌搜索后,我设法调整了一些几乎可行的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时,它可以将标题转换为书签;我希望能够做同样的事情,但保留文字的文字格式。

遗憾的是我无法使用内置的编号。我正在处理已创建的文档,并具有一组特定格式。

vba ms-word word-vba
1个回答
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  

0
投票

您没有描述为什么需要书签,或者文档的未来用户如何使用/访问书签。

MS Word具有许多内置功能,可用作书签。最好的方法是使用样式。内置的heading样式允许一些原生导航功能(Word自己的隐藏书签)。此外,不要重新发明轮子 - 使用内置编号。

这需要一些文件纪律。标题仅用于标题,正文文本用于非标题文本。

这些好处使这门学科变得有价值。您可以轻松创建使用标题(甚至某些自定义样式)的目录,并在导航窗格中显示标题。保存为PDF时,可以将标题用作PDF中的书签(显示在Reader导航栏上)。

请注意,我所描述的甚至没有触及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。

© www.soinside.com 2019 - 2024. All rights reserved.