VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - Excel、Access、VB的结合应用
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:11583, 日期:2001-06-24
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 Excel 8.0 Object Library注释:两项前的复选框标为选中,按"确定"返回。

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
("报表打印(一)")
[此处对记录集赋值]
  ……
  ……
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
注释:定义变量接收打印对话框返回值
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
        Do While nflag = 1
          Call ExcelDoForVB1 
注释:数据填入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
      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
 注释:数据填入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()对"报表(一)"的处理,来说明数据填入Excel并打印的整个过程。

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
  bar1.Value = 0
ActiveWindow.SelectedSheets.PrintOut Copies:=NumCopies
End Sub

---- 虽然本文针对的是大多数已熟练掌握数据库技术,且精通编程之道的朋友们。但笔者认为仍有必要提一提将数据输入Access的过程,因为编出来的软件更多是面向各类普通用户,对他们来说最要紧的是好用,而其间的一系列关联并不想深究。所以设计一个好的输入界面十分有必要,在设计时可以运用VB提供的Data控件,当然若是考虑性能的话还可以用代码直接操纵数据。关于如何使用Data控件访问数据库,在Visual Basic的联机手册(Online book)中有很详细的说明,此处不再赘述。
---- 文中的所有程序在Visual Bsaic5.0中文专业版及Office97中文版中调试通过。