巧用VBA编程实现EXCEL电子表格的批量自动打印

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

巧用VBA编程实现EXCEL证件
的批量打印
夏教荣陈文涛
(湖南省邵阳县白仓镇中学421114)
摘要介绍了在EXCEL中如何使用VBA,通过实例论述了在EXCEL中可以通过VBA编程实现含有照片的电子证件或表格批量自动打印,提高了EXCEL在实际应用中的工作效率及节省人力资源。

关键词VBA编程自动打印EXCEL
一VBA简介
1、什么是VBA?
VBA是Visual Basic For Application的缩写,它是以Visual Basic为发展基础的语言。

在Office软件中,VBA应用程序能够在Word、Access、Excel等之间进行交互式应用,加强了应用程序间的互动。

VBA是VB的应用程序版本,可以理解为“寄生在Office办公软件中的VB”,可以看作是VB语言的一个子集。

VBA使Office形成了独立的编程环境。

2、VBA与Visual Basic的关系
1)、VB用于开发Windows应用程序,其代码最终被编译为可执行程序。

而VBA是用于控制已有应用程序的自动化操作,其代码为解释。

2)、VB拥有独立的开发环境,而VBA必须集成在已有的应用程序中(Excel等)。

3)、VB开发出来的应用程序在脱离开发环境后仍能执行,而VBA编写出来的程序必须在访问集成应用程序(Excel等)的基础上进行。

尽管有以上不同,但它们仍然非常相似。

都使用相同的语言结构。

两者的程序的语法及程序流程完全一样。

二、在Excel中使用VBA
1、进入VBA的方法
下面以Office2010为例说明来进入VBA的方法:
功能区中有一个“开发工具”选项卡,在此可以访问 Visual Basic 编辑器和其他开发人员工具。

由于 Office 2010 在默认情况下不显示“开发工具”选项卡,因此必须使用以下过程启用该选项卡:
1)、在“文件”选项卡上,选择“选项”打开“Excel 选项”对话框。

2)、单击该对话框左侧的“自定义功能区”。

3)、在该对话框左侧的“从下列位置选择命令”下,选择“常用命令”。

4)、在该对话框右侧的“自定义功能区”下,选择“主选项卡”,然后选中“开发工具”复选框。

5)、单击“确定”。

在 Excel 显示“开发工具”选项卡之后,注意选项卡上“Visual Basic”、“宏”和“宏安全性”按钮的位置。

图 1. Excel 2010 中的“开发工具”选项卡
启用“开发工具”选项卡后,可以轻松找到“Visual Basic”和“宏”按钮。

2、安全问题
单击“宏安全性”按钮可以指定哪些宏可以运行并需满足哪些条件。

尽管未授权宏代码可能会严重损害计算机,但阻止您运行有帮助的宏的安全条件会严重妨碍您的工作效率。

宏安全性是一个复杂而又涉及广泛的话题,您应研究并了解是否应使用Excel 宏。

在本文中,请注意,如果当您打开一个包含宏的工作簿时,在功能区和工作表之间出现“安全警告: 宏已被禁用”条,则可单击“启用内容”按钮来启用宏。

此外,作为一种安全措施,您不能以默认的Excel 文件格式(.xlsx) 保存宏;而必须将宏保存在具有一个特殊扩展名 .xlsm 的文件中。

三、用VBA制作证件批量打印的实例
下面通过制作一张学员培训券来说明VBA在Excel中如何实现自动批量打印多张含有照片的培训券。

1、准备工作
1)、设计建立基本人员信息表
在Excel表格中建立如下图2基本信息资料,具体建立过程在这里不再详述,
我建立的表比较多,实际这里要用到的表格只有两张,所以其他的表格我就没有必要说了。

图2学员基本信息表(学员花名册(计算机操作员)
2)、设计建立打印证件或报表格式见图3
图3培训券格式及内容
2、使用VBA编程实现两个工作表链接打印操作
1)、两张表格设置完成后,回到培训券(计算机操作员)工作表即sheet7,点击
开发工具标签栏——>Visual basic,(或按ALT+F11快捷键),双击你
所要打印证件的工作项目,即可进入VBA编程状态输入代码。

如图4所示
图4代码窗口
全部代码如下:
'宏
'功能:把光标处的人员信息填充到"培训券(计算机操作员)"工作表,并培训券(计算机操作员)
'用法:1.把光标定位到需要培训券(计算机操作员)的人员行的单元格
' 2.执行本宏。

