ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享]关于邮件合并的一些高级应用

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2005-1-22 10:37 | 显示全部楼层 |阅读模式

广义的邮件合并的高级应用和教程

1. 什么是邮件合并:大多数人被邮件一词所迷惑,其实广义的邮件合并,我的理解是将指定数据源(邮件合并数据源)中的记录按用户要求(主控文档)提取到指定文档(可以是打印机,也可以是子文档)的过程与功能。

2. 数据源要求:所有数据源,是指符合数据库特征的文档(*.DOC),工作薄(*.XLS)或者表(*.MDB)等等,它们的共同特点是具有行具有记录特性,列具有字段特性。

3. 邮件合并的用途,正如其的译名一样,最初便是广泛应用于邮件的发送方面,同一个结构下的不同数据的重复操作,只是更换了其中的记录数据。因此,凡是符合或者想要达到此目的的具有类似操作的,均可以使用邮件合并功能。邮件合并可以广泛应用于信封的打印,标签的打印,请柬的打印,成绩单的打印,工资单的打印,记录的打印,包括我们常用的序列号的打印等等。而我们常用的数据源,以EXCEL为主,原因是在EXCEL中生成有序的数据,较之WORD中更为方便快捷有序。

4. 以下一些高级应用,摘自本论坛中,希望能够对大家有所帮助:

4.1. 拆分字段

如: 如:在数据源“完成日期”字段的某条记录是“2004-4-1”,我想在主控文档中插入2004、4、1,3个域位置不连续。

在主控文档中分别插入三个域:如下{ MERGEFIELD\@"yyyy" "完成日期" }, { MERGEFIELD\@"M" "完成日期" }, { MERGEFIELD\@"D" "完成日期" }

请参此链接:

http://club.excelhome.net/dispbbs.asp?BoardID=23&replyID=332479&id=68445&skin=0

4.2. 条件判断:

通过邮件合并工具来自动生成请柬。判断依据,如果性别为男则在姓名后添加先生,如果性别为女且年龄为25以下添加小姐,大于25添加女士。

解决方法: 原理相当于EXCEL中的IF公式:即if (性别="男","先生",if (年龄>35,"女士","小姐")),域代码如下: { MERGEFIELD "姓名" }{IF {MERGEFIELD 性别 } = "男" "先生" { IF MERGEFIELD 年龄 } > 25 "女士" "小姐" }},参见以下链接:

http://club.excelhome.net/dispbbs.asp?BoardID=23&replyID=376140&id=75330&skin=0

4.3. 一些较为复杂的解决方法,在WORD中又没有提供更合适方法的情况下,我们可以参考以下EXCEL解决方案

4.3.1. 这是EXCEL的解决方案之一:,供参考:(所有操作均在EXCEL中完成)

4.3.1.1. 数据/分类汇总:分类字段:姓名;汇总公式:计数;汇总项:姓名;每组数据分页;确定。

4.3.1.2. 汇总后数据,点击左上角(状态栏下方)的“组及分类显示级别”2(共分三级:1,2,3),选中A2~A38(根据你上传的附件),F5定位为可见单元格,即选中所有汇总项的单元格(目的是隐藏它们);

4.3.1.3. 点级别3,所有数据倒全部在屏幕上显示,所有分类汇总的单元格已被选中,格式/行/隐藏,这样,已经形成的分页的单独分姓名显示;

4.3.1.4. 格式化:全选数据区域,F5定位为可见单元格,CTRL+1,设置单元格格式,字体与边框和行高等设置。

4.3.1.5. 页面设置:文件/页面设置/工作表选项卡,顶端标题栏,选第一行(A1),页边距选项卡,勾选居中方式:水平后确定。

4.3.1.6. 预览一下我们的成果。

4.3.2. EXCEL解决方案之二:EXCEL&WORD的Automation(自动化)解决方案:

Sub WriteToWord()

Dim MyRange As Range, i As Range, LastAddress As String

Dim WdApp As Word.Application, Doc As Word.Document, N As Integer

On Error GoTo ErrHandle '启动错误处理程序

LastAddress = Sheets(1).[B65536].End(xlUp).Address 'B列最后一个数据

Set MyRange = Sheets(1).Range("B2:" & LastAddress) '定义循区域范围

Set WdApp = CreateObject("Word.Application") '创建WORD对象

N = 2 '从第二行开始

With WdApp

.ScreenUpdating = False '关闭WORD屏幕更新

Set Doc = .Documents.Open(ThisWorkbook.Path & "\pswxm.DOT") '打开该模板

'在与本工作薄同一文件夹下

For Each i In MyRange '在指定范围内循环

If i <> i.Offset(-1, 0) Then '如果该数据与下一数据不同

N = 2 '初始化N值

'移到文档最后

.Windows(Doc).Selection.EndKey Unit:=wdStory

