从Excel文档自动在Word中创建表

时间:2010-08-02 12:41:56

标签: excel vba ms-word

我在Excel中有一组数据,如下所示(CSV格式)

heading1, heading2, heading3, index
A , randomdata1, randomdata2, 1
A , randomdata1, randomdata2, 2
A , randomdata1, randomdata2, 3
B , randomdata1, randomdata2, 4
C , randomdata1, randomdata2, 5

我希望能够自动构建一个word文档,该文档将这些数据(由heading1分组的信息)显示在单独的表中。所以word文档就像

Table A
heading1, heading2, heading3, index
A , randomdata1, randomdata2, 1
A , randomdata1, randomdata2, 2
A , randomdata1, randomdata2, 3

Table B 
heading1, heading2, heading3, index
B , randomdata1, randomdata2, 4

Table C 
heading1, heading2, heading3, index
C , randomdata1, randomdata2, 5

请有人帮我这个,因为它可以节省大约20个小时非常无聊的副本和粘贴和格式化!

感谢您的帮助

1 个答案:

答案 0 :(得分:9)

通·

希望这是及时帮助。

要使其工作,您需要设置对Word的引用 - 在VBA编辑器中选择工具>引用并向下滚动到Microsoft Word ##,其中##是12.0表示Excel '07,11.0表示Excel '03等此外,运行此工作表时不应过滤工作表,虽然您不需要按标题1排序,但我认为您已经过了。

代码假定您的列表以单元格A1中的标题开头。如果这不是真的,你应该这样做。它还假设您在D中的最后一列。您可以在以“.Copy”开头的行中调整它。

Sub CopyExcelDataToWord()

Dim wsSource As Excel.Worksheet
Dim cell As Excel.Range
Dim collUniqueHeadings As Collection
Dim lngLastRow As Long
Dim i As Long
Dim appWord As Word.Application
Dim docWordTarget As Word.Document

Set wsSource = ThisWorkbook.Worksheets(1)
With wsSource
    lngLastRow = .Range("A" & Rows.Count).End(xlUp).Row
    Set collUniqueHeadings = New Collection
    For Each cell In .Range("A2:A" & lngLastRow)
        On Error Resume Next
        collUniqueHeadings.Add Item:=cell.Value, Key:=cell.Value
        On Error GoTo 0
    Next cell
End With
Set appWord = CreateObject("Word.Application")
With appWord
    .Visible = True
    Set docWordTarget = .Documents.Add
    .ActiveDocument.Select
End With
For i = 1 To collUniqueHeadings.Count
    With wsSource
        .Range("A1").AutoFilter Field:=1, Criteria1:=collUniqueHeadings(i)
        .Range("A1:D" & lngLastRow).Copy
    End With
    With appWord.Selection
        .PasteExcelTable linkedtoexcel:=False, wordformatting:=True, RTF:=False
        .TypeParagraph
    End With
Next i

For i = 1 To collUniqueHeadings.Count
    collUniqueHeadings.Remove 1
Next i
Set docWordTarget = Nothing
Set appWord = Nothing

End Sub