Word VBA:生成附录列表插入第1节末尾却到第2节开头的问题
Word VBA:为何
wdCollapseEnd会把内容插到下一节开头? 我编写了一段VBA代码,想提取第1节以外所有节的第一段内容,生成附录列表后插入到第1节的末尾。但实际运行后,列表被插到了第2节的开头,而非第1节末尾——第1节末尾带有“下一节”分页符。改成wdCollapseStart能正常插到第1节开头,却搞不懂wdCollapseEnd为啥失效。
原代码如下:
Sub GenerateAppendixList() Dim mainDoc As Document Dim appendixSection As section Dim appendixParagraph As Paragraph Dim appendixList As String Dim appendixCount As Integer Dim rng As Range ' Set reference to the main document Set mainDoc = ActiveDocument Set rng = mainDoc.Sections(1).Range ' Initialize the appendix count appendixCount = 1 ' Loop through sections (excluding the main document) For Each appendixSection In mainDoc.Sections If appendixSection.Index > 1 Then ' Get the first paragraph in the appendix section Set appendixParagraph = appendixSection.Range.Paragraphs(1) appendixList = appendixList & "Appendix " & appendixCount & " - " & appendixParagraph.Range.Text '& vbCrLf ' Increment the appendix count appendixCount = appendixCount + 1 'End If End If Next appendixSection ' Insert the formatted appendix list at the end of the Section 1 rng.Collapse Direction:=wdCollapseEnd rng.InsertAfter appendixList End Sub
问题原因
Word里Section.Range的定义是包含该节所有内容+末尾的节分隔符(这里就是“下一节”分页符)。当你用wdCollapseEnd折叠这个范围时,光标会直接跳到分页符的后面——而这个位置已经属于第2节的范围了,所以插入的内容自然就跑到第2节开头了。
两种解决办法
办法1:定位到第1节最后一个段落的末尾
直接把范围指向第1节最后一个段落,避开节分隔符:
Sub GenerateAppendixList() Dim mainDoc As Document Dim appendixSection As Section Dim appendixParagraph As Paragraph Dim appendixList As String Dim appendixCount As Integer Dim rng As Range Set mainDoc = ActiveDocument ' 关键改动:获取第1节最后一个段落的范围 Set rng = mainDoc.Sections(1).Range.Paragraphs(mainDoc.Sections(1).Range.Paragraphs.Count).Range appendixCount = 1 For Each appendixSection In mainDoc.Sections If appendixSection.Index > 1 Then Set appendixParagraph = appendixSection.Range.Paragraphs(1) appendixList = appendixList & "Appendix " & appendixCount & " - " & appendixParagraph.Range.Text appendixCount = appendixCount + 1 End If Next appendixSection ' 折叠到段落末尾后插入 rng.Collapse Direction:=wdCollapseEnd rng.InsertAfter vbCrLf & appendixList ' 加换行符分隔原内容和列表 End Sub
办法2:调整范围,排除末尾的节分隔符
保留原范围的基础上,把范围的结束位置往前移一位,跳过分页符:
Set rng = mainDoc.Sections(1).Range ' 把范围结束位置减1,排除末尾的节分隔符 rng.End = rng.End - 1 ' 之后再折叠插入 rng.Collapse Direction:=wdCollapseEnd rng.InsertAfter vbCrLf & appendixList
这样修改后,wdCollapseEnd就能把列表正确插入到第1节的真正末尾了。
内容的提问来源于stack exchange,提问作者MT Ring
相关产品推荐
相关产品推荐

