[返回]
摘自计算机世界日报

用EXCEL进行财政决算汇总工作

北京红宇电脑沙龙 张 猛

  年终决算是国家机关、事业单位财务部门的一件大事。今年北京市卫生系统进行的决算工作,使用的是财政局社保处布置的一套报表盘。这套报表由LOTUS1-2-3 制作,虽然是一套表,但并没有放在一个文件中,而是一张表一个文件,总计23 个文件,而且报表公式、文字没有锁定,导致基层单位误操作破坏公式的情况时有发生。除此之外,这套报表没有提供汇总程序,在汇总时必须一个一个地利用LOTUS1-2-3 的文件合并功能进行,这样23 个文件,60 家单位,这样的打开文件、合并的操作不知要进行多少次。

  为此,笔者考虑使用LOTUS1-2-3 的宏进行自动汇总操作,但是LOTUS1-2-3 的宏命令与众不同,并且在帮助中没有详细说明,短时期内无法掌握,为此笔者决定采用EXCEL 7 中文版强大的VBA 编制宏来完成这一工作。鉴于目前北京市的决算工作还未结束,希望这份心得能给同行们以帮助。

  转入EXCEL

  EXCEL 7 中文版有良好的兼容性,可以直接处理、保存LOTUS1-2-3 格式的文件,但为了减少文件操作,有必要把23 个单独的LOTUS1-2-3 文件集中到一个EXCEL 文件簿中,笔者用下面的宏实现这一功能:

  1、生成一个有23 个工作表的工作簿
  2、编制并执行以下宏

Sub FROM_123()

Application.DisplayStatusBar = True

Set DEST = ActiveWorkbook

For Id = 1 To 23

 Select Case Id

  Case 1 To 9

   FILENAME = "s970" & Id & ".WK4"

  Case Else

   FILENAME = "s97" & Id & ".WK4"

 End Select

 Application.StatusBar = "请稍候,正在打开文件" _

 & FILENAME

 Workbooks.Open FILENAME

 Worksheets(1).UsedRange().Copy

 DEST.Worksheets(Id).Range("A1").PasteSpecial

 Workbooks(FILENAME).Close SAVECHANGES = True

Next Id

Application.DisplayStatusBar = False

End Sub



  汇总

  然后就可以在这个工作簿中编制宏实现对60 家单位23 张表的分别汇总了。笔者过去用过以判断单元格是否锁定,来识别该单元格中包含的是公式还是源数据的方法进行汇总,但这套表源表没有加保护,所以不能这样办;笔者也考虑采取与LOTUS1-2-3 的文件合并的方式类似的方法进行整表的汇总,也找到在EXCEL 中的选择性粘贴功能中有累加性粘贴的内容,但试用之后发现,即使选择的是对表中的数据进行累加粘贴,实际仍执行覆盖性粘贴,而选择了全部累加粘贴后,所有的公式也都重复累加,结果公式错误。这个问题留待其他有经验的朋友给予补充。笔者采用的是比较原始的方法,就是逐行逐列进行判断,如果当前单元格不是公式和文字,就判断为数值,于是从上报文件的对应位置取数累加进来,虽然原始,但效果很明显,平均每张30*100 的大表处理时间不超过30 秒,使用环境是P5/75 8M 内存,540M 硬盘的低档机。汇总宏如下:



Sub SUM_BOOKS()

Application.DisplayStatusBar = True

For Id = 1 To 23

'自动按顺序打开文件,文件名由FILENAME指定

 Select Case Id

  Case 1 To 9

   FILENAME = "S970" & Id & ".WK4"

  Case Else

   FILENAME = "S97" & Id & ".WK4"

 End Select

Workbooks.Open FILENAME '打开源文件

'隐藏源文件的窗口

Windows(FILENAME).Visible = False

'激活目标表单,便于观看进度

Worksheets(Id).Activate

'一般表头部分没有数据,所以按需设置行,

   列座标值,可提高效率

For x = 5 To 75

 For y = 2 To 25

  Set c = Worksheets(Id).Cells(x, y)

  '在状态行显示进度

  Application.StatusBar = "单位:" & FILENAME _

  & "表格:" & Id & "行:=" & x & "列:" & y 

'判断当前单元格是否字符串或公式,如果不是,

   就取数累加

If Not (VarType(c.Value) = vbString Or VarType(c.Formula)

  = vbString) Then

Set d = Workbooks(FILENAME). _

    Worksheets(Id).Cells(x, y)

    c.Value = c.Value + d.Value

  End If

  Next y

  Next x

'关闭源文件

Workbooks(FILENAME).Close SAVECHANGES = True

Next Id

Application.DisplayStatusBar = False

End Sub


  输出为LOTUS 1-2-3格式

  由于上报的数据必须是LOTUS 1-2-3格式的单独23个文件,所以还要把EXCEL7的工作表分别存为独立的1-2-3文件,这项工作用宏完成如下:

Sub TO_123()

Set SOURCE = ActiveWorkbook

For Id = 1 To 2

  Select Case Id

  Case 1 To 9

   FILENAME = "S970" & Id & ".WK4"

  Case Else

   FILENAME = "S97" & Id & ".WK4"

  End Select

  '打开目标文件

  Set dest = Workbooks.Open(FILENAME)

  '拷贝源表单

  SOURCE.Worksheets(Id).UsedRange.Copy

  '从剪贴板上将源表单内容粘贴到目标文件,

     并关闭目标文件

  With dest

  .Worksheets(1).Range("A1").PasteSpecial

    Paste:=xlValue

  .Save

  .Close SAVECHANGES = True

 End With

Next Id

End Sub


  小结

  现在行业主管部门下发的软件越来越多,但是好用的不多,给基层的工作带来很大不便。实际上,行业主管部门有许多优势,业务面广、应用层次丰富,应当在行业主管一级把软件做好,这样虽然开发时比较累,但可以节约基层单位的大量人力物力,如果仅为上级部门开发管理方便,而不顾基层的使用情况,既不经济,又会对计算机的普及带来负面影响。

  同时,笔者在使用EXCEL 编制宏的过程中,也发现了一些问题,例如:从一个文件手动粘贴数据到另一个文件,可以把格式也粘贴过去,但在编程时只是把数据和表格粘贴过去了,行宽列宽等格式信息却不能粘贴;EXCEL 的累加汇总功能如何才能保证不把公式也累加(简单地选择只加数值未成功);如何才能在把一个文件拷贝到剪贴板后关闭它时,不出现" 是否把文件保存到大型剪贴板" 的提示(在上文的第一个宏执行时,就会出现这种提示,不利于程序自动化程序的提高)。这些问题,希望有经验的朋友能够不吝赐教。