代码之家  ›  专栏  ›  技术社区  ›  kroy2008

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

  •  0
  • kroy2008  · 技术社区  · 6 年前

    这是我之前问的一个问题的后续行动 here . 基本上,我反复需要从尾注中提取某些文本。本文始终遵循“提取材料来源”这一短语,后面紧跟a;。

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

    因此,我希望在段落中添加注释。所以我做了一些修改,但下面的代码似乎忽略了选择,并添加了从我的 文档中的所有尾注 注释框,而不仅仅是与所选段落关联的尾注。

    我做错什么了?

    其次,现在更不重要的是,我最终希望能够将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 回复  |  直到 6 年前
        1
  •  1
  •   Cindy Meister    6 年前

    我不知道为什么,但很明显,当 Range.Endnotes 解决。这可以通过检查尾注是否 Reference (这是正文中的上标数字)是相同的 Range 作为正在处理的段落:

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

    如果段落包含尾注,则只创建注释也很重要。为了这个A Boolean 声明并设置为 True 如果段落包含尾注。它被重置为 False 循环到下一段时。

    此代码使用 For Each 循环文档中的所有段落,而不是在 For 循环。它应该更有效,但是这个问题的方法也有效。此外,使用 Selection 是可以避免的。这也更有效,更不容易出错。相反,段落的 范围 使用。

    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
    
        2
  •  -1
  •   macropod    6 年前

    不能在尾注或脚注中添加批注。要将注释添加到相应的尾注引用段落,请尝试以下代码,这也比您自己的代码更有效:

    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