我创建了一个简单的 Excel 加载项来演示以下问题:当项目保存并自动加载为 .xlam 时,功能区 onLoad 事件不会触发,但在作为 .xls 打开时会起作用。我已经针对Excel 2007(带有相应的xmlns),2010(x32)和2013(x32)检查了它,并且在加载为.xlam时在所有情况下都失败
该示例只有一个按钮,单击时,应导致切换一个标志,然后使功能区失效,而功能区又通过 GetLabel 回调切换按钮的标签。
当作为 .xlsm 文件打开时,它不起作用,但当从用户 XLSTART 文件夹(未进行 Windows 注册表更改)作为 .xlam 加载项自动加载时,它不起作用。问题似乎是 onLoad 事件不是从 .xlam 版本触发的,因此 onLoadRibbon 程序不会运行,并且没有要失效的功能区对象。
<customUI onLoad="onLoadRibbon" xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon startFromScratch="false">
<tabs>
<tab idQ="TabInsert">
<group id="GroupTest" label="2010" insertBeforeMso="GroupInsertLinks">
<button id="ButtonTest"
getLabel="GetLabel"
onAction="ButtonClick"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
这是相应的加载项VBA代码:
Option Explicit
Public Toggle As String
Public myRibbonUI As IRibbonUI
' Ribbon callback : runs when ribbon is loaded
Public Sub onLoadRibbon(ribbon As IRibbonUI)
' Get a reference to the ribbon
Set myRibbonUI = ribbon
Debug.Print "Ribbon Reference Set"
MsgBox "Ribbon Reference Set"
End Sub
' Ribbon callback : runs when ribbon button is clicked
Public Sub ButtonClick(control As IRibbonControl)
' Invalidate the ribbon so that the label of the button toggles between "true" and "false"
myRibbonUI.Invalidate
Debug.Print "Ribbon Invalidated"
End Sub
' Ribbon callback : runs when ribbon is invalidated
Public Sub GetLabel(control As IRibbonControl, ByRef label)
' Toggle the label for the button to indicate that the callback has worked
Toggle = IIf(Toggle = "State 1", "State 2", "State 1")
label = Toggle
Debug.Print "Ribbon Button Label Toggled"
End Sub
为什么这在 .xml 中不起作用?
我能够根据您的规范成功创建和运行加载项。
首先,我使用您的自定义UI创建了*.xlsm.xml如上所述。 注意:我在Excel 2007上,所以我使用了您指出的其他xlmn,特别是http://schemas.microsoft.com/office/2006/01/customui
。 接下来,我添加了功能区处理代码,然后重新打开工作簿以验证功能区功能。 我立即收到一个消息框"功能区引用集"(默认情况下我启用了宏)。 我验证了"插入"选项卡是否具有您的额外按钮并且它可以切换。
其次,我将 xlsm 保存为 Excel 加载项 *.xlam。 我通过双击手动打开了 xlam 文件,所有功能都像上面的第一个测试一样出现。
第三,我通过Excel文件Menu
---> Options
---> Add-Ins
---> Manage Excel Add-Ins
---> Go
安装了加载项。 我打开了一个不相关的 Excel 工作簿,并验证加载项加载的内容是否与之前的测试相同。 我使用相同的菜单卸载了加载项。
第四,我导航到C:Program Files(x86)
并验证了Excel.exe可执行文件的位置,然后找到了XLSTART
文件夹。 我将 xlam 放入文件夹中并打开不相关的 Excel 工作簿,并能够验证加载项是否像以前一样运行。
我知道以上并不能直接回答您的问题,但是测试这些情况,让我们比较结果以找出它可能崩溃的地方。
编辑:
为了响应您的评论,当我手动将 *.xlam 复制到 %APPDATA%MicrosoftExcelXLSTART
文件夹中时,它按预期工作。 在我的 Windows 7 机器上,路径计算结果为 C:UsersusernameAppDataRoamingMicrosoftExcelXLSTART
。 如您所指出的,我在Excel选项中验证了这是默认的受信任位置。
我知道这是一个旧帖子...但我遇到了类似的问题,并且正在寻找数小时的解决方案。
我的情况的根本原因很简单,很难找到:我有两个不同的插件 - 但由于复制和粘贴,我错过了重命名第二个回调函数。
回调过程的名称在整个 Excel 实例中必须是唯一的。
因此,只需尝试在 VBA 代码(当然还有 XML 中)重命名回调过程!