循环浏览,从尾注中提取文本并将注释添加到尾注源段落

时间:2018-12-06 02:10:32

标签: arrays vba string ms-word

这是我问here的上一个问题的后续措施。基本上,我反复需要从尾注中提取某些文本。该文本始终在短语“提取的材料来自”之后,并以;。

在以前的方法中,我不得不手动选择每个段落(缓慢/繁琐),并且由于有时我想滚动文档来检查某些内容,因此msgbox出现了问题。

因此,我希望在段落中添加注释。因此,我进行了一些修改,但以下代码似乎忽略了选择,并将从我的 ALL所有文档尾注中提取的文本添加到了注释框中,而不仅仅是添加了与选定的段落。

我在做什么错了?

其次,也是现在不太重要的是,最终我希望能够将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 :(得分:1)

我不知道为什么,但是显然Range.Endnotes处理时Word会选择所有尾注。可以通过检查尾注的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

答案 1 :(得分:-1)

您不能在尾注或脚注中添加注释。要将注释添加到相应的尾注参考段落中,请尝试以下代码,该代码也比您自己的代码效率更高:

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