胡敏,李梅,鄭增國
(上饒師范學院網絡中心,上饒 334001)
高校財務報賬各二級部門都會將費用表格上交給財務部門審核,審核通過后才能夠正常的劃賬下發(fā)。以我校為例,我校的專業(yè)經費報銷表格每月個數平均是在60個以上,在高峰期時會超過100。不同類型費用表格經常是不同的人員制造,在造表過程中就人名這一基本信息有時會出現同音不同字或者同名同姓但不同人員等現象,人工的檢測和校對需要耗費大量的時間在重復的比對上,雖然Excel表格中有匹配函數可以減輕工作量,但是頻繁的打開關閉表格也需要人工的看守,為此通過Visual Basic與Excel的對接,對報銷表格中的人名檢測、結構檢測等功能使用Visual Basic程序編輯完成。
在VB中有專門連接Excel外部對象Microsoft Excel 11.0 Object Library對象庫。在其中將Excel的結構和VB的結構一一對應。
(1)Excel是以層次結構組織對象的工作簿、工作表、行列單元格,其對象模型中含有許多不同的對象元素。編程過程中主要用到以下4個層次的對象,在Vi?sual Basic程序中有專門面向Excel的對象Excel Appli?cation[1]。
(2)Application 對象,即 Excel程序本身,Excel Ap?plication對象表示Excel應用程序本身。聲明一個Ex?cel應用程序對象的代碼為Dim xls As New Excel.Appli?cation。
(3)WorkBook對象,即Excel的工作簿文件對象;聲明一個Excel工作薄對象的代碼為Dim xbook As New Excel.Workbook[2]。
(4)WorkSheets對象,表示的是Excel的工作表對象集;
例如:worksheets(1)表示第一個工作表。聲明一個Excel工作表象的代碼為:
Dim xsheet As New Excel.Worksheet。
(5)Range對象:是Excel應用程序中最常用的對象。在能夠處理Excel內的任何范圍之前,必須將它表示為Range對象,并處理該對象的方法和屬性[3]。
(6)Cells、Range、Rows、Columns 對象,分別表示Excel工作表中的單元格對象集、區(qū)域對象、行對象集、列對象集[4]。
我校財務報賬人員姓名檢測流程如圖1。
圖1
第一步:導入母本:
從人事部門獲得學校在職教師信息Excel表格,包括姓名、工號、所在部門。在本系統(tǒng)中稱為母本即憑證文件。導入效果如圖2所示。
圖2
定義人員信息類型:Public Type person_info
xm_info As String'姓名
gonghao_info As String'工號
End Type
Public zaizhi()as person_info'將excel中在職人員的信息導入數組
在VB中定義表格,引用表格
Set xlApp=CreateObject("Excel.Application")
Set xlsheet=xlBook.Worksheets("在職")
xlsheet.Activate
zaizhi_num=xlsheet.UsedRange.Rows.Count-1
ReDim zaizhi(xlsheet.UsedRange.Rows.Count-1)
'根據人事部門給的人事Excel表格行數重新定義zaizhi數組的大小
For i=1 To xlsheet.UsedRange.Rows.Count-1'向zaizhi數組導入數據包括工號和姓名
zaizhi(i).gonghao_info=Trimstring(xlsheet.Cells(i+1,1))'第一列工號
zaizhi(i).xm_info=Trimstring(xlsheet.Cells(i+1,2))'第二列姓名
Next i
第二步:獲得待報銷表格中有效記錄的開始行列以及條數信息,用于導入數組。
通過過程 zhiDuanPosition(xlsheet,r,excelfile)獲得表格的行數和報銷人員有效記錄開始的位置,包括在Excel中的行列值。并將結構正常并且姓名正確的表格傳入b_to_sz()過程中轉換為數組,便于后期的匯總分析。在導入的待測Excel表格中匹配帶有姓字的字段,定位為報賬人信息的開始包括行列。
For i=1 To R_Count'從待測Excel表格的第一行開始查找
flag=False'默認沒有找到姓名字段
For j=1 To C_Count
If InStr(Trimstring(xlsheet.UsedRange.Cells(i,j)),"姓")<>0 Then '遍歷該行中的每一個單元格匹配是否有”姓”字,如果找到表示以下行列為報賬人員的信息,記錄行列信息用于后面b_sz()數組內容的導入。
xm_j=j
flag=True
Exit For
End If
Next j
If flag=True Then Exit For‘如果沒有姓字則認為該表格的結構異常,沒有報賬人員姓名字段。
Next i
第三步:將結構正常的Excel表格數據信息的導入到數組b_sz(),篩選出姓名行列信息導入數組b_szF()中。
Public Sub b_to_sz(xlsheet As Object)
ReDim b_sz(1 To xlsheet.UsedRange.Rows.Count,1 To xlsheet.UsedRange.Columns.Count)As String‘根據表格大小先定義二維原始數組,將Excel中姓名對應列的內容和實發(fā)的金額列的內容存入b_sz數組中,精簡成b_szF()數組。
(1)找出字段開始的第一列zd_start_c For j=1 To UBound(b_sz,2)
If Len(Trimstring(xlsheet.UsedRange.Cells(zd_r,j)))<>0 Then
zd_start_c=j‘
Exit For
End If
Next j
(2)找出字段最后一列zd_end_c
For j=UBound(b_sz,2)To zd_start_c Step-1 '從后往前找字段最后一列zd_end_c
If Len(Trimstring(xlsheet.UsedRange.Cells(zd_r,j)))<>0 Then'從后往前找第一個不為零的就是字段結束列
zd_end_c=j
Exit For
End If
Next j
(3)找出最后一個姓名所在的行xm_end_r
For i=zd_r To UBound(b_sz,1)+1'找出最后一個姓名所在的行xm_end_r
If Len(Trimstring(xlsheet.UsedRange.Cells(i,xm_c)))=0 Then
xm_end_r=i-1
Exit For
End If
Next i
(4)根據報賬人員信息開始的行列,定義精簡數組存放報賬人員姓名
ReDim b_szF(1 To xm_end_r-zd_r+1,1 To zd_end_c
zd_start_c+1)As String'定義精簡的數組
For i=zd_r To xm_end_r
b_j=1
For j=zd_start_c To zd_end_c
b_szF(b_i,b_j) =Trimstring(xlsheet.
UsedRange.Cells(i,j))
b_j=b_j+1
End If
Next j
b_i=b_i+1
Next i
第四步:將選擇后的數組b_szF()與母本信息核對,并記錄不規(guī)范的姓名所在行列便于人工核對。
判斷標準和處理方法見表1。
(1)在母本中查找將待檢測的姓名,如果姓名不在要記錄在第幾行,便于后期人工核查。
checkName_bsz(zaizhi(),b_szF(),excelfile,Dao_Excel_Name,zd_r)
For i=2 To UBound(b_szF,1) '從內容行開始
xm_is_in=False '先設定待測姓名不在母本中
For zaizhi_i=1 To UBound(zaizhi) '將待測姓名與zaizhi數組中依次對比查找
If Trimstring(b_szF(i,xm_c))=Trimstring
(zaizhi(zaizhi_i).xm_info)Then
xm_is_in=True'如果找到了則xm_is_in
設置為True,并退出循環(huán)
Exit For
End If
Next zaizhi_i
If xm_is_in=False Then '遍歷完zaizhi數組后,如果xm_is_in仍然為false表示待檢測’的姓名沒有在人事處給的在職母本中
xm_cw_tishi=xm_cw_tishi&"在第"&i+zd_r-1&"行,沒有找到"&b_szF(i,xm_c)&vbCrLf '將這個沒在在職人事的姓名的行列和內容記錄
End If
Next i
(2)將姓名不在母本中的表格的信息記錄保存在錯誤提示.txt文本中,如圖3所示。
圖3
(3)姓名無異常且表格結構正常的表格信息列出,如圖4所示。
圖4
本文講解了Visual Basic操作多張財務報賬Excel表的實際應用,并取得了良好的效果。通過設計的Vi?sual Basic界面就能夠操作多個Excel表格,利用數組的特性進行表結構和保障人員信息檢測,并記錄異常信息的位置便于人工核對,大大提高了工作的效率。