在Word中查找父列表段落

时间:2016-05-05 13:13:31

标签: vba ms-word word-vba

如何找到任何给定列表段落的父列表段落。所以在:

  1. Blah1

    一个。 Blah2

      i.    Blah3
    
      ii.   Blah4
    

    湾Blah5

  2. 我怎么能找到说ii的父母。 Blah 4(在这个简单的例子中是一个Blah2)?

    我知道我不能简单地遍历列表段落,寻找下一个列表段落的列表段落,因为当你有嵌套列表时它会出错。我也意识到我曾经看过过去同一个列表模板中有多个列表的文档。出于这个原因,我不认为可以遍历列表中的所有项目并选择我所在项目之前的项目,因为它们可能位于不同的列表中。

1 个答案:

答案 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
相关问题