Excel 97/VBA技术讲座之八
三、封装应用系统
通过以上介绍,了解了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等软件基础上,利用相应软件的强大功能,再配合有关的宏语言,可以快速、高效的开发出相应的应用软件。(完)
(责任编辑:admin)