2.3 案例04:生成工资条
案例04的资料文件“案例04:工资表改工资条.xls”为某公司某月的工资表,如图2-16所示。

图2-16 工资表
财务人员每个月都会通过财务软件导出工资表,然后制作成工资条,裁剪并分发给每个员工。本案例要求编写VBA代码,实现将图2-16所示的工资表转换为图2-17所示的工资条。

图2-17 工资条
2.3.1 案例解析
想要将图2-16所示的工资表转换为图2-17所示的工资条,就需要在工资表中为每一行数据创建一个表头。表头可以通过复制工资表第一行获得,步骤如下:选中工资表第一行,右键单击并选择“复制”,如图2-18所示。

图2-18 复制表头
然后选中工资表第3行,右键单击并选择“插入复制的单元格”,如图2-19所示。

图2-19 在工资表第3行插入表头
完成以上操作后,工资表原来的数据会从第3行开始全部下移一行,而现在的第三行是一个新的表头,且为被选中状态,如图2-20所示。

图2-20 第3行插入表头后的工作表
接下来,直接复制第3行的表头,插入第5行;复制第5行的表头,插入第7行;复制第7行的表头,插入第9行……直至得到图2-17所示的工资条。
因此,可先选中工资表的第1行,然后使用相对引用,将“复制第1行表头并插入第3行”的操作录制成宏,所得宏代码的主体部分如代码清单2-4所示。
代码清单2-4
Selection.Copy
ActiveCell.Offset(2, 0).Rows("1:1").EntireRow.Select
Selection.Insert Shift:=xlDown
代码清单2-4中的3行代码的含义分别为:复制当前选中的行、下移两行、插入复制的行并选中。现在只需要将代码清单2-4嵌入For循环,然后执行足够多次数,就能实现为工资表的每一行添加一个表头的目的。
案例04的工资表一共需要插入10个表头,因此For循环计数变量的取值范围应为1到10,无须设置步长。案例所需For循环代码如代码清单2-5所示。
代码清单2-5
For i = 1 To 10
……
Next
注意,在录制所得的宏代码中,必须先选中工资表的第1行,这样才能正确插入表头。因此,可考虑将“选中第1行”这个操作写入过程中,相关代码可通过录制宏获取,见代码清单2-6。
代码清单2-6
Rows("1:1").Select
注意,录制代码清单2-6所示的宏时,应使用绝对引用。
将上述代码进行合并,即可得到本案例所需的“工资条”过程,完整的代码见2.3.2节。
在Excel中,执行“工资条”宏,工资表即可转变成图2-21所示的工资条。
宏(VBA过程)的使用者往往并非开发者本身,如本案例的“工资条”宏,使用更多的应该是公司的财务人员。而公司的财务人员可能并不了解VBA,也不知道如何在Excel功能区的“开发工具”中执行宏。因此,可考虑在工作表上创建一个按钮并绑定宏,以便执行。

图2-21 执行宏后得到的工资条
在“开发工具”标签中,单击“插入”按钮,可看到两组控件:“表单控件”和“ActiveX控件”,如图2-22所示。其中“ActiveX控件”功能强大,可以创建丰富的事件,但是需要编写VBA代码才能使用,本书后面的章节会有详细介绍;而“表单控件”(在较早版本的Excel中称为“窗体控件”)使用起来相当便捷,虽然功能比较单一,但已能满足本案例的需求。

图2-22 “表单控件”和“ActiveX控件”
单击“表单控件”中的第一个控件(按钮),将鼠标光标移动到工作表区域后,鼠标光标会变成一个小十字。按住左键拖动十字光标,画出按钮的形状,然后松开,Excel会弹出“指定宏”对话框。在该对话框中,可将创建的按钮与当前已有的宏进行绑定,如图 2-23所示。
在图2-23中,选中“工资条”宏,然后单击对话框中的“确定”按钮,工资表上就会出现图2-24所示的“按钮1”。“按钮1”的位置、形状和大小由之前拖动鼠标的操作决定。

图2-23 “指定宏”对话框
右键单击“按钮1”即可进入编辑状态,此时可单击或拖动鼠标改变按钮的大小和位置,也可在单击“编辑文字”菜单项后修改按钮上的文字,如将“按钮1”改成“工资条”。如果在之前的“指定宏”对话框中错误选择了需要绑定的宏,那么可通过选择“指定宏”菜单项再次打开“指定宏”对话框,重新绑定宏,如图2-25所示。

图2-24 在工作表中添加“按钮1”
单击工作表的任意区域,将按钮从编辑状态中释放,此时,单击按钮,即可执行按钮绑定的宏。
按钮被单击后,其形状、大小和位置可能会随着宏的执行产生变化,这是因为还需要对按钮的属性进行设置。右键单击按钮,选择“设置控件格式”,在弹出的对话框中,打开“属性”标签,将“对象位置”单选菜单中的选项由默认的“大小、位置随单元格而变”更改为“大小、位置均固定”,然后单击“确定”按钮,如图2-26所示。如此设置,即可保证按钮不会随着宏的执行而产生变化。

图2-25 按钮的大小、位置、文字,以及绑定的宏都可以修改

图2-26 设置按钮的属性
如果财务人员在打开含有宏的Excel文件时弹出错误提示,提示无法执行宏,则需要进行宏的安全性设置。在Excel的功能区,打开“开发工具”标签,单击“宏安全性”按钮,在弹出的“信任中心”对话框中选择“宏设置”菜单,然后在右侧的“宏设置”单选菜单中选 择“启用所有宏(不推荐:可能会运行有潜在危险的代码)”,单击“确定”按钮,如图2-27所示,之后就能正常打开含有宏的工作簿了。

图2-27 修改宏安全性
2.3.2 案例代码
案例04的“工资条”过程代码详见代码清单2-7。
代码清单2-7
Sub 工资条()
Dim i As Integer '定义计数变量i
Rows("1:1").Select '选中工资表第1行
For i = 1 To 10 '定义For循环的执行次数
Selection.Copy
ActiveCell.Offset(2, 0).Rows("1:1").EntireRow.Select
Selection.Insert Shift:=xlDown
Next
End Sub
小贴士: 代码清单2-7使用了英文单引号“'”为代码进行注释。注释有利于代码阅读,以及后期对代码进行排错和修改,因此,开发人员应养成为代码注释的好习惯。
2.3.3 案例小结
经过之前两个案例的学习,录制宏和编写For循环代码已不再是本案例的难点。确定录制宏时的步骤成为了本案例的关键。
本案例录制了选中表头并复制、下移两行和插入表头3个步骤的宏代码。因为使用了相对引用,所以录制的宏代码在执行完第三个步骤后,又可在For循环中无缝衔接第一个步骤,继续执行下一个循环。
本案例还介绍了如何设置宏按钮和宏安全性。