ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 11459|回复: 7

[求助] word通过邮件合并功能批量复制excel文件表格并生成单独的文档

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-9-16 10:23 | 显示全部楼层 |阅读模式
最近在弄一个word批量文件生成的程序,就是通过把所有需要的资料文件统计在一个excel表里面(一行代表一个信息条),然后利用word邮件合并的功能,读取每一条记录,并根据记录中的表的名称,打开相应的表格,然后全选复制表的内容到word模版中指定的位置。现遇到了程序占用系统资源大的问题,剪切板中占用的资源多,希望有人来帮下优化下

数据文件.rar

210.38 KB, 下载次数: 118

所有资料都在这

TA的精华主题

TA的得分主题

发表于 2013-9-16 11:06 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-9-17 08:59 | 显示全部楼层
lhdcxz 发表于 2013-9-16 11:06
http://club.excelhome.net/thread-838620-1-1.html
供参考

感谢分享,很有参考价值,但是我这个比较复杂点,word打开多个excel文档复制黏贴的时候,还是很占据系统资源。求帮忙优化下

TA的精华主题

TA的得分主题

发表于 2013-9-17 10:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
看来你应该写出了代码,何不把你的代码贴出来,这样稍作修改就可以了、

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-9-18 08:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhanglei1371 发表于 2013-9-17 10:48
看来你应该写出了代码,何不把你的代码贴出来,这样稍作修改就可以了、

Sub myMailMerge()
    '主文档的类型为信函
    '合并全部数据记录
    '假设主文档已链接好数据源,可以进行正常的邮件合并
    Dim myMerge As MailMerge, i As Integer
    Dim table1app
    Dim table2app
    Dim table3app
    Dim myname As String
    Dim table1 As String
    Dim table2 As String
    Dim table3 As String
    'Application.ScreenUpdating = False
    Set myMerge = ActiveDocument.MailMerge
    With myMerge.DataSource
        If .Parent.State = wdMainAndDataSource Then
            .ActiveRecord = wdFirstRecord
            For i = 1 To .RecordCount
                .FirstRecord = i
                .LastRecord = i
                .Parent.Destination = wdSendToNewDocument
                '取得数据源第1个和第2个字段(合并域)的当前数据字符串,用以命名文件
                myname = .DataFields(1).Value
                table1 = .DataFields(7).Value
                table2 = .DataFields(8).Value
                table3 = .DataFields(9).Value
                .ActiveRecord = wdNextRecord
                .Parent.Execute  '每次合并一个数据记录
                With ActiveDocument
                    '.Content.Characters.Last.Previous.Delete  '删除分节符
                    .Fields(1).ShowCodes = False
                    .Fields.Update
                    Set table1app = CreateObject("excel.application")
                        With table1app
                           .Visible = False
                           .workbooks.Open "D:\数据文件\" & table1 & ".xlsx"
                           .ActiveSheet.UsedRange.Copy
                           ActiveDocument.Application.Selection.EndKey unit:=wdStory      '(希望定位在“表1:”下一行然后黏贴表格)
                           ActiveDocument.Application.Selection.TypeParagraph             '(希望定位在“表1:”下一行然后黏贴表格)
                           ActiveDocument.Application.Selection.PasteExcelTable False, False, False
                           ActiveDocument.Application.ScreenUpdating = False
                            .ActiveWorkbook.Close
                            .Quit
                         End With
                         ActiveDocument.Application.Selection.TypeParagraph
                         Set table2app = CreateObject("excel.application")
                        With table2app
                           .Visible = False
                           .workbooks.Open "D:\数据文件\" & table2 & ".xlsx"
                           .ActiveSheet.UsedRange.Copy
                           ActiveDocument.Application.Selection.EndKey unit:=WholeStory        '(希望定位在“表2:”下一行然后黏贴表格)
                           ActiveDocument.Application.Selection.PasteExcelTable False, False, False
                           ActiveDocument.Application.ScreenUpdating = False
                            .ActiveWorkbook.Close
                            .Quit
                         End With
                           ActiveDocument.Application.Selection.TypeParagraph
                           Set table3app = CreateObject("excel.application")
                          With table3app
                           .Visible = False
                           .workbooks.Open "D:\数据文件\" & table3 & ".xlsx"
                           .ActiveSheet.UsedRange.Copy
                           ActiveDocument.Application.Selection.EndKey unit:=WholeStory       '(希望定位在“表3:”下一行然后黏贴表格)
                           ActiveDocument.Application.Selection.PasteExcelTable False, False, False
                           ActiveDocument.Application.ScreenUpdating = False
                            .ActiveWorkbook.Close
                            .Quit
                         End With
                        
                    .SaveAs "d:\" & myname & ".doc"  '假设生成的各文档保存于E盘根目录下
                    .Close  '关闭生成的文档(已保存)
                End With
             Next
        End If
    End With
    Application.ScreenUpdating = True
    MsgBox "OK啦"
    End sub
