ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: fanjy

[分享]RibbonX和VBA

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-13 09:20 | 显示全部楼层
本帖已被收录到知识树中,索引项:UI界面定制
动态菜单
dynamicMenu是RibbonX中的一个独立的控件,因为它是仅有的一个内容结构能够在运行时可以改变的控件。dropDown、comboBox和gallery实质上是一个直接的列表,而dynamicMenu可以包含自定义和内置控件的一个完整的控件层次——也包括其它的dynamicMenus。这个控件被创建以满足特定的需求,其内容随工作簿打开、关闭和变化而改变。
设想一个包含多个不同类型工作表的工作簿(例如,原始数据、中间计算、汇总和报告),且每个工作表需要一组不同的菜单,可以使用下面的菜单定义(为了清楚起见,忽略了额外的属性和回调如Image和onAction):
<menu id="rxSheetOperations" label="Sheet Operations">
  <menu id="rxData1Menu" label="Data Sheet 1">
      <button id="rxData1Refresh" label="Refresh Sheet 1 data" />
  </menu>
  <menu id="rxData2Menu" label="Data Sheet 2">
      <button id="rxData2Refresh" label="Refresh Sheet 2 data" />
  </menu>
  <menu id="rxCalcMenu" label="Calculation Sheet">
      <button id="rxCalcRecalc" label="Recalculate">
  </menu>
  <menu id="rxReport1Menu" label="Report Sheet 1">
      <button id="rxReport1Show" label="Show Report Sheet" />
      <button id="rxReport1Print" label="Print Report Sheet" />
  </menu>
  <menu id="rxReport2Menu" label="Report Sheet 2">
      <button id="rxReport1Show" label="Show Report Sheet" />
      <button id="rxReport1Print" label="Print Report Sheet" />
  </menu>