Sub subSetPringInfo()
On Error Resume Next
Dim oCell1, oCell2, '定义二变量
Dim cfz2, cfz3, cfz4, cfz5, cfz6, cfz7, cfz8, cfz9
Dim cfz10, cfz11, cfz12, cfz13, cfz14, cfz15, cfz16, cfz17, cfz18
'定义身份证取第二位数的内存变量为cfz2,'取第三位数的内存变量为cfz3,……以此类推到第十八位身份证内存变量为cfz18.(身份证取第一位的内存变量为oCell2,不需要重新定义)
Dim FileType As String
Dim iPXJH As Long '编号
Dim iRow As Long '正在培训券(计算机操作员)人员的行号
Dim strSheet As String '人员信息的工作表名称
strSheet = "学员花名册(计算机操作员)"
'人员基本信息在学员花名册(计算机操作员)工作表中,此处可以修改
'检查是否在人员基本信息工作表中执行此功能,如果是,则显示不能在此工作表中执行。

If <> strSheet Then
'不是在人员信息工作表中则弹出对话框。

MsgBox "请在人员基本信息工作表中执行此功能"
Exit Sub
End If
Do '循环开始
iRow = Selection.Row '行号,从当前选定的行开始培训券(计算机操作员)
'读当前培训券(计算机操作员)行的左边第一单元格内容:序号
Set oCell1 = Worksheets(strSheet).Cells(iRow, 11)
'序号是数字的行需要培训券(计算机操作员)即所对应培训券号行所在的单元格iPXJH = Val(oCell1.Value) '培训券号
If iPXJH >= 10070893 Then
'在培训券号内的数字
Set oCell2 = Worksheets("培训券(计算机操作员)").Cells(5, 8)
oCell2.Value = iPXJH
'姓名
Set oCell1 = Worksheets(strSheet).Cells(iRow, 2)
Set oCell2 = Worksheets("培训券(计算机操作员)").Cells(6, 8)
oCell2.Value = oCell1.Value
'插入图片
FileType = InputBox("输入你的图片的后缀名", "输入图片格式", "jpg")
Numb = oCell2.Value
Sheet7.Select '改变当前的工作表为sheet7即培训券(计算机操作员)
With ActiveSheet
.Pictures.Insert("D:\pic\" & Numb & "." & FileType).Select
'图片所在的路径为:D:\pic\,此路径可以根据具体情况更改
Set Target = Worksheets("培训券(计算机操作员)").Cells(5, 23)
'将图片插入到指定的单元格中,我设置的单元格为W5单元格,可以更
'改为自己所需的单元格位置
End With
With Selection
.Top = Cells(5, 23).Top + 4 '插入图片的上方位置为W5的位置向下4
'个单位,数字4可以更改
.Left = Cells(5, 23).Left + 5 '插入图片的上方位置为W5的位置向下
'4个单位,数字4可以更改
.Width = Cells(5, 23).Width + 110'插入图片的宽度为W5单元格的宽'度加110个单位的宽度为图片的整个宽度,110可以更改.Height = Cells(5, 23).Height + 110'插入图片的高度为W5单元格的高'度加110个单位的高度为图片的整个高度,110可以更改End With
'户籍
Set oCell1 = Worksheets(strSheet).Cells(iRow, 9)
Set oCell2 = Worksheets("培训券(计算机操作员)").Cells(7, 6)
oCell2.Value = oCell1.Value
'身份证号
Set oCell1 = Worksheets(strSheet).Cells(iRow, 8)
Set oCell2 = Worksheets("培训券(计算机操作员)").Cells(9, 3)
'指定身份证第一位数字所在的位置,以下类推。

Set cfz2 = Worksheets("培训券(计算机操作员)").Cells(9, 4)
Set cfz3 = Worksheets("培训券(计算机操作员)").Cells(9, 5)
Set cfz4 = Worksheets("培训券(计算机操作员)").Cells(9, 6)
Set cfz5 = Worksheets("培训券(计算机操作员)").Cells(9, 7)
Set cfz6 = Worksheets("培训券(计算机操作员)").Cells(9, 8)
Set cfz7 = Worksheets("培训券(计算机操作员)").Cells(9, 9) Set cfz8 = Worksheets("培训券(计算机操作员)").Cells(9, 10) Set cfz9 = Worksheets("培训券(计算机操作员)").Cells(9, 11) Set cfz10 = Worksheets("培训券(计算机操作员)").Cells(9, 12) Set cfz11 = Worksheets("培训券(计算机操作员)").Cells(9, 13) Set cfz12 = Worksheets("培训券(计算机操作员)").Cells(9, 14) Set cfz13 = Worksheets("培训券(计算机操作员)").Cells(9, 15) Set cfz14 = Worksheets("培训券(计算机操作员)").Cells(9, 16) Set cfz15 = Worksheets("培训券(计算机操作员)").Cells(9, 17) Set cfz16 = Worksheets("培训券(计算机操作员)").Cells(9, 18) Set cfz17 = Worksheets("培训券(计算机操作员)").Cells(9, 19) Set cfz18 = Worksheets("培训券(计算机操作员)").Cells(9, 20) oCell2.Value = Mid((oCell1.Value), 1, 1)
'给身份证第一位数字赋具体的值,以此类推。

cfz2.Value = Mid((oCell1.Value), 2, 1)
cfz3.Value = Mid((oCell1.Value), 3, 1)
cfz4.Value = Mid((oCell1.Value), 4, 1)
cfz5.Value = Mid((oCell1.Value), 5, 1)
cfz6.Value = Mid((oCell1.Value), 6, 1)
cfz7.Value = Mid((oCell1.Value), 7, 1)
cfz8.Value = Mid((oCell1.Value), 8, 1)
cfz9.Value = Mid((oCell1.Value), 9, 1)
cfz10.Value = Mid((oCell1.Value), 10, 1)
cfz11.Value = Mid((oCell1.Value), 11, 1)
cfz12.Value = Mid((oCell1.Value), 12, 1)
cfz13.Value = Mid((oCell1.Value), 13, 1)
cfz14.Value = Mid((oCell1.Value), 14, 1)
cfz15.Value = Mid((oCell1.Value), 15, 1)
cfz16.Value = Mid((oCell1.Value), 16, 1)
cfz17.Value = Mid((oCell1.Value), 17, 1)
cfz18.Value = Mid((oCell1.Value), 18, 1)
'工种
Set oCell1 = Worksheets(strSheet).Cells(iRow, 7)
Set oCell2 = Worksheets("培训券(计算机操作员)").Cells(11, 11)
oCell2.Value = oCell1.Value
'培训券(计算机操作员)证件,"A1:E7" 为定义页面的培训券(计算机操作员)范围Worksheets("培训券(计算机操作员)").Range("A1:AF25").PrintOut
'清空sheet7中相片单元格中的照片为了避免照片打印重复
Dim x As Integer
For x = 1 To Sheet7.Shapes.Count
If Sheet7.Shapes(x).TopLeftCell.Address = "$W$5" Then
'绝对引用单元格W5是我设置的相片所在的单元格
Sheet7.Shapes(x).Delete '删除图片单元格的内容
End If
Next x
Sheet1.Activate'激活当前的工作表为sheet1即学员花名册(计算机操作员)
'打完一个证件后,询问是否培训券(计算机操作员)下一个。

If MsgBox("继续打印下一人员?", vbDefaultButton1 + vbYesNo) <> vbYes Then
'中断培训券(计算机操作员)打印
Exit Sub
End If
'为培训券(计算机操作员)下一人员做准备
Set oCell1 = Worksheets(strSheet).Cells(iRow + 1, 1)
oCell1.Activate
Sheet1.Select '恢复当前的工作表为sheet1即学员花名册(计算机操作员)
Else
MsgBox "当前行不是人员信息,不能打印"
Exit Sub
End If
Loop
End Sub
2)、实验结果
完成后按ALT+F11进入代码窗口,鼠标点击(或按F5)执行宏操作会弹出宏对话框,如图5所示
点击“运行”按钮。

注意:在运行前要选择工作表学员花名册(计算机操作员)即sheet1,并且选择A4单元格即序号为1的单元格,不然会出现提示:“请在人员基本信息工作表中执行此功能”,还
要注意的是:在“培训券(计算机操作员)”工作表中,显示比例改必须为100%,否则,打印出来的图片不会在图片框中。

这样我们可以按照要求打印自己所要打印的证件了。

手工几天的工作不到半天就完成了,提高了工作效率,同时也减少了很多的错误。

此代码在Windows XP操作系统、Microsoft Office Excel 2010下编写,并顺利运行通过。

四、结束语
在Excel制作电子表格过程中,充分利用VBA这一工具,提升Excel文件的技术
含量,可使电子表格自动化功能得到增强,使电子表格更完善,更具有灵活多样性。

执行打印后的效果为下图6所示
图6执行代码后打印的效果图。

相关文档
最新文档