Word·VBA文档合并

目录

之前的文章《Word·VBA实现邮件合并》虽然可以生成邮件合并文档结果,但是不能像《python实现word邮件合并》一样,最终所有结果合并为1个文档,那么只能用vba实现文档合并功能

  • 以下代码在Word启用宏的文档中运行

1,复制法,不保留原文档格式

Range.InsertAfter 方法只能插入文本,因此合并结果不保留原文档格式

vbnet 复制代码
Sub 合并文档_复制法()
    '合并文件夹中所有doc*文档,并保存文档至该文件夹;但不保留原文档格式
    Dim file_path$, file_name$, docx As Document, f As Document
'--------------------参数填写:
    file_path = "E:\测试\docx\结果\"  '文件夹
    file_name = Dir(file_path & "*.doc*"): tm = Timer
    Set docx = Documents.Add    '新建文档,合并文档
    Application.ScreenUpdating = False  '关闭屏幕更新,加快程序运行
    Do While file_name <> ""
        Set f = Documents.Open(file_path & file_name)
        docx.Content.InsertAfter f.Content  '将文档内容复制到合并文档末尾
        f.Close (False)
        file_name = Dir  '下一个文件名
    Loop
    docx.SaveAs FileName:=file_path & "合并文档.docx"  '保存
    docx.Close
    Application.ScreenUpdating = True
    Debug.Print "文件夹文档合并完成,用时:" & Format(Timer - tm, "0.00")  '耗时
End Sub
  • 合并结果

2,复制法,保留原文档格式

rng.Paste偶尔运行报错,原因未知

vbnet 复制代码
Sub 合并文档_复制法2()
    '合并文件夹中所有doc*文档,并保存文档至该文件夹;保留原文档格式
    Dim file_path$, file_name$, docx As Document, f As Document, rng As Range
'--------------------参数填写:
    file_path = "E:\测试\docx\结果\"  '文件夹
    file_name = Dir(file_path & "*.doc*"): tm = Timer
    Set docx = Documents.Add    '新建文档,合并文档
    Application.ScreenUpdating = False  '关闭屏幕更新,加快程序运行
    Do While file_name <> ""
        Set f = Documents.Open(file_path & file_name)
        Set rng = f.Content: rng.Copy
        Set rng = docx.Content
        rng.Collapse Direction:=wdCollapseEnd  '结束位置
        rng.Paste: rng.InsertAfter Chr(12)     '粘贴,并插入换页符
        f.Close (False)
        file_name = Dir  '下一个文件名
    Loop
    docx.SaveAs FileName:=file_path & "合并文档.docx"  '保存
    docx.Close
    Application.ScreenUpdating = True
    Debug.Print "文件夹文档合并完成,用时:" & Format(Timer - tm, "0.00")  '耗时
End Sub
  • 合并结果

3,插入法,保留原文档格式

Selection.InsertFile 方法插入指定文件

vbnet 复制代码
Sub 合并文档_插入法()
    '合并文件夹中所有doc*文档,并保存文档至该文件夹;保留原文档格式
    Dim file_path$, file_name$, docx As Document
'--------------------参数填写:
    file_path = "E:\测试\docx\结果\"  '文件夹
    file_name = Dir(file_path & "*.doc*"): tm = Timer
    Set docx = Documents.Add    '新建文档,合并文档
    Application.ScreenUpdating = False  '关闭屏幕更新,加快程序运行
    Do While file_name <> ""
        Selection.InsertFile FileName:=file_path & file_name, Link:=False  '所有文档
        Selection.InsertBreak Type:=wdPageBreak  '插入换页符
        file_name = Dir  '下一个文件名
    Loop
    docx.SaveAs FileName:=file_path & "合并文档.docx"  '保存
    docx.Close
    Application.ScreenUpdating = True
    Debug.Print "文件夹文档合并完成,用时:" & Format(Timer - tm, "0.00")  '耗时
End Sub
  • 合并结果:与方法2一致
  • 3种方法对比
文档合并 方法1 方法2 方法3
耗时秒数 4.41 5.48 0.61
  • 方法3不但生成结果与方法2一致,而且代码运行速度快数倍
相关推荐
IHaveADiscovery5 天前
无痛让AI由Markdown转Word:Pandoc模板了解一下
人工智能·word·markdown
yivifu8 天前
使用lxml操作 Word 的 OpenXML 底层
word·openxml·lxml
VBA63378 天前
VBA数据库解决方案第二十六讲 工作表中不存在的数据在数据表中批量删除
vba
梦想出海-Phoebe9 天前
Gemini新增文件编辑功能:PDF、Word、Excel处理体验分享
pdf·word·excel
开开心心_Every10 天前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
ComPDFKit12 天前
PDF转Word后,每行都成一段?先分清断段、文本框和扫描页
pdf·word
thethefighter12 天前
快速预览Word、WPS秒开,支持空格弹窗
linux·word·wps·快速预览·空格弹窗·nhdeepview
SunnyDays101112 天前
Java 操作 Word 脚注和尾注:添加、读取与删除
java·word
SunnyDays101112 天前
Java 为 Word 添加页码:隐藏封面页码、从指定页开始编号、奇偶页页码设置等
java·word·页码
Eiceblue12 天前
用 Python 给 Word 文档加水印:文字、图片与批量处理
开发语言·vscode·python·word