Excel VBA .xlam中的onLoadfunction区callback失败(未触发/正在运行)

我已经创build了一个简单的Excel加载项来演示问题,即在保存项目时,function区onLoad事件不会触发,并以.xlam自动加载,但在以.xlsm打开时可以正常工作。 我已经检查了它的Excel 2007(与相应的xmlns),2010(x32)和2013(x32),并且在所有情况下加载为.xlam

该示例有一个单一的button,单击时,应导致一个标志被切换,然后无效的function区依次通过GetLabelcallback切换button的标签。

它作为.xlsm文件打开时工作,但不会从用户XLSTART文件夹(不进行Windowsregistry更改)自动加载为.xlam加载项。 问题似乎是onLoad事件不会从.xlam版本触发,因此onLoadRibbon procudure不会运行,也没有Ribbon对象失效。

<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中工作?

我能够按照您的规格成功创build并运行加载项。

首先,我使用上面的customUI.xml创build了* .xlsm。 注意:我在Excel 2007中,所以我使用了其他xlmns,特别是http://schemas.microsoft.com/office/2006/01/customui 。 我接下来添加了色带处理代码,然后重新打开工作簿以validation色带function。 我立即收到一个消息框“function区参考设置”(我有默认启用macros)。 我validation了“插入”标签有你的额外的button,它切换。

其次,我将xlsm保存为Excel加载项* .xlam。 我通过双击手动打开xlam文件,所有的function都出现在上面的第一个testing中。

第三,我通过Excel文件Menu —> Options —> Add-Ins —> Manage Excel Add-Ins —> Go Manage Excel Add-Ins 。 我打开了一个不相关的Excel工作簿,并validation了加载项与之前的testing相同。 我使用相同的菜单卸载了加载项。

第四,我导航到C:\Program Files(x86)\并validation了Excel.exe可执行文件的位置,然后find了XLSTART文件夹。 我将xlam放入文件夹并打开不相关的Excel工作簿,并能够validationAdd-In的function与以前一样。

我知道上面的问题并不直接回答你的问题,但是testing这些案例,让我们比较一下结果,找出可能发生崩溃的地方。

编辑:

为了响应您的评论,当我手动将* .xlam复制到%APPDATA%\Microsoft\Excel\XLSTART文件夹时,它按预期工作。 在我的Windows 7机器上,path评估为C:\Users\username\AppData\Roaming\Microsoft\Excel\XLSTART 。 如您所述,我在Excel选项中validation了这是默认的受信任位置。

我知道这是一个旧的职位,但我也有类似的问题,并寻找解决scheme的小时。

在我的情况下,根本原因很简单,很难find:我有两个不同的AddIns – 但由于复制和粘贴,我错过了重命名第二个callback函数。
callback过程名称在整个Excel实例中必须是唯一的

所以简单地尝试重命名VBA代码中的callback过程(当然也是在XML中)。