当前位置: 首页 > 知识库问答 >
问题:

在Word 2007中制作自动参考图来显示标题?

周枫涟
2023-03-14

以下代码来自“Word Hacks:Tips”

Sub MakeAutoXRef() 
    Dim sel As Selection 
    Dim rng As range 
    Dim para As Paragraph 
    Dim doc As Document 
    Dim sBookmarkName As String 
    Dim sSelectionText As String 
    Dim lSelectedParaIndex As Long 
    Set sel = Selection 
    Set doc = sel.Document 
    If sel.range.Paragraphs.Count <> 1 Then Exit Sub 
    lSelectedParaIndex = GetParagraphIndex(sel.range.Paragraphs.First) 
    sel.MoveStartWhile cset:=(Chr$(32) & Chr$(13)), Count:=sel.Characters.Count 
    sel.MoveEndWhile cset:=(Chr$(32) & Chr$(13)), Count:=-sel.Characters.Count 
    sSelectionText = sel.text 
    For Each para In doc.Paragraphs 
        Set rng = para.range 
        rng.MoveStartWhile cset:=(Chr$(32) & Chr$(13)), _ 
        Count:=rng.Characters.Count 
        rng.MoveEndWhile cset:=(Chr$(32) & Chr$(13)), _ 
        Count:=-rng.Characters.Count 
        If rng.text = sSelectionText Then 
            If Not GetParagraphIndex(para) = lSelectedParaIndex Then 
                sBookmarkName = GetOrSetXRefBookmark(para) 
                If Len(sBookmarkName) = 0 Then 
                    MsgBox "Couldn't get or set bookmark" 
                    Exit Sub 
                End If 
                sel.InsertCrossReference _ 
                referencekind:=wdContentText, _ 
                referenceItem:=doc.Bookmarks(sBookmarkName), _ 
                referencetype:=wdRefTypeBookmark, _ 
                insertashyperlink:=True 
                Exit Sub 
            Else 
                MsgBox "Can't self reference!" 
            End If 
        End If 
    Next para 
End Sub 


Function RemoveInvalidBookmarkCharsFromString(ByVal str As String) As String 
    Dim i As Integer 
    For i = 33 To 255 
        Select Case i 
        Case 33 To 47, 58 To 64, 91 To 96, 123 To 255 
            str = Replace(str, Chr(i), vbNullString) 
        End Select 
    Next i 
    RemoveInvalidBookmarkCharsFromString = str 
End Function


Function ConvertStringRefBookmarkName(ByVal str As String) As String 
    str = RemoveInvalidBookmarkCharsFromString(str) 
    str = Replace(str, Chr$(32), "_") 
    str = "_" & str 
    str = "XREF" & CStr(Int(90000 * Rnd + 10000)) & str 
    ConvertStringRefBookmarkName = str 
End Function 


Function GetParagraphIndex(para As Paragraph) As Long 
    GetParagraphIndex = _ 
    para.range.Document.range(0, para.range.End).Paragraphs.Count 
End Function 


Function GetOrSetXRefBookmark(para As Paragraph) As String 
    Dim i As Integer 
    Dim rng As range 
    Dim sBookmarkName As String 
    If para.range.Bookmarks.Count <> 0 Then 
        For i = 1 To para.range.Bookmarks.Count 
            If InStr(1, para.range.Bookmarks(i).name, "XREF") Then 
                GetOrSetXRefBookmark = para.range.Bookmarks(i).name 
                Exit Function 
            End If 
        Next i 
    End If 
    Set rng = para.range 
    rng.MoveEnd unit:=wdCharacter, Count:=-1 
    sBookmarkName = ConvertStringRefBookmarkName(rng.text) 
    para.range.Document.Bookmarks.Add _ 
    name:=sBookmarkName, _ 
    range:=rng 
    GetOrSetXRefBookmark = sBookmarkName 
End Function

共有1个答案

东郭淇
2023-03-14

所以,我希望我明白你的意思。老实说,使用insertCrossReference方法有点复杂,因为它有一个缺点——当设置为时,它会将捕获引用的标题的整个“名称”放入选定范围。换句话说:如果你的标题是“图1.2”。“1月销售结果”,您希望“图1.2”与标题链接,它会将您的“图1.2”替换为较长的原始标题。因此,您提出的基本思想保留了段落引用。但是,我做了一些尝试,并提出以下建议:a)将以下代码放入模块,而不是MakeAutoXRef子例程:

