ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 细品RibbonX(1-59) (转)

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 20:24 | 显示全部楼层
本帖已被收录到知识树中,索引项:UI界面定制
本帖最后由 jiulongpo 于 2012-8-6 21:59 编辑

转自: http://www.excelperfect.com/index.php/2009/12/20/ribbonxstudy52/
细品RibbonX(52):如何共享Ribbon定制之在正在使用的多个Office版本中部署Excel解决方案


除非每个人都在使用Office 2007,因而知道在仍使用老的Office版本中如何部署加载项文件是非常有帮助的。
旧的命令栏定制仍然工作吗?
考虑安装Office 2007的Office开发者面临的最大的问题之一是“我的定制在全新的功能区中仍然工作吗?”回答是肯定的。定制仍然工作,只是已经在不显眼的地方。即这些定制将会自动出现在Office 2007应用程序的“加载项”选项卡中。
下面,介绍几种在不同环境中部署Excel解决方案的方法。
方法1:创建单独的版本
在带有多个Office版本的环境中部署解决方案的第一种方法是最明显的:为应用程序的每种文件格式创建一个版本。
方法2:从新的加载项中调用以前的版本
在带有多个Office版本的环境中工作的另一种方法是:创建传统的加载宏或全局模板来包含2007文件的RibbonX界面。在2007文件中使用Application.Run方法,可以调用存储在传统文件中的过程。采用这种方法,传统的文件实际上包含了所有的功能代码,而2007文件只是担当启动器。
使用2003 Excel加载项作为2007 加载项的装载器
迁移2003文件处理2003环境以及担当2007文件的后台的过程最好按照下列三个步骤:

  • 创建基本的2007功能区定制加载项。
  • 对2003加载宏做必需的修改。
  • 链接到2007文件确保2003文件首先被打开。
事件的顺序是重要的,以便不会在继续时引起崩溃。最后一点是,确保用户在没有2003版时决不要装载该文件的2007版,2003版包含着2007版运行需要的所有宏代码。
首先,创建基本的2007加载项部分。打开Excel,创建新工作簿,将在默认的AddIns文件夹中以ForumLauncher_2007.xlam来保存。关闭Excel,在CustomUI Editor中打开该文件,输入下面的XML代码来创建功能区定制:
  1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  2.   <ribbon startFromScratch="false">
  3.     <tabs>
  4.       <tab idMso="TabDeveloper">
  5.         <group id="rxgrpForums"
  6.           label="Forums">
  7.           <button id="rxbtnRibbonX"
  8.             label="Patrick Schmid's RibbonX Forum"
  9.             onAction="rxsharedLinks_click"
  10.                     imageMso="HyperlinkInsert"
  11.             tag="RibbonX"/>
  12.           <button id="rxbtnVBAX"
  13.             label="VBA Express"
  14.             onAction="rxsharedLinks_click"
  15.                     imageMso="HyperlinkInsert"
  16.             tag="VBAX"/>
  17.         </group>
  18.       </tab>
  19.     </tabs>
  20.   </ribbon>
  21. </customUI>
复制代码

上述代码在“加载项”选项卡的末尾的自定义组中添加了两个按钮。注意,按钮使用了共享的回调rxsharedLinks_click,使用了tag属性。
验证代码并保存,复制回调签名,关闭CustomUI Editor。打开Excel并安装该加载项。转到VBE,导航到ForumLauncher工程,插入一个新模块,粘贴回调签名,并作如下修改:

  1. Sub rxsharedLinks_click(control As IRibbonControl)
  2.     Application.Run "LaunchFrom2007", control.Tag
  3. End Sub
复制代码

这个过程使用Application.Run方法从另一个打开的文件中启动宏,指定了要启动的宏的名字LaunchFrom2007,还有一个参数:控件的标签。
保存后卸载该加载项。
下一步,对2003加载宏作必需的修改,即ForumLauncher_v2003.xla。
首先,修改开始代码确保菜单不会被创建在“加载项”选项卡中,然而在Excel 2003中仍然是菜单。使用下列步骤测试版本并装载正确的菜单。打开VBE,导航到ForumLauncher_v2003.xla工程,展开ThisWorkbook模块,修改Workbook_Open过程如下:
  1. Private Sub Workbook_Open()
  2.     Dim wbAddin As AddIn
  3.     Dim bInstalled As Boolean
  4.     Dim s2007Filename As String

  5.     s2007Filename = Application.WorksheetFunction.Substitute(ThisWorkbook.Name, "2003", "2007") & "m"

  6.     If Val(Application.Version) < 12 Then
  7.         Call CreateMenu
  8.     Else
  9.         '检查是否安装了加载项
  10.         For Each wbAddin In Application.AddIns
  11.             If wbAddin.Name = s2007Filename Then
  12.                 '加载项已安装,打开它
  13.                 Workbooks.Open ThisWorkbook.Path & Application.PathSeparator & s2007Filename
  14.                 bInstalled = True
  15.                 Exit For
  16.             End If
  17.         Next wbAddin

  18.         '如果需要安装加载项
  19.         If Not bInstalled Then Application.AddIns.Add _
  20.            ThisWorkbook.Path & Application.PathSeparator & s2007Filename
  21.     End If
  22. End Sub
复制代码

Workbook_Open事件现在完成如下操作:

  • 通过将2003加载项文件名中的2003替换为2007,然后添加m到结果字符串中,从而捕获2007加载项的名字并赋值给变量。
  • 检查应用程序的版本,如果版本小于12,则创建菜单。
  • 如果版本不小于12,检查2007加载项是否已经安装。
  • 如果2007版加载项已安装,则装载文件并记录2007版本已安装。
  • 评估bInstalled属性。如果为假,那么安装加载项。
因为我们已经在2003文件被启动时安装并打开了2007文件,所以结束时明确地卸载2007文件。为此,需要修改Workbook_BeforeClose过程来检查版本并且卸载2007加载项:
  1. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  2.     If Val(Application.Version) > 11 Then
  3.         Workbooks(Application.WorksheetFunction.Substitute(ThisWorkbook.Name, "2003", "2007") & "m").Close
  4.     Else
  5.         Call DeleteMenu
  6.     End If
  7. End Sub
复制代码

同理,如果文件版本小于12,那么已经装载了2003菜单修改,因此需要触发DeleteMenu过程。如果应用程序的版本不小于12,那么需要代码关闭2007加载项文件。
最后,对2003加载项需要提供输入点以便2007版本的文件能够调用过程。当在Excel 2003或更早的版本中单击菜单按钮时触发下列两个过程:
  1. Private Sub Launch_VBAX()
  2.     '启动VBAX网站
  3.     ActiveWorkbook.FollowHyperlink (sVBAXURL)
  4. End Sub

  5. Private Sub Launch_RibbonX()
  6.     '启动RibbonX论坛
  7.     ActiveWorkbook.FollowHyperlink (sRibbonXURL)
  8. End Sub
复制代码

接着,在标准模块中添加下面的过程:
  1. Public Sub LaunchFrom2007(sSiteToLaunch)
  2.     '从2007加载项中担当装载器
  3.     Select Case UCase(sSiteToLaunch)
  4.         Case Is = "VBAX"
  5.             Call Launch_VBAX
  6.         Case Is = "RIBBONX"
  7.             Call Launch_RibbonX
  8.     End Select
  9. End Sub
复制代码

Case语句评估单击的控件,并从2003文件中启动合适的宏。
现在,我们已经完成了需要的转换,保存2003 xla加载宏并卸载。回到2007加载项,强迫用户首先打开2003版。
再次安装2007版的加载项。打开VBE,导航到ForumLauncher_v2007.xlam工程,在ThisWorkbook模块中插入下列代码:
  1. Private Const sReqdAddin = "Forum_Launcher_v2003.xla"

  2. Private Sub Workbook_Open()
  3.     Dim wbTest As Workbook

  4.     On Error Resume Next
  5.     Set wbTest = Workbooks(sReqdAddin)
  6.     If Err.Number = 0 Then
  7.         '加载项打开
  8.         On Error GoTo 0
  9.         Exit Sub
  10.     End If

  11.     '加载项必须被打开
  12.     On Error GoTo 0
  13.     MsgBox "You must load " & sReqdAddin & " to use " & ThisWorkbook.Name
  14.     ThisWorkbook.Close savechanges:=False
  15. End Sub
复制代码

好了!转换完成。保存文件并再次卸载该加载项。
现在来测试。打开加载项管理器,安装2003版本的加载项,可以在开发工具选项卡的右侧看到完整的功能组,如下图所示。

返回到加载项管理器,卸载2003版,安装2007版,单击“确定”返回用户界面,此时会显示如下图所示的错误消息。

转到VBE,你将看到2003版和2007版的加载项文件都没有被装载。此时,装载2007 xlam加载项的唯一方法是首先装载2003的xla文件。这样,避免用户不小心选择了错误的加载项。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 20:26 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-6 22:00 编辑

转自: http://www.excelperfect.com/index.php/2009/12/21/ribbonxstudy53/
细品RibbonX(53):RibbonX和Visual Studio(1)


