2014年 第 7 期
总第 683 期
财会月刊(上)
会计电算化
利用Excel加载宏制作工资条

作  者
陈国栋(博士)

作者单位
(华北水利水电大学管理与经济学院 郑州 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