CommandBar & Ribbon
在EXCEL2007以前,Excel 的按钮都是CommandBar,但从2007开始微软开始采用 Ribbon (功能区),但CommandBar没有全部取消,还有一部分继续存在。
列示菜单工具栏 Sub 列示菜单工具栏() Dim x As Integer For x = 1 To Application.CommandBars.Count Cells(x, 1).Value = x Cells(x, 2).Value = Application.CommandBars(x).Name Cells(x, 3).Value = Application.CommandBars(x).NameLocal Next x End Sub
在EXCEL2007以后继续可以用的工具条主要是两个方面:
1. 单元格区域右键菜单:
Sub AddCellsMenu() '为单元格区域添加右键菜单 Dim CellMenu As Office.CommandBarButton Set CellMenu = Application.CommandBars("Cell").Controls.Add(Type:=msoControlButton, Before:=1, Temporary:=True) With CellMenu .Caption = "大黑山" .FaceId = 620 '显示对应ID的图标 .OnAction = "CellsMenuClick" '指定该按菜单点击后执行的宏名称 End With End Sub Sub CellsMenuClick() MsgBox "单元格右键菜单" End Sub
2、工作表标签添加右键菜单
Sub AddSheetMenu() '为工作表标签添加右键菜单 Dim CellMenu As Office.CommandBarButton Set CellMenu = Application.CommandBars("Ply").Controls.Add(Type:=msoControlButton, Before:=1, Temporary:=True) With CellMenu .Caption = "大黑山" '标题 .FaceId = 17 '显示对应ID的图标 .OnAction = "SheetsMenuClick" '这个是关键,就是这个按钮按下去是执行的宏的名称 End With End Sub Sub SheetsMenuClick() MsgBox "工作表标签右键菜单" End Sub
以上两段代码是几乎一样的,唯一的区别:一个是Cell,一个是Ply。
手工为文档添加功能区:
Office2007及以后,界面全部改变了,叫做功能区(Ribbon),没有提供Com接口,全部需要写XML。
Step1:新建一个名为CustomUI的 文件夹
Step2:文件夹内新建一个CustomUI.xml的文件
Step3:用记事本或Notepad++打开CustomUI.xml文件开始手写XML然后保存(以下xml摘抄自张立良老师):
<?xml version="1.0"?> <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="ribbonLoaded"> <ribbon> <tabs> <tab id="工资管理" label="工资管理" insertAfterMso="TabHome"> <group id="Group1" label="Mde By 张老师"> <splitButton id="SplitButton1" size="large"> <button id="SplitButton1__btn" imageMso="ViewNextItemMenu" label="显示/隐藏"/> <menu id="SplitButton1__mnu"> <button id="显示帐号" imageMso="ViewNextItemMenu" onAction="显示帐号_Click" label="显示帐号"/> <button id="隐藏帐号" onAction="隐藏帐号_Click" label="隐藏帐号"/> <menuSeparator id="Separator1"/> <button id="显示身份证号" imageMso="ViewNextItemMenu" onAction="显示身份证号_Click" label="显示身份证号"/> <button id="隐藏身份证号" onAction="隐藏身份证号_Click" label="隐藏身份证号"/> <menuSeparator id="Separator2"/> <button id="显示部门" imageMso="ImportMoreMenu" onAction="显示部门_Click" label="显示部门"/> <button id="隐藏部门" onAction="隐藏部门_Click" label="隐藏部门"/> <menuSeparator id="Separator3"/> <button id="显示所有列" imageMso="TableColumnsInsertLeft" onAction="显示所有列_Click" label="显示所有列"/> <button id="隐藏无发生额的列" onAction="隐藏无发生额的列_Click" label="隐藏无发生额的列"/> </menu> </splitButton> <splitButton id="SplitButton2" size="large"> <button id="SplitButton2__btn" imageMso="AccountingFormat" label="代发工资"/> <menu id="SplitButton2__mnu"> <button id="导出工资数据" imageMso="SubdocumentOpen" onAction="导出工资数据_Click" label="导出工资数据"/> <button id="校验工资" onAction="校验工资_Click" label="校验工资"/> </menu> </splitButton> <button id="工资项目" imageMso="OutlineGroup" onAction="工资项目_Click" label="工资项目" size="large"/> <button id="职工管理" imageMso="OutlookGlobe" onAction="职工管理_Click" label="职工管理" size="large"/> <button id="部门管理" imageMso="MeetingsWorkspace" onAction="部门管理_Click" label="部门管理" size="large"/> <splitButton id="SplitButton3" size="large"> <button id="SplitButton3__btn" imageMso="SharePointListsWorkOffline" label="导入数据"/> <menu id="SplitButton3__mnu"> <button id="从外部导入工资表" imageMso="ReturnToTaskList" onAction="从外部导入工资表_Click" label="从外部导入工资表"/> <button id="复制基础信息" onAction="复制基础信息_Click" label="复制基础信息"/> </menu> </splitButton> </group> <group id="Group2" label="其他"> <button id="使用说明" imageMso="TentativeAcceptInvitation" onAction="使用说明_Click" label="使用说明" size="large"/> <button id="官方网站" imageMso="OpenStartPage" onAction="官方网站_Click" label="官方网站" size="large"/> </group> </tab> </tabs> </ribbon> </customUI>
Step4:将xlsm文件追加后缀 .zip
Step5:然后把CustomUI文件夹放进 .zip 的压缩包中
Step6:删掉追加的 .zip 后缀
Step7:VBA中回调:
'回调方式一: Sub macro(control As IRibbonControl) 'macro 为 xml 中对应的 onAction Select Case control.ID 'control.ID 为xml中对应的ID Case "DataCreate": Call 创建数据库 Case "AddOrRemove": Call 添加删除账号 Case "ModiUser": Call 修改用户名 End Select End Sub
'回调方式二: Sub 个税核对_Click(Optional control As IRibbonControl) '个税核对_Click 为 xml 中对应的 onAction On Error GoTo AA: Dim I As Long, Has1 As Boolean Has1 = False For I = 1 To Sheets.Count If IsGZB(Sheets(I)) Then If Left(Sheets(1).Name, 3) = "1月份" Then Has1 = True: Exit For Next I If Has1 = False Then MsgBox "当前工资系统未从1月开始启用,不能汇总计算全年个税。", vbInformation, "提示": Exit Sub GSHD.Show AA: ErrSub End Sub