我经常处理大型Word文档。我必须将所有段落转换为表格。
源文档结构示例:
转换后(插入->表->将文本转换为表)Word丢失有关随机段落缩进的信息。目标文件:
如您所见,段落“ c”和“ d”的缩进消失了。不知道为什么,但是它经常发生。
它应该与源文档中的完全相同:
查找和纠正非常大的文档中的错误需要花费数小时,因此我认为我可以通过从源段落中获取缩进值来修复目标文档中损坏的缩进。
这是我第一次使用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
该脚本按简单段落的预期工作,因为段落数与目标表中的行数匹配。但是对于源文档中存在的表来说,它会变得混乱。在表格中,段落数增加了一倍。
源表嵌套在一个目标单元格中,这很好,它们没有问题,也不必进行纠正。
所以我的问题是如何将源段落与表中的目标段落匹配(省略源表和目标嵌套表)?
也许还有另一种方法可以将段落转换为带有正确缩进的表?
答案 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