onLoad功能区回调从Excel VBA .xlam失败(不启动/工作)

时间:2013-10-22 13:52:37

标签: excel vba excel-vba add-in onload-event

我创建了一个简单的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?

2 个答案:

答案 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)!