我正在嘗試動態更改 Access 365 中自定義功能區上的按鈕影像。
到目前為止,我有這個功能區 xml:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onl oad="OnRibbonLoad" loadImage="LoadImages">
<ribbon startFromScratch="false">
<tabs>
<tab id="elcdb" label="EDB">
<group id="ElecDBMaint" label="Maintenance">
<splitButton id="MySplitButton2" size="large">
<button id="Button50" label="Large Button with Menu"/>
<menu id="Menu20" itemSize="normal">
<button id="Button60" label="First"/>
<button id="Button70" label="Second"/>
<button id="Button80" label="Third"/>
</menu>
</splitButton>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
這給出了一個看起來像這樣的功能區:

這個想法是,在單擊按鈕后,影像將更改為顯示最后單擊的按鈕,這樣當再次單擊按鈕時,它會執行上一個操作,而不是用戶每次通過選單向下鉆取以找到上一個按鈕...
我想那里必須有一個 GetImage 回呼來設定影像,但我找不到放置它的位置。我還需要知道回呼如何設定影像 - 我正在尋找內置函式影像而不是外部影像(例如 FileSave、FileSendAsAttachment、FileQuickPrint)。
我也猜測 OnAction 按鈕需要以某種方式跟蹤最后一個函式,除非有另一個回呼可以確定按鈕的狀態???
我設法找到了一個看起來像這樣的基礎:

您可以將滑鼠懸停在影像上并單擊影像。您還可以單擊文本以顯示選單和相關按鈕...
功能區 xml 是
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onl oad="OnRibbonLoad" loadImage="LoadImages">
<ribbon startFromScratch="false">
<tabs>
<tab id="elcdb" label="EDB">
<group id="elcdb" label="EDB">
<splitButton id="MySplitButton2" size="large">
<button id="Button50" label="Large Button with Menu" imageMso="LeaveReader"/>
<menu id="Menu20" itemSize="normal">
<button id="Button60" label="First"/>
<button id="Button70" label="Second"/>
<button id="Button80" label="Third"/>
</menu>
</splitButton>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
uj5u.com熱心網友回復:

您可以使用getLabelandgetImage屬性來做到這一點。設定新值后,您只需要使功能區(或只是控制元件)無效。
示例功能區 xml 將是這樣的:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onl oad="CustomRibbon_onLoad">
<ribbon>
<tabs>
<tab id="myTab" label="Test" insertAfterMso="TabHome">
<group id="myGroup" label="Try This">
<splitButton id="mySplitButton" size="large" >
<button id="mainButton"
getLabel="SplitButton_getLabel"
getImage="SplitButton_getImage"
onAction="SplitButton_onAction" />
<menu id="buttonMenu" itemSize="normal">
<button id="subButton1" label="First" imageMso="Club" onAction="SubButton1_onAction"/>
<button id="subButton2" label="Second" imageMso="Diamond" onAction="SubButton2_onAction"/>
<button id="subButton3" label="Third" imageMso="Heart" onAction="SubButton3_onAction"/>
<button id="subButton4" label="Fourth" imageMso="Spade" onAction="SubButton4_onAction"/>
</menu>
</splitButton>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
在一個模塊中,代碼將是:
Option Explicit
#If VBA7 Then
Public Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
destination As Any, _
source As Any, _
ByVal length As Long)
#Else
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
destination As Any, _
source As Any, _
ByVal length As Long)
#End If
Private mRibbonUI As IRibbonUI
Private mButtonIndex As Long
Private mButtonLabels(4) As String
Private mButtonImages(4) As String
Public Sub CustomRibbon_onLoad(ribbonUI As IRibbonUI)
Set mRibbonUI = ribbonUI
wsSettings.Range("A1").value = ObjPtr(mRibbonUI)
mButtonIndex = 0
mButtonLabels(0) = "Select"
mButtonLabels(1) = "First"
mButtonLabels(2) = "Second"
mButtonLabels(3) = "Third"
mButtonLabels(4) = "Fourth"
mButtonImages(0) = "HappyFace"
mButtonImages(1) = "Club"
mButtonImages(2) = "Diamond"
mButtonImages(3) = "Heart"
mButtonImages(4) = "Spade"
End Sub
Public Sub SplitButton_getLabel(ctrl As IRibbonControl, ByRef value)
value = mButtonLabels(mButtonIndex)
End Sub
Public Sub SplitButton_getImage(ctrl As IRibbonControl, ByRef value)
value = mButtonImages(mButtonIndex)
End Sub
Public Sub SplitButton_onAction(ctrl As IRibbonControl)
ExecuteAction
End Sub
Public Sub SubButton1_onAction(ctrl As IRibbonControl)
mButtonIndex = 1
CustomRibbon.Invalidate
ExecuteAction
End Sub
Public Sub SubButton2_onAction(ctrl As IRibbonControl)
mButtonIndex = 2
CustomRibbon.Invalidate
ExecuteAction
End Sub
Public Sub SubButton3_onAction(ctrl As IRibbonControl)
mButtonIndex = 3
CustomRibbon.Invalidate
ExecuteAction
End Sub
Public Sub SubButton4_onAction(ctrl As IRibbonControl)
mButtonIndex = 4
CustomRibbon.Invalidate
ExecuteAction
End Sub
Private Sub ExecuteAction()
If mButtonIndex = 0 Then
MsgBox "You must select an item first."
Else
Debug.Print "Action index is: " & mButtonIndex
End If
End Sub
Private Property Get CustomRibbon() As IRibbonUI
#If VBA7 Then
Dim aPtr As LongPtr
#Else
Dim aPtr As Long
#End If
Dim ribUI As Object
On Error GoTo EH
If Not mRibbonUI Is Nothing Then
Set CustomRibbon = mRibbonUI
Exit Function
End If
aPtr = wsSettings.Range("A1").Value2
CopyMemory ribUI, aPtr, LenB(aPtr)
Set mRibbonUI = ribUI
Set ribUI = Nothing
Set CustomRibbon = mRibbonUI
Exit Function
EH:
End Property
丟失對 IRibbonUI 物件的參考很容易(例如,一旦 VBA 停止,參考就會丟失),因此處理這種情況的常用方法是將指標存盤在某處,CopyMemory如果參考丟失,則存盤指向物件的指標。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/505125.html