RibbonX和Visual Studio互为补充,可以非常方便地使用它们创建许多令人惊叹的应用程序。Microsoft已经为Visual Studio和RibbonX协同工作做出了很多努力,不仅仅有用于创建每类RibbonX项目的特定模板,而且利用Visual Studio可以做更多的事情。
使用Visual Studio的优势
使用Visual Studio的最大的一个特点是将XML代码和资源注入到Office中的能力。如果你决定创建额外的选项卡、组和相关控件,以满足特定的用户需求,那么你能够这样做。使用这项技术,也能够定制满足特定的角色需求的显示,管理员可以比其他员工看到更多的控件。使用XML注入同时意味着能够在标准的XML文件中存储Ribbon变化,并且在运行期在需要时简单地添加功能。
资源——例如用于定义界面的XML——容易被注入到Office环境。例如,可以容易地在运行时为需要的按钮添加图标或位图,而不是必须包含它们作为文件的一部分。这种添加的灵活性意味着能够更新图标或位图,而无须接触到创建的加载项、模板或文档。成功执行的唯一的条件是,新资源要与原先使用的应用程序具有相同的文件名。
另一方面,Visual Studio提供了安全的环境,大大减少了受到安全威胁的情形。
最后,托管的代码有很多好处,可以排除内存泄漏,提供强大的错误处理,也更稳定。并且,使用托管的代码可以很容易地执行许多任务。例如,在Visual Studio中,处理Web服务只需添加一个简单的Web引用,然后访问Web服务功能就像任何其它类一样。
RibbonX基础
可以创建许多Office应用程序类型。显示在Visual Basic\Office文件夹中的文档和模板如下图所示。

在希望使用加载项时,选择Visual Basic\Office\2007文件夹。加载项将会创建跨文档和模板工作的应用程序,在用户删除或禁用之前,加载项总是可用的。当然,在需要时很容易添加和删除加载项。
创建基本的选项卡
与VBA不同,Visual Studio为处理Ribbon提供了一种完整的解决方案。处理Ribbon最容易的方法是以加载项工程模板开始。
步骤1 打开Visual Studio。
步骤2 选择“文件——新建项目”,将看到如上图所示的“新建项目”对话框。
步骤3 使用喜欢的语言,打开2007文件夹。
步骤4 选择应用程序的加载项模板,输入名称,单击“确定”。这里的名称为BasicTab。
为了处理Ribbon,需要添加其它项目。Ribbon文件包括代码文件,包含创建的控件的代码,还包括XML文件,告诉Office如何配置功能区。
步骤5 在“解决方案资源管理器”中的项目名称(BasicTab)中单击右键,选择“添加——新建项”,出现“添加新项——BasicTab”对话框,如下图所示。

步骤6 选择“功能区(XML)”,你可以输入名称或者使用默认的名称(这里使用默认的名称),单击“添加”。
Visual Studio添加一个新的代码文件和XML文件。Ribbon1.XML文件已经包含一个简单的选项卡、组和按钮,因此本例中保留默认项目。但是,在能够真正看到功能区修改之前,要添加XML文件到应用程序资源中。
步骤7 在解决方案资源管理器中打开项目属性窗口,拖动Ribbon1.xml到“资源”窗口中,如下图所示。

你可能已经注意到,使示例完整所必需的大多数代码已经作为创建的工程的一部分出现。当然,你需要作已一些修改以完善示例。
步骤8 按照提示,将Ribbon1.vb中的注释代码复制到ThisAddIn.vb中并取消注释。代码如下:
  1.     Protected Overrides Function CreateRibbonExtensibilityObject() As Microsoft.Office.Core.IRibbonExtensibility
  2.         Return New Ribbon1()
  3.     End Function
复制代码

步骤9 在新建的功能区中添加一些元素,即修改Ribbon1.xml代码,添加组:
  1.         <group id="MyGroup"
  2.                label="我的组">
  3.           <toggleButton id="toggleButton1"
  4.                         size="large"
  5.                         label="我的按钮"
  6.                         screentip="My Button Screentip"
  7.                         onAction="OnToggleButton1"
  8.                         imageMso="HappyFace" />
  9.         </group>
复制代码

步骤10 按F5键,调试代码。此时,会启动Excel 2007,界面如下图所示。

可以看到,与CustomUI Editor不同,Visual Studio可以创建中文的选项卡和组。
当发布该项目后,加载项会自动添加到Excel,以后打开Excel时都将启动该加载项。如何卸载呢?
步骤1 选择“Office菜单——Excel选项”,出现“Excel选项”对话框。
步骤2 选择“加载项”。看到“BasicTab”加载项列于“添动应用程序加载项”列表中,如下图所示。注意到,“类型”列表明这是一个COM加载项。

步骤3 在“管理”下拉列表中,选择“COM加载项”,单击“转到”。出现下图所示的“COM加载项”对话框。

步骤4 取消BasicTab加载项前的选择,单击“删除”,从列表中移除该加载项应用程序。
至此,你不会再看到该加载项对应用程序界面的修改。
然而,上述操作并没有从注册表中移除该加载项。你需要使用特别的实用程序或工具来移除注册表项。
步骤1 找到该加载项的完整文件路径。
步骤2 选择“开始—所有程序—Microsoft Visual Studio 2008—Visual Studio Tools—Visual Studio 2008命令提示”。
步骤3 在命令提示中,输入RegAsm/Unregister <完整的DLL名称>,按回车键。
RegAsm实用程序将告诉你成功注销了类型。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 20:31 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-6 22:01 编辑

转自: http://www.excelperfect.com/index.php/2009/12/22/ribbonxstudy54/
细品RibbonX(54):RibbonX和Visual Studio(2)


下面,让我们继续使用Visual Studio为功能区添加更多的功能。

  • 创建带有组和控件的新选项卡
  • 在现有的选项卡中添加新控件
  • 在Office菜单中添加新控件
  • 重利用现有选项卡中的控件
  • 重利用Office菜单中的控件
重利用是指将现有的控件实现新功能或者增强现有的功能。
在Visual Studio中处理图形
在使用Visual Studio时,必须提供图形作为加载项的一部分,这意味着要创建额外的代码。满足这项特定需求的XML作为customUI元素的一部分:
  1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
  2.           onLoad="Ribbon_Load"
  3.           loadImage="GetImage">
复制代码

在代码中,loadImage属性提供对GetImage()方法的调用,但GetImage()方法不知道要求向Office应用程序发送哪个图标或图像,因此必须以某种方式创建使它能处理任何需求。下面是GetImage()方法的代码:
  1.     Public Function GetImage(ByVal ImageName As String) As Bitmap
  2.         ' 包含传递到Office的位图
  3.         Dim ThisBitmap As Bitmap = New Bitmap(20, 20)

  4.         ' 发现图像名和相应的资源
  5.         Select Case ImageName
  6.             Case "Colorblk2"
  7.                 ThisBitmap = New Bitmap(My.Resources.Colorblk2)
  8.             Case "TIME"
  9.                 ThisBitmap = New Bitmap(My.Resources.TIME.ToBitmap())
  10.         End Select

  11.         ' 返回简单的位图
  12.         Return ThisBitmap
  13.     End Function
复制代码

本例使用两类不同的图像。第一个是标准的位图,Colorblk2,因此可以直接使用;第二个是一个图标,使用前必须调用ToBitmap()方法将它转换为位图。
注意,代码需要从“资源”中请求图像,因此必须通过“添加资源”将图像添加到资源窗口。
当装载功能区时执行任务
使用Visual Studio创建的默认项目包括OnLoad()方法,当Office装载功能区时自动执行该方法。onLoad属性决定初始化时Office调用的方法,可以修改方法以满足需要,默认的方法名为onLoad()。本例中相应的回调代码为:

  1.     Public Sub Ribbon_Load(ByVal ribbonUI As Office.IRibbonUI)
  2.         '保存Ribbon引用
  3.         Me.ribbon = ribbonUI
  4.         '初始化下划线状态
  5.         UnderlineState = False
  6.         '显示装载消息
  7.         MessageBox.Show("功能区装载")
  8.     End Sub
复制代码

本例提供了一个以某种方式工作的控件示例,该控件取决于用户对另一个控件的选择。本例中,用户能够控制是否应用程序允许下划线功能。因为Excel需要确定在Ribbon装载时该控件的状态,所以代码包含了一个名为UnderlineState的初始化变量。
在调试时,在代码中包括状态信息是有帮助的。这里,只是简单地告诉功能区已经装载。如果没有看到这个消息框,则表明加载项出现了错误。
创建新的选项卡、组和控件
最经常执行的任务之一是为应用程序创建新的选项卡、组和控件。为达到此目的,开始仍然需要添加XML。本例中,添加的XML代码如下:
  1.       <tab id="myTab"
  2.            label="我的选项卡">
  3.         <group id="MyGroup"
  4.                label="我的组">
  5.           <button id="myButton"
  6.                   label="我的按钮"
  7.                   image="Colorblk2"
  8.                   size="large"
  9.                   onAction="MyButton_ClickHandler"/>
  10.         </group>
  11.       </tab>
复制代码

创建了一个名为“我的选项卡”的选项卡,包含一个名为“我的组”的组,其中含有一个名为“我的按钮”的按钮。使用了自定义图像,因此在image属性中添加了相应的信息。当用户单击“我的按钮”时,调用myButton_ClickHandler()方法:
  1.     Public Sub myButton_ClickHandler(ByVal Control As Office.IRibbonControl)
  2.         ' 显示一条简单的消息
  3.         MessageBox.Show("我的按钮被单击")
  4.     End Sub
复制代码

