利用Access和VBA编程实现医保变更业务中Word表格模板的批量打印
2018-12-07闫婷婷
闫婷婷
吉林师范大学, 吉林 四平 136000
1 实现功能
通过Access窗口进行交互式信息选择、录入及外部数据导入,输入工号,根据人员所属不同类型账号直接读取关联信息,实现了自动选择人员账号、变更类型、自动输入基础信息的自动填写功能;重新填写可通过清空记录按钮实现一键清除已填写信息的功能,最终实现将所有停退保人员信息批量写入新的Word表格模板,并根据记录数量实现自动分页存储、打印预览(打印)功能。
2 实现方法
首先新建一个名为DbTChange.mdb的Access数据库,并将“空白模板.doc”和数据库DbTChange.mdb放到同一个目录下。在库中创建停退保信息表、停退保类型表、BN工号_医保编号对照表和BW工号_医保编号对照表,共4个表。停退保信息表是依据Word模板所需的字段信息来设计表的结构,每一个进行变更的人员相关信息最后都存在这个表中。停退保类型表仅仅用来存储一列有效信息,将用于存储所有停退保类型,此表用于组合框值列表,应用于数据录入时的类型选择,避免了手工输入的麻烦[1]。BN工号-医保编号对照表和BW工号-医保编号对照表为两种不同类型人员的基本信息和医保信息关联对照表,两张表结构完全相同,在实际应用中可根据人员情况进行相应修改,这两张表用于人员信息自动录入,即在信息录入窗口输入工号后回车,即可将医保编号和姓名关联取出写入窗口,既节省时间又准确无误。另外,根据情况不同,可分别对两张表格的字段进行扩充。
2.1 新增停退保人员信息记录
根据具体情况,可以选择通过外部数据导入,即将Excel导入Access中,也可以在Access窗体上通过文本录入,将停退保人员信息录入。在这个过程中,人员类型和变更类型都是通过组合框的应用和设置来实现自动填充的,添加成功后在子窗体中实时显示查看[2]。
2.2 批量信息生成模板打印
传统的方式主要是基于书签、Word邮件合并以及插入域的方式,来实现将Excel或Access数据库表中的内容逐条按字段写入Word模板,但仅针对每一条记录多个字段写入一个模板,也有通过跨数据表或数据库联合查询的,但无一例外都是一条记录的N个字段对应Word模板,多条数据循环生成多个模板文档。针对向一个表格模板中导入多条数据多个字段,并根据表格模板容量自动分页生成新文档的情况并没有相关案例,本文对这种情况的模板套打提出了解决办法并得以实现。
首先要创建一个基于Word表格模板的文档,新建数据记录集用于获取待处理的所有记录,然后将记录集内容按字段赋值给Word表格单元格,并根据记录数循环分页,最后实现打印预览功能。如需要直接打印,可将代码doc.PrintPreview改为doc.Print即可。
Private Sub CmdSave_Click()
......
MyPath=CurrentProject.Path
Set rs=CurrentDb.OpenRecordset("停退保信息表")
rs.MoveLast
rs.MoveFirst
lr=rs.RecordCount
maxRs=9
p=countPage(lr,maxRs)
m=0
For I=1 To p
Set mydoc=doc.Documents.Add(MyPath&"空白模板.doc")
doc.Visible=False
Set Ttable=doc.ActiveDocument.Tables(1)
For j=1 To maxRs
If rs.EOF Then Exit Sub
Ttable.Cell(j+1,2).Range.Text=rs.Fields.Item(1)&""
......
Ttable.Cell(j+1,8).Range.Text=rs.Fields.Item(7)&""
doc.PrintPreview
rs.MoveNext
Next
m=m+1
mydoc.SaveAs MyPath&"医疗保险参保人员停保、退保变更登记表"&m&".doc"
Next
End Sub
以上代码中记录集rs和doc.ActiveDocument.Tables(1)的应用至关重要,其中的rs.fields.item(i)理解为将数据表中的内容放入记录集后,i相当于字段列所处序号,然后通过rs.MoveNext实现数据行的变更;舍弃常用的书签bookmark,直接采用Ttable.Cell(j+1,2).Range.Text来向模板的Word表格指定单元格中写入内容,这里的Cell()函数使用上需要特别注意,起点是从0开始而不是1。将mydoc.SaveAs MyPath&"医疗保险参保人员停保、退保变更登记表"&m&".doc"这段代码放入循环,实现新建Word文档的重新命名和保存。
2.3 计算页数函数
我们将页码计算单独放在一个函数中,这样提高了代码的可移植性和效率,当模板发生变更时,此功能无需修改依然可用。利用记录总数和模板的最多容纳记录数来计算总的页数,需要注意在获取记录总数lr前要先把记录集的位置移到最后,否则将得不到记录总数。
2.4 自动匹配不同账套人员信息
利用组合框来实现职工类型选择,组合框的值设为BN工号-医保编号对照表和BW工号-医保编号对照表,即存放不同账号类型人员信息的数据库表名,输入工号以后程序自动匹配姓名和医保编号。
综上,根据固定模板填充数据的工作,一旦业务量大,信息来源多,纯手工粘贴复制,或者单纯的引用函数就无法满足工作需求。文章采用记录集循环、分页判断、Word表格Cell()用法解决了使用书签、邮件合并以及域方式实现模板套打无法满足多条记录分页填充批量打印的问题,适应不同信息源和打印模板,简便灵活。