旧的命令栏定制仍然工作吗?
考虑安装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代码来创建功能区定制:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"><ribbon startFromScratch="false"><tabs><tab idMso="TabDeveloper"><group id="rxgrpForums" label="Forums"><button id="rxbtnRibbonX" label="Patrick Schmid's RibbonX Forum" onAction="rxsharedLinks_click" imageMso="HyperlinkInsert" tag="RibbonX"/><button id="rxbtnVBAX" label="VBA Express" onAction="rxsharedLinks_click" imageMso="HyperlinkInsert" tag="VBAX"/></group></tab></tabs></ribbon></customUI>
上述代码在“加载项”选项卡的末尾的自定义组中添加了两个按钮。注意,按钮使用了共享的回调rxsharedLinks_click,使用了tag属性。
验证代码并保存,复制回调签名,关闭CustomUI Editor。打开Excel并安装该加载项。转到VBE,导航到ForumLauncher工程,插入一个新模块,粘贴回调签名,并作如下修改:
Sub rxsharedLinks_click(control As IRibbonControl)Application.Run "LaunchFrom2007", control.TagEnd Sub
这个过程使用Application.Run方法从另一个打开的文件中启动宏,指定了要启动的宏的名字LaunchFrom2007,还有一个参数:控件的标签。
保存后卸载该加载项。
下一步,对2003加载宏作必需的修改,即ForumLauncher_v2003.xla。
首先,修改开始代码确保菜单不会被创建在“加载项”选项卡中,然而在Excel 2003中仍然是菜单。使用下列步骤测试版本并装载正确的菜单。打开VBE,导航到ForumLauncher_v2003.xla工程,展开ThisWorkbook模块,修改Workbook_Open过程如下:
Private Sub Workbook_Open()Dim wbAddin As AddInDim bInstalled As BooleanDim s2007Filename As String s2007Filename = Application.WorksheetFunction.Substitute(ThisWorkbook.Name, "2003", "2007") & "m" If Val(Application.Version) < 12 ThenCall CreateMenuElse'检查是否安装了加载项 For Each wbAddin In Application.AddInsIf wbAddin.Name = s2007Filename Then'加载项已安装,打开它 Workbooks.Open ThisWorkbook.Path & Application.PathSeparator & s2007FilenamebInstalled = TrueExit ForEnd IfNext wbAddin '如果需要安装加载项 If Not bInstalled Then Application.AddIns.Add _ThisWorkbook.Path & Application.PathSeparator & s2007FilenameEnd IfEnd Sub
Workbook_Open事件现在完成如下操作:
- 通过将2003加载项文件名中的2003替换为2007,然后添加m到结果字符串中,从而捕获2007加载项的名字并赋值给变量。
- 检查应用程序的版本,如果版本小于12,则创建菜单。
- 如果版本不小于12,检查2007加载项是否已经安装。
- 如果2007版加载项已安装,则装载文件并记录2007版本已安装。
- 评估bInstalled属性。如果为假,那么安装加载项。
因为我们已经在2003文件被启动时安装并打开了2007文件,所以结束时明确地卸载2007文件。为此,需要修改Workbook_BeforeClose过程来检查版本并且卸载2007加载项:
Private Sub Workbook_BeforeClose(Cancel As Boolean)If Val(Application.Version) > 11 ThenWorkbooks(Application.WorksheetFunction.Substitute(ThisWorkbook.Name, "2003", "2007") & "m").CloseElseCall DeleteMenuEnd IfEnd Sub
同理,如果文件版本小于12,那么已经装载了2003菜单修改,因此需要触发DeleteMenu过程。如果应用程序的版本不小于12,那么需要代码关闭2007加载项文件。
最后,对2003加载项需要提供输入点以便2007版本的文件能够调用过程。当在Excel 2003或更早的版本中单击菜单按钮时触发下列两个过程:
Private Sub Launch_VBAX()'启动VBAX网站 ActiveWorkbook.FollowHyperlink (sVBAXURL)End Sub Private Sub Launch_RibbonX()'启动RibbonX论坛 ActiveWorkbook.FollowHyperlink (sRibbonXURL)End Sub
接着,在标准模块中添加下面的过程:
Public Sub LaunchFrom2007(sSiteToLaunch)'从2007加载项中担当装载器 Select Case UCase(sSiteToLaunch)Case Is = "VBAX"Call Launch_VBAXCase Is = "RIBBONX"Call Launch_RibbonXEnd SelectEnd Sub
Case语句评估单击的控件,并从2003文件中启动合适的宏。
现在,我们已经完成了需要的转换,保存2003 xla加载宏并卸载。回到2007加载项,强迫用户首先打开2003版。
再次安装2007版的加载项。打开VBE,导航到ForumLauncher_v2007.xlam工程,在ThisWorkbook模块中插入下列代码:
Private Const sReqdAddin = "Forum_Launcher_v2003.xla" Private Sub Workbook_Open()Dim wbTest As Workbook On Error Resume NextSet wbTest = Workbooks(sReqdAddin)If Err.Number = 0 Then'加载项打开 On Error GoTo 0Exit SubEnd If '加载项必须被打开 On Error GoTo 0MsgBox "You must load " & sReqdAddin & " to use " & ThisWorkbook.NameThisWorkbook.Close savechanges:=FalseEnd Sub
好了!转换完成。保存文件并再次卸载该加载项。
现在来测试。打开加载项管理器,安装2003版本的加载项,可以在开发工具选项卡的右侧看到完整的功能组,如下图所示。
返回到加载项管理器,卸载2003版,安装2007版,单击“确定”返回用户界面,此时会显示如下图所示的错误消息。
转到VBE,你将看到2003版和2007版的加载项文件都没有被装载。此时,装载2007 xlam加载项的唯一方法是首先装载2003的xla文件。这样,避免用户不小心选择了错误的加载项。