分享

从零开始,步入Word宏编程的世界(第七讲)

 hdzgx 2017-12-01

从零开始,步入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。

 从零开始,步入Word宏编程的世界(第七讲)

(二)在CommandBars对像中引用CommandBar对像

 

在CommandBars对像中引用CommandBar对像常用的方法有两种。

第一种:我们在针对某一个菜单项进行操作时,可以直接引用这个菜单项的名称来调用它。如:CommandBars("View")对应“视图”菜单、CommandBars(“Text”)对应右键弹出菜单等等。请看实例——

’’’’=======使视图菜单失效========

sub 使视图菜单失效 ()

CommandBars("View"). Enabled = False

End sub

Enabled属性是很多对像的属性,它的作用是决定对像在应用程序中的状态。本实例中,如果属性值为True,那么激活指定的命令栏或命令栏控件;如果属性值为False,则该命令栏控件将失效。运行本代码查看效果之后,可将Enabled 的值改为True,再次运行,将视图菜单恢复过来。使视图菜单失效的效果如图7-3。

 

从零开始,步入Word宏编程的世界(第七讲)

第二种:我们在对许多菜单项进行操作时,如果像前例那样一个一个写出名称的话会很麻烦,所以可以使用菜单所对应的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”对像的文字标签。

 从零开始,步入Word宏编程的世界(第七讲)

 

以上实例既然已添加了子菜单,又应该怎样为子菜单添加命令按钮呢?

以下实例在运行时添加菜单,并为菜单添加两个按钮,一个是“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。

从零开始,步入Word宏编程的世界(第七讲)
到此为止,我们就已经学习了关于“运行时”自定义菜单的基本知识,具体的运用,还要朋友们在实际工作中多多体验。

 

本实例的知识扩展:

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编程学习中最重要的一环,到此结束。是否囊中有沉甸甸的感觉?如果觉得对本实例的内容还不是很清楚的话,就再多把实例体会体会吧。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多