Excel、Access、VB的结合应用
2006-02-27 11:45:20 来源:WEB开发网核心提示:微软公司的Office系列办公软件相信已是众所周知,其中Excel强大的统计制表功能、access功能完备的数据处理能力深受众多用户所喜爱,Excel、Access、VB的结合应用,VisualBsaic更是微软公司又一有力的产品,它简单易学,在VisualBasic的联机手册(Onlinebook)中有很详细的说明,
----微软公司的Office系列办公软件相信已是众所周知,其中Excel强大的统计制表功能、access功能完备的数据处理能力深受众多用户所喜爱。VisualBsaic更是微软公司又一有力的产品,它简单易学,在Windows编程中的应用十分广泛。本文通过介绍数据处理及复杂表格的打印,来讨论VB与Excel及Access的结合运用。
----由于笔者所在的公司员工众多,在进行职工养老保险缴费的计算工作时,若使用劳动局编制的软件(用Foxbase编写),无论是在管理或维护方面均显得力不从心。于是在公司领导的强烈要求下,决定由笔者构思重新编制。基本思路是:1.将所有员工资料输入Access进行处理,以便于维护。2.在Excel中预先制成有表头的空表(Access相对欠缺处理复杂表格的能力),对需要进行金额汇总或其他运算的单元格可直接输入公式。3.在VB中编写程序代码,从Access中提取数据填入Excel对应表格相应的单元格,并输出至打印机。
----部分窗体及源程序代码如下:
----1.程序主模块
----定义Excel、Access对象变量,显示系统启动画面,进入系统主程序界面。强调一下,在编写程序之前须加入对Excel及Access库函数的引用,具体操作是:选择菜单栏'工程'\'引用…',将'可使用的引用'列表框内'MicrosoftAccess8.0ObjectLibrary'和'MicrosoftExcel8.0ObjectLibrary'两项前的复选框标为选中,按"确定"返回。
mdsMain.bas
'定义数据库记录集及Excel对象变量
PublicexAsNewExcel.application
PublicexwbookAsExcel.Workbook
PublicexsheetAsExcel.Worksheet
PublicmydatabaseAsDatabase
Publicmyrecordset1AsRecordset
[定义记录集]
……
……
PublicOptAsInteger'报表选项
[Opt为frmSelreport.frm返回值]
PublicisYNAsBoolean
SubMain()
LoadfrmSplash
frmSplash.Show
frmSplash.Label2.Caption=
"系统正在加载Access数据库..."
Setmydatabase=OpenDatabase("c:\sbda\sbda.mdb")
Setmyrecordset1=mydatabase.OpenRecordset
("报表打印(一)")
[此处对记录集赋值]
……
……
frmSplash.Label2.Caption=
"系统正在加载Excel电子表格..."
Setex=CreateObject("excel.application")
Setexwbook=ex.Workbooks.Open("c:\sbda\sbda.xls")
LoadFrmInput '将数据输入窗体加载到内存中
UnloadfrmSplash
LoadFrmMain '将主程序界面加载到内存中
EndSub
----2.报表打印模块
----其中ExcelDoForVB1()是一子程序,由PRnProess()调用,作用是从Access中提取所需数据资料,填入Excel对应工作表(Worksheet)的相应单元格(Cells)中,然后打印已填入数据的表格;prnProess()则负责实现对VB通用对话框(CommomDialog)中打印功能的控制。
mdlPrint.bas
OptionExplicit
'定义循环计数变量
PublicnRowAsInteger,nColAs
Integer,nBtoEAsInteger
'定义变量接收打印对话框返回值
PublicBeginPage,EndPage,NumCopies
'程序运行时需进行判断的各种标志
Publicnflag,Flag,ifNum
'数据记录集中指针移动数
PublicPageNAsInteger,nAsInteger
'bar1为进度条
Publicbar1AsObject
SubprnProess()
'控制通用对话框打印功能
Setbar1=FrmPrint.PgsBar1 '进度条
OnErrorGoToerrhandle:
IfFlag=0Then '当打印对话框中选"全部"时
SelectCaSEOpt '选择需要打印的表格
Case1
nflag=1
myrecordset1.MoveFirst
myrecordset1.MovePrevious
PageN=1
DoWhilenflag=1
CallExcelDoForVB1
'数据填入Excel单元格打印
PageN=PageN 1
Loop
Case2
……
……
EndSelect
Else
IfFlag=2Then '
当打印对话框中选"页"时
IfEndPage-BeginPage=0Then
ifNum=0
Else
IfEndPage-BeginPage>0Then
ifNum=1
Else
ifNum=2
EndIf
EndIf
SelectCaseifNum
Case2
ExitSub
Case0
SelectCaseOpt '
选择需要打印的表格
Case1
myrecordset1.MoveFirst
n=(BeginPage-1)*
(49-4 1)-1
myrecordset1.Moven
PageN=BeginPage
CallExcelDoForVB1
'数据填入Excel单元格并打印
Case2
……
……
EndSelect
Case1
SelectCaseOpt
'选择需要打印的表格
Case1
myrecordset1.MoveFirst
n=(BeginPage-1)*
(49-4 1)-1
myrecordset1.Moven
PageN=BeginPage
FornBtoE=BeginPageToEndPage
CallExcelDoForVB1
'填入Excel单元格并打印
PageN=PageN 1
NextnBtoE
Case2
……
……
EndSelect
EndSelect
EndIf
EndIf
FrmMain.Visible=True
ExitSub
errhandle:
FrmPrint.Visible=False
FrmMain.Visible=True
EndSub
----注意,下段仅通过ExcelDoForVB1()对"报表(一)"的处理,来说明数据填入Excel并打印的整个过程。
SubExcelDoForVB1() '打印报表(一)
FrmPrint.Visible=True
Setexsheet=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
FornRow=4To49
bar1.Value=nRow-4 '进度显示栏进程
myrecordset1.MoveNext
Ifmyrecordset1.EOFThen
nflag=0
ExitFor
EndIf
FornCol=1To21
exsheet.Cells(nRow,nCol)=
myrecordset1.Fields(nCol-1)
NextnCol
NextnRow
exsheet.Cells(52,21)="第" CStr(PageN) "页"
FrmPrint.Visible=False
bar1.Value=0
ActiveWindow.SelectedSheets.PrintOutCopies:=NumCopies
EndSub
----虽然本文针对的是大多数已熟练掌握数据库技术,且精通编程之道的朋友们。但笔者认为仍有必要提一提将数据输入Access的过程,因为编出来的软件更多是面向各类普通用户,对他们来说最要紧的是好用,而其间的一系列关联并不想深究。所以设计一个好的输入界面十分有必要,在设计时可以运用VB提供的Data控件,当然若是考虑性能的话还可以用代码直接操纵数据。关于如何使用Data控件访问数据库,在VisualBasic的联机手册(Onlinebook)中有很详细的说明,此处不再赘述。
----文中的所有程序在VisualBsaic5.0中文专业版及Office97中文版中调试通过。->
----由于笔者所在的公司员工众多,在进行职工养老保险缴费的计算工作时,若使用劳动局编制的软件(用Foxbase编写),无论是在管理或维护方面均显得力不从心。于是在公司领导的强烈要求下,决定由笔者构思重新编制。基本思路是:1.将所有员工资料输入Access进行处理,以便于维护。2.在Excel中预先制成有表头的空表(Access相对欠缺处理复杂表格的能力),对需要进行金额汇总或其他运算的单元格可直接输入公式。3.在VB中编写程序代码,从Access中提取数据填入Excel对应表格相应的单元格,并输出至打印机。
----部分窗体及源程序代码如下:
----1.程序主模块
----定义Excel、Access对象变量,显示系统启动画面,进入系统主程序界面。强调一下,在编写程序之前须加入对Excel及Access库函数的引用,具体操作是:选择菜单栏'工程'\'引用…',将'可使用的引用'列表框内'MicrosoftAccess8.0ObjectLibrary'和'MicrosoftExcel8.0ObjectLibrary'两项前的复选框标为选中,按"确定"返回。
mdsMain.bas
'定义数据库记录集及Excel对象变量
PublicexAsNewExcel.application
PublicexwbookAsExcel.Workbook
PublicexsheetAsExcel.Worksheet
PublicmydatabaseAsDatabase
Publicmyrecordset1AsRecordset
[定义记录集]
……
……
PublicOptAsInteger'报表选项
[Opt为frmSelreport.frm返回值]
PublicisYNAsBoolean
SubMain()
LoadfrmSplash
frmSplash.Show
frmSplash.Label2.Caption=
"系统正在加载Access数据库..."
Setmydatabase=OpenDatabase("c:\sbda\sbda.mdb")
Setmyrecordset1=mydatabase.OpenRecordset
("报表打印(一)")
[此处对记录集赋值]
……
……
frmSplash.Label2.Caption=
"系统正在加载Excel电子表格..."
Setex=CreateObject("excel.application")
Setexwbook=ex.Workbooks.Open("c:\sbda\sbda.xls")
LoadFrmInput '将数据输入窗体加载到内存中
UnloadfrmSplash
LoadFrmMain '将主程序界面加载到内存中
EndSub
----2.报表打印模块
----其中ExcelDoForVB1()是一子程序,由PRnProess()调用,作用是从Access中提取所需数据资料,填入Excel对应工作表(Worksheet)的相应单元格(Cells)中,然后打印已填入数据的表格;prnProess()则负责实现对VB通用对话框(CommomDialog)中打印功能的控制。
mdlPrint.bas
OptionExplicit
'定义循环计数变量
PublicnRowAsInteger,nColAs
Integer,nBtoEAsInteger
'定义变量接收打印对话框返回值
PublicBeginPage,EndPage,NumCopies
'程序运行时需进行判断的各种标志
Publicnflag,Flag,ifNum
'数据记录集中指针移动数
PublicPageNAsInteger,nAsInteger
'bar1为进度条
Publicbar1AsObject
SubprnProess()
'控制通用对话框打印功能
Setbar1=FrmPrint.PgsBar1 '进度条
OnErrorGoToerrhandle:
IfFlag=0Then '当打印对话框中选"全部"时
SelectCaSEOpt '选择需要打印的表格
Case1
nflag=1
myrecordset1.MoveFirst
myrecordset1.MovePrevious
PageN=1
DoWhilenflag=1
CallExcelDoForVB1
'数据填入Excel单元格打印
PageN=PageN 1
Loop
Case2
……
……
EndSelect
Else
IfFlag=2Then '
当打印对话框中选"页"时
IfEndPage-BeginPage=0Then
ifNum=0
Else
IfEndPage-BeginPage>0Then
ifNum=1
Else
ifNum=2
EndIf
EndIf
SelectCaseifNum
Case2
ExitSub
Case0
SelectCaseOpt '
选择需要打印的表格
Case1
myrecordset1.MoveFirst
n=(BeginPage-1)*
(49-4 1)-1
myrecordset1.Moven
PageN=BeginPage
CallExcelDoForVB1
'数据填入Excel单元格并打印
Case2
……
……
EndSelect
Case1
SelectCaseOpt
'选择需要打印的表格
Case1
myrecordset1.MoveFirst
n=(BeginPage-1)*
(49-4 1)-1
myrecordset1.Moven
PageN=BeginPage
FornBtoE=BeginPageToEndPage
CallExcelDoForVB1
'填入Excel单元格并打印
PageN=PageN 1
NextnBtoE
Case2
……
……
EndSelect
EndSelect
EndIf
EndIf
FrmMain.Visible=True
ExitSub
errhandle:
FrmPrint.Visible=False
FrmMain.Visible=True
EndSub
----注意,下段仅通过ExcelDoForVB1()对"报表(一)"的处理,来说明数据填入Excel并打印的整个过程。
SubExcelDoForVB1() '打印报表(一)
FrmPrint.Visible=True
Setexsheet=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
FornRow=4To49
bar1.Value=nRow-4 '进度显示栏进程
myrecordset1.MoveNext
Ifmyrecordset1.EOFThen
nflag=0
ExitFor
EndIf
FornCol=1To21
exsheet.Cells(nRow,nCol)=
myrecordset1.Fields(nCol-1)
NextnCol
NextnRow
exsheet.Cells(52,21)="第" CStr(PageN) "页"
FrmPrint.Visible=False
bar1.Value=0
ActiveWindow.SelectedSheets.PrintOutCopies:=NumCopies
EndSub
----虽然本文针对的是大多数已熟练掌握数据库技术,且精通编程之道的朋友们。但笔者认为仍有必要提一提将数据输入Access的过程,因为编出来的软件更多是面向各类普通用户,对他们来说最要紧的是好用,而其间的一系列关联并不想深究。所以设计一个好的输入界面十分有必要,在设计时可以运用VB提供的Data控件,当然若是考虑性能的话还可以用代码直接操纵数据。关于如何使用Data控件访问数据库,在VisualBasic的联机手册(Onlinebook)中有很详细的说明,此处不再赘述。
----文中的所有程序在VisualBsaic5.0中文专业版及Office97中文版中调试通过。->
更多精彩
赞助商链接