1

Тема: Как список сделать не списком

Помогите, пожалуйста, список типа

1. ляляля
   а. ляляля
   б. ляляля
       - ляляля
       - ляляля
   в. ляляля
2. ляляля

сделанный именно "списком" превратить в текст, где нумерация и отступы соответствуют "списку".
Я, право, даже не знаю с чего начать.

2

Re: Как список сделать не списком

Скажу с чего начать, а дальше лень smile

NumOfPara = Selection.Paragraphs.Count
For i=1 to NumOfPara
...

'Вывод левого отступа
Debug.Print Selection.Paragraphs(1).LeftIndent
'Вывод нумерационной цифры/буквы параграфа
Debug.Print Selection.Paragraphs(i).Range.ListFormat.ListString
'Убить нумерацию
Selection.Paragraphs(i).Range.ListFormat.RemoveNumbers NumberType:=wdNumberParagraph
...
Next

нужно еще вытащить табуляцию Paragraphs(i).Tabstops
и Paragraphs(i).Format.FirstLineIndent / LeftIndent

Макрорекордер + Watches window в помощь с пошаговым выполнением (+Immediate)
получится - с вас код в форум smile

Делай, что можешь, и будь, что будет!

3

Re: Как список сделать не списком

спс, получится - выложу, пока некогда

4

Re: Как список сделать не списком

а если у меня списки - многоуровневые, а отделитель цифр или маркеров от текста - пробел..

5

Re: Как список сделать не списком

Вот что получилось (работает) :

Sub SpisInTXT()
Dim P As Paragraph
Dim P1 As Double, P2 As Double
    
    For Each P In ActiveDocument.Paragraphs
        With P.Range
             If .Start < .End - 1 Then
                .MoveEnd wdCharacter, -1
                If .ListFormat.ListString <> "" Then
                   .Text = .ListFormat.ListString + " " + .Text
                End If
            End If
        End With
    Next P
    
    For Each P In ActiveDocument.Paragraphs
        With P
             P1 = .FirstLineIndent: P2 = .LeftIndent
            .Range.ListFormat.RemoveNumbers NumberType:=wdNumberParagraph
            .FirstLineIndent = P1: .LeftIndent = P2
        End With
    Next P
End Sub

Спасибо VBA-addict за подсказку

Нужно быть аккуратнее с ненумерованными списками: маркеры преобразуются в "кракозябры"
Ожидая вопрос; за один проход не работает - списки становятся все с 1-го номера.

6

Re: Как список сделать не списком

EletsAdm пишет:

Нужно быть аккуратнее с ненумерованными списками: маркеры преобразуются в "кракозябры"

Немного покопался... с Watches:
Чтобы избежать - первую пару if'ов предлагаю заменить

                If .ListFormat.ListString <> "" Then
                    
                    MarkerReplacer = .ListFormat.ListString
                    
                    Select Case .ListFormat.ListType
                        Case wdListPictureBullet
                            MarkerReplacer = "*"
                        Case wdListBullet
                            If Chr(Asc(P.Range.ListFormat.ListString)) = "?" And _
                                P.Range.ListFormat.ListString <> "?" Then MarkerReplacer = ">"
                    End Select
                    
                   .Text = MarkerReplacer + " " + .Text
                End If

тогда маркеры-картинки будут заменяться на "*"
маркеры-списка неформатного вида - на ">"
причем не очень понятно в каком случае .ListFormat.ListString возвращает "?", а в каком сам символ... так "-" возвращается как "-", а вот маркер "+" - уже как "?"

Chr(Asc(P.Range.ListFormat.ListString)) = "?" And P.Range.ListFormat.ListString <> "?"
это мудреное сравнение, поскольку в Immediate видим "?", а на самом деле этот символ передается другим значением - возможно Unicode?, поэтому ListFormat.ListString = "?" будет все время False, кроме случаев когда маркер сам знак вопроса...

В общем, если маркированные списки приводить к одному виду, то можно проще - см. когда .ListFormat.ListType соответствует нумерованному списку, а остальные - заменять.
А вообще-то интересно - если кто знает как выцепить марекеры, являющиеся "Символами/Character" и вбабахать их при замене - было бы интересно... Кто знает - припишите идеи.

Отредактировано VBA-addict (01.12.2010 21:29:31)

Делай, что можешь, и будь, что будет!

7

Re: Как список сделать не списком

Хотя тема обсуждалась еще в 2010 году, может быть кого то еще заинтересует "Как список сделать не списком" с помощью одной строки кода

Sub NumbersToText()
   ActiveDocument.ConvertNumbersToText
End Sub