Как переназначить отступ после преобразования всех абзацев в таблицу в документе Word с VBA? - PullRequest
1 голос
/ 10 апреля 2019

Я регулярно работаю с большими документами Word.Я должен преобразовать все параграфы в таблицу.

Пример структуры исходного документа:

enter image description here

После преобразования (Вставка -> Таблица -> Преобразовать текст в таблицу) Word теряет информацию оотступы для случайных абзацев.Целевой документ:

enter image description here

Как видите, отступы для пунктов "c" и "d" исчезли.Не знаю почему, но это случается довольно часто.

Это должно быть точно так же, как в исходных документах:

enter image description here

Поиск и исправление ошибок для очень больших документов занимает несколько часов, поэтому я подумал, что можно исправить поврежденные отступы в целевом документе, взяв значения отступов из исходных абзацев.

Это моя первая попытка использования VBA, которую я началкак это:

Dim sourceDocument, targetDocument As Document
Dim myRange As Range
Set sourceDocument = ActiveDocument
Set targetDocument = Documents.Add(ActiveDocument.FullName)
Set myRange = targetDocument.Range(Start:=targetDocument.paragraphs(1).Range.Start, End:=targetDocument.paragraphs(targetDocument.paragraphs.Count).Range.End)
myRange.converttotable Separator:=wdSeparateByParagraphs
Dim i As Integer
For i = 1 To targetDocument.Tables(1).Range.Rows.Count
    targetDocument.Tables(1).Range.Rows(i).Range.Cells(1).Range.paragraphs(1).LeftIndent = sourceDocument.paragraphs(i).LeftIndent
    targetDocument.Tables(1).Range.Rows(i).Range.Cells(1).Range.paragraphs(1).FirstLineIndent = sourceDocument.paragraphs(i).FirstLineIndent
Next i

Сценарий работает, как и ожидалось, для простых абзацев, поскольку количество абзацев соответствует количеству строк в целевой таблице.Но в случае таблиц, существующих в исходном документе, это становится грязным.В таблицах количество абзацев удваивается.

Исходные таблицы вложены в одну целевую ячейку, что нормально, проблем с ними нет, и их не нужно исправлять.

Поэтому мой вопрос заключается в том, как сопоставить исходные абзацы с целевыми абзацами в таблицах (исключая исходные таблицы и целевые вложенные таблицы)?

Или, может быть, существует другой способ преобразования абзацев в таблицу с правильнымотступы

1 Ответ

0 голосов
/ 11 апреля 2019

Было бы несколько способов приблизиться к этому. После некоторого размышления я решил, что довольно простым будет получить массив всех абзацев , а не в таблице из исходного документа.

При циклическом переносе строк в целевом документе количество абзацев будет больше единицы только в строках, содержащих вложенную таблицу. В этом случае Range устанавливается в конец (последний абзац).

Затем отступ применяется к соответствующему абзацу в массиве с использованием счетчика цикла (плюс 1, поскольку массивы основаны на 0).

Sub RestoreParaIndents()
    Dim sourceDocument As Document, targetDocument As Document
    Dim myRange As Range
    Set sourceDocument = ActiveDocument
    Set targetDocument = Documents.Add(ActiveDocument.FullName)
    Set myRange = targetDocument.content  

    'Get an array of all paragraphs not in a table in the source document
    'This will provide the indent information in the loop for the target document
    Dim aParas() As Paragraph, para As Paragraph
    Dim counterPara As Long
    counterPara = 0
    For Each para In sourceDocument.Paragraphs
        If Not para.Range.Information(wdWithInTable) Then
            ReDim Preserve aParas(counterPara)
            Set aParas(counterPara) = para
            counterPara = counterPara + 1
        End If
    Next

    myRange.ConvertToTable Separator:=wdSeparateByParagraphs

    Dim i As Long
    Dim rw As Row, rng As Range
    For i = 1 To targetDocument.Tables(1).Range.Rows.Count
        Set rw = targetDocument.Tables(1).Range.Rows(i)
        Set rng = rw.Range.Cells(1).Range

        'If the cell contains multiple paragraphs then in contains
        'a nested table. Skip the table and go to the end (last paragraph)
        If rng.Paragraphs.Count > 1 Then
            Set rng = rng.Paragraphs.Last.Range
        End If
        rng.Paragraphs(1).LeftIndent = aParas(i - 1).LeftIndent
        rng.Paragraphs(1).FirstLineIndent = aParas(i - 1).FirstLineIndent 
    Next i
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...