《利用Excel 97打印工资条》后记

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

  拙作《利用Excel 97打印工资条》在《电脑报》2000年2期刊出后,由于本人考虑欠周及排版上出现的细微差错,致使多数读者在运行该文所提供的源代码时,出现了致命的错误,在此深表抱歉。同时,本人收到了本版责编转发来的多位读者的E-mail,在E-mail中,读者们除了指出原文中的漏洞外,有些读者还对源代码提出了富有建设性的改进意见,在此一并作谢。
  应广大读者要求,就前面诸问题作一扼要回答。
  问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