プロジェクトが保存され、.xlam として自動的に読み込まれるときにリボンの onLoad イベントが発生しないが、.xlsm として開かれると機能するという問題を示すために、単純な Excel アドインを作成しました。Excel 2007 (対応する xmlns を含む)、2010 (x32)、および 2013 (x32) で確認しましたが、.xlam としてロードするとすべてのケースで失敗します。
サンプルには 1 つのボタンがあり、クリックするとフラグが切り替えられ、リボンが無効になり、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
これが .xlam で機能しないのはなぜですか?