标签:
杂谈 |
作为公司管理人员,需要收集各种各样的数据,纸质的表格,作为信息收集的一个重要工具,目前还在广泛使用。
假设我们是某公司人事专员,公司有1000人,现在要为公司每一个员工打印一份表单,因为我们手头已经持有公司所有人员的人事信息,当然不需要麻烦每一个员工在表格上重复填写人事系统中已经存在的数据,既然这样,那么,如何“即方便别人,也不麻烦自己”,利用这些已有数据和Excel技术,为每位员工打印一份专属表格呢?
作为示例,假设公司人事信息数据如下图,当然,真实公司的数据可能比这个表格的列数多得多:
http://s3/large/001YC356zy6LINtzWWS42
再假设为每个员工打印出来的表格如下图(当然,你可以设计的更美的),每个表格占A4一整页。注意,我们需要打印1000份表格,每一个员工的表格的抬头几项信息都是不同的!
http://s12/large/001YC356gy6LINpj7F96b
Excel和VBA是一个整体,学习VBA的目的是有效地整合、调动、补充Excel的内置功能,让Excel 更好地帮助我们提高工作效率。依据这个指导思想,我们采用VBA VLOOKUP()函数的方案解决这个问题。
首先,我们手动制作一个即将打印的表格(如上图所示),然后在表格的“工号”位置填写上第一个员工的工号。有了第1个员工的工号,我们就可以依据该员工工号,使用VLOOKUP()函数从员工“名单”工作表中把其他相关信息提取到“格式表格”的相应单元格中。关于Excel 函数VLOOKUP()的使用方法,想必大家已经比较熟悉,这里不再赘述。
现在,我们试着在“格式表格”工作表的工号位置输入另外一个员工的工号,我们发现,该员工的相关信息立即呈现到了表格中的对应位置。
有了上述实验,我们得出的方案是:利用VBA代码,在“格式表格”工作表的工号位置处“循环”填写不同的工号,这时Excel内置函数VLOOKUP()会立即填写(或者说“提取”)该员工人事数据的其他信息到表格中的相应位置,这时,我们只需用VBA将填写好的含有该员工信息的表单打印出来,如此这般,做1000次,不就完成任务了吗?
根据这个思路,我们设计的VBA代码如下。代码的使用方法是:在Excel界面中,同时按下Alt F11,进入Excel VBA开发环境,在VBA开发环境左侧的Excel对象列表栏中,单击鼠标右键,在鼠标右键菜单中选择“插入》插入模块”,然后在模块中输入(或者拷贝粘贴)如下VBA代码:
Sub printTable()
L01: maxRow = ThisWorkbook.Worksheets("名单").UsedRange.Rows.Count
L02: Dim myPrintSht As Worksheet
L03: Set myPrintSht = ThisWorkbook.Worksheets("格式表格")
L04: For r = 2 To maxRow
L05: myPrintSht.Cells(5, 2).Value = ThisWorkbook.Worksheets("名单").Cells(r, 1).Value
L06: myPrintSht.PrintPreview
'L07:myPrintSht.PrintOut
L08: Next
End Sub
下面是上述VBA代码的详细解释:
L01:找到"员工名单"工作表最后一行的位置的行号(注意"名单"工作表一定要存在,否则代码执行会出现错误!),并将该行号赋值给变量maxRow。
L02:定义一个Worksheet类型的对象变量myPrintSht,该对象变量将会用来代表名称为"格式表格"的工作表(注意"格式表格"工作表一定要存在,否则代码执行会出现错误!)。
L03:把名称为"格式表格"的工作表赋值给Worksheet类型的对象变量myPrintSht。
L04-L08:是一个“For…Next”循环处理结构,用来循环处理每一位员工的数据。
L05:该行代码的作用是把"名单"工作表中当前行的工号信息填写到的"工号"位置处。需要注意的是,当VBA把员工工号信息填写到“格式表格”时,Vlookup()函数会自动提取该员工的其他相关信息,这也是VBA和Excel内置功能配合使用的魅力所在,可以节省我们大量的VBA编程工作量。
L06:调用工作表的PrintPreview方法,让我们预览已经填写好相关信息的“格式表格”工作表。因为我们只是在测试程序,因此我们使用了工作表对象的“打印预览”功能。如果真的需要打印时,我们使用的是工作表的PrintOut方法。
就这样,我们借用几行VBA代码,就能批量打印每一位员工的专属表格,由于一些必要的信息已经为员工填写完毕,避免了员工手动重新填写可能发生的错误,并节约的员工的时间,这样做的结果是,员工满意,自己轻松。