onLoad 功能区回调失败(未触发/工作)从 Excel VBA .xlam



我创建了一个简单的 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 中)重命名回调过程!

最新更新