我創建了一個簡單的Excel加載項來演示如何保存項目並將其自動加載爲功能時onLoad事件未觸發的問題.xlam,但以.xlsm打開時可以正常工作。我已經檢查過Excel 2007(帶有相應的xmlns),2010(x32)和2013(x32),並且它在加載爲.xlam時在所有情況下都失敗。在Excel VBA中,onLoad ribbon回調失敗(未觸發/正常工作).xlam
示例只有一個按鈕,應該導致一個標誌被切換,然後使功能區無效,然後通過GetLabel回調切換按鈕的標籤。
它作爲.xlsm文件打開時工作,但不會從用戶XLSTART文件夾(不進行Windows註冊表更改)自動加載爲.xlam加載項時運行。問題似乎是onLoad事件不是從.xlam版本觸發的,因此onLoadRibbon procudure沒有運行,也沒有Ribbon對象失效。
<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這方面的工作?
謝謝史蒂夫。嗯。唯一可以看到的是,我將.xlam放在USER XLSTART文件夾中:%APPDATA%/ Microsoft/Excel/XLSTART,它也是默認的受信任位置。我必須嘗試使用的App文件夾。 –
您可能會檢查的一件事是,如果您有多個加載項定義了相同的功能區對象,我可以想象如果發生這種情況,他們會導致衝突,即使控件/部分被創建,也會阻止您的代碼運行。通過雙擊手動打開* .xlam時是否工作? – Blackhawk