从零开始,步入Word宏编程的世界(第七讲)
实例七:自定义Word的命令栏
知识点:
1、菜单栏与工具栏知识基础;
2、“运行时”修改菜单栏与工具栏。
Office组件中的每一个程序,都有菜单栏和工具栏,而且任何Office程序中的菜单栏与工具栏在VBA中的对像都是“ComandBar”对像。所以,本实例可以用于所有Office程序。
很多朋友在学习VBA的过程中,感到“自定义命令栏”这部份内容难以掌握,原因就在于没有弄清“ComandBar”对像结构的层次性。好了,下面让我们静下心来,开始——
一、“ComandBars”对像与“ComandBar”对像
“ComandBar”对像就是“命令栏”对像,在Application(程序)中无论是菜单栏还是工具栏,都是一个“ComandBar”对像。我们在编程时,对菜单栏与工具栏的修改,都是通过操作“ComandBar”对像来实现的。举一个实例,比如从“文件”菜单到“帮助”菜单为止的那个命令栏,按住“文件”菜单左边有一个竖线的地方,就可以把这个命令栏拖离原位置。这个“命令栏”就是一个“ComandBar”对像。现在我们已经知道什么是命令栏“ComandBar”对像了,那什么是“ComandBars”对像呢?既然尾巴上有字母“s”,“ComandBars”对像肯定就是所有命令栏的集合了!
(一)CommandBars对像的Add方法
Add方法,用于创建一个新的命令栏(这个命令栏既可以是菜单栏,也可以是工具栏。)。
本方法的格式为:对像.Add(“新命令栏的名称Name”,“新命令栏所在的位置Position”,“新命令的作用时期Temporary”)。
参数解释:
Position参数有六个常数:“msoBarLeft,msoBarTop,msoBarRight,msoBarBottom”这四个常数指定新命令栏左右和上下的坐标;“msoBarFloating”
表明新命令栏是可移动的;“msoBarPopup” 表明新命令栏是一个快捷菜单。
Temporary:如果Temporary=True,则新命令栏会在程序关闭时,同时被删除(也就是说,该命令栏只是暂时有效);如果Temporary=False,则不会被删除(Office程序默认为False。)另外,Office组件中的Word与Outlook
会忽略此参数,因此在退出Word或Outlook应用程序之前,您必须手工删除所有临时添加到CommandBars集合中的ComandBar对像。
以下实例创建了一个名叫“新工具栏”的命令栏。
’’’=========创建一个命令栏===========
Sub 创建一个命令栏()
CommandBars.Add(Name:="新工具栏",Position:=msoBarTop,Temporary:=True).Visible
= True
End Sub
代码中的“Visible = True”表示将创建的工具栏显示出来,如果“Visible =
False”则会创建一个隐藏的工具栏(“Visible”是很多对像的属性。)。“Position:=msoBarTop”则表示新建的命令栏居于程序的顶部。如图7-1。
(二)在CommandBars对像中引用CommandBar对像
在CommandBars对像中引用CommandBar对像常用的方法有两种。
第一种:我们在针对某一个菜单项进行操作时,可以直接引用这个菜单项的名称来调用它。如:CommandBars("View")对应“视图”菜单、CommandBars(“Text”)对应右键弹出菜单等等。请看实例——
’’’’=======使视图菜单失效========
sub 使视图菜单失效 ()
CommandBars("View"). Enabled = False
End sub
Enabled属性是很多对像的属性,它的作用是决定对像在应用程序中的状态。本实例中,如果属性值为True,那么激活指定的命令栏或命令栏控件;如果属性值为False,则该命令栏控件将失效。运行本代码查看效果之后,可将Enabled
的值改为True,再次运行,将视图菜单恢复过来。使视图菜单失效的效果如图7-3。
第二种:我们在对许多菜单项进行操作时,如果像前例那样一个一个写出名称的话会很麻烦,所以可以使用菜单所对应的ID号来调用它。请看实例——
本实例隐藏程序中ID号在前80位的命令栏。
’’’’’’’’’’’’===========隐藏命令栏==========
Sub 隐藏命令栏()
Dim a, b
b = 80 '定义最后的ID值
a = 1 '定义初始ID值
Do '进行循环
a = a + 1 '累加ID值
Application.CommandBars(a).Enabled =
True ' 隐藏ID值对应的命令栏
If a = b Then '在a=80时,准备退出循环
Exit Do
Else
End If
Loop '继续循环
本程序应该不难理解,其实这个用这个方法隐藏命令栏是很傻的,特别是在不知道哪个命令栏对应哪个ID号的时候,用For
Next循环是更好的选择(关于“For Next循环”的知识可在帮助文件中找到。)。
二、“CommandBarControl ”对象与“CommandBarControls” 对像
“CommandBarControl 对象”代表命令栏中的命令按钮,“CommandBarControls
集合”则是单个命令栏中所有命令按钮的集合。用CommandBar对像的 “Controls” 属性可返回
CommandBarControls 集合”,格式是“命令栏名·Controls属性 =
该命令栏的CommandBarControls 集合”。
“CommandBarControls”集合对像包含了一个菜单栏或工具栏中所有的命令按钮。根据命令按钮的不同特点,它们又可以具体分为——
按钮对像(CommandBarButton),表示命令栏是的一个上的命令按钮。
弹出式控件(CommandBarPopup 对象),该对像又可以返回一个CommandBar对像。
组合框控件(CommandBarComboBox),该对像代表命令栏中的一个组合框。
下面的实例,用“CommandBarControls对像”的Add方法,在菜单栏上添加了一个子菜单。
Sub 添加子菜单()
Dim Zicaidan
Set Zicaidan =
Application.CommandBars(36).Controls.Add(msoControlPopup, , , ,
True)
Zicaidan.Caption = "添加的菜单"
End Sub
代码中的“Application.CommandBars(36)”是利用ID号找到“文件”菜单所在的CommandBar命令栏(该命令栏所对应的ID值为“36”,关于怎样找到各命令栏对应的ID号,下文有述。);“Caption”属性,是定义“CommandBarControl”对像的文字标签。
以上实例既然已添加了子菜单,又应该怎样为子菜单添加命令按钮呢?
以下实例在运行时添加菜单,并为菜单添加两个按钮,一个是“CommandBarButton”命令按钮;一个是“CommandBarPopup”
弹出式控件,然后又为“CommandBarPopup” 弹出式控件再添加一个按钮。
修改上述代码为:
Sub 添加菜单与子按钮()
Dim ZCD
Dim ZA
Dim ZAA
Dim FCD
Set ZCD =
Application.CommandBars(36).Controls.Add(msoControlPopup, , , ,
True)
ZCD.Caption = "添加的菜单"
Set ZA = ZCD.Controls.Add(msoControlButton, 1, , , True)
ZA.Caption = "这是命令按钮"
Set ZAA = ZCD.Controls.Add(msoControlPopup, 1, , , True)
ZAA.Caption = "这是弹出按钮"
Set FCD = ZAA.Controls.Add(msoControlButton, 1, , , True)
FCD.Caption = "分按钮"
End Sub
运行效果如何?以上我们做的工作就是“运行时”修改命令栏。那么,如何为我们所自定义的命令按钮指定运行的命令呢?这就要用到按钮的“OnAction”属性。再次修改上述程序,请注意,这次我们修改后的程序是由两段代码组成的——
''''=======程序的主体部份======
Sub 命令按钮的使用()
Dim ZCD
Dim ZA
Dim ZAA
Dim FCD
Set ZCD =
Application.CommandBars(36).Controls.Add(msoControlPopup, , , ,
True)
ZCD.Caption = "添加的菜单"
Set ZA = ZCD.Controls.Add(msoControlButton, 1, , , True)
ZA.Caption = "这是命令按钮"
ZA.OnAction = "删除菜单"’调用下面的“删除菜单”过程
Set ZAA = ZCD.Controls.Add(msoControlPopup, 1, , , True)
ZAA.Caption = "这是弹出按钮"
Set FCD = ZAA.Controls.Add(msoControlButton, 1, , , True)
FCD.Caption = "分按钮"
FCD.OnAction = "删除菜单"’调用下面的“删除菜单”过程
End Sub
''''=======下面是要调用的程序======
Sub 删除菜单()
Application.CommandBars(36).Controls("添加的菜单").Delete
End Sub
第二段代码中的“Delete”语句是CommandBarControls对像的一个方法,它的作用就是删除对像。请看图7-1。
到此为止,我们就已经学习了关于“运行时”自定义菜单的基本知识,具体的运用,还要朋友们在实际工作中多多体验。
本实例的知识扩展:
1、关于代码保存的地方——
我们从VBA的“工程资源管理器”中可以看到,无论您什么时候打开文档,都会有一个叫“Normal.dot”的模版存在,它就是Word的全局模版。如果没有必要,我们就应该尽量把代码保存到文档自身当中,而不要保存到Normal模版中。如何在文档与模版间进行代码的交换呢?您可以通过“工具”——>“宏”——>“宏名”——>“管理器”对话框进行控制。
2、当Normal模版中的命令栏被修改之后,有时需要我们将它恢复到程序“原始”时的状态,该怎么办呢?当然,学习到现在,您应该已能使用代码来实现,但更快捷的方法是——在Win98中,您只需进入“C:\Windows\Application
Data\Microsoft\Templates”中删除模版即可;在win2000中,相应的地址为“C:\Documents and
Settings\用户名\Application
Data\Microsoft\Templates”中。这个删除模版的方法也可以用来对付一些Word的宏病毒(因为宏病毒的代码一般都放在全局模版当中。)。
3、以下附一段实用程序,该程序用于找出所有命令栏的ID号并同时找出各命令按钮在命令栏中的ID号。本段代码使用了For循环,For循环是VBA编程中一个用处非常广泛的语句,本语句就算是我们的一个自学内容吧?同时也可以试一试自己是否已掌握了使用VBA帮助文件的方法。
Sub 枚举菜单及按钮()
For i = 1 To CommandBars.Count
Selection.TypeText i & " : " & CommandBars(i).Name
Selection.TypeParagraph
For a = 1
To CommandBars(i).Controls.Count
Selection.TypeText " " & a & " : " &
CommandBars(i).Controls(a).Caption
Selection.TypeParagraph
Next
Next
End Sub
运行本段程序,Word那一千多个内置命令使您惊叹了吧?微软说,普通办公用不到这些命令的百分之十,您用到了这些按钮中的百分之几了呢?
本实例的知识扩展:能不能利用自定义的按钮运行系统程序呢?比如,自定义一个按钮,运行系统的“记事本”程序或“IE浏览器”?自己试试吧。
“自定义命令栏”,作为VBA编程学习中最重要的一环,到此结束。是否囊中有沉甸甸的感觉?如果觉得对本实例的内容还不是很清楚的话,就再多把实例体会体会吧。
|