Excel Ribbon 组合框:如何设置 getSelectedItemIndex 回调

问题描述 投票:0回答:1

这是此问题的后续问题:

Excel Ribbon 组合框:始终突出显示所选内容

以下代码允许您使用组合框从三种纸张尺寸中进行选择。 只有一个问题:所选项目不会保持突出显示状态。

@OlleSjögren 写道,您需要

getSelectedItemIndex
-回调才能完成这项工作。

问题:如何构建 getSelectedItemIndex-Callback?

如果我将其添加到 XML,我会收到一条错误消息:“该属性未声明”。

谢谢!

' -- XML

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="LoadRibbon">
    <ribbon>
        <tabs>
            <tab id="Tabv3.1" label="TOOLS" insertAfterMso="TabHome">                                             
                <group id="GroupDemo2" 
                label="SelectPapersize"
                imageMso="AddInManager">
                    <comboBox id="ComboBox001"
                    label="comboBox001"
                    getText="ComboBox001_GetText"
                    onChange="ComboBox001_OnChange">
                        <item id="Item_A3"
                        label="A3"/>
                        <item id="Item_A4"
                        label="A4"/>
                        <item id="Item_A5"
                        label="A5"/>
                    </comboBox>
                </group>   
            </tab>
        </tabs>
    </ribbon>
</customUI>


' -- Callback VBA in Module "RibbonCallbacks"

Option Explicit
Public RibUI As IRibbonUI
Public Const myApp As String = "RibbApp", mySett As String = "Settings", myVal As String = "Value"

Sub LoadRibbon(Ribbon As IRibbonUI)
    Set RibUI = Ribbon
    RibUI.InvalidateControl "ComboBox001"
End Sub

'Callback for ComboBox001 onChange
Sub ComboBox001_OnChange(control As IRibbonControl, id As String)
    Select Case id
        Case "A3"
             ActiveSheet.PageSetup.PaperSize = xlPaperA3
        Case "A4"
            ActiveSheet.PageSetup.PaperSize = xlPaperA4
        Case "A5"
            ActiveSheet.PageSetup.PaperSize = xlPaperA5
    End Select
    RibUI.InvalidateControl "ComboBox001"
    SaveSetting myApp, mySett, myVal, id
End Sub

'Callback for ComboBox001 getText
Sub ComboBox001_getText(control As IRibbonControl, ByRef returnedVal)
  Dim comboVal As String
    comboVal = GetSetting(myApp, mySett, myVal, "No Value") 
    If comboVal <> "No Value" Then
      returnedVal = comboVal
    End If
End Sub


' -- VBA in "ThisWorkbook"

Private Sub Workbook_Open()

End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Dim idx As String
    Select Case PaperSize
    Case "xlPaperA3"
        idx = "A3"
    Case "xlPaperA4"
        idx = "A4"
    Case "xlPaperA5"
        idx = "A5"
    End Select
    SaveSetting myApp, mySett, myVal, idx
    RibUI.InvalidateControl "ComboBox001"
End Sub
excel vba combobox highlight
1个回答
0
投票
  • 回电
    getSelectedItemIndex
    可用于
    dropDown
    ,而不是
    comboBox
  • XML 和回调子项均已更改为
    dropDown
  • 注意:该解决方案仅在Win11+O365上测试。
' --- XML

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="LoadRibbon">
    <ribbon>
        <tabs>
            <tab id="Tabv3.1" label="TOOLS" insertAfterMso="TabHome">                                             
                <group id="GroupDemo2" 
                label="SelectPapersize"
                imageMso="AddInManager">
                    <dropDown id="DropDown1"
                    label="DropDown1"
                    onAction="DropDown1_onAction"
                    getSelectedItemIndex="DropDown1_GetSelectedItemIndex"
                    >
                        <item id="Item_A3"
                        label="A3"/>
                        <item id="Item_A4"
                        label="A4"/>
                        <item id="Item_A5"
                        label="A5"/>
                    </dropDown>
                </group>   
            </tab>
        </tabs>
    </ribbon>
</customUI>

' -- Stardard module
Option Explicit
Public RibUI As IRibbonUI

Sub LoadRibbon(ribbon As IRibbonUI)
    Set RibUI = ribbon
    RibUI.InvalidateControl "DropDown1"
End Sub

'Callback for DropDown1 onAction
Sub DropDown1_onAction(control As IRibbonControl, id As String, index As Integer)
    Dim iSize As Long
    Select Case Right(id, 2)
        Case "A3"
             iSize = xlPaperA3
        Case "A4"
            iSize = xlPaperA4
        Case "A5"
            iSize = xlPaperA5
    End Select
    If iSize > 0 Then _
        ActiveSheet.PageSetup.PaperSize = iSize
End Sub

'Callback for DropDown1 getSelectedItemIndex
Sub DropDown1_GetSelectedItemIndex(control As IRibbonControl, ByRef returnedVal)
    returnedVal = GetPageSize
End Sub

Function GetPageSize() As String
        Select Case ActiveSheet.PageSetup.PaperSize
        Case xlPaperA3
            GetPageSize = 0 '"A3"
        Case xlPaperA4
            GetPageSize = 1 ' "A4"
        Case xlPaperA5
            GetPageSize = 2 ' "A5"
        End Select
End Function

' -- ThisWorkbook
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
   RibUI.InvalidateControl "DropDown1"
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.