◆刘璐 谢勇/谷城县审计局
笔者在对某投资公司进行损益审计时发现,该公司使用“神州易桥财税大管家”进行电子账务处理,此款财务软件相当小众,在网络上基本搜索不到有用信息,前台生成的DBB数据库文件无法被AO识别。审计时只能要求先提供基础表数据,但查阅时发现该软件自动生成的科目余额表是按月进行全年汇总,某些有期初余额的科目并不在1月反映,多次辅助导入的数据与资产负债表总是不一致。焦头烂额之际只能另辟蹊径,鉴于明细账数据表里某些单元格可以反映科目的期初余额和方向,笔者想到利用EXCEL的“遥控器”——VBA,实现高效准确地提取每个工作表特定单元格内容。接下来就是对这小众软件特异数据表数据标准化的探索之路。
1.统计工作表个数,点击“公式”→“名称管理器”,如图1所示。
图1 打开名称管理器
2.新建公式,名称自定,“引用位置”输入“=GET.WORKBOOK(1)”。
3.在表中任意单元格输入公式“=COUNTA(TJ)”,如图2所示。
图2 子表个数
统计结果可以看到明细账中存在559个工作表(已包含新增的4个子表,实际源表中555个子表)。
4.查看发现各个工作表名称存在科目代码+科目名称、科目代码、默认表名3种命名方式(如图3所示),但结构相同(如图4所示),符合批量提取的条件。
图3 表名结构
图4 各个子表结构
1.在所有工作表最后添加一个工作表,取名为“汇总”。利用快捷键Alt+F11,调出代码窗口,添加模块,编写代码如下:
Sub Opiona()
Rem禁止系统刷屏?触发其他事件等
'On Error Resume Next '//发生错误,自动执行下一句,就是忽略错误
Application.ScreenUpdating=False'//关闭屏幕刷新
Application.DisplayAlerts=False'//关闭系统提示
Application.EnableEvents=False'//禁止触发其他事件
Application.StatusBar=True'关闭系统状态条
T=Timer'//开始时间
Set SHX=Worksheets("汇总")
FIRSTROW=3'//汇总表标题所在行,下一行开始是数据
I=FIRSTROW+1'//数据记录的开始行
SHX.Range("A"&I&":HZ1048576").ClearContents'//清空数据区域
Rem获取各个分表清单
For Each SH In Worksheets
If SH.Name<>SHX.Name Then
Rem提示信息,在状态栏显示
Application.StatusBar="当前提取的表格是:"&SH.Name
DoEvents
Rem写入工作表名
SHX.Cells(I,1).Value=SH.Name
Rem找到需要的单元格位置
For ICOL=2 To SHX.Range("HZ"&FIRSTROW).End(xl-ToLeft).Column
If Len(SHX.Cells(FIRSTROW-1,ICOL).Value)>0 Then
SHX.Cells(I,ICOL).Value=SH.Range(SHX.Cells(FIRSTROW-1,ICOL).Value).Value
End If
Next
I=I+1'//准备记录下一条
End If
Next SH
Application.StatusBar=False'恢复系统状态条
Application.EnableEvents=True'//'//恢复触发其他事件
Application.ScreenUpdating=True'//恢复屏幕刷新
Application.DisplayAlerts=True'//恢复系统提示
MsgBox"一共用时:"&Format(Timer-T,"#0.0000")&"秒",,"温馨提示!!"'//提示所用时间
End Sub
2.关闭代码窗口,返回正常窗口,点击“开发工具”,在“汇总”工作表插入窗体按钮,如图5所示。
图5 添加窗体按钮
同时编辑好表头,如图6所示。
图6 表头名称行
3.单击按钮执行汇总各子表需要提取的4个单元格内容,将提取结果复制,选择性粘贴到新工作表“余额结果表”,如图7所示。
图7 统计结果
AO要求余额表包含关键字段:科目代码、科目名称、科目方向、科目余额,因此接下来还需要对科目进行切分。从“科目”列我们发现单元格内容都是“科目:科目代码科目名称”的结构,可以利用组合函数查找冒号和空格的位置进行对科目代码和科目名称的提取,在C3输入公式“=MID(B3,FIND(":",B3)+1,FIND("",B3)-FIND(":",B3)-1)”,如图8所示。
图8 C3单元格公式和结果
4.在D3输入公式“=RIGHT(B3,LEN(B3)-FIND("",B3))”,利用下拉键,批量完成所有科目代码和科目名称的生成,结果如图9所示。
图9 分割后的科目代码和科目名称结果
5.最后一步形成标准的科目余额表,555行数据与源表数据一致。至此,科目余额表的标准化工作已全部完成,加上之前提供的凭证表,可以完成AO财务账套的采集。
由于AO模板的有限性,小众财务软件基本无法直接采集转换,但采集思路是固定的,我们只需要取得科目表、余额表、凭证表即可完成财务数据的标准化处理,满足工作需要。而实际工作中,小众财务软件的表格数据逻辑性可能与AO不对称,这时就需要积极创新、大胆探索,总能从中找到有用的数据,再配合相应的办法手段,最终完成数据的标准化工作。