修改或重利用已有的选项卡、组和控件
有时,希望修改或重利用已有的选项卡、组或控件,而不是创建新的。例如,可能想改变“格式刷”的功能,满足内在的格式需求,或者完全隐藏某些选项卡、组或控件。
下面的XML代码在“开始”选项卡中添加一个控件:
  1.       <tab idMso="TabHome">
  2.         <group id="BehaviorChange"
  3.                label="操作"
  4.                insertAfterMso="GroupFont">
  5.           <toggleButton id="StopUnderline"
  6.                         label="中止下划线功能"
  7.                         onAction="StopUnderline_ClickHandler"
  8.                         getPressed="StopUnderline_GetPressed"
  9.                         size="large"
  10.                         imageMso="ShapeFillColorPicker"
  11.                         insertBeforeMso="UnderlineGallery"/>  
  12.         </group>
  13.       </tab>
复制代码

在修改Office已有的元素时,使用idMso属性。新创建的“操作”组使用insertAfterMso属性指定该组在“开始”选项卡中的位置。
本例中,toggleButton控件除了需要通常的onAction属性外,还需要getPressed属性来获取按钮的状态。这两个属性对应的回调代码为:
  1.     Public Sub StopUnderline_ClickHandler(ByVal Control As Office.IRibbonControl, ByVal Pressed As Boolean)
  2.         ' 存储当前按钮的状态
  3.         UnderlineState = Pressed

  4.         ' 在屏幕上显示正确的状态
  5.         ribbon.InvalidateControl(Control.Id)
  6.     End Sub

  7.     Public Function StopUnderline_GetPressed(ByVal Control As Office.IRibbonControl) As Boolean
  8.         ' 返回当前的按下状态
  9.         Return UnderlineState
  10.     End Function
复制代码

重利用现有的控件的处理过程与修改现有的控件不同。本例中,必须添加command元素:
  1.   <commands>
  2.     <command idMso="Underline"
  3.              onAction="myUnderline"/>
  4.     <command idMso="FileSaveAsExcel97_2003"
  5.              onAction="FileSaveAs_ClickHandler"/>
  6.   </commands>
复制代码

本示例重利用了两个控件:“开始”选项卡中的“下划线”按钮,以及“Office菜单”中“另存为”菜单的“Excel 97-2003工作簿”项目。本示例重载onAction属性,这是最常执行的重载。然而,应该看看其它需要的回调,例如处理切换按钮时的getPressed。

  1.     Public Sub myUnderline(ByVal Control As Office.IRibbonControl, ByVal Pressed As Boolean, ByRef CancelDefault As Boolean)
  2.         ' 检查下划线控件的状态
  3.         If (UnderlineState) Then
  4.             ' 显示错误消息
  5.             MessageBox.Show("没有允许操作的下划线")

  6.             ' 设置控件使之不能被按下
  7.             Pressed = False

  8.             ' 在屏幕上显示正确的状态
  9.             ribbon.InvalidateControl(Control.Id)

  10.             ' 告诉Office不要执行默认的操作
  11.             CancelDefault = True
  12.         Else
  13.             ' 否则,告诉Office执行默认的操作
  14.             CancelDefault = False
  15.         End If
  16.     End Sub

  17.     Public Sub FileSaveAs_ClickHandler(ByVal Control As Office.IRibbonControl, ByRef CancelDefault As Boolean)
  18.         ' 包含用户的响应
  19.         Dim Response As DialogResult

  20.         ' 要求用户保存文件
  21.         Response = _
  22.            MessageBox.Show("保存为老版本. 确定吗?", _
  23.                            "老文件版本警告", _
  24.                            MessageBoxButtons.YesNo)

  25.         ' 检查响应
  26.         If Response = DialogResult.Yes Then
  27.             CancelDefault = False
  28.         Else
  29.             CancelDefault = True
  30.         End If
  31.     End Sub
复制代码

myUnderline()方法控制“下划线”控件是否按正常状态工作,还是基于用户是否按下“中止下划线功能”按钮而提供其它功能。正常状态工作时,该方法简单地设置CancelDefault为false,告诉Office执行缺省的操作。
此外,当用户按下“中止下划线功能”按钮时,该方法显示一条消息,说明下划线控件不工作了。然后设置Pressed为false,意味着下划线控件不会显示像它正常状态下按下时的操作。接着,重设控件为期望的设置。最后,设置CancelDefault为true。
修改或重利用Office菜单
Office菜单包含许多配置和文件项,不直接与具体操作相关。当希望创建与具体操作无关的项目时,将其添加到OfficeMenu项中。

  1.     <officeMenu>
  2.       <menu idMso="FilePrepareMenu">
  3.         <button id="NewPrepButton"
  4.                 label="我的准备按钮"
  5.                 description="Prepare Time"
  6.                 image="TIME"
  7.                 insertBeforeMso="FileProperties"
  8.                 onAction="NewPrepButton_ClickHandler"/>
  9.       </menu>
  10.       <splitButton idMso="FileSaveAsMenu">
  11.         <menu idMso="FileSaveAsMenu">
  12.           <button id="SayHello"
  13.                   label="问好"
  14.                   description="This button says hello!"
  15.                   image="Colorblk2"
  16.                   onAction="SayHello_ClickHandler"/>
  17.         </menu>
  18.       </splitButton>
  19.     </officeMenu>
复制代码

上述代码演示了如何处理不同的控件,例如本例中的菜单和拆分按钮。相应的回调代码如下:
  1.     Public Sub NewPrepButton_ClickHandler(ByVal Control As Office.IRibbonControl)
  2.         ' 显示一条简单的消息
  3.         MessageBox.Show("准备好了吗")
  4.     End Sub

  5.     Public Sub SayHello_ClickHandler(ByVal Control As Office.IRibbonControl)
  6.         ' 显示一条简单的消息
  7.         MessageBox.Show("Hello")
  8.     End Sub
复制代码

本示例最终效果的部分截图如下:


使用startFromScratch模式创建功能区
要从头开始创建功能区,只需在ribbon元素中使用startFromScratch属性:
    <ribbon startFromScratch="true">



TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 20:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 jiulongpo 于 2012-8-6 22:02 编辑

转自: http://www.excelperfect.com/index.php/2009/12/23/ribbonxstudy55/
细品RibbonX(55):在Visual Studio中开发Excel商务应用程序(1)



大多数人使用Excel进行各种各样的计算,从普通的财务计算到复杂的科学计算。而有些人使用Excel创建演示图形,还有些人甚至使用Excel进行基本的文字处理或数据库需要。简而言之,Excel是一种相当灵活的应用程序,能够帮助你执行广泛的任务。并且,你会发现许多Excel定制是非常特别的。
下面,我们介绍一些定制Excel的应用示例。
许多商务活动使用非标准等式,例如保险公司使用专门的等式来确定费率。另一类非标准等式是一个行业的通用公式不一定在另一个行业使用,例如电路分析是电子工业的一项通用需求,而银行业不需要任何用于此分析的等式。还有一类非标准的等式是提供某种公共利益,例如,可能需要Excel工作表来帮助比较汽车贷款的利益,或者帮助决定家庭的抵押贷款。一些等式能够帮助执行下列任务,决定信yong卡的利息或者为当前的信yong卡选择最好的还款计划。一些特定的工作表可以帮助你转换度量单位,或者确定身体特征例如肥胖指标。
因此,当你遇到要使用这些非标准等式时,就强以考虑在Excel中创建一个非标准等式选项卡,来执行专门的任务。
下面的示例演示如何在同一选项卡中使用多个版本来完成多项非标准等式的计算任务。
下图展示了示例应用程序的一个界面。大多数人首先会注意到最显眼的“开始”组没有包含任何控件。许多开发者习惯使应用程序中的每项功能必须执行一项任务。本例中,“开始”组只是作为起点,使用三个标签提供信息,从而起到提示作用。XML代码如下:
  1.         <group id="Start" label="开始">
  2.           <labelControl id="StartLabel1"
  3.                         label="选择一个"/>
  4.           <labelControl id="StartLabel2"
  5.                         label="开始点"/>
  6.           <labelControl id="StartLabel3"
  7.                         label="用于计算."/>
  8.         </group>
复制代码


这个选项卡按照工作流设计,确保用户从左至右,按顺序执行完整个工作过程。

选择正确的等式
如上图所示,默认选择的是“贷款”切换按钮,当选择“年金”或“有效利率”时,其右侧的组将呈现不同的项目供输入计算数据。当然,这里的“等式”组也可以使用拆分按钮或库的方式。无论使用哪种方式,都必须提供给用户选择等式。本例中,使用的切换按钮在许多情形下都工作得非常好。三个切换按钮的XML代码如下:
  1.         <group id="Equations"
  2.                label="等式">
  3.           <toggleButton id="Loan"
  4.                         label="贷款"
  5.                         onAction="SetupLoan"
  6.                         getPressed="SelectedEquation"/>
  7.           <toggleButton id="Annuity"
  8.                         label="年金"
  9.                         onAction="SetupAnnuity"
  10.                         getPressed="SelectedEquation"/>
  11.           <toggleButton id="EffectiveRate"
  12.                         label="有效利率"
  13.                         onAction="SetupEF"
  14.                         getPressed="SelectedEquation"/>
  15.         </group>
复制代码

