看看这篇文章,也许对你有用。Excel、Access、VB的结合应用
江苏省南通市学田新村
杨伟民
---- 微软公司的Office系列办公软件相信已是众所周知,其中Excel强大的统计制
表功
能、Access功能完备的数据处理能力深受众多用户所喜爱。Visual Bsaic更是微软
公司
又一有力的产品,它简单易学,在Windows编程中的应用十分广泛。本文通过介绍
数据处
理及复杂表格的打印,来讨论VB与Excel及Access的结合运用。
---- 由于笔者所在的公司员工众多,在进行职工养老保险缴费的计算工作时,若
使用劳
动局编制的软件(用Foxbase编写),无论是在管理或维护方面均显得力不从心。
于是在
公司领导的强烈要求下,决定由笔者构思重新编制。基本思路是:1.将所有员工资
料输
入Access进行处理,以便于维护。2.在Excel中预先制成有表头的空表(Access相
对欠缺
处理复杂表格的能力),对需要进行金额汇总或其他运算的单元格可直接输入公式
。3.
在VB中编写程序代码,从Access中提取数据填入Excel对应表格相应的单元格,并
输出至
打印机。
---- 部分窗体及源程序代码如下:
---- 1.程序主模块
---- 定义Excel、Access对象变量,显示系统启动画面,进入系统主程序界面。强
调一
下,在编写程序之前须加入对Excel及Access库函数的引用,具体操作是:选择菜
单栏'
工程'\'引用…',将'可使用的引用'列表框内'Microsoft Access 8.0 Object
Library
工程'\'引用…',将'可使用的引用'列表框内'Microsoft Access 8.0 Object
Library
'和 'Microsoft Excel 8.0 Object Library'两项前的复选框标为选中,按"确定
"返回
。
mdsMain.bas
mdsMain.bas
'定义数据库记录集及Excel对象变量
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 '报表选项
[Opt为frmSelreport.frm返回值]
Public isYN As Boolean
Sub Main()
Load frmSplash
frmSplash.Show frmSplash.Label2.Caption =
" 系统正在加载Access数据库..."
Set mydatabase = OpenDatabase("c:\sbda\sbda.mdb")
Set myrecordset1 = mydatabase.OpenRecordset
Set myrecordset1 = mydatabase.OpenRecordset
("报表打印(一)")
[此处对记录集赋值]
……
……
frmSplash.Label2.Caption =
" 系统正在加载Excel电子表格..."
Set ex = CreateObject("excel.application")
Set exwbook = ex.Workbooks.Open("c:\sbda\sbda.xls")
Load FrmInput '将数据输入窗体加载到内存中
Unload frmSplash
Load FrmMain '将主程序界面加载到内存中
End Sub
---- 2.报表打印模块
---- 其中ExcelDoForVB1()是一子程序,由prnProess()调用,作用是从Access中
提取所
需数据资料,填入Excel对应工作表(Worksheet)的相应单元格(Cells)中,然
后打印
已填入数据的表格;prnProess()则负责实现对VB通用对话框(Commom Dialog)中
打印
功能的控制。
mdlPrint.bas
Option Explicit
'定义循环计数变量
Public nRow As Integer, nCol As
Integer, nBtoE As Integer
Integer, nBtoE As Integer
'定义变量接收打印对话框返回值
Public BeginPage, EndPage, NumCopies
'程序运行时需进行判断的各种标志
Public nflag, Flag, ifNum
'数据记录集中指针移动数
Public PageN As Integer, n As Integer
'bar1为进度条
Public bar1 As Object
Sub prnProess()
'控制通用对话框打印功能
Set bar1 = FrmPrint.PgsBar1 '进度条
On Error GoTo errhandle:
If Flag = 0 Then '当打印对话框中选"全部"时
Select Case Opt '选择需要打印的表格
Case 1
nflag = 1
myrecordset1.MoveFirst
myrecordset1.MovePrevious
PageN = 1
PageN = 1
Do While nflag = 1
Call ExcelDoForVB1
'数据填入Excel单元格打印
'数据填入Excel单元格打印
PageN = PageN + 1
Loop
Case 2
……
……
End Select
Else
If Flag = 2 Then '
当打印对话框中选"页"时
If EndPage - BeginPage = 0 Then
ifNum = 0
Else
If EndPage - BeginPage > 0 Then
ifNum = 1
Else
ifNum = 2
End If
End If
End If
Select Case ifNum
Case 2
Exit Sub Case 0
Case 0
Select Case Opt '
选择需要打印的表格
Case 1
myrecordset1.MoveFirst
n = (BeginPage - 1) *
(49 - 4 + 1) - 1
myrecordset1.Move n
PageN = BeginPage
Call ExcelDoForVB1
'数据填入Excel单元格并打印
Case 2
……
……
End Select
Case 1
Select Case Opt
'选择需要打印的表格
Case 1
myrecordset1.MoveFirst
n = (BeginPage - 1) *
(49 - 4 + 1) - 1
myrecordset1.Move n
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()对"报表(一)"的处理,来说明数据填入
Exce
l并打印的整个过程。
Sub ExcelDoForVB1() '打印报表(一)
Sub ExcelDoForVB1() '打印报表(一)
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 '进度显示栏进程
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
Next nRow
bar1.Value = 0
ActiveWindow.SelectedSheets.PrintOut Copies:=NumCopies
End Sub
江苏省南通市学田新村
杨伟民
---- 微软公司的Office系列办公软件相信已是众所周知,其中Excel强大的统计制
表功
能、Access功能完备的数据处理能力深受众多用户所喜爱。Visual Bsaic更是微软
公司
又一有力的产品,它简单易学,在Windows编程中的应用十分广泛。本文通过介绍
数据处
理及复杂表格的打印,来讨论VB与Excel及Access的结合运用。
---- 由于笔者所在的公司员工众多,在进行职工养老保险缴费的计算工作时,若
使用劳
动局编制的软件(用Foxbase编写),无论是在管理或维护方面均显得力不从心。
于是在
公司领导的强烈要求下,决定由笔者构思重新编制。基本思路是:1.将所有员工资
料输
入Access进行处理,以便于维护。2.在Excel中预先制成有表头的空表(Access相
对欠缺
处理复杂表格的能力),对需要进行金额汇总或其他运算的单元格可直接输入公式
。3.
在VB中编写程序代码,从Access中提取数据填入Excel对应表格相应的单元格,并
输出至
打印机。
---- 部分窗体及源程序代码如下:
---- 1.程序主模块
---- 定义Excel、Access对象变量,显示系统启动画面,进入系统主程序界面。强
调一
下,在编写程序之前须加入对Excel及Access库函数的引用,具体操作是:选择菜
单栏'
工程'\'引用…',将'可使用的引用'列表框内'Microsoft Access 8.0 Object
Library
工程'\'引用…',将'可使用的引用'列表框内'Microsoft Access 8.0 Object
Library
'和 'Microsoft Excel 8.0 Object Library'两项前的复选框标为选中,按"确定
"返回
。
mdsMain.bas
mdsMain.bas
'定义数据库记录集及Excel对象变量
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 '报表选项
[Opt为frmSelreport.frm返回值]
Public isYN As Boolean
Sub Main()
Load frmSplash
frmSplash.Show frmSplash.Label2.Caption =
" 系统正在加载Access数据库..."
Set mydatabase = OpenDatabase("c:\sbda\sbda.mdb")
Set myrecordset1 = mydatabase.OpenRecordset
Set myrecordset1 = mydatabase.OpenRecordset
("报表打印(一)")
[此处对记录集赋值]
……
……
frmSplash.Label2.Caption =
" 系统正在加载Excel电子表格..."
Set ex = CreateObject("excel.application")
Set exwbook = ex.Workbooks.Open("c:\sbda\sbda.xls")
Load FrmInput '将数据输入窗体加载到内存中
Unload frmSplash
Load FrmMain '将主程序界面加载到内存中
End Sub
---- 2.报表打印模块
---- 其中ExcelDoForVB1()是一子程序,由prnProess()调用,作用是从Access中
提取所
需数据资料,填入Excel对应工作表(Worksheet)的相应单元格(Cells)中,然
后打印
已填入数据的表格;prnProess()则负责实现对VB通用对话框(Commom Dialog)中
打印
功能的控制。
mdlPrint.bas
Option Explicit
'定义循环计数变量
Public nRow As Integer, nCol As
Integer, nBtoE As Integer
Integer, nBtoE As Integer
'定义变量接收打印对话框返回值
Public BeginPage, EndPage, NumCopies
'程序运行时需进行判断的各种标志
Public nflag, Flag, ifNum
'数据记录集中指针移动数
Public PageN As Integer, n As Integer
'bar1为进度条
Public bar1 As Object
Sub prnProess()
'控制通用对话框打印功能
Set bar1 = FrmPrint.PgsBar1 '进度条
On Error GoTo errhandle:
If Flag = 0 Then '当打印对话框中选"全部"时
Select Case Opt '选择需要打印的表格
Case 1
nflag = 1
myrecordset1.MoveFirst
myrecordset1.MovePrevious
PageN = 1
PageN = 1
Do While nflag = 1
Call ExcelDoForVB1
'数据填入Excel单元格打印
'数据填入Excel单元格打印
PageN = PageN + 1
Loop
Case 2
……
……
End Select
Else
If Flag = 2 Then '
当打印对话框中选"页"时
If EndPage - BeginPage = 0 Then
ifNum = 0
Else
If EndPage - BeginPage > 0 Then
ifNum = 1
Else
ifNum = 2
End If
End If
End If
Select Case ifNum
Case 2
Exit Sub Case 0
Case 0
Select Case Opt '
选择需要打印的表格
Case 1
myrecordset1.MoveFirst
n = (BeginPage - 1) *
(49 - 4 + 1) - 1
myrecordset1.Move n
PageN = BeginPage
Call ExcelDoForVB1
'数据填入Excel单元格并打印
Case 2
……
……
End Select
Case 1
Select Case Opt
'选择需要打印的表格
Case 1
myrecordset1.MoveFirst
n = (BeginPage - 1) *
(49 - 4 + 1) - 1
myrecordset1.Move n
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()对"报表(一)"的处理,来说明数据填入
Exce
l并打印的整个过程。
Sub ExcelDoForVB1() '打印报表(一)
Sub ExcelDoForVB1() '打印报表(一)
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 '进度显示栏进程
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
Next nRow
bar1.Value = 0
ActiveWindow.SelectedSheets.PrintOut Copies:=NumCopies
End Sub
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货