(中國勞動(dòng)關(guān)系學(xué)院經(jīng)濟(jì)管理系,北京100037)
[摘 要] 在財(cái)務(wù)工作中,利用Excel函數(shù)多重嵌套方法可以進(jìn)行賬務(wù)處理,但自動(dòng)化程度低,數(shù)據(jù)保密性差。本文給出了一個(gè)在Excel平臺(tái)下利用VBA技術(shù)編制的通用自動(dòng)化登賬程序。
[關(guān)鍵詞] Excel VBA;財(cái)務(wù);自動(dòng)登賬
[中圖分類號(hào)]F232[文獻(xiàn)標(biāo)識(shí)碼]A[文章編號(hào)]1673-0194(2008)22-0007-04
1 系統(tǒng)目標(biāo)
系統(tǒng)的目標(biāo)決定于會(huì)計(jì)管理的要求,并受會(huì)計(jì)人員和計(jì)算機(jī)人員的素質(zhì)以及硬件和軟件計(jì)算機(jī)資源的制約,還受其他經(jīng)濟(jì)業(yè)務(wù)系統(tǒng)的影響。
一般來說,賬務(wù)自動(dòng)登賬系統(tǒng)的目標(biāo),可以表述為以記賬憑證為原始數(shù)據(jù),按照設(shè)計(jì)的賬戶體系和系統(tǒng)指標(biāo)體系,完成全部的分類核算。其具體要求是:能輸入系統(tǒng)核算所需資料,主要指利用各種記賬憑證進(jìn)行數(shù)據(jù)輸入;能根據(jù)數(shù)據(jù)資料進(jìn)行分類核算,隨機(jī)輸出總分類賬;能隨機(jī)輸出某個(gè)時(shí)期任意分類核算的詳細(xì)信息,即能隨機(jī)輸出任意會(huì)計(jì)科目的明細(xì)賬;能夠根據(jù)需要隨機(jī)輸出會(huì)計(jì)報(bào)表,包括對(duì)外報(bào)表和其他內(nèi)部管理需要的報(bào)表資料。
本文中把企業(yè)能根據(jù)需要隨機(jī)輸出各科目的明細(xì)賬和總賬作為程序設(shè)計(jì)目標(biāo)。
2 系統(tǒng)文件設(shè)計(jì)
為了保存數(shù)據(jù)以及輸出賬簿及其他內(nèi)部管理所用會(huì)計(jì)信息,同時(shí)為了系統(tǒng)擴(kuò)展的需要,本系統(tǒng)需要在Excel中建立各種表格文件,具體情況如下:
2. 1科目代碼表(kmdmb)
該表主要存儲(chǔ)企業(yè)科目代碼信息,通常情況下包括科目代碼、科目名稱、是否明細(xì)、科目類型、科目級(jí)別。文件結(jié)構(gòu)及示例如表1所示。
2. 2記賬憑證表
在手工核算下,記賬憑證所記載的會(huì)計(jì)信息與記賬憑證本身是一體的,采用電算化后,會(huì)計(jì)信息將最終保存在計(jì)算機(jī)硬盤、磁盤、磁帶等介質(zhì)上。根據(jù)通用記賬憑證的格式,本文設(shè)計(jì)一個(gè)表來保存記賬憑證中的數(shù)據(jù)。為了充分發(fā)揮Excel強(qiáng)大的統(tǒng)計(jì)功能,在數(shù)據(jù)數(shù)關(guān)系設(shè)置上做出了某些讓步。文件結(jié)構(gòu)及示例如表2所示。
2. 3賬簿表
該文件用于保存總賬和明細(xì)賬輸出的內(nèi)容格式。文件為臨時(shí)文件,建賬時(shí)只需要建立表的結(jié)構(gòu)。另外,在采用計(jì)算機(jī)進(jìn)行會(huì)計(jì)核算時(shí),不單獨(dú)設(shè)置現(xiàn)金和銀行存款日記賬,而是將這兩個(gè)科目的核算與其他科目采用同樣的方法處理,當(dāng)需要輸出現(xiàn)金或銀行存款日記賬時(shí),可以利用該賬文件結(jié)構(gòu)。該文件結(jié)構(gòu)及示例如表5所示。
2. 4科目發(fā)生額及余額表
該文件用于存儲(chǔ)企業(yè)全部會(huì)計(jì)科目的發(fā)生額和余額等數(shù)據(jù),由各月數(shù)據(jù)的會(huì)計(jì)憑證數(shù)據(jù)按照科目逐級(jí)匯總形成。具體結(jié)構(gòu)及示例如表3所示。
2. 5科目年初余額表
該表保存企業(yè)年初各科目的余額,在登記各賬戶總賬和明細(xì)賬時(shí)均需要從該表中獲取年初數(shù)。具體結(jié)構(gòu)及示例如表4所示。
3 登賬程序設(shè)計(jì)
3. 1登賬數(shù)據(jù)處理過程
登賬實(shí)際上是根據(jù)會(huì)計(jì)科目反映的經(jīng)濟(jì)業(yè)務(wù)發(fā)生的時(shí)間順序逐日逐筆進(jìn)行分類匯總,采用計(jì)算機(jī)核算以后,由于系統(tǒng)已經(jīng)建立了明細(xì)賬文件的數(shù)據(jù)結(jié)構(gòu),當(dāng)用戶需要輸出某科目的明細(xì)賬時(shí),可以通過在憑證號(hào)文件和憑證內(nèi)容文件中選擇該科目的發(fā)生業(yè)務(wù)進(jìn)行輸出即可。
如某科目某會(huì)計(jì)期間所需數(shù)據(jù)基本處理過程如下:①打開期初余額表,查找用戶選定科目的記錄,取期初數(shù)并添加到要輸出的科目的明細(xì)賬中,并填寫摘要;②掃描憑證號(hào)文件,如果文件中有科目為用戶選定科目的記錄,則取當(dāng)前憑證號(hào)、摘要、借方金額、貸方金額等信息并保存到變量中,并計(jì)算當(dāng)前科目的借方發(fā)生額合計(jì)數(shù)、貸方發(fā)生額合計(jì)數(shù)和余額;③根據(jù)會(huì)計(jì)科目的性質(zhì),確定借貸方向,然后將憑證號(hào)文件中的憑證號(hào)、摘要以及該科目的借方發(fā)生額、貸方發(fā)生額、余額添加到明細(xì)賬文件中;④選擇憑證號(hào)文件并下移指針,然后返回到第②步進(jìn)行處理;⑤將借方合計(jì)數(shù)、貸方合計(jì)數(shù)寫入到明細(xì)賬最后一行。根據(jù)需要,將該明細(xì)賬顯示或打印即可。
3. 2登賬程序設(shè)計(jì)
根據(jù)以上描述,本案設(shè)計(jì)一個(gè)名為zzdz的自動(dòng)登賬函數(shù),該函數(shù)將接受用戶在列表框中選定的科目編碼、科目名稱、科目類型、科目級(jí)別等4個(gè)參數(shù),并根據(jù)會(huì)計(jì)核算的要求將用戶選定科目的業(yè)務(wù)信息登記到賬簿中。利用該函數(shù),可以進(jìn)行總賬和明細(xì)賬的登記,該函數(shù)接受參數(shù)后運(yùn)行效果如表5所示。
該函數(shù)代碼如下:
Public Function zzdz(dblcurkmdm As Double, strcurkmmc As String, intkmlx, intkmjb)
Dim mycounter As Integer'計(jì)數(shù)器
Dim dblpzcount As Double, kmdm As Double '
Dim rq As Date, pzh As Integer, zy As String '日期,憑證號(hào),摘要
Dim month1 As Integer, month2 As Integer'月份
Dim jfje As Double, dfje As Double'借方金額,貸方金額
Dim jfjelj As Double, dfjelj As Double'借方金額累計(jì),貸方金額累計(jì)
Dim qcye As Double, ye As Double '期初余額,期末余額
Dim jhd As String, intcolumnscount As Integer ' 借或貸 列數(shù)
Dim mxznextrow As Double '下一行
ye = 0
jfjelj = 0
dfjelj = 0
mycounter = 3
dblpzcount = Sheets(\"jzpzk\").Range(\"a2\").CurrentRegion.Rows.Count '
'以下是登記明細(xì)賬中的第一行和期初余額
mxznextrow = 4
With Sheets(\"zb\")
.Activate
.Cells(1, 1) = strcurkmmc
qcye = findqcye(dblcurkmdm) '調(diào)用函數(shù),返回期初余額
.Cells(3, 7) = qcye
'根據(jù)科目類型填寫借貸關(guān)系
If (intkmlx = 1 Or intkmlx = 4Or intkmlx = 6) And qcye > 0 Then
.Cells(3, 6) = \"借\"
ElseIf (intkmlx = 2 Or intkmlx = 3 Or intkmlx = 4) And qcye < 0 Then
.Cells(3, 6) = \"貸\"
ElseIf qcye = 0 Then
.Cells(3, 6) = \"平\"
End If
End With
'以下為輸出業(yè)務(wù)數(shù)據(jù)過程
Do While mycounter <= dblpzcount
Sheets(\"jzpzk\").Activate
'以下是在記賬憑證庫中查找符合的記錄并存到各變量中
With Sheets(\"jzpz\")
kmdm = Val(Trim(Left(.Cells(mycounter, 5), 2 * intkmjb + 2)))
rq = .Cells(mycounter, 1)
pzh = .Cells(mycounter, 14)
zy = .Cells(mycounter, 4)
jfje = Val(Trim(.Cells(mycounter, 7)))
dfje = Val(Trim(.Cells(mycounter, 8)))
'將本月數(shù)據(jù)輸出數(shù)據(jù)到表sheet 3中
With Sheets(\"zb\")
.Cells(mxznextrow, 1) = rq
.Cells(mxznextrow, 2) = pzh
.Cells(mxznextrow, 3) = zy
.Cells(mxznextrow, 4) = jfje
.Cells(mxznextrow, 5) = dfje
For intcolumnscount = 1 To 7 '給當(dāng)前行邊框畫線
.Cells(mxznextrow, _
intcolumnscount).Borders.LineStyle = lContinuous
Next
End With
jfjelj = jfjelj + jfje'計(jì)算累計(jì)
dfjelj = dfjelj + dfje
'判斷借貸關(guān)系并計(jì)算余額
If intkmlx = 1 Or intkmlx = 4 Or intkmlx = 6 Then
ye = qcye + jfjelj - dfjelj
If ye > 0 Then
jhd = \"借\"
ElseIf ye < 0 Then
jhd = \"貸\"
Else
jhd = \"平\"
End If
Else
ye = qcye - jfjelj + dfjelj
If ye > 0 Then
jhd = \"貸\"
ElseIf ye < 0 Then
jhd = \"借\"
Else
jhd = \"平\"
End If
End If
Sheets(\"zb\").Cells(mxznextrow, 6) = jhd
Sheets(\"zb\").Cells(mxznextrow, 7) = Abs(ye)
mxznextrow = mxznextrow + 1
mycounter = mycounter + 1
End With
Loop
With Sheets(\"zb\")
.Range(\"a\" mxznextrow, \"c\" mxznextrow).Merge
.Cells(mxznextrow, 1) = \"當(dāng)前累計(jì)\"
.Cells(mxznextrow, 1).HorizontalAlignment = xlCenter
.Cells(mxznextrow, 4) = jfjelj
.Cells(mxznextrow, 5) = dfjelj
End With
'給當(dāng)前行邊框畫線
For intcolumnscount = 1 To 7
Sheets(\"zb\").Cells(mxznextrow,intcolumnscount)._
Borders.LineStyle = xlContinuous
Sheets(\"zb\").Cells(mxznextrow,intcolumnscount)._
Borders(xlBottom).LineStyle = xlDouble
Next
End Function
過程djmxz調(diào)用了函數(shù)findqcye,該函數(shù)接受科目代碼后在qcyeb表中查找并返回該科目的期初余額#65377;findqcye函數(shù)的代碼如下:
Public Function findqcye(dblcurkmdm As Double)
Sheets(\"qcyeb\").Activate
Range(\"a1\").Select
With Sheets(\"qcyeb\").Columns(1)
If Not .Find(What:=dblcurkmdm, LookIn:=xlValues, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=True) Is Nothing Then
.Find(What:=dblcurkmdm, After:=ActiveCell _
, LookIn:=xlValues, LookAt:=xlWhole _
, SearchOrder:=xlByRows, SearchDirection:=xlNext _
, MatchCase:=True).Activate
findqcye = ActiveCell.Offset(0, 3).Value ' 返回期初余額
Else
findqcye = 0
End If
End With
End Function
4 結(jié)束語
本軟件是筆者長期知識(shí)積累和艱辛開發(fā)之成果,通過本文,希望對(duì)讀者利用Excel VBA進(jìn)行程序設(shè)計(jì)提供一點(diǎn)思路#65377;另外,在財(cái)政部制定的《會(huì)計(jì)電算化管理辦法》中指出,采用電子計(jì)算機(jī)打印輸出書面會(huì)計(jì)憑證#65380;賬簿#65380;報(bào)表的, 應(yīng)當(dāng)符合國家統(tǒng)一會(huì)計(jì)制度的要求,采用中文或中外文對(duì)照,科目明晰,作為會(huì)計(jì)檔案保存,保存期限按《會(huì)計(jì)檔案管理辦法》的規(guī)定執(zhí)行;在當(dāng)期所有記賬憑證數(shù)據(jù)和明細(xì)分類賬數(shù)據(jù)都存儲(chǔ)在計(jì)算機(jī)內(nèi)的情況下,總分類賬可以從這些數(shù)據(jù)中產(chǎn)生,可以用“總分類賬戶本期發(fā)生額及余額對(duì)照表”替代當(dāng)期總分類賬,登記科目匯總表的程序代碼略#65377;
主要參考文獻(xiàn)
[1] 桂俊煜. Excel VBA電算化設(shè)計(jì)基礎(chǔ)與實(shí)踐[M]. 北京:機(jī)械工業(yè)出版社,2007.
[2] 王成春,蕭雅云. 實(shí)戰(zhàn)Excel 2002 VBA程序設(shè)計(jì)實(shí)務(wù)[M]. 北京:中國鐵道出版社,2004.
[3] 溫作民,鐘鳳英,桂俊煜. 會(huì)計(jì)信息系統(tǒng)[M]. 北京:中國林業(yè)出版社,2002.