'当I的行号非2时插入分页符

If i.Row > 2 Then .Windows(Doc).Selection.InsertBreak Type:=wdPageBreak

'光标处插入已设置的自动图文集

Doc.AttachedTemplate.AutoTextEntries("成绩表").Insert where:=.Windows(Doc).Selection.Range, _

RichText:=True

Else '否则则选定当前表格的最后一行并向下插入一行

Doc.Tables(Doc.Tables.Count).Rows(N).Select

WdApp.Windows(Doc).Selection.InsertRowsBelow 1

N = N + 1 '加1

End If

With Doc.Tables(Doc.Tables.Count) '对当前表格赋值

.Cell(N, 1).Range = i.Offset(, -1) '学期

.Cell(N, 2).Range = i '姓名

.Cell(N, 3).Range = i.Offset(, 1) '英语

.Cell(N, 4).Range = i.Offset(, 2) '高等数学

.Cell(N, 5).Range = i.Offset(, 3) 'C语言

End With

Next

.Visible = True 'WORD程序可见,假设此句放在上面,可在调试过程中看到WROD运行情况

.ScreenUpdating = True 'WORD屏幕更新恢复

End With

Application.ScreenUpdating = True

MsgBox "运行结束,请切换到WORD程序中进行编辑与打印设置!", vbOKOnly + vbInformation

Exit Sub

ErrHandle:

MsgBox "Excel & Word遇到不可遇见错误!请进行调试模式,进行调试!", vbOKOnly + vbCritical

End Sub

相关链接:http://club.excelhome.net/viewthread.php?tid=78597

4.4. 格式设置:

通过数据判断进行相关格式的设置,可以在EXCEL中更方便,利用条件格式和结合我上述的EXCEL解决方案.

在WORD的作用原理:通过新建类模块,将新的类模块指向WORD.APPLICATION事件,利用其中的类APP的特定事件App_MailMergeBeforeRecordMerge(即在邮件合并前事件)进行设计,完成指定功能与格式设置.

'* +++++++++++++++++++++++++++++ '* Created By I Love You_Word!@ExcelHome 2005-1-22 09:25:54 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '^The Code CopyIn [类模块-EventClassModule]^' '* -----------------------------

Public WithEvents App As Word.Application '在类模块中声明对应于事件的对象变量。 '编写指定事件的过程。 Private Sub App_MailMergeBeforeRecordMerge(ByVal Doc As Document, Cancel As Boolean) '如果主文档数据源中的字段1中的数据小于60(分)时 If Doc.MailMerge.DataSource.DataFields(1).Value < 60 Then '主文档表格的第二行第二列(相当于B2)中的字体为红色 Doc.Tables(1).Cell(2, 2).Range.Font.Color = wdColorRed Else '否则恢复为自动色 Doc.Tables(1).Cell(2, 2).Range.Font.Color = wdColorAutomatic End If End Sub '---------------------- '* +++++++++++++++++++++++++++++ '* Created By I Love You_Word!@ExcelHome 2005-1-22 09:23:53 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '^The Code CopyIn [ThisDocument-ThisDocument]^' '* -----------------------------

Dim X As New EventClassModule '从其他模块中初始化已声明的对象。 Private Sub Document_Open() Set X.App = Word.Application End Sub '----------------------

相关链接:

http://club.excelhome.net/viewthread.php?tid=79445

TA的精华主题

TA的得分主题

发表于 2005-1-22 21:32 | 显示全部楼层

请问版主,在邮件合并帮助器中,点击主文档的“创建”按钮弹出菜单,有“套用信函”、“邮件标签”、“信封”、“分类”等,请问这几种有什么不同?

[分享]关于邮件合并的一些高级应用

[分享]关于邮件合并的一些高级应用

TA的精华主题

TA的得分主题

发表于 2005-12-21 08:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
不错

TA的精华主题

TA的得分主题

发表于 2005-12-21 13:15 | 显示全部楼层

守柔呀,如果中国设置WORD博导,您第一个就是了。

看着一个个精品问世,真是感慨良多。

编程,我绝对得放弃了,时间没那么多,精力也有限呀。

TA的精华主题

TA的得分主题

发表于 2006-4-24 19:10 | 显示全部楼层

“大多数人被邮件一词所迷惑”这句话最有份量,在此之前我便是被迷惑的人之一。

真的很精彩!

TA的精华主题

TA的得分主题

发表于 2006-6-8 12:34 | 显示全部楼层

达摩南来 法传慧可

以下是引用[I]办公之星[/I]在2005-12-21 13:15:00的发言:[BR]

守柔呀,如果中国设置WORD博导,您第一个就是了。

