3

我创建了一个简单的 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 中不起作用?

4

2 回答 2

3

我知道这是一篇旧帖子......但我遇到了类似的问题,并且正在寻找几个小时的解决方案。

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

因此,只需尝试在 VBA 代码中重命名回调过程(当然也包括在 XML 中)!

于 2014-10-27T13:59:30.913 回答
3

我能够按照您的规范成功创建和运行加载项。

首先,我使用上面的 customUI.xml 创建了 *.xlsm。注意:我在 Excel 2007 上,所以我使用了您指出的其他 xlmns,特别是http://schemas.microsoft.com/office/2006/01/customui. 接下来我添加了功能区处理代码,然后重新打开工作簿以验证功能区功能。我立即收到一个消息框“功能区参考集”(默认情况下我启用了宏)。我确认“插入”选项卡有您的额外按钮并且它可以切换。

其次,我将 xlsm 保存为 Excel 加载项 *.xlam。我通过双击手动打开了 xlam 文件,所有功能都如上面的第一个测试所示。

第三,我通过 Excel File Menu---> Options---> Add-Ins---> Manage Excel Add-Ins--->安装了插件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 选项中验证了这是默认的受信任位置。

于 2013-10-22T18:21:18.103 回答