《利用Excel 97打印工资条》后记
应广大读者要求,就前面诸问题作一扼要回答。
问1:如何编译及运行原文中提供的源代码?
答:我们知道该源代码是用Excel 97自带的宏语言VBA编写的。虽然对于宏语言VBA,《电脑报》1999年第39期的《掀起Word “宏”盖头》及第50期的《小试“宏”刀》等都有相关的介绍,但对于初学者,要完全弄懂它还要花些时间。在这里,仅对编译及运行原文中提供的源代码的过程作一简单介绍。
第一步:打开VBA编辑器。单击“工具”/“宏”/“Visual Basic编辑器”或按快捷键Alt+F11,把源代码完整地输入到右边的代码窗口中即可(见^09050201a^1);
第二步:在工具栏上添加一按钮。单击“视图”/“工具栏”/“自定义”,当出现^09050201b^2画面时,把右边的“自定义按钮”拖到工具栏的适当位置放开,接着右击该按钮,指定刚才所建的宏,同时可以更改按钮图标等;
第三步:调试运行。确认工作簿的“sheet1”为当前工作表,现在就大功告成,可以单击刚才的新按钮看看。
问2:把源代码完整输入后,编译为何没法通过?
答:编译没法通过主要是排版上出现一些错误的缘故,因版面关系,此处不再一一列出,请读者对照后面所附正确源代码修正。
问3:纠正上述错误后,运行结果还达不到要求,源代码是否有有待改进的地方?
答:诚如有些读者指出的“该文在利用‘If aa(1)=aa(2)Then Exit Do’检测aa(1)=aa(2)存在一些不足”那样,该语句在源代码中有着举足轻重的地位,它是退出循环、结束运行的依据。本人恰恰在此考虑欠周,致使运行结果达不到要求,其改进的方法有多种,如:
把Set aa(2)=ActiveSheet.Range(″B″&List_str)改成:
Set aa(2)=ActiveSheet.Range(″C″&List_str)等。
当然,对于VBA语言掌握熟练的读者,还可以利用其丰富的函数、强大的功能,把源代码改得更简练、更具有通用性。若运行改进程序后仍有问题的读者请与我联系,我的E-mail地址是:jiaming_wu@163.net。
编者按:《利用Excel 97打印工资条》一文刊出后,收到不少读者对该文的肯定,除收到一些对该文源代码的改进意见外,还收到不少对此问题的非VBA解决方案,由于版面有限,不能一一登出,请大家见谅!在此,编者向这些热心读者表示衷心感谢。
#1 改进后的程序清单:
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(″C″&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&List_str)
·Range(Chr(n+64)&w)=aa(n+2)
′传送工资条的工资数
End With
Next
End Sub