当用户单击某个切换按钮时,应用onAction属性提供的方法:
  1.     Public Sub SetupLoan(ByRef control As Office.IRibbonControl, ByVal pressed As Boolean)
  2.         ' 设置计算类型
  3.         CalcType = "Loan"

  4.         ' 设置按下状态
  5.         pressed = True

  6.         ' 使整个功能区无效
  7.         ribbon.Invalidate()
  8.     End Sub

  9.     Public Sub SetupAnnuity(ByRef control As Office.IRibbonControl, ByVal pressed As Boolean)
  10.         ' 设置计算类型
  11.         CalcType = "Annuity"

  12.         ' 设置按下状态
  13.         pressed = True

  14.         ' 使整个功能区无效
  15.         ribbon.Invalidate()
  16.     End Sub

  17.     Public Sub SetupEF(ByRef control As Office.IRibbonControl, ByVal pressed As Boolean)
  18.         ' 设置计算类型
  19.         CalcType = "Effective Rate"

  20.         ' 设置按下状态
  21.         pressed = True

  22.         ' 使整个功能区无效
  23.         ribbon.Invalidate()
  24.     End Sub
复制代码

变量CalcType是一个字符串型的全局变量,用来追踪所使用的等式。这个变量决定应用程序的许多操作,甚至选项卡的最终外观。
设置pressed为true,改变目标控件的状态,但不会影响选项卡中的其他控件,而该应用程序在用户选择不同的等式时会更改许多控件,因此需要调用ribbon.Invalidate()来使整个功能区无效,从而重绘功能区。
然后,Excel调用getPressed属性指向的方法。本例中,所有三个切换按钮都使用相同的方法,因为它们实质上都执行相同的任务。SelectedEquation()方法的代码如下:
  1.     Public Function SelectedEquation(ByRef control As Office.IRibbonControl) As Boolean
  2.         ' 基于当前的等式确定按下状态
  3.         Select Case CalcType
  4.             Case "Loan"
  5.                 If control.Id = "Loan" Then
  6.                     Return True
  7.                 Else
  8.                     Return False
  9.                 End If
  10.             Case "Annuity"
  11.                 If control.Id = "Annuity" Then
  12.                     Return True
  13.                 Else
  14.                     Return False
  15.                 End If
  16.             Case "Effective Rate"
  17.                 If control.Id = "EffectiveRate" Then
  18.                     Return True
  19.                 Else
  20.                     Return False
  21.                 End If
  22.             Case Else
  23.                 Return False
  24.         End Select
  25.     End Function
复制代码

基于变量CalcType的值,代码使用Case语句来选择计算类型,并给调用者返回True或False。返回值确定是否按下了该控件。
定义多个功能区元素
本例虽然只是自定义设计了单个选项卡,但是多重设计给应用程序在单个选项卡中提供多个功能的外观界面。当用户选择特定的等式时,选项卡内容改变以反映该等式的需求。跨功能区的控件让用户从左移到右以解决特定的问题,而工作表显示用户输入的项目的结果,下图显示了选择一个等式并输入数据后的结果。

注:三个等式都是相当简单的财务等式,Excel已经提供了这些工作表函数:PMT、FV、EFFECT。由于三个函数所需要的输入项不同,因此功能区中设计的控件也不同。例如,计算FV函数的功能区界面如下(在“等式”组中选择“年金”):

下面列出了选项卡中呈现不同视图所需要的XML:
  1.         <group id="DataEntry" getLabel="GetDataEntryLabel">
  2.           <editBox id="Rate"
  3.                    label="利率"
  4.                    onChange="GetRateText"/>
  5.           <dropDown id="Term"
  6.                     label="期数"
  7.                     getVisible="TermVisible"
  8.                     getItemCount="TermCount"
  9.                     getItemID="TermItemID"
  10.                     getItemLabel="TermItemLabel"
  11.                     onAction="GetSelectedTerm"/>
  12.           <editBox id="Payment"
  13.                    label="期初付款"
  14.                    getVisible="PaymentVisible"
  15.                    onChange="GetPaymentText"/>
  16.           <editBox id="Amount"
  17.                    getLabel="AmountLabel"
  18.                    getVisible="AmountVisible"
  19.                    onChange="GetAmountText"/>
  20.         </group>
复制代码

注意,本应用程序如何使用不同的属性来在不同的情形下看到每个所需要的控件。“利率”控件出现在每个应用程序中,因此不需要使用getVisible属性。其他的控件都有getVisible属性,根据当前等式选择决定该控件是否出现在功能区。各控件的getVisible属性对应的回调代码如下:
  1.     Public Function TermVisible(ByRef control As Office.IRibbonControl) As Boolean
  2.         ' 应用程序不会使用该字段进行有效利率计算
  3.         If CalcType = "Effective Rate" Then
  4.             Return False
  5.         Else
  6.             Return True
  7.         End If
  8.     End Function

  9.     Public Function PaymentVisible(ByRef control As Office.IRibbonControl) As Boolean
  10.         ' 当处理年金计算时应用程序仅使用该字段
  11.         If CalcType = "Annuity" Then
  12.             Return True
  13.         Else
  14.             Return False
  15.         End If
  16.     End Function

  17.     Public Function AmountVisible(ByRef control As Office.IRibbonControl) As Boolean
  18.         ' 应用程序不会使用该字段进行有效利率计算
  19.         If CalcType = "Effective Rate" Then
  20.             Return False
  21.         Else
  22.             Return True
  23.         End If
  24.     End Function
复制代码

取决于变量CalcType,在功能区中呈现相应的控件。这是一项编程技巧,在代码中仅使用一个变量来控制应用程序的外观。
比较上面的两个图,你会发现在选择不同的切换按钮后,其右侧组中的标签不同,这是由getLabel属性来实现的:
  1.     Public Function GetDataEntryLabel(ByRef control As Office.IRibbonControl) As String
  2.         ' 通过计算类型的选择决定组标签
  3.         Select Case CalcType
  4.             Case "Loan"
  5.                 Return "输入贷款信息"
  6.             Case "Annuity"
  7.                 Return "输入年金信息"
  8.             Case "Effective Rate"
  9.                 Return "输入有效利率信息"
  10.             Case Else
  11.                 Return "没有实现!"
  12.         End Select
  13.     End Function

  14.     Public Function AmountLabel(ByRef control As Office.IRibbonControl) As String
  15.         ' 通过计算类型的选择决定数量标签
  16.         ' 由于有效利率计算不使用该控件,因此应用程序不给它提供标签
  17.         Select Case CalcType
  18.             Case "Loan"
  19.                 Return "贷款金额"
  20.             Case "Annuity"
  21.                 Return "每月年金付款"
  22.             Case Else
  23.                 Return "没有实现!"
  24.         End Select
  25.     End Function
复制代码

应用程序根据选择调整控件及显示。注意,应该小心使用ribbon.Invalidate(),最好仅在应用程序中包含一次对该方法的调用,否则可能会引发很多问题。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 20:58 | 显示全部楼层
接 细品RibbonX(55):在Visual Studio中开发Excel商务应用程序(1)


获取在功能区中输入的数据
功能区不允许任何直接的交互,因此不能直接获取用户输入到功能区控件中的信息。但如何获取这些信息呢?仍然要使用回调。大多数控件提供了onChange属性,能够用于发现控件数据的变化,但下拉列表例外,需要使用onAction属性发现选项的变化。下面的代码显示了onChange属性的实现及Term控件的onAction属性的实现。
  1.     Public Sub GetRateText(ByRef control As Office.IRibbonControl, ByVal text As String)
  2.         ' 保存文本的输入值
  3.         Rate = Int32.Parse(text)
  4.     End Sub

  5.     Public Sub GetSelectedTerm(ByRef control As Office.IRibbonControl, ByVal selectedId As String, ByVal selectedIndex As Int32)
  6.         ' 存储默认值
  7.         Term = 0

  8.         ' 保存贷款项
  9.         If CalcType = "Loan" Then
  10.             Select Case selectedIndex
  11.                 Case 0
  12.                     Term = 10
  13.                 Case 1
  14.                     Term = 15
  15.                 Case 2
  16.                     Term = 20
  17.                 Case 3
  18.                     Term = 30
  19.             End Select
  20.         End If

  21.         ' 保存年金项
  22.         If CalcType = "Annuity" Then
  23.             Select Case selectedIndex
  24.                 Case 0
  25.                     Term = 5
  26.                 Case 1
  27.                     Term = 7
  28.                 Case 2
  29.                     Term = 10
  30.                 Case 3
  31.                     Term = 15
  32.                 Case 4
  33.                     Term = 20
  34.             End Select
  35.         End If
  36.     End Sub

  37.     Public Sub GetPaymentText(ByRef control As Office.IRibbonControl, ByVal text As String)
  38.         ' 保存文本的输入值
  39.         Payment = Int32.Parse(text)
  40.     End Sub

  41.     Public Sub GetAmountText(ByRef control As Office.IRibbonControl, ByVal text As String)
  42.         ' 保存文本的输入值
  43.         Amount = Int32.Parse(text)
  44.     End Sub
复制代码

使用Int32.Parse()将文本框中输入的数据值转换为数字,如果用户在文本框中输入的不是数字,那么Int32.Parse()方法将输出0。
执行计算
需要两段代码。第一段代码响应功能区中单击“开始计算”按钮的操作;第二段代码转换所有数据为字符串,然后在执行计算之前将它们放置到Excel中。
  1.     Public Sub Calculate(ByRef control As Office.IRibbonControl)
  2.         ' 选择计算并调用
  3.         Select Case CalcType
  4.             Case "Loan"
  5.                 Globals.ThisAddIn.CalculatePMT(Rate, Term, Amount)
  6.             Case "Annuity"
  7.                 Globals.ThisAddIn.CalculateFV(Rate, Term, Payment, Amount)
  8.             Case "Effective Rate"
  9.                 Globals.ThisAddIn.CalculateEFFECT(Rate)
  10.         End Select
  11.     End Sub
