在日常办公中,经常需要将 Excel 中的表格数据导出到 Word 文档进行汇报或打印。本文介绍一种 VBA 方法,可以批量将 Excel 数据导出到 Word。
实例需求:Excel数据表包含三列:箱号、数量、型号。

根据数据创建Word文档
- 设置文档字体(微软雅黑)、字号(40)及水平居中格式
 - 每页第一行为空行
 - 每组数据分页显示
 - 如果第3列有多个型号(逗号分隔),那么拆分为单个型号
 
Word文档如下图所示。

示例代码如下:
            
            
              vb
              
              
            
          
          Sub ExportToWord_2()
    Const wdAlignParagraphCenter As Long = 1
    Const wdBreakPage As Long = 7
    Const wdFormatXMLDocument As Long = 16
    Const wdReplaceAll As Long = 2
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim ws As Worksheet: Set ws = wb.Worksheets("Sheet1")
    Dim dataArr As Variant
    dataArr = ws.Range("A1").CurrentRegion.Value
    Dim wdApp As Object: Set wdApp = CreateObject("Word.Application")
    wdApp.Visible = False
    Dim wdDoc As Object: Set wdDoc = wdApp.Documents.Add()
    With wdDoc.Styles("Normal").Font
        .Name = "微软雅黑"
        .Size = 40
    End With
    With wdDoc.Styles("Normal").ParagraphFormat
        .Alignment = wdAlignParagraphCenter
        .SpaceAfter = 0
        .SpaceBefore = 0
    End With
    Dim boxNo As String, qty As String, models As String, fname As String
    Dim arrModels, j As Long, modelItem As String, i As Long, sTxt As String
    Const PAGE_BREAK = "$$$"
    For i = 2 To UBound(dataArr, 1)
        boxNo = Trim(CStr(dataArr(i, 1)))
        qty = Trim(CStr(dataArr(i, 2)))
        models = Trim(CStr(dataArr(i, 3)))
        If Len(boxNo & qty & models) Then
            arrModels = Split(models, ",")
            For j = LBound(arrModels) To UBound(arrModels)
                modelItem = Trim(arrModels(j))
                sTxt = Join(Array(sTxt & PAGE_BREAK, "", _
                            dataArr(1, 1), boxNo, _
                            dataArr(1, 2), qty, _
                            dataArr(1, 3), modelItem), vbCrLf)
            Next j
        End If
    Next i
    sTxt = Mid(sTxt, Len(PAGE_BREAK) + 3)
    wdDoc.Characters.Last.Text = sTxt
    With wdDoc.Content.Find
        .Text = PAGE_BREAK
        .Replacement.Text = "^m"
        .Forward = True
        .Wrap = 1
        .Format = False
        .MatchWildcards = False
        .Execute Replace:=wdReplaceAll
    End With
    fname = wb.Path & "\" & Format(Now, "yyyymmdd_hhnnss") & ".docx"
    wdDoc.SaveAs2 Filename:=fname, FileFormat:=wdFormatXMLDocument
    wdDoc.Close False
    wdApp.Quit
    MsgBox "已生成 Word 文件:" & vbCrLf & fname, vbInformation
End Sub
        【代码解析】
第1~21行代码与前一篇博客相同,不再赘述, 请参考《快速创建Word箱单(1/2)》。
第24行代码定义分页符占位符常量 PAGE_BREAK 为字符串 $$$。
第25行代码开始循环,从数据第二行起(跳过表头)逐行处理 Excel 数据。
第26~28行代码获取当数据行内容,并去除空格,保存在变量中。
第29行代码判断当前行是否为空,若三列均为空则跳过,否则进入处理逻辑。
第30行代码将型号字符串按英文逗号拆分为数组 arrModels,用于逐个输出。
第31行代码开始循环遍历当前行的每个型号项。
第32行代码去除当前型号项两端空格,赋值给 modelItem。
第33~36行代码将表头字段及当前数据拼接为文本段落,并在每组前面加上分页符占位符。
此处使用了Join函数,其第二参数(即分割符)为换行符 vbCrLf,改用这个结构之后,代码更简洁清晰。
第40行代码去除字符串开头多余的分页符占位符和换行符,得到最终文本 sTxt。
第41行代码将处理后的完整文本写入 Word 文档末尾。
第42~50行代码使用 Word 查找替换功能,将占位符 $$$ 替换为实际分页符^m,实现每行数据分页显示。
第51行代码生成 Word 文件名 fname,命名格式为"年月日_时分秒.docx",并保存在当前工作簿目录。
第52行代码将 Word 文档保存为 .docx 格式。
第53行代码关闭 Word 文档对象,但不保存后续修改。
第54行代码退出 Word 应用程序,释放资源。
第55行代码弹出提示框,显示生成文件的完整路径及文件名。