Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 当列表中有新段落时,如何获取列表级别_Vba_Ms Word - Fatal编程技术网

Vba 当列表中有新段落时,如何获取列表级别

Vba 当列表中有新段落时,如何获取列表级别,vba,ms-word,Vba,Ms Word,我正在使用VB迭代Word文档的段落。该文件包含项目符号列表 我找到了如何测试当前段落是否是项目符号列表中的项目: If (Not pParagraph.Range.ListFormat.List Is Nothing) Then ... End If 我想在Word文档中区分以下两种情况: 情景1: 第一项第一段 第一项第二段 第二项第一段 情景2: 第一个项目符号列表的第一项也是唯一一项 两个项目符号列表之间的某些文本 第二个项目符号列表的第一项也是唯一一项 当我分析第二段时,我如何知

我正在使用VB迭代Word文档的段落。该文件包含项目符号列表

我找到了如何测试当前段落是否是项目符号列表中的项目:

If (Not pParagraph.Range.ListFormat.List Is Nothing) Then
  ...
End If
我想在Word文档中区分以下两种情况:

情景1:

第一项第一段

第一项第二段

第二项第一段 情景2:

第一个项目符号列表的第一项也是唯一一项 两个项目符号列表之间的某些文本

第二个项目符号列表的第一项也是唯一一项 当我分析第二段时,我如何知道我是处于第一种情况还是第二种情况

更一般地说,如果列表有几个级别,我如何知道我的段落处于哪个级别


我知道我可以测试pParagraph.Range.ListFormat.ListLevelNumber,但这只适用于对应于新项目的段落;当有一个新段落没有条目时,pParagraph.Range.ListFormat.List为nothing,级别始终为1。

我只是偶尔使用Word VBA,这只是用于从某个跨平台应用程序用Word编写,不用于广泛处理任何Word文档。我完全可以称自己是Word_VBA的新手。然而,我发现它很有趣,于是通过谷歌搜索来了解一些有趣的观点

至少在Word 2007中,我只使用2007,列表项中不能有段落,即情况1:第一项的第二段。请参阅&

假设您需要将手动换行处理为段落,并需要有相应的范围对象、文本、列表级别、列表值等进行进一步处理,我不知何故找到了一个有效的解决方案。它正在使用3级嵌套列表和手动换行的临时示例。我可以试试密码吗

Sub test()
Dim Pg As Paragraph, Sl As Long, Rng As Range, LineRng As Range
Dim PgType As String, ListNo As Long, LevelNo As Long, PgTxt As String, LIneTxt As String
Dim ManNewLine As Long, St As Long
Sl = 0
    For Each Pg In ThisDocument.Paragraphs
        If Pg.Range.ListFormat.List Is Nothing Then
        PgType = "Normal Para"
        Else
        PgType = "List Para"
        End If
    Set Rng = Pg.Range
    ListNo = Pg.Range.ListFormat.ListValue  ' Document level Paragraph will return zero as ListValue. 
    LevelNo = Pg.Range.ListFormat.ListLevelNumber
    PgTxt = Pg.Range.Text

    'Add the below section code for treating Manual Line breaks as pargarph
    'Start of code section
    St = 1
    ManNewLine = InStr(St, PgTxt, Chr(11))
        If ManNewLine > 0 Then
            Do While ManNewLine > 0 And St <= Len(PgTxt)
            Sl = Sl + 1
            LineRng.SetRange Start:=Rng.Characters(St).Start, End:=Rng.Characters(ManNewLine).End
            LIneTxt = LineRng.Text
            'Debug.Print St, ManNewLine, LIneTxt
            'Process Paragraph based on LineRng, PgType, ListNo, LevelNo, LIneTxt, Sl
            ProcessParagraph LineRng, PgType, ListNo, LevelNo, LIneTxt, Sl
            St = ManNewLine + 1
            ManNewLine = InStr(St, PgTxt, Chr(11))
            ManNewLine = IIf(ManNewLine <= 0, Len(PgTxt), ManNewLine)
            Loop
        Else
        Sl = Sl + 1
        Set LineRng = Rng
        LIneTxt = PgTxt
        'Process Paragraph based on LineRng, PgType, ListNo, LevelNo, LIneTxt, Sl
        ProcessParagraph LineRng, PgType, ListNo, LevelNo, LIneTxt, Sl
        End If
    'End of code section
    Next Pg
End Sub
Private Sub ProcessParagraph(LineRng As Range, PgType As String, ListNo As Long, LevelNo As Long, LIneTxt As String, Sl As Long)
'Remark = "Para Type:" & PgType & " List No=" & ListNo & " ListLevel=" & LevelNo & "*" & LIneTxt & "*"
'Debug.Print "Sl=" & Sl & Remark
'add your code to Process Paragraph based on LineRng, PgType, ListNo, LevelNo, LIneTxt, Sl
End Sub

如果发现有用,我很高兴

我终于找到了做我想做的事的方法

每次我有一个段落对应于一个列表开头,我都会使用pparragraph.LeftIndent记录该段落的左缩进。由于列表可能有几个级别,我记录了一个堆栈,其中包含当前打开的每个级别的缩进

当我有一个不是列表开头的新段落时,我可以通过比较它的左缩进和列表中每个打开级别的缩进来推断它的列表级别,或者它根本不是列表的一部分

例如,在本例中:

项目1第1级

项目1第2级

第1行

第2行

第3行


我可以推断第1行是第1项第2级的一部分,第2行是第1项第1级的一部分,第3行不在列表中。

恐怕你的问题不清楚。。。你能把范围缩小到一个特定的情况并举例说明吗?