看着一个个精品问世,真是感慨良多。

  看到办公前辈发此浩叹,小弟猛惊——是啊,Word也该设个博导了!小弟一定第一个立于程门雪中!放眼国内,对Word精研若老大者,将Word发扬光大若老大者,屈指可数(小弟寡陋,还没有见过第二个)。   也想,当初若是老大去了Excel版块,这Word版块是不是就“小子平平”呢?固然,高手辈出,但少了老大,Word版块必然山河失色。现在老大已经成了Word版块技艺与精神的“高地”,让人望雪峰而心向往!   愿老大大力“弘法”的同时,珍摄“金体”!

TA的精华主题

TA的得分主题

发表于 2006-6-8 16:11 | 显示全部楼层
呵,守柔版主的贴子的确让我们大家学到不少东西,不过关于,宏的编写,我还是涉足很浅,想请版主推荐说明下如何学习~!

TA的精华主题

TA的得分主题

发表于 2006-6-8 16:33 | 显示全部楼层
关于邮件合并,我一直有个问题不明白,我想把EXECL中的钱合并后转化为大写,怎么实现呢

TA的精华主题

TA的得分主题

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

邮件合并功能能不能打印带照片的准考证,各位高手

TA的精华主题

TA的得分主题

发表于 2006-10-21 13:21 | 显示全部楼层
QUOTE:
以下是引用守柔在2005-1-22 10:37:00的发言:

广义的邮件合并的高级应用和教程

1.        什么是邮件合并:大多数人被邮件一词所迷惑,其实广义的邮件合并,我的理解是将指定数据源(邮件合并数据源)中的记录按用户要求(主控文档)提取到指定文档(可以是打印机,也可以是子文档)的过程与功能。

2.        数据源要求:所有数据源,是指符合数据库特征的文档(*.DOC),工作薄(*.XLS)或者表(*.MDB)等等,它们的共同特点是具有行具有记录特性,列具有字段特性。

3.        邮件合并的用途,正如其的译名一样,最初便是广泛应用于邮件的发送方面,同一个结构下的不同数据的重复操作,只是更换了其中的记录数据。因此,凡是符合或者想要达到此目的的具有类似操作的,均可以使用邮件合并功能。邮件合并可以广泛应用于信封的打印,标签的打印,请柬的打印,成绩单的打印,工资单的打印,记录的打印,包括我们常用的序列号的打印等等。而我们常用的数据源,以EXCEL为主,原因是在EXCEL中生成有序的数据,较之WORD中更为方便快捷有序。

4.        以下一些高级应用,摘自本论坛中,希望能够对大家有所帮助:

4.1.      拆分字段

如: 如:在数据源“完成日期”字段的某条记录是“2004-4-1”,我想在主控文档中插入2004、4、1,3个域位置不连续。

在主控文档中分别插入三个域:如下{ MERGEFIELD\@"yyyy" "完成日期" }, { MERGEFIELD\@"M" "完成日期" }, { MERGEFIELD\@"D" "完成日期" }

请参此链接:

http://club.excelhome.net/dispbbs.asp?BoardID=23&replyID=332479&id=68445&skin=0

4.2.      条件判断:

通过邮件合并工具来自动生成请柬。判断依据,如果性别为男则在姓名后添加先生,如果性别为女且年龄为25以下添加小姐,大于25添加女士。

解决方法: 原理相当于EXCEL中的IF公式:即if (性别="男","先生",if (年龄>35,"女士","小姐")),域代码如下: { MERGEFIELD "姓名" }{IF {MERGEFIELD 性别 } = "男" "先生" { IF MERGEFIELD 年龄 } > 25 "女士" "小姐" }},参见以下链接:

http://club.excelhome.net/dispbbs.asp?BoardID=23&replyID=376140&id=75330&skin=0

4.3.      一些较为复杂的解决方法,在WORD中又没有提供更合适方法的情况下,我们可以参考以下EXCEL解决方案

4.3.1.    这是EXCEL的解决方案之一:,供参考:(所有操作均在EXCEL中完成)

4.3.1.1.   数据/分类汇总:分类字段:姓名;汇总公式:计数;汇总项:姓名;每组数据分页;确定。

4.3.1.2.   汇总后数据,点击左上角(状态栏下方)的“组及分类显示级别”2(共分三级:1,2,3),选中A2~A38(根据你上传的附件),F5定位为可见单元格,即选中所有汇总项的单元格(目的是隐藏它们);

4.3.1.3.   点级别3,所有数据倒全部在屏幕上显示,所有分类汇总的单元格已被选中,格式/行/隐藏,这样,已经形成的分页的单独分姓名显示;

4.3.1.4.   格式化:全选数据区域,F5定位为可见单元格,CTRL+1,设置单元格格式,字体与边框和行高等设置。

4.3.1.5.   页面设置:文件/页面设置/工作表选项卡,顶端标题栏,选第一行(A1),页边距选项卡,勾选居中方式:水平后确定。

4.3.1.6.   预览一下我们的成果。