Sub findToReference()

Dim whatTo As Range
Set whatTo = Selection.Range

Dim whatToTxt As String
    whatToTxt = whatTo.text
Dim sBookmarkName As String

Dim rngDoc As Range
Set rngDoc = ActiveDocument.Content

With rngDoc.find
    .text = whatTo
    .Style = "Headings 1"   'place name of style here, like 'Headings 1' or something
    .Execute
End With

If rngDoc.find.Found = True Then
    'rngDoc.Select     'selection what was fount
    'found text to bookmark
    sBookmarkName = GetOrSetXRefBookmark(rngDoc)
    'copy from previous
     If Len(sBookmarkName) = 0 Then
                MsgBox "Couldn't get or set bookmark"
                Exit Sub
    End If

    whatTo.InsertCrossReference _
                referencetype:=wdRefTypeBookmark, _
                referencekind:=wdContentText, _
                referenceItem:=rngDoc.Bookmarks(sBookmarkName), _
                insertashyperlink:=True
 Else
    MsgBox "No headers matching selection found!"

End If
End Sub

一些评论:我建议使用find功能查找您选择的文本,并检查样式名称是否引用标题。因此,您必须将标题1更改为适当的样式名称。另一点是,第一次出现将匹配并设置对所选文本的引用。

此外,您需要更改一个函数。将原来的GetOrSetXRefBookmark函数替换为下面的函数。

Function GetOrSetXRefBookmark(paraRng As Range) As String
Dim i As Integer
Dim rng As Range
Dim sBookmarkName As String
   sBookmarkName = ConvertStringRefBookmarkName(paraRng.text)
   paraRng.Bookmarks.Add _
      Name:=sBookmarkName, _
      Range:=paraRng
GetOrSetXRefBookmark = sBookmarkName
End Function

它适用于Word 2010。提出的想法的一个缺点是情况,即每个交叉引用创建新的书签。但我唯一的想法是从原始代码中摆脱“段落匹配和全名复制”。所以,我希望你明白我的意思,这将是有帮助的。

 类似资料:
  • 在尝试了“php artisan存储:链接”等解决方案后,图像仍然无法在前端(vuejs)中显示。 图像本身存储在“storage/public/app/xxx.png”中 vuejs中的代码是。 我试图通过浏览器访问图像”http://127.0.0.1:80/api/storage/xxx.png,但导致“未找到” 任何线索都将不胜感激。

  • 问题内容: 嗨,我的数据库中有一个图像表。这些与细节一起存储为Blob,例如图像类型和名称。 我在显示图像时遇到问题,我得到的只是一个带有红色十字的白框。码: 谢谢 问题答案: 好吧,这是一个简短的答案。 检查您的Blob类型是否至少为MEDIUMBLOB,它能够存储高达16M的数据

  • 我有代码允许我输入带有纬度和经度的位置名称,然后地图用标记显示位置。 我遇到的问题是,我希望地图显示所有位置,每个位置都有自己的标记。 下面是我用来获取地图上显示的一个位置的代码 非常感谢您的帮助 我没有错误只是显示了一个位置,我已添加到Firebasedatabase

  • 因此,我有一段html,其中包括一个mat表单字段,该字段有一个mat select和一个mat选项。这些mat选项是从服务器生成的,它们有一个图像,当选择一个选项时,我需要在mat select中显示该图像(每个选项都有自己的图像) 每次选择新选项时,我都要在mat select中显示选项标签和图像。 我读过mat select触发器,但对我来说没有任何效果。

  • Foundation 图标 Foundation 提供了 283 图标,你可以使用 CSS 来渲染她们:修改大小和颜色。 图标创建语法格式如下: <i></i> 语法中 name 部分为图标指定的名称。 要使用图标,你可以将图片的样式文件放置在页面头部 <head> 部分: <link rel="stylesheet" href="http://static.runoob.com/assets/

  • 问题内容: 我像这样设置静态文件的文件夹 在模板中,我使用img标签显示存储在/ tmp中的图像: 在firebug中,我看到404错误而不是图像。请告诉我我做错了什么? 提前致谢。 问题答案: 我不确定你正在使用什么配置项目。你在哪里找到它? 实际上,类构造函数有两个参数来控制静态文件的配置: static_folder:默认为“静态”。这是你必须在URL中使用的前缀才能访问静态文件。 stat