利用Excel 97打印工资条

Author: 吴加明 Date: 2000年 第2期

  问题提出:虽然现在有许多的财务软件,它们都有工资管理功能,但由于软件的价格因素,或软件自身存在的不足(如软件的针对性较差,不能满足单位的具体需要),财务软件在企业和事业单位的应用并不广泛。现实的情况是:在许多单位,特别是事业单位,他们的工资处理都是利用微软的电子表格软件——Excel97。
  但在使用Excel97的过程中,可能会有一个问题一直困扰着会计人员,这就是:用Excel97打印的工资条只有第一个人有工资条的条头(如:编号、姓名、工资、津贴……)(见^02050202a^1),而我们的要求是每个人都要有工资条的条头(见^02050202b^2)(因为工资条是要裁开发给每个人的)。
  当然,有些人可能认为这个问题很容易解决,即只要在每个人的前头插入工资条的条头不就好了嘛!但实际是:若单位里有100多个人的话,你就要复制100多次,这显然就不能体现计算机的长处。更要命的是:前面的操作每个月都要如此反复。某些人可能会提议,那就把前面的设置另存为模板吧。当然,这也不失为一种方法,但君不见,这样一来,每个人的工资数在表格中就让工资条的条头给隔开了,以至于不能利用Excel97的填充柄来复制数据、公式(可知道这正是Excel97备受青睐的重要因素之一!),也就是说,你同样要复制数据、公式上百次。
  解决思路:通过一段时间的摸索,我把问题归结为:在表1的表格(称之为源表格)中输入、处理工资数,然后以表2的表格(称之为目标表格)的形式打印,即现在的核心问题是把表1的表格转换为表2的表格,而这可以用嵌入Excel97中的VBA语言来编程实现。
  程序清单:假设如表1的表格在工作簿中的sheet1工作表(为活动工作表)中,而如表2的表格要在工作簿中的sheet2工作表中,则程序清单如下:
  Option Base1
  Dim aa(13)As Range,xm As Range ′xm准备存放条头的项目
  Dim List_1 As Integer ′源表格中的行定位变量
  Dim List_2 As Integer ′目标表格中的行定位变量
  Dim List_str As String ′源表格中的行定位变量,字符型
  Sub mymain()
   List_1=2 ′从源表格的第二行开始
   List_2=2
   Do
    List_str=RTrimS(LTrimS(StrS(List_1)))
      Set aa(1)=ActiveSheet,Range(″A″&List_str) ′读编号
      Set aa(2)=ActiveSheet,Range(″B″&List_str) ′读月份
    If aa(1)=aa(2) Then Exit Do ′编号、月份均空白时不再读
    transform List_2
    List_1=list_1+1
    List_2=List_2+2
   Loop
  End Sub
  Sub transform(num As Integer)
   Dim n As Integer
   Dim v As String ′源表格的列定位变量
   Dim nl As Variant′目标表格的列定位变量
   Dim w As Variant ′目标表格的行定位变量
   n1=num
   w=n1+1
   For n=1 To 11 Step 1 ′准备传送工资条的条头及工资数
   With Worksheets(″sheet2″)
   v=Chr(64+n) ′源表格的数据从A列开始
   Set xm=ActiveSheet.Range(v&″1″)
   Range(Chr(n+64)&n1)=xm ′传送工资条的条头
   Set aa(n+2)=ActiveSheet.Range(v&List1_str)
   Range(Chr(n+64)&w)=aa(n+2) ′传送工资条的工资数
   End With
   Next
  End Sub