复制代码

因为应用程序已经在全局变量中放置了所需的数据,因此所有需要做的就是调用合适的加载项函数并提供必需的输入。实际上,计算需要构建与Excel公式命令相同的字符串。下面的代码显示了这些计算函数:
  1.     ' 计算贷款数量
  2.     Public Sub CalculatePMT(ByVal Rate As Double, ByVal NPer As Int32, ByVal PV As Int32)
  3.         ' 计算利率
  4.         Dim PeriodicRate As Double = (Rate / 100) / 12

  5.         ' 计算期数
  6.         Dim Periods As Int32 = NPer * 12

  7.         ' 执行计算
  8.         Application.ActiveWindow.ActiveCell.Cells(1, 1) = _
  9.               "=PMT(" + PeriodicRate.ToString() + "," + _
  10.               Periods.ToString() + "," + PV.ToString() + ",0,0)"
  11.         Application.ActiveWindow.ActiveCell.Calculate()
  12.     End Sub

  13.     ' 计算年金数量
  14.     Public Sub CalculateFV(ByVal Rate As Double, ByVal NPer As Int32, ByVal PMT As Int32, ByVal PV As Int32)
  15.         ' 计算利率
  16.         Dim PeriodicRate As Double = (Rate / 100) / 12

  17.         ' 计算期数
  18.         Dim Periods As Int32 = NPer * 12

  19.         ' 执行计算
  20.         Application.ActiveWindow.ActiveCell.Cells(1, 1) = _
  21.            "=FV(" + PeriodicRate.ToString() + "," + _
  22.            Periods.ToString() + "," + PMT.ToString() + "," + _
  23.            PV.ToString() + ",0)"
  24.         Application.ActiveWindow.ActiveCell.Calculate()
  25.     End Sub

  26.     ' 计算有效利率
  27.     Public Sub CalculateEFFECT(ByVal Rate As Double)
  28.         ' 计算利率
  29.         Dim PeriodicRate As Double = Rate / 100

  30.         ' 执行计算
  31.         Application.ActiveWindow.ActiveCell.Cells(1, 1) = _
  32.            "=EFFECT(" + PeriodicRate.ToString() + ",12)"
  33.         Application.ActiveWindow.ActiveCell.Calculate()
  34.     End Sub
复制代码

在工作表中简单地添加文本,不能确保发生计算,因此代码的末尾调用Application.ActiveWindow.ActiveCell.Calculate()来执行计算。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 21:02 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-6 22:07 编辑

转自: http://www.excelperfect.com/index.php/2009/12/24/ribbonxstudy56/
细品RibbonX(56):使用Visual Studio开发Excel商务应用程序(2)


让我们接着上文介绍,继续丰富已开发的应用程序。
下面,让应用程序执行更丰富的计算。例如,可能想计算一定范围内的抵押值,而不是单个值,以便为客户提供多种选择。在上例中,我们能够指导用户输入不同的值,执行相同的计算多次,然而这种方式往往会花费很多时间。因此,需要使用不同的方法使应用程序更好的执行任务。
较好的解决方案是使用对话框来输入计算范围,而使用对话框启动器来访问对话框。添加了对话框启动器的新界面如下图。

相应的XML代码如下:
  1.           <dialogBoxLauncher>
  2.             <button id="RedundantCalcsLaunch"
  3.                     screentip="多重计算"
  4.                     supertip="多次执行同一公式的计算."
  5.                     onAction="DisplayRedundantCalc"/>
  6.           </dialogBoxLauncher>
复制代码

要实现本例的功能,需要:

  • 为每个等式创建不同的对话框,需要创建3个对话框。
  • 代码必须区分不同的等式。
  • 任何用于与用户交互的对话框需要与功能区中的信息相链接,功能区控件同样需要从对话框中更新。
  • 代码对所需的ThisAddIn方法作多次调用,填充单元格区域中的单元格。
  • 取决于你的需求,可以提供额外的信息,例如列标题和行标题,使输出更易理解。
设计对话框
本例限定用户选择两个范围,这样可以在表中显示输出。设计的“选择贷款范围”窗体如下图所示。

“选择年金范围”窗体设计如下图所示。

“选择有效利率范围”窗体设计如下图所示。

注:设计功能区的目的是减少复杂性。如果由于一些多余的设计选择而增加了更多的复杂性,那么用户将不会感受到使用功能区的任何好处。
创建计算代码
执行一次或多次计算实质上是相同的,但稍有不同。代码如下:
  1.     ' 计算贷款金额并包括位置数据
  2.     Public Sub CalculatePMT(ByVal Rate As Double, ByVal NPer As Int32, ByVal PV As Int32, ByVal X As Int32, ByVal Y As Int32)
  3.         ' 计算利率.
  4.         Dim PeriodicRate As Double = (Rate / 100) / 12

  5.         ' 计算期数.
  6.         Dim Periods As Int32 = NPer * 12

  7.         ' 执行计算.
  8.         Application.ActiveWindow.ActiveCell.Cells(X, Y) = _
  9.               "=PMT(" + PeriodicRate.ToString() + "," + _
  10.               Periods.ToString() + "," + PV.ToString() + ",0,0)"
  11.         Application.ActiveWindow.ActiveCell.Calculate()
  12.     End Sub

  13.     ' 计算年金金额并包括位置数据.
  14.     Public Sub CalculateFV(ByVal Rate As Double, ByVal NPer As Int32, ByVal PMT As Int32, ByVal PV As Int32, ByVal X As Int32, ByVal Y As Int32)
  15.         ' 计算利率.
  16.         Dim PeriodicRate As Double = (Rate / 100) / 12

  17.         ' 计算期数.
  18.         Dim Periods As Int32 = NPer * 12

  19.         ' 执行计算.
  20.         Application.ActiveWindow.ActiveCell.Cells(X, Y) = _
  21.            "=FV(" + PeriodicRate.ToString() + "," + _
  22.            Periods.ToString() + "," + PMT.ToString() + "," + _
  23.            PV.ToString() + ",0)"
  24.         Application.ActiveWindow.ActiveCell.Calculate()
  25.     End Sub

  26.     ' 计算有效利率并包括数据位置.
  27.     Public Sub CalculateEFFECT(ByVal Rate As Double, ByVal X As Int32, ByVal Y As Int32)
  28.         ' 计算利率.
  29.         Dim PeriodicRate As Double = (Rate / 100) / 12

  30.         ' 执行计算.
  31.         Application.ActiveWindow.ActiveCell.Cells(X, Y) = _
  32.            "=EFFECT(" + PeriodicRate.ToString() + ",12)"
  33.         Application.ActiveWindow.ActiveCell.Calculate()

  34.         ' 格式单元格.
  35.         Dim ThisRange As Excel.Range
  36.         ThisRange = Application.Cells(X, Y)
  37.         ThisRange.NumberFormat = "0.0000%"
  38.     End Sub
复制代码

可以将上述代码与前文中相应的示例代码比较。最大的不同在于,添加了两个额外的位置参数,使得可以在任何位置放置输出的值。
定义对现有数据的链接
为功能区应用程序创建对话框时,需要创建对话框与合适的功能区控件的链接,否则两个元素将不同步并且应用程序会显示错误的数据。要创建链接,需要:

  • 从功能区中获取信息
  • 在功能区中设置信息
  • 在XML中定义需要的回调
创建链接的XML代码如下:
  1.           <editBox id="Rate"
  2.                    label="有效利率"
  3.                    onChange="GetRateText"
  4.                    getText="SetRateText"/>
  5.           <dropDown id="Term"
  6.                     label="期数"
  7.                     getVisible="TermVisible"
  8.                     getItemCount="TermCount"
  9.                     getItemID="TermItemID"
  10.                     getItemLabel="TermItemLabel"
  11.                     onAction="GetSelectedTerm"
  12.                     getSelectedItemIndex="SetSelectedTerm"/>
  13.           <editBox id="Payment"
  14.                    label="期初支付"
  15.                    getVisible="PaymentVisible"
  16.                    onChange="GetPaymentText"
  17.                    getText="SetPaymentText"/>
  18.           <editBox id="Amount"
  19.                    getLabel="AmountLabel"
  20.                    getVisible="AmountVisible"
  21.                    onChange="GetAmountText"
  22.                    getText="SetAmountText"/>
复制代码