问题是,在设计时不知道最终的工作簿中每种类型可能有多少工作表,或者以什么顺序显示。dynamicMenu的getContent回调提供了运行时使用VBA创建先前的XML的机制(通过直接检测工作簿)。在XML定义里,包括单独的dynamicMenu入口:
<dynamicMenu id="rxSheetOperations" label="Sheet Operations"
getContent="rxSheetOperations_getContent">
rxSheetOperations_getContent过程为所包含的控件建立了XML定义并返回,这些控件定义包含在<menu>元素部分:
Sub rxSheetOperations_getContent(ByRef control As IRibbonControl, ByRef returnedVal)
  Dim sXML As String
  Dim wks As Worksheet
  '以容器<menu>元素开始
  sXML = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">"
  For Each wks In ThisWorkbook.Worksheets
    '处理:为每个工作表添加控件定义到sXML字符串
  Next
  '通过关闭容器<menu>元素结束
  sXML = sXML & "</menu>"
  '返回完整的XML到动态菜单
  returnedVal = sXML
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-13 09:22 | 显示全部楼层
Ribbon CommandBar扩展
RibbonX的设计基于XML并且回调代替了对象模型,负责定制应用程序以维护所有控件的状态信息。这引发了如何查询状态信息的问题——没有对象,不能读取属性。幸好,CommandBars对象已经扩展成带有GetEnabledMso、GetImageMso、GetLabelMso、GetPressdMso、GetScreenTipMso、GetSuperTipMso和GetVisibleMso属性去为内置控件显示所有的状态信息。在每种情形下,传递内置控件的名称。这些功能可能对想包含控件图像在用户窗体中或者当用户直接单击Ribbon控件时确保使用正确的控件标签的加载项作者是最有用的。注意,没有GetTextMso用于返回dropDown、comboBox或editBox文本,也不能调用这些带有自定义控件ID的函数来查询其它加载项的定制。
也可以单击任何使用新的CommandBars.ExecuteMso方法的内置控件,来获取状态信息。对于激发没有等同的对象模型的行为,这是相当有用的——诸如,在绘图模式去在工作表中绘制文本框:
Application.CommandBars.ExecuteMso "TextBoxInsertExcel"

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-13 09:23 | 显示全部楼层
RibbonX的局限
决不要希望任何新技术的第一个版本对每个人来说都是完美的。Microsoft的RibbonX团队执行了在Office 2007 Beta版测试期间所收到的大量建议,并且做了令人惊奇的工作,使得RibbonX尽可能功能丰富、成熟且稳定。剩下的主要局限如下:
(1) 没有方法为VBA在运行时去提供完整的XML。但是,有一个标准的GetCustomUI事件添加到了Workbook对象中,或者一个CreateCustomUI方法添加到了CommandBars对象中。
(2) 删除工作簿定制的唯一方式是关闭工作簿。一个更好的可供选择的方法是RemoveCustomUI方法添加到了CommandBars对象中。
(3) 给getImage回调idMso名或IPicture对象可以提供内置的或自定义的图像。也应该可以提供一个内部相关的ID用于使用包含在工作簿文件中的自定义图像。
(4) 有一些Excel Ribbon中的控件不能够使用RibbonX创建——诸如,页面布局比例微调项、直接显示在Ribbon区域中的库、以及筛选弹出菜单中的列表框。
(5) 不能够创建自定义的上下文相关选项卡设置。可以定义自已的上下文并且显示合适的上下文相关的选项卡将是有利的。
(6) 激活一个选项卡的唯一方式是使用SendKeys。应该有一个ActivateMso方法供选择而不是执行一个控件——或者或许在选项卡名称中使用ExecuteMso应该激活它。
(7) 不能修改最小化工具条或状态栏。
(8) 不能添加自定义的ActiveX控件到Ribbon中(虽然现在可以创建带有它们的任务窗格)。
(9) 不能修改内置的组。
(10) 不能读取内置的dropDown、comboBox或editBox控件的文本,识别当前活动选项卡、组、或控件、或识别库中所选项。事实上,缺少了等同添加到CommandBars对象中的属性getItem。
(11) 没有方法从comboBox、dropDown执行项目,或者gallery.ExecuteMso应该采取一个可选的ItemID或ItemIndex参数。
(12) 每个RibbonX容器项目,从根customUI元素到深层嵌套菜单,应该支持使用getContent回调使内容动态设置。
(13) 在文件中的RibbonX XML和一些图像应该通过Workbook对象的CustomXMLParts集合公布出来,以便可以使用VBA容易阅读或更新。
(14) 没有方法为自定义的组去适应内置组的调整大小/折叠行为。应该可以决定一个自定义组有多大以及节省选项卡的空间——因此允许改变显示内容以使可利用空间得到最好使用。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-13 09:23 | 显示全部楼层
总结
在RibbonX中,Microsoft已经做了极好的工作,显示了Office 2007 Ribbon为开发者使用所具备的能力。
您可以很容易地创建自定义选项卡、组、菜单、按钮、切换按钮、下拉项、库、复选框、以及动态菜单以添加您的应用程序的功能到Ribbon中。
您有一个全面且紧密的属性组,可以应用到所有的控件类型中,并且(几乎)每个属性都有一个等价的getAttribute回调。
使用那些控件和属性,您可以为自已的应用程序创建一个全新的界面样式——比以前版本的CommandBars更好。
虽然非常好,但RibbonX仍然是1.0版本的技术,并且可能遭受到一些限制。
By fanjy in 2007-3-12

TA的精华主题

TA的得分主题

发表于 2007-3-13 10:38 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-3-13 11:36 | 显示全部楼层

非常好,当加以精华,谢谢!
可否上传原书?

有原书当然最好了,我是在网上下载的该书的示例章节,见本贴的第一楼有相应的链接.

也希望有原书完整版本的能贡献出来.

TA的精华主题

TA的得分主题

发表于 2007-3-15 15:02 | 显示全部楼层

等了很久,终于看到Office 2007 VBA的相关内容.

但我还不明白,Office 2007 中的Ribbon 是否相当于Office 2003 中的VBA.

另外,Excel2003中的VBA代码在Excel2007中不能运行,如要在Excel2007中运行,变换的工作量是否很大?

TA的精华主题

TA的得分主题

发表于 2007-5-15 20:41 | 显示全部楼层

谢谢范兄。

学习ing,

有几处知识点还是没搞懂,也没有试成功。 

[em04]
[此贴子已经被作者于2007-5-15 20:41:27编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-5-15 20:56 | 显示全部楼层
QUOTE:

谢谢范兄。

学习ing,

有几处知识点还是没搞懂,也没有试成功。 

细心调试,应该都可以实现.

TA的精华主题

TA的得分主题

发表于 2007-5-15 21:40 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 11:19 , Processed in 0.043650 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表