问题提出:虽然现在有许多的财务软件,它们都有工资管理功能,但由于软件的价格因素,或软件自身存在的不足(如软件的针对性较差,不能满足单位的具体需要),财务软件在企业和事业单位的应用并不广泛。现实的情况是:在许多单位,特别是事业单位,他们的工资处理都是利用微软的电子表格软件——Excel97。
但在使用Excel97的过程中,可能会有一个问题一直困扰着会计人员,这就是:用Excel97打印的工资条只有第一个人有工资条的条头(如:编号、姓名、工资、津贴……)(见

1),而我们的要求是每个人都要有工资条的条头(见

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