用于实现链接的属性取决于控件类型。大多数控件使用getText属性,从应用程序中提取信息并在控件中显示(例如,本例中的文本框);一些控件需要使用其它属性,例如本例中的getSelectedItemIndex属性。回调代码如下:
  1.     Public Function SetRateText(ByVal control As Office.IRibbonControl) As String
  2.         ' 返回Rate变量的当前值.
  3.         Return Rate.ToString()
  4.     End Function

  5.     Public Function SetSelectedTerm(ByVal control As Office.IRibbonControl) As Int32
  6.         ' 设置贷款项.
  7.         If CalcType = "Loan" Then
  8.             Select Case Term
  9.                 Case 10
  10.                     Return 0
  11.                 Case 15
  12.                     Return 1
  13.                 Case 20
  14.                     Return 2
  15.                 Case 30
  16.                     Return 3
  17.             End Select
  18.         End If

  19.         ' 设置年金项.
  20.         If CalcType = "Annuity" Then
  21.             Select Case Term
  22.                 Case 5
  23.                     Return 0
  24.                 Case 7
  25.                     Return 1
  26.                 Case 10
  27.                     Return 2
  28.                 Case 15
  29.                     Return 3
  30.                 Case 20
  31.                     Return 4
  32.             End Select
  33.         End If

  34.         ' 提供缺省的返回值.
  35.         Return 0
  36.     End Function

  37.     Public Function SetPaymentText(ByVal control As Office.IRibbonControl) As String
  38.         ' 返回Payment变量的当前值.
  39.         Return Payment.ToString()
  40.     End Function

  41.     Public Function SetAmountText(ByVal control As Office.IRibbonControl) As String
  42.         ' 返回Amount变量的当前值.
  43.         Return Amount.ToString()
  44.     End Function
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 21:05 | 显示全部楼层
接 细品RibbonX(56):使用Visual Studio开发Excel商务应用程序(2)


执行更丰富的计算
对话框启动器dialogBoxLauncher仅有一个onAction属性,因此任何计算的开始点都是该属性指向的方法DisplayRedundantCalc。当然,由于每个等式都不相同,因此都需要采用某种方式单独实现调用。
  1.     Public Sub DisplayRedundantCalc(ByVal control As Office.IRibbonControl)
  2.         ' 选择正确的过程.
  3.         Select Case CalcType
  4.             Case "Loan"
  5.                 PerformLoanRangeCalc()
  6.             Case "Annuity"
  7.                 PerformAnnuityRangeCalc()
  8.             Case "Effective Rate"
  9.                 PerformEffectiveRateRangeCalc()
  10.         End Select
  11.     End Sub
复制代码

代码根据所选择的项目不同,调用不同的对话框计算程序。
  1.     Private Sub PerformLoanRangeCalc()
  2.         ' 创建对话框.
  3.         Dim ThisSelection As LoanRangeSelection = New LoanRangeSelection()

  4.         ' 在对话框中添加已存在的变量.
  5.         ThisSelection.txtIntBeg.Text = Rate.ToString()
  6.         ThisSelection.txtIntEnd.Text = Rate.ToString()
  7.         ThisSelection.txtIntInc.Text = "1"
  8.         ThisSelection.cbTermBeg.Text = Term.ToString()
  9.         ThisSelection.cbTermEnd.Text = Term.ToString()
  10.         ThisSelection.txtLoanAmt.Text = Amount.ToString()

  11.         ' 显示对话框并且如果用户单击确定则处理数据.
  12.         If ThisSelection.ShowDialog() = DialogResult.OK Then
  13.             ' 转换数据值为Int32egers.
  14.             Rate = Int32.Parse(ThisSelection.txtIntBeg.Text)
  15.             Term = Int32.Parse(ThisSelection.cbTermBeg.Text)
  16.             Amount = Int32.Parse(ThisSelection.txtLoanAmt.Text)

  17.             ' 创建本地变量,包括计算数据.
  18.             Dim EndRate As Int32 = Int32.Parse(ThisSelection.txtIntEnd.Text)
  19.             Dim IncRate As Int32 = Int32.Parse(ThisSelection.txtIntInc.Text)
  20.             Dim EndTerm As Int32 = Int32.Parse(ThisSelection.cbTermEnd.Text)

  21.             ' 更新功能区中的值.
  22.             ribbon.InvalidateControl("Rate")
  23.             ribbon.InvalidateControl("Term")
  24.             ribbon.InvalidateControl("Amount")

  25.             ' 添加初始标题.
  26.             Globals.ThisAddIn.SetHeading("利息", 1, 1)

  27.             ' 执行计算.
  28.             Dim i As Int32
  29.             For i = Rate To EndRate

  30.                 ' 计算X和Y的位置值.
  31.                 Dim X As Int32 = i + 2 - Rate
  32.                 Dim Y As Int32 = 2

  33.                 ' 打印Int32erest利率.
  34.                 Globals.ThisAddIn.SetHeading(i.ToString() + "%", X, 1)

  35.                 ' 使用一系列if语句确定年设置.
  36.                 If Term = 10 And EndTerm >= 10 Then
  37.                     ' 执行计算.
  38.                     Globals.ThisAddIn.CalculatePMT(i, 10, Amount, X, Y)

  39.                     ' 打印标题.
  40.                     Globals.ThisAddIn.SetHeading("10年", 1, Y)

  41.                     ' 如果已经使用则增加Y.
  42.                     Y = Y + 1
  43.                 End If

  44.                 If Term <= 15 And EndTerm >= 15 Then
  45.                     ' 执行计算.
  46.                     Globals.ThisAddIn.CalculatePMT(i, 15, Amount, X, Y)

  47.                     ' 打印标题.
  48.                     Globals.ThisAddIn.SetHeading("15年", 1, Y)

  49.                     ' 如果已经使用则增加Y.
  50.                     Y = Y + 1
  51.                 End If

  52.                 If Term <= 20 And EndTerm >= 20 Then
  53.                     ' 执行计算.
  54.                     Globals.ThisAddIn.CalculatePMT(i, 20, Amount, X, Y)

  55.                     ' 打印标题.
  56.                     Globals.ThisAddIn.SetHeading("20年", 1, Y)

  57.                     ' 如果已经使用则增加Y.
  58.                     Y = Y + 1
  59.                 End If

  60.                 If Term <= 30 And EndTerm >= 30 Then
  61.                     ' 执行计算.
  62.                     Globals.ThisAddIn.CalculatePMT(i, 30, Amount, X, Y)

  63.                     ' 打印标题.
  64.                     Globals.ThisAddIn.SetHeading("30年", 1, Y)

  65.                     ' 如果已经使用则增加Y.
  66.                     Y = Y + 1
  67.                 End If
  68.             Next
  69.         End If
  70.     End Sub

  71.     Private Sub PerformAnnuityRangeCalc()
  72.         ' 创建对话框.
  73.         Dim ThisSelection As AnnuityRangeSelection = New AnnuityRangeSelection()

  74.         ' 在对话框中添加已存在的变量.
  75.         ThisSelection.txtIntBeg.Text = Rate.ToString()
  76.         ThisSelection.txtIntEnd.Text = Rate.ToString()
  77.         ThisSelection.txtIntInc.Text = "1"
  78.         ThisSelection.cbTermBeg.Text = Term.ToString()
  79.         ThisSelection.cbTermEnd.Text = Term.ToString()
  80.         ThisSelection.txtLoanAmt.Text = Amount.ToString()
  81.         ThisSelection.txtPayment.Text = Payment.ToString()

  82.         ' 显示对话框并且如果用户单击确定则处理数据.
  83.         If ThisSelection.ShowDialog() = DialogResult.OK Then

  84.             ' 转换数据值为Int32egers.
  85.             Rate = Int32.Parse(ThisSelection.txtIntBeg.Text)
  86.             Term = Int32.Parse(ThisSelection.cbTermBeg.Text)
  87.             Amount = Int32.Parse(ThisSelection.txtLoanAmt.Text)
  88.             Payment = Int32.Parse(ThisSelection.txtPayment.Text)

  89.             ' 创建本地变量以包含计算数据.
  90.             Dim EndRate As Int32 = Int32.Parse(ThisSelection.txtIntEnd.Text)
  91.             Dim IncRate As Int32 = Int32.Parse(ThisSelection.txtIntInc.Text)
  92.             Dim EndTerm As Int32 = Int32.Parse(ThisSelection.cbTermEnd.Text)

  93.             ' 更新功能区中的值.
  94.             ribbon.InvalidateControl("Rate")
  95.             ribbon.InvalidateControl("Term")
  96.             ribbon.InvalidateControl("Amount")
  97.             ribbon.InvalidateControl("Payment")

  98.             ' 添加初始标题.
  99.             Globals.ThisAddIn.SetHeading("利息", 1, 1)

  100.             ' 执行计算.
  101.             Dim i As Int32
  102.             For i = Rate To EndRate

  103.                 ' 计算X和Y的位置值.
  104.                 Dim X As Int32 = i + 2 - Rate
  105.                 Dim Y As Int32 = 2

  106.                 ' 打印Int32erest利率.
  107.                 Globals.ThisAddIn.SetHeading(i.ToString() + "%", X, 1)

  108.                 ' 使用一系列if语句决定年设置.
  109.                 If Term = 5 And EndTerm >= 5 Then
  110.                     ' 执行计算.
  111.                     Globals.ThisAddIn.CalculateFV(i, 5, Amount, Payment, X, Y)

  112.                     ' 打印标题.
  113.                     Globals.ThisAddIn.SetHeading("5年", 1, Y)

  114.                     ' 如果已经使用则增加Y.
  115.                     Y = Y + 1
  116.                 End If

  117.                 If Term <= 7 And EndTerm >= 7 Then
  118.                     ' 执行计算.
  119.                     Globals.ThisAddIn.CalculateFV(i, 7, Amount, Payment, X, Y)

  120.                     ' 打印标题.
  121.                     Globals.ThisAddIn.SetHeading("7年", 1, Y)

  122.                     ' 如果已经使用则增加Y.
  123.                     Y = Y + 1
  124.                 End If

  125.                 If Term <= 10 And EndTerm >= 10 Then
  126.                     ' 执行计算.
  127.                     Globals.ThisAddIn.CalculateFV(i, 10, Amount, Payment, X, Y)

  128.                     ' 打印标题.
  129.                     Globals.ThisAddIn.SetHeading("10年", 1, Y)

  130.                     ' 如果已经使用则增加Y.
  131.                     Y = Y + 1
  132.                 End If

  133.                 If Term <= 15 And EndTerm >= 15 Then
  134.                     ' 执行计算.
  135.                     Globals.ThisAddIn.CalculateFV(i, 15, Amount, Payment, X, Y)

  136.                     ' 打印标题.
  137.                     Globals.ThisAddIn.SetHeading("15年", 1, Y)

  138.                     ' 如果已经使用则增加Y.
  139.                     Y = Y + 1
  140.                 End If

  141.                 If Term <= 20 And EndTerm >= 20 Then
  142.                     ' 执行计算.
  143.                     Globals.ThisAddIn.CalculateFV(i, 20, Amount, Payment, X, Y)

  144.                     ' 打印标题.
  145.                     Globals.ThisAddIn.SetHeading("20年", 1, Y)

  146.                     ' 如果已经使用则增加Y.
  147.                     Y = Y + 1
  148.                 End If
  149.             Next
  150.         End If
  151.     End Sub

  152.     Private Sub PerformEffectiveRateRangeCalc()
  153.         ' 创建对话框.
  154.         Dim ThisSelection As EffectiveRateRangeSelection = New EffectiveRateRangeSelection()

  155.         ' 在对话框中添加已存在的变量.
  156.         ThisSelection.txtIntBeg.Text = Rate.ToString()
  157.         ThisSelection.txtIntEnd.Text = Rate.ToString()
  158.         ThisSelection.txtIntInc.Text = "1"

  159.         ' 显示对话框并且如果用户单击确定则处理数据.
  160.         If ThisSelection.ShowDialog() = DialogResult.OK Then

  161.             ' 转换数据值为Int32egers.
  162.             Rate = Int32.Parse(ThisSelection.txtIntBeg.Text)

  163.             ' 创建本地变量以包含计算数据.
  164.             Dim EndRate As Int32 = Int32.Parse(ThisSelection.txtIntEnd.Text)
  165.             Dim IncRate As Int32 = Int32.Parse(ThisSelection.txtIntInc.Text)

  166.             ' 更新功能区中的值.
  167.             ribbon.InvalidateControl("Rate")

  168.             ' 添加初始标题.
  169.             Globals.ThisAddIn.SetHeading("利息", 1, 1)
  170.             Globals.ThisAddIn.SetHeading("有效利率", 1, 2)

  171.             ' 执行计算.
  172.             Dim i As Int32
  173.             For i = Rate To EndRate
  174.                 ' 计算X和Y位置值.
  175.                 Dim X As Int32 = i + 2 - Rate

  176.                 ' 打印Int32erest利率.
  177.                 Globals.ThisAddIn.SetHeading(i.ToString() + "%", X, 1)

  178.                 ' 执行计算.
  179.                 Globals.ThisAddIn.CalculateEFFECT(i, X, 2)
  180.             Next
  181.         End If
  182.     End Sub
