版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在Excel2023中创建自定义菜单并为菜单项指定宏Excel2023使用了新的用户界面,每项功能都在称作Ribbon的功能区中且它们的位置都是固定的,仅快速访问工具栏(QAT)与先前版本的工具栏相似,可用来添加或删除命令。因此,在Excel2023中创建自定义菜单并为菜单项指定宏不像在Excel2023中那样容易。本文汇总了JohnWalkenbach、JohnMcLea和RondeBruin所介绍的技术。
----技术基础
——辨认工具栏图像
假如使用Excel97或以后的版本,您知道它使用一些图像在它的内置菜单和工具栏中。您可以通过设立FaceID属性为一个特定的整数在自定义菜单和工具栏中使用这些内置图像。然而,问题是如何知道图像所相应的整数。
下面的子过程创建了一个带有开始的250个FaceID图像(见下图1所示)的自定义工具栏。创建了工具栏之后,将鼠标指针放在按钮上面来找到与图像相应的FaceID值。但单击工具栏按钮不会产生任何效果,由于子过程没有在OnAction属性中分派任何宏。当然,您可以通过改变IDStart和IDStop的值来看到更多的图像,最后一个FaceID图像显示数字3518(也有一些空白图像)。
[img][/img]
图1:创建一个FaceID工具栏,当鼠标放在某图像上时将显示相应的数字
下面是子过程代码:
SubShowFaceIDs()
DimNewToolbarAsCommandBar
DimNewButtonAsCommandBarButton
DimiAsInteger,IDStartAsInteger,IDStopAsInteger
'假如已存在FaceIds工具栏则删除
OnErrorResumeNext
Application.CommandBars("FaceIds").Delete
OnErrorGoTo0
'添加一个空工具栏
SetNewToolbar=Application.CommandBars.Add_
(Name:="FaceIds",temporary:=True)
NewToolbar.Visible=True
'可以改变下面的值来看到不同的FaceIDs
IDStart=1
IDStop=250
Fori=IDStartToIDStop
SetNewButton=NewToolbar.Controls.Add_
(Type:=msoControlButton,ID:=2950)
NewButton.FaceId=i
NewButton.Caption="FaceID="&i
Nexti
NewToolbar.Width=600
EndSub
此外,也可以使用VBA代码在工作表中列出所有的FaceID图像和相相应的整数。该代码由JohnD.McLean编写,代码清单如下:
'在工作表中显示所有工具栏按钮图像/图标,由36行100列组成
'相应的最左/右列和最顶/底行中的数字相加即为该图标号
SubDisplayButtonFacesInGrid()
ConstcbName="JDMTestToolBar"
DimcBarAsCommandBar,cButAsCommandBarControl
DimrAsLong,cAsInteger,countAsInteger
Application.StatusBar="CreatingButtonFaceIDs......."
Workbooks.Add
'创建四周的数字
Forr=0To35
Cells(r+2,1).Value=100*r:Cells(r+2,102).Value=100*r
Nextr
Forc=0To99
Cells(1,c+2).Value=c:Cells(38,c+2).Value=c
Nextc
Range("A1:A38").Select
WithSelection
.Font.Bold=True
.HorizontalAlignment=xlCenter
.VerticalAlignment=xlCenter
EndWith
Range("CX1:CX38").Select
WithSelection
.Font.Bold=True
.HorizontalAlignment=xlCenter
.VerticalAlignment=xlCenter
EndWith
Range("B1:CW1").Select
WithSelection
.Font.Bold=True
.HorizontalAlignment=xlCenter
.VerticalAlignment=xlCenter
EndWith
Range("B38:CW38").Select
WithSelection
.Font.Bold=True
.HorizontalAlignment=xlCenter
.VerticalAlignment=xlCenter
EndWith
Range("E5").Select
Selection.Value="Pleasewait.............."
WithSelection.Font
.Name="Arial"
.Size=24
.Bold=True
.ColorIndex=3
EndWith
Range("E5:J10").Select
WithSelection
.HorizontalAlignment=xlCenter
.VerticalAlignment=xlCenter
.MergeCells=True
EndWith
Application.ScreenUpdating=False
WithSelection
.ClearContents
.UnMerge
EndWith
OnErrorResumeNext
CommandBars(cbName).Delete
OnErrorGoTo0
SetcBar=CommandBars.Add'创建带有一个按钮的临时工具栏
WithcBar
.Name=cbName
.Top=0
.Left=0
.Visible=True
EndWith
r=2:c=2:count=0'在单元格Cell(2,2)中的FaceID号为0
SetcBut=CommandBars(cbName).Controls.Add(Type:=msoControlButton)
WithcBut
Do'循环所有的FaceIDs
.FaceId=count
Cells(r,c).Select'分派至按钮然后复制到工作表
.CopyFace
Selection.PasteSpecial
Cells(1,1).Copy
c=c+1
Ifc>=102Then'更新复制的位置
c=2
r=r+1
EndIf
count=count+1
LoopWhilecount<3519'3519是最大的FaceID号
EndWith
Rows("1:38").RowHeight=24.6'增大单元格尺寸
Columns("A:CX").ColumnWidth=5.56
WithActiveSheet.DrawingObjects'增大按钮尺寸
.ShapeRange.ScaleWidth2#,msoFalse,msoScaleFromTopLeft
.ShapeRange.ScaleHeight2#,msoFalse,msoScaleFromTopLeft
.ShapeRange.IncrementLeft8.4
.ShapeRange.IncrementTop3#
EndWith
Range(Cells(2,2),Cells(37,101)).Select'格式化网格线和背景
WithSelection
With.Interior
.ColorIndex=15
.Pattern=xlSolid
EndWith
With.Borders(xlInsideVertical)
.LineStyle=xlContinuous
.Weight=xlThin
.ColorIndex=2
EndWith
With.Borders(xlInsideHorizontal)
.LineStyle=xlContinuous
.Weight=xlThin
.ColorIndex=2
EndWith
EndWith
'恢复Excel设立
CommandBars(cbName).Delete
OnErrorGoTo0
Range("A1").Select
Application.ScreenUpdating=True
Application.StatusBar=""
EndSub运营上面的代码后,将新建一个工作簿,并在该工作簿内列出所有的内置图标图像,最左列、最右列、最顶部、最底部为相应的数字,将某图标相应的最左(或右)列的数字与最顶一行(或最底一行)的数字相加,即为该图标相应的数字。
(注:上面的代码运营较慢,需耐心等待。)
--------------------------------------------------
在Excel97至Excel2023等版本中,可以运用“自定义”对话框来创建新菜单,并建立菜单项,但很难创建子菜单。因此,特定的工作簿菜单必须编写VBA代码来创建。下面的技术介绍了使用一种相称简朴的方法在工作表菜单栏中创建自定义菜单,当工作簿打开时则显示自定义的菜单,该工作簿关闭时则删除自定义的菜单。
先来看看一个示例,该示例演示了这项技术。
示例文献包含了所有需要创建自定义菜单的VBA代码,在大多数情况下,不需要改变这些代码,只需按自已的意图简朴地自定义MenuSheet工作表即可。VBA代码清单如下:
SubCreateMenu()
'当工作簿打开时本过程自动执行.
'注:在这个子过程中没有错误解决语句.
DimMenuSheetAsWorksheet
DimMenuObjectAsCommandBarPopup
DimMenuItemAsObject
DimSubMenuItemAsCommandBarButton
DimRowAsInteger
DimMenuLevel,NextLevel,PositionOrMacro,Caption,Divider,FaceId
''''''''''''''''''''''''''''''''''''''''''''''''''''
'获取菜单数据的位置
SetMenuSheet=ThisWorkbook.Sheets("MenuSheet")
''''''''''''''''''''''''''''''''''''''''''''''''''''
'保证菜单不反复
CallDeleteMenu
'行初始值
Row=2
'使用MenuSheet工作表中的数据添加菜单,菜单项和子菜单项
DoUntilIsEmpty(MenuSheet.Cells(Row,1))
WithMenuSheet
MenuLevel=.Cells(Row,1)
Caption=.Cells(Row,2)
PositionOrMacro=.Cells(Row,3)
Divider=.Cells(Row,4)
FaceId=.Cells(Row,5)
NextLevel=.Cells(Row+1,1)
EndWith
SelectCaseMenuLevel
Case1'代表菜单
'添加顶级菜单到工作表菜单栏中
SetMenuObject=Application.CommandBars(1)._Controls.Add(Type:=msoControlPopup,_
Before:=PositionOrMacro,_
Temporary:=True)
MenuObject.Caption=Caption
Case2'代表菜单项
IfNextLevel=3Then
SetMenuItem=MenuObject.Controls.Add(Type:=msoControlPopup)
Else
SetMenuItem=MenuObject.Controls.Add(Type:=msoControlButton)
MenuItem.OnAction=PositionOrMacro
EndIf
MenuItem.Caption=Caption
IfFaceId<>""ThenMenuItem.FaceId=FaceId
IfDividerThenMenuItem.BeginGroup=True
Case3'代表子菜单项
SetSubMenuItem=MenuItem.Controls.Add(Type:=msoControlButton)
SubMenuItem.Caption=Caption
SubMenuItem.OnAction=PositionOrMacro
IfFaceId<>""ThenSubMenuItem.FaceId=FaceId
IfDividerThenSubMenuItem.BeginGroup=True
EndSelect
Row=Row+1
Loop
EndSub
SubDeleteMenu()
'这个子过程在工作簿关闭时执行
'删除自定义菜单
DimMenuSheetAsWorksheet
DimRowAsInteger
DimCaptionAsString
OnErrorResumeNext
SetMenuSheet=ThisWorkbook.Sheets("MenuSheet")
Row=2
DoUntilIsEmpty(MenuSheet.Cells(Row,1))
IfMenuSheet.Cells(Row,1)=1Then
Caption=MenuSheet.Cells(Row,2)
Application.CommandBars(1).Controls(Caption).Delete
EndIf
Row=Row+1
Loop
OnErrorGoTo0
EndSub
SubDummyMacro()
MsgBox"您可以在本过程中添加相应的操作代码."
EndSub
换句话说,该技术使用了一个存放在MenuSheet工作表中的表格(如下图2所示),只需按自已的需要简朴地修改表中的数据,就可创建自已的菜单。
[img][/img]
图2:存放菜单项的表格
该表格包含5列:
(1)级别:指定的菜单项的级别,有效值是1、2、3。第1级别是菜单,第2级别是菜单项,第3级别是子菜单项。正常情况下,有一个第1级别的菜单,下面包具有第2级别的菜单项。一个第2级别的菜单项也许包含或不包具有第3级别的菜单项(子菜单项)。
(2)标题:显示在菜单、菜单项和子菜单项中的文字。使用连接符(&)指定一个带下划线的字符。
(3)位置/宏:对于第1级菜单,应当是一个整数,代表菜单在菜单栏中的位置。对于第2级或第3级菜单项,应当是一个宏,当该菜单项被选择时执行相应的宏。假如第2级菜单项有一个或多个第3级菜单项,第2级菜单项也许没有一个宏与它相关联。
(4)分隔线:假如设立为真,将在菜单项或子菜单项前放置一个分隔线。
(5)FaceID(图标号):可选的。一个代码数字,代表显示在菜单项前内置的图形图像。获取代码数字可见上文所介绍的辨认工具栏图像的内容。
下图3显示了使用上面的表格所创建的自定义菜单。
[img][/img]
图3:一个自定义菜单的例子
要在工作簿或者加载宏中使用这项技术,可以按照下面的环节进行:
(1)打开前面下载的工作簿文献。该工作簿包具有VBA代码和一个名为MenuSheet的工作表。
(2)将该工作簿中的所有代码复制到自已的VBA工程的模块中。
(3)将下面的子过程添加到ThisWorkbook对象模块中:
PrivateSubWorkbook_Open()
CallCreateMenu
EndSubPrivateSubWorkbook_BeforeClose(CancelAsBoolean)
CallDeleteMenu
EndSub
(4)当工作簿打开时,执行Workbook_Open子过程,当工作簿关闭时,执行Workbook_BeforeClose子过程。
(5)插入一个新工作表并命名为MenuSheet。然后直接复制menumakr.xls文献中的表格到MenuSheet工作表中。
(6)按自已的需要修改MenuSheet工作表中的表格。
-----------------------------
下面的内容应用了前面所讲的技术在Excel2023中创建自定义菜单,并为菜单项指定相应的宏,如图4所示。
[img][/img]
图4:在Excel2023中自定义菜单示例
——只用于一个工作簿
可以按下面的环节在特定的Excel2023工作簿中创建自定义菜单:
在Excel2023中打开该工作簿。
在快速访问工具栏(QAT)中单击右键,选择“自定义快速访问工具栏”,弹出“Excel选项”对话框。在对话框中的“从下列位置选择命令”下拉列表框中选择“宏”,然后在右侧的“自定义快速访问工具栏”下拉列表框中选择“用于MyWorkbook.xlsm”。
然后,在左侧的列表框中选择“WBDisplayPopUp”,单击“添加”按钮,再单击“拟定”按钮。
假如想修改所要显示的图标,可单击下方的“修改”按钮。
[img][/img]
图5:在“Excel选项”中添加自定义菜单
(4)此时,快速访问工具栏中新增了一个图标,点击该图标将弹出自定义菜单。能使用Ctrl+M组合键快速打开菜单,也能使用“宏”对话框(按Alt+F8键)修改快捷键。
其实,在示例工作簿中隐藏着一个工作表,该工作表上存放着菜单项名称、所执行的宏名及图标号等。可以在任一工作表标签中单击右键,选择“取消隐藏”命令,或在“开始”功能区中选择“格式”下的“隐藏/取消隐藏”中相应的命令来显示该工作表。该工作表如图6所示。
图6:存放菜单项名、宏名及图标号的MenuSheet工作表
与前面所讲述的内容同样,该工作表中包含5列,分别为:
(1)级别:指定的菜单项的级别,有效值是2和3。第2级别是菜单项,第3级别是子菜单项。
(2)标题:显示在菜单、菜单项和子菜单项中的文字。使用连接符(&)指定一个带下划线的字符。
(3)宏:对于第2级或第3级菜单项,应当是一个宏,当该菜单项被选择时执行相
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 供应链韧性提升的技术路径演进与未来趋势展望
- 制造业智能化升级的演进路径与核心技术突破分析
- 高校技术转移办公室人员如何利用区域科技创新大脑实现技术成果高效转化
- 2026 年导管相关感染护理质控专项汇报
- 《润滑系统 基本参数》
- 2026年机器视觉3D检测:复杂零件尺寸测量技术突破
- 行政复议案件办理笔试试题完整版及答案2026年
- 消防安全知识培训测试题及答案
- 实验心理学试题及答案
- 留疆战士考核试题解析
- 2026年家庭健康指导员体重管理指导测试题含答案
- 2026年高级经济师《农业经济》考试真题及答案
- 2026年秋季开学:高中开学第一课为梦想而战
- 凯爱瑞2026上半年餐饮新品情报合集
- 2026年湖北省事业单位联考真题及答案
- 海洋平台智能废弃物处理系统技术创新总结报告
- 2026浙江外国语学院集中招聘劳务派遣制工作人员10人模拟试卷及答案详解【网校专用】
- 高端大圆坯行业供需形势分析及重点企业投资建议研究报告
- 莆田港务集团有限公司招聘2026年笔试试题
- 综合评标专家库专家考试(法律法规)试题及解析(2026年浙江绍兴市)
- 2026-2030中国钡行业市场深度调研及发展趋势与投资前景研究报告
评论
0/150
提交评论