0

如何在word 2010中制作一个样式作为书签?

在此处输入图像描述

4

1 回答 1

1

您将无法将文档中的大部分文本用作书签名称。在 Word/VBA 的书签名称中使用某些字符是非法的。可以在文档的 XML 格式的书签名称中添加此类字符,因此如果需要,您可以提出单独的问题。

这感觉就像在 SO 上发布的代码太多了。你真的需要解释你有什么框架,并告诉我们你的障碍在哪里。我们不能再这样做了。“为我工作”。如果您有任何问题,请不要犹豫。

运行底部的“RunMe”宏。

Private Function IsParagraphStyledWithHeading(para As Paragraph) As Boolean
    Dim flag As Boolean: flag = False
    If InStr(1, para.Style, "heading", vbTextCompare) > 0 Then
        flag = True
    End If
    IsParagraphStyledWithHeading = flag
End Function

Private Function GetTextRangeOfStyledParagraph(para As Paragraph) As String
    Dim textOfRange As String: textOfRange = para.Range.Text
    GetTextRangeOfStyledParagraph = textOfRange
End Function

Private Function BookmarkNameAlreadyExist(bookmarkName As String) As Boolean
    Dim bookmark As bookmark
    Dim flag As Boolean: flag = False
    For Each bookmark In ActiveDocument.Bookmarks
        If bookmarkName = bookmark.name Then
            flag = True
        End If
    Next
    BookmarkNameAlreadyExist = flag
End Function

Private Function CreateUniqueBookmarkName(bookmarkName As String)
    Dim uniqueBookmarkName As String
    Dim guid As String: guid = Mid$(CreateObject("Scriptlet.TypeLib").guid, 2, 36)
    guid = Replace(guid, "-", "", , , vbTextCompare)
    uniqueBookmarkName = bookmarkName & guid
    CreateUniqueBookmarkName = uniqueBookmarkName
End Function

Private Function BookmarkIt(rng As Range, bookmarkName As String)
    Dim cleanName As String: cleanName = MakeValidBMName(bookmarkName)
    If BookmarkNameAlreadyExist(cleanName) Then
        cleanName = CreateUniqueBookmarkName(cleanName)
    End If
    ActiveDocument.Bookmarks.Add name:=cleanName, Range:=rng
End Function

''shamelessly stolen from gmaxey at http://www.vbaexpress.com/forum/showthread.php?t=37674
Private 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 = "A_" & 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, "  ", " ")
    MakeValidBMName = tempStr
End Function

Sub RunMe()
    Dim para As Paragraph
    Dim textOfPara As String
    For Each para In ActiveDocument.Paragraphs
        If IsParagraphStyledWithHeading(para) Then
            textOfPara = GetTextRangeOfStyledParagraph(para)
            If para.Range.Bookmarks.Count < 1 Then
                BookmarkIt para.Range, textOfPara
            End If
        End If
    Next
End Sub
于 2012-07-06T06:23:40.590 回答