复制代码

考虑数据识别需求
对输出结果添加有意义的标题。当执行多重计算时,为使数据意义明确,必须提供标题。代码如下:
  1.     Public Sub SetHeading(ByVal Heading As String, ByVal X As Int32, ByVal Y As Int32)
  2.         ' 添加所需要的标题.
  3.         Application.ActiveWindow.ActiveCell.Cells(X, Y) = Heading
  4.     End Sub
复制代码

现在,一切准备就绪。运行代码,在窗体中选择区域,输入相应数据,得到的输出结果如下图所示。


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 21:08 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-6 22:08 编辑

转自: http://www.excelperfect.com/index.php/2009/12/24/ribbonxstudy57/
细品RibbonX(57):示例—在Excel 2007的功能区中添加中文选项卡和控件


由于Office 2007 CustomUI Editor并不支持中文,因此不能使用这个方便的工具来定制Ribbon,只能使用修改Office 2007文件格式的方法来解决了。此外,还可以使用Visual Studio来自定义中文选项卡。
步骤1 在桌面上创建一个名为customUI的文件夹。
步骤2 打开记事本,并在其中输入下面的XML代码:
  1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  2.   <ribbon>
  3.     <tabs>
  4.       <tab id="rxtabCustom"
  5.            label="我自已的选项卡"
  6.            insertBeforeMso="TabHome">
  7.           <group idMso="GroupFont"/>
  8.           <group idMso="GroupZoom"/>
  9.           <group id="myGroup" label="我的组">
  10.               <button id="b1"
  11.                       imageMso="HyperlinkInsert"
  12.                       size="large"
  13.                       label="启动网站"
  14.                       onAction="surf"/>
  15.               <button id="b2"
  16.                       imageMso="HappyFace"
  17.                       label="微笑图标"
  18.                       onAction="smile"/>
  19.               <button id="b3"
  20.                       imageMso="FormatPainter"
  21.                       label="格式刷图标"
  22.                       onAction="paint"/>
  23.               <button id="b4"
  24.                       imageMso="AutoFilterClassic"
  25.                       label="筛选图标"
  26.                       onAction="filter"/>
  27.            </group>
  28.      </tab>
  29.    </tabs>
  30.   </ribbon>
  31. </customUI>
复制代码

该XML文件在Excel的“开始”选项卡前创建了一个名为“我自已的选项卡”的选项卡,并添加了三个组,前两个为Excel内置的组“字体”和“显示比例”,第三个为名为“我的组”的自定义组,其中包括四个自定义的按钮“启动网站”、“微笑图标”、“格式刷图标”和“筛选图标”,并分别定义了onAction属性。
步骤3 将该文件命名为customUI并以.xml为扩展名保存在customUI文件夹中,并关闭该文件。在保存时注意选择“编码”下拉框中的编码为UTF-8,如下图所示。

步骤4 在桌面上新建一个启用宏的Excel文件,并命名为MyCustomUI.xlsm。因为在自定义的XML中,包含了产生回调的onAction属性,所以创建的Excel文件需要启用宏。
步骤5 在MyCustomUI.xlsm中,按Alt+F11组合键打开VBE,并插入一个标准模块,添加下面的代码供回调使用:

  1. 'Callback for b1 onAction
  2. Sub surf(control As IRibbonControl)
  3.     ActiveWorkbook.FollowHyperlink _
  4.       Address:="http://www.excelperfect.com", _
  5.       NewWindow:=True
  6. End Sub
  7. 'Callback for b2 onAction
  8. Sub smile(control As IRibbonControl)
  9.     MsgBox "您单击了微笑图标!呵呵..."
  10. End Sub
  11. 'Callback for b3 onAction
  12. Sub paint(control As IRibbonControl)
  13.     MsgBox "您单击了格式刷图标!"
  14. End Sub

  15. 'Callback for b4 onAction
  16. Sub filter(control As IRibbonControl)
  17.     MsgBox "您单击了筛选图标!"
  18. End Sub
复制代码

步骤6 关闭工作簿MyCustomUI.xlsm。
步骤7 在MyCustomUI.xlsm图标上单击右键,选择“重命名”,在文件名后添加“.zip”扩展名,使其变为一个压缩文件。如下图所示。

步骤8 双击该压缩文件,打开压缩包,将customUI文件夹拖到该压缩包中,如下图所示。

步骤9 将压缩包中的_rels文件夹拖至桌面。
步骤10 打开桌面中的_rels文件夹,然后用记事本打开其中的.rels文件,如下图所示。

步骤11 在.rels文件的最后一个之前,添加下面的XML:
  1. <Relationship Id="customUIRelID" Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="customUI/customUI.xml"/>
复制代码

步骤12 保存该.rels文件并关闭。
步骤13 将修改后的_rels文件夹拖回MyCustomUI压缩包中。如果出现提示,则选择是,覆盖原文件。关闭压缩包。
步骤14 将MyCustomUI.xlsm.zip的.zip扩展名删除。
步骤15 双击MyCustomUI.xlsm文件,打开工作簿,此时在Excel内置选项卡“开始”的前面添加了一个自定义选项卡,在该选项卡中添加了两个内置组和一个自定义组,如下图所示。

看看吧,都是中文的,成功!

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 21:12 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-6 22:09 编辑

转自: http://www.excelperfect.com/index.php/2009/12/25/ribbonxstudy58/
细品RibbonX(58):示例—创建动态的Ribbon库


Sam Radakovitz曾在Excel团队博客中发表过一篇文章,介绍了如何创建动态的Ribbon库,即如何通过RibbonX和VBA放置动态的图形图像到功能区库中,在该文中,作者创建了两个库:一个是带有标签的小图表图像,一个是大的图像。如图1和图2所示。

图1:小图形库

图2:大图形库
带有完整的RibbonX和VBA代码的示例文档见:

