如何找到任何给定列表段落的父列表段落。所以在:
Blah1
一个。 Blah2
i. Blah3
ii. Blah4
湾Blah5
我怎么能找到说ii的父母。 Blah 4(在这个简单的例子中是一个Blah2)?
我知道我不能简单地遍历列表段落,寻找下一个列表段落的列表段落,因为当你有嵌套列表时它会出错。我也意识到我曾经看过过去同一个列表模板中有多个列表的文档。出于这个原因,我不认为可以遍历列表中的所有项目并选择我所在项目之前的项目,因为它们可能位于不同的列表中。
答案 0 :(得分:0)
这是一个非常好的问题 - Word编号系统的对象模型绝不透明!
实际上,您可以使用ListParagraphs
集合循环遍历特定列表的段落成员,即使其中的另一个列表已“嵌套”在其中。
由于您希望在列表中“向上移动”,因此从下到上循环是有意义的。下面的代码示例从当前选择中获取段落及其范围。然后它尝试拿起Range的ListFormat.List
。如果选择不是列表的一部分,则对象变量为Nothing
并且代码退出。
否则,确定选择的列表级别和列表中的ListParagraph的数量。后者提供了通过列表中的段落向后循环的信息。要测试循环中的ListParagraph
是否与选择的Range.InRange
相同,请使用ListParagraph
方法。这与一个布尔值相结合,该布尔值表示循环是否已经达到选择范围。当两个条件都为真时,布尔值设置为True。
在后续循环中,布尔值为true且循环中Sub LoopParagraphsOfList()
Dim rngSel As word.Range
Dim lst As word.List, nrListParas As Long
Dim lstPara As word.Paragraph
Dim curPara As word.Paragraph
Dim selLevel As Long, paraCounter As Long
Dim bStartingPoint As Boolean
bStartingPoint = False
Set curPara = Selection.Paragraphs(1)
Set rngSel = curPara.Range
Set lst = rngSel.ListFormat.List
If lst Is Nothing Then
Debug.Print "The current selection is not part of a list"
Exit Sub
End If
selLevel = rngSel.ListFormat.ListLevelNumber
nrListParas = lst.ListParagraphs.Count
For paraCounter = nrListParas To 1 Step -1
Set lstPara = lst.ListParagraphs(paraCounter)
If lstPara.Range.InRange(curPara.Range) And Not bStartingPoint Then
bStartingPoint = True
End If
If bStartingPoint And lstPara.Range.ListFormat.ListLevelNumber < selLevel Then
lstPara.Range.Select
Exit For
End If
Next
End Sub
的列表级别编号为“高于”(层次结构中较低的数字)当前选择的那个,那么您想要的段落找到并被选中;循环退出。
Any