如何用vba操作word的项目符号、编号列表、多级列表?

在word中可以为段落添加项目符号或者编号列表。

项目符合或者编号列表都属于一级列表,此外还可以为word段落添加多级列表。

在vba中,每个连续的项目符号或者编号列表或者多级列表构成了一个List对象。

所有List对象组合在一起构成了Lists集合对象。

当用For Each ..In语句遍历Lists集合对象时,它是按照从文档的末尾到开头的方向进行遍历的,这点要特别注意。

以下vba代码举例演示了如何遍历当前word文档中的所有列表,从文档末尾往文档开始方向遍历:

Sub QQ1722187970()
    Dim oDoc As Document
    Set oDoc = Word.ActiveDocument
    Dim oRng As Range
    Dim oList As List
    Dim oListFormat As ListFormat
    Dim oP As Paragraph
    '从文档末尾往文档开头遍历
    MsgBox oDoc.Lists.Count
    For Each oList In oDoc.Lists
        With oList
            .Range.Select
        End With
    Next
End Sub

每个List对象可以由多个具有项目符合或者编号列表或者多级列表的段落组成,要获得具体的List对象所具有的段落集合,可以使用ListParagraphs属性返回具体的List对象所具有的段落集合对象。

这里要特别注意的是只有应用了项目符合或者编号列表或者多级列表的段落才属于ListParagraphs,没有应用的属于普通的段落。

以下vba代码举例演示了如何遍历当前word文档中的所有列表所具有的段落数:

Sub QQ1722187970()
    Dim oDoc As Document
    Set oDoc = Word.ActiveDocument
    Dim oRng As Range
    Dim oList As List
    Dim oListFormat As ListFormat
    Dim oP As Paragraph
    '从文档末尾往文档开头遍历,先弹出总的列表数
    MsgBox oDoc.Lists.Count
    For Each oList In oDoc.Lists
        With oList
            '获取每个List对象所占据的段落集合所含的段落数
            MsgBox .ListParagraphs.Count
        End With
        Next
End Sub

要为具体的List对象应用哪种项目符合,编号列表或者多级列表格式,需要使用ListFormat对象。

以下vba代码举例演示了如何遍历当前word文档中的所有列表,并将列表全部改为默认的项目符合格式:

Sub QQ1722187970()
    Dim oDoc As Document
    Set oDoc = Word.ActiveDocument
    Dim oRng As Range
    Dim oList As List
    Dim oListFormat As ListFormat
    Dim oP As Paragraph
    '从文档末尾往文档开头遍历,先弹出总的列表数
    MsgBox oDoc.Lists.Count
    For Each oList In oDoc.Lists
        With oList
            .Range.ListFormat.ApplyBulletDefault
        End With
        Next
End Sub

如果原来的List对象就已经是默认的项目符合格式了,那么再次使用ApplyBulletDefault,将取消列表格式,这点要特别注意。

在用vba处理word的项目符号、编号列表或者多级列表时,最常用的两个操作就是将项目符号、编号列表或者多级列表转换为静态的文本,或者移除所有项目符号、编号列表或者多级列表。

将项目符号、编号列表或者多级列表转换为静态的文本,可以使用ConvertNumbersToText方法,要移除所有的项目符号、编号列表或者多级列表可以使用RemoveNumbers方法。

以下vba代码举例演示了如何将所有列表转换为静态文本:

Sub QQ1722187970()
    Dim oDoc As Document
    Set oDoc = Word.ActiveDocument
    Dim oRng As Range
    Dim oList As List
    Dim oListFormat As ListFormat
    Dim oP As Paragraph
    '从文档末尾往文档开头遍历,先弹出总的列表数
    MsgBox oDoc.Lists.Count
    For Each oList In oDoc.Lists
        With oList
            Set oListFormat = .Range.ListFormat
            With oListFormat
                .ConvertNumbersToText
            End With
        End With
        Next
End Sub

以下vba代码举例演示了如何移除所有的列表:

Sub QQ1722187970()
    Dim oDoc As Document
    Set oDoc = Word.ActiveDocument
    Dim oRng As Range
    Dim oList As List
    Dim oListFormat As ListFormat
    Dim oP As Paragraph
    '从文档末尾往文档开头遍历,先弹出总的列表数
    MsgBox oDoc.Lists.Count
    For Each oList In oDoc.Lists
        With oList
            Set oListFormat = .Range.ListFormat
            With oListFormat
                '移除所有的项目符号、编号列表、多级列表
                .RemoveNumbers
            End With
        End With
        Next
End Sub

如果要返回具体的列表编号字符串,可以使用ListString属性。

以下vba代码举例演示了如何获取当前选中内容所在的列表的项目编号的字符串:

Sub QQ1722187970()
    Dim oDoc As Document
    Set oDoc = Word.ActiveDocument
    Dim oRng As Range
    Dim oList As List
    Dim oListFormat As ListFormat
    Dim oP As Paragraph
    Set oRng = Word.Selection.Range
    With oRng
        '获取当前选中内容所在的第一个列表项目编号的字符串,比如"2.3.1"
       MsgBox .ListFormat.ListString
    End With
End Sub
       

发表评论