广义的邮件合并的高级应用和教程 1. 什么是邮件合并:大多数人被邮件一词所迷惑,其实广义的邮件合并,我的理解是将指定数据源(邮件合并数据源)中的记录按用户要求(主控文档)提取到指定文档(可以是打印机,也可以是子文档)的过程与功能。 2. 数据源要求:所有数据源,是指符合数据库特征的文档(*. 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 '从其他模块中初始化已声明的对象。 相关链接: |
|