为什么VBA会将所有项目符号项视为同一个List对象的一部分?

时间:2017-04-13 15:06:46

标签: vba ms-word word-vba bulletedlist

我正在编辑一个Word文档,其中包含五个单独的项目符号列表。如果我在我的VBA代码中引用:

ActiveDocument.Lists(1).Range

然后它引用文档的整个部分,从第一个列表中的第一个项目到最后一个列表中的最后一个项目。

对于某些i > 1,我引用:

ActiveDocument.Lists(i)

在我的代码中,然后我收到错误。

我如何修复我的文档,以便我的文档中的五个项目符号列表中的每一个都有不同的索引,从1到5?

2 个答案:

答案 0 :(得分:1)

我能够通过以下方式复制:

  1. 添加项目符号列表
  2. 在列表的中间中,关闭其中一个项目上的项目符号。
  3. 在现在没有项目符号的行上输入一些文字。
  4. 当我这样做时,相应的List条目包含范围,包括中间的非项目符号行。

    我认为对您的问题最真实的答案是将您的文档保存为纯文本文件,将其打开,并将子弹重新应用到您想要的位置。我没有在网上找到任何关于拆分现有List的内容。

    据说,据我所知,List范围内的非项目符号行Range.ListFormat.ListTemplate等于Nothing,与项目符号行不同。因此,一种选择是迭代List记录并存储单独的范围,基于ListTemplate进行分解。例如,以下函数选择Lists(1)中的行直到第一个非项目符号行(快速黑客; YMMV):

    Public Sub SelectList1()
        Dim r As Range
        Set r = ActiveDocument.Lists(1).Range
        Dim p As Paragraph, foundit As Boolean
        foundit = False
    
        For Each p In r.Paragraphs
            If p.Range.ListFormat.ListTemplate Is Nothing Then
                foundit = True
                Exit For
            End If
        Next p
    
        If foundit Then
            r.End = p.Range.Start
        End If
    
        r.Select
    End Sub
    

    例如,使用如上所述创建的列表:

     * foo
     * bar
    bat
     * baz
    

    Lists(1).Range包括foobaz,包括介入的bar。运行SelectList1(上方)选择foobar行,但不选择batbaz

答案 1 :(得分:0)

根据MSDN

  

列出对象:表示已应用于文档中指定段落的单个列表格式。

因此,如果您有多个列表中间包含一些非项目符号的段落,Range将从第一个列表的第一个项目开始,以最后一个列表的最后一个项目结束包括中间所有没有项目符号的段落。

要解决此问题,您需要将列表分开(右键单击项目符号并选择单独列表)。

如果您想在不修改文档的情况下在代码中执行此操作,则必须迭代每个Range的{​​{1}}段落,并检查它是否有List表示它是一个列表项,否则它是一个非项目符号段落。与cxw's answer类似,但如果您有多个列表,则迭代所有列表。

此功能突出显示所有列表项并忽略中间的非项目符号段落:

ListFormat.ListTemplate