◆劉璐 謝勇/谷城縣審計(jì)局
筆者在對(duì)某投資公司進(jìn)行損益審計(jì)時(shí)發(fā)現(xiàn),該公司使用“神州易橋財(cái)稅大管家”進(jìn)行電子賬務(wù)處理,此款財(cái)務(wù)軟件相當(dāng)小眾,在網(wǎng)絡(luò)上基本搜索不到有用信息,前臺(tái)生成的DBB數(shù)據(jù)庫文件無法被AO識(shí)別。審計(jì)時(shí)只能要求先提供基礎(chǔ)表數(shù)據(jù),但查閱時(shí)發(fā)現(xiàn)該軟件自動(dòng)生成的科目余額表是按月進(jìn)行全年匯總,某些有期初余額的科目并不在1月反映,多次輔助導(dǎo)入的數(shù)據(jù)與資產(chǎn)負(fù)債表總是不一致。焦頭爛額之際只能另辟蹊徑,鑒于明細(xì)賬數(shù)據(jù)表里某些單元格可以反映科目的期初余額和方向,筆者想到利用EXCEL的“遙控器”——VBA,實(shí)現(xiàn)高效準(zhǔn)確地提取每個(gè)工作表特定單元格內(nèi)容。接下來就是對(duì)這小眾軟件特異數(shù)據(jù)表數(shù)據(jù)標(biāo)準(zhǔn)化的探索之路。
1.統(tǒng)計(jì)工作表個(gè)數(shù),點(diǎn)擊“公式”→“名稱管理器”,如圖1所示。
圖1 打開名稱管理器
2.新建公式,名稱自定,“引用位置”輸入“=GET.WORKBOOK(1)”。
3.在表中任意單元格輸入公式“=COUNTA(TJ)”,如圖2所示。
圖2 子表個(gè)數(shù)
統(tǒng)計(jì)結(jié)果可以看到明細(xì)賬中存在559個(gè)工作表(已包含新增的4個(gè)子表,實(shí)際源表中555個(gè)子表)。
4.查看發(fā)現(xiàn)各個(gè)工作表名稱存在科目代碼+科目名稱、科目代碼、默認(rèn)表名3種命名方式(如圖3所示),但結(jié)構(gòu)相同(如圖4所示),符合批量提取的條件。
圖3 表名結(jié)構(gòu)
圖4 各個(gè)子表結(jié)構(gòu)
1.在所有工作表最后添加一個(gè)工作表,取名為“匯總”。利用快捷鍵Alt+F11,調(diào)出代碼窗口,添加模塊,編寫代碼如下:
Sub Opiona()
Rem禁止系統(tǒng)刷屏?觸發(fā)其他事件等
'On Error Resume Next '//發(fā)生錯(cuò)誤,自動(dòng)執(zhí)行下一句,就是忽略錯(cuò)誤
Application.ScreenUpdating=False'//關(guān)閉屏幕刷新
Application.DisplayAlerts=False'//關(guān)閉系統(tǒng)提示
Application.EnableEvents=False'//禁止觸發(fā)其他事件
Application.StatusBar=True'關(guān)閉系統(tǒng)狀態(tài)條
T=Timer'//開始時(shí)間
Set SHX=Worksheets("匯總")
FIRSTROW=3'//匯總表標(biāo)題所在行,下一行開始是數(shù)據(jù)
I=FIRSTROW+1'//數(shù)據(jù)記錄的開始行
SHX.Range("A"&I&":HZ1048576").ClearContents'//清空數(shù)據(jù)區(qū)域
Rem獲取各個(gè)分表清單
For Each SH In Worksheets
If SH.Name<>SHX.Name Then
Rem提示信息,在狀態(tài)欄顯示
Application.StatusBar="當(dāng)前提取的表格是:"&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'//準(zhǔn)備記錄下一條
End If
Next SH
Application.StatusBar=False'恢復(fù)系統(tǒng)狀態(tài)條
Application.EnableEvents=True'//'//恢復(fù)觸發(fā)其他事件
Application.ScreenUpdating=True'//恢復(fù)屏幕刷新
Application.DisplayAlerts=True'//恢復(fù)系統(tǒng)提示
MsgBox"一共用時(shí):"&Format(Timer-T,"#0.0000")&"秒",,"溫馨提示!!"'//提示所用時(shí)間
End Sub
2.關(guān)閉代碼窗口,返回正常窗口,點(diǎn)擊“開發(fā)工具”,在“匯總”工作表插入窗體按鈕,如圖5所示。
圖5 添加窗體按鈕
同時(shí)編輯好表頭,如圖6所示。
圖6 表頭名稱行
3.單擊按鈕執(zhí)行匯總各子表需要提取的4個(gè)單元格內(nèi)容,將提取結(jié)果復(fù)制,選擇性粘貼到新工作表“余額結(jié)果表”,如圖7所示。
圖7 統(tǒng)計(jì)結(jié)果
AO要求余額表包含關(guān)鍵字段:科目代碼、科目名稱、科目方向、科目余額,因此接下來還需要對(duì)科目進(jìn)行切分。從“科目”列我們發(fā)現(xiàn)單元格內(nèi)容都是“科目:科目代碼科目名稱”的結(jié)構(gòu),可以利用組合函數(shù)查找冒號(hào)和空格的位置進(jìn)行對(duì)科目代碼和科目名稱的提取,在C3輸入公式“=MID(B3,FIND(":",B3)+1,FIND("",B3)-FIND(":",B3)-1)”,如圖8所示。
圖8 C3單元格公式和結(jié)果
4.在D3輸入公式“=RIGHT(B3,LEN(B3)-FIND("",B3))”,利用下拉鍵,批量完成所有科目代碼和科目名稱的生成,結(jié)果如圖9所示。
圖9 分割后的科目代碼和科目名稱結(jié)果
5.最后一步形成標(biāo)準(zhǔn)的科目余額表,555行數(shù)據(jù)與源表數(shù)據(jù)一致。至此,科目余額表的標(biāo)準(zhǔn)化工作已全部完成,加上之前提供的憑證表,可以完成AO財(cái)務(wù)賬套的采集。
由于AO模板的有限性,小眾財(cái)務(wù)軟件基本無法直接采集轉(zhuǎn)換,但采集思路是固定的,我們只需要取得科目表、余額表、憑證表即可完成財(cái)務(wù)數(shù)據(jù)的標(biāo)準(zhǔn)化處理,滿足工作需要。而實(shí)際工作中,小眾財(cái)務(wù)軟件的表格數(shù)據(jù)邏輯性可能與AO不對(duì)稱,這時(shí)就需要積極創(chuàng)新、大膽探索,總能從中找到有用的數(shù)據(jù),再配合相應(yīng)的辦法手段,最終完成數(shù)據(jù)的標(biāo)準(zhǔn)化工作。