利用Excel 97打印工资条 吴加明 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