用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
的累加汇总功能如何才能保证不把公式也累加(简单地选择只加数值未成功);如何才能在把一个文件拷贝到剪贴板后关闭它时,不出现"
是否把文件保存到大型剪贴板"
的提示(在上文的第一个宏执行时,就会出现这种提示,不利于程序自动化程序的提高)。这些问题,希望有经验的朋友能够不吝赐教。