我们在VBA编辑器里使用的菜单:
这些在VBA里也提供了相应的对象让我们去操作,这个就是CommandBars对象。
CommandBars对象
在VBIDE库下面的对象里,找到VBE对象,它下面就有CommandBars属性,这个属性就是菜单相关的,再点击下面:
会跳转到Office库下面的CommandBars对象,也就是说,这个菜单其实是Office通用的一种东西,也是微软制作好了给使用者调用就可以的:
你还可以点击下面的那个绿色的Office,跳转出来的就是:
代码语言:javascript复制Library Office
C:Program Files (x86)Common FilesMicrosoft SharedOFFICE14MSO.DLL
Microsoft Office 14.0 Object Library
说明Office库其实就是这个MSO.DLL(前面的是安装路径,可以会不一样)的东西,所有操作Office库对象的东西,其实都是调用这个dll。
你还可以打开一个Word,或者其他有VBA的Office套件,同样进入对象浏览器,查看这个Office库,它们指向的都是这个MSO.DLL。
我们写个代码遍历一下这个对象,看看在VBA编辑器里的这个菜单对象:
代码语言:javascript复制Sub testCMDB()
Dim cmd As CommandBar
For Each cmd In Application.VBE.CommandBars
Debug.Print cmd.Name, cmd.NameLocal
Next
End Sub
输出:
代码语言:javascript复制菜单条 菜单条
标准 标准
编辑 编辑
调试 调试
用户窗体 用户窗体
Document 文档
Project Window Insert Project Window Insert
Toggle Toggle
Code Window Code Window
Code Window (Break) Code Window (Break)
Watch Window Watch Window
Immediate Window Immediate Window
Locals Window Locals Window
Project Window Project Window
Project Window (Break) Project Window (Break)
Object Browser Object Browser
MSForms MSForms
MSForms Control MSForms Control
MSForms Control Group MSForms Control Group
MSForms Palette MSForms Palette
MSForms Toolbox MSForms Toolbox
MSForms MPC MSForms MPC
MSForms DragDrop MSForms DragDrop
Toolbox Toolbox
Toolbox Group Toolbox Group
Property Browser Property Browser
Property Browser Property Browser
Docked Window Docked Window
Task Pane 任务窗格
Property Editor 属性编辑器
Office Clipboard Office 剪贴板
XML Source XML 源
Research 信息检索
XML Document XML 文档
Signatures 签名
Document Actions 文档操作
Clip Art 剪贴画
Selection and Visibility 选择和可见性
Document Management 文档管理
Document Updates 文档更新
Mail Merge Panes 邮件合并窗格
Fax Service 传真服务
Meeting Workspace 会议工作区
Attachment Options 附件选项
Accessibility Checker 辅助功能检查器
Clipboard 剪贴板
Envelope 信封
System 系统
Online Meeting 联机会议
看到这个输出,可能和预想的不大一样吧,预想输出应该是:
代码语言:javascript复制文件(&F)
编辑(&E)
视图(&V)
插入(&I)
格式(&O)
调试(&D)
运行(&R)
工具(&T)
外接程序(&A)
窗口(&W)
帮助(&H)
这个的原因是什么呢?
其实看到这几个:
代码语言:javascript复制标准 标准
编辑 编辑
调试 调试
用户窗体 用户窗体
我们应该能够想到,在菜单的空白处,点击右键的时候,出来的就是这个:
这不正好一样吗,所以我们可以猜测,VBA编辑器里的菜单文件(&F)、编辑(&E)这些,其实不是CommandBars对象,他们应该是CommandBars对象的子对象,也就是CommandBarControl对象,使用代码再遍历一下CommandBars(1)试试:
代码语言:javascript复制Sub testCMDB1()
Dim cmd As CommandBarControl
For Each cmd In Application.VBE.CommandBars(1).Controls
Debug.Print cmd.Caption
Next
End Sub
这下输出就对了。