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