Замена ссылки на текст сноски в Word - PullRequest
0 голосов
/ 24 июня 2018

У меня есть текст в Word, который включает ссылки (1,2,3, ...) на сноски.Существует несколько ссылок на одну и ту же сноску (например, несколько единиц), созданных перекрестными ссылками.

Я хотел бы заменить все ссылки текстом сноски.

В интернете я нашел код, который это делает.Проблема в том, что если есть несколько ссылок на одну и ту же концевую сноску, только ссылка, чья позиция является первой в документе, заменяется текстом (например, только первая 1, другие 1 - нет).

Мне нужна помощь, как заменить все ссылки на соответствующий текст сноски.

Sub endnotes2()
  Dim Note As Endnote
  Dim NoteReference As String
  Dim NoteText As String

  For Each Note In ActiveDocument.Endnotes
    With Note
      NoteText = .Range.Text
      NoteReference = .Index
      Call Selection.SetRange(.Reference.End, .Reference.End)
      Selection.Font.Superscript = True
      Selection.TypeText (NoteText)
      Selection.Font.Superscript = False
    End With
  Next Note

  Do While ActiveDocument.Endnotes.Count > 0
    Call ActiveDocument.Endnotes(1).Delete
  Loop

 Selection.Find.ClearFormatting
  Selection.Find.Font.Superscript = True
  Selection.Find.Replacement.ClearFormatting
  Selection.Find.Replacement.Font.Superscript = False
  With Selection.Find
    .Text = ""
    .Replacement.Text = " (^&)" 'The ^& here refers to the "found text", so if we found "abc" we will replace it with "(abc)"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
  End With
  Selection.Find.Execute Replace:=wdReplaceAll
End Sub

1 Ответ

0 голосов
/ 24 июня 2018

В моем простом тесте у меня работает следующее:

Поскольку перекрестная ссылка на конечную сноску не использует верхний индекс по умолчанию, поиск надстрочного индекса не является надежным критерием.Кроме того, другие вещи могут быть надстрочными.Word управляет перекрестными ссылками с использованием полей Ref , и они относятся к закладке , помещенной в ссылку на сноску при использовании команды Insert cross-reference.

Такие закладки начинаются с _Ref, за которым следует длинное число.И поля для сносок используют имя NoteRef.Поэтому имеет смысл получить имя (имена) закладок для ссылок на сноски (их может быть несколько), проверить, что они названы с использованием шаблона _Ref, а затем выполнить поиск в документе для использования закладок.

Чтобы «найти» код поля, используется шаблон ^d.Таким образом, искомый термин, за которым следуют имя кода поля (NoteRef) и название закладки.Если поиск выполнен успешно, код поля удаляется, и текст сноски записывается в этой позиции.Затем поиск продолжается с этой точки до конца документа.

Таким образом, код перебирает все концевые сноски, получает ссылку на каждую из них, получает все свои закладки, зацикливает закладки, проверяя имя (как описановыше) и ищет поля NoteRef (как описано выше).

Наконец, исходная ссылка на сноску заменяется текстом сноски.

Sub WriteEndNoteToAllEndNoteRefs()
    Dim sEndNoteText As String
    Dim rngEndNoteRef As Word.Range, rngSearch As Word.Range
    Dim doc As Word.Document
    Dim en As Word.Endnote
    Dim bkm As Word.Bookmark
    Dim bFound As Boolean

    Set doc = ActiveDocument
    For Each en In doc.Endnotes
        Set rngEndNoteRef = en.Reference
        sEndNoteText = en.Range.Text
        For Each bkm In rngEndNoteRef.Bookmarks
             If Left(bkm.Name, 4) = "_Ref" Then
                Set rngSearch = doc.content
                rngSearch.TextRetrievalMode.IncludeFieldCodes = True
                Do
                    With rngSearch.Find
                        .Text = "^d NoteRef " & bkm.Name
                        .wrap = wdFindStop
                        bFound = .Execute
                        If bFound Then
                            rngSearch.Fields(1).Delete
                            rngSearch.Text = sEndNoteText
                            rngSearch.End = doc.content.End
                        End If
                    End With
                Loop While bFound
             End If
        Next
        rngEndNoteRef = sEndNoteText
    Next

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...