这是我问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
答案 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