这是我最开始想的   具体的在模版VBE里面有代码的,可以去看一下,刚看了楼上哥们给的参考,想到是不是可以把复制复制表格的代码做成一个模块,通过循环调用程序就好

TA的精华主题

TA的得分主题

发表于 2013-9-18 17:17 | 显示全部楼层
本帖最后由 zhanglei1371 于 2013-9-18 18:39 编辑

关于这一句Set table1app = CreateObject("excel.application")
试试这样:先判定是否有已经打开的excel程序,然后没有的话再创建;
    On Error Resume Next
     Set  table1app = GetObject(, "excel.application")
    If Err.Number > 0 Then
        Set  table1app = CreateObject("Excel.Application")
         table1app.Visible = True
    End If
关于剪贴板的话,试试使用api实时清空:
Private Declare Function CloseClipboard Lib "user32" () As Long
EmptyClipboard代码修改如下:
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Sub myMailMerge()
'主文档的类型为信函
'合并全部数据记录
'假设主文档已链接好数据源,可以进行正常的邮件合并
    Dim myMerge As MailMerge, i As Integer
    Dim table1app
    Dim table2app
    Dim table3app
    Dim myname As String
    Dim table1 As String
    Dim table2 As String
    Dim table3 As String
    'Application.ScreenUpdating = False
    Set myMerge = ActiveDocument.MailMerge
    With myMerge.DataSource
        If .Parent.State = wdMainAndDataSource Then
            .ActiveRecord = wdFirstRecord
            For i = 1 To .RecordCount
                .FirstRecord = i
                .LastRecord = i
                .Parent.Destination = wdSendToNewDocument
                '取得数据源第1个和第2个字段(合并域)的当前数据字符串,用以命名文件
                myname = .DataFields(1).Value
                table1 = .DataFields(7).Value
                table2 = .DataFields(8).Value
                table3 = .DataFields(9).Value
                .ActiveRecord = wdNextRecord
                .Parent.Execute  '每次合并一个数据记录
                With ActiveDocument
                    '.Content.Characters.Last.Previous.Delete  '删除分节符
                    .Fields(1).ShowCodes = False
                    .Fields.Update
                    On Error Resume Next
                    Set table1app = GetObject(, "excel.application")
                    If Err.Number > 0 Then
                        Set table1app = CreateObject("Excel.Application")
                        table1app.Visible = True
                    End If
                    With table1app
                        .Visible = True
                        .workbooks.Open "C:\数据文件\" & table1 & ".xlsx"
                        .ActiveSheet.UsedRange.Copy
                        ActiveDocument.Application.Selection.EndKey unit:=wdStory      '(希望定位在“表1:”下一行然后黏贴表格)
                        ActiveDocument.Application.Selection.TypeParagraph             '(希望定位在“表1:”下一行然后黏贴表格)
                        ActiveDocument.Application.Selection.PasteExcelTable False, False, False
                        ActiveDocument.Application.ScreenUpdating = False
                        OpenClipboard 0&
                        EmptyClipboard
                        CloseClipboard
                        .ActiveWorkbook.Close False
                        '                        .Quit
                    End With
                    ActiveDocument.Application.Selection.TypeParagraph
                    Set table2app = GetObject(, "excel.application")
                    With table2app
                        .Visible = True
                        .workbooks.Open "C:\数据文件\" & table2 & ".xlsx"
                        .ActiveSheet.UsedRange.Copy
                        ActiveDocument.Application.Selection.EndKey unit:=WholeStory        '(希望定位在“表2:”下一行然后黏贴表格)
                        ActiveDocument.Application.Selection.PasteExcelTable False, False, False
                        ActiveDocument.Application.ScreenUpdating = False
                        OpenClipboard 0&
                        EmptyClipboard
                        CloseClipboard
                        .ActiveWorkbook.Close False
                    End With
                    ActiveDocument.Application.Selection.TypeParagraph
                    Set table3app = GetObject(, "excel.application")
                    With table3app
                        .Visible = True
                        .workbooks.Open "C:\数据文件\" & table3 & ".xlsx"
                        .ActiveSheet.UsedRange.Copy
                        ActiveDocument.Application.Selection.EndKey unit:=WholeStory       '(希望定位在“表3:”下一行然后黏贴表格)
                        ActiveDocument.Application.Selection.PasteExcelTable False, False, False
                        ActiveDocument.Application.ScreenUpdating = False
                        OpenClipboard 0&
                        EmptyClipboard
                        CloseClipboard
                        .ActiveWorkbook.Close False
                    End With
                    .SaveAs "C:\" & myname & ".doc"  '假设生成的各文档保存于E盘根目录下
                    .Close  '关闭生成的文档(已保存)
                End With
            Next
        End If
    End With
    Application.ScreenUpdating = True
    MsgBox "OK啦"
End Sub


关于循环问题,应该不是难事。可以进一步简化,我就不去思考了{:soso_e113:}

TA的精华主题

TA的得分主题

发表于 2013-9-23 11:39 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-9-10 13:19 | 显示全部楼层
最后搞不懂文件到底保存哪了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-15 21:58 , Processed in 0.030037 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表