当前位置: 首页 > 知识库问答 >
问题:

如何在用VBA将所有段落转换成Word文档中的一个表格后重新排列缩进?

佟颖逸
2023-03-14

我经常处理大型Word文档。我得把所有段落转换成一张表。

源文档结构示例:

转换后(插入->表->将文本转换为表),Word将丢失有关随机段落缩进的信息。目标文件:

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个答案

皇甫喜
2023-03-14

有很多方法可以解决这个问题。经过一些考虑,我决定一个相当直接的方法是从源文档中获得一个表中没有的所有段落的数组。

循环目标文档中的行时,只有在包含嵌套表的行中,段落数才会大于1。在本例中,范围被设置为末尾(最后一段)。

然后使用循环计数器(加上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
 类似资料:
  • 我有一个有很多表格的word文档。我想要一个宏,它将所有表的字体大小更改为10,将每个表自动匹配到窗口,并均匀分布列。我可以使用下面的代码完成最后两个目标,但不确定如何更改字体大小。任何帮助将不胜感激。

  • 我是word-vba宏的初学者(但我对excel-vba相当擅长),我希望更新一个“表的表”。我已经找到了如何为“table of content”和“table of dights”(使用)这样做,但是TableOfTables集合并不存在。有人知道我要做什么吗?

  • 我必须在Word文档中创建一个没有模板的报告。该报告由来自MS Access的记录组成--将有一些文本和一个表,基于记录的#迭代(我将基于记录的#使用VBA动态创建表)。我可以开始在word文档中插入文本,使用书签作为起点,然后可以添加表格和填充单元格。问题是填完表格后,如何将光标放在表格后的下一行开始插入文本。以下是我的代码任何人与一些提示或例子将会感激-谢谢!

  • 我已经很多年没有使用VB了,所以如果这是显而易见的,请原谅我。我正在尝试编写一个word vba宏,以便在模板中使用,该模板将显示一个userform,然后导入fileA的内容。docx,fileB。docx或fileC。docx取决于用户表单。(之后我将使用书签填写一些表单数据,我不知道这是否相关)。文件A、B和C将包含一些基本格式(如列表)的文本,但没有什么特别之处。 我在网上看到的解决方案可

  • 我有一个当前格式的文档 标题 字幕 H1 样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本 H2 样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本 H3 样本文本样本文本样本文本样本文本样本文

  • 示例单词内容为 Apache POI提供了API来给出段落和表的列表,但我无法阅读段落(测试用例)并立即查找该段落后面的表。 我尝试使用XWPFWordExtractor(读取所有文本)、bodyElementIterator(遍历所有主体元素),但大多数都给出了方法,该方法给出了段落列表和方法,该方法给出了文档中的所有表的列表。 我如何浏览所有段落,停在标题‘测试用例’之后的段落(第4段),然后