广义的邮件合并的高级应用和教程
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 |