?? excel、access、vb的結(jié)合應(yīng)用.txt
字號(hào):
Excel、Access、VB的結(jié)合應(yīng)用
作者:楊偉民
---- 微軟公司的Office系列辦公軟件相信已是眾所周知,其中Excel強(qiáng)大的統(tǒng)計(jì)制表功能、Access功能完備的數(shù)據(jù)處理能力深受眾多用戶所喜愛。Visual Bsaic更是微軟公司又一有力的產(chǎn)品,它簡(jiǎn)單易學(xué),在Windows編程中的應(yīng)用十分廣泛。本文通過介紹數(shù)據(jù)處理及復(fù)雜表格的打印,來討論VB與Excel及Access的結(jié)合運(yùn)用。
---- 由于筆者所在的公司員工眾多,在進(jìn)行職工養(yǎng)老保險(xiǎn)繳費(fèi)的計(jì)算工作時(shí),若使用勞動(dòng)局編制的軟件(用Foxbase編寫),無論是在管理或維護(hù)方面均顯得力不從心。于是在公司領(lǐng)導(dǎo)的強(qiáng)烈要求下,決定由筆者構(gòu)思重新編制。基本思路是:1.將所有員工資料輸入Access進(jìn)行處理,以便于維護(hù)。2.在Excel中預(yù)先制成有表頭的空表(Access相對(duì)欠缺處理復(fù)雜表格的能力),對(duì)需要進(jìn)行金額匯總或其他運(yùn)算的單元格可直接輸入公式。3.在VB中編寫程序代碼,從Access中提取數(shù)據(jù)填入Excel對(duì)應(yīng)表格相應(yīng)的單元格,并輸出至打印機(jī)。
---- 部分窗體及源程序代碼如下:
---- 1.程序主模塊
---- 定義Excel、Access對(duì)象變量,顯示系統(tǒng)啟動(dòng)畫面,進(jìn)入系統(tǒng)主程序界面。強(qiáng)調(diào)一下,在編寫程序之前須加入對(duì)Excel及Access庫(kù)函數(shù)的引用,具體操作是:選擇菜單欄'工程'\'引用…',將'可使用的引用'列表框內(nèi)'Microsoft Access 8.0 Object Library'和 'Microsoft Excel 8.0 Object Library'兩項(xiàng)前的復(fù)選框標(biāo)為選中,按"確定"返回。
mdsMain.bas
'定義數(shù)據(jù)庫(kù)記錄集及Excel對(duì)象變量
Public ex As New Excel.Application
Public exwbook As Excel.Workbook
Public exsheet As Excel.Worksheet
Public mydatabase As Database
Public myrecordset1 As Recordset
[定義記錄集]
……
……
Public Opt As Integer '報(bào)表選項(xiàng)
[Opt為frmSelreport.frm返回值]
Public isYN As Boolean
Sub Main()
Load frmSplash
frmSplash.Show
frmSplash.Label2.Caption =
" 系統(tǒng)正在加載Access數(shù)據(jù)庫(kù)..."
Set mydatabase = OpenDatabase("c:\sbda\sbda.mdb")
Set myrecordset1 = mydatabase.OpenRecordset
("報(bào)表打印(一)")
[此處對(duì)記錄集賦值]
……
……
frmSplash.Label2.Caption =
" 系統(tǒng)正在加載Excel電子表格..."
Set ex = CreateObject("excel.application")
Set exwbook = ex.Workbooks.Open("c:\sbda\sbda.xls")
Load FrmInput '將數(shù)據(jù)輸入窗體加載到內(nèi)存中
Unload frmSplash
Load FrmMain '將主程序界面加載到內(nèi)存中
End Sub
---- 2.報(bào)表打印模塊
---- 其中ExcelDoForVB1()是一子程序,由prnProess()調(diào)用,作用是從Access中提取所需數(shù)據(jù)資料,填入Excel對(duì)應(yīng)工作表(Worksheet)的相應(yīng)單元格(Cells)中,然后打印已填入數(shù)據(jù)的表格;prnProess()則負(fù)責(zé)實(shí)現(xiàn)對(duì)VB通用對(duì)話框(Commom Dialog)中打印功能的控制。
mdlPrint.bas
Option Explicit
'定義循環(huán)計(jì)數(shù)變量
Public nRow As Integer, nCol As
Integer, nBtoE As Integer
'定義變量接收打印對(duì)話框返回值
Public BeginPage, EndPage, NumCopies
'程序運(yùn)行時(shí)需進(jìn)行判斷的各種標(biāo)志
Public nflag, Flag, ifNum
'數(shù)據(jù)記錄集中指針移動(dòng)數(shù)
Public PageN As Integer, n As Integer
'bar1為進(jìn)度條
Public bar1 As Object
Sub prnProess()
'控制通用對(duì)話框打印功能
Set bar1 = FrmPrint.PgsBar1 '進(jìn)度條
On Error GoTo errhandle:
If Flag = 0 Then '當(dāng)打印對(duì)話框中選"全部"時(shí)
Select Case Opt '選擇需要打印的表格
Case 1
nflag = 1
myrecordset1.MoveFirst
myrecordset1.MovePrevious
PageN = 1
Do While nflag = 1
Call ExcelDoForVB1
'數(shù)據(jù)填入Excel單元格打印
PageN = PageN + 1
Loop
Case 2
……
……
End Select
Else
If Flag = 2 Then '
當(dāng)打印對(duì)話框中選"頁"時(shí)
If EndPage - BeginPage = 0 Then
ifNum = 0
Else
If EndPage - BeginPage > 0 Then
ifNum = 1
Else
ifNum = 2
End If
End If
Select Case ifNum
Case 2
Exit Sub
Case 0
Select Case Opt '
選擇需要打印的表格
Case 1
myrecordset1.MoveFirst
n = (BeginPage - 1) *
(49 - 4 + 1) - 1
myrecordset1.Move n
PageN = BeginPage
Call ExcelDoForVB1
'數(shù)據(jù)填入Excel單元格并打印
Case 2
……
……
End Select
Case 1
Select Case Opt
'選擇需要打印的表格
Case 1
myrecordset1.MoveFirst
n = (BeginPage - 1) *
(49 - 4 + 1) - 1
myrecordset1.Move n
PageN = BeginPage
For nBtoE = BeginPage To EndPage
Call ExcelDoForVB1
'填入Excel單元格并打印
PageN = PageN + 1
Next nBtoE
Case 2
……
……
End Select
End Select
End If
End If
FrmMain.Visible = True
Exit Sub
errhandle:
FrmPrint.Visible = False
FrmMain.Visible = True
End Sub
---- 注意,下段僅通過ExcelDoForVB1()對(duì)"報(bào)表(一)"的處理,來說明數(shù)據(jù)填入Excel并打印的整個(gè)過程。
Sub ExcelDoForVB1() '打印報(bào)表(一)
FrmPrint.Visible = True
Set exsheet = exwbook.Worksheets("sheet1")
ex.Sheets("Sheet1").Select
ex.Range("A4:U49").Select
ex.Selection.ClearContents
ex.Range("A4").Select
bar1.Min = 0
bar1.Max = 45
For nRow = 4 To 49
bar1.Value = nRow - 4 '進(jìn)度顯示欄進(jìn)程
myrecordset1.MoveNext
If myrecordset1.EOF Then
nflag = 0
Exit For
End If
For nCol = 1 To 21
exsheet.Cells(nRow, nCol) =
myrecordset1.Fields(nCol - 1)
Next nCol
Next nRow
exsheet.Cells(52, 21) = "第 " + CStr(PageN) + " 頁"
FrmPrint.Visible = False
bar1.Value = 0
ActiveWindow.SelectedSheets.PrintOut Copies:=NumCopies
End Sub
---- 雖然本文針對(duì)的是大多數(shù)已熟練掌握數(shù)據(jù)庫(kù)技術(shù),且精通編程之道的朋友們。但筆者認(rèn)為仍有必要提一提將數(shù)據(jù)輸入Access的過程,因?yàn)榫幊鰜淼能浖嗍敲嫦蚋黝惼胀ㄓ脩簦瑢?duì)他們來說最要緊的是好用,而其間的一系列關(guān)聯(lián)并不想深究。所以設(shè)計(jì)一個(gè)好的輸入界面十分有必要,在設(shè)計(jì)時(shí)可以運(yùn)用VB提供的Data控件,當(dāng)然若是考慮性能的話還可以用代碼直接操縱數(shù)據(jù)。關(guān)于如何使用Data控件訪問數(shù)據(jù)庫(kù),在Visual Basic的聯(lián)機(jī)手冊(cè)(Online book)中有很詳細(xì)的說明,此處不再贅述。
---- 文中的所有程序在Visual Bsaic5.0中文專業(yè)版及Office97中文版中調(diào)試通過。
江蘇省南通市學(xué)田新村
楊偉民
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -