使用VBA将所有段落转换为Word文档中的表格后,如何重新缩进?

时间:2019-04-10 14:37:45

标签: vba ms-word

我经常处理大型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 :(得分:0)

有很多方法可以解决这个问题。经过一番考虑,我决定一个比较简单的方法就是从源文档中获取表中所有 not 段的数组。

当循环目标文档中的行时,只有在包含嵌套表的行中,段落数才会大于一。在这种情况下,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