下面对其进行简单的介绍。
RibbonX
先从RibbonX代码开始。RibbonX简单的解释就是定义Ribbon外观的XML。对于本例,RibbonX将定义所放置的两个库的位置、库按钮以及在库中的项目,RibbonX已存在于文档中,必须使用工具来获取文档中的RibbonX代码,您可以使用Office 2007 Custom UI Editor。打开“Office 2007 Custom UI Editor”,然后打开“Charts_In_Ribbon.xlsm”文档,其中的XML代码如下:
  1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="ribbonLoaded">
  2.   <ribbon>
  3.     <tabs>
  4.     <tab idMso="TabHome">
  5.           <group id="grpChartsInRibbon" label="Charts">

  6.                  <gallery id="galSmallCharts"
  7.                           label="Small Charts"
  8.                           size="large"
  9.                           showLabel="true"
  10.                           imageMso="ChartPlacement"
  11.                           columns="1"
  12.                           rows="5"
  13.                           itemHeight="90"
  14.                           itemWidth="150"
  15.                           supertip="Small pictures of your charts!"
  16.                           getItemCount="getItemCount"
  17.                           getItemID="getItemID"
  18.                           getItemImage="getItemImage"  
  19.                           getItemSupertip="getItemSupertip"
  20.                           getItemLabel="getItemLabel"
  21.                           onAction="galRefreshAction"/>

  22.                  <gallery id="galBigCharts"
  23.                           label="Big Charts"
  24.                           size="large"
  25.                           showLabel="true"
  26.                           imageMso="ChartPlacement"
  27.                           columns="2"
  28.                           rows="2"
  29.                           itemHeight="291"
  30.                           itemWidth="483"
  31.                           supertip="Large pictures of your charts!"
  32.                           getItemCount="getItemCount"
  33.                           getItemID="getItemID"
  34.                           getItemImage="getItemImage"  
  35.                           getItemSupertip="getItemSupertip"
  36.                           onAction="galRefreshAction"/>

  37.             </group>
  38.   </tab>
  39.     </tabs>
  40.   </ribbon>
  41. </customUI>
复制代码



如果创建一个新文档并在Office 2007 Custom UI Edtior中打开该文档,则不会看到任何内容,因为该文档中没有RibbonX。下面,我们来介绍一个这个Ribbon XML的关键点:
回调
这里,告诉功能区调用VBA函数来获取:库中的项目数、项目的标签、悬浮在项目上时显示的工具提示。例如在RibbonX中:
getItemCount="getItemCount"

红色的getItemCount是RibbonX属性,告诉功能区去调用VBA函数来获取项目数,蓝色的getItemCount是要调用的VBA函数名称。如果想指定固定的项目数,则应使用:
ItemCount="4"

Ribbon对象
在customUI标签中添加
onLoad="ribbonLoaded"

将允许VBA代码获取ribbon对象的一个句柄,允许我们使ribbon无效。使该ribbon无效将强制ribbon在下次用户进入库时调用库程序(回调),为我们提供了更新库中项目和图像的一种方式。在下面的VBA部分将介绍如何使ribbon无效。
库的位置
在本示例中,我们在“开始”选项卡中创建了一个新组:
idMso="TabHome"

。因为我们没有指定“insertbefore”属性,因此将新按钮排在“开始”选项卡的右侧。
在库按钮中的图像
这里,为库按钮图像选取了一个已存在的ribbon图标:

这种结果是通过
imageMso="ChartPlacement"

来定义的。可以为每个按钮使用不同的图标,或者通过回调或定义图像属性装载自已的图标。
小库或大库
两个库对代码有相同的回调,因为它们的项目数和图表图片是相同的,它们在RibbonX里的不同是:

  • 对于小库,itemWidth和itemHeight属性被设置得比大库更小。
  • 小库有另一个回调,来定义库中每个图表的标签。由于在小库中的图表更小,所以添加标签能帮助识别图表。
  • 对小库有更少的列,但有更多的行。设置小库为单列来帮助创建小库和大库之间不同的视图。
VBA代码
本例中,oRibbon对象是Ribbon,将使用其来使Ribbon无效,以便可以强制更新库。
Public oRibbon As IRibbonUI

当ribbon装载RibbonX时,调用接下来的sub过程,传递Ribbon对象,这是获取Ribbon对象的唯一方式。该代码设置公共的ribbon对象为后面使用:
  1. Public Sub ribbonLoaded(Ribbon As IRibbonUI)
  2.     Set oRibbon = Ribbon
  3. End Sub
复制代码

当用户在库中单击时,调用“getItemCount”,ribbon需要清楚其显示什么。因为我们在RibbonX中定义了回调,指定在库中有多少项。
注意本例中的OnTime方法,如何使ribbon无效。默认情况下,ribbon将调用所有回调一次来获取项目和图像,并隐藏这些值直至使它们无效。这里,每次用户在库中单击时,使图像失效。处理这种操作有更顺畅的方法,但本示例将保持简单的方式。
  1. Sub getItemCount(control As IRibbonControl, ByRef count)
  2.         count = ActiveSheet.ChartObjects.count
  3.         Application.OnTime DateAdd("s", 1, Now), "InvalidateRibbon"
  4. End Sub
复制代码

下一个程序为库中每个项目调用,将设置项目在库中显示的图像。本例中,想使所有的图像都在这里,因此Ribbon带有一个索引值,只是告诉索引的图表,然后告诉ribbon使用该图像。
  1. Sub getItemImage(control As IRibbonControl, index As Integer, ByRef image)
  2.     ActiveSheet.ChartObjects(index + 1).Chart.Export ThisWorkbook.Path & "\Chart_" & index + 1 & ".jpg", "jpg"
  3.     Set image = LoadPicture(ThisWorkbook.Path & "\chart_" & index + 1 & ".jpg")
  4. End Sub
复制代码

“getItemID”程序在通过ribbon获取库项目的id时调用。在本示例中我们不使用。
  1. Sub getItemID(control As IRibbonControl, index As Integer, ByRef id)
  2.     id = "Chart_" & index
  3. End Sub
复制代码

下一个回调定义每个库项目的工具提示,或者超级工具提示。在本示例中,工具提示是series名称和公式,提供用户其原理或来源于哪里。这虽然不是特别有帮助的,但有趣。
  1. Sub getItemSupertip(control As IRibbonControl, index As Integer, ByRef supertip)
  2.     Dim oSeries As Series
  3.     Dim sTooltip As String
  4.     For Each oSeries In ActiveSheet.ChartObjects(index + 1).Chart.SeriesCollection
  5.         sTooltip = sTooltip & vbCrLf & oSeries.Name & vbCrLf & oSeries.Formula & vbCrLf
  6.     Next oSeries
  7.     supertip = sTooltip
  8. End Sub
复制代码

“getItemLabel”回调仅被小库调用,通过RibbonX来定义,将设置库项目的标签。本例中,将使用图表标题作为标签,如果不存在则使用图表名称。
  1. Sub getItemLabel(control As IRibbonControl, index As Integer, ByRef label)
  2.     If ActiveSheet.ChartObjects(index + 1).Chart.HasTitle Then
  3.         label = ActiveSheet.ChartObjects(index + 1).Chart.ChartTitle.Caption
  4.     Else
  5.         label = ActiveSheet.ChartObjects(index + 1).Name
  6.     End If
  7. End Sub
复制代码

下一个程序当用户在库项目中单击后调用。例如,用户单击某图表,代码将滚动到该图表并激活该图表。
  1. Sub galRefreshAction(control As IRibbonControl, selectedId As String, selectedIndex As Integer)
  2.     ActiveWindow.ScrollIntoView ActiveSheet.ChartObjects(selectedIndex + 1).Left, ActiveSheet.ChartObjects(selectedIndex + 1).Top, ActiveSheet.ChartObjects(selectedIndex + 1).Width, ActiveSheet.ChartObjects(selectedIndex + 1).Height
  3.     ActiveSheet.ChartObjects(selectedIndex + 1).Activate
  4. End Sub
复制代码

最终的结果
在定义了RibbonX和VBA代码之后,打开该文档将显示两个新库,点击每个库的下拉箭头后,将显示工作表中最近图表的图像,单击库中的某图表将到达该图表。
您可以修改本示例,以达到更丰富的效果。
如果将本示例作为一个加载项,将可以在所有工作簿中使用。
目前,本示例只是遍历活动工作表的图表,可以修改以显示整个工作簿中的图表,甚至是所有打开的工作簿中的图表。
参考资源:
http://msdn2.microsoft.com/en-us/office/aa905530.aspx
http://msdn2.microsoft.com/en-us/office/aa905356.aspx
http://msdn2.microsoft.com/en-us/library/aa338199.aspx

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-27 21:17 | 显示全部楼层
本帖最后由 jiulongpo 于 2012-8-6 22:09 编辑

转自: http://www.excelperfect.com/index.php/2009/12/28/ribbonxstudy59/
细品RibbonX(59):RibbonX可视化设计器



让我们来看看Andy Pope的作品:RibbonX可视化设计器(RibbonX Visual Designer),作为系品RibbonX细列的结尾。
首先,在下列地址下载RibbonX可视化设计器加载项:
RibbonX Visual Designer

然后,将该加载项装载到Excel中。此时,在“开发工具”选项卡中出现名为“Ribbon Designer”的组,带有两个命令按钮:Load RibbonX和Designer,如下图所示。

LoadRibbonX用来处理已存在的文件以维护RibbonX信息,如下图所示。中间的树形目录框列出了通用的选项卡和添加的组件,右侧显地了自定义的XML代码(当然,根据顶部的选项卡不同可以显示不同的代码)。

Designer用来设计功能区,如下图所示。

这是一款针对RibbonX定制而开发的图形化设计器,版本1.6,如果获得最新版本的信息,可以访问Andy Pope的网站。



以下是可视化设计器附件:
RibbonEditor.zip (522.44 KB, 下载次数: 370)



您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-4 10:16 , Processed in 0.045917 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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