Проходить, извлекать текст из концевых сносок и добавлять комментарии к абзацу исходного примечания - PullRequest
0 голосов
/ 06 декабря 2018

Это продолжение предыдущего вопроса, который я задал здесь .По сути, мне постоянно приходится извлекать определенный текст из сносок.Этот текст всегда следует за фразой «Извлеченный материал из» и сопровождается;.

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

Поэтому я бы предпочел добавить комментарий к абзацу.Поэтому я внес некоторые изменения, но, похоже, приведенный ниже код игнорирует выделение и добавляет извлеченный текст из моих ВСЕ концевых сносок в документе в поле комментариев, а не только концевые сноски, связанные с выбраннымпараграф.

Что я делаю неправильно?

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

Sub EndNotes_Comment_Each_Paragraph_Loop()
Dim e As Endnote
Dim str As String
Dim lngStart As Long
Dim lngEnd As Long
Dim pCount As Long
Dim i As Long

pCount = ActiveDocument.Paragraphs.Count

For i = 1 To pCount
ActiveDocument.Paragraphs(i).Range.Select
str = ""
    For Each e In Selection.Endnotes
        lngStart = InStr(1, e.Range.Text, "Extracted material is from ", 1) + 27
        lngEnd = InStr(lngStart, e.Range.Text, ";", 1)
        str = str & Mid(e.Range.Text, lngStart, lngEnd - lngStart) & vbCrLf
    Next e
ActiveDocument.Comments.Add Selection.Range, Text:="This paragraph contains:" & vbCrLf & str
Next i

End Sub

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Я не знаю почему, но, видимо, Word выбирает все сноски при обращении к Range.Endnotes.Этому можно противостоять, проверив, находится ли Reference в конце сноски (это номер верхнего индекса в тексте) в том же Range, что и обрабатываемый абзац:

 If e.Reference.InRange(para.Range) Then

Также важно создать толькокомментарий, если абзац содержит сноски.Для этого объявляется Boolean и устанавливается значение True, если абзац содержит сноску.При циклическом переходе к следующему абзацу он сбрасывается на False.

Этот код использует For Each для зацикливания всех абзацев в документе вместо использования "счетчика" в цикле For.Это должно быть более эффективным, но подход в вопросе также работает.Также избегается использование Selection.Это также более эффективно и менее подвержено ошибкам.Вместо этого используется абзац Range.

Sub EndNotes_Comment_Each_Paragraph_Loop()
    Dim e As Endnote
    Dim str As String
    Dim lngStart As Long
    Dim lngEnd As Long
    Dim para As Word.Paragraph, rngPara As Word.Range
    Dim isE As Boolean

    For Each para In ActiveDocument.paragraphs
        str = ""
        isE = False
        Set rngPara = para.Range
        For Each e In rngPara.Endnotes
            If e.Reference.InRange(rngPara) Then
                lngStart = InStr(1, e.Range.text, "Extracted material is from ", 1) + 27
                lngEnd = InStr(lngStart, e.Range.text, ";", 1)
                str = str & Mid(e.Range.text, lngStart, lngEnd - lngStart) & vbCrLf
                isE = True
            End If
        Next e
        If isE Then
            ActiveDocument.Comments.Add rngPara, "This paragraph contains:" & vbCrLf & str
        End If
    Next
End Sub
0 голосов
/ 06 декабря 2018

Вы не можете добавлять комментарии к сноскам или сноскам.Чтобы добавить комментарии к соответствующим абзацам с ссылками на сноски, попробуйте следующий код, который также гораздо эффективнее вашего собственного:

Sub Demo()
Application.ScreenUpdating = False
Const StrPre As String = "Extracted material is from"
Const StrCmt As String = "This paragraph contains:"
With ActiveDocument.StoryRanges(wdEndnotesStory)
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = StrPre & "*;"
    .Replacement.Text = ""
    .Forward = True
    .Format = False
    .Wrap = wdFindStop
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found
    .Parent.Comments.Add Range:=.Endnotes(1).Reference.Paragraphs(1).Range, _
      Text:=StrCmt & Split(Split(.Text, StrPre)(1), ";")(0)
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...