Excel面始之初帶有表格處理類(lèi)軟件中功能最強(qiáng)的宏語(yǔ)言,通過(guò)單擊“工具”菜單中的“宏”,選擇宏名來(lái)調(diào)用宏過(guò)程。隨后發(fā)展至Visual Basic for Application專(zhuān)用版,可制作按鈕、復(fù)選框、單選鈕等控件,賦控件以宏名,單擊控件運(yùn)行宏,事件驅(qū)動(dòng)方式就Click(單擊)一種。新近推出的Office97套件中的Excel97,在“工具”菜單中選擇“宏”后,就會(huì)發(fā)現(xiàn)增加了“Visual Basic編輯器”功能。運(yùn)用這個(gè)新增功能,就完全與Visual Basic編程無(wú)異了。在菜單欄上單擊鼠標(biāo)右鍵,選擇彈出式菜單中的“控件工具箱”,在“控件工具箱”工具條上,單擊待添加的控件按鈕,在工作表中將控件拖曳到所需位置和大小,單擊鼠標(biāo)右鍵選中“屬性”設(shè)置控件屬性后,雙擊控件就會(huì)出現(xiàn)Visual Basic編輯器。選擇該控件的一個(gè)事件如Click或Change,編寫(xiě)程序。在工作表中操作該控件,如鼠標(biāo)單擊、鍵入字符等,則觸發(fā)相應(yīng)事件,執(zhí)行相應(yīng)程序。
筆者在Excel97平臺(tái),采用Visual Basic應(yīng)用程序版開(kāi)發(fā)了一套“通用報(bào)表分析系統(tǒng)”。該系統(tǒng)用于擁有眾多子公司的母公司的每月財(cái)務(wù)報(bào)表合并匯總。所有子公司的統(tǒng)計(jì)報(bào)表如資產(chǎn)負(fù)債表、損益表是由FoxBase編制的財(cái)務(wù)軟件生成的dbf文件,取名為ATV001xx.dbf----xx月份資產(chǎn)負(fù)債表,ATV002xx.dbf----xx月份損益表等。一個(gè)子公司的所有dbf文件放在一個(gè)單獨(dú)的目錄中,如C:\T\palm1,C:\T\palm2等。母公司每月份生成的匯總報(bào)表為T(mén)TTyymm.xls(yy----年份,mm----月份),它有“資產(chǎn)負(fù)債表”、“損益表”等若干工作表組成。每張工作表是由所有子公司相應(yīng)的dbf文件的相應(yīng)項(xiàng)目的數(shù)據(jù)相加而成。只要將dbf文件逐一轉(zhuǎn)化到TTTyymm.xls中去,很容易利用Excel的公式設(shè)置功能生成母公司的每張匯總報(bào)表。
這套系統(tǒng)的關(guān)鍵在于如何將所有dbf文件轉(zhuǎn)換到同一個(gè)Excel工作簿中。直接通過(guò)“文件”菜單中的“打開(kāi)”項(xiàng), 選擇文件類(lèi)型為dBase文件(*.dbf), 可將dbf文件轉(zhuǎn)換到Excel工作簿中,但這工作簿只存轉(zhuǎn)換而來(lái)的一張工作表,其他表都自動(dòng)關(guān)閉了。另外,通過(guò)“工具”菜單中的“向?qū)А?,選擇“文件轉(zhuǎn)換”后, 只是將一系列dbf文件轉(zhuǎn)換為一系列xls文件而已。于是采用建立ODBC數(shù)據(jù)源獲取外部數(shù)據(jù)的辦法, 將dbf文件逐一轉(zhuǎn)換到一個(gè)Excel工作簿內(nèi), 且用Visual Basic for Application將轉(zhuǎn)換過(guò)程自動(dòng)化。只要按一下圖1中的“生成報(bào)表”按鈕, 就能完成所有dbf 文件的轉(zhuǎn)換, 且利用Excel公式自動(dòng)計(jì)算功能完成所有報(bào)表的匯總計(jì)算。按“顯示報(bào)表”按鈕,選擇表名,可以瀏覽報(bào)表數(shù)據(jù)。
具體的方法是:
一、 建立ODBC數(shù)據(jù)源
(1) 打開(kāi)“數(shù)據(jù)”菜單, 選擇“獲取外部數(shù)據(jù)”, 然后單擊“新建查詢”;
(2) 在“選擇數(shù)據(jù)源”對(duì)話框中, 雙擊“<新數(shù)據(jù)源>”;
(3) 出現(xiàn)“創(chuàng)建新數(shù)據(jù)源”對(duì)話框,輸入數(shù)據(jù)源名稱(chēng), 選擇驅(qū)動(dòng)程序如Microsoft dBase Driver(*.dbf), 單擊“連接”;
(4) 在“ODBC dBase安裝”對(duì)話框中, 單擊“使用當(dāng)前工作目錄”前的復(fù)選框, 去掉缺省( , 單擊“選定目錄(s)”, 選擇子公司存放dbf文件的目錄如C:\T\palm1, 連按“確定”;
(5) 當(dāng)出現(xiàn)Microsoft Quary對(duì)話框時(shí), 單擊“關(guān)閉”, 退出。不要理會(huì)出現(xiàn)的警示信息,因?yàn)榇藭r(shí)只需建立數(shù)據(jù)源, 并不需要用Microsoft Query查詢數(shù)據(jù);
(6) 重復(fù)上述步驟, 在(4)中改換另一家子公司的目錄, 就為另一家子公司建立一個(gè)數(shù)據(jù)源。必須建立所有子公司的數(shù)據(jù)源。
二、手動(dòng)獲取外部數(shù)據(jù)
(1) 單擊“數(shù)據(jù)”,選取“獲取外部數(shù)據(jù)”,單擊“新建查詢”;
(2) 出現(xiàn)“選取數(shù)據(jù)源”對(duì)話框,點(diǎn)中“使用查詢向?qū)?chuàng)建/ 編輯查詢”前的復(fù)選框,然后雙擊數(shù)據(jù)源名,如palm1;
(3) 在“查詢向?qū)Аx擇列”對(duì)話框中選擇一個(gè)查詢表名,單擊 > 鍵,“查詢中用到的列”框內(nèi)會(huì)出現(xiàn)表中所有列名,單擊“下一步”;
(4) 出現(xiàn)“查詢向?qū)А^(guò)濾數(shù)據(jù)”,單擊“下一步”;
(5) 出現(xiàn)“查詢向?qū)А判蝽樞颉?,單擊“下一步”?
(6) 出現(xiàn)“查詢向?qū)А瓿伞?,點(diǎn)中“將數(shù)據(jù)返回Microsoft Excel”前的單選鈕,單擊“完成”;
(7) 出現(xiàn)“將外部數(shù)據(jù)返回到Excel”對(duì)話框,選中“新建工作表”,按“確定”;
(8) 在建立查詢的工作簿內(nèi)新建工作表,并放入轉(zhuǎn)換好的數(shù)據(jù)。這樣就將一個(gè) dbf 文件轉(zhuǎn)換好了。
(9)重復(fù)上述過(guò)程,所有子公司的dbf文件轉(zhuǎn)換到同一個(gè)工作簿中。
三、 使用VB實(shí)現(xiàn)Excel自動(dòng)獲取外部數(shù)據(jù)
(1) 進(jìn)行手動(dòng)獲取外部數(shù)據(jù)(1)步驟前,單擊“工具”菜單中的“宏”,選擇“錄制新宏”,在“宏名”的編輯框中鍵入宏名dbftoxls,按“確定”鍵;
(2) 完成手動(dòng)獲取外部數(shù)據(jù)(1)-(8)步驟;
(3) 單擊“工具”菜單中的“宏”,選擇“停止錄制”。這樣就將獲取外部數(shù)據(jù)的過(guò)程記錄為宏。
(4) 編輯dbftoxls宏,加以修改,使它作為Visual Basic模塊表中的一個(gè)子程序,并設(shè)置調(diào)用參數(shù)。
提供的程序如下:
`設(shè)置初值
Const apppath = "c:\my documents\palmxls\"
Const modulefile = apppath + "module.xls"
Const staticspre = "TTT"
Const dbfpre = "ATV00"
`調(diào)用dbftoxls的模塊
Private Sub Cmdgeneratetable_Click()
Dim staticsfile As String
Dim s1 As String
Dim s2 As String
Dim s3 As String
Dim idyes As Integer
Dim dbfstring As String
On Error GoTo errhandler1
idyes = 6
s1 = txtyear.Text
s1 = Mid(s1, 3, 2)
s2 = txtmonth.Text
If Len(s2) = 1 Then
s2 = "0" + s2
End If
staticsfile = apppath + staticspre + s1 + s2 + ".xls"
If FileLen(staticsfile) > 0 Then
choice = MsgBox("該年月報(bào)表已存在,是否重新生成?", vbYesNo + vbExclamation + vbDefaultButton1, "")
If choice = idyes Then
Workbooks.Open FileName:=staticsfile
For i = 0 To companynum - 1
For j = 0 To tablenum - 1
dbfstring = dbfpre + Trim(Str$(j + 1)) + s2
sqlstring = sqlstringfunc(dbfstring, fieldlist(),
tablefieldnum(j))
Call dbftoxls(s(i, j), sqlstring)
Next j
Next i
ActiveWorkbook.Save
ActiveWorkbook.Close
End If
End If
Exit Sub
errhandler1:
Select Case Err
Case 53
Workbooks.Open FileName:=modulefile
s3 = s1 + "年" + s2 + "月"
Sheets("資產(chǎn)負(fù)債表").Range("e4").FormulaR1C1 = "注釋?zhuān)? + s3
ActiveWorkbook.SaveAs FileName:=staticsfile, FileFormat _
:=xlNormal, Password:="", WriteResPassword:="",
ReadOnlyRecommended:= _
False, CreateBackup:=False
For i = 0 To companynum - 1
For j = 0 To tablenum - 1
dbfstring = dbfpre + Trim(Str$(j + 1)) + s2
sqlstring = sqlstringfunc(dbfstring, fieldlist(),
tablefieldnum(j))
Call dbftoxls(s(i, j), sqlstring)
Next j
Next i
ActiveWorkbook.Save
ActiveWorkbook.Close
End Select
End Sub
`dbftoxls子程序
Sub dbftoxls(activesheetname, sqlstring)
Sheets(activesheetname).Activate
Cells.Select
Selection.Clear
Range("a1").Select
With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
"ODBC;CollatingSequence=ASCII;DBQ=C:\T\palm1;DefaultDir=
C:\T\palm1;Deleted=1;
Driver={Microsoft dBase Driver (*.dbf)};
DriverId=533;FIL"), Array( "=dBase III;
ImplicitCommitSync=Yes;
MaxBufferSize=512;
MaxScanRows= 8;
PageTimeout=600;
SafeTransactions=0;
Statistics=0;
Threads=3;Use" ), Array("rCommitSync=Yes;")),
Destination:=Range("A1"))
.Sql = Array( sqlstring)
.FieldNames = True
.RefreshStyle = xlInsertDeleteCells
.RowNumbers = False
.FillAdjacentFormulas = False
.RefreshOnFileOpen = False
.HasAutoFormat = True
.BackgroundQuery = True
.TablesOnlyFromHTML = True
.Refresh BackgroundQuery:=False
.SavePassword = True
.SaveData = True
End With
End Sub