分享

VBA常用代码解析(第二十讲)

 wdmexcel 2015-09-04

 

080 在菜单栏指定位置添加菜单

除了可以在工作表菜单中添加菜单项外,还可以在工作表菜单栏的指定位置添加菜单,如下面的代码所示。

Sub AddNewMenu()

DimHelpMenu As CommandBarControl

DimNewMenu As CommandBarPopup

WithApplication.CommandBars('Worksheet menu bar')

.Reset

Set HelpMenu = .FindControl(ID:=.Controls('帮助(&H)').ID)

If HelpMenu Is Nothing Then

Set NewMenu = .Controls.Add(Type:=msoControlPopup)

Else

Set NewMenu = .Controls.Add(Type:=msoControlPopup_

Before:=HelpMenu.Index)

End If

With NewMenu

.Caption = '统计(&S)'

With .Controls.Add(Type:=msoControlButton)

.Caption = '输入数据(&D)'

.FaceId = 162

.OnAction = ““

End With

With .Controls.Add(Type:=msoControlButton)

.Caption = '汇总数据(&T)'

.FaceId = 590

.OnAction = ““

End With

End With

EndWith

SetHelpMenu = Nothing

SetNewMenu = Nothing

End Sub

代码解析:

AddNewMenu过程使用Add方法在工作表“帮助”菜单前添加一个标题为“统计”的菜单和两个菜单项。

6行代码,使用FindControl方法在工作表菜单栏中查找“帮助”菜单。应用于CommandBars对象的FindControl方法返回一个符合指定条件的CommandBarControl对象。语法如下:

expression.FindControl(TypeIdTagVisibleRecursive)

参数expression是必需的,返回一个CommandBars对象。

参数Type是可选的,要查找控件的类型。

参数Id是可选的,要查找控件的标识符。

参数Tag是可选的,要查找控件的标记值。

参数Visible是可选,如果该值为True,那么只查找屏幕上显示的命令栏控件。默认值为False

参数Recursive是可选的,如果该值为True,那么将在命令栏及其全部弹出式子工具栏中查找。此参数仅应用于CommandBar对象。默认值为False

如果没有控件符合搜索条件,那么FindControl方法返回Nothing

7行到第12行代码,如果工作表菜单栏中存在“帮助”菜单,将“统计”菜单添加到“帮助”菜单之前,否则添加到工作表菜单栏末尾。

12行到第25行代码,在“统计”菜单中添加两个子菜单并设置其各种属性。运行AddNewMenu过程,将在工作表菜单栏的“帮助”菜单之前添加一个“统计”菜单。

081 屏蔽和删除工作表菜单

如果不希望用户使用工作表菜单栏的部分功能,可以把菜单或菜单项屏蔽或删除,如下面的代码所示。

Sub Shibar()

WithApplication.CommandBars('Worksheet menu bar')

.Reset

.Controls('工具(&T)').Controls('(&M)').Enabled = False

.Controls('数据(&D)').Delete

EndWith

End Sub

代码解析:

Shibar过程屏蔽“工具”菜单中的“宏”菜单项,删除菜单栏中的“数据”菜单。

3行代码,使用Reset方法重置工作表菜单栏。

4行代码,将“宏”菜单项的Enabled属性设置为False,使之无效。

Enabled属性决定命令栏或命令栏控件是否激活,如果将该属性设置为 False,那么该菜单项将无效。

5行代码,使用Delete方法将“数据”菜单从工作表菜单栏中删除。

Delete方法应用于命令栏或命令栏控件时,从集合中删除指定对象,语法如下:

expression.Delete(Temporary)

参数expression是必需的,返回命令栏或命令栏控件对象之一。

参数Temporary是可选的,设置为True将从当前会话中删除控件,应用程序在下次会话时将再次显示控件。

运行Shibar过程,将屏蔽工作表“工具”菜单中的“宏”菜单项和删除工作表菜单栏中的“数据”菜单。

082 改变系统菜单的操作

利用VBA甚至可以改变系统菜单的默认操作,使之达到自定义菜单的效果,如下面的代码所示。

Dim WithEvents Saveas As CommandBarButton

Private Sub Workbook_Open()

SetSaveas = Application.CommandBars('File').Controls('另存为(&A)...')

End Sub

Private Sub Saveas_Click(ByVal Ctrl As Office.CommandBarButtonCancelDefault As Boolean)

CancelDefault= True

MsgBox'本工作簿禁止另存!'

End Sub

代码解析:

1行代码,在模块级别中使用关键词WithEvents声明变量Saveas是用来响应由CommandBarButton对象触发事件的对象变量。

2行到第4代码工作簿的Open事件过程,在工作簿打开时将变量Saveas赋值为系统菜单的“另存为”菜单。

因为在声明变量Saveas时使用了关键词WithEvents,不能同时使用New关键词隐式地创建对象,所以在使用变量Saveas之前,必须使用Set语句将变量赋值为一个已有对象。

5行到第8代码变量Saveas的单击事件过程,改变系统菜单“另存为”的默认操作。

变量SaveasClick事件在用户单击系统菜单“另存为”时发生,语法如下:

Private Sub CommandBarButton_Click(ByValCtrl As CommandBarButton

ByVal CancelDefaultAs Boolean)

参数Ctrl是必需的,指示初始化该事件的CommandBarButton控件。

参数CancelDefault是必需的,Boolean类型,如果执行了与CommandBarButton控件关联的默认操作,该值为False。除非其他过程或加载项取消了此操作。

67行代码,将CancelDefault参数设置为True,使单击“另存为”菜单时并不执行默认操作而只显示一个消息框。

将工作簿保存、关闭后,重新打开,单击“另存为”菜单并不执行默认操作,只显示一个消息框。


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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多