总第 683 期
【作 者】
陈国栋(博士)
【作者单位】
(华北水利水电大学管理与经济学院 郑州 450046)
【摘 要】
【摘要】很多企业的财会人员经常需要使用Excel制作工资条,但是Excel没有提供可以直接使用的工具。通过Excel VBA编写程序,实现了在Excel界面中添加工资条按钮,使广大财会人员可以简单快捷得制作工资条。
【关键词】Excel VBA 工资条 财会人员
在实际工作中,财会人员经常需要使用Excel来制作工资条,广大财会人员迫切需要一种简单实用的方法来解决这个问题。朱庆东(2011)发表在《财会月刊》的《利用Excel VBA 制作工资条》一文提出了解决方法。
由于大部分财务人员并不是用Excel VBA编程,他们需要的是简洁易操作的解决方案。所以可以对上文提出的方法做进一步的改进。①利用Excel VBA编写工具栏按钮,要比在工作表上面添加文本框来指定宏更加方便和具有通用性。在Excel工具栏添加按钮后,财务人员只要点击这个按钮,就会对活动工作表上的工资表生成一个包含工资条的新工作表。②工资项目可能为一行,也可能为两行。通过Excel VBA编程来自动识别工资项目是一行还是两行,然后根据结果来执行相应的程序。下面详细介绍使用Excel VBA制作工资条的步骤。
第一步,在Excel中使用Alt+F11快捷键,即同时按住键盘上的Alt和F11,这个操作会打开Excel VBA编辑器。
第二步,在Excel VBA编辑器工程窗口中选中ThisWorkbook,然后点击鼠标右键,点击查看代码菜单,如图1所示。然后将下面的VBA代码复制到ThisWorkbook代码窗口中。Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
Application.CommandBars("Standard").Controls("工资条").Delete
End Sub
Private Sub Workbook_Open()
MakeCommandButton
End Sub
第三步,在Excel VBA编辑器中点击插入菜单的模块菜单项,将以下VBA代码复制到插入的模块代码窗口中。
Option Explicit
Sub printsalary()
If ifmergecell Then
MakeSalaryListMergeCell
Else
MakeSalaryList
End If
End Sub
Sub MakeSalaryList()
Dim i As Integer
Dim endrow As Integer
Dim datasheet As Worksheet
Dim gendatasheet As Worksheet
Set datasheet = ActiveSheet
Application.ScreenUpdating = False
Set gendatasheet = Sheets.Add(before:=datasheet)
"测出数据的最后一行
endrow = datasheet.Cells(datasheet.Rows.Count, 1).End(xlUp).Row
"把标题贴过去
datasheet.Range("1:1").Copy (gendatasheet.Cells(1, 1))
For i = 3 To endrow
"把每条数据抬头贴过去
datasheet.Range("2:2").Copy (gendatasheet.Cells(3 ∗ i - 7, 1))
"把数据贴过去
datasheet.Rows(i).Copy (gendatasheet.Cells(3 ∗ i - 6, 1))
Next i
gendatasheet.Select
Application.ScreenUpdating = True
End Sub
Sub MakeSalaryListMergeCell()
Dim i As Integer
Dim endrow As Integer
Dim datasheet As Worksheet
Dim gendatasheet As Worksheet
Set datasheet = ActiveSheet
Application.ScreenUpdating = False
Set gendatasheet = Sheets.Add(before:=datasheet)
"测出数据的最后一行
endrow = datasheet.Cells(datasheet.Rows.Count, 1).End(xlUp).Row
"把标题贴过去 datasheet.Range("1:1").Copy (gendatasheet.Cells(1, 1))
For i = 4 To endrow
"把每条数据抬头贴过去
datasheet.Range("2:3").Copy (gendatasheet.Cells(4 ∗ i - 14, 1))
"把数据贴过去
datasheet.Rows(i).Copy (gendatasheet.Cells(4 ∗ i - 12, 1))
Next i
gendatasheet.Select
Application.ScreenUpdating = True
End Sub
Private Function ifmergecell() As Boolean
Dim cell As Range
For Each cell In Intersect(Application.ActiveWorkbook.ActiveSheet.Range("2:2"), _
ActiveSheet.UsedRange)
If cell.MergeCells = True Then
ifmergecell = True
Exit Function
End If
Next cell
End Function
Sub MakeCommandButton()
Dim mybar As CommandBar
On Error Resume Next
Application.CommandBars("Standard").Controls("工资条").Delete
Set mybar = CommandBars("Standard")
With mybar.Controls.Add(before:=8)
.Style = msoButtonCaption
.BeginGroup = True
.Caption = "工资条"
.OnAction = "printsalary"
End With
End Sub
第四步,在Excel2003版本中保存即可,在Excel2007版本保存为启用宏的工作薄。如图2,加载项选项卡中新增了工资条按钮,点击就会自动生成工资条。
如果想在任何一个工作薄中都有这个工资条按钮,需要将这个工作薄另存为加载宏。
第五步,制作和安装加载宏。在office2007中,点击office按钮然后选择另存为其他格式。在保存类型中选择Excel加载宏,文件名可以自己命名,比如工资条(见图3)。这个加载宏的安装和其他Excel的加载宏的安装过程是一样的。在office2007中,点击office按钮然后选择Excel选项,然后点击加载项。最后点击Excel加载项旁边的转到按钮。然后找到刚才保存的加载宏就可以使用了。
【注】本文研究受华北水利水电大学“管理科学与工程”省级重点学科建设经费资助。
主要参考文献
1. 朱庆东.利用Excel VBA制作工资条.财会月刊,2011;5
2. 姚树春,张帆.Excel VBA在财务管理中的开发与应用.电子技术与软件工程,2013;13