设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

Excel 97/VBA技术讲座之八

1970-1-1 08:00| 发布者: 首都经济贸易大学 赵| 查看: 3897| 评论: 0

三、封装应用系统

    通过以上介绍,了解了Visual Basic工程的基本概念,掌握了应用ActiveX控件的方法。以下通过实例说明封装一个应用系统的大致过程。
    该实例是一个虚拟的有关保险公司不同险种缴费的查询系统。保险公司有多个险种,不同的险种其缴费方法、缴费金额各不相同。例如递增养老保险,不同性别标准不同;相同性别开始领取年龄不同缴费标准也不同;同一领取年龄,还有趸交、十年限交、十五年限交…等不同付款方式,每次缴费额亦不同。所以相当复杂。该系统选定输入某个险种后,根据该险种的规则,指定其中若干项后,即可输出相应的缴费标准。
    为了使软件更吸引人,通常都采用生动的图形化界面,如有可能,还可以利用VBA的时钟控件创建动画效果。由于篇幅所限,该软件的主画面只是由一个图片和几个按钮组成。当打开该工作簿时,首先出现软件的主画面:
   
    该软件虽然是在Excel 97中创建的,但是从主画面看很像一个独立的应用系统。有自己的标题和自己的菜单栏。这需要用自定义的菜单栏、窗口和工具栏替换Excel 97的环境,并保证当退出时还原初始的Excel 97环境。下面将具体说明是如何完成它们的。
   

1. 菜单栏的替换

替换Excel 97的菜单栏是很容易的,只需创建一个新的菜单栏就会删除Excel 97的菜单栏。当需要恢复Excel 97的菜单栏时,只要删除新创建的菜单栏就可以了。该系统的自定义菜单中只需两个命令按钮,一个用来返回到系统的主画面(ReturnMAIN),另一个用来退出系统(ExitSYS)。下面是模块(Module)中有关的宏或是事件控制程序。
    Sub ZapMenu( )
        On Error Resume Next
        CommandBars(“保险查询系统”).Delete
    End Sub
    这是一个用来删除自定义菜单栏的宏。语句On Error Resume Next保证无论自定义菜单栏是否存在都能正确删除它。
    Sub ExitSYS( )
        ZapMenu
        ActiveWorkbook.Close SaveChanges := False
    End Sub
    这是用来退出系统的宏。它删除自定义菜单,并关闭活动的工作簿(不提示保存修改)。
    Sub ReturnMAIN( )
       Worksheets(“保险查询系统”).Select
    End Sub
    该宏用来返回主画面。它激活“保险查询系统”工作表。

    Sub SetMenu( )
        Dim myBar As CommandBar
        Dim myButton As CommandBarButton
        ZapMenu
        Set myBar = CommandBars.Add(Name:=“保险查询系统”, _
            Position :=msoBarTop, _
            MenuBar :=True)
        Set myButton = myBar.Controls.Add(msoControlButton)
        myButton.Style = msoButtonCaption
        myButton.Caption = “退出[&E]”
        myButton.OnAction = “ExitSYS”
        Set myButton = myBar.Controls.Add(msoControlButton)
        myButton.Style = msoButtonCaption
        myButton.Caption = “返回[&R]”
        myButton.OnAction = “ReturnMAIN”
        myButton.Visible = False
        myBar.Protection = msoBarNoMove + msoBarNoCustomize
        myBar.Visible = True
    End Sub

    这个宏包含五部分。第一部分定义了一对变量。第二部分首先运行ZapMenu宏,保证保险查询系统菜单栏是不存在的,然后创建它。参数MenuBar的值设为True,确保这个新创建的命令栏为一菜单栏。第三部分和第四部分将两个命令按钮加入到菜单栏中。并设置ReturnMAIN命令按钮的初始状态为不可见状态。最后一部分保护这个新创建的菜单栏,使用户不能移动也不能自定义新菜单栏。
   