4.3.2.    EXCEL解决方案之二:EXCEL&WORD的Automation(自动化)解决方案:

Sub WriteToWord()

    Dim MyRange As Range, i As Range, LastAddress As String

    Dim WdApp As Word.Application, Doc As Word.Document, N As Integer

    On Error GoTo ErrHandle '启动错误处理程序

    LastAddress = Sheets(1).[B65536].End(xlUp).Address 'B列最后一个数据

    Set MyRange = Sheets(1).Range("B2:" & LastAddress) '定义循区域范围

    Set WdApp = CreateObject("Word.Application") '创建WORD对象

    N = 2 '从第二行开始

    With WdApp

        .ScreenUpdating = False '关闭WORD屏幕更新

        Set Doc = .Documents.Open(ThisWorkbook.Path & "\pswxm.DOT") '打开该模板

        '在与本工作薄同一文件夹下

        For Each i In MyRange '在指定范围内循环

            If i <> i.Offset(-1, 0) Then '如果该数据与下一数据不同

                N = 2 '初始化N值

                '移到文档最后

                .Windows(Doc).Selection.EndKey Unit:=wdStory

                '当I的行号非2时插入分页符

                If i.Row > 2 Then .Windows(Doc).Selection.InsertBreak Type:=wdPageBreak

                '光标处插入已设置的自动图文集

                Doc.AttachedTemplate.AutoTextEntries("成绩表").Insert where:=.Windows(Doc).Selection.Range, _

                                                                   RichText:=True

            Else '否则则选定当前表格的最后一行并向下插入一行

                Doc.Tables(Doc.Tables.Count).Rows(N).Select

                WdApp.Windows(Doc).Selection.InsertRowsBelow 1

                N = N + 1 '加1

            End If

            With Doc.Tables(Doc.Tables.Count) '对当前表格赋值

                .Cell(N, 1).Range = i.Offset(, -1) '学期

                .Cell(N, 2).Range = i '姓名

                .Cell(N, 3).Range = i.Offset(, 1) '英语

                .Cell(N, 4).Range = i.Offset(, 2) '高等数学

                .Cell(N, 5).Range = i.Offset(, 3) 'C语言

            End With

        Next

        .Visible = True 'WORD程序可见,假设此句放在上面,可在调试过程中看到WROD运行情况

        .ScreenUpdating = True 'WORD屏幕更新恢复

    End With

    Application.ScreenUpdating = True

    MsgBox "运行结束,请切换到WORD程序中进行编辑与打印设置!", vbOKOnly + vbInformation

    Exit Sub

ErrHandle:

    MsgBox "Excel & Word遇到不可遇见错误!请进行调试模式,进行调试!", vbOKOnly + vbCritical

End Sub

相关链接:http://club.excelhome.net/viewthread.php?tid=78597

4.4.      格式设置:

通过数据判断进行相关格式的设置,可以在EXCEL中更方便,利用条件格式和结合我上述的EXCEL解决方案.

在WORD的作用原理:通过新建类模块,将新的类模块指向WORD.APPLICATION事件,利用其中的类APP的特定事件App_MailMergeBeforeRecordMerge(即在邮件合并前事件)进行设计,完成指定功能与格式设置.

'* +++++++++++++++++++++++++++++
'* Created By I Love You_Word!@ExcelHome 2005-1-22 09:25:54
'仅测试于System: Windows NT Word: 10.0 Language: 2052
'^The Code CopyIn [类模块-EventClassModule]^'
'* -----------------------------

Public WithEvents App As Word.Application '在类模块中声明对应于事件的对象变量。
'编写指定事件的过程。
Private Sub App_MailMergeBeforeRecordMerge(ByVal Doc As Document, Cancel As Boolean)
'如果主文档数据源中的字段1中的数据小于60(分)时
    If Doc.MailMerge.DataSource.DataFields(1).Value < 60 Then
    '主文档表格的第二行第二列(相当于B2)中的字体为红色
        Doc.Tables(1).Cell(2, 2).Range.Font.Color = wdColorRed
    Else
    '否则恢复为自动色
        Doc.Tables(1).Cell(2, 2).Range.Font.Color = wdColorAutomatic
    End If
End Sub
'----------------------
'* +++++++++++++++++++++++++++++
'* Created By I Love You_Word!@ExcelHome 2005-1-22 09:23:53
'仅测试于System: Windows NT Word: 10.0 Language: 2052
'^The Code CopyIn [ThisDocument-ThisDocument]^'
'* -----------------------------

Dim X As New EventClassModule    '从其他模块中初始化已声明的对象。
Private Sub Document_Open()
    Set X.App = Word.Application
End Sub
'----------------------

相关链接:

http://club.excelhome.net/viewthread.php?tid=79445

ok
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 16:52 , Processed in 0.050857 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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