Я только изредка работаю с Word-VBA, и это только для записи в слове из какого-то кроссплатформенного приложения, а не для интенсивной обработки любого документа Word.Я могу честно назвать себя новичком в Word_VBA.Тем не менее, найдя это интересным, я прошел через поиск в Интернете и узнал некоторые интересные моменты.
По крайней мере, в Word 2007 (я использую только 2007) не может быть абзаца внутри элемента списка (т. Е. Ситуация 1: второй абзац первого элемента) .Пожалуйста, обратитесь к link1 , link2 & link3 .
Предполагая, что вам необходимо трактовать Ручные разрывы строк как абзац и требовать наличия соответствующего объекта диапазона, текста, уровня списка, значения списка и т. Д. Для дальнейшей обработки, якак-то прийти к рабочему решению.Он работает с временной выборкой из 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
рад, если найдется полезным.