ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] Word VBA一键实现 邮件合并自动加载Excel数据,合并完后自动保存

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-6-11 23:15 | 显示全部楼层 |阅读模式
由于要在MS word 2003中大量的数据要进行邮件合并操作,实际是每次要浏览Excel数据库的位置,比较麻烦,在合并完后又要选择保存的位置,现在写一个VBA宏程序,实现:
1.运行第一个宏,实现自动加载指定位置的Excel数据源(这个指定位置的Excel数据源的名字要从一个文件中读取)
2.运行第二个宏,实现进行邮件合并,并把合并后的Word文档自动保存到指定位置并关闭, Word文档自动保存的名字,就是第一个宏加载的Excel数据源的名字(或者是Excel数据源中某一个单元格的数据)

[ 本帖最后由 dyt2020 于 2011-6-12 14:54 编辑 ]

数据和效果.rar

8.63 KB, 下载次数: 1281

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-12 10:50 | 显示全部楼层
条件:从当前用户桌面的Excel表获取数据源,Excel表数据源的名字从用户D盘的1.xls Sheet1!A1获取
运行第一个宏加载数据库必须先打开一个Excel表,否则会出错
运行第二个宏合并1-6条记录至桌面,并关闭
由于第一次写这种东东 好多地方还要优化,稍候在附上,后面将将实现一键实现从数据加载到合并至指定位置,简化大家的工作量
第一个宏编写:
Sub 加载数据库()
'
' 加载数据库 Macro
' 宏在 2011-6-11 由 雨林木风 录制
'
      chan = DDEInitiate(app:="Excel", topic:="system") '打开一个DDE通道
      DDEExecute channel:=chan, Command:="[open(" & Chr(34) & "D:\1.xls" & Chr(34) & ")]"  '在一个应用程序中执行打开.xls文件命令,需要指出的是,系统要求所需文件必须放在D盘。
      DDETerminate channel:=chan   '关闭DDE通道
      chan = DDEInitiate(app:="Excel", topic:="D:\1.xls")     '打开一个DDE通道
      Dim s As String
      Dim q As String
      Dim y As String
      s = DDERequest(channel:=chan, Item:="R1C1")
      DDETerminateAll
      Dim excelClose As Object
      Set excelClose = GetObject(, "Excel.Application")
      excelClose.workbooks("1.xls").Close False
      y = Left(s, Len(s) - 1)
      q = "C:\Documents and Settings\" & Environ("USERNAME") & "\桌面\" & y & ".xls"

    ActiveDocument.MailMerge.OpenDataSource Name:=q, _
        ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
        AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
        WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
        Format:=wdOpenFormatAuto, Connection:= _
        "Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=q;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Data" _
        , SQLStatement:="SELECT * FROM `Sheet1$`", SQLStatement1:="", SubType:= _
        wdMergeSubTypeAccess
End Sub

第二个宏已经变相的实现:多谢这个帖子:http://club.excelhome.net/thread-729315-1-1.html
下面是代码:

Sub 保存至桌面()
'主文档的类型为信函
'合并全部数据记录
'假设主文档已链接好数据源,可以进行正常的邮件合并
Dim myMerge As MailMerge, i As Integer, myname As String
Application.ScreenUpdating = False
Set myMerge = ActiveDocument.MailMerge
With myMerge.DataSource
    If .Parent.State = wdMainAndDataSource Then
        .ActiveRecord = wdFirstRecord
   
            .FirstRecord = 1
            .LastRecord = 6
            .Parent.Destination = wdSendToNewDocument
            '取得数据源第1个和第2个字段(合并域)的当前数据字符串,用以命名文件,根据需要增减修改
            myname = .DataFields(9).Value & " (" & .DataFields(35).Value & "Km" & ")"
            .ActiveRecord = wdNextRecord
            .Parent.Execute  '每次合并一个数据记录
            With ActiveDocument
                .Content.Characters.Last.Previous.Delete  '删除分节符
                .SaveAs "C:\Documents and Settings\" & Environ("USERNAME") & "\桌面\" & myname & ".doc"  '假设生成的各文档保存于c盘桌面
                .Close  '关闭生成的文档(已保存)
            End With
            
    End If
  End With
End Sub

[ 本帖最后由 dyt2020 于 2011-6-12 16:20 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-12 11:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
55555555555555555

[ 本帖最后由 dyt2020 于 2011-6-12 17:44 编辑 ]

TA的精华主题

TA的得分主题

发表于 2012-6-18 23:13 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-2-21 15:46 | 显示全部楼层
realmilk 发表于 2012-6-18 23:13
保存下来,好好研究一下

楼主  请问什么意思   这个几个代码    能否指导下 我刚刚玩word VBA
s = DDERequest(channel:=chan, Item:="R1C1")

      y = Left(s, Len(s) - 1)
      q = "C:\Documents and Settings\" & Environ("USERNAME") & "\桌面\" & y & ".xls"

TA的精华主题

TA的得分主题

发表于 2013-7-6 00:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
恰好需要,好好研究下,

TA的精华主题

TA的得分主题

发表于 2014-7-14 17:25 | 显示全部楼层
邮件合并功能,不错不错,支持学习

TA的精华主题

TA的得分主题

发表于 2014-7-15 10:01 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-7-16 00:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
闻启学 发表于 2013-2-21 15:46
楼主  请问什么意思   这个几个代码    能否指导下 我刚刚玩word VBA
s = DDERequest(channel:=chan, It ...

word2003中的帮助:
  1. DDEInitiate 方法
  2. 参阅应用于示例特性打开通向其他应用程序的 DDE(动态数据交换)通道,并返回通道序号。


  3. 安全性  动态数据交换 (DDE) 是一种不安全的陈旧技术。如果可能,请使用比 DDE 更加安全的技术,如对象链接与嵌入 (OLE)。


  4. expression.DDEInitiate(App, Topic)
  5. expression      可选。该表达式返回一个 Application 对象。

  6. App      String 类型,必需。应用程序名。

  7. Topic      String 类型,必需。DDE 主题名称(比如某一打开文档的名称),通道所指向的应用程序将识别该名称。

  8. 说明
  9. 如果成功,DDEInitiate 方法将返回打开通道的序号。所有后续的 DDE 函数通过该序号来识别本通道。

  10. 示例
  11. 本示例用 System 主题创建 DDE 会话,并打开 Microsoft Excel 工作表 Sales.xls。然后本示例终止 DDE 通道,创建通向 Sales.xls 的通道,并在 R1C1 单元格中插入文本。

  12. Dim lngChannel As Long

  13. lngChannel = DDEInitiate(App:="Excel", Topic:="System")
  14. DDEExecute Channel:=lngChannel, Command:="[OPEN(" & Chr(34) _
  15.     & "C:\Sales.xls" & Chr(34) & ")]
  16. DDETerminate Channel:=lngChannel
  17. lngChannel = DDEInitiate(App:="Excel", Topic:="Sales.xls")
  18. DDEPoke Channel:=lngChannel, Item:="R1C1", Data:="1996 Sales"
  19. DDETerminate Channel:=lngChannel
  20.                
复制代码
至于Environ("USERNAME") ,是当前用户的环境变量。一般是管理员:Administrator

TA的精华主题

TA的得分主题

发表于 2015-8-17 15:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
研究研究。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 02:27 , Processed in 0.050249 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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