我创建了一个简单的Excel加载项来演示问题,即当项目保存并且自动加载为.xlam时,功能区onLoad事件不会触发,但在以.xlsm打开时可以正常工作。我已经检查了Excel 2007(带有相应的xmlns),2010(x32)和2013(x32),并且在作为.xlam加载的所有情况下都失败了
示例只有一个按钮,当单击时,应该导致标记被切换,然后使功能区无效,而功能区又通过GetLabel回调切换按钮的标签。
在作为.xlsm文件打开时有效,但在从用户XLSTART文件夹(未进行Windows注册表更改)中自动加载时不能用作.xlam加载项。问题似乎是onLoad事件没有从.xlam版本触发,因此onLoadRibbon procudure没有运行,并且没有带状对象无效。
<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
为什么这不适用于.xlam?
答案 0 :(得分:3)
我能够根据您的规范成功创建和运行加载项。
首先,我使用您的customUI.xml创建了* .xlsm,如上所述。注意:我使用的是Excel 2007,因此我使用了您指定的其他xlmns,特别是http://schemas.microsoft.com/office/2006/01/customui
。我接下来添加了功能区处理代码,然后重新打开工作簿以验证功能区功能。我立即收到了一个消息框“功能区参考设置”(我默认启用了宏)。我确认“插入”标签有你的额外按钮并且它会切换。
其次,我将xlsm保存为Excel加载项* .xlam。我通过双击手动打开xlam文件,所有功能都出现在上面的第一个测试中。
第三,我通过Excel文件安装了加载项Menu
---&gt; Options
---&gt; Add-Ins
---&gt; Manage Excel Add-Ins
---&gt; Go
。我打开了一个不相关的Excel工作簿,并验证了加载项的加载方式与以前的测试相同。我使用相同的菜单卸载了加载项。
第四,我导航到C:\Program Files(x86)\
并验证了Excel.exe可执行文件的位置,然后找到了XLSTART
文件夹。我将xlam放入文件夹并打开不相关的Excel工作簿,并能够验证加载项是否像以前一样运行。
我知道上述内容并没有直接回答你的问题,而是对这些案例进行测试,然后让我们比较结果,找出它可能会出现的问题。
修改强>
在回复您的评论时,当我手动将* .xlam复制到%APPDATA%\Microsoft\Excel\XLSTART
文件夹时,它会按预期工作。在我的Windows 7计算机上,路径评估为C:\Users\username\AppData\Roaming\Microsoft\Excel\XLSTART
。如您所述,我在Excel选项中验证了这是默认的受信任位置。
答案 1 :(得分:3)
我知道这是一个老帖子......但我遇到了类似的问题,并且正在寻找解决方案的时间。
我的案例中的根本原因很简单:我有两个不同的AddIns - 但由于复制和粘贴,我错过了重命名第二个回调函数。
回调过程的名称在整个Excel实例中必须是唯一的。
因此,只需尝试重命名VBA代码中的回调过程(当然也包括XML)!