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(Type,Id,Tag,Visible,Recursive)
参数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.CommandBarButton,CancelDefault As Boolean)
CancelDefault= True
MsgBox'本工作簿禁止另存!'
End Sub
代码解析:
第1行代码,在模块级别中使用关键词WithEvents声明变量Saveas是用来响应由CommandBarButton对象触发事件的对象变量。
第2行到第4代码工作簿的Open事件过程,在工作簿打开时将变量Saveas赋值为系统菜单的“另存为”菜单。
因为在声明变量Saveas时使用了关键词WithEvents,不能同时使用New关键词隐式地创建对象,所以在使用变量Saveas之前,必须使用Set语句将变量赋值为一个已有对象。
第5行到第8代码变量Saveas的单击事件过程,改变系统菜单“另存为”的默认操作。
变量Saveas的Click事件在用户单击系统菜单“另存为”时发生,语法如下:
Private Sub CommandBarButton_Click(ByValCtrl As CommandBarButton,
ByVal CancelDefaultAs Boolean)
参数Ctrl是必需的,指示初始化该事件的CommandBarButton控件。
参数CancelDefault是必需的,Boolean类型,如果执行了与CommandBarButton控件关联的默认操作,该值为False。除非其他过程或加载项取消了此操作。
第6、7行代码,将CancelDefault参数设置为True,使单击“另存为”菜单时并不执行默认操作而只显示一个消息框。
将工作簿保存、关闭后,重新打开,单击“另存为”菜单并不执行默认操作,只显示一个消息框。
联系客服