2. 窗口的替换

    封装应用系统时为应用系统创建大小合适的窗口是很有必要的。但当关闭应用系统时,必须恢复被应用系统覆盖的窗口。恢复窗口比恢复Excel 97的菜单栏要困难,因为必须记忆被覆盖的窗口的大小。可以使用变量保存被覆盖的窗口的大小。但是应注意用关键字Dim声明的变量只有在程序运行时才存在,程序运行结束后,其中的值是不保存的。因此应使用关键字Static声明变量。保存和恢复窗口的程序如下:

    Sub SetWindow(State)
        Const MyWidth = 420
        Const MyHeight = 320
        Static myOldWidth
        Static myOldHeight
        Static myOldState
        If State = xlOn Then
            myOldWidth = Application.Width
            myOldHeight = Application.Height
            myOldState = Application.WindowState
            Application.WindowState = xln1g
            Application.Width = myWidth
            Application.Height = myHeight
            Application.Caption = “保险查询系统”
            Application.DisplayFormulaBar = False
            Application.DisplayStatusBar = False
            ActiveWindow.DisplayHorizontalScrollBar = False
            ActiveWindow.DisplayVerticalScrollBar = False
            ActiveWindow.DisplayWorkbookTabs = False
        Else
            Application.Caption = Empty
            Application.Width = myOldWidth
            Application.Height = myOldHeight
            Application.WindowState = myOldState
            Application.DisplayFormulaBar = True
            Application.DisplayStatusBar = True
            Application.DisplayFormulaBar = True
            Application.DisplayStatusBar = True
            ActiveWindow.DisplayHorizontalScrollBar = True
            ActiveWindow.DisplayVerticalScrollBar = True
            ActiveWindow.DisplayWorkbookTabs = True
        End If
    End Sub

    可以用“SetWindow xlOn”和“SetWindow xlOff”语句设置用户窗口和恢复Excel 97窗口。其中的xlOn、xlOff为Excel 97内置常量。注意其中的“l”是小写英文字母“l”,而不是数字“1”。
   

3. 工具栏的替换

    类似地还要移去Excel 97的工具栏,并在退出应用系统时恢复它。但是工具栏的保存和恢复较窗口复杂,窗口只要三个变量保存高度,宽度,状态就可以了。而工具栏则可能是一个系列,数目不定,有时可能还有不知名称的自定义工具栏。为此可以使用自定义集合(它是Visual Basic的十分有用的工具)来处理。有关的宏如下:

    Sub SetBars(State)
        Static myOldBars As New Collection
        Dim myBar
        If State = xlOn Then
            For Each myBar In Application.CommandBars
                If myBar.Type <> 1 And myBar.Visible Then
                    myOldBars.Add myBar
                    myBar.Visible = False
                End If
            Next myBar
        Else
            For Each myBar In myOldBars
                myBar.Visible = True
            Next myBar
        End If
    End Sub

    将下述语句添加到ExitSYS宏中:

    SetWindow xlOff
    Set Bars xlOff

    以保证当单击“退出”按钮时,能恢复Excel 97的原来的环境。
   

4. 完成封装

    应用系统中所有的宏和事件控制程序完成后,还需要使它们在打开工作簿时能自动连接为一个整体。完成各自的功能。故最后在Workbook对象中插入下述程序:

    Private Sub WorkBook_Open( )
        SetMenu
        SetWindow xlOn
        SetBars xlOn
    End Sub
    Private Sub WorkBook_BeforeClose(Cancel As Boolean)
        ZapMenu
    SetWindow xlOff
        SetBars xlOff
   

        ActiveWorkbook.Saved = True

End Sub

    前者使得每次打开该工作簿,都能保证显示系统的主画面以及相应的菜单。后者则使得每次关闭工作簿时(防止用户不通过“退出”按钮,而直接通过窗口的关闭按钮关闭工作簿),能删除用户的自定义菜单,恢复Excel 97的环境。设置活动工作簿的Saved属性值为True,使Excel认为所有的修改均已存盘,不显示提示存盘信息。

    到此为止,应用系统已经封装完成了,它虽然简单,但仍不失为一个封装良好、具有一定功能的系统。
    通过本讲座的学习,读者不难看出,掌握VBA宏语言,对于更好地应用Excel 97具有十分重要的意义。不仅可以使工作更高效,更方便,而且可以更加自动化,甚至智能化。即使是非计算机专业的人员,也可以利用Excel 97/VBA,方便、快捷地开发出结合自己专业的高水平应用软件。而计算机专业人员开发一些应用于特定领域的系统,也不必非要使用专业的程序开发工具,而可以在Excel 97等软件基础上,利用相应软件的强大功能,再配合有关的宏语言,可以快速、高效的开发出相应的应用软件。(完)

最新评论

相关分类

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-27 22:54 , Processed in 0.066038 second(s), 16 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回顶部