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,使单击“另存为”菜单时并不执行默认操作而只显示一个消息框。 将工作簿保存、关闭后,重新打开,单击“另存为”菜单并不执行默认操作,只显示一个消息框。 |
|
来自: wdmexcel > 《Excel Vba》