分享

关于邮件合并的一些高级应用

 第①村 2012-04-28

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

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./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./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./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./viewthread.